diff --git a/.eslintignore b/.eslintignore index ec701c48888..27603af2b5b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,23 +1,33 @@ -**/vs/nls.build.js -**/vs/nls.js -**/vs/css.build.js -**/vs/css.js -**/vs/loader.js -**/dompurify/** -**/marked/** -**/semver/** -**/test/**/*.js -**/node_modules/** -**/vscode-api-tests/testWorkspace/** -**/vscode-api-tests/testWorkspace2/** -**/extensions/**/out/** +**/build/*/**/*.js +**/dist/**/*.js +**/extensions/**/*.d.ts **/extensions/**/build/** +**/extensions/**/colorize-fixtures/** +**/extensions/css-language-features/server/test/pathCompletionFixtures/** +**/extensions/html-language-features/server/lib/jquery.d.ts +**/extensions/html-language-features/server/src/test/pathCompletionFixtures/** **/extensions/markdown-language-features/media/** **/extensions/markdown-language-features/notebook-out/** -**/extensions/typescript-basics/test/colorize-fixtures/** -**/extensions/**/dist/** +**/extensions/markdown-math/notebook-out/** +**/extensions/simple-browser/media/index.js **/extensions/typescript-language-features/test-workspace/** - -# These files are not linted by `yarn eslint`, so we exclude them from being linted in the editor. -# This ensures that if we add new rules and they pass CI, there are also no errors in the editor. -/resources/web/code-web.js +**/extensions/vscode-api-tests/testWorkspace/** +**/extensions/vscode-api-tests/testWorkspace2/** +**/fixtures/** +**/node_modules/** +**/out-*/**/*.js +**/out-editor-*/** +**/out/**/*.js +**/src/**/dompurify.js +**/src/**/marked.js +**/src/**/semver.js +**/src/typings/**/*.d.ts +**/src/vs/*/**/*.d.ts +**/src/vs/base/test/common/filters.perf.data.js +**/src/vs/css.build.js +**/src/vs/css.js +**/src/vs/loader.js +**/src/vs/nls.build.js +**/src/vs/nls.js +**/test/unit/assert.js +**/typings/** diff --git a/.eslintrc.json b/.eslintrc.json index c5a5f41c9ea..26e182bca31 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -45,6 +45,7 @@ "jsdoc/no-types": "warn", "semi": "off", "@typescript-eslint/semi": "warn", + "@typescript-eslint/member-delimiter-style": "warn", "@typescript-eslint/naming-convention": [ "warn", { @@ -90,1057 +91,6 @@ ] } ], - "code-import-patterns": [ - "warn", - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // !!! Do not relax these rules !!! - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - { - "target": "src/vs/base/common/**", - "restrictions": [ - "vs/nls", - "vs/base/common/**" - ] - }, - { - "target": "src/vs/base/test/common/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/common/**", - "vs/base/test/common/**" - ] - }, - { - "target": "src/vs/base/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser}/**" - ] - }, - { - "target": "src/vs/base/electron-sandbox/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser,electron-sandbox}/**" - ] - }, - { - "target": "src/vs/base/node/**", - "restrictions": [ - "vs/nls", - "vs/base/{common,node}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - // vs/base/test/browser contains tests for vs/base/browser - "target": "src/vs/base/test/browser/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/{common,browser}/**", - "vs/base/test/{common,browser}/**" - ] - }, - { - "target": "src/vs/base/parts/*/common/**", - "restrictions": [ - "vs/nls", - "vs/base/common/**", - "vs/base/parts/*/common/**" - ] - }, - { - "target": "src/vs/base/parts/*/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**" - ] - }, - { - "target": "src/vs/base/parts/*/node/**", - "restrictions": [ - "vs/nls", - "vs/base/{common,node}/**", - "vs/base/parts/*/{common,node}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/base/parts/*/electron-sandbox/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser,electron-sandbox}/**", - "vs/base/parts/*/{common,browser,electron-sandbox}/**" - ] - }, - { - "target": "src/vs/base/parts/*/electron-browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/base/parts/*/electron-main/**", - "restrictions": [ - "vs/nls", - "vs/base/{common,node,electron-main}/**", - "vs/base/parts/*/{common,node,electron-main}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/base/worker/**", - "restrictions": [ - "vs/nls", - "vs/base/{common,worker}/**" - ] - }, - { - "target": "src/vs/platform/*/common/**", - "restrictions": [ - "vs/nls", - "vs/base/common/**", - "vs/base/parts/*/common/**", - "vs/platform/*/common/**", - "tas-client-umd" - ] - }, - { - "target": "src/vs/platform/*/test/common/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/common/**", - "vs/base/parts/*/common/**", - "vs/base/test/common/**", - "vs/platform/*/common/**", - "vs/platform/*/test/common/**" - ] - }, - { - "target": "src/vs/platform/*/test/browser/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/base/test/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/platform/*/test/{common,browser}/**" - ] - }, - { - "target": "src/vs/platform/*/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/platform/*/{common,browser}/**" - ] - }, - { - "target": "src/vs/platform/*/node/**", - "restrictions": [ - "vs/nls", - "vs/base/{common,node}/**", - "vs/base/parts/*/{common,node}/**", - "vs/platform/*/{common,node}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/platform/*/electron-sandbox/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser,electron-sandbox}/**", - "vs/base/parts/*/{common,browser,electron-sandbox}/**", - "vs/platform/*/{common,browser,electron-sandbox}/**" - ] - }, - { - "target": "src/vs/platform/*/electron-browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/platform/*/{common,browser,node,electron-sandbox,electron-browser}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/platform/*/electron-main/**", - "restrictions": [ - "vs/nls", - "vs/base/{common,node,electron-main}/**", - "vs/base/parts/*/{common,node,electron-main}/**", - "vs/platform/*/{common,node,electron-main}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/platform/*/test/browser/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/platform/*/test/{common,browser}/**" - ] - }, - { - "target": "src/vs/editor/common/**", - "restrictions": [ - "vs/nls", - "vs/base/common/**", - "vs/platform/*/common/**", - "vs/editor/common/**" - ] - }, - { - "target": "src/vs/editor/test/common/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/common/**", - "vs/base/test/common/**", - "vs/platform/*/common/**", - "vs/platform/*/test/common/**", - "vs/editor/common/**", - "vs/editor/test/common/**" - ] - }, - { - "target": "src/vs/editor/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/editor/{common,browser}/**" - ] - }, - { - "target": "src/vs/editor/test/browser/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/platform/*/test/{common,browser}/**", - "vs/editor/{common,browser}/**", - "vs/editor/test/{common,browser}/**" - ] - }, - { - "target": "src/vs/editor/standalone/common/**", - "restrictions": [ - "vs/nls", - "vs/base/common/**", - "vs/platform/*/common/**", - "vs/editor/common/**", - "vs/editor/standalone/common/**" - ] - }, - { - "target": "src/vs/editor/standalone/test/common/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/common/**", - "vs/platform/*/common/**", - "vs/platform/*/test/common/**", - "vs/editor/common/**", - "vs/editor/test/common/**" - ] - }, - { - "target": "src/vs/editor/standalone/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/editor/{common,browser}/**", - "vs/editor/contrib/**", - "vs/editor/standalone/{common,browser}/**" - ] - }, - { - "target": "src/vs/editor/standalone/test/browser/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/platform/*/test/{common,browser}/**", - "vs/editor/{common,browser}/**", - "vs/editor/standalone/{common,browser}/**", - "vs/editor/test/{common,browser}/**" - ] - }, - { - "target": "src/vs/editor/contrib/*/test/**", - "restrictions": [ - "assert", - "sinon", - "sinon-test", - "vs/nls", - "vs/base/{common,browser}/**", - "vs/base/test/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/platform/*/test/{common,browser}/**", - "vs/editor/{common,browser}/**", - "vs/editor/test/{common,browser}/**", - "vs/editor/contrib/**" - ] - }, - { - "target": "src/vs/editor/contrib/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/platform/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/editor/{common,browser}/**", - "vs/editor/contrib/**" - ] - }, - { - "target": "src/vs/editor/editor.all.ts", - "restrictions": [ - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/editor/{common,contrib,browser}/**" - ] - }, - { - "target": "src/vs/editor/editor.worker.ts", - "restrictions": [ - "vs/base/{common,worker}/**", - "vs/editor/common/**" - ] - }, - { - "target": "src/vs/editor/editor.{api,main}.ts", - "restrictions": [ - "vs/base/{common,browser}/**", - "vs/editor/**" - ] - }, - { - "target": "src/vs/workbench/common/**", - "restrictions": [ - "vs/nls", - "vs/base/common/**", - "vs/base/parts/*/common/**", - "vs/platform/*/common/**", - "vs/editor/common/**", - "vs/editor/contrib/*/common/**", - "vs/workbench/common/**", - "vs/workbench/services/*/common/**", - "assert" - ] - }, - { - "target": "src/vs/workbench/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/editor/{common,browser}/**", - "vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention - "vs/workbench/workbench.web.api", - "vs/workbench/{common,browser}/**", - "vs/workbench/services/*/{common,browser}/**", - "assert" - ] - }, - { - "target": "src/vs/workbench/api/common/**", - "restrictions": [ - "vscode", - "vs/nls", - "vs/base/common/**", - "vs/platform/*/common/**", - "vs/editor/common/**", - "vs/editor/contrib/*/common/**", - "vs/workbench/api/common/**", - "vs/workbench/common/**", - "vs/workbench/services/*/common/**", - "vs/workbench/contrib/*/common/**" - ] - }, - { - "target": "src/vs/workbench/api/browser/**", - "restrictions": [ - "vscode", - "vs/nls", - "vs/base/{common,browser}/**", - "vs/base/parts/*/{common,browser}/**", - "vs/platform/*/{common,browser}/**", - "vs/editor/{common,browser}/**", - "vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention - "vs/workbench/api/{common,browser}/**", - "vs/workbench/{common,browser}/**", - "vs/workbench/services/*/{common,browser}/**", - "vs/workbench/contrib/*/{common,browser}/**" - ] - }, - { - "target": "src/vs/workbench/api/node/**", - "restrictions": [ - "vscode", - "vs/nls", - "vs/base/{common,node}/**", - "vs/base/parts/*/{common,node}/**", - "vs/platform/*/{common,node}/**", - "vs/editor/{common,node}/**", - "vs/editor/contrib/*/{common,node}/**", - "vs/workbench/api/{common,node}/**", - "vs/workbench/{common,node}/**", - "vs/workbench/services/*/{common,node}/**", - "vs/workbench/contrib/*/{common,node}/**", - "*" // node modules - ] - }, - { - "target": "src/vs/workbench/api/worker/**", - "restrictions": [ - "vscode", - "vs/nls", - "vs/**/{common,worker}/**" - ] - }, - { - "target": "src/vs/workbench/electron-sandbox/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser,electron-sandbox}/**", - "vs/base/parts/*/{common,browser,electron-sandbox}/**", - "vs/platform/*/{common,browser,electron-sandbox}/**", - "vs/editor/{common,browser,electron-sandbox}/**", - "vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention - "vs/workbench/{common,browser,electron-sandbox}/**", - "vs/workbench/api/{common,browser,electron-sandbox}/**", - "vs/workbench/services/*/{common,browser,electron-sandbox}/**" - ] - }, - { - "target": "src/vs/workbench/electron-browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/platform/*/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/editor/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention - "vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/services/*/{common,browser,node,electron-sandbox,electron-browser}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/workbench/services/**/test/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**", - "vs/platform/**", - "vs/editor/**", - "vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/contrib/files/browser/editors/fileEditorInput", - "vs/workbench/services/**", - "vs/workbench/test/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/workbench/services/**/common/**", - "restrictions": [ - "vs/nls", - "vs/base/**/common/**", - "vs/platform/**/common/**", - "vs/editor/common/**", - "vs/workbench/workbench.web.api", - "vs/workbench/common/**", - "vs/workbench/services/**/common/**", - "vs/workbench/api/**/common/**", - "vscode-textmate", - "vscode-oniguruma", - "@vscode/iconv-lite-umd", - "tas-client-umd", - "jschardet" - ] - }, - { - "target": "src/vs/workbench/services/**/worker/**", - "restrictions": [ - "vs/nls", - "vs/base/**/common/**", - "vs/platform/**/common/**", - "vs/editor/common/**", - "vs/workbench/**/common/**", - "vs/workbench/**/worker/**", - "vs/workbench/services/**/common/**", - "vscode" - ] - }, - { - "target": "src/vs/workbench/services/**/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/editor/{common,browser}/**", - "vs/workbench/workbench.web.api", - "vs/workbench/{common,browser}/**", - "vs/workbench/api/{common,browser}/**", - "vs/workbench/services/**/{common,browser}/**", - "vscode-textmate", - "vscode-oniguruma", - "@vscode/iconv-lite-umd", - "jschardet", - "@vscode/vscode-languagedetection", - "@microsoft/applicationinsights-web" - ] - }, - { - "target": "src/vs/workbench/services/**/node/**", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,node}/**", - "vs/platform/**/{common,node}/**", - "vs/editor/{common,node}/**", - "vs/workbench/{common,node}/**", - "vs/workbench/api/{common,node}/**", - "vs/workbench/services/**/{common,node}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/workbench/services/**/electron-sandbox/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser,electron-sandbox}/**", - "vs/platform/**/{common,browser,electron-sandbox}/**", - "vs/editor/**", - "vs/workbench/{common,browser,electron-sandbox}/**", - "vs/workbench/api/{common,browser,electron-sandbox}/**", - "vs/workbench/services/**/{common,browser,electron-sandbox}/**", - "vscode-textmate", - "vscode-oniguruma", - "@vscode/iconv-lite-umd", - "jschardet" - ] - }, - { - "target": "src/vs/workbench/services/**/electron-browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/editor/**", - "vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/services/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/workbench/contrib/**/test/**", - "restrictions": [ - "assert", - "vs/nls", - "vs/css!./**/*", - "vs/base/**", - "vs/platform/**", - "vs/editor/**", - "vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/services/**", - "vs/workbench/contrib/**", - "vs/workbench/test/**", - "*" - ] - }, - { - "target": "src/vs/workbench/contrib/terminal/browser/**", - "restrictions": [ - // xterm and its addons are strictly browser-only components - "xterm", - "xterm-addon-*", - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/editor/**", - "vs/workbench/{common,browser}/**", - "vs/workbench/contrib/**/{common,browser}/**", - "vs/workbench/services/**/{common,browser}/**" - ] - }, - { - "target": "src/vs/workbench/contrib/extensions/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/editor/**", - "vs/workbench/{common,browser}/**", - "vs/workbench/contrib/**/{common,browser}/**", - "vs/workbench/services/**/{common,browser}/**" - ] - }, - { - "target": "src/vs/workbench/contrib/update/browser/update.ts", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/editor/**", - "vs/workbench/{common,browser}/**", - "vs/workbench/contrib/**/{common,browser}/**", - "vs/workbench/services/**/{common,browser}/**" - ] - }, - { - "target": "src/vs/workbench/contrib/notebook/common/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/common/**", - "vs/platform/**/common/**", - "vs/editor/**", - "vs/workbench/common/**", - "vs/workbench/api/common/**", - "vs/workbench/services/**/common/**", - "vs/workbench/contrib/**/common/**" - ] - }, - { - "target": "src/vs/workbench/contrib/**/common/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/common/**", - "vs/platform/**/common/**", - "vs/editor/**", - "vs/workbench/common/**", - "vs/workbench/api/common/**", - "vs/workbench/services/**/common/**", - "vs/workbench/contrib/**/common/**" - ] - }, - { - "target": "src/vs/workbench/contrib/**/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/editor/**", - "vs/workbench/{common,browser}/**", - "vs/workbench/api/{common,browser}/**", - "vs/workbench/services/**/{common,browser}/**", - "vs/workbench/contrib/**/{common,browser}/**", - "vscode-textmate", - "vscode-oniguruma", - "@vscode/iconv-lite-umd", - "jschardet" - ] - }, - { - "target": "src/vs/workbench/contrib/**/node/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,node}/**", - "vs/platform/**/{common,node}/**", - "vs/editor/**/common/**", - "vs/workbench/{common,node}/**", - "vs/workbench/api/{common,node}/**", - "vs/workbench/services/**/{common,node}/**", - "vs/workbench/contrib/**/{common,node}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/workbench/contrib/**/electron-sandbox/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser,electron-sandbox}/**", - "vs/platform/**/{common,browser,electron-sandbox}/**", - "vs/editor/**", - "vs/workbench/{common,browser,electron-sandbox}/**", - "vs/workbench/api/{common,browser,electron-sandbox}/**", - "vs/workbench/services/**/{common,browser,electron-sandbox}/**", - "vs/workbench/contrib/**/{common,browser,electron-sandbox}/**", - "vscode-textmate", - "vscode-oniguruma", - "@vscode/iconv-lite-umd", - "jschardet" - ] - }, - { - "target": "src/vs/workbench/contrib/**/electron-browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/editor/**", - "vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/services/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/contrib/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/code/browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser}/**", - "vs/base/parts/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/code/**/{common,browser}/**", - "vs/workbench/workbench.web.api" - ] - }, - { - "target": "src/vs/code/node/**", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,node}/**", - "vs/base/parts/**/{common,node}/**", - "vs/platform/**/{common,node}/**", - "vs/code/**/{common,node}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/code/electron-browser/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/base/parts/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/code/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/code/electron-sandbox/**", - "restrictions": [ - "vs/nls", - "vs/css!./**/*", - "vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/base/parts/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/code/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/code/electron-main/**", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,node,electron-main}/**", - "vs/base/parts/**/{common,node,electron-main}/**", - "vs/platform/**/{common,node,electron-main}/**", - "vs/code/**/{common,node,electron-main}/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/server/**", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,node}/**", - "vs/base/parts/**/{common,node}/**", - "vs/platform/**/{common,node}/**", - "vs/workbench/**/{common,node}/**", - "vs/server/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/workbench/workbench.common.main.ts", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,browser}/**", - "vs/base/parts/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/editor/**", - "vs/workbench/**/{common,browser}/**" - ] - }, - { - "target": "src/vs/workbench/workbench.web.main.ts", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,browser}/**", - "vs/base/parts/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/editor/**", - "vs/workbench/**/{common,browser}/**", - "vs/workbench/workbench.common.main" - ] - }, - { - "target": "src/vs/workbench/workbench.web.api.ts", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,browser}/**", - "vs/base/parts/**/{common,browser}/**", - "vs/platform/**/{common,browser}/**", - "vs/editor/**", - "vs/workbench/**/{common,browser}/**", - "vs/workbench/workbench.web.main" - ] - }, - { - "target": "src/vs/workbench/{workbench.sandbox.main.ts,workbench.desktop.sandbox.main.ts}", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,browser,electron-sandbox}/**", - "vs/base/parts/**/{common,browser,electron-sandbox}/**", - "vs/platform/**/{common,browser,electron-sandbox}/**", - "vs/editor/**", - "vs/workbench/**/{common,browser,electron-sandbox}/**", - "vs/workbench/workbench.common.main", - "vs/workbench/workbench.sandbox.main" - ] - }, - { - "target": "src/vs/workbench/workbench.desktop.main.ts", - "restrictions": [ - "vs/nls", - "vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/base/parts/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/editor/**", - "vs/workbench/**/{common,browser,node,electron-sandbox,electron-browser}/**", - "vs/workbench/workbench.common.main", - "vs/workbench/workbench.sandbox.main" - ] - }, - { - "target": "src/vs/workbench/{workbench.desktop.main.nls.js,workbench.web.api.nls.js}", - "restrictions": [] - }, - { - "target": "src/vs/{css.d.ts,monaco.d.ts,nls.d.ts,nls.mock.ts}", - "restrictions": [] - }, - { - "target": "src/vscode-dts/**", - "restrictions": [] - }, - { - "target": "src/{bootstrap-amd.js,bootstrap-fork.js,bootstrap-node.js,bootstrap-window.js,bootstrap.js,cli.js,main.js}", - "restrictions": [] - }, - { - "target": "extensions/**", - "restrictions": "**/*" - }, - { - "target": "test/smoke/**", - "restrictions": [ - "test/automation", - "test/smoke/**", - "@vscode/*", - "@parcel/*", - "@playwright/*", - "*" // node modules - ] - }, - { - "target": "test/automation/**", - "restrictions": [ - "test/automation/**", - "@vscode/*", - "@parcel/*", - "playwright-core/**", - "@playwright/*", - "*" // node modules - ] - }, - { - "target": "test/integration/**", - "restrictions": [ - "test/integration/**", - "@vscode/*", - "@parcel/*", - "@playwright/*", - "*" // node modules - ] - }, - { - "target": "test/monaco/**", - "restrictions": [ - "test/monaco/**", - "@vscode/*", - "@parcel/*", - "@playwright/*", - "*" // node modules - ] - }, - { - "target": "src/vs/workbench/test/**/api/**.test.ts", - "restrictions": [ - "vs/**", - "assert", - "sinon", - "sinon-test", - "crypto", - "vscode" - ] - }, - { - "target": "src/vs/**/{node,electron-browser,electron-main}/**/*.test.ts", - "restrictions": [ - "vs/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/**/{node,electron-browser,electron-main}/**/test/**", - "restrictions": [ - "vs/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/**/test/{node,electron-browser,electron-main}/**", - "restrictions": [ - "vs/**", - "@vscode/*", - "@parcel/*", - "*" // node modules - ] - }, - { - "target": "src/vs/**/**.test.ts", - "restrictions": [ - "vs/**", - "assert", - "sinon", - "sinon-test", - "crypto", - "xterm*" - ] - }, - { - "target": "src/vs/**/test/**", - "restrictions": [ - "vs/**", - "assert", - "sinon", - "sinon-test", - "crypto", - "xterm*" - ] - }, - { - "target": "build/**", - "restrictions": "**/*" - }, - { - "target": "**/{buildfile.js,buildfile.desktop.js,buildfile.web.js}", - "restrictions": "**/*" - } - ], "header/header": [ 2, "block", @@ -1166,7 +116,8 @@ "**/*.test.ts" ], "rules": { - "code-no-test-only": "error" + "code-no-test-only": "error", + "code-no-unexternalized-strings": "off" } }, { @@ -1236,6 +187,449 @@ } ] } + }, + { + "files": [ + "src/**/*.ts" + ], + "rules": { + "code-import-patterns": [ + "warn", + { + // imports that are allowed in all files of layers: + // - browser + // - electron-sandbox + // - electron-browser + "when": "hasBrowser", + "allow": [ + "vs/css!./**/*" + ] + }, + { + // imports that are allowed in all files of layers: + // - node + // - electron-browser + // - electron-main + "when": "hasNode", + "allow": [ + "@microsoft/applicationinsights-web", + "@parcel/watcher", + "@vscode/sqlite3", + "@vscode/vscode-languagedetection", + "@vscode/ripgrep", + "@vscode/iconv-lite-umd", + "applicationinsights", + "assert", + "child_process", + "console", + "cookie", + "crypto", + "electron", + "events", + "fs", + "graceful-fs", + "http", + "https", + "minimist", + "native-keymap", + "native-watchdog", + "net", + "node-pty", + "os", + "path", + "perf_hooks", + "spdlog", + "stream", + "string_decoder", + "tas-client-umd", + "tls", + "url", + "util", + "v8-inspect-profiler", + "vscode-proxy-agent", + "vscode-regexpp", + "vscode-textmate", + "windows-process-tree", + "worker_threads", + "xterm", + "xterm-addon-search", + "xterm-addon-serialize", + "xterm-addon-unicode11", + "xterm-addon-webgl", + "xterm-headless", + "yauzl", + "yazl", + "zlib" + ] + }, + { + // imports that are allowed in all /test/ files + "when": "test", + "allow": [ + "assert", + "sinon", + "sinon-test" + ] + }, + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! Do not relax these rules !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // + // A path ending in /~ has a special meaning. It indicates a template position + // which will be substituted with one or more layers. + // + // When /~ is used in the target, the rule will be expanded to 14 distinct rules. + // e.g. "src/vs/base/~" will be expanded to: + // - src/vs/base/common + // - src/vs/base/worker + // - src/vs/base/browser + // - src/vs/base/electron-sandbox + // - src/vs/base/node + // - src/vs/base/electron-browser + // - src/vs/base/electron-main + // - src/vs/base/test/common + // - src/vs/base/test/worker + // - src/vs/base/test/browser + // - src/vs/base/test/electron-sandbox + // - src/vs/base/test/node + // - src/vs/base/test/electron-browser + // - src/vs/base/test/electron-main + // + // When /~ is used in the restrictions, it will be replaced with the correct + // layers that can be used e.g. "src/vs/base/electron-sandbox" will be able + // to import "{common,browser,electron-sanbox}", etc. + // + // It is possible to use /~ in the restrictions property even without using it in + // the target property by adding a layer property. + { + "target": "src/vs/base/~", + "restrictions": [ + "vs/base/~" + ] + }, + { + "target": "src/vs/base/parts/*/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~" + ] + }, + { + "target": "src/vs/platform/*/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "tas-client-umd" // node module allowed even in /common/ + ] + }, + { + "target": "src/vs/editor/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~" + ] + }, + { + "target": "src/vs/editor/contrib/*/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~" + ] + }, + { + "target": "src/vs/editor/standalone/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/editor/standalone/~" + ] + }, + { + "target": "src/vs/editor/editor.all.ts", + "layer": "browser", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~" + ] + }, + { + "target": "src/vs/editor/editor.worker.ts", + "layer": "worker", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~" + ] + }, + { + "target": "src/vs/editor/{editor.api.ts,editor.main.ts}", + "layer": "browser", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/editor/standalone/~", + "vs/editor/*" + ] + }, + { + "target": "src/vs/workbench/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/workbench/~", + "vs/workbench/services/*/~", + "assert", + { + "when": "test", + "pattern": "vs/workbench/contrib/*/~" + } // TODO@layers + ] + }, + { + "target": "src/vs/workbench/api/~", + "restrictions": [ + "vscode", + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/workbench/api/~", + "vs/workbench/~", + "vs/workbench/services/*/~", + "vs/workbench/contrib/*/~" + ] + }, + { + "target": "src/vs/workbench/services/*/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/workbench/~", + "vs/workbench/services/*/~", + { + "when": "test", + "pattern": "vs/workbench/contrib/*/~" + }, // TODO@layers + "tas-client-umd", // node module allowed even in /common/ + "vscode-textmate", // node module allowed even in /common/ + "@vscode/vscode-languagedetection", // node module allowed even in /common/ + "@microsoft/applicationinsights-web" // node module allowed even in /common/ + ] + }, + { + "target": "src/vs/workbench/contrib/*/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/workbench/~", + "vs/workbench/services/*/~", + "vs/workbench/contrib/*/~", + { + "when": "hasBrowser", + "pattern": "xterm" + }, // node module allowed even in /browser/ + { + "when": "hasBrowser", + "pattern": "xterm-addon-*" + }, // node module allowed even in /browser/ + { + "when": "hasBrowser", + "pattern": "vscode-textmate" + } // node module allowed even in /browser/ + ] + }, + { + "target": "src/vs/code/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/code/~", + { + "when": "hasBrowser", + "pattern": "vs/workbench/workbench.web.main" + } + ] + }, + { + "target": "src/vs/server/~", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/workbench/~", + "vs/workbench/api/~", + "vs/workbench/services/*/~", + "vs/workbench/contrib/*/~", + "vs/server/~" + ] + }, + { + "target": "src/vs/workbench/workbench.common.main.ts", + "layer": "browser", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/editor/editor.all", + "vs/workbench/~", + "vs/workbench/api/~", + "vs/workbench/services/*/~", + "vs/workbench/contrib/*/~" + ] + }, + { + "target": "src/vs/workbench/workbench.web.main.ts", + "layer": "browser", + "restrictions": [ + "vs/base/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/editor/editor.all", + "vs/workbench/~", + "vs/workbench/api/~", + "vs/workbench/services/*/~", + "vs/workbench/contrib/*/~", + "vs/workbench/workbench.common.main" + ] + }, + { + "target": "src/vs/workbench/{workbench.sandbox.main.ts,workbench.desktop.sandbox.main.ts}", + "layer": "electron-sandbox", + "restrictions": [ + "vs/base/*/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/editor/editor.all", + "vs/workbench/~", + "vs/workbench/api/~", + "vs/workbench/services/*/~", + "vs/workbench/contrib/*/~", + "vs/workbench/workbench.common.main", + "vs/workbench/workbench.sandbox.main" + ] + }, + { + "target": "src/vs/workbench/workbench.desktop.main.ts", + "layer": "electron-browser", + "restrictions": [ + "vs/base/*/~", + "vs/base/parts/*/~", + "vs/platform/*/~", + "vs/editor/~", + "vs/editor/contrib/*/~", + "vs/editor/editor.all", + "vs/workbench/~", + "vs/workbench/api/~", + "vs/workbench/services/*/~", + "vs/workbench/contrib/*/~", + "vs/workbench/workbench.common.main", + "vs/workbench/workbench.sandbox.main" + ] + }, + { + "target": "src/vs/workbench/{workbench.desktop.main.nls.js,workbench.web.main.nls.js}", + "restrictions": [] + }, + { + "target": "src/vs/{css.d.ts,monaco.d.ts,nls.d.ts,nls.mock.ts}", + "restrictions": [] + }, + { + "target": "src/vscode-dts/**", + "restrictions": [] + }, + { + "target": "src/{bootstrap-amd.js,bootstrap-fork.js,bootstrap-node.js,bootstrap-window.js,bootstrap.js,cli.js,main.js,server-cli.js,server-main.js}", + "restrictions": [] + } + ] + } + }, + { + "files": [ + "test/**/*.ts" + ], + "rules": { + "code-import-patterns": [ + "warn", + { + "target": "test/smoke/**", + "restrictions": [ + "test/automation", + "test/smoke/**", + "@vscode/*", + "@parcel/*", + "@playwright/*", + "*" // node modules + ] + }, + { + "target": "test/automation/**", + "restrictions": [ + "test/automation/**", + "@vscode/*", + "@parcel/*", + "playwright-core/**", + "@playwright/*", + "*" // node modules + ] + }, + { + "target": "test/integration/**", + "restrictions": [ + "test/integration/**", + "@vscode/*", + "@parcel/*", + "@playwright/*", + "*" // node modules + ] + }, + { + "target": "test/monaco/**", + "restrictions": [ + "test/monaco/**", + "@vscode/*", + "@parcel/*", + "@playwright/*", + "*" // node modules + ] + } + ] + } } ] } diff --git a/.git-blame-ignore b/.git-blame-ignore index 92a72be40de..24b19f36c30 100644 --- a/.git-blame-ignore +++ b/.git-blame-ignore @@ -18,4 +18,8 @@ ae1452eea678f5266ef513f22dacebb90955d6c9 # mjbvz: organize imports 494cbbd02d67e87727ec885f98d19551aa33aad1 a3cb14be7f2cceadb17adf843675b1a59537dbbd -ee1655a82ebdfd38bf8792088a6602c69f7bbd94 \ No newline at end of file +ee1655a82ebdfd38bf8792088a6602c69f7bbd94 + + +# jrieken: new eslint-rule +4a130c40ed876644ed8af2943809d08221375408 diff --git a/.github/classifier.json b/.github/classifier.json index d7b302ac0a0..69b60eeae1c 100644 --- a/.github/classifier.json +++ b/.github/classifier.json @@ -7,7 +7,7 @@ "labels": { "L10N": {"assign": ["TylerLeonhardt", "csigs"]}, "VIM": {"assign": []}, - "accessibility": { "assign": ["sana-ajani"]}, + "accessibility": { "assign": ["isidorn"]}, "api": {"assign": ["jrieken"]}, "api-finalization": {"assign": []}, "api-proposal": {"assign": ["jrieken"]}, diff --git a/.github/workflows/build-chat.yml b/.github/workflows/build-chat.yml deleted file mode 100644 index 03f3bd42caf..00000000000 --- a/.github/workflows/build-chat.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: "Build Chat" - -on: - workflow_run: - workflows: - - CI - types: - - completed - branches: - - main - - release/* - -jobs: - main: - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v2 - with: - repository: "microsoft/vscode-github-triage-actions" - path: ./actions - - name: Install Actions - run: npm install --production --prefix ./actions - - name: Install Additional Dependencies - # Pulls in a bunch of other packages that arent needed for the rest of the actions - run: npm install @azure/storage-blob@12.1.1 - - name: Build Chat - uses: ./actions/build-chat - with: - token: ${{ secrets.GITHUB_TOKEN }} - slack_token: ${{ secrets.SLACK_TOKEN }} - storage_connection_string: ${{ secrets.BUILD_CHAT_STORAGE_CONNECTION_STRING }} - workflow_run_url: ${{ github.event.workflow_run.url }} - notification_channel: build - log_channel: bot-log diff --git a/.github/workflows/check-clean-git-state.sh b/.github/workflows/check-clean-git-state.sh new file mode 100755 index 00000000000..cd09d4db30c --- /dev/null +++ b/.github/workflows/check-clean-git-state.sh @@ -0,0 +1,6 @@ +R=`git status --porcelain | wc -l` +if [ "$R" -ne "0" ]; then + echo "The git repo is not clean after compiling the /build/ folder. Did you forget to commit .js output for .ts files?"; + git status --porcelain + exit 1; +fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d5f9545464..77534f96324 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: - uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - uses: actions/setup-python@v2 with: @@ -70,7 +70,7 @@ jobs: run: yarn npm-run-all --max_old_space_size=4095 -lp compile "electron x64" playwright-install download-builtin-extensions - name: Compile Integration Tests - run: yarn compile-integration-tests + run: yarn --cwd test/integration/browser compile - name: Run Unit Tests (Electron) run: .\scripts\test.bat @@ -79,18 +79,18 @@ jobs: run: yarn test-node - name: Run Unit Tests (Browser, Chromium) - run: yarn test-browser --browser chromium + run: yarn test-browser-no-install --browser chromium - name: Run Integration Tests (Electron) run: .\scripts\test-integration.bat - name: Run Integration Tests (Browser, Firefox) timeout-minutes: 20 - run: .\resources\server\test\test-web-integration.bat --browser firefox + run: .\scripts\test-web-integration.bat --browser firefox - name: Run Integration Tests (Remote) timeout-minutes: 20 - run: .\resources\server\test\test-remote-integration.bat + run: .\scripts\test-remote-integration.bat linux: name: Linux @@ -113,7 +113,7 @@ jobs: - uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Compute node modules cache key id: nodeModulesCacheKey @@ -123,8 +123,8 @@ jobs: uses: actions/cache@v2 with: path: "**/node_modules" - key: ${{ runner.os }}-cacheNodeModules14-${{ steps.nodeModulesCacheKey.outputs.value }} - restore-keys: ${{ runner.os }}-cacheNodeModules14- + key: ${{ runner.os }}-cacheNodeModules19-${{ steps.nodeModulesCacheKey.outputs.value }} + restore-keys: ${{ runner.os }}-cacheNodeModules19- - name: Get yarn cache directory path id: yarnCacheDirPath if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }} @@ -147,7 +147,7 @@ jobs: run: yarn npm-run-all --max_old_space_size=4095 -lp compile "electron x64" playwright-install download-builtin-extensions - name: Compile Integration Tests - run: yarn compile-integration-tests + run: yarn --cwd test/integration/browser compile - name: Run Unit Tests (Electron) id: electron-unit-tests @@ -159,7 +159,7 @@ jobs: - name: Run Unit Tests (Browser, Chromium) id: browser-unit-tests - run: DISPLAY=:10 yarn test-browser --browser chromium + run: DISPLAY=:10 yarn test-browser-no-install --browser chromium - name: Run Integration Tests (Electron) id: electron-integration-tests @@ -167,12 +167,12 @@ jobs: - name: Run Integration Tests (Browser, Chromium) id: browser-integration-tests - run: DISPLAY=:10 ./resources/server/test/test-web-integration.sh --browser chromium + run: DISPLAY=:10 ./scripts/test-web-integration.sh --browser chromium - name: Run Integration Tests (Remote) id: electron-remote-integration-tests timeout-minutes: 15 - run: DISPLAY=:10 ./resources/server/test/test-remote-integration.sh + run: DISPLAY=:10 ./scripts/test-remote-integration.sh darwin: name: macOS @@ -185,7 +185,7 @@ jobs: - uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Compute node modules cache key id: nodeModulesCacheKey @@ -195,8 +195,8 @@ jobs: uses: actions/cache@v2 with: path: "**/node_modules" - key: ${{ runner.os }}-cacheNodeModules14-${{ steps.nodeModulesCacheKey.outputs.value }} - restore-keys: ${{ runner.os }}-cacheNodeModules14- + key: ${{ runner.os }}-cacheNodeModules19-${{ steps.nodeModulesCacheKey.outputs.value }} + restore-keys: ${{ runner.os }}-cacheNodeModules19- - name: Get yarn cache directory path id: yarnCacheDirPath if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }} @@ -219,7 +219,7 @@ jobs: run: yarn npm-run-all --max_old_space_size=4095 -lp compile "electron x64" playwright-install download-builtin-extensions - name: Compile Integration Tests - run: yarn compile-integration-tests + run: yarn --cwd test/integration/browser compile # This is required for keytar unittests, otherwise we hit # https://github.com/atom/node-keytar/issues/76 @@ -236,17 +236,17 @@ jobs: run: yarn test-node - name: Run Unit Tests (Browser, Chromium) - run: DISPLAY=:10 yarn test-browser --browser chromium + run: DISPLAY=:10 yarn test-browser-no-install --browser chromium - name: Run Integration Tests (Electron) run: DISPLAY=:10 ./scripts/test-integration.sh - name: Run Integration Tests (Browser, Webkit) - run: DISPLAY=:10 ./resources/server/test/test-web-integration.sh --browser webkit + run: DISPLAY=:10 ./scripts/test-web-integration.sh --browser webkit - name: Run Integration Tests (Remote) timeout-minutes: 15 - run: DISPLAY=:10 ./resources/server/test/test-remote-integration.sh + run: DISPLAY=:10 ./scripts/test-remote-integration.sh hygiene: name: Hygiene, Layering and Monaco Editor @@ -259,7 +259,7 @@ jobs: - uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Compute node modules cache key id: nodeModulesCacheKey @@ -269,8 +269,8 @@ jobs: uses: actions/cache@v2 with: path: "**/node_modules" - key: ${{ runner.os }}-cacheNodeModules14-${{ steps.nodeModulesCacheKey.outputs.value }} - restore-keys: ${{ runner.os }}-cacheNodeModules14- + key: ${{ runner.os }}-cacheNodeModules19-${{ steps.nodeModulesCacheKey.outputs.value }} + restore-keys: ${{ runner.os }}-cacheNodeModules19- - name: Get yarn cache directory path id: yarnCacheDirPath if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }} @@ -289,12 +289,21 @@ jobs: ELECTRON_SKIP_BINARY_DOWNLOAD: 1 run: yarn --frozen-lockfile --network-timeout 180000 + - name: Download Playwright + run: yarn playwright-install + - name: Run Hygiene Checks run: yarn gulp hygiene - name: Run Valid Layers Checks run: yarn valid-layers-check + - name: Compile /build/ + run: yarn --cwd build compile + + - name: Check clean git state + run: ./.github/workflows/check-clean-git-state.sh + - name: Run eslint run: yarn eslint @@ -310,6 +319,10 @@ jobs: - name: Editor Distro & ESM Bundle run: yarn gulp editor-esm-bundle + - name: Editor ESM sources check + working-directory: ./test/monaco + run: yarn run esm-check + - name: Typings validation prep run: | mkdir typings-test @@ -322,17 +335,14 @@ jobs: echo "import '../out-monaco-editor-core';" > a.ts ../node_modules/.bin/tsc --noEmit - - name: Webpack Editor + - name: Package Editor with Webpack working-directory: ./test/monaco - run: yarn run bundle + run: yarn run bundle-webpack - name: Compile Editor Tests working-directory: ./test/monaco run: yarn run compile - - name: Download Playwright - run: yarn playwright-install - - name: Run Editor Tests timeout-minutes: 5 working-directory: ./test/monaco diff --git a/.github/workflows/create-codespaces-prebuild.yml b/.github/workflows/create-codespaces-prebuild.yml deleted file mode 100644 index bd371137e56..00000000000 --- a/.github/workflows/create-codespaces-prebuild.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Create Codespaces Prebuild -on: - push: - branches: - - main - workflow_dispatch: -jobs: - createPrebuild: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: github/codespaces-precache@v1.0.1 - with: - regions: WestUs2 - sku_name: standardLinux32gb - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - createPrebuildPpe: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: github/codespaces-precache@v1.0.1 - with: - target: ppe - regions: WestUs2 SouthEastAsia - sku_name: standardLinux32gb - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - createPrebuildDev: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: github/codespaces-precache@v1.0.1 - with: - target: development - regions: WestUs2 - sku_name: standardLinux32gb - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - diff --git a/.github/workflows/deep-classifier-runner.yml b/.github/workflows/deep-classifier-runner.yml index 8314c4eca81..20288f2e7e2 100644 --- a/.github/workflows/deep-classifier-runner.yml +++ b/.github/workflows/deep-classifier-runner.yml @@ -25,7 +25,7 @@ jobs: uses: ./actions/classifier-deep/apply/fetch-sources with: # slightly overlapping to protect against issues slipping through the cracks if a run is delayed - from: 10000 # 7 days + from: 10000 # ~7 days until: 5 configPath: classifier blobContainerName: vscode-issue-classifier @@ -46,7 +46,7 @@ jobs: uses: ./actions/classifier-deep/apply/apply-labels with: configPath: classifier - allowLabels: "needs more info|new release" + allowLabels: "needs more info|new release|error-telemetry|*english-please|translation-required" appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} manifestDbConnectionString: ${{secrets.MANIFEST_DB_CONNECTION_STRING}} token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml index e5dc42ac44a..064b8d86145 100644 --- a/.github/workflows/on-open.yml +++ b/.github/workflows/on-open.yml @@ -23,13 +23,14 @@ jobs: token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} owner: JacksonKearl repo: testissues - - name: Run CopyCat (chrmarti/testissues) - uses: ./actions/copycat - with: - appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} - token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} - owner: chrmarti - repo: testissues + + # - name: Run CopyCat (chrmarti/testissues) + # uses: ./actions/copycat + # with: + # appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} + # token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + # owner: chrmarti + # repo: testissues - name: Run New Release uses: ./actions/new-release diff --git a/.github/workflows/rich-navigation.yml b/.github/workflows/rich-navigation.yml index f5fd32493f1..1d8357e0a35 100644 --- a/.github/workflows/rich-navigation.yml +++ b/.github/workflows/rich-navigation.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Install dependencies if: steps.caching-stage.outputs.cache-hit != 'true' @@ -36,6 +36,5 @@ jobs: with: languages: typescript repo-token: ${{ secrets.GITHUB_TOKEN }} - typescriptVersion: 0.6.0-next.21 configFiles: .lsifrc.json continue-on-error: true diff --git a/.vscode/launch.json b/.vscode/launch.json index 6c5dda1ce3d..84affe5f920 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -244,10 +244,16 @@ } }, { - "type": "node", + "type": "pwa-node", "request": "launch", - "name": "VS Code (Web)", - "program": "${workspaceFolder}/resources/web/code-web.js", + "name": "VS Code Server (Web)", + "runtimeExecutable": "${workspaceFolder}/scripts/code-server.sh", + "windows": { + "runtimeExecutable": "${workspaceFolder}/scripts/code-server.bat", + }, + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], "presentation": { "group": "0_vscode", "order": 2 @@ -279,9 +285,9 @@ "request": "launch", "outFiles": [], "perScriptSourcemaps": "yes", - "name": "VS Code (Web, Chrome)", - "url": "http://localhost:8080", - "preLaunchTask": "Run web", + "name": "VS Code Server (Web, Chrome)", + "url": "http://localhost:8080?tkn=dev-token", + "preLaunchTask": "Run code server", "presentation": { "group": "0_vscode", "order": 3 @@ -292,10 +298,10 @@ "request": "launch", "outFiles": [], "perScriptSourcemaps": "yes", - "name": "VS Code (Web, Edge)", - "url": "http://localhost:8080", + "name": "VS Code Server (Web, Edge)", + "url": "http://localhost:8080?tkn=dev-token", "pauseForSourceMap": false, - "preLaunchTask": "Run web", + "preLaunchTask": "Run code server", "presentation": { "group": "0_vscode", "order": 3 diff --git a/.vscode/notebooks/api.github-issues b/.vscode/notebooks/api.github-issues index 613a3dd3ce9..ba47e19918b 100644 --- a/.vscode/notebooks/api.github-issues +++ b/.vscode/notebooks/api.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$repo=repo:microsoft/vscode\n$milestone=milestone:\"January 2022\"" + "value": "$repo=repo:microsoft/vscode\n$milestone=milestone:\"February 2022\"" }, { "kind": 1, diff --git a/.vscode/notebooks/endgame.github-issues b/.vscode/notebooks/endgame.github-issues index 40dcb6c71de..90355cedb24 100644 --- a/.vscode/notebooks/endgame.github-issues +++ b/.vscode/notebooks/endgame.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-dev repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-remotehub repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-livepreview repo:microsoft/vscode-python repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-unpkg\n\n$MILESTONE=milestone:\"November 2021\"" + "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-dev repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-remotehub repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-livepreview repo:microsoft/vscode-python repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-unpkg\n\n$MILESTONE=milestone:\"January 2022\"" }, { "kind": 1, diff --git a/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues index 3d0c3481c87..c814eb91c54 100644 --- a/.vscode/notebooks/my-endgame.github-issues +++ b/.vscode/notebooks/my-endgame.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-dev repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-remotehub repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-livepreview repo:microsoft/vscode-python repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal\n\n$MILESTONE=milestone:\"November 2021\"\n\n$MINE=assignee:@me" + "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-dev repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-remotehub repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-livepreview repo:microsoft/vscode-python repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal\n\n$MILESTONE=milestone:\"January 2022\"\n\n$MINE=assignee:@me" }, { "kind": 1, diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues index 1d40f143082..d7b45aa317b 100644 --- a/.vscode/notebooks/my-work.github-issues +++ b/.vscode/notebooks/my-work.github-issues @@ -7,7 +7,7 @@ { "kind": 2, "language": "github-issues", - "value": "// list of repos we work in\n$repos=repo:microsoft/vscode repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-dev repo:microsoft/vscode-references-view repo:microsoft/vscode-anycode repo:microsoft/vscode-hexeditor repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-livepreview repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-remote-repositories-github\n\n// current milestone name\n$milestone=milestone:\"January 2022\"" + "value": "// list of repos we work in\n$repos=repo:microsoft/vscode repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-dev repo:microsoft/vscode-references-view repo:microsoft/vscode-anycode repo:microsoft/vscode-hexeditor repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-livepreview repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-remote-repositories-github\n\n// current milestone name\n$milestone=milestone:\"February 2022\"" }, { "kind": 1, diff --git a/.vscode/settings.json b/.vscode/settings.json index 67bc218c44f..1a6af100bec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -26,7 +26,7 @@ "test/automation/out/**": true, "test/integration/browser/out/**": true, "src/vs/base/test/node/uri.test.data.txt": true, - "src/vs/workbench/test/browser/api/extHostDocumentData.test.perf-data.ts": true + "src/vs/workbench/api/test/browser/extHostDocumentData.test.perf-data.ts": true }, "lcov.path": [ "./.build/coverage/lcov.info", @@ -84,12 +84,6 @@ "editor.formatOnSave": true }, "typescript.tsc.autoDetect": "off", - "editor.inlayHints.enabled": true, - "typescript.inlayHints.enumMemberValues.enabled": true, - "typescript.inlayHints.functionLikeReturnTypes.enabled": true, - "typescript.inlayHints.parameterTypes.enabled": true, - "typescript.inlayHints.propertyDeclarationTypes.enabled": true, - "typescript.inlayHints.variableTypes.enabled": true, "testing.autoRun.mode": "rerun", "conventionalCommits.scopes": [ "tree", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index ebf95734c04..bee1f405a54 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -171,8 +171,12 @@ }, { "type": "shell", - "command": "yarn web --no-launch", - "label": "Run web", + "command": "./scripts/code-server.sh", + "windows": { + "command": ".\\scripts\\code-server.bat" + }, + "args": ["--no-launch", "--connection-token", "dev-token", "--port", "8080"], + "label": "Run code server", "isBackground": true, "problemMatcher": { "pattern": { diff --git a/.yarnrc b/.yarnrc index 481bf7bfa46..8a679354e6c 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,4 +1,4 @@ disturl "https://electronjs.org/headers" -target "13.5.2" +target "16.0.8" runtime "electron" build_from_source "true" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3d6c01e8335..b96e077aa67 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,6 +69,10 @@ Please include the following with each issue: * Errors from the Dev Tools Console (open from the menu: Help > Toggle Developer Tools) +### Creating Pull Requests + +* Please refer to the article on [creating pull requests](https://github.com/microsoft/vscode/wiki/How-to-Contribute#pull-requests) and contributing to this project. + ### Final Checklist Please remember to do the following: diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 95e82140a9a..83a9e45c392 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -9,7 +9,7 @@ This project incorporates components from the projects listed below. The origina 2. atom/language-coffee-script version 0.49.3 (https://github.com/atom/language-coffee-script) 3. atom/language-css version 0.45.0 (https://github.com/atom/language-css) 4. atom/language-java version 0.32.1 (https://github.com/atom/language-java) -5. atom/language-sass version 0.62.1 (https://github.com/atom/language-sass) +5. atom/language-sass version 0.61.4 (https://github.com/atom/language-sass) 6. atom/language-shellscript version 0.26.0 (https://github.com/atom/language-shellscript) 7. atom/language-xml version 0.35.2 (https://github.com/atom/language-xml) 8. better-go-syntax version 1.0.0 (https://github.com/jeff-hykin/better-go-syntax/ ) @@ -32,46 +32,47 @@ This project incorporates components from the projects listed below. The origina 25. James-Yu/LaTeX-Workshop version 8.19.1 (https://github.com/James-Yu/LaTeX-Workshop) 26. jeff-hykin/cpp-textmate-grammar version 1.12.11 (https://github.com/jeff-hykin/cpp-textmate-grammar) 27. jeff-hykin/cpp-textmate-grammar version 1.15.6 (https://github.com/jeff-hykin/cpp-textmate-grammar) -28. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify) -29. JuliaEditorSupport/atom-language-julia version 0.21.1 (https://github.com/JuliaEditorSupport/atom-language-julia) -30. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert) -31. language-docker (https://github.com/moby/moby) -32. language-less version 0.34.2 (https://github.com/atom/language-less) -33. language-php version 0.47.0 (https://github.com/atom/language-php) -34. MagicStack/MagicPython version 1.1.1 (https://github.com/MagicStack/MagicPython) -35. marked version 3.0.2 (https://github.com/markedjs/marked) -36. mdn-data version 1.1.12 (https://github.com/mdn/data) -37. microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/microsoft/TypeScript-TmLanguage) -38. microsoft/vscode-JSON.tmLanguage (https://github.com/microsoft/vscode-JSON.tmLanguage) -39. microsoft/vscode-markdown-tm-grammar version 1.0.0 (https://github.com/microsoft/vscode-markdown-tm-grammar) -40. microsoft/vscode-mssql version 1.10.1 (https://github.com/microsoft/vscode-mssql) -41. mmims/language-batchfile version 0.7.6 (https://github.com/mmims/language-batchfile) -42. NVIDIA/cuda-cpp-grammar (https://github.com/NVIDIA/cuda-cpp-grammar) -43. PowerShell/EditorSyntax version 1.0.0 (https://github.com/PowerShell/EditorSyntax) -44. rust-syntax version 0.5.0 (https://github.com/dustypomerleau/rust-syntax) -45. semver version 5.5.0 (https://github.com/npm/node-semver) -46. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui) -47. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage) -48. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle) -49. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle) -50. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle) -51. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle) -52. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle) -53. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle) -54. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle) -55. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle) -56. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle) -57. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle) -58. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle) -59. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle) -60. textmate/yaml.tmbundle (https://github.com/textmate/yaml.tmbundle) -61. TypeScript-TmLanguage version 0.1.8 (https://github.com/microsoft/TypeScript-TmLanguage) -62. TypeScript-TmLanguage version 1.0.0 (https://github.com/microsoft/TypeScript-TmLanguage) -63. Unicode version 12.0.0 (https://home.unicode.org/) -64. vscode-codicons version 0.0.14 (https://github.com/microsoft/vscode-codicons) -65. vscode-logfile-highlighter version 2.11.0 (https://github.com/emilast/vscode-logfile-highlighter) -66. vscode-swift version 0.0.1 (https://github.com/owensd/vscode-swift) -67. Web Background Synchronization (https://github.com/WICG/background-sync) +28. jlelong/vscode-latex-basics version 1.1.0 (https://github.com/jlelong/vscode-latex-basics) +29. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify) +30. JuliaEditorSupport/atom-language-julia version 0.21.2 (https://github.com/JuliaEditorSupport/atom-language-julia) +31. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert) +32. language-docker (https://github.com/moby/moby) +33. language-less version 0.34.2 (https://github.com/atom/language-less) +34. language-php version 0.48.0 (https://github.com/atom/language-php) +35. MagicStack/MagicPython version 1.1.1 (https://github.com/MagicStack/MagicPython) +36. marked version 3.0.2 (https://github.com/markedjs/marked) +37. mdn-data version 1.1.12 (https://github.com/mdn/data) +38. microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/microsoft/TypeScript-TmLanguage) +39. microsoft/vscode-JSON.tmLanguage (https://github.com/microsoft/vscode-JSON.tmLanguage) +40. microsoft/vscode-markdown-tm-grammar version 1.0.0 (https://github.com/microsoft/vscode-markdown-tm-grammar) +41. microsoft/vscode-mssql version 1.10.1 (https://github.com/microsoft/vscode-mssql) +42. mmims/language-batchfile version 0.7.6 (https://github.com/mmims/language-batchfile) +43. NVIDIA/cuda-cpp-grammar (https://github.com/NVIDIA/cuda-cpp-grammar) +44. PowerShell/EditorSyntax version 1.0.0 (https://github.com/PowerShell/EditorSyntax) +45. rust-syntax version 0.5.0 (https://github.com/dustypomerleau/rust-syntax) +46. semver version 5.5.0 (https://github.com/npm/node-semver) +47. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui) +48. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage) +49. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle) +50. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle) +51. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle) +52. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle) +53. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle) +54. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle) +55. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle) +56. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle) +57. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle) +58. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle) +59. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle) +60. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle) +61. textmate/yaml.tmbundle (https://github.com/textmate/yaml.tmbundle) +62. TypeScript-TmLanguage version 0.1.8 (https://github.com/microsoft/TypeScript-TmLanguage) +63. TypeScript-TmLanguage version 1.0.0 (https://github.com/microsoft/TypeScript-TmLanguage) +64. Unicode version 12.0.0 (https://home.unicode.org/) +65. vscode-codicons version 0.0.14 (https://github.com/microsoft/vscode-codicons) +66. vscode-logfile-highlighter version 2.11.0 (https://github.com/emilast/vscode-logfile-highlighter) +67. vscode-swift version 0.0.1 (https://github.com/owensd/vscode-swift) +68. Web Background Synchronization (https://github.com/WICG/background-sync) %% atom/language-clojure NOTICES AND INFORMATION BEGIN HERE @@ -1232,6 +1233,29 @@ SOFTWARE. ========================================= END OF jeff-hykin/cpp-textmate-grammar NOTICES AND INFORMATION +%% jlelong/vscode-latex-basics NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) vscode-latex-basics authors + +If not otherwise specified (see below), files in this repository fall under the MIT License + + +The file syntaxes/LaTeX.tmLanguage.json is based on https://github.com/textmate/latex.tmbundle/blob/master/Syntaxes/LaTeX.plist +but has been largely modified. The original file falls under the following license + +Permission to copy, use, modify, sell and distribute this +software is granted. This software is provided "as is" without +express or implied warranty, and with no claim as to its +suitability for any purpose. + +The file syntaxes/markdown-latex-combined.tmLanguage.json is generated from the Markdown grammar +included in VSCode and falls under the license described in markdown-latex-combined-license.txt. + +The file syntaxes/cpp-grammar-bailout.tmLanguage.json is generated from https://github.com/jeff-hykin/better-cpp-syntax +and falls under the license described in cpp-bailout-license.txt. +========================================= +END OF jlelong/vscode-latex-basics NOTICES AND INFORMATION + %% js-beautify NOTICES AND INFORMATION BEGIN HERE ========================================= The MIT License (MIT) diff --git a/build/.cachesalt b/build/.cachesalt index ca859ca2255..8df56c079a4 100644 --- a/build/.cachesalt +++ b/build/.cachesalt @@ -1 +1 @@ -2021-11-24T12:04:58.681Z +2022-02-03T12:38:01.545Z diff --git a/build/.moduleignore b/build/.moduleignore index 6efda5efd8d..29b676c1a1b 100644 --- a/build/.moduleignore +++ b/build/.moduleignore @@ -21,6 +21,11 @@ fsevents/test/** @vscode/sqlite3/src/** !@vscode/sqlite3/build/Release/*.node +@vscode/windows-registry/binding.gyp +@vscode/windows-registry/src/** +@vscode/windows-registry/build/** +!@vscode/windows-registry/build/Release/*.node + windows-mutex/binding.gyp windows-mutex/build/** windows-mutex/src/** diff --git a/build/azure-pipelines/common/createAsset.js b/build/azure-pipelines/common/createAsset.js index 360b1d74363..43cdc96c063 100644 --- a/build/azure-pipelines/common/createAsset.js +++ b/build/azure-pipelines/common/createAsset.js @@ -20,7 +20,7 @@ function getPlatform(product, os, arch, type) { switch (os) { case 'win32': switch (product) { - case 'client': + case 'client': { const asset = arch === 'ia32' ? 'win32' : `win32-${arch}`; switch (type) { case 'archive': @@ -32,6 +32,7 @@ function getPlatform(product, os, arch, type) { default: throw new Error(`Unrecognized: ${product} ${os} ${arch} ${type}`); } + } case 'server': if (arch === 'arm64') { throw new Error(`Unrecognized: ${product} ${os} ${arch} ${type}`); diff --git a/build/azure-pipelines/common/createAsset.ts b/build/azure-pipelines/common/createAsset.ts index 62414d41fcc..26c9e1a0b0e 100644 --- a/build/azure-pipelines/common/createAsset.ts +++ b/build/azure-pipelines/common/createAsset.ts @@ -35,7 +35,7 @@ function getPlatform(product: string, os: string, arch: string, type: string): s switch (os) { case 'win32': switch (product) { - case 'client': + case 'client': { const asset = arch === 'ia32' ? 'win32' : `win32-${arch}`; switch (type) { case 'archive': @@ -47,6 +47,7 @@ function getPlatform(product: string, os: string, arch: string, type: string): s default: throw new Error(`Unrecognized: ${product} ${os} ${arch} ${type}`); } + } case 'server': if (arch === 'arm64') { throw new Error(`Unrecognized: ${product} ${os} ${arch} ${type}`); diff --git a/build/azure-pipelines/darwin/product-build-darwin-sign.yml b/build/azure-pipelines/darwin/product-build-darwin-sign.yml index a7d52870d49..e67678d9335 100644 --- a/build/azure-pipelines/darwin/product-build-darwin-sign.yml +++ b/build/azure-pipelines/darwin/product-build-darwin-sign.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" @@ -27,6 +27,14 @@ steps: git pull --no-rebase https://github.com/$(VSCODE_MIXIN_REPO).git $(node -p "require('./package.json').distro") displayName: Merge distro + - script: | + set -e + npx https://aka.ms/enablesecurefeed standAlone + timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 + condition: and(succeeded(), eq(variables['ENABLE_TERRAPIN'], 'true')) + displayName: Switch to Terrapin packages + - script: | set -e for i in {1..3}; do # try 3 times, for Terrapin diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 6a4d5eaf52f..e0d4c43d8e3 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" @@ -71,6 +71,7 @@ steps: set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages @@ -174,21 +175,21 @@ steps: set -e ./scripts/test.sh --build --tfs "Unit Tests" displayName: Run unit tests (Electron) - timeoutInMinutes: 7 + timeoutInMinutes: 15 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e yarn test-node --build displayName: Run unit tests (node.js) - timeoutInMinutes: 7 + timeoutInMinutes: 15 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e - DEBUG=*browser* yarn test-browser --sequential --build --browser chromium --browser webkit --browser firefox --tfs "Browser Unit Tests" - displayName: Run unit tests (Browser, Chromium & Firefox & Webkit) - timeoutInMinutes: 20 + DEBUG=*browser* yarn test-browser-no-install --sequential --build --browser chromium --browser webkit --tfs "Browser Unit Tests" + displayName: Run unit tests (Browser, Chromium & Webkit) + timeoutInMinutes: 30 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -202,15 +203,15 @@ steps: VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \ ./scripts/test-integration.sh --build --tfs "Integration Tests" displayName: Run integration tests (Electron) - timeoutInMinutes: 10 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-darwin" \ - ./resources/server/test/test-web-integration.sh --browser webkit + ./scripts/test-web-integration.sh --browser webkit displayName: Run integration tests (Browser, Webkit) - timeoutInMinutes: 10 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -219,9 +220,9 @@ steps: APP_NAME="`ls $APP_ROOT | head -n 1`" INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \ - ./resources/server/test/test-remote-integration.sh + ./scripts/test-remote-integration.sh displayName: Run integration tests (Remote) - timeoutInMinutes: 7 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -237,7 +238,8 @@ steps: APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH) APP_NAME="`ls $APP_ROOT | head -n 1`" yarn smoketest-no-compile --build "$APP_ROOT/$APP_NAME" - timeoutInMinutes: 10 + # Increased timeout because this test downloads stable code + timeoutInMinutes: 20 displayName: Run smoke tests (Electron) condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) @@ -259,6 +261,16 @@ steps: continueOnError: true condition: failed() + # In order to properly symbolify above crash reports + # (if any), we need the compiled native modules too + - task: PublishPipelineArtifact@0 + inputs: + artifactName: node-modules-macos-$(VSCODE_ARCH) + targetPath: node_modules + displayName: "Publish Node Modules" + continueOnError: true + condition: failed() + - task: PublishPipelineArtifact@0 inputs: artifactName: logs-macos-$(VSCODE_ARCH)-$(System.JobAttempt) @@ -328,3 +340,27 @@ steps: displayName: Upload configuration (for Bing settings search) condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), ne(variables['VSCODE_PUBLISH'], 'false')) continueOnError: true + + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: Generate SBOM (client) + inputs: + BuildDropPath: $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH) + PackageName: Visual Studio Code + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'universal')) + + - publish: $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)/_manifest + displayName: Publish SBOM (client) + artifact: vscode_client_darwin_$(VSCODE_ARCH)_sbom + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'universal')) + + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: Generate SBOM (server) + inputs: + BuildDropPath: $(agent.builddirectory)/vscode-server-darwin + PackageName: Visual Studio Code Server + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), eq(variables['VSCODE_ARCH'], 'x64')) + + - publish: $(agent.builddirectory)/vscode-server-darwin/_manifest + displayName: Publish SBOM (server) + artifact: vscode_server_darwin_$(VSCODE_ARCH)_sbom + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), eq(variables['VSCODE_ARCH'], 'x64')) diff --git a/build/azure-pipelines/distro-build.yml b/build/azure-pipelines/distro-build.yml index 53b62b47a4e..307f226dc0a 100644 --- a/build/azure-pipelines/distro-build.yml +++ b/build/azure-pipelines/distro-build.yml @@ -11,7 +11,7 @@ pr: steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" diff --git a/build/azure-pipelines/exploration-build.yml b/build/azure-pipelines/exploration-build.yml index 5b6599d8dab..a80650bb92d 100644 --- a/build/azure-pipelines/exploration-build.yml +++ b/build/azure-pipelines/exploration-build.yml @@ -7,7 +7,7 @@ pr: none steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" diff --git a/build/azure-pipelines/linux/product-build-alpine.yml b/build/azure-pipelines/linux/product-build-alpine.yml index 4377887f58c..d2563b82f68 100644 --- a/build/azure-pipelines/linux/product-build-alpine.yml +++ b/build/azure-pipelines/linux/product-build-alpine.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" @@ -69,6 +69,7 @@ steps: set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages @@ -109,7 +110,7 @@ steps: - script: | set -e - docker run -e VSCODE_QUALITY -v $(pwd):/root/vscode -v ~/.netrc:/root/.netrc vscodehub.azurecr.io/vscode-linux-build-agent:alpine-$(VSCODE_ARCH) /root/vscode/build/azure-pipelines/linux/alpine/install-dependencies.sh + docker run -e VSCODE_QUALITY -v $(pwd):/root/vscode -v ~/.netrc:/root/.netrc vscodehub.azurecr.io/vscode-linux-build-agent:alpine-$(VSCODE_ARCH) /root/vscode/build/azure-pipelines/linux/scripts/install-remote-dependencies.sh displayName: Prebuild - script: | diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux-client.yml similarity index 68% rename from build/azure-pipelines/linux/product-build-linux.yml rename to build/azure-pipelines/linux/product-build-linux-client.yml index 59e16b58a21..d9d44f43783 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux-client.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" @@ -16,6 +16,13 @@ steps: path: $(Build.ArtifactStagingDirectory) displayName: Download compilation output + - task: DownloadPipelineArtifact@2 + inputs: + artifact: reh_node_modules-$(VSCODE_ARCH) + path: $(Build.ArtifactStagingDirectory) + displayName: Download server build dependencies + condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64')) + - script: | set -e tar -xzf $(Build.ArtifactStagingDirectory)/compilation.tar.gz @@ -60,6 +67,7 @@ steps: set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages @@ -79,26 +87,42 @@ steps: set -e export npm_config_arch=$(NPM_ARCH) - if [ -z "$CC" ] || [ -z "$CXX" ]; then - # Download clang based on chromium revision used by vscode - curl -s https://raw.githubusercontent.com/chromium/chromium/91.0.4472.164/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux - # Download libcxx headers and objects from upstream electron releases - DEBUG=libcxx-fetcher \ - VSCODE_LIBCXX_OBJECTS_DIR=$PWD/.build/libcxx-objects \ - VSCODE_LIBCXX_HEADERS_DIR=$PWD/.build/libcxx_headers \ - VSCODE_LIBCXXABI_HEADERS_DIR=$PWD/.build/libcxxabi_headers \ - VSCODE_ARCH="$(NPM_ARCH)" \ - node build/linux/libcxx-fetcher.js - # Set compiler toolchain - export CC=$PWD/.build/CR_Clang/bin/clang - export CXX=$PWD/.build/CR_Clang/bin/clang++ - export CXXFLAGS="-nostdinc++ -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -D__NO_INLINE__ -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit" - export LDFLAGS="-stdlib=libc++ -fuse-ld=lld -flto=thin -fsplit-lto-unit -L$PWD/.build/libcxx-objects -lc++abi" + # Download clang based on chromium revision used by vscode + curl -s https://raw.githubusercontent.com/chromium/chromium/96.0.4664.110/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux + # Download libcxx headers and objects from upstream electron releases + DEBUG=libcxx-fetcher \ + VSCODE_LIBCXX_OBJECTS_DIR=$PWD/.build/libcxx-objects \ + VSCODE_LIBCXX_HEADERS_DIR=$PWD/.build/libcxx_headers \ + VSCODE_LIBCXXABI_HEADERS_DIR=$PWD/.build/libcxxabi_headers \ + VSCODE_ARCH="$(NPM_ARCH)" \ + node build/linux/libcxx-fetcher.js + # Set compiler toolchain + # Flags for the client build are based on + # https://source.chromium.org/chromium/chromium/src/+/refs/tags/96.0.4664.110:build/config/arm.gni + # https://source.chromium.org/chromium/chromium/src/+/refs/tags/96.0.4664.110:build/config/compiler/BUILD.gn + # https://source.chromium.org/chromium/chromium/src/+/refs/tags/96.0.4664.110:build/config/c++/BUILD.gn + export CC=$PWD/.build/CR_Clang/bin/clang + export CXX=$PWD/.build/CR_Clang/bin/clang++ + export CXXFLAGS="-nostdinc++ -D__NO_INLINE__ -isystem$PWD/.build/libcxx_headers -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit" + export CFLAGS="-nostdinc++ -D__NO_INLINE__ -isystem$PWD/.build/libcxx_headers -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit" + export LDFLAGS="-stdlib=libc++ -fuse-ld=lld -flto=thin -fsplit-lto-unit -L$PWD/.build/libcxx-objects -lc++abi" + export VSCODE_REMOTE_CC=$(which gcc) + export VSCODE_REMOTE_CXX=$(which g++) + + if [ "$VSCODE_ARCH" == "arm64" ]; then + export CXXFLAGS="${CXXFLAGS} --target=aarch64-linux-gnu -fwhole-program-vtables" + export CFLAGS="${CFLAGS} --target=aarch64-linux-gnu -fwhole-program-vtables" + export LDFLAGS="${LDFLAGS} --target=aarch64-linux-gnu -march=arm64 -fwhole-program-vtables" + export VSCODE_REMOTE_CC=/usr/bin/aarch64-linux-gnu-gcc + export VSCODE_REMOTE_CXX=/usr/bin/aarch64-linux-gnu-g++ fi - if [ "$VSCODE_ARCH" == "x64" ]; then - export VSCODE_REMOTE_CC=$(which gcc-4.8) - export VSCODE_REMOTE_CXX=$(which g++-4.8) + if [ "$VSCODE_ARCH" == "armhf" ]; then + export CXXFLAGS="${CXXFLAGS} --target=arm-linux-gnueabihf -march=armv7-a -mthumb -mfloat-abi=hard -mfpu=neon -mtune=generic-armv7-a" + export CFLAGS="${CFLAGS} --target=arm-linux-gnueabihf -march=armv7-a -mthumb -mfloat-abi=hard -mfpu=neon -mtune=generic-armv7-a" + export LDFLAGS="${LDFLAGS} --target=arm-linux-gnueabihf -march=armv7-a" + export VSCODE_REMOTE_CC=/usr/bin/arm-linux-gnueabihf-gcc + export VSCODE_REMOTE_CXX=/usr/bin/arm-linux-gnueabihf-g++ fi for i in {1..3}; do # try 3 times, for Terrapin @@ -116,6 +140,13 @@ steps: displayName: Install dependencies condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true')) + - script: | + set -e + rm -rf remote/node_modules + tar -xzf $(Build.ArtifactStagingDirectory)/reh_node_modules-$(VSCODE_ARCH).tar.gz --directory $(Build.SourcesDirectory)/remote + displayName: Extract server node_modules output + condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64')) + - script: | set -e node build/azure-pipelines/common/listNodeModules.js .build/node_modules_list.txt @@ -170,21 +201,21 @@ steps: set -e ./scripts/test.sh --build --tfs "Unit Tests" displayName: Run unit tests (Electron) - timeoutInMinutes: 7 + timeoutInMinutes: 15 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e yarn test-node --build displayName: Run unit tests (node.js) - timeoutInMinutes: 7 + timeoutInMinutes: 15 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e - DEBUG=*browser* yarn test-browser --build --browser chromium --tfs "Browser Unit Tests" + DEBUG=*browser* yarn test-browser-no-install --build --browser chromium --tfs "Browser Unit Tests" displayName: Run unit tests (Browser, Chromium) - timeoutInMinutes: 7 + timeoutInMinutes: 15 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -199,15 +230,15 @@ steps: VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-$(VSCODE_ARCH)" \ ./scripts/test-integration.sh --build --tfs "Integration Tests" displayName: Run integration tests (Electron) - timeoutInMinutes: 10 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | set -e VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-linux-$(VSCODE_ARCH)" \ - ./resources/server/test/test-web-integration.sh --browser chromium + ./scripts/test-web-integration.sh --browser chromium displayName: Run integration tests (Browser, Chromium) - timeoutInMinutes: 10 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -217,9 +248,9 @@ steps: INTEGRATION_TEST_APP_NAME="$APP_NAME" \ INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-$(VSCODE_ARCH)" \ - ./resources/server/test/test-remote-integration.sh + ./scripts/test-remote-integration.sh displayName: Run integration tests (Remote) - timeoutInMinutes: 7 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) - script: | @@ -234,7 +265,8 @@ steps: set -e APP_PATH=$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH) yarn smoketest-no-compile --build "$APP_PATH" --electronArgs="--disable-dev-shm-usage --use-gl=swiftshader" - timeoutInMinutes: 10 + # Increased timeout because this test downloads stable code + timeoutInMinutes: 20 displayName: Run smoke tests (Electron) condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false')) @@ -255,6 +287,16 @@ steps: continueOnError: true condition: failed() + # In order to properly symbolify above crash reports + # (if any), we need the compiled native modules too + - task: PublishPipelineArtifact@0 + inputs: + artifactName: node-modules-linux-$(VSCODE_ARCH) + targetPath: node_modules + displayName: "Publish Node Modules" + continueOnError: true + condition: failed() + - task: PublishPipelineArtifact@0 inputs: artifactName: logs-linux-$(VSCODE_ARCH)-$(System.JobAttempt) @@ -336,3 +378,27 @@ steps: artifactName: "snap-$(VSCODE_ARCH)" targetPath: .build/linux/snap-tarball condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) + + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: Generate SBOM (client) + inputs: + BuildDropPath: $(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH) + PackageName: Visual Studio Code + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) + + - publish: $(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)/_manifest + displayName: Publish SBOM (client) + artifact: vscode_client_linux_$(VSCODE_ARCH)_sbom + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) + + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: Generate SBOM (server) + inputs: + BuildDropPath: $(agent.builddirectory)/vscode-server-linux-$(VSCODE_ARCH) + PackageName: Visual Studio Code Server + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) + + - publish: $(agent.builddirectory)/vscode-server-linux-$(VSCODE_ARCH)/_manifest + displayName: Publish SBOM (server) + artifact: vscode_server_linux_$(VSCODE_ARCH)_sbom + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) diff --git a/build/azure-pipelines/linux/product-build-linux-server.yml b/build/azure-pipelines/linux/product-build-linux-server.yml new file mode 100644 index 00000000000..af04c89f603 --- /dev/null +++ b/build/azure-pipelines/linux/product-build-linux-server.yml @@ -0,0 +1,62 @@ +steps: + - task: NodeTool@0 + inputs: + versionSpec: "16.x" + + - task: AzureKeyVault@1 + displayName: "Azure Key Vault: Get Secrets" + inputs: + azureSubscription: "vscode-builds-subscription" + KeyVaultName: vscode + SecretsFilter: "github-distro-mixin-password,ESRP-PKI,esrp-aad-username,esrp-aad-password" + + - script: | + set -e + cat << EOF > ~/.netrc + machine github.com + login vscode + password $(github-distro-mixin-password) + EOF + + git config user.email "vscode@microsoft.com" + git config user.name "VSCode" + displayName: Prepare tooling + + - script: | + set -e + git pull --no-rebase https://github.com/$(VSCODE_MIXIN_REPO).git $(node -p "require('./package.json').distro") + displayName: Merge distro + + - script: | + set -e + npx https://aka.ms/enablesecurefeed standAlone + timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 + condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) + displayName: Switch to Terrapin packages + + - script: | + set -e + export npm_config_arch=$(NPM_ARCH) + + for i in {1..3}; do # try 3 times, for Terrapin + yarn --cwd remote --frozen-lockfile && break + if [ $i -eq 3 ]; then + echo "Yarn failed too many times" >&2 + exit 1 + fi + echo "Yarn failed $i, trying again..." + done + displayName: Install dependencies + condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64')) + + - script: | + set -e + tar -cz --ignore-failed-read -f $(Build.ArtifactStagingDirectory)/reh_node_modules-$(VSCODE_ARCH).tar.gz -C $(Build.SourcesDirectory)/remote node_modules + displayName: Compress node_modules output + + - task: PublishPipelineArtifact@0 + displayName: "Publish remote node_modules" + inputs: + artifactName: "reh_node_modules-$(VSCODE_ARCH)" + targetPath: $(Build.ArtifactStagingDirectory)/reh_node_modules-$(VSCODE_ARCH).tar.gz diff --git a/build/azure-pipelines/linux/alpine/install-dependencies.sh b/build/azure-pipelines/linux/scripts/install-remote-dependencies.sh similarity index 100% rename from build/azure-pipelines/linux/alpine/install-dependencies.sh rename to build/azure-pipelines/linux/scripts/install-remote-dependencies.sh diff --git a/build/azure-pipelines/linux/snap-build-linux.yml b/build/azure-pipelines/linux/snap-build-linux.yml index 33a80b74391..12829334956 100644 --- a/build/azure-pipelines/linux/snap-build-linux.yml +++ b/build/azure-pipelines/linux/snap-build-linux.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: DownloadPipelineArtifact@0 displayName: "Download Pipeline Artifact" diff --git a/build/azure-pipelines/mixin.ts b/build/azure-pipelines/mixin.ts index 35a2d7ae0ec..ccd98d6e773 100644 --- a/build/azure-pipelines/mixin.ts +++ b/build/azure-pipelines/mixin.ts @@ -29,7 +29,7 @@ interface OSSProduct { } interface Product { - readonly builtInExtensions?: IBuiltInExtension[] | { 'include'?: IBuiltInExtension[], 'exclude'?: string[] }; + readonly builtInExtensions?: IBuiltInExtension[] | { 'include'?: IBuiltInExtension[]; 'exclude'?: string[] }; readonly webBuiltInExtensions?: IBuiltInExtension[]; } diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index d07a752e77e..94d44e0208e 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -122,7 +122,7 @@ variables: resources: containers: - - container: vscode-x64 + - container: vscode-bionic-x64 image: vscodehub.azurecr.io/vscode-linux-build-agent:bionic-x64 endpoint: VSCodeHub options: --user 0:0 --cap-add SYS_ADMIN @@ -134,6 +134,10 @@ resources: image: vscodehub.azurecr.io/vscode-linux-build-agent:stretch-armhf endpoint: VSCodeHub options: --user 0:0 --cap-add SYS_ADMIN + - container: centos7-devtoolset8-x64 + image: vscodehub.azurecr.io/vscode-linux-build-agent:centos7-devtoolset8-x64 + endpoint: VSCodeHub + options: --user 0:0 --cap-add SYS_ADMIN - container: snapcraft image: snapcore/snapcraft:stable @@ -141,7 +145,7 @@ stages: - stage: Compile jobs: - job: Compile - pool: vscode-1es + pool: vscode-1es-linux variables: VSCODE_ARCH: x64 steps: @@ -152,7 +156,7 @@ stages: dependsOn: - Compile pool: - vmImage: windows-latest + vmImage: windows-2019 jobs: - ${{ if eq(parameters.VSCODE_BUILD_WIN32, true) }}: - job: Windows @@ -178,27 +182,41 @@ stages: steps: - template: win32/product-build-win32.yml + - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), eq(variables['VSCODE_BUILD_STAGE_LINUX'], true)) }}: + - stage: LinuxServerDependencies + dependsOn: [] # run in parallel to compile stage + pool: vscode-1es-linux + jobs: + - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}: + - job: x64 + container: centos7-devtoolset8-x64 + variables: + VSCODE_ARCH: x64 + NPM_ARCH: x64 + steps: + - template: linux/product-build-linux-server.yml + - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), eq(variables['VSCODE_BUILD_STAGE_LINUX'], true)) }}: - stage: Linux dependsOn: - Compile - pool: - vmImage: "Ubuntu-18.04" + - LinuxServerDependencies + pool: vscode-1es-linux jobs: - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}: - - job: Linux - container: vscode-x64 + - job: Linuxx64 + container: vscode-bionic-x64 variables: VSCODE_ARCH: x64 NPM_ARCH: x64 DISPLAY: ":10" steps: - - template: linux/product-build-linux.yml + - template: linux/product-build-linux-client.yml - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX, true), ne(variables['VSCODE_PUBLISH'], 'false')) }}: - job: LinuxSnap dependsOn: - - Linux + - Linuxx64 container: snapcraft variables: VSCODE_ARCH: x64 @@ -212,7 +230,7 @@ stages: VSCODE_ARCH: armhf NPM_ARCH: armv7l steps: - - template: linux/product-build-linux.yml + - template: linux/product-build-linux-client.yml # TODO@joaomoreno: We don't ship ARM snaps for now - ${{ if and(false, eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true)) }}: @@ -232,7 +250,7 @@ stages: VSCODE_ARCH: arm64 NPM_ARCH: arm64 steps: - - template: linux/product-build-linux.yml + - template: linux/product-build-linux-client.yml # TODO@joaomoreno: We don't ship ARM snaps for now - ${{ if and(false, eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true)) }}: @@ -273,6 +291,8 @@ stages: - Compile pool: vmImage: macOS-latest + variables: + BUILDSECMON_OPT_IN: true jobs: - ${{ if eq(parameters.VSCODE_BUILD_MACOS, true) }}: - job: macOS @@ -332,8 +352,7 @@ stages: - stage: Publish dependsOn: - Compile - pool: - vmImage: "Ubuntu-18.04" + pool: vscode-1es-linux variables: - name: BUILDS_API_URL value: $(System.CollectionUri)$(System.TeamProject)/_apis/build/builds/$(Build.BuildId)/ @@ -348,8 +367,7 @@ stages: - stage: Release dependsOn: - Publish - pool: - vmImage: "Ubuntu-18.04" + pool: vscode-1es-linux jobs: - job: ReleaseBuild displayName: Release Build diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml index addb2995b12..b3cec3a3ab1 100644 --- a/build/azure-pipelines/product-compile.yml +++ b/build/azure-pipelines/product-compile.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" @@ -50,6 +50,7 @@ steps: set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages diff --git a/build/azure-pipelines/product-publish.ps1 b/build/azure-pipelines/product-publish.ps1 index 339002ab0c1..17b02f6aff5 100644 --- a/build/azure-pipelines/product-publish.ps1 +++ b/build/azure-pipelines/product-publish.ps1 @@ -15,7 +15,7 @@ function Get-PipelineArtifact { return } - $res.value | Where-Object { $_.name -Like $Name } + $res.value | Where-Object { $_.name -Like $Name -and $_.name -NotLike "*sbom" } } catch { Write-Warning $_ } diff --git a/build/azure-pipelines/product-release.yml b/build/azure-pipelines/product-release.yml index fa6396b1486..a1086945595 100644 --- a/build/azure-pipelines/product-release.yml +++ b/build/azure-pipelines/product-release.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureCLI@2 inputs: diff --git a/build/azure-pipelines/publish-types/publish-types.yml b/build/azure-pipelines/publish-types/publish-types.yml index 043bb5141ba..031fafd4c75 100644 --- a/build/azure-pipelines/publish-types/publish-types.yml +++ b/build/azure-pipelines/publish-types/publish-types.yml @@ -12,7 +12,7 @@ pool: steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - bash: | TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`) diff --git a/build/azure-pipelines/sdl-scan.yml b/build/azure-pipelines/sdl-scan.yml index bf07555f674..c935a23afd5 100644 --- a/build/azure-pipelines/sdl-scan.yml +++ b/build/azure-pipelines/sdl-scan.yml @@ -47,7 +47,7 @@ stages: outputFormat: "pre" - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" @@ -76,6 +76,7 @@ stages: $ErrorActionPreference = "Stop" exec { npx https://aka.ms/enablesecurefeed standAlone } timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 condition: and(succeeded(), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages @@ -138,7 +139,7 @@ stages: toolMajorVersion: "V2" - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" @@ -168,6 +169,7 @@ stages: set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages @@ -189,7 +191,7 @@ stages: if [ -z "$CC" ] || [ -z "$CXX" ]; then # Download clang based on chromium revision used by vscode - curl -s https://raw.githubusercontent.com/chromium/chromium/91.0.4472.164/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux + curl -s https://raw.githubusercontent.com/chromium/chromium/96.0.4664.110/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux # Download libcxx headers and objects from upstream electron releases DEBUG=libcxx-fetcher \ VSCODE_LIBCXX_OBJECTS_DIR=$PWD/.build/libcxx-objects \ @@ -200,13 +202,13 @@ stages: # Set compiler toolchain export CC=$PWD/.build/CR_Clang/bin/clang export CXX=$PWD/.build/CR_Clang/bin/clang++ - export CXXFLAGS="-nostdinc++ -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit" + export CXXFLAGS="-nostdinc++ -D__NO_INLINE__ -isystem$PWD/.build/libcxx_headers -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit" export LDFLAGS="-stdlib=libc++ -fuse-ld=lld -flto=thin -fsplit-lto-unit -L$PWD/.build/libcxx-objects -lc++abi" fi if [ "$VSCODE_ARCH" == "x64" ]; then - export VSCODE_REMOTE_CC=$(which gcc-4.8) - export VSCODE_REMOTE_CXX=$(which g++-4.8) + export VSCODE_REMOTE_CC=$(which gcc-4.9) + export VSCODE_REMOTE_CXX=$(which g++-4.9) fi for i in {1..3}; do # try 3 times, for Terrapin diff --git a/build/azure-pipelines/upload-nlsmetadata.js b/build/azure-pipelines/upload-nlsmetadata.js index a09d569f7f6..af7ad62e9ff 100644 --- a/build/azure-pipelines/upload-nlsmetadata.js +++ b/build/azure-pipelines/upload-nlsmetadata.js @@ -47,7 +47,7 @@ function main() { case 'nls.metadata.header.json': parsedJson = { header: parsedJson }; break; - case 'nls.metadata.json': + case 'nls.metadata.json': { // put nls.metadata.json content in Core NlsMetadata format const modules = Object.keys(parsedJson); const json = { @@ -64,6 +64,7 @@ function main() { } parsedJson = json; break; + } } key = 'vscode.' + file.relative.split('/')[0]; return { [key]: parsedJson }; diff --git a/build/azure-pipelines/upload-nlsmetadata.ts b/build/azure-pipelines/upload-nlsmetadata.ts index b3a19b218e3..82f2349f9f9 100644 --- a/build/azure-pipelines/upload-nlsmetadata.ts +++ b/build/azure-pipelines/upload-nlsmetadata.ts @@ -20,9 +20,9 @@ const commit = util.getVersion(root); const credential = new ClientSecretCredential(process.env['AZURE_TENANT_ID']!, process.env['AZURE_CLIENT_ID']!, process.env['AZURE_CLIENT_SECRET']!); interface NlsMetadata { - keys: { [module: string]: string }, - messages: { [module: string]: string }, - bundles: { [bundle: string]: string[] }, + keys: { [module: string]: string }; + messages: { [module: string]: string }; + bundles: { [bundle: string]: string[] }; } function main(): Promise { @@ -65,7 +65,7 @@ function main(): Promise { parsedJson = { header: parsedJson }; break; - case 'nls.metadata.json': + case 'nls.metadata.json': { // put nls.metadata.json content in Core NlsMetadata format const modules = Object.keys(parsedJson); @@ -83,6 +83,7 @@ function main(): Promise { } parsedJson = json; break; + } } key = 'vscode.' + file.relative.split('/')[0]; return { [key]: parsedJson }; diff --git a/build/azure-pipelines/upload-sourcemaps.ts b/build/azure-pipelines/upload-sourcemaps.ts index f065ff2cf38..ed092c0df1c 100644 --- a/build/azure-pipelines/upload-sourcemaps.ts +++ b/build/azure-pipelines/upload-sourcemaps.ts @@ -38,7 +38,7 @@ function main(): Promise { const vs = src('out-vscode-min'); // client source-maps only sources.push(vs); - const productionDependencies: { name: string, path: string, version: string }[] = deps.getProductionDependencies(root); + const productionDependencies: { name: string; path: string; version: string }[] = deps.getProductionDependencies(root); const productionDependenciesSrc = productionDependencies.map(d => path.relative(root, d.path)).map(d => `./${d}/**/*.map`); const nodeModules = vfs.src(productionDependenciesSrc, { base: '.' }) .pipe(util.cleanNodeModules(path.join(root, 'build', '.moduleignore'))); diff --git a/build/azure-pipelines/web/product-build-web.yml b/build/azure-pipelines/web/product-build-web.yml index cadda5eaf64..a33530fd4a5 100644 --- a/build/azure-pipelines/web/product-build-web.yml +++ b/build/azure-pipelines/web/product-build-web.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: AzureKeyVault@1 displayName: "Azure Key Vault: Get Secrets" @@ -60,6 +60,7 @@ steps: set -e npx https://aka.ms/enablesecurefeed standAlone timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages @@ -119,7 +120,7 @@ steps: node build/azure-pipelines/upload-cdn displayName: Upload to CDN - # upload only the workbench.web.api.js source maps because + # upload only the workbench.web.main.js source maps because # we just compiled these bits in the previous step and the # general task to upload source maps has already been run - script: | @@ -128,7 +129,7 @@ steps: AZURE_TENANT_ID="$(AZURE_TENANT_ID)" \ AZURE_CLIENT_ID="$(AZURE_CLIENT_ID)" \ AZURE_CLIENT_SECRET="$(AZURE_CLIENT_SECRET)" \ - node build/azure-pipelines/upload-sourcemaps out-vscode-web-min out-vscode-web-min/vs/workbench/workbench.web.api.js.map + node build/azure-pipelines/upload-sourcemaps out-vscode-web-min out-vscode-web-min/vs/workbench/workbench.web.main.js.map displayName: Upload sourcemaps (Web) - script: | diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index ab9bae6050a..bc8cb32cdd8 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "14.x" + versionSpec: "16.x" - task: UsePythonVersion@0 inputs: @@ -67,6 +67,7 @@ steps: $ErrorActionPreference = "Stop" exec { npx https://aka.ms/enablesecurefeed standAlone } timeoutInMinutes: 5 + retryCountOnTaskFailure: 3 condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), eq(variables['ENABLE_TERRAPIN'], 'true')) displayName: Switch to Terrapin packages @@ -153,7 +154,7 @@ steps: exec { yarn electron $(VSCODE_ARCH) } exec { .\scripts\test.bat --build --tfs "Unit Tests" } displayName: Run unit tests (Electron) - timeoutInMinutes: 7 + timeoutInMinutes: 15 condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) - powershell: | @@ -161,13 +162,13 @@ steps: $ErrorActionPreference = "Stop" exec { yarn test-node --build } displayName: Run unit tests (node.js) - timeoutInMinutes: 7 + timeoutInMinutes: 15 condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" - exec { yarn test-browser --sequential --build --browser chromium --browser firefox --tfs "Browser Unit Tests" } + exec { yarn test-browser-no-install --sequential --build --browser chromium --browser firefox --tfs "Browser Unit Tests" } displayName: Run unit tests (Browser, Chromium & Firefox) timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) @@ -183,15 +184,15 @@ steps: $AppNameShort = $AppProductJson.nameShort exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\scripts\test-integration.bat --build --tfs "Integration Tests" } displayName: Run integration tests (Electron) - timeoutInMinutes: 10 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" - exec { $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-web-win32-$(VSCODE_ARCH)"; .\resources\server\test\test-web-integration.bat --browser firefox } + exec { $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-web-win32-$(VSCODE_ARCH)"; .\scripts\test-web-integration.bat --browser firefox } displayName: Run integration tests (Browser, Firefox) - timeoutInMinutes: 10 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) - powershell: | @@ -200,9 +201,9 @@ steps: $AppRoot = "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" $AppProductJson = Get-Content -Raw -Path "$AppRoot\resources\app\product.json" | ConvertFrom-Json $AppNameShort = $AppProductJson.nameShort - exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\resources\server\test\test-remote-integration.bat } + exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\scripts\test-remote-integration.bat } displayName: Run integration tests (Remote) - timeoutInMinutes: 7 + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) - powershell: | @@ -220,7 +221,8 @@ steps: $AppRoot = "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" exec { yarn smoketest-no-compile --build "$AppRoot" } displayName: Run smoke tests (Electron) - timeoutInMinutes: 10 + # Increased timeout because this test downloads stable code + timeoutInMinutes: 20 condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) - powershell: | @@ -248,6 +250,16 @@ steps: continueOnError: true condition: failed() + # In order to properly symbolify above crash reports + # (if any), we need the compiled native modules too + - task: PublishPipelineArtifact@0 + inputs: + artifactName: node-modules-windows-$(VSCODE_ARCH) + targetPath: node_modules + displayName: "Publish Node Modules" + continueOnError: true + condition: failed() + - task: PublishPipelineArtifact@0 inputs: artifactName: logs-windows-$(VSCODE_ARCH)-$(System.JobAttempt) @@ -340,3 +352,27 @@ steps: artifact: vscode_web_win32_$(VSCODE_ARCH)_archive displayName: Publish web server archive condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) + + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: Generate SBOM (client) + inputs: + BuildDropPath: $(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH) + PackageName: Visual Studio Code + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) + + - publish: $(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)/_manifest + displayName: Publish SBOM (client) + artifact: vscode_client_win32_$(VSCODE_ARCH)_sbom + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false')) + + - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 + displayName: Generate SBOM (server) + inputs: + BuildDropPath: $(agent.builddirectory)/vscode-server-win32-$(VSCODE_ARCH) + PackageName: Visual Studio Code Server + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) + + - publish: $(agent.builddirectory)/vscode-server-win32-$(VSCODE_ARCH)/_manifest + displayName: Publish SBOM (server) + artifact: vscode_server_win32_$(VSCODE_ARCH)_sbom + condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64')) diff --git a/build/darwin/create-universal-app.js b/build/darwin/create-universal-app.js index 0690fba9957..1206a8e4c22 100644 --- a/build/darwin/create-universal-app.js +++ b/build/darwin/create-universal-app.js @@ -8,7 +8,6 @@ const vscode_universal_bundler_1 = require("vscode-universal-bundler"); const cross_spawn_promise_1 = require("@malept/cross-spawn-promise"); const fs = require("fs-extra"); const path = require("path"); -const plist = require("plist"); const product = require("../../product.json"); async function main() { const buildDir = process.env['AGENT_BUILDDIRECTORY']; @@ -23,7 +22,6 @@ async function main() { const arm64AsarPath = path.join(arm64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar'); const outAppPath = path.join(buildDir, `VSCode-darwin-${arch}`, appName); const productJsonPath = path.resolve(outAppPath, 'Contents', 'Resources', 'app', 'product.json'); - const infoPlistPath = path.resolve(outAppPath, 'Contents', 'Info.plist'); await (0, vscode_universal_bundler_1.makeUniversalApp)({ x64AppPath, arm64AppPath, @@ -45,16 +43,10 @@ async function main() { darwinUniversalAssetId: 'darwin-universal' }); await fs.writeJson(productJsonPath, productJson); - let infoPlistString = await fs.readFile(infoPlistPath, 'utf8'); - let infoPlistJson = plist.parse(infoPlistString); - Object.assign(infoPlistJson, { - LSRequiresNativeExecution: true - }); - await fs.writeFile(infoPlistPath, plist.build(infoPlistJson), 'utf8'); // Verify if native module architecture is correct const findOutput = await (0, cross_spawn_promise_1.spawn)('find', [outAppPath, '-name', 'keytar.node']); - const lipoOutput = await (0, cross_spawn_promise_1.spawn)('lipo', ['-archs', findOutput.replace(/\n$/, "")]); - if (lipoOutput.replace(/\n$/, "") !== 'x86_64 arm64') { + const lipoOutput = await (0, cross_spawn_promise_1.spawn)('lipo', ['-archs', findOutput.replace(/\n$/, '')]); + if (lipoOutput.replace(/\n$/, '') !== 'x86_64 arm64') { throw new Error(`Invalid arch, got : ${lipoOutput}`); } } diff --git a/build/darwin/create-universal-app.ts b/build/darwin/create-universal-app.ts index ed042c56d82..332e81dbb2c 100644 --- a/build/darwin/create-universal-app.ts +++ b/build/darwin/create-universal-app.ts @@ -9,7 +9,6 @@ import { makeUniversalApp } from 'vscode-universal-bundler'; import { spawn } from '@malept/cross-spawn-promise'; import * as fs from 'fs-extra'; import * as path from 'path'; -import * as plist from 'plist'; import * as product from '../../product.json'; async function main() { @@ -27,7 +26,6 @@ async function main() { const arm64AsarPath = path.join(arm64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar'); const outAppPath = path.join(buildDir, `VSCode-darwin-${arch}`, appName); const productJsonPath = path.resolve(outAppPath, 'Contents', 'Resources', 'app', 'product.json'); - const infoPlistPath = path.resolve(outAppPath, 'Contents', 'Info.plist'); await makeUniversalApp({ x64AppPath, @@ -52,18 +50,11 @@ async function main() { }); await fs.writeJson(productJsonPath, productJson); - let infoPlistString = await fs.readFile(infoPlistPath, 'utf8'); - let infoPlistJson = plist.parse(infoPlistString); - Object.assign(infoPlistJson, { - LSRequiresNativeExecution: true - }); - await fs.writeFile(infoPlistPath, plist.build(infoPlistJson), 'utf8'); - // Verify if native module architecture is correct - const findOutput = await spawn('find', [outAppPath, '-name', 'keytar.node']) - const lipoOutput = await spawn('lipo', ['-archs', findOutput.replace(/\n$/, "")]); - if (lipoOutput.replace(/\n$/, "") !== 'x86_64 arm64') { - throw new Error(`Invalid arch, got : ${lipoOutput}`) + const findOutput = await spawn('find', [outAppPath, '-name', 'keytar.node']); + const lipoOutput = await spawn('lipo', ['-archs', findOutput.replace(/\n$/, '')]); + if (lipoOutput.replace(/\n$/, '') !== 'x86_64 arm64') { + throw new Error(`Invalid arch, got : ${lipoOutput}`); } } diff --git a/build/eslint.js b/build/eslint.js index 3e3fdf19678..c04f4ef7756 100644 --- a/build/eslint.js +++ b/build/eslint.js @@ -5,12 +5,12 @@ const es = require('event-stream'); const vfs = require('vinyl-fs'); -const { jsHygieneFilter, tsHygieneFilter } = require('./filters'); +const { eslintFilter } = require('./filters'); function eslint() { const gulpeslint = require('gulp-eslint'); return vfs - .src([...jsHygieneFilter, ...tsHygieneFilter], { base: '.', follow: true, allowEmpty: true }) + .src(eslintFilter, { base: '.', follow: true, allowEmpty: true }) .pipe( gulpeslint({ configFile: '.eslintrc.json', diff --git a/build/filters.js b/build/filters.js index 7055e4d83b2..d0aa87355c3 100644 --- a/build/filters.js +++ b/build/filters.js @@ -12,6 +12,9 @@ * all ⊃ eol ⊇ indentation ⊃ copyright ⊃ typescript */ +const { readFileSync } = require('fs'); +const { join } = require('path'); + module.exports.all = [ '*', 'build/**/*', @@ -40,6 +43,7 @@ module.exports.unicodeFilter = [ '!build/win32/**', '!extensions/markdown-language-features/notebook-out/*.js', '!extensions/markdown-math/notebook-out/**', + '!extensions/notebook-renderers/renderer-out/**', '!extensions/php-language-features/src/features/phpGlobalFunctions.ts', '!extensions/typescript-language-features/test-workspace/**', '!extensions/vscode-api-tests/testWorkspace/**', @@ -147,7 +151,6 @@ module.exports.copyrightFilter = [ '!build/linux/libcxx-fetcher.*', '!resources/linux/snap/snapcraft.yaml', '!resources/win32/bin/code.js', - '!resources/web/code-web.js', '!resources/completions/**', '!extensions/configuration-editing/build/inline-allOf.ts', '!extensions/markdown-language-features/media/highlight.css', @@ -157,21 +160,7 @@ module.exports.copyrightFilter = [ '!src/vs/editor/test/node/classification/typescript-test.ts', ]; -module.exports.jsHygieneFilter = [ - 'src/**/*.js', - 'build/gulpfile.*.js', - '!src/vs/loader.js', - '!src/vs/css.js', - '!src/vs/nls.js', - '!src/vs/css.build.js', - '!src/vs/nls.build.js', - '!src/**/dompurify.js', - '!src/**/marked.js', - '!src/**/semver.js', - '!**/test/**', -]; - -module.exports.tsHygieneFilter = [ +module.exports.tsFormattingFilter = [ 'src/**/*.ts', 'test/**/*.ts', 'extensions/**/*.ts', @@ -187,3 +176,13 @@ module.exports.tsHygieneFilter = [ '!extensions/**/*.test.ts', '!extensions/html-language-features/server/lib/jquery.d.ts', ]; + +module.exports.eslintFilter = [ + '**/*.js', + '**/*.ts', + ...readFileSync(join(__dirname, '../.eslintignore')) + .toString().split(/\r\n|\n/) + .filter(line => !line.startsWith('#')) + .filter(line => !!line) + .map(line => `!${line}`) +]; diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index 39b26b2f646..c8308a0d190 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -197,6 +197,44 @@ const compileEditorESMTask = task.define('compile-editor-esm', () => { } }); +/** + * Go over all .js files in `/out-monaco-editor-core/esm/` and make sure that all imports + * use `.js` at the end in order to be ESM compliant. + */ +const appendJSToESMImportsTask = task.define('append-js-to-esm-imports', () => { + const SRC_DIR = path.join(__dirname, '../out-monaco-editor-core/esm'); + const files = util.rreddir(SRC_DIR); + for (const file of files) { + const filePath = path.join(SRC_DIR, file); + if (!/\.js$/.test(filePath)) { + continue; + } + + const contents = fs.readFileSync(filePath).toString(); + const lines = contents.split(/\r\n|\r|\n/g); + const /** @type {string[]} */result = []; + for (const line of lines) { + if (!/^import/.test(line) && !/^export \* from/.test(line)) { + // not an import + result.push(line); + continue; + } + if (/^import '[^']+\.css';/.test(line)) { + // CSS import + result.push(line); + continue; + } + let modifiedLine = ( + line + .replace(/^import(.*)\'([^']+)\'/, `import$1'$2.js'`) + .replace(/^export \* from \'([^']+)\'/, `export * from '$1.js'`) + ); + result.push(modifiedLine); + } + fs.writeFileSync(filePath, result.join('\n')); + } +}); + function toExternalDTS(contents) { let lines = contents.split(/\r\n|\r|\n/); let killNextCloseCurlyBrace = false; @@ -362,7 +400,8 @@ gulp.task('editor-distro', ), task.series( createESMSourcesAndResourcesTask, - compileEditorESMTask + compileEditorESMTask, + appendJSToESMImportsTask ) ), finalEditorResourcesTask @@ -411,6 +450,7 @@ gulp.task('editor-esm-bundle', extractEditorSrcTask, createESMSourcesAndResourcesTask, compileEditorESMTask, + appendJSToESMImportsTask, bundleEditorESMTask, ) ); diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 8629fef8edc..16a2ed70384 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -63,16 +63,13 @@ const serverResources = [ 'out-build/vs/base/common/performance.js', // main entry points - 'out-build/vs/server/cli.js', - 'out-build/vs/server/main.js', + 'out-build/server-cli.js', + 'out-build/server-main.js', // Watcher 'out-build/vs/platform/files/**/*.exe', 'out-build/vs/platform/files/**/*.md', - // Uri transformer - 'out-build/vs/server/uriTransformer.js', - // Process monitor 'out-build/vs/base/node/cpuUsage.sh', 'out-build/vs/base/node/ps.sh', @@ -91,15 +88,15 @@ const serverWithWebResources = [ const serverEntryPoints = [ { - name: 'vs/server/remoteExtensionHostAgent', + name: 'vs/server/node/server.main', exclude: ['vs/css', 'vs/nls'] }, { - name: 'vs/server/remoteCli', + name: 'vs/server/node/server.cli', exclude: ['vs/css', 'vs/nls'] }, { - name: 'vs/server/remoteExtensionHostProcess', + name: 'vs/workbench/api/node/extensionHostProcess', exclude: ['vs/css', 'vs/nls'] }, { @@ -329,19 +326,32 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa .pipe(replace('@@APPNAME@@', product.applicationName)) .pipe(rename(`bin/helpers/browser.sh`)) .pipe(util.setExecutableBit()), - gulp.src('resources/server/bin/server-old.sh', { base: '.' }) - .pipe(rename(`server.sh`)) - .pipe(util.setExecutableBit()), - gulp.src('resources/server/bin/code-server.sh', { base: '.' }) + gulp.src(`resources/server/bin/${platform === 'darwin' ? 'code-server-darwin.sh' : 'code-server-linux.sh'}`, { base: '.' }) .pipe(rename(`bin/${product.serverApplicationName}`)) .pipe(util.setExecutableBit()) ); + if (type !== 'reh-web') { + result = es.merge(result, + gulp.src('resources/server/bin/server-old.sh', { base: '.' }) + .pipe(rename(`server.sh`)) + .pipe(util.setExecutableBit()), + ); + } } return result.pipe(vfs.dest(destination)); }; } +/** + * @param {object} product The parsed product.json file contents + */ +function tweakProductForServerWeb(product) { + const result = { ...product }; + delete result.webEndpointUrlTemplate; + return result; +} + ['reh', 'reh-web'].forEach(type => { const optimizeTask = task.define(`optimize-vscode-${type}`, task.series( util.rimraf(`out-vscode-${type}`), @@ -354,7 +364,7 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa out: `out-vscode-${type}`, inlineAmdImages: true, bundleInfo: undefined, - fileContentMapper: createVSCodeWebFileContentMapper('.build/extensions') + fileContentMapper: createVSCodeWebFileContentMapper('.build/extensions', type === 'reh-web' ? tweakProductForServerWeb(product) : product) }) )); diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 1a9ebb39097..bed34472f43 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -60,6 +60,7 @@ const vscodeResources = [ '!out-build/vs/code/browser/**/*.html', '!out-build/vs/editor/standalone/**/*.svg', 'out-build/vs/base/common/performance.js', + 'out-build/vs/base/common/stripComments.js', 'out-build/vs/base/node/languagePacks.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}', 'out-build/vs/base/browser/ui/codicons/codicon/**', @@ -164,7 +165,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op 'vs/base/parts/sandbox/electron-browser/preload.js', 'vs/workbench/workbench.desktop.main.js', 'vs/workbench/workbench.desktop.main.css', - 'vs/workbench/services/extensions/node/extensionHostProcess.js', + 'vs/workbench/api/node/extensionHostProcess.js', 'vs/code/electron-browser/workbench/workbench.html', 'vs/code/electron-browser/workbench/workbench.js' ]); @@ -323,7 +324,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op .pipe(replace('@@VERSION@@', version)) .pipe(replace('@@COMMIT@@', commit)) .pipe(replace('@@APPNAME@@', product.applicationName)) - .pipe(replace('@@DATAFOLDER@@', product.dataFolderName)) + .pipe(replace('@@SERVERDATAFOLDER@@', product.serverDataFolderName || '.vscode-remote')) .pipe(replace('@@QUALITY@@', quality)) .pipe(rename(function (f) { f.basename = product.applicationName; f.extname = ''; }))); @@ -336,15 +337,6 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op .pipe(rename('bin/' + product.applicationName))); } - // submit all stats that have been collected - // during the build phase - if (opts.stats) { - result.on('end', () => { - const { submitAllStats } = require('./lib/stats'); - submitAllStats(product, commit).then(() => console.log('Submitted bundle stats!')); - }); - } - return result.pipe(vfs.dest(destination)); }; } diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index 8b22be3d203..90def803846 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -17,7 +17,7 @@ const filter = require('gulp-filter'); const _ = require('underscore'); const { getProductionDependencies } = require('./lib/dependencies'); const vfs = require('vinyl-fs'); -const fs = require('fs'); +const replace = require('gulp-replace'); const packageJson = require('../package.json'); const { compileBuildTask } = require('./gulpfile.compile'); const extensions = require('./lib/extensions'); @@ -64,7 +64,7 @@ const vscodeWebResources = [ const buildfile = require('../src/buildfile'); const vscodeWebEntryPoints = _.flatten([ - buildfile.entrypoint('vs/workbench/workbench.web.api'), + buildfile.entrypoint('vs/workbench/workbench.web.main'), buildfile.base, buildfile.workerExtensionHost, buildfile.workerNotebook, @@ -78,9 +78,9 @@ exports.vscodeWebEntryPoints = vscodeWebEntryPoints; const buildDate = new Date().toISOString(); /** - * @param extensionsRoot {string} The location where extension will be read from + * @param {object} product The parsed product.json file contents */ -const createVSCodeWebFileContentMapper = (extensionsRoot) => { +const createVSCodeWebProductConfigurationPatcher = (product) => { /** * @param content {string} The contens of the file * @param path {string} The absolute file path, always using `/`, even on Windows @@ -98,10 +98,23 @@ const createVSCodeWebFileContentMapper = (extensionsRoot) => { return content.replace('/*BUILD->INSERT_PRODUCT_CONFIGURATION*/', productConfiguration.substr(1, productConfiguration.length - 2) /* without { and }*/); } + return content; + }; + return result; +}; + +/** + * @param extensionsRoot {string} The location where extension will be read from + */ +const createVSCodeWebBuiltinExtensionsPatcher = (extensionsRoot) => { + /** + * @param content {string} The contens of the file + * @param path {string} The absolute file path, always using `/`, even on Windows + */ + const result = (content, path) => { // (2) Patch builtin extensions if (path.endsWith('vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.js')) { - // Do not inline `vscode-web-playground` even if it has been packed! - const builtinExtensions = JSON.stringify(extensions.scanBuiltinExtensions(extensionsRoot, ['vscode-web-playground'])); + const builtinExtensions = JSON.stringify(extensions.scanBuiltinExtensions(extensionsRoot)); return content.replace('/*BUILD->INSERT_BUILTIN_EXTENSIONS*/', builtinExtensions.substr(1, builtinExtensions.length - 2) /* without [ and ]*/); } @@ -109,6 +122,34 @@ const createVSCodeWebFileContentMapper = (extensionsRoot) => { }; return result; }; + +/** + * @param patchers {((content:string, path: string)=>string)[]} + */ +const combineContentPatchers = (...patchers) => { + /** + * @param content {string} The contens of the file + * @param path {string} The absolute file path, always using `/`, even on Windows + */ + const result = (content, path) => { + for (const patcher of patchers) { + content = patcher(content, path); + } + return content; + }; + return result; +}; + +/** + * @param extensionsRoot {string} The location where extension will be read from + * @param {object} product The parsed product.json file contents + */ +const createVSCodeWebFileContentMapper = (extensionsRoot, product) => { + return combineContentPatchers( + createVSCodeWebProductConfigurationPatcher(product), + createVSCodeWebBuiltinExtensionsPatcher(extensionsRoot) + ); +}; exports.createVSCodeWebFileContentMapper = createVSCodeWebFileContentMapper; const optimizeVSCodeWebTask = task.define('optimize-vscode-web', task.series( @@ -123,7 +164,7 @@ const optimizeVSCodeWebTask = task.define('optimize-vscode-web', task.series( out: 'out-vscode-web', inlineAmdImages: true, bundleInfo: undefined, - fileContentMapper: createVSCodeWebFileContentMapper('.build/web/extensions') + fileContentMapper: createVSCodeWebFileContentMapper('.build/web/extensions', product) }) )); @@ -168,6 +209,13 @@ function packageTask(sourceFolderName, destinationFolderName) { gulp.src('resources/server/code-512.png', { base: 'resources/server' }) ); + // TODO@bpasero remove me in Feb + const legacyMain = es.merge( + gulp.src(sourceFolderName + '/vs/workbench/workbench.web.main.js').pipe(rename('out/vs/workbench/workbench.web.api.js')).pipe(replace('workbench.web.main', 'workbench.web.api')), + gulp.src(sourceFolderName + '/vs/workbench/workbench.web.main.css').pipe(rename('out/vs/workbench/workbench.web.api.css')), + gulp.src(sourceFolderName + '/vs/workbench/workbench.web.main.nls.js').pipe(rename('out/vs/workbench/workbench.web.api.nls.js')).pipe(replace('workbench.web.main', 'workbench.web.api')) + ); + let all = es.merge( packageJsonStream, license, @@ -175,7 +223,8 @@ function packageTask(sourceFolderName, destinationFolderName) { deps, favicon, manifest, - pwaicons + pwaicons, + legacyMain ); let result = all diff --git a/build/hygiene.js b/build/hygiene.js index 611b64a54f8..a5d2b080172 100644 --- a/build/hygiene.js +++ b/build/hygiene.js @@ -10,7 +10,7 @@ const vfs = require('vinyl-fs'); const path = require('path'); const fs = require('fs'); const pall = require('p-all'); -const { all, copyrightFilter, unicodeFilter, indentationFilter, jsHygieneFilter, tsHygieneFilter } = require('./filters'); +const { all, copyrightFilter, unicodeFilter, indentationFilter, tsFormattingFilter, eslintFilter } = require('./filters'); const copyrightHeaderLines = [ '/*---------------------------------------------------------------------------------------------', @@ -59,6 +59,8 @@ function hygiene(some, linting = true) { errorCount++; } }); + + this.emit('data', file); }); const indentation = es.through(function (file) { @@ -162,13 +164,13 @@ function hygiene(some, linting = true) { .pipe(copyrights); const streams = [ - result.pipe(filter(tsHygieneFilter)).pipe(formatting) + result.pipe(filter(tsFormattingFilter)).pipe(formatting) ]; if (linting) { streams.push( result - .pipe(filter([...jsHygieneFilter, ...tsHygieneFilter])) + .pipe(filter(eslintFilter)) .pipe( gulpeslint({ configFile: '.eslintrc.json', diff --git a/build/lib/asar.ts b/build/lib/asar.ts index 5cdbe4f4681..18ab7b01946 100644 --- a/build/lib/asar.ts +++ b/build/lib/asar.ts @@ -16,7 +16,7 @@ declare class AsarFilesystem { readonly header: unknown; constructor(src: string); insertDirectory(path: string, shouldUnpack?: boolean): unknown; - insertFile(path: string, shouldUnpack: boolean, file: { stat: { size: number; mode: number; }; }, options: {}): Promise; + insertFile(path: string, shouldUnpack: boolean, file: { stat: { size: number; mode: number } }, options: {}): Promise; } export function createAsar(folderPath: string, unpackGlobs: string[], destFilename: string): NodeJS.ReadWriteStream { @@ -38,7 +38,7 @@ export function createAsar(folderPath: string, unpackGlobs: string[], destFilena let onFileInserted = () => { pendingInserts--; }; // Do not insert twice the same directory - const seenDir: { [key: string]: boolean; } = {}; + const seenDir: { [key: string]: boolean } = {}; const insertDirectoryRecursive = (dir: string) => { if (seenDir[dir]) { return; @@ -65,7 +65,7 @@ export function createAsar(folderPath: string, unpackGlobs: string[], destFilena } }; - const insertFile = (relativePath: string, stat: { size: number; mode: number; }, shouldUnpack: boolean) => { + const insertFile = (relativePath: string, stat: { size: number; mode: number }, shouldUnpack: boolean) => { insertDirectoryForFile(relativePath); pendingInserts++; // Do not pass `onFileInserted` directly because it gets overwritten below. diff --git a/build/lib/builtInExtensions.ts b/build/lib/builtInExtensions.ts index 2c1cb3abba2..b41477161c9 100644 --- a/build/lib/builtInExtensions.ts +++ b/build/lib/builtInExtensions.ts @@ -31,7 +31,7 @@ export interface IExtensionDefinition { flags: string; }; publisherDisplayName: string; - } + }; } const root = path.dirname(path.dirname(__dirname)); diff --git a/build/lib/builtInExtensionsCG.ts b/build/lib/builtInExtensionsCG.ts index 2b758da5c91..09b0bedd126 100644 --- a/build/lib/builtInExtensionsCG.ts +++ b/build/lib/builtInExtensionsCG.ts @@ -27,7 +27,7 @@ async function downloadExtensionDetails(extension: IExtensionDefinition): Promis const promises = []; for (const fileName of contentFileNames) { - promises.push(new Promise<{ fileName: string, body: Buffer | undefined | null }>(resolve => { + promises.push(new Promise<{ fileName: string; body: Buffer | undefined | null }>(resolve => { got(`${repositoryContentBaseUrl}/${fileName}`) .then(response => { resolve({ fileName, body: response.rawBody }); diff --git a/build/lib/bundle.ts b/build/lib/bundle.ts index ce1f6e61662..892ced8b85b 100644 --- a/build/lib/bundle.ts +++ b/build/lib/bundle.ts @@ -75,7 +75,7 @@ export interface IConcatFile { export interface IBundleData { graph: IGraph; - bundles: { [moduleId: string]: string[]; }; + bundles: { [moduleId: string]: string[] }; } export interface IBundleResult { @@ -91,7 +91,7 @@ interface IPartialBundleResult { export interface ILoaderConfig { isBuild?: boolean; - paths?: { [path: string]: any; }; + paths?: { [path: string]: any }; } /** @@ -106,7 +106,7 @@ export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callba entryPointsMap[module.name] = module; }); - const allMentionedModulesMap: { [modules: string]: boolean; } = {}; + const allMentionedModulesMap: { [modules: string]: boolean } = {}; entryPoints.forEach((module: IEntryPoint) => { allMentionedModulesMap[module.name] = true; (module.include || []).forEach(function (includedModule) { @@ -283,7 +283,7 @@ function extractStrings(destFiles: IConcatFile[]): IConcatFile[] { } // Do one pass to record the usage counts for each module id - const useCounts: { [moduleId: string]: number; } = {}; + const useCounts: { [moduleId: string]: number } = {}; destFile.sources.forEach((source) => { const matches = source.contents.match(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/); if (!matches) { @@ -302,7 +302,7 @@ function extractStrings(destFiles: IConcatFile[]): IConcatFile[] { return useCounts[b] - useCounts[a]; }); - const replacementMap: { [moduleId: string]: number; } = {}; + const replacementMap: { [moduleId: string]: number } = {}; sortedByUseModules.forEach((module, index) => { replacementMap[module] = index; }); @@ -599,7 +599,7 @@ function visit(rootNodes: string[], graph: IGraph): INodeSet { function topologicalSort(graph: IGraph): string[] { const allNodes: INodeSet = {}, - outgoingEdgeCount: { [node: string]: number; } = {}, + outgoingEdgeCount: { [node: string]: number } = {}, inverseEdges: IGraph = {}; Object.keys(graph).forEach((fromNode: string) => { diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index a4c8441effc..1325f89fd04 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -132,7 +132,7 @@ class MonacoGenerator { private readonly _isWatch: boolean; public readonly stream: NodeJS.ReadWriteStream; - private readonly _watchedFiles: { [filePath: string]: boolean; }; + private readonly _watchedFiles: { [filePath: string]: boolean }; private readonly _fsProvider: monacodts.FSProvider; private readonly _declarationResolver: monacodts.DeclarationResolver; diff --git a/build/lib/electron.ts b/build/lib/electron.ts index 12f9013745e..a3d696b75cc 100644 --- a/build/lib/electron.ts +++ b/build/lib/electron.ts @@ -14,11 +14,11 @@ import * as util from './util'; type DarwinDocumentSuffix = 'document' | 'script' | 'file' | 'source code'; type DarwinDocumentType = { - name: string, - role: string, - ostypes: string[], - extensions: string[], - iconFile: string, + name: string; + role: string; + ostypes: string[]; + extensions: string[]; + iconFile: string; }; function isDocumentSuffix(str?: string): str is DarwinDocumentSuffix { diff --git a/build/lib/eslint/code-import-patterns.js b/build/lib/eslint/code-import-patterns.js index df5656d4a73..47cc3063d1c 100644 --- a/build/lib/eslint/code-import-patterns.js +++ b/build/lib/eslint/code-import-patterns.js @@ -7,6 +7,9 @@ const path = require("path"); const minimatch = require("minimatch"); const utils_1 = require("./utils"); const REPO_ROOT = path.normalize(path.join(__dirname, '../../../')); +function isLayerAllowRule(option) { + return !!(option.when && option.allow); +} /** * Returns the filename relative to the project root and using `/` as separators */ @@ -25,9 +28,11 @@ module.exports = new class { url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization' } }; + this._optionsCache = new WeakMap(); } create(context) { - const configs = this._processOptions(context.options); + const options = context.options; + const configs = this._processOptions(options); const relativeFilename = getRelativeFilename(context); for (const config of configs) { if (minimatch(relativeFilename, config.target)) { @@ -35,25 +40,138 @@ module.exports = new class { } } context.report({ - loc: { line: 1, column: 1 }, + loc: { line: 1, column: 0 }, messageId: 'badFilename' }); return {}; } _processOptions(options) { - const result = []; - for (const option of options) { - const target = option.target; - const restrictions = (typeof option.restrictions === 'string' ? [option.restrictions] : option.restrictions); - result.push({ target, restrictions }); + if (this._optionsCache.has(options)) { + return this._optionsCache.get(options); } - return result; + function orSegment(variants) { + return (variants.length === 1 ? variants[0] : `{${variants.join(',')}}`); + } + const layerRules = [ + { layer: 'common', deps: orSegment(['common']) }, + { layer: 'worker', deps: orSegment(['common', 'worker']) }, + { layer: 'browser', deps: orSegment(['common', 'browser']), isBrowser: true }, + { layer: 'electron-sandbox', deps: orSegment(['common', 'browser', 'electron-sandbox']), isBrowser: true }, + { layer: 'node', deps: orSegment(['common', 'node']), isNode: true }, + { layer: 'electron-browser', deps: orSegment(['common', 'browser', 'node', 'electron-sandbox', 'electron-browser']), isBrowser: true, isNode: true }, + { layer: 'electron-main', deps: orSegment(['common', 'node', 'electron-main']), isNode: true }, + ]; + let browserAllow = []; + let nodeAllow = []; + let testAllow = []; + for (const option of options) { + if (isLayerAllowRule(option)) { + if (option.when === 'hasBrowser') { + browserAllow = option.allow.slice(0); + } + else if (option.when === 'hasNode') { + nodeAllow = option.allow.slice(0); + } + else if (option.when === 'test') { + testAllow = option.allow.slice(0); + } + } + } + function findLayer(layer) { + for (const layerRule of layerRules) { + if (layerRule.layer === layer) { + return layerRule; + } + } + return null; + } + function generateConfig(layerRule, target, rawRestrictions) { + const restrictions = []; + const testRestrictions = [...testAllow]; + if (layerRule.isBrowser) { + restrictions.push(...browserAllow); + } + if (layerRule.isNode) { + restrictions.push(...nodeAllow); + } + for (const rawRestriction of rawRestrictions) { + let importPattern; + let when = undefined; + if (typeof rawRestriction === 'string') { + importPattern = rawRestriction; + } + else { + importPattern = rawRestriction.pattern; + when = rawRestriction.when; + } + if (typeof when === 'undefined' + || (when === 'hasBrowser' && layerRule.isBrowser) + || (when === 'hasNode' && layerRule.isNode)) { + restrictions.push(importPattern.replace(/\/\~$/, `/${layerRule.deps}/**`)); + testRestrictions.push(importPattern.replace(/\/\~$/, `/test/${layerRule.deps}/**`)); + } + else if (when === 'test') { + testRestrictions.push(importPattern.replace(/\/\~$/, `/${layerRule.deps}/**`)); + testRestrictions.push(importPattern.replace(/\/\~$/, `/test/${layerRule.deps}/**`)); + } + } + testRestrictions.push(...restrictions); + return [ + { + target: target.replace(/\/\~$/, `/${layerRule.layer}/**`), + restrictions: restrictions + }, + { + target: target.replace(/\/\~$/, `/test/${layerRule.layer}/**`), + restrictions: testRestrictions + } + ]; + } + const configs = []; + for (const option of options) { + if (isLayerAllowRule(option)) { + continue; + } + const target = option.target; + const targetIsVS = /^src\/vs\//.test(target); + const restrictions = (typeof option.restrictions === 'string' ? [option.restrictions] : option.restrictions).slice(0); + if (targetIsVS) { + // Always add "vs/nls" + restrictions.push('vs/nls'); + } + if (targetIsVS && option.layer) { + // single layer => simple substitution for /~ + const layerRule = findLayer(option.layer); + if (layerRule) { + const [config, testConfig] = generateConfig(layerRule, target, restrictions); + if (option.test) { + configs.push(testConfig); + } + else { + configs.push(config); + } + } + } + else if (targetIsVS && /\/\~$/.test(target)) { + // generate all layers + for (const layerRule of layerRules) { + const [config, testConfig] = generateConfig(layerRule, target, restrictions); + configs.push(config); + configs.push(testConfig); + } + } + else { + configs.push({ target, restrictions: restrictions.filter(r => typeof r === 'string') }); + } + } + this._optionsCache.set(options, configs); + return configs; } _checkImport(context, config, node, importPath) { // resolve relative paths if (importPath[0] === '.') { const relativeFilename = getRelativeFilename(context); - importPath = path.join(path.dirname(relativeFilename), importPath); + importPath = path.posix.join(path.posix.dirname(relativeFilename), importPath); if (/^src\/vs\//.test(importPath)) { // resolve using AMD base url importPath = importPath.substring('src/'.length); diff --git a/build/lib/eslint/code-import-patterns.ts b/build/lib/eslint/code-import-patterns.ts index aded9af748f..72b63a45b35 100644 --- a/build/lib/eslint/code-import-patterns.ts +++ b/build/lib/eslint/code-import-patterns.ts @@ -11,9 +11,27 @@ import { createImportRuleListener } from './utils'; const REPO_ROOT = path.normalize(path.join(__dirname, '../../../')); +interface ConditionalPattern { + when?: 'hasBrowser' | 'hasNode' | 'test'; + pattern: string; +} + interface RawImportPatternsConfig { target: string; - restrictions: string | string[]; + layer?: 'common' | 'worker' | 'browser' | 'electron-sandbox' | 'node' | 'electron-browser' | 'electron-main'; + test?: boolean; + restrictions: string | (string | ConditionalPattern)[]; +} + +interface LayerAllowRule { + when: 'hasBrowser' | 'hasNode' | 'test'; + allow: string[]; +} + +type RawOption = RawImportPatternsConfig | LayerAllowRule; + +function isLayerAllowRule(option: RawOption): option is LayerAllowRule { + return !!((option).when && (option).allow); } interface ImportPatternsConfig { @@ -34,8 +52,8 @@ export = new class implements eslint.Rule.RuleModule { }; create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { - - const configs = this._processOptions(context.options); + const options = context.options; + const configs = this._processOptions(options); const relativeFilename = getRelativeFilename(context); for (const config of configs) { @@ -45,21 +63,152 @@ export = new class implements eslint.Rule.RuleModule { } context.report({ - loc: { line: 1, column: 1 }, + loc: { line: 1, column: 0 }, messageId: 'badFilename' }); return {}; } - private _processOptions(options: RawImportPatternsConfig[]): ImportPatternsConfig[] { - const result: ImportPatternsConfig[] = []; - for (const option of options) { - const target = option.target; - const restrictions = (typeof option.restrictions === 'string' ? [option.restrictions] : option.restrictions); - result.push({ target, restrictions }); + private _optionsCache = new WeakMap(); + + private _processOptions(options: RawOption[]): ImportPatternsConfig[] { + if (this._optionsCache.has(options)) { + return this._optionsCache.get(options)!; } - return result; + + type Layer = 'common' | 'worker' | 'browser' | 'electron-sandbox' | 'node' | 'electron-browser' | 'electron-main'; + + interface ILayerRule { + layer: Layer; + deps: string; + isBrowser?: boolean; + isNode?: boolean; + } + + function orSegment(variants: Layer[]): string { + return (variants.length === 1 ? variants[0] : `{${variants.join(',')}}`); + } + + const layerRules: ILayerRule[] = [ + { layer: 'common', deps: orSegment(['common']) }, + { layer: 'worker', deps: orSegment(['common', 'worker']) }, + { layer: 'browser', deps: orSegment(['common', 'browser']), isBrowser: true }, + { layer: 'electron-sandbox', deps: orSegment(['common', 'browser', 'electron-sandbox']), isBrowser: true }, + { layer: 'node', deps: orSegment(['common', 'node']), isNode: true }, + { layer: 'electron-browser', deps: orSegment(['common', 'browser', 'node', 'electron-sandbox', 'electron-browser']), isBrowser: true, isNode: true }, + { layer: 'electron-main', deps: orSegment(['common', 'node', 'electron-main']), isNode: true }, + ]; + + let browserAllow: string[] = []; + let nodeAllow: string[] = []; + let testAllow: string[] = []; + for (const option of options) { + if (isLayerAllowRule(option)) { + if (option.when === 'hasBrowser') { + browserAllow = option.allow.slice(0); + } else if (option.when === 'hasNode') { + nodeAllow = option.allow.slice(0); + } else if (option.when === 'test') { + testAllow = option.allow.slice(0); + } + } + } + + function findLayer(layer: Layer): ILayerRule | null { + for (const layerRule of layerRules) { + if (layerRule.layer === layer) { + return layerRule; + } + } + return null; + } + + function generateConfig(layerRule: ILayerRule, target: string, rawRestrictions: (string | ConditionalPattern)[]): [ImportPatternsConfig, ImportPatternsConfig] { + const restrictions: string[] = []; + const testRestrictions: string[] = [...testAllow]; + + if (layerRule.isBrowser) { + restrictions.push(...browserAllow); + } + + if (layerRule.isNode) { + restrictions.push(...nodeAllow); + } + + for (const rawRestriction of rawRestrictions) { + let importPattern: string; + let when: 'hasBrowser' | 'hasNode' | 'test' | undefined = undefined; + if (typeof rawRestriction === 'string') { + importPattern = rawRestriction; + } else { + importPattern = rawRestriction.pattern; + when = rawRestriction.when; + } + if (typeof when === 'undefined' + || (when === 'hasBrowser' && layerRule.isBrowser) + || (when === 'hasNode' && layerRule.isNode) + ) { + restrictions.push(importPattern.replace(/\/\~$/, `/${layerRule.deps}/**`)); + testRestrictions.push(importPattern.replace(/\/\~$/, `/test/${layerRule.deps}/**`)); + } else if (when === 'test') { + testRestrictions.push(importPattern.replace(/\/\~$/, `/${layerRule.deps}/**`)); + testRestrictions.push(importPattern.replace(/\/\~$/, `/test/${layerRule.deps}/**`)); + } + } + + testRestrictions.push(...restrictions); + + return [ + { + target: target.replace(/\/\~$/, `/${layerRule.layer}/**`), + restrictions: restrictions + }, + { + target: target.replace(/\/\~$/, `/test/${layerRule.layer}/**`), + restrictions: testRestrictions + } + ]; + } + + const configs: ImportPatternsConfig[] = []; + for (const option of options) { + if (isLayerAllowRule(option)) { + continue; + } + const target = option.target; + const targetIsVS = /^src\/vs\//.test(target); + const restrictions = (typeof option.restrictions === 'string' ? [option.restrictions] : option.restrictions).slice(0); + + if (targetIsVS) { + // Always add "vs/nls" + restrictions.push('vs/nls'); + } + + if (targetIsVS && option.layer) { + // single layer => simple substitution for /~ + const layerRule = findLayer(option.layer); + if (layerRule) { + const [config, testConfig] = generateConfig(layerRule, target, restrictions); + if (option.test) { + configs.push(testConfig); + } else { + configs.push(config); + } + } + } else if (targetIsVS && /\/\~$/.test(target)) { + // generate all layers + for (const layerRule of layerRules) { + const [config, testConfig] = generateConfig(layerRule, target, restrictions); + configs.push(config); + configs.push(testConfig); + } + } else { + configs.push({ target, restrictions: restrictions.filter(r => typeof r === 'string') }); + } + } + this._optionsCache.set(options, configs); + return configs; } private _checkImport(context: eslint.Rule.RuleContext, config: ImportPatternsConfig, node: TSESTree.Node, importPath: string) { @@ -67,7 +216,7 @@ export = new class implements eslint.Rule.RuleModule { // resolve relative paths if (importPath[0] === '.') { const relativeFilename = getRelativeFilename(context); - importPath = path.join(path.dirname(relativeFilename), importPath); + importPath = path.posix.join(path.posix.dirname(relativeFilename), importPath); if (/^src\/vs\//.test(importPath)) { // resolve using AMD base url importPath = importPath.substring('src/'.length); diff --git a/build/lib/eslint/code-no-unexternalized-strings.ts b/build/lib/eslint/code-no-unexternalized-strings.ts index 8d9e142bb7f..056a99868ea 100644 --- a/build/lib/eslint/code-no-unexternalized-strings.ts +++ b/build/lib/eslint/code-no-unexternalized-strings.ts @@ -29,7 +29,7 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule { create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { - const externalizedStringLiterals = new Map(); + const externalizedStringLiterals = new Map(); const doubleQuotedStringLiterals = new Set(); function collectDoubleQuotedStrings(node: TSESTree.Literal) { diff --git a/build/lib/eslint/code-no-unused-expressions.js b/build/lib/eslint/code-no-unused-expressions.js index d8ee6ca46f3..530464f37b5 100644 --- a/build/lib/eslint/code-no-unused-expressions.js +++ b/build/lib/eslint/code-no-unused-expressions.js @@ -108,13 +108,16 @@ module.exports = { if (allowTaggedTemplates && node.type === 'TaggedTemplateExpression') { return true; } - return /^(?:Assignment|OptionalCall|Call|New|Update|Yield|Await)Expression$/u.test(node.type) || + if (node.type === 'ExpressionStatement') { + return isValidExpression(node.expression); + } + return /^(?:Assignment|OptionalCall|Call|New|Update|Yield|Await|Chain)Expression$/u.test(node.type) || (node.type === 'UnaryExpression' && ['delete', 'void'].indexOf(node.operator) >= 0); } return { ExpressionStatement(node) { if (!isValidExpression(node.expression) && !isDirective(node, context.getAncestors())) { - context.report({ node: node, message: 'Expected an assignment or function call and instead saw an expression.' }); + context.report({ node: node, message: `Expected an assignment or function call and instead saw an expression. ${node.expression}` }); } } }; diff --git a/build/lib/eslint/code-no-unused-expressions.ts b/build/lib/eslint/code-no-unused-expressions.ts index d130d670da5..f5f0728836e 100644 --- a/build/lib/eslint/code-no-unused-expressions.ts +++ b/build/lib/eslint/code-no-unused-expressions.ts @@ -133,14 +133,18 @@ module.exports = { return true; } - return /^(?:Assignment|OptionalCall|Call|New|Update|Yield|Await)Expression$/u.test(node.type) || + if (node.type === 'ExpressionStatement') { + return isValidExpression(node.expression); + } + + return /^(?:Assignment|OptionalCall|Call|New|Update|Yield|Await|Chain)Expression$/u.test(node.type) || (node.type === 'UnaryExpression' && ['delete', 'void'].indexOf(node.operator) >= 0); } return { ExpressionStatement(node: TSESTree.ExpressionStatement) { if (!isValidExpression(node.expression) && !isDirective(node, context.getAncestors())) { - context.report({ node: node, message: 'Expected an assignment or function call and instead saw an expression.' }); + context.report({ node: node, message: `Expected an assignment or function call and instead saw an expression. ${node.expression}` }); } } }; diff --git a/build/lib/eslint/vscode-dts-event-naming.js b/build/lib/eslint/vscode-dts-event-naming.js index 388ccf2f804..a1a1c1097f1 100644 --- a/build/lib/eslint/vscode-dts-event-naming.js +++ b/build/lib/eslint/vscode-dts-event-naming.js @@ -77,7 +77,7 @@ module.exports = new (_a = class ApiEventNaming { if (def.type === experimental_utils_1.AST_NODE_TYPES.Identifier) { return def; } - else if ((def.type === experimental_utils_1.AST_NODE_TYPES.TSPropertySignature || def.type === experimental_utils_1.AST_NODE_TYPES.ClassProperty) && def.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier) { + else if ((def.type === experimental_utils_1.AST_NODE_TYPES.TSPropertySignature || def.type === experimental_utils_1.AST_NODE_TYPES.Property) && def.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier) { return def.key; } return this.getIdent(def.parent); diff --git a/build/lib/eslint/vscode-dts-event-naming.ts b/build/lib/eslint/vscode-dts-event-naming.ts index 5ed8818fe44..956ba346087 100644 --- a/build/lib/eslint/vscode-dts-event-naming.ts +++ b/build/lib/eslint/vscode-dts-event-naming.ts @@ -24,7 +24,7 @@ export = new class ApiEventNaming implements eslint.Rule.RuleModule { create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { - const config = <{ allowed: string[], verbs: string[] }>context.options[0]; + const config = <{ allowed: string[]; verbs: string[] }>context.options[0]; const allowed = new Set(config.allowed); const verbs = new Set(config.verbs); @@ -88,7 +88,7 @@ export = new class ApiEventNaming implements eslint.Rule.RuleModule { if (def.type === AST_NODE_TYPES.Identifier) { return def; - } else if ((def.type === AST_NODE_TYPES.TSPropertySignature || def.type === AST_NODE_TYPES.ClassProperty) && def.key.type === AST_NODE_TYPES.Identifier) { + } else if ((def.type === AST_NODE_TYPES.TSPropertySignature || def.type === AST_NODE_TYPES.Property) && def.key.type === AST_NODE_TYPES.Identifier) { return def.key; } diff --git a/build/lib/extensions.js b/build/lib/extensions.js index bee77deefcc..3707c802df7 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -359,6 +359,7 @@ const webpackMediaConfigFiles = [ const esbuildMediaScripts = [ 'markdown-language-features/esbuild.js', 'markdown-math/esbuild.js', + 'notebook-renderers/esbuild.js' ]; async function webpackExtensions(taskName, isWatch, webpackConfigLocations) { const webpack = require('webpack'); diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index 3578bf1bd0b..7303b3b151a 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -409,7 +409,7 @@ export function scanBuiltinExtensions(extensionsRoot: string, exclude: string[] export function translatePackageJSON(packageJSON: string, packageNLSPath: string) { interface NLSFormat { - [key: string]: string | { message: string, comment: string[] }; + [key: string]: string | { message: string; comment: string[] }; } const CharCode_PC = '%'.charCodeAt(0); const packageNls: NLSFormat = JSON.parse(fs.readFileSync(packageNLSPath).toString()); @@ -444,9 +444,10 @@ const webpackMediaConfigFiles = [ const esbuildMediaScripts = [ 'markdown-language-features/esbuild.js', 'markdown-math/esbuild.js', + 'notebook-renderers/esbuild.js' ]; -export async function webpackExtensions(taskName: string, isWatch: boolean, webpackConfigLocations: { configPath: string, outputRoot?: string }[]) { +export async function webpackExtensions(taskName: string, isWatch: boolean, webpackConfigLocations: { configPath: string; outputRoot?: string }[]) { const webpack = require('webpack') as typeof import('webpack'); const webpackConfigs: webpack.Configuration[] = []; @@ -515,7 +516,7 @@ export async function webpackExtensions(taskName: string, isWatch: boolean, webp }); } -async function esbuildExtensions(taskName: string, isWatch: boolean, scripts: { script: string, outputRoot?: string }[]) { +async function esbuildExtensions(taskName: string, isWatch: boolean, scripts: { script: string; outputRoot?: string }[]) { function reporter(stdError: string, script: string) { const matches = (stdError || '').match(/\> (.+): error: (.+)?/g); fancyLog(`Finished ${ansiColors.green(taskName)} ${script} with ${matches ? matches.length : 0} errors.`); diff --git a/build/lib/i18n.js b/build/lib/i18n.js index cf79d4b9d1d..e89cdf1504e 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -289,13 +289,13 @@ function sortLanguages(languages) { }); } function stripComments(content) { - /** - * First capturing group matches double quoted string - * Second matches single quotes string - * Third matches block comments - * Fourth matches line comments - */ - const regexp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; + // Copied from stripComments.js + // + // First group matches a double quoted string + // Second group matches a single quoted string + // Third group matches a multi line comment + // Forth group matches a single line comment + const regexp = /("[^"\\]*(?:\\.[^"\\]*)*")|('[^'\\]*(?:\\.[^'\\]*)*')|(\/\*[^\/\*]*(?:(?:\*|\/)[^\/\*]*)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; let result = content.replace(regexp, (match, _m1, _m2, m3, m4) => { // Only one of m1, m2, m3, m4 matches if (m3) { @@ -303,9 +303,10 @@ function stripComments(content) { return ''; } else if (m4) { - // A line comment. If it ends in \r?\n then keep it. - let length = m4.length; - if (length > 2 && m4[length - 1] === '\n') { + // Since m4 is a single line comment is is at least of length 2 (e.g. //) + // If it ends in \r?\n then keep it. + const length = m4.length; + if (m4[length - 1] === '\n') { return m4[length - 2] === '\r' ? '\r\n' : '\n'; } else { diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index 8ff6f1f199e..34cbf9b0f59 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -243,7 +243,23 @@ "project": "vscode-workbench" }, { - "name": "vs/workbench/contrib/welcome", + "name": "vs/workbench/contrib/welcomeGettingStarted", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeOverlay", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomePage", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeViews", + "project": "vscode-workbench" + }, + { + "name": "vs/workbench/contrib/welcomeWalkthrough", "project": "vscode-workbench" }, { diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index b3f7e0b518a..3ea4f7efb4e 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -277,7 +277,7 @@ export class XLF { static parsePseudo = function (xlfString: string): Promise { return new Promise((resolve) => { let parser = new xml2js.Parser(); - let files: { messages: Map, originalFilePath: string, language: string }[] = []; + let files: { messages: Map; originalFilePath: string; language: string }[] = []; parser.parseString(xlfString, function (_err: any, result: any) { const fileNodes: any[] = result['xliff']['file']; fileNodes.forEach(file => { @@ -304,7 +304,7 @@ export class XLF { return new Promise((resolve, reject) => { let parser = new xml2js.Parser(); - let files: { messages: Map, originalFilePath: string, language: string }[] = []; + let files: { messages: Map; originalFilePath: string; language: string }[] = []; parser.parseString(xlfString, function (err: any, result: any) { if (err) { @@ -406,22 +406,23 @@ function sortLanguages(languages: Language[]): Language[] { } function stripComments(content: string): string { - /** - * First capturing group matches double quoted string - * Second matches single quotes string - * Third matches block comments - * Fourth matches line comments - */ - const regexp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; - let result = content.replace(regexp, (match, _m1, _m2, m3, m4) => { + // Copied from stripComments.js + // + // First group matches a double quoted string + // Second group matches a single quoted string + // Third group matches a multi line comment + // Forth group matches a single line comment + const regexp = /("[^"\\]*(?:\\.[^"\\]*)*")|('[^'\\]*(?:\\.[^'\\]*)*')|(\/\*[^\/\*]*(?:(?:\*|\/)[^\/\*]*)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; + let result = content.replace(regexp, (match, _m1: string, _m2: string, m3: string, m4: string) => { // Only one of m1, m2, m3, m4 matches if (m3) { // A block comment. Replace with nothing return ''; } else if (m4) { - // A line comment. If it ends in \r?\n then keep it. - let length = m4.length; - if (length > 2 && m4[length - 1] === '\n') { + // Since m4 is a single line comment is is at least of length 2 (e.g. //) + // If it ends in \r?\n then keep it. + const length = m4.length; + if (m4[length - 1] === '\n') { return m4[length - 2] === '\r' ? '\r\n' : '\n'; } else { return ''; diff --git a/build/lib/layersChecker.js b/build/lib/layersChecker.js index 7f0637af940..aaa732c6751 100644 --- a/build/lib/layersChecker.js +++ b/build/lib/layersChecker.js @@ -53,6 +53,21 @@ const CORE_TYPES = [ 'trimLeft', 'trimRight', 'queueMicrotask', + 'Array', + 'Uint8Array', + 'Uint16Array', + 'Uint32Array', + 'Int8Array', + 'Int16Array', + 'Int32Array', + 'Float32Array', + 'Float64Array', + 'Uint8ClampedArray', + 'BigUint64Array', + 'BigInt64Array', + 'btoa', + 'atob', + 'AbortSignal', 'MessageChannel', 'MessagePort' ]; @@ -89,8 +104,8 @@ const RULES = [ // Common: vs/platform/environment/common/* { target: '**/vs/platform/environment/common/*.ts', - disallowedTypes: [ /* Ignore native types that are defined from here */], allowedTypes: CORE_TYPES, + disallowedTypes: [ /* Ignore native types that are defined from here */], disallowedDefinitions: [ 'lib.dom.d.ts', '@types/node' // no node.js @@ -99,8 +114,8 @@ const RULES = [ // Common: vs/platform/windows/common/windows.ts { target: '**/vs/platform/windows/common/windows.ts', - disallowedTypes: [ /* Ignore native types that are defined from here */], allowedTypes: CORE_TYPES, + disallowedTypes: [ /* Ignore native types that are defined from here */], disallowedDefinitions: [ 'lib.dom.d.ts', '@types/node' // no node.js @@ -109,8 +124,8 @@ const RULES = [ // Common: vs/platform/native/common/native.ts { target: '**/vs/platform/native/common/native.ts', - disallowedTypes: [ /* Ignore native types that are defined from here */], allowedTypes: CORE_TYPES, + disallowedTypes: [ /* Ignore native types that are defined from here */], disallowedDefinitions: [ 'lib.dom.d.ts', '@types/node' // no node.js @@ -145,6 +160,9 @@ const RULES = [ target: '**/vs/**/browser/**', allowedTypes: CORE_TYPES, disallowedTypes: NATIVE_TYPES, + allowedDefinitions: [ + '@types/node/stream/consumers.d.ts' // node.js started to duplicate types from lib.dom.d.ts so we have to account for that + ], disallowedDefinitions: [ '@types/node' // no node.js ] @@ -228,13 +246,20 @@ function checkFile(program, sourceFile, rule) { if (symbol) { const declarations = symbol.declarations; if (Array.isArray(declarations)) { - for (const declaration of declarations) { + DeclarationLoop: for (const declaration of declarations) { if (declaration) { const parent = declaration.parent; if (parent) { const parentSourceFile = parent.getSourceFile(); if (parentSourceFile) { const definitionFileName = parentSourceFile.fileName; + if (rule.allowedDefinitions) { + for (const allowedDefinition of rule.allowedDefinitions) { + if (definitionFileName.indexOf(allowedDefinition) >= 0) { + continue DeclarationLoop; + } + } + } if (rule.disallowedDefinitions) { for (const disallowedDefinition of rule.disallowedDefinitions) { if (definitionFileName.indexOf(disallowedDefinition) >= 0) { diff --git a/build/lib/layersChecker.ts b/build/lib/layersChecker.ts index e62394a405c..f3aefc76203 100644 --- a/build/lib/layersChecker.ts +++ b/build/lib/layersChecker.ts @@ -54,6 +54,21 @@ const CORE_TYPES = [ 'trimLeft', 'trimRight', 'queueMicrotask', + 'Array', + 'Uint8Array', + 'Uint16Array', + 'Uint32Array', + 'Int8Array', + 'Int16Array', + 'Int32Array', + 'Float32Array', + 'Float64Array', + 'Uint8ClampedArray', + 'BigUint64Array', + 'BigInt64Array', + 'btoa', + 'atob', + 'AbortSignal', 'MessageChannel', 'MessagePort' ]; @@ -96,8 +111,8 @@ const RULES = [ // Common: vs/platform/environment/common/* { target: '**/vs/platform/environment/common/*.ts', - disallowedTypes: [/* Ignore native types that are defined from here */], allowedTypes: CORE_TYPES, + disallowedTypes: [/* Ignore native types that are defined from here */], disallowedDefinitions: [ 'lib.dom.d.ts', // no DOM '@types/node' // no node.js @@ -107,8 +122,8 @@ const RULES = [ // Common: vs/platform/windows/common/windows.ts { target: '**/vs/platform/windows/common/windows.ts', - disallowedTypes: [/* Ignore native types that are defined from here */], allowedTypes: CORE_TYPES, + disallowedTypes: [/* Ignore native types that are defined from here */], disallowedDefinitions: [ 'lib.dom.d.ts', // no DOM '@types/node' // no node.js @@ -118,8 +133,8 @@ const RULES = [ // Common: vs/platform/native/common/native.ts { target: '**/vs/platform/native/common/native.ts', - disallowedTypes: [/* Ignore native types that are defined from here */], allowedTypes: CORE_TYPES, + disallowedTypes: [/* Ignore native types that are defined from here */], disallowedDefinitions: [ 'lib.dom.d.ts', // no DOM '@types/node' // no node.js @@ -158,6 +173,9 @@ const RULES = [ target: '**/vs/**/browser/**', allowedTypes: CORE_TYPES, disallowedTypes: NATIVE_TYPES, + allowedDefinitions: [ + '@types/node/stream/consumers.d.ts' // node.js started to duplicate types from lib.dom.d.ts so we have to account for that + ], disallowedDefinitions: [ '@types/node' // no node.js ] @@ -231,6 +249,7 @@ interface IRule { target: string; skip?: boolean; allowedTypes?: string[]; + allowedDefinitions?: string[]; disallowedDefinitions?: string[]; disallowedTypes?: string[]; } @@ -264,13 +283,20 @@ function checkFile(program: ts.Program, sourceFile: ts.SourceFile, rule: IRule) if (symbol) { const declarations = symbol.declarations; if (Array.isArray(declarations)) { - for (const declaration of declarations) { + DeclarationLoop: for (const declaration of declarations) { if (declaration) { const parent = declaration.parent; if (parent) { const parentSourceFile = parent.getSourceFile(); if (parentSourceFile) { const definitionFileName = parentSourceFile.fileName; + if (rule.allowedDefinitions) { + for (const allowedDefinition of rule.allowedDefinitions) { + if (definitionFileName.indexOf(allowedDefinition) >= 0) { + continue DeclarationLoop; + } + } + } if (rule.disallowedDefinitions) { for (const disallowedDefinition of rule.disallowedDefinitions) { if (definitionFileName.indexOf(disallowedDefinition) >= 0) { diff --git a/build/lib/monaco-api.ts b/build/lib/monaco-api.ts index 31487baf0a9..69deaf7471c 100644 --- a/build/lib/monaco-api.ts +++ b/build/lib/monaco-api.ts @@ -111,7 +111,7 @@ function getTopLevelDeclaration(ts: typeof import('typescript'), sourceFile: ts. } -function getNodeText(sourceFile: ts.SourceFile, node: { pos: number; end: number; }): string { +function getNodeText(sourceFile: ts.SourceFile, node: { pos: number; end: number }): string { return sourceFile.getFullText().substring(node.pos, node.end); } @@ -461,7 +461,7 @@ function generateDeclarationFile(ts: typeof import('typescript'), recipe: string let replacer = createReplacer(m2[2]); let typeNames = m2[3].split(/,/); - let typesToExcludeMap: { [typeName: string]: boolean; } = {}; + let typesToExcludeMap: { [typeName: string]: boolean } = {}; let typesToExcludeArr: string[] = []; typeNames.forEach((typeName) => { typeName = typeName.trim(); @@ -599,7 +599,7 @@ class CacheEntry { export class DeclarationResolver { public readonly ts: typeof import('typescript'); - private _sourceFileCache: { [moduleId: string]: CacheEntry | null; }; + private _sourceFileCache: { [moduleId: string]: CacheEntry | null }; constructor(private readonly _fsProvider: FSProvider) { this.ts = require('typescript') as typeof import('typescript'); @@ -667,8 +667,8 @@ export function run3(resolver: DeclarationResolver): IMonacoDeclarationResult | -interface ILibMap { [libName: string]: string; } -interface IFileMap { [fileName: string]: string; } +interface ILibMap { [libName: string]: string } +interface IFileMap { [fileName: string]: string } class TypeScriptLanguageServiceHost implements ts.LanguageServiceHost { diff --git a/build/lib/standalone.ts b/build/lib/standalone.ts index 8b87b9fa4ae..3483de02a39 100644 --- a/build/lib/standalone.ts +++ b/build/lib/standalone.ts @@ -10,7 +10,7 @@ import * as tss from './treeshaking'; const REPO_ROOT = path.join(__dirname, '../../'); const SRC_DIR = path.join(REPO_ROOT, 'src'); -let dirCache: { [dir: string]: boolean; } = {}; +let dirCache: { [dir: string]: boolean } = {}; function writeFile(filePath: string, contents: Buffer | string): void { function ensureDirs(dirPath: string): void { @@ -69,7 +69,7 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str writeFile(path.join(options.destRoot, fileName), result[fileName]); } } - let copied: { [fileName: string]: boolean; } = {}; + let copied: { [fileName: string]: boolean } = {}; const copyFile = (fileName: string) => { if (copied[fileName]) { return; @@ -131,7 +131,7 @@ export interface IOptions2 { outFolder: string; outResourcesFolder: string; ignores: string[]; - renames: { [filename: string]: string; }; + renames: { [filename: string]: string }; } export function createESMSourcesAndResources2(options: IOptions2): void { diff --git a/build/lib/stats.js b/build/lib/stats.js index 9a239e8868a..6d705a9a16b 100644 --- a/build/lib/stats.js +++ b/build/lib/stats.js @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.submitAllStats = exports.createStatsStream = void 0; +exports.createStatsStream = void 0; const es = require("event-stream"); const fancyLog = require("fancy-log"); const ansiColors = require("ansi-colors"); @@ -71,67 +71,3 @@ function createStatsStream(group, log) { }); } exports.createStatsStream = createStatsStream; -function submitAllStats(productJson, commit) { - const appInsights = require('applicationinsights'); - const sorted = []; - // move entries for single files to the front - _entries.forEach(value => { - if (value.totalCount === 1) { - sorted.unshift(value); - } - else { - sorted.push(value); - } - }); - // print to console - for (const entry of sorted) { - console.log(entry.toString(true)); - } - // send data as telementry event when the - // product is configured to send telemetry - if (!productJson || !productJson.aiConfig || typeof productJson.aiConfig.asimovKey !== 'string') { - return Promise.resolve(false); - } - return new Promise(resolve => { - try { - const sizes = {}; - const counts = {}; - for (const entry of sorted) { - sizes[entry.name] = entry.totalSize; - counts[entry.name] = entry.totalCount; - } - appInsights.setup(productJson.aiConfig.asimovKey) - .setAutoCollectConsole(false) - .setAutoCollectExceptions(false) - .setAutoCollectPerformance(false) - .setAutoCollectRequests(false) - .setAutoCollectDependencies(false) - .setAutoDependencyCorrelation(false) - .start(); - appInsights.defaultClient.config.endpointUrl = 'https://vortex.data.microsoft.com/collect/v1'; - /* __GDPR__ - "monacoworkbench/packagemetrics" : { - "commit" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "size" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "count" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" } - } - */ - appInsights.defaultClient.trackEvent({ - name: 'monacoworkbench/packagemetrics', - properties: { commit, size: JSON.stringify(sizes), count: JSON.stringify(counts) } - }); - appInsights.defaultClient.flush({ - callback: () => { - appInsights.dispose(); - resolve(true); - } - }); - } - catch (err) { - console.error('ERROR sending build stats as telemetry event!'); - console.error(err); - resolve(false); - } - }); -} -exports.submitAllStats = submitAllStats; diff --git a/build/lib/stats.ts b/build/lib/stats.ts index ce141a2f755..6e85cf68e29 100644 --- a/build/lib/stats.ts +++ b/build/lib/stats.ts @@ -72,77 +72,3 @@ export function createStatsStream(group: string, log?: boolean): es.ThroughStrea this.emit('end'); }); } - -export function submitAllStats(productJson: any, commit: string): Promise { - const appInsights = require('applicationinsights') as typeof import('applicationinsights'); - - const sorted: Entry[] = []; - // move entries for single files to the front - _entries.forEach(value => { - if (value.totalCount === 1) { - sorted.unshift(value); - } else { - sorted.push(value); - } - }); - - // print to console - for (const entry of sorted) { - console.log(entry.toString(true)); - } - - // send data as telementry event when the - // product is configured to send telemetry - if (!productJson || !productJson.aiConfig || typeof productJson.aiConfig.asimovKey !== 'string') { - return Promise.resolve(false); - } - - return new Promise(resolve => { - try { - - const sizes: any = {}; - const counts: any = {}; - for (const entry of sorted) { - sizes[entry.name] = entry.totalSize; - counts[entry.name] = entry.totalCount; - } - - appInsights.setup(productJson.aiConfig.asimovKey) - .setAutoCollectConsole(false) - .setAutoCollectExceptions(false) - .setAutoCollectPerformance(false) - .setAutoCollectRequests(false) - .setAutoCollectDependencies(false) - .setAutoDependencyCorrelation(false) - .start(); - - appInsights.defaultClient.config.endpointUrl = 'https://vortex.data.microsoft.com/collect/v1'; - - /* __GDPR__ - "monacoworkbench/packagemetrics" : { - "commit" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "size" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }, - "count" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" } - } - */ - appInsights.defaultClient.trackEvent({ - name: 'monacoworkbench/packagemetrics', - properties: { commit, size: JSON.stringify(sizes), count: JSON.stringify(counts) } - }); - - - appInsights.defaultClient.flush({ - callback: () => { - appInsights.dispose(); - resolve(true); - } - }); - - } catch (err) { - console.error('ERROR sending build stats as telemetry event!'); - console.error(err); - resolve(false); - } - }); - -} diff --git a/build/lib/treeshaking.ts b/build/lib/treeshaking.ts index 0ce7e8c0a01..9ea3a2e0c48 100644 --- a/build/lib/treeshaking.ts +++ b/build/lib/treeshaking.ts @@ -59,7 +59,7 @@ export interface ITreeShakingOptions { */ importIgnorePattern: RegExp; - redirects: { [module: string]: string; }; + redirects: { [module: string]: string }; } export interface ITreeShakingResult { @@ -140,7 +140,7 @@ function createTypeScriptLanguageService(ts: typeof import('typescript'), option function discoverAndReadFiles(ts: typeof import('typescript'), options: ITreeShakingOptions): IFileMap { const FILES: IFileMap = {}; - const in_queue: { [module: string]: boolean; } = Object.create(null); + const in_queue: { [module: string]: boolean } = Object.create(null); const queue: string[] = []; const enqueue = (moduleId: string) => { @@ -225,8 +225,8 @@ function processLibFiles(ts: typeof import('typescript'), options: ITreeShakingO return result; } -interface ILibMap { [libName: string]: string; } -interface IFileMap { [fileName: string]: string; } +interface ILibMap { [libName: string]: string } +interface IFileMap { [fileName: string]: string } /** * A TypeScript language service host diff --git a/build/lib/watch/watch-win32.ts b/build/lib/watch/watch-win32.ts index 833c8d9c672..fa65a5bdeb2 100644 --- a/build/lib/watch/watch-win32.ts +++ b/build/lib/watch/watch-win32.ts @@ -68,9 +68,9 @@ function watch(root: string): Stream { return result; } -const cache: { [cwd: string]: Stream; } = Object.create(null); +const cache: { [cwd: string]: Stream } = Object.create(null); -module.exports = function (pattern: string | string[] | filter.FileFunction, options?: { cwd?: string; base?: string; }) { +module.exports = function (pattern: string | string[] | filter.FileFunction, options?: { cwd?: string; base?: string }) { options = options || {}; const cwd = path.normalize(options.cwd || process.cwd()); diff --git a/build/linux/libcxx-fetcher.js b/build/linux/libcxx-fetcher.js index 4fa976339f6..52606aba169 100644 --- a/build/linux/libcxx-fetcher.js +++ b/build/linux/libcxx-fetcher.js @@ -1,3 +1,7 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ // Can be removed once https://github.com/electron/electron-rebuild/pull/703 is available. 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); @@ -10,10 +14,12 @@ const packageJSON = require("../../package.json"); const get_1 = require("@electron/get"); const d = debug('libcxx-fetcher'); async function downloadLibcxxHeaders(outDir, electronVersion, lib_name) { - if (await fs.pathExists(path.resolve(outDir, 'include'))) + if (await fs.pathExists(path.resolve(outDir, 'include'))) { return; - if (!await fs.pathExists(outDir)) + } + if (!await fs.pathExists(outDir)) { await fs.mkdirp(outDir); + } d(`downloading ${lib_name}_headers`); const headers = await (0, get_1.downloadArtifact)({ version: electronVersion, @@ -25,10 +31,12 @@ async function downloadLibcxxHeaders(outDir, electronVersion, lib_name) { } exports.downloadLibcxxHeaders = downloadLibcxxHeaders; async function downloadLibcxxObjects(outDir, electronVersion, targetArch = 'x64') { - if (await fs.pathExists(path.resolve(outDir, 'libc++.a'))) + if (await fs.pathExists(path.resolve(outDir, 'libc++.a'))) { return; - if (!await fs.pathExists(outDir)) + } + if (!await fs.pathExists(outDir)) { await fs.mkdirp(outDir); + } d(`downloading libcxx-objects-linux-${targetArch}`); const objects = await (0, get_1.downloadArtifact)({ version: electronVersion, diff --git a/build/linux/libcxx-fetcher.ts b/build/linux/libcxx-fetcher.ts index b321cbe4512..0e8f5ade255 100644 --- a/build/linux/libcxx-fetcher.ts +++ b/build/linux/libcxx-fetcher.ts @@ -1,3 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + // Can be removed once https://github.com/electron/electron-rebuild/pull/703 is available. 'use strict'; @@ -12,8 +17,12 @@ import { downloadArtifact } from '@electron/get'; const d = debug('libcxx-fetcher'); export async function downloadLibcxxHeaders(outDir: string, electronVersion: string, lib_name: string): Promise { - if (await fs.pathExists(path.resolve(outDir, 'include'))) return; - if (!await fs.pathExists(outDir)) await fs.mkdirp(outDir); + if (await fs.pathExists(path.resolve(outDir, 'include'))) { + return; + } + if (!await fs.pathExists(outDir)) { + await fs.mkdirp(outDir); + } d(`downloading ${lib_name}_headers`); const headers = await downloadArtifact({ @@ -27,8 +36,12 @@ export async function downloadLibcxxHeaders(outDir: string, electronVersion: str } export async function downloadLibcxxObjects(outDir: string, electronVersion: string, targetArch: string = 'x64'): Promise { - if (await fs.pathExists(path.resolve(outDir, 'libc++.a'))) return; - if (!await fs.pathExists(outDir)) await fs.mkdirp(outDir); + if (await fs.pathExists(path.resolve(outDir, 'libc++.a'))) { + return; + } + if (!await fs.pathExists(outDir)) { + await fs.mkdirp(outDir); + } d(`downloading libcxx-objects-linux-${targetArch}`); const objects = await downloadArtifact({ diff --git a/build/monaco/monaco.d.ts.recipe b/build/monaco/monaco.d.ts.recipe index 8cec618ef9e..bf4008cce71 100644 --- a/build/monaco/monaco.d.ts.recipe +++ b/build/monaco/monaco.d.ts.recipe @@ -42,7 +42,7 @@ declare namespace monaco { #include(vs/base/common/cancellation): CancellationTokenSource, CancellationToken #include(vs/base/common/uri): URI, UriComponents #include(vs/base/common/keyCodes): KeyCode -#include(vs/editor/common/standalone/standaloneBase): KeyMod +#include(vs/editor/common/services/editorBaseApi): KeyMod #include(vs/base/common/htmlContent): IMarkdownString #include(vs/base/browser/keyboardEvent): IKeyboardEvent #include(vs/base/browser/mouseEvent): IMouseEvent @@ -50,12 +50,12 @@ declare namespace monaco { #include(vs/editor/common/core/position): IPosition, Position #include(vs/editor/common/core/range): IRange, Range #include(vs/editor/common/core/selection): ISelection, Selection, SelectionDirection -#include(vs/editor/common/core/token): Token +#include(vs/editor/common/languages): Token } declare namespace monaco.editor { #include(vs/editor/browser/widget/diffNavigator): IDiffNavigator -#includeAll(vs/editor/standalone/browser/standaloneEditor;modes.=>languages.;editorCommon.=>): +#includeAll(vs/editor/standalone/browser/standaloneEditor;languages.Token=>Token): #include(vs/editor/standalone/common/standaloneTheme): BuiltinTheme, IStandaloneThemeData, IColors #include(vs/editor/common/languages/supports/tokenization): ITokenThemeRule #include(vs/editor/browser/services/webWorker): MonacoWebWorker, IWebWorkerOptions @@ -69,13 +69,18 @@ export interface ICommandHandler { #include(vs/editor/standalone/browser/colorizer): IColorizerOptions, IColorizerElementOptions #include(vs/base/common/scrollable): ScrollbarVisibility #include(vs/platform/theme/common/themeService): ThemeColor +#include(vs/editor/common/core/editOperation): ISingleEditOperation +#include(vs/editor/common/core/wordHelper): IWordAtPosition #includeAll(vs/editor/common/model): IScrollEvent -#includeAll(vs/editor/common/editorCommon;editorOptions.=>): IScrollEvent -#includeAll(vs/editor/common/model/textModelEvents): -#includeAll(vs/editor/common/controller/cursorEvents): +#include(vs/editor/common/diff/diffComputer): IChange, ICharChange, ILineChange +#include(vs/editor/common/core/dimension): IDimension +#includeAll(vs/editor/common/editorCommon): IScrollEvent +#includeAll(vs/editor/common/textModelEvents): +#includeAll(vs/editor/common/cursorEvents): #include(vs/platform/accessibility/common/accessibility): AccessibilitySupport #includeAll(vs/editor/common/config/editorOptions): -#includeAll(vs/editor/browser/editorBrowser;editorCommon.=>;editorOptions.=>): +#include(vs/editor/browser/config/editorConfiguration): IEditorConstructionOptions +#includeAll(vs/editor/browser/editorBrowser;editorCommon.=>): #include(vs/editor/common/config/fontInfo): FontInfo, BareFontInfo //compatibility: @@ -85,10 +90,10 @@ export type IModel = ITextModel; declare namespace monaco.languages { -#includeAll(vs/editor/standalone/browser/standaloneLanguages;modes.=>;editorCommon.=>editor.;model.=>editor.;IMarkerData=>editor.IMarkerData): +#includeAll(vs/editor/standalone/browser/standaloneLanguages;languages.=>;editorCommon.=>editor.;model.=>editor.;IMarkerData=>editor.IMarkerData): #includeAll(vs/editor/common/languages/languageConfiguration): -#includeAll(vs/editor/common/languages;editorCommon.IRange=>IRange;editorCommon.IPosition=>IPosition;editorCommon.=>editor.;IMarkerData=>editor.IMarkerData;model.=>editor.): -#include(vs/editor/common/services/language): ILanguageExtensionPoint +#includeAll(vs/editor/common/languages;IMarkerData=>editor.IMarkerData;ISingleEditOperation=>editor.ISingleEditOperation;model.=>editor.): Token +#include(vs/editor/common/languages/language): ILanguageExtensionPoint #includeAll(vs/editor/standalone/common/monarch/monarchTypes): } diff --git a/build/monaco/monaco.usage.recipe b/build/monaco/monaco.usage.recipe index 3c48da8d85a..3fab91065aa 100644 --- a/build/monaco/monaco.usage.recipe +++ b/build/monaco/monaco.usage.recipe @@ -4,7 +4,7 @@ import { ServiceIdentifier } from './vs/platform/instantiation/common/instantiation'; import { create as create1 } from './vs/base/common/worker/simpleWorker'; import { create as create2 } from './vs/editor/common/services/editorSimpleWorker'; -import { SyncDescriptor0, SyncDescriptor1, SyncDescriptor2, SyncDescriptor3, SyncDescriptor4, SyncDescriptor5, SyncDescriptor6, SyncDescriptor7, SyncDescriptor8 } from './vs/platform/instantiation/common/descriptors'; +import { SyncDescriptor0 } from './vs/platform/instantiation/common/descriptors'; import * as editorAPI from './vs/editor/editor.api'; (function () { @@ -16,25 +16,6 @@ import * as editorAPI from './vs/editor/editor.api'; // injection madness a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; - a = (>b).ctor; - a = (>b).bind; // exported API a = editorAPI.CancellationTokenSource; diff --git a/build/npm/dirs.js b/build/npm/dirs.js index 0f7ab5ff54e..4011050e466 100644 --- a/build/npm/dirs.js +++ b/build/npm/dirs.js @@ -33,6 +33,7 @@ exports.dirs = [ 'extensions/markdown-math', 'extensions/merge-conflict', 'extensions/microsoft-authentication', + 'extensions/notebook-renderers', 'extensions/npm', 'extensions/php-language-features', 'extensions/search-result', diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index 2433da29e86..bf2181cf9f7 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -62,6 +62,7 @@ for (let dir of dirs) { if (process.env['VSCODE_REMOTE_CC']) { env['CC'] = process.env['VSCODE_REMOTE_CC']; } if (process.env['VSCODE_REMOTE_CXX']) { env['CXX'] = process.env['VSCODE_REMOTE_CXX']; } if (process.env['CXXFLAGS']) { delete env['CXXFLAGS']; } + if (process.env['CFLAGS']) { delete env['CFLAGS']; } if (process.env['LDFLAGS']) { delete env['LDFLAGS']; } if (process.env['VSCODE_REMOTE_NODE_GYP']) { env['npm_config_node_gyp'] = process.env['VSCODE_REMOTE_NODE_GYP']; } opts = { env }; diff --git a/build/npm/preinstall.js b/build/npm/preinstall.js index bd698fc168b..406c8e51b12 100644 --- a/build/npm/preinstall.js +++ b/build/npm/preinstall.js @@ -86,19 +86,24 @@ function installHeaders() { return; } + // The node gyp package got installed using the above yarn command using the gyp/package.json + // file checked into our repository. So from that point it is save to construct the path + // to that executable const node_gyp = path.join(__dirname, 'gyp', 'node_modules', '.bin', 'node-gyp.cmd'); - const result = cp.execSync(`${node_gyp} list`, { encoding: 'utf8' }); - const versions = new Set(result.split(/\n/g).filter(line => !line.startsWith('gyp info')).map(value => `"${value}"`)); + const result = cp.execFileSync(node_gyp, ['list'], { encoding: 'utf8' }); + const versions = new Set(result.split(/\n/g).filter(line => !line.startsWith('gyp info')).map(value => value)); const local = getHeaderInfo(path.join(__dirname, '..', '..', '.yarnrc')); const remote = getHeaderInfo(path.join(__dirname, '..', '..', 'remote', '.yarnrc')); if (local !== undefined && !versions.has(local.target)) { - cp.execSync(`${node_gyp} install --dist-url ${local.disturl} ${local.target}`); + // Both disturl and target come from a file checked into our repository + cp.execFileSync(node_gyp, ['install', '--dist-url', local.disturl, local.target]); } if (remote !== undefined && !versions.has(remote.target)) { - cp.execSync(`${node_gyp} install --dist-url ${remote.disturl} ${remote.target}`); + // Both disturl and target come from a file checked into our repository + cp.execFileSync(node_gyp, ['install', '--dist-url', remote.disturl, remote.target]); } } @@ -110,11 +115,11 @@ function getHeaderInfo(rcFile) { const lines = fs.readFileSync(rcFile, 'utf8').split(/\r\n?/g); let disturl, target; for (const line of lines) { - let match = line.match(/\s*disturl\s*(.*)$/); + let match = line.match(/\s*disturl\s*\"(.*)\"\s*$/); if (match !== null && match.length >= 1) { disturl = match[1]; } - match = line.match(/\s*target\s*(.*)$/); + match = line.match(/\s*target\s*\"(.*)\"\s*$/); if (match !== null && match.length >= 1) { target = match[1]; } diff --git a/build/package.json b/build/package.json index afc18feacd9..eb85be5acaf 100644 --- a/build/package.json +++ b/build/package.json @@ -29,7 +29,7 @@ "@types/minimist": "^1.2.1", "@types/mkdirp": "^1.0.1", "@types/mocha": "^8.2.0", - "@types/node": "14.x", + "@types/node": "16.x", "@types/p-limit": "^2.2.0", "@types/plist": "^3.0.2", "@types/pump": "^1.0.1", @@ -41,8 +41,8 @@ "@types/underscore": "^1.8.9", "@types/webpack": "^4.41.25", "@types/xml2js": "0.0.33", - "@typescript-eslint/experimental-utils": "~2.13.0", - "@typescript-eslint/parser": "^3.3.0", + "@typescript-eslint/experimental-utils": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", "@vscode/iconv-lite-umd": "0.7.0", "applicationinsights": "1.4.2", "byline": "^5.0.0", @@ -66,9 +66,9 @@ "vscode-universal-bundler": "^0.0.2" }, "scripts": { - "compile": "tsc -p tsconfig.build.json", - "watch": "tsc -p tsconfig.build.json --watch", - "npmCheckJs": "tsc --noEmit" + "compile": "../node_modules/.bin/tsc -p tsconfig.build.json", + "watch": "../node_modules/.bin/tsc -p tsconfig.build.json --watch", + "npmCheckJs": "../node_modules/.bin/tsc --noEmit" }, "dependencies": {} } diff --git a/build/yarn.lock b/build/yarn.lock index 14c57b9171f..3ad6be82d9a 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -217,6 +217,27 @@ dependencies: cross-spawn "^7.0.1" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@opentelemetry/api@^1.0.1": version "1.0.3" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.0.3.tgz#13a12ae9e05c2a782f7b5e84c3cbfda4225eaf80" @@ -303,11 +324,6 @@ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/eslint@4.16.1": version "4.16.1" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-4.16.1.tgz#19730c9fcb66b6e44742d12b27a603fabfeb2f49" @@ -434,11 +450,16 @@ resolved "https://registry.yarnpkg.com/@types/js-beautify/-/js-beautify-1.8.0.tgz#0369d3d0e1f35a6aec07cb4da2ee2bcda111367c" integrity sha512-/siF86XrwDKLuHe8l7h6NhrAWgLdgqbxmjZv9NvGWmgYRZoTipkjKiWb0SQHy/jcR+ee0GvbG6uGd+LEBMGNvA== -"@types/json-schema@*", "@types/json-schema@^7.0.3": +"@types/json-schema@*": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + "@types/keyv@*": version "3.1.1" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" @@ -486,10 +507,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" integrity sha512-El3+WJk2D/ppWNd2X05aiP5l2k4EwF7KwheknQZls+I26eSICoWRhRIJ56jGgw2dqNGQ5LtNajmBU2ajS28EvQ== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/p-limit@^2.2.0": version "2.2.0" @@ -661,75 +682,102 @@ dependencies: "@types/node" "*" -"@typescript-eslint/experimental-utils@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== +"@typescript-eslint/experimental-utils@^5.10.0": + version "5.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.1.tgz#49fa5a7800ed08ea70aef14fccb14fbae85116ab" + integrity sha512-Ryeb8nkJa/1zKl8iujNtJC8tgj6PgaY0sDUnrTqbmC70nrKKkZaHfiRDTcqICmCSCEQyLQcJAoh0AukLaIaGTw== dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" + "@typescript-eslint/utils" "5.10.1" -"@typescript-eslint/experimental-utils@~2.13.0": - version "2.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.13.0.tgz#958614faa6f77599ee2b241740e0ea402482533d" - integrity sha512-+Hss3clwa6aNiC8ZjA45wEm4FutDV5HsVXPl/rDug1THq6gEtOYRGLqS3JlTk7mSnL5TbJz0LpEbzbPnKvY6sw== +"@typescript-eslint/parser@^5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.0.tgz#8f59e036f5f1cffc178cacbd5ccdd02aeb96c91c" + integrity sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw== dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.13.0" - eslint-scope "^5.0.0" + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/typescript-estree" "5.10.0" + debug "^4.3.2" -"@typescript-eslint/parser@^3.3.0": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" - integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== +"@typescript-eslint/scope-manager@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz#bb5d872e8b9e36203908595507fbc4d3105329cb" + integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.10.1" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== - -"@typescript-eslint/typescript-estree@2.13.0": - version "2.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.13.0.tgz#a2e746867da772c857c13853219fced10d2566bc" - integrity sha512-t21Mg5cc8T3ADEUGwDisHLIubgXKjuNRbkpzDMLb7/JMmgCe/gHM9FaaujokLey+gwTuLF5ndSQ7/EfQqrQx4g== +"@typescript-eslint/scope-manager@5.10.1": + version "5.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz#f0539c73804d2423506db2475352a4dec36cd809" + integrity sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg== dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash.unescape "4.0.1" - semver "^6.3.0" - tsutils "^3.17.1" + "@typescript-eslint/types" "5.10.1" + "@typescript-eslint/visitor-keys" "5.10.1" -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== - dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" +"@typescript-eslint/types@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.0.tgz#beb3cb345076f5b088afe996d57bcd1dfddaa75c" + integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ== -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== +"@typescript-eslint/types@5.10.1": + version "5.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.1.tgz#dca9bd4cb8c067fc85304a31f38ec4766ba2d1ea" + integrity sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q== + +"@typescript-eslint/typescript-estree@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz#4be24a3dea0f930bb1397c46187d0efdd955a224" + integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA== dependencies: - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@5.10.1": + version "5.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz#b268e67be0553f8790ba3fe87113282977adda15" + integrity sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ== + dependencies: + "@typescript-eslint/types" "5.10.1" + "@typescript-eslint/visitor-keys" "5.10.1" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.10.1": + version "5.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.1.tgz#fa682a33af47080ba2c4368ee0ad2128213a1196" + integrity sha512-RRmlITiUbLuTRtn/gcPRi4202niF+q7ylFLCKu4c+O/PcpRvZ/nAUwQ2G00bZgpWkhrNLNnvhZLbDn8Ml0qsQw== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.10.1" + "@typescript-eslint/types" "5.10.1" + "@typescript-eslint/typescript-estree" "5.10.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz#770215497ad67cd15a572b52089991d5dfe06281" + integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ== + dependencies: + "@typescript-eslint/types" "5.10.0" + eslint-visitor-keys "^3.0.0" + +"@typescript-eslint/visitor-keys@5.10.1": + version "5.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz#29102de692f59d7d34ecc457ed59ab5fc558010b" + integrity sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ== + dependencies: + "@typescript-eslint/types" "5.10.1" + eslint-visitor-keys "^3.0.0" "@vscode/iconv-lite-umd@0.7.0": version "0.7.0" @@ -797,6 +845,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + asar@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" @@ -887,6 +940,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -1248,6 +1308,13 @@ dir-compare@^2.4.0: commander "2.9.0" minimatch "3.0.4" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + dom-serializer@^1.0.1, dom-serializer@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" @@ -1459,38 +1526,48 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0: +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1" + integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - eslint-visitor-keys "^1.1.0" + estraverse "^5.2.0" -eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + events@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" @@ -1515,11 +1592,29 @@ extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -1527,6 +1622,13 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + follow-redirects@^1.14.0: version "1.14.7" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" @@ -1602,6 +1704,13 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^7.0.6: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -1656,6 +1765,18 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + got@11.8.1: version "11.8.1" resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d" @@ -1775,6 +1896,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1817,6 +1943,18 @@ is-glob@^4.0.1: dependencies: is-extglob "^2.1.1" +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -2017,11 +2155,6 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash.unescape@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" - integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= - lodash@^4.17.10, lodash@^4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -2067,6 +2200,19 @@ mdurl@^1.0.1: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + mime-db@1.45.0: version "1.45.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" @@ -2147,9 +2293,11 @@ node-abort-controller@^1.2.0: integrity sha512-79PYeJuj6S9+yOHirR0JBLFOgjB6sQCir10uN6xRx25iD+ZD4ULqgRn3MwWBRaQGB0vEgReJzWwJo42T1R6YbQ== node-fetch@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" normalize-path@^3.0.0: version "3.0.0" @@ -2266,6 +2414,11 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -2276,6 +2429,11 @@ picomatch@^2.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -2364,6 +2522,11 @@ qs@^6.9.1: dependencies: side-channel "^1.0.4" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -2418,6 +2581,11 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -2437,6 +2605,13 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + safe-buffer@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -2472,7 +2647,7 @@ semver@^5.4.1, semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.2.0, semver@^6.3.0: +semver@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -2484,6 +2659,13 @@ semver@^7.3.2: dependencies: lru-cache "^6.0.0" +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -2517,6 +2699,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -2592,6 +2779,13 @@ to-readable-stream@^1.0.0: resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -2601,6 +2795,11 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + tslib@^1.8.1: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -2616,10 +2815,10 @@ tslib@^2.2.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -2740,6 +2939,19 @@ vscode-universal-bundler@^0.0.2: dir-compare "^2.4.0" fs-extra "^9.0.1" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" diff --git a/cgmanifest.json b/cgmanifest.json index 62bb0a3718d..268b30dc504 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "chromium", "repositoryUrl": "https://chromium.googlesource.com/chromium/src", - "commitHash": "8a33e05d162c4f39afa2dcb150e8c2548aa4ccea" + "commitHash": "da1918b52890268754b96fdbca4ae9a79bd2fe11" } }, "licenseDetail": [ @@ -40,7 +40,7 @@ "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ], "isOnlyProductionDependency": true, - "version": "91.0.4472.164" + "version": "96.0.4664.110" }, { "component": { @@ -48,11 +48,11 @@ "git": { "name": "nodejs", "repositoryUrl": "https://github.com/nodejs/node", - "commitHash": "bd60e93357a118204ea238d94e7a9e4209d93062" + "commitHash": "711e073596f29b047086e2f3d4ab3706b98462f7" } }, "isOnlyProductionDependency": true, - "version": "14.16.0" + "version": "16.9.1" }, { "component": { @@ -60,12 +60,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "e64966641c6aa10450ae1122efd3dac1f29eba21" + "commitHash": "b1ffac5969d0533a479794b909cab7429299bf00" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "13.5.1" + "version": "16.0.8" }, { "component": { diff --git a/extensions/clojure/cgmanifest.json b/extensions/clojure/cgmanifest.json index 3a72fefb369..c13821aba02 100644 --- a/extensions/clojure/cgmanifest.json +++ b/extensions/clojure/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "atom/language-clojure", "repositoryUrl": "https://github.com/atom/language-clojure", - "commitHash": "de877502aa4a77ccdc2c7f0c9180436aea3effff" + "commitHash": "45bdb881501d0b8f8b707ca1d3fcc8b4b99fca03" } }, "license": "MIT", - "version": "0.22.7", + "version": "0.22.8", "description": "The file syntaxes/clojure.tmLanguage.json was derived from the Atom package https://github.com/atom/language-clojure which was originally converted from the TextMate bundle https://github.com/mmcgrana/textmate-clojure." } ], diff --git a/extensions/clojure/syntaxes/clojure.tmLanguage.json b/extensions/clojure/syntaxes/clojure.tmLanguage.json index 29c25edfa24..6a4ab390a77 100644 --- a/extensions/clojure/syntaxes/clojure.tmLanguage.json +++ b/extensions/clojure/syntaxes/clojure.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/atom/language-clojure/commit/de877502aa4a77ccdc2c7f0c9180436aea3effff", + "version": "https://github.com/atom/language-clojure/commit/45bdb881501d0b8f8b707ca1d3fcc8b4b99fca03", "name": "Clojure", "scopeName": "source.clojure", "patterns": [ @@ -79,35 +79,31 @@ "name": "constant.language.boolean.clojure" }, { - "match": "(-?\\d+/\\d+)", + "match": "(##(?:Inf|-Inf|NaN))", + "name": "constant.numeric.symbol.clojure" + }, + { + "match": "([-+]?\\d+/\\d+)", "name": "constant.numeric.ratio.clojure" }, { - "match": "(-?\\d+[rR]\\w+)", + "match": "([-+]?(?:(?:3[0-6])|(?:[12]\\d)|[2-9])[rR][0-9A-Za-z]+N?)", "name": "constant.numeric.arbitrary-radix.clojure" }, { - "match": "(-?0[xX][0-9a-fA-F]+)", + "match": "([-+]?0[xX][0-9a-fA-F]+N?)", "name": "constant.numeric.hexadecimal.clojure" }, { - "match": "(-?0\\d+)", + "match": "([-+]?0[0-7]+N?)", "name": "constant.numeric.octal.clojure" }, { - "match": "(-?\\d+\\.\\d+([eE][+-]?\\d+)?M)", - "name": "constant.numeric.bigdecimal.clojure" - }, - { - "match": "(-?\\d+\\.\\d+([eE][+-]?\\d+)?)", + "match": "([-+]?[0-9]+(?:(\\.|(?=[eEM]))[0-9]*([eE][-+]?[0-9]+)?)M?)", "name": "constant.numeric.double.clojure" }, { - "match": "(-?\\d+N)", - "name": "constant.numeric.bigint.clojure" - }, - { - "match": "(-?\\d+)", + "match": "([-+]?\\d+N?)", "name": "constant.numeric.long.clojure" }, { diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index a7b71cd05c8..f8dae16b764 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -144,7 +144,7 @@ ] }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/configuration-editing/schemas/devContainer.schema.generated.json b/extensions/configuration-editing/schemas/devContainer.schema.generated.json index b8a6d3cf5a3..936ea50ce7a 100644 --- a/extensions/configuration-editing/schemas/devContainer.schema.generated.json +++ b/extensions/configuration-editing/schemas/devContainer.schema.generated.json @@ -109,7 +109,7 @@ }, "name": { "type": "string", - "description": "A name to show for the workspace folder." + "description": "A name for the dev container displayed in the UI." }, "extensions": { "type": "array", @@ -375,7 +375,7 @@ "loginInteractiveShell", "interactiveShell" ], - "description": "User environment probe to run. The default is none." + "description": "User environment probe to run. The default is \"loginInteractiveShell\"." }, "codespaces": { "type": "object", @@ -512,7 +512,7 @@ }, "name": { "type": "string", - "description": "A name to show for the workspace folder." + "description": "A name for the dev container displayed in the UI." }, "extensions": { "type": "array", @@ -778,7 +778,7 @@ "loginInteractiveShell", "interactiveShell" ], - "description": "User environment probe to run. The default is none." + "description": "User environment probe to run. The default is \"loginInteractiveShell\"." }, "codespaces": { "type": "object", @@ -881,7 +881,7 @@ }, "name": { "type": "string", - "description": "A name to show for the workspace folder." + "description": "A name for the dev container displayed in the UI." }, "extensions": { "type": "array", @@ -1147,7 +1147,7 @@ "loginInteractiveShell", "interactiveShell" ], - "description": "User environment probe to run. The default is none." + "description": "User environment probe to run. The default is \"loginInteractiveShell\"." }, "codespaces": { "type": "object", @@ -1224,7 +1224,7 @@ }, "name": { "type": "string", - "description": "A name to show for the workspace folder." + "description": "A name for the dev container displayed in the UI." }, "extensions": { "type": "array", @@ -1490,7 +1490,7 @@ "loginInteractiveShell", "interactiveShell" ], - "description": "User environment probe to run. The default is none." + "description": "User environment probe to run. The default is \"loginInteractiveShell\"." }, "codespaces": { "type": "object", @@ -1532,7 +1532,7 @@ "properties": { "name": { "type": "string", - "description": "A name to show for the workspace folder." + "description": "A name for the dev container displayed in the UI." }, "extensions": { "type": "array", @@ -1798,7 +1798,7 @@ "loginInteractiveShell", "interactiveShell" ], - "description": "User environment probe to run. The default is none." + "description": "User environment probe to run. The default is \"loginInteractiveShell\"." }, "codespaces": { "type": "object", diff --git a/extensions/configuration-editing/schemas/devContainer.schema.src.json b/extensions/configuration-editing/schemas/devContainer.schema.src.json index 7a11e21a01b..1e1e6c860aa 100644 --- a/extensions/configuration-editing/schemas/devContainer.schema.src.json +++ b/extensions/configuration-editing/schemas/devContainer.schema.src.json @@ -9,7 +9,7 @@ "properties": { "name": { "type": "string", - "description": "A name to show for the workspace folder." + "description": "A name for the dev container displayed in the UI." }, "extensions": { "type": "array", @@ -274,7 +274,7 @@ "loginInteractiveShell", "interactiveShell" ], - "description": "User environment probe to run. The default is none." + "description": "User environment probe to run. The default is \"loginInteractiveShell\"." }, "codespaces": { "type": "object", diff --git a/extensions/configuration-editing/src/configurationEditingMain.ts b/extensions/configuration-editing/src/configurationEditingMain.ts index 9e7f2d247de..cc8fc81576f 100644 --- a/extensions/configuration-editing/src/configurationEditingMain.ts +++ b/extensions/configuration-editing/src/configurationEditingMain.ts @@ -142,7 +142,7 @@ vscode.languages.registerDocumentSymbolProvider({ pattern: '**/launch.json', lan }, { label: 'Launch Targets' }); function registerContextKeyCompletions(): vscode.Disposable { - type ContextKeyInfo = { key: string, type?: string, description?: string }; + type ContextKeyInfo = { key: string; type?: string; description?: string }; const paths = new Map([ [{ language: 'jsonc', pattern: '**/keybindings.json' }, [ diff --git a/extensions/configuration-editing/src/settingsDocumentHelper.ts b/extensions/configuration-editing/src/settingsDocumentHelper.ts index 11282899b81..d5928592b5a 100644 --- a/extensions/configuration-editing/src/settingsDocumentHelper.ts +++ b/extensions/configuration-editing/src/settingsDocumentHelper.ts @@ -277,7 +277,7 @@ export class SettingsDocument { return item; } - private newSnippetCompletionItem(o: { label: string; documentation?: string; snippet: string; range: vscode.Range; }): vscode.CompletionItem { + private newSnippetCompletionItem(o: { label: string; documentation?: string; snippet: string; range: vscode.Range }): vscode.CompletionItem { const item = new vscode.CompletionItem(o.label); item.kind = vscode.CompletionItemKind.Value; item.documentation = o.documentation; diff --git a/extensions/configuration-editing/yarn.lock b/extensions/configuration-editing/yarn.lock index d4882d39e4b..f7ac959fc09 100644 --- a/extensions/configuration-editing/yarn.lock +++ b/extensions/configuration-editing/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== jsonc-parser@^2.2.1: version "2.2.1" diff --git a/extensions/cpp/cgmanifest.json b/extensions/cpp/cgmanifest.json index 51ed002f31e..f2bf269a5f4 100644 --- a/extensions/cpp/cgmanifest.json +++ b/extensions/cpp/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "jeff-hykin/cpp-textmate-grammar", "repositoryUrl": "https://github.com/jeff-hykin/cpp-textmate-grammar", - "commitHash": "0ef79f098ed80ce5a86be4ed40f99ebcdbac4895" + "commitHash": "db3f4e4a5d8335b2f6d689bec490c23f8313630f" } }, "license": "MIT", diff --git a/extensions/csharp/cgmanifest.json b/extensions/csharp/cgmanifest.json index 505f53fe37f..8b65e5000f9 100644 --- a/extensions/csharp/cgmanifest.json +++ b/extensions/csharp/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "dotnet/csharp-tmLanguage", "repositoryUrl": "https://github.com/dotnet/csharp-tmLanguage", - "commitHash": "483d25bfa2b96474b55d2e9e4d1ca2acbd542034" + "commitHash": "16612717ccd557383c0c821d7b6ae6662492ffde" } }, "license": "MIT", diff --git a/extensions/csharp/syntaxes/csharp.tmLanguage.json b/extensions/csharp/syntaxes/csharp.tmLanguage.json index a9bb170e9dd..f6317202d2e 100644 --- a/extensions/csharp/syntaxes/csharp.tmLanguage.json +++ b/extensions/csharp/syntaxes/csharp.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/csharp-tmLanguage/commit/483d25bfa2b96474b55d2e9e4d1ca2acbd542034", + "version": "https://github.com/dotnet/csharp-tmLanguage/commit/16612717ccd557383c0c821d7b6ae6662492ffde", "name": "C#", "scopeName": "source.cs", "patterns": [ @@ -997,7 +997,7 @@ "name": "keyword.other.where.cs" }, "2": { - "name": "storage.type.cs" + "name": "entity.name.type.type-parameter.cs" }, "3": { "name": "punctuation.separator.colon.cs" @@ -4120,7 +4120,7 @@ "match": "(@?[_[:alpha:]][_[:alnum:]]*)\\s*(\\.)", "captures": { "1": { - "name": "storage.type.cs" + "name": "entity.name.type.cs" }, "2": { "name": "punctuation.accessor.cs" @@ -4134,12 +4134,12 @@ "name": "punctuation.accessor.cs" }, "2": { - "name": "storage.type.cs" + "name": "entity.name.type.cs" } } }, { - "name": "storage.type.cs", + "name": "entity.name.type.cs", "match": "@?[_[:alpha:]][_[:alnum:]]*" } ] diff --git a/extensions/css-language-features/client/src/browser/cssClientMain.ts b/extensions/css-language-features/client/src/browser/cssClientMain.ts index 2a5e3e1f2c2..0cfde9025f3 100644 --- a/extensions/css-language-features/client/src/browser/cssClientMain.ts +++ b/extensions/css-language-features/client/src/browser/cssClientMain.ts @@ -12,7 +12,7 @@ declare const Worker: { new(stringUrl: string): any; }; declare const TextDecoder: { - new(encoding?: string): { decode(buffer: ArrayBuffer): string; }; + new(encoding?: string): { decode(buffer: ArrayBuffer): string }; }; // this method is called when vs code is activated diff --git a/extensions/css-language-features/client/src/cssClient.ts b/extensions/css-language-features/client/src/cssClient.ts index ca97338f35f..8cf472d0a16 100644 --- a/extensions/css-language-features/client/src/cssClient.ts +++ b/extensions/css-language-features/client/src/cssClient.ts @@ -18,7 +18,7 @@ const localize = nls.loadMessageBundle(); export type LanguageClientConstructor = (name: string, description: string, clientOptions: LanguageClientOptions) => CommonLanguageClient; export interface Runtime { - TextDecoder: { new(encoding?: string): { decode(buffer: ArrayBuffer): string; } }; + TextDecoder: { new(encoding?: string): { decode(buffer: ArrayBuffer): string } }; fs?: RequestService; } diff --git a/extensions/css-language-features/client/src/node/nodeFs.ts b/extensions/css-language-features/client/src/node/nodeFs.ts index 0b572018884..e0d3f9e1403 100644 --- a/extensions/css-language-features/client/src/node/nodeFs.ts +++ b/extensions/css-language-features/client/src/node/nodeFs.ts @@ -14,7 +14,7 @@ export function getNodeFSRequestService(): RequestService { } } return { - getContent(location: string, encoding?: string) { + getContent(location: string, encoding?: BufferEncoding) { ensureFileUri(location); return new Promise((c, e) => { const uri = Uri.parse(location); diff --git a/extensions/css-language-features/client/src/requests.ts b/extensions/css-language-features/client/src/requests.ts index f06ce978c64..6aea3ab8fad 100644 --- a/extensions/css-language-features/client/src/requests.ts +++ b/extensions/css-language-features/client/src/requests.ts @@ -8,7 +8,7 @@ import { RequestType, CommonLanguageClient } from 'vscode-languageclient'; import { Runtime } from './cssClient'; export namespace FsContentRequest { - export const type: RequestType<{ uri: string; encoding?: string; }, string, any> = new RequestType('fs/content'); + export const type: RequestType<{ uri: string; encoding?: string }, string, any> = new RequestType('fs/content'); } export namespace FsStatRequest { export const type: RequestType = new RequestType('fs/stat'); @@ -19,7 +19,7 @@ export namespace FsReadDirRequest { } export function serveFileSystemRequests(client: CommonLanguageClient, runtime: Runtime) { - client.onRequest(FsContentRequest.type, (param: { uri: string; encoding?: string; }) => { + client.onRequest(FsContentRequest.type, (param: { uri: string; encoding?: string }) => { const uri = Uri.parse(param.uri); if (uri.scheme === 'file' && runtime.fs) { return runtime.fs.getContent(param.uri); diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index 88994a67f44..202fe248ad9 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -849,10 +849,10 @@ "dependencies": { "vscode-languageclient": "^7.0.0", "vscode-nls": "^5.0.0", - "vscode-uri": "^3.0.2" + "vscode-uri": "^3.0.3" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 8d7a90e78a7..38bac1f1a3a 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -10,13 +10,13 @@ "main": "./out/node/cssServerMain", "browser": "./dist/browser/cssServerMain", "dependencies": { - "vscode-css-languageservice": "^5.1.9", + "vscode-css-languageservice": "^5.1.12", "vscode-languageserver": "^7.0.0", - "vscode-uri": "^3.0.2" + "vscode-uri": "^3.0.3" }, "devDependencies": { "@types/mocha": "^8.2.0", - "@types/node": "14.x" + "@types/node": "16.x" }, "scripts": { "compile": "gulp compile-extension:css-language-features-server", diff --git a/extensions/css-language-features/server/src/cssServer.ts b/extensions/css-language-features/server/src/cssServer.ts index 2108b64dd2c..89810d0ae41 100644 --- a/extensions/css-language-features/server/src/cssServer.ts +++ b/extensions/css-language-features/server/src/cssServer.ts @@ -30,7 +30,7 @@ export interface RuntimeEnvironment { readonly timer: { setImmediate(callback: (...args: any[]) => void, ...args: any[]): Disposable; setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): Disposable; - } + }; } export function startServer(connection: Connection, runtime: RuntimeEnvironment) { diff --git a/extensions/css-language-features/server/src/languageModelCache.ts b/extensions/css-language-features/server/src/languageModelCache.ts index d069af0f7b6..343d57a9ad6 100644 --- a/extensions/css-language-features/server/src/languageModelCache.ts +++ b/extensions/css-language-features/server/src/languageModelCache.ts @@ -12,7 +12,7 @@ export interface LanguageModelCache { } export function getLanguageModelCache(maxEntries: number, cleanupIntervalTimeInSec: number, parse: (document: TextDocument) => T): LanguageModelCache { - let languageModels: { [uri: string]: { version: number, languageId: string, cTime: number, languageModel: T } } = {}; + let languageModels: { [uri: string]: { version: number; languageId: string; cTime: number; languageModel: T } } = {}; let nModels = 0; let cleanupInterval: NodeJS.Timer | undefined = undefined; diff --git a/extensions/css-language-features/server/src/node/nodeFs.ts b/extensions/css-language-features/server/src/node/nodeFs.ts index c72617e3af1..35e55622dc9 100644 --- a/extensions/css-language-features/server/src/node/nodeFs.ts +++ b/extensions/css-language-features/server/src/node/nodeFs.ts @@ -16,7 +16,7 @@ export function getNodeFSRequestService(): RequestService { } } return { - getContent(location: string, encoding?: string) { + getContent(location: string, encoding?: BufferEncoding) { ensureFileUri(location); return new Promise((c, e) => { const uri = Uri.parse(location); diff --git a/extensions/css-language-features/server/src/requests.ts b/extensions/css-language-features/server/src/requests.ts index 8ace0b0c899..0726af35c56 100644 --- a/extensions/css-language-features/server/src/requests.ts +++ b/extensions/css-language-features/server/src/requests.ts @@ -7,7 +7,7 @@ import { RequestType, Connection } from 'vscode-languageserver'; import { RuntimeEnvironment } from './cssServer'; export namespace FsContentRequest { - export const type: RequestType<{ uri: string; encoding?: string; }, string, any> = new RequestType('fs/content'); + export const type: RequestType<{ uri: string; encoding?: string }, string, any> = new RequestType('fs/content'); } export namespace FsStatRequest { export const type: RequestType = new RequestType('fs/stat'); diff --git a/extensions/css-language-features/server/src/test/completion.test.ts b/extensions/css-language-features/server/src/test/completion.test.ts index ec336448a50..6881dd0e3e3 100644 --- a/extensions/css-language-features/server/src/test/completion.test.ts +++ b/extensions/css-language-features/server/src/test/completion.test.ts @@ -31,7 +31,7 @@ suite('Completions', () => { } }; - async function assertCompletions(value: string, expected: { count?: number, items?: ItemDescription[] }, testUri: string, workspaceFolders?: WorkspaceFolder[], lang: string = 'css'): Promise { + async function assertCompletions(value: string, expected: { count?: number; items?: ItemDescription[] }, testUri: string, workspaceFolders?: WorkspaceFolder[], lang: string = 'css'): Promise { const offset = value.indexOf('|'); value = value.substr(0, offset) + value.substr(offset + 1); diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 9c35cda0128..bf28937ff50 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -7,15 +7,15 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== -vscode-css-languageservice@^5.1.9: - version "5.1.9" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.9.tgz#9d473e5c61fa6d4d62719d9b8715ff6c644bf14e" - integrity sha512-/tFOWeZBL3Oc9Zc+2MAi3rEwiXJTSZsvjB+M7nSjWLbGPUIjukUA7YzLgsBoUfR35sPJYnXWUkL56PdfIYM8GA== +vscode-css-languageservice@^5.1.12: + version "5.1.12" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.12.tgz#eed3a6a1bb8a7a70636ef07cd742a034c71635a1" + integrity sha512-293C5C2732Rbhh3opTs+nQBpC5Dd+oYrEA8lc0OWdyt40oYmJ331FV7NMF1SLFSIcOFB5XveLiWUZak2oyc49Q== dependencies: vscode-languageserver-textdocument "^1.0.1" vscode-languageserver-types "^3.16.0" @@ -61,3 +61,8 @@ vscode-uri@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0" integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA== + +vscode-uri@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" + integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== diff --git a/extensions/css-language-features/yarn.lock b/extensions/css-language-features/yarn.lock index 2e524319229..60ba7c2dcc3 100644 --- a/extensions/css-language-features/yarn.lock +++ b/extensions/css-language-features/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== balanced-match@^1.0.0: version "1.0.0" @@ -78,10 +78,10 @@ vscode-nls@^5.0.0: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA== -vscode-uri@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0" - integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA== +vscode-uri@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" + integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== yallist@^4.0.0: version "4.0.0" diff --git a/extensions/debug-auto-launch/package.json b/extensions/debug-auto-launch/package.json index b0c765fa2cc..82c9054c456 100644 --- a/extensions/debug-auto-launch/package.json +++ b/extensions/debug-auto-launch/package.json @@ -36,7 +36,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "prettier": { "printWidth": 100, diff --git a/extensions/debug-auto-launch/yarn.lock b/extensions/debug-auto-launch/yarn.lock index f7a30098ef4..22c406bc73f 100644 --- a/extensions/debug-auto-launch/yarn.lock +++ b/extensions/debug-auto-launch/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/debug-server-ready/package.json b/extensions/debug-server-ready/package.json index 64aa227aa53..29cee88c0c5 100644 --- a/extensions/debug-server-ready/package.json +++ b/extensions/debug-server-ready/package.json @@ -153,7 +153,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/debug-server-ready/yarn.lock b/extensions/debug-server-ready/yarn.lock index f7a30098ef4..22c406bc73f 100644 --- a/extensions/debug-server-ready/yarn.lock +++ b/extensions/debug-server-ready/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 4b303046a26..659be1e0fce 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -500,7 +500,7 @@ "deps": "yarn add @vscode/emmet-helper" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "dependencies": { "@emmetio/abbreviation": "^2.2.0", diff --git a/extensions/emmet/src/imageSizeHelper.ts b/extensions/emmet/src/imageSizeHelper.ts index b012ab624ee..28817dfbf39 100644 --- a/extensions/emmet/src/imageSizeHelper.ts +++ b/extensions/emmet/src/imageSizeHelper.ts @@ -14,10 +14,10 @@ import { ISizeCalculationResult } from 'image-size/dist/types/interface'; const reUrl = /^https?:/; export type ImageInfoWithScale = { - realWidth: number, - realHeight: number, - width: number, - height: number + realWidth: number; + realHeight: number; + width: number; + height: number; }; /** diff --git a/extensions/emmet/src/updateTag.ts b/extensions/emmet/src/updateTag.ts index bfb76671993..d58cd31505c 100644 --- a/extensions/emmet/src/updateTag.ts +++ b/extensions/emmet/src/updateTag.ts @@ -9,8 +9,8 @@ import { HtmlNode as HtmlFlatNode } from 'EmmetFlatNode'; import { getRootNode } from './parseDocument'; interface TagRange { - name: string, - range: vscode.Range + name: string; + range: vscode.Range; } export async function updateTag(tagName: string | undefined): Promise { diff --git a/extensions/emmet/yarn.lock b/extensions/emmet/yarn.lock index 84ad50583e8..a8d2f7f2649 100644 --- a/extensions/emmet/yarn.lock +++ b/extensions/emmet/yarn.lock @@ -53,10 +53,10 @@ resolved "https://registry.yarnpkg.com/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz#46cffea119a0a003312a21c2d9b5628cb5fcd442" integrity sha1-Rs/+oRmgoAMxKiHC2bVijLX81EI= -"@types/node@14.x": - version "14.18.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.0.tgz#98df2397f6936bfbff4f089e40e06fa5dd88d32a" - integrity sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@vscode/emmet-helper@^2.3.0": version "2.8.3" diff --git a/extensions/extension-editing/package.json b/extensions/extension-editing/package.json index dbc18aa142b..abceee2bc7d 100644 --- a/extensions/extension-editing/package.json +++ b/extensions/extension-editing/package.json @@ -68,7 +68,7 @@ }, "devDependencies": { "@types/markdown-it": "0.0.2", - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/extension-editing/src/packageDocumentHelper.ts b/extensions/extension-editing/src/packageDocumentHelper.ts index cbc86801492..1df613ed645 100644 --- a/extensions/extension-editing/src/packageDocumentHelper.ts +++ b/extensions/extension-editing/src/packageDocumentHelper.ts @@ -74,7 +74,7 @@ export class PackageDocument { return item; } - private newSnippetCompletionItem(o: { label: string; documentation?: string; snippet: string; range: vscode.Range; }): vscode.CompletionItem { + private newSnippetCompletionItem(o: { label: string; documentation?: string; snippet: string; range: vscode.Range }): vscode.CompletionItem { const item = new vscode.CompletionItem(o.label); item.kind = vscode.CompletionItemKind.Value; item.documentation = o.documentation; diff --git a/extensions/extension-editing/yarn.lock b/extensions/extension-editing/yarn.lock index 171c0baaa6f..ac87f5e2686 100644 --- a/extensions/extension-editing/yarn.lock +++ b/extensions/extension-editing/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.2.tgz#5d9ad19e6e6508cdd2f2596df86fd0aade598660" integrity sha1-XZrRnm5lCM3S8llt+G/Qqt5ZhmA= -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/node@^6.0.46": version "6.0.78" diff --git a/extensions/fsharp/cgmanifest.json b/extensions/fsharp/cgmanifest.json index c6bf0cd4139..29d6ae5aadd 100644 --- a/extensions/fsharp/cgmanifest.json +++ b/extensions/fsharp/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "ionide/ionide-fsgrammar", "repositoryUrl": "https://github.com/ionide/ionide-fsgrammar", - "commitHash": "bba27391e61090035449b5c1e5c4b9d396bc4c9b" + "commitHash": "3311701c243d6ed5b080a2ee16ada51540a08c50" } }, "license": "MIT", diff --git a/extensions/fsharp/syntaxes/fsharp.tmLanguage.json b/extensions/fsharp/syntaxes/fsharp.tmLanguage.json index c388ab00750..b4d2523b3e1 100644 --- a/extensions/fsharp/syntaxes/fsharp.tmLanguage.json +++ b/extensions/fsharp/syntaxes/fsharp.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/ionide/ionide-fsgrammar/commit/bba27391e61090035449b5c1e5c4b9d396bc4c9b", + "version": "https://github.com/ionide/ionide-fsgrammar/commit/3311701c243d6ed5b080a2ee16ada51540a08c50", "name": "fsharp", "scopeName": "source.fsharp", "patterns": [ @@ -525,6 +525,15 @@ }, "comments": { "patterns": [ + { + "name": "comment.literate.command.fsharp", + "match": "(\\(\\*{3}.*\\*{3}\\))", + "beginCaptures": { + "1": { + "name": "comment.block.fsharp" + } + } + }, { "name": "comment.block.markdown.fsharp", "begin": "^\\s*(\\(\\*\\*(?!\\)))((?!\\*\\)).)*$", diff --git a/extensions/git-base/package.json b/extensions/git-base/package.json index 3fc19c587ff..acc95e1316c 100644 --- a/extensions/git-base/package.json +++ b/extensions/git-base/package.json @@ -102,7 +102,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/git-base/src/remoteSource.ts b/extensions/git-base/src/remoteSource.ts index 8f51ad0d399..50dec70863e 100644 --- a/extensions/git-base/src/remoteSource.ts +++ b/extensions/git-base/src/remoteSource.ts @@ -81,7 +81,7 @@ class RemoteSourceProviderQuickPick { export async function pickRemoteSource(model: Model, options: PickRemoteSourceOptions & { branch?: false | undefined }): Promise; export async function pickRemoteSource(model: Model, options: PickRemoteSourceOptions & { branch: true }): Promise; export async function pickRemoteSource(model: Model, options: PickRemoteSourceOptions = {}): Promise { - const quickpick = window.createQuickPick<(QuickPickItem & { provider?: RemoteSourceProvider, url?: string })>(); + const quickpick = window.createQuickPick<(QuickPickItem & { provider?: RemoteSourceProvider; url?: string })>(); quickpick.ignoreFocusOut = true; if (options.providerName) { diff --git a/extensions/git-base/yarn.lock b/extensions/git-base/yarn.lock index 22e3e094fdc..3244e2ea667 100644 --- a/extensions/git-base/yarn.lock +++ b/extensions/git-base/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.17.33" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.33.tgz#011ee28e38dc7aee1be032ceadf6332a0ab15b12" - integrity sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g== +"@types/node@16.x": + version "16.11.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.21.tgz#474d7589a30afcf5291f59bd49cca9ad171ffde4" + integrity sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A== vscode-nls@^4.0.0: version "4.1.2" diff --git a/extensions/git/package.json b/extensions/git/package.json index ceb577f2af0..3efa9e8a1d3 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -15,6 +15,7 @@ "scmActionButton", "scmSelectedProvider", "scmValidation", + "tabs", "timeline" ], "categories": [ @@ -2113,6 +2114,12 @@ "default": true, "description": "%config.confirmNoVerifyCommit%" }, + "git.closeDiffOnOperation": { + "type": "boolean", + "scope": "resource", + "default": false, + "description": "%config.closeDiffOnOperation%" + }, "git.openDiffOnClick": { "type": "boolean", "scope": "resource", @@ -2218,11 +2225,42 @@ "default": 10000, "description": "%config.statusLimit%" }, + "git.experimental.installGuide": { + "type": "string", + "enum": [ + "default", + "download" + ], + "tags": ["experimental"], + "scope": "machine", + "description": "%config.experimental.installGuide%", + "default": "default" + }, + "git.repositoryScanIgnoredFolders": { + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "node_modules" + ], + "scope": "resource", + "markdownDescription": "%config.repositoryScanIgnoredFolders%" + }, "git.repositoryScanMaxDepth": { "type": "number", "scope": "resource", "default": 1, "markdownDescription": "%config.repositoryScanMaxDepth%" + }, + "git.commandsToLog": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "scope": "resource", + "markdownDescription": "%config.commandsToLog%" } } }, @@ -2335,10 +2373,30 @@ "contents": "%view.workbench.scm.disabled%", "when": "!config.git.enabled" }, + { + "view": "scm", + "contents": "%view.workbench.scm.missing.guide%", + "when": "config.git.enabled && git.missing && config.git.experimental.installGuide == download" + }, + { + "view": "scm", + "contents": "%view.workbench.scm.missing.guide.mac%", + "when": "config.git.enabled && git.missing && config.git.experimental.installGuide == download && isMac" + }, + { + "view": "scm", + "contents": "%view.workbench.scm.missing.guide.windows%", + "when": "config.git.enabled && git.missing && config.git.experimental.installGuide == download && isWindows" + }, + { + "view": "scm", + "contents": "%view.workbench.scm.missing.guide.windows%", + "when": "config.git.enabled && git.missing && config.git.experimental.installGuide == download && isLinux" + }, { "view": "scm", "contents": "%view.workbench.scm.missing%", - "when": "config.git.enabled && git.missing" + "when": "config.git.enabled && git.missing && config.git.experimental.installGuide == default" }, { "view": "scm", @@ -2389,7 +2447,7 @@ "byline": "^5.0.0", "file-type": "^7.2.0", "jschardet": "3.0.0", - "vscode-extension-telemetry": "0.4.4", + "@vscode/extension-telemetry": "0.4.6", "vscode-nls": "^4.0.0", "vscode-uri": "^2.0.0", "which": "^1.3.0" @@ -2398,7 +2456,7 @@ "@types/byline": "4.2.31", "@types/file-type": "^5.2.1", "@types/mocha": "^8.2.0", - "@types/node": "14.x", + "@types/node": "16.x", "@types/which": "^1.0.28" }, "repository": { diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 7d94943f947..c3a9840b356 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -162,6 +162,7 @@ "config.ignoreSubmodules": "Ignore modifications to submodules in the file tree.", "config.ignoredRepositories": "List of git repositories to ignore.", "config.scanRepositories": "List of paths to search for git repositories in.", + "config.commandsToLog": "List of git commands (ex: commit, push) that would have their `stdout` logged to the [git output](command:git.showOutput). If the git command has a client-side hook configured, the client-side hook's `stdout` will also be logged to the [git output](command:git.showOutput).", "config.showProgress": "Controls whether git actions should show progress.", "config.rebaseWhenSync": "Force git to use rebase when running the sync command.", "config.confirmEmptyCommits": "Always confirm the creation of empty commits for the 'Git: Commit Empty' command.", @@ -174,6 +175,7 @@ "config.confirmForcePush": "Controls whether to ask for confirmation before force-pushing.", "config.allowNoVerifyCommit": "Controls whether commits without running pre-commit and commit-msg hooks are allowed.", "config.confirmNoVerifyCommit": "Controls whether to ask for confirmation before committing without verification.", + "config.closeDiffOnOperation": "Controls whether the diff editor should be automatically closed when changes are committed, discarded, staged, or unstaged.", "config.openDiffOnClick": "Controls whether the diff editor should be opened when clicking a change. Otherwise the regular editor will be opened.", "config.supportCancellation": "Controls whether a notification comes up when running the Sync action, which allows the user to cancel the operation.", "config.branchSortOrder": "Controls the sort order for branches.", @@ -194,6 +196,8 @@ "config.showUnpublishedCommitsButton.whenEmpty": "Only shows the action button if there are no other changes and there are unpublished commits.", "config.showUnpublishedCommitsButton.never": "Never shows the action button.", "config.statusLimit": "Controls how to limit the number of changes that can be parsed from Git status command. Can be set to 0 for no limit.", + "config.experimental.installGuide": "Experimental improvements for the git setup flow.", + "config.repositoryScanIgnoredFolders": "List of folders that are ignored while scanning for Git repositories when `#git.autoRepositoryDetection#` is set to `true` or `subFolders`.", "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.", "submenu.explorer": "Git", "submenu.commit": "Commit", @@ -216,6 +220,10 @@ "colors.conflict": "Color for resources with conflicts.", "colors.submodule": "Color for submodule resources.", "view.workbench.scm.missing": "A valid git installation was not detected, more details can be found in the [git output](command:git.showOutput).\nPlease [install git](https://git-scm.com/), or learn more about how to use git and source control in VS Code in [our docs](https://aka.ms/vscode-scm).\nIf you're using a different version control system, you can [search the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22) for additional extensions.", + "view.workbench.scm.missing.guide.windows": "[Download Git for Windows](https://git-scm.com/download/win)\nAfter installing, please [reload](command:workbench.action.reloadWindow) (or [troubleshoot](command:git.showOutput)). Additional source control providers can be installed [from the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22).", + "view.workbench.scm.missing.guide.mac": "[Download Git for macOS](https://git-scm.com/download/mac)\nAfter installing, please [reload](command:workbench.action.reloadWindow) (or [troubleshoot](command:git.showOutput)). Additional source control providers can be installed [from the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22).", + "view.workbench.scm.missing.guide.linux": "Source control depends on Git being installed.\n[Download Git for Linux](https://git-scm.com/download/mac)\nAfter installing, please [reload](command:workbench.action.reloadWindow) (or [troubleshoot](command:git.showOutput)). Additional source control providers can be installed [from the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22).", + "view.workbench.scm.missing.guide": "Install Git, a popular source control system, to track code changes and collaborate with others. Learn more in our [Git guides](https://aka.ms/vscode-scm).", "view.workbench.scm.disabled": "If you would like to use git features, please enable git in your [settings](command:workbench.action.openSettings?%5B%22git.enabled%22%5D).\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).", "view.workbench.scm.empty": "In order to use git features, you can open a folder containing a git repository or clone from a URL.\n[Open Folder](command:vscode.openFolder)\n[Clone Repository](command:git.clone)\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).", "view.workbench.scm.folder": "The folder currently open doesn't have a git repository. You can initialize a repository which will enable source control features powered by git.\n[Initialize Repository](command:git.init?%5Btrue%5D)\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).", diff --git a/extensions/git/src/actionButton.ts b/extensions/git/src/actionButton.ts new file mode 100644 index 00000000000..d8b45a00c26 --- /dev/null +++ b/extensions/git/src/actionButton.ts @@ -0,0 +1,113 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, Event, EventEmitter, SourceControlActionButton, Uri, workspace } from 'vscode'; +import * as nls from 'vscode-nls'; +import { Repository, Operation } from './repository'; +import { dispose } from './util'; +import { Branch } from './api/git'; + +const localize = nls.loadMessageBundle(); + +interface ActionButtonState { + readonly HEAD: Branch | undefined; + readonly isSyncRunning: boolean; + readonly repositoryHasNoChanges: boolean; +} + +export class ActionButtonCommand { + private _onDidChange = new EventEmitter(); + get onDidChange(): Event { return this._onDidChange.event; } + + private _state: ActionButtonState; + private get state() { return this._state; } + private set state(state: ActionButtonState) { + if (JSON.stringify(this._state) !== JSON.stringify(state)) { + this._state = state; + this._onDidChange.fire(); + } + } + + private disposables: Disposable[] = []; + + constructor(readonly repository: Repository) { + this._state = { HEAD: undefined, isSyncRunning: false, repositoryHasNoChanges: false }; + + repository.onDidRunGitStatus(this.onDidRunGitStatus, this, this.disposables); + repository.onDidChangeOperations(this.onDidChangeOperations, this, this.disposables); + } + + get button(): SourceControlActionButton | undefined { + if (!this.state.HEAD || !this.state.HEAD.name || !this.state.HEAD.commit) { return undefined; } + + const config = workspace.getConfiguration('git', Uri.file(this.repository.root)); + const showActionButton = config.get('showUnpublishedCommitsButton', 'whenEmpty'); + const postCommitCommand = config.get('postCommitCommand'); + const noPostCommitCommand = postCommitCommand !== 'sync' && postCommitCommand !== 'push'; + + let actionButton: SourceControlActionButton | undefined; + if (showActionButton === 'always' || (showActionButton === 'whenEmpty' && this.state.repositoryHasNoChanges && noPostCommitCommand)) { + if (this.state.HEAD.upstream) { + if (this.state.HEAD.ahead) { + const config = workspace.getConfiguration('git', Uri.file(this.repository.root)); + const rebaseWhenSync = config.get('rebaseWhenSync'); + + const ahead = `${this.state.HEAD.ahead}$(arrow-up)`; + const behind = this.state.HEAD.behind ? `${this.state.HEAD.behind}$(arrow-down) ` : ''; + const icon = this.state.isSyncRunning ? '$(sync~spin)' : '$(sync)'; + + actionButton = { + command: { + command: this.state.isSyncRunning ? '' : rebaseWhenSync ? 'git.syncRebase' : 'git.sync', + title: localize('scm button sync title', "{0} {1}{2}", icon, behind, ahead), + tooltip: this.state.isSyncRunning ? + localize('syncing changes', "Synchronizing Changes...") + : this.repository.syncTooltip, + arguments: [this.repository.sourceControl], + }, + description: localize('scm button sync description', "{0} Sync Changes {1}{2}", icon, behind, ahead) + }; + } + } else { + actionButton = { + command: { + command: this.state.isSyncRunning ? '' : 'git.publish', + title: localize('scm button publish title', "$(cloud-upload) Publish Branch"), + tooltip: this.state.isSyncRunning ? + localize('scm button publish branch running', "Publishing Branch...") : + localize('scm button publish branch', "Publish Branch"), + arguments: [this.repository.sourceControl], + } + }; + } + } + + return actionButton; + } + + private onDidChangeOperations(): void { + const isSyncRunning = this.repository.operations.isRunning(Operation.Sync) || + this.repository.operations.isRunning(Operation.Push) || + this.repository.operations.isRunning(Operation.Pull); + + this.state = { ...this.state, isSyncRunning }; + } + + private onDidRunGitStatus(): void { + this.state = { + ...this.state, + HEAD: this.repository.HEAD, + repositoryHasNoChanges: + this.repository.indexGroup.resourceStates.length === 0 && + this.repository.mergeGroup.resourceStates.length === 0 && + this.repository.untrackedGroup.resourceStates.length === 0 && + this.repository.workingTreeGroup.resourceStates.length === 0 + }; + } + + dispose(): void { + this.disposables = dispose(this.disposables); + } +} diff --git a/extensions/git/src/api/api1.ts b/extensions/git/src/api/api1.ts index f6ae052e177..41be52f1878 100644 --- a/extensions/git/src/api/api1.ts +++ b/extensions/git/src/api/api1.ts @@ -68,7 +68,7 @@ export class ApiRepository implements Repository { return this._repository.apply(patch, reverse); } - getConfigs(): Promise<{ key: string; value: string; }[]> { + getConfigs(): Promise<{ key: string; value: string }[]> { return this._repository.getConfigs(); } @@ -84,11 +84,11 @@ export class ApiRepository implements Repository { return this._repository.getGlobalConfig(key); } - getObjectDetails(treeish: string, path: string): Promise<{ mode: string; object: string; size: number; }> { + getObjectDetails(treeish: string, path: string): Promise<{ mode: string; object: string; size: number }> { return this._repository.getObjectDetails(treeish, path); } - detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string }> { + detectObjectType(object: string): Promise<{ mimetype: string; encoding?: string }> { return this._repository.detectObjectType(object); } diff --git a/extensions/git/src/askpass.ts b/extensions/git/src/askpass.ts index f4ba1e84573..e1934042513 100644 --- a/extensions/git/src/askpass.ts +++ b/extensions/git/src/askpass.ts @@ -30,7 +30,7 @@ export class Askpass implements IIPCHandler { } } - async handle({ request, host }: { request: string, host: string }): Promise { + async handle({ request, host }: { request: string; host: string }): Promise { const config = workspace.getConfiguration('git', null); const enabled = config.get('enabled'); @@ -72,7 +72,7 @@ export class Askpass implements IIPCHandler { return await window.showInputBox(options) || ''; } - getEnv(): { [key: string]: string; } { + getEnv(): { [key: string]: string } { if (!this.ipc) { return { GIT_ASKPASS: path.join(__dirname, 'askpass-empty.sh') diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index c0b1bfb9cc1..eaff2861937 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -6,7 +6,7 @@ import * as os from 'os'; import * as path from 'path'; import { Command, commands, Disposable, LineChange, MessageOptions, OutputChannel, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider } from 'vscode'; -import TelemetryReporter from 'vscode-extension-telemetry'; +import TelemetryReporter from '@vscode/extension-telemetry'; import * as nls from 'vscode-nls'; import { Branch, ForcePushMode, GitErrorCodes, Ref, RefType, Status, CommitOptions, RemoteSourcePublisher } from './api/git'; import { Git, Stash } from './git'; @@ -14,7 +14,7 @@ import { Model } from './model'; import { Repository, Resource, ResourceGroupType } from './repository'; import { applyLineChanges, getModifiedRange, intersectDiffWithRange, invertLineChange, toLineRanges } from './staging'; import { fromGitUri, toGitUri, isGitUri } from './uri'; -import { grep, isDescendant, logTimestamp, pathEquals } from './util'; +import { grep, isDescendant, logTimestamp, pathEquals, relativePath } from './util'; import { Log, LogLevel } from './log'; import { GitTimelineItem } from './timelineProvider'; import { ApiRepository } from './api/api1'; @@ -186,7 +186,7 @@ function command(commandId: string, options: ScmCommandOptions = {}): Function { // 'image/bmp' // ]; -async function categorizeResourceByResolution(resources: Resource[]): Promise<{ merge: Resource[], resolved: Resource[], unresolved: Resource[], deletionConflicts: Resource[] }> { +async function categorizeResourceByResolution(resources: Resource[]): Promise<{ merge: Resource[]; resolved: Resource[]; unresolved: Resource[]; deletionConflicts: Resource[] }> { const selection = resources.filter(s => s instanceof Resource) as Resource[]; const merge = selection.filter(s => s.resourceGroupType === ResourceGroupType.Merge); const isBothAddedOrModified = (s: Resource) => s.type === Status.BOTH_MODIFIED || s.type === Status.BOTH_ADDED; @@ -282,7 +282,7 @@ interface PushOptions { remote?: string; refspec?: string; setUpstream?: boolean; - } + }; } class CommandErrorOutputTextDocumentContentProvider implements TextDocumentContentProvider { @@ -544,7 +544,7 @@ export class CommandCenter { } else { const placeHolder = localize('init', "Pick workspace folder to initialize git repo in"); const pick = { label: localize('choose', "Choose Folder...") }; - const items: { label: string, folder?: WorkspaceFolder }[] = [ + const items: { label: string; folder?: WorkspaceFolder }[] = [ ...workspace.workspaceFolders.map(folder => ({ label: folder.name, description: folder.uri.fsPath, folder })), pick ]; @@ -803,7 +803,7 @@ export class CommandCenter { return; } - const from = path.relative(repository.root, fromUri.fsPath); + const from = relativePath(repository.root, fromUri.fsPath); let to = await window.showInputBox({ value: from, valueSelection: [from.length - path.basename(from).length, from.length] @@ -1683,7 +1683,7 @@ export class CommandCenter { return this._checkout(repository, { detached: true, treeish }); } - private async _checkout(repository: Repository, opts?: { detached?: boolean, treeish?: string }): Promise { + private async _checkout(repository: Repository, opts?: { detached?: boolean; treeish?: string }): Promise { if (typeof opts?.treeish === 'string') { await repository.checkout(opts?.treeish, opts); return true; @@ -2698,7 +2698,7 @@ export class CommandCenter { env.clipboard.writeText(item.message); } - private _selectedForCompare: { uri: Uri, item: GitTimelineItem } | undefined; + private _selectedForCompare: { uri: Uri; item: GitTimelineItem } | undefined; @command('git.timeline.selectForCompare', { repository: false }) async timelineSelectForCompare(item: TimelineItem, uri: Uri | undefined, _source: string) { @@ -2959,7 +2959,7 @@ export class CommandCenter { } return result; - }, [] as { repository: Repository, resources: Uri[] }[]); + }, [] as { repository: Repository; resources: Uri[] }[]); const promises = groups .map(({ repository, resources }) => fn(repository as Repository, isSingleResource ? resources[0] : resources)); diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index 63c02605192..637b30d198a 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -16,7 +16,7 @@ class GitIgnoreDecorationProvider implements FileDecorationProvider { private static Decoration: FileDecoration = { color: new ThemeColor('gitDecoration.ignoredResourceForeground') }; readonly onDidChangeFileDecorations: Event; - private queue = new Map>; }>(); + private queue = new Map> }>(); private disposables: Disposable[] = []; constructor(private model: Model) { diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 49adce3ae69..3708d2e173a 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -7,12 +7,13 @@ import { promises as fs, exists, realpath } from 'fs'; import * as path from 'path'; import * as os from 'os'; import * as cp from 'child_process'; +import { fileURLToPath } from 'url'; import * as which from 'which'; import { EventEmitter } from 'events'; import * as iconv from '@vscode/iconv-lite-umd'; import * as filetype from 'file-type'; -import { assign, groupBy, IDisposable, toDisposable, dispose, mkdirp, readBytes, detectUnicodeEncoding, Encoding, onceEvent, splitInChunks, Limiter, Versions } from './util'; -import { CancellationToken, Progress, Uri } from 'vscode'; +import { assign, groupBy, IDisposable, toDisposable, dispose, mkdirp, readBytes, detectUnicodeEncoding, Encoding, onceEvent, splitInChunks, Limiter, Versions, isWindows } from './util'; +import { CancellationToken, ConfigurationChangeEvent, Progress, Uri, workspace } from 'vscode'; import { detectEncoding } from './encoding'; import { Ref, RefType, Branch, Remote, ForcePushMode, GitErrorCodes, LogOptions, Change, Status, CommitOptions, BranchQuery } from './api/git'; import * as byline from 'byline'; @@ -20,7 +21,6 @@ import { StringDecoder } from 'string_decoder'; // https://github.com/microsoft/vscode/issues/65693 const MAX_CLI_LENGTH = 30000; -const isWindows = process.platform === 'win32'; export interface IGit { path: string; @@ -368,6 +368,7 @@ export class Git { readonly userAgent: string; readonly version: string; private env: any; + private commandsToLog: string[] = []; private _onOutput = new EventEmitter(); get onOutput(): EventEmitter { return this._onOutput; } @@ -377,6 +378,18 @@ export class Git { this.version = options.version; this.userAgent = options.userAgent; this.env = options.env || {}; + + const onConfigurationChanged = (e?: ConfigurationChangeEvent) => { + if (e !== undefined && !e.affectsConfiguration('git.commandsToLog')) { + return; + } + + const config = workspace.getConfiguration('git'); + this.commandsToLog = config.get('commandsToLog', []); + }; + + workspace.onDidChangeConfiguration(onConfigurationChanged, this); + onConfigurationChanged(); } compareGitVersionTo(version: string): -1 | 0 | 1 { @@ -535,8 +548,15 @@ export class Git { const bufferResult = await exec(child, options.cancellationToken); if (options.log !== false) { + // command this.log(`> git ${args.join(' ')} [${Date.now() - startTime}ms]\n`); + // stdout + if (args.length > 0 && this.commandsToLog.includes(args[0]) && bufferResult.stdout.length > 0) { + this.log(`${bufferResult.stdout}\n`); + } + + // stderr if (bufferResult.stderr.length > 0) { this.log(`${bufferResult.stderr}\n`); } @@ -586,13 +606,27 @@ export class Git { GIT_PAGER: 'cat' }); - if (options.cwd) { - options.cwd = sanitizePath(options.cwd); + const cwd = this.getCwd(options); + if (cwd) { + options.cwd = sanitizePath(cwd); } return cp.spawn(this.path, args, options); } + private getCwd(options: SpawnOptions): string | undefined { + const cwd = options.cwd; + if (typeof cwd === 'undefined' || typeof cwd === 'string') { + return cwd; + } + + if (cwd.protocol === 'file:') { + return fileURLToPath(cwd); + } + + return undefined; + } + private log(output: string): void { this._onOutput.emit('log', output); } @@ -859,7 +893,7 @@ export class Repository { return result.stdout.trim(); } - async getConfigs(scope: string): Promise<{ key: string; value: string; }[]> { + async getConfigs(scope: string): Promise<{ key: string; value: string }[]> { const args = ['config']; if (scope) { @@ -961,7 +995,7 @@ export class Repository { return stdout; } - async getObjectDetails(treeish: string, path: string): Promise<{ mode: string, object: string, size: number }> { + async getObjectDetails(treeish: string, path: string): Promise<{ mode: string; object: string; size: number }> { if (!treeish) { // index const elements = await this.lsfiles(path); @@ -999,7 +1033,7 @@ export class Repository { async getGitRelativePath(ref: string, relativePath: string): Promise { const relativePathLowercase = relativePath.toLowerCase(); const dirname = path.posix.dirname(relativePath) + '/'; - const elements: { file: string; }[] = ref ? await this.lstree(ref, dirname) : await this.lsfiles(dirname); + const elements: { file: string }[] = ref ? await this.lstree(ref, dirname) : await this.lsfiles(dirname); const element = elements.filter(file => file.file.toLowerCase() === relativePathLowercase)[0]; if (!element) { @@ -1009,7 +1043,7 @@ export class Repository { return element.file; } - async detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string }> { + async detectObjectType(object: string): Promise<{ mimetype: string; encoding?: string }> { const child = await this.stream(['show', '--textconv', object]); const buffer = await readBytes(child.stdout!, 4100); @@ -1309,7 +1343,7 @@ export class Repository { await this.exec(['update-index', add, '--cacheinfo', mode, hash, path]); } - async checkout(treeish: string, paths: string[], opts: { track?: boolean, detached?: boolean } = Object.create(null)): Promise { + async checkout(treeish: string, paths: string[], opts: { track?: boolean; detached?: boolean } = Object.create(null)): Promise { const args = ['checkout', '-q']; if (opts.track) { @@ -1571,7 +1605,7 @@ export class Repository { await this.exec(args); } - async fetch(options: { remote?: string, ref?: string, all?: boolean, prune?: boolean, depth?: number, silent?: boolean, readonly cancellationToken?: CancellationToken } = {}): Promise { + async fetch(options: { remote?: string; ref?: string; all?: boolean; prune?: boolean; depth?: number; silent?: boolean; readonly cancellationToken?: CancellationToken } = {}): Promise { const args = ['fetch']; const spawnOptions: SpawnOptions = { cancellationToken: options.cancellationToken, @@ -1814,8 +1848,8 @@ export class Repository { } } - getStatus(opts?: { limit?: number, ignoreSubmodules?: boolean }): Promise<{ status: IFileStatus[]; didHitLimit: boolean; }> { - return new Promise<{ status: IFileStatus[]; didHitLimit: boolean; }>((c, e) => { + getStatus(opts?: { limit?: number; ignoreSubmodules?: boolean }): Promise<{ status: IFileStatus[]; statusLength: number; didHitLimit: boolean }> { + return new Promise<{ status: IFileStatus[]; statusLength: number; didHitLimit: boolean }>((c, e) => { const parser = new GitStatusParser(); const env = { GIT_OPTIONAL_LOCKS: '0' }; const args = ['status', '-z', '-u']; @@ -1839,7 +1873,7 @@ export class Repository { })); } - c({ status: parser.status, didHitLimit: false }); + c({ status: parser.status, statusLength: parser.status.length, didHitLimit: false }); }; const limit = opts?.limit ?? 10000; @@ -1851,7 +1885,7 @@ export class Repository { child.stdout!.removeListener('data', onStdoutData); child.kill(); - c({ status: parser.status.slice(0, limit), didHitLimit: true }); + c({ status: parser.status.slice(0, limit), statusLength: parser.status.length, didHitLimit: true }); } }; @@ -1895,7 +1929,7 @@ export class Repository { .map(([ref]) => ({ name: ref, type: RefType.Head } as Branch)); } - async getRefs(opts?: { sort?: 'alphabetically' | 'committerdate', contains?: string, pattern?: string, count?: number }): Promise { + async getRefs(opts?: { sort?: 'alphabetically' | 'committerdate'; contains?: string; pattern?: string; count?: number }): Promise { const args = ['for-each-ref']; if (opts?.count) { diff --git a/extensions/git/src/ipc/ipcServer.ts b/extensions/git/src/ipc/ipcServer.ts index 5cea9faf98f..ad4583cbfe1 100644 --- a/extensions/git/src/ipc/ipcServer.ts +++ b/extensions/git/src/ipc/ipcServer.ts @@ -61,7 +61,7 @@ export async function createIPCServer(context?: string): Promise { export interface IIPCServer extends Disposable { readonly ipcHandlePath: string | undefined; - getEnv(): { [key: string]: string; }; + getEnv(): { [key: string]: string }; registerHandler(name: string, handler: IIPCHandler): Disposable; } @@ -106,7 +106,7 @@ class IPCServer implements IIPCServer, Disposable { }); } - getEnv(): { [key: string]: string; } { + getEnv(): { [key: string]: string } { return { VSCODE_GIT_IPC_HANDLE: this.ipcHandlePath }; } diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 7d40b7ee265..97ac84b27cb 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -14,7 +14,7 @@ import { GitFileSystemProvider } from './fileSystemProvider'; import { GitDecorations } from './decorationProvider'; import { Askpass } from './askpass'; import { toDisposable, filterEvent, eventToPromise, logTimestamp } from './util'; -import TelemetryReporter from 'vscode-extension-telemetry'; +import TelemetryReporter from '@vscode/extension-telemetry'; import { GitExtension } from './api/git'; import { GitProtocolHandler } from './protocolHandler'; import { GitExtensionImpl } from './api/extension'; @@ -25,7 +25,7 @@ import { GitTimelineProvider } from './timelineProvider'; import { registerAPICommands } from './api/api1'; import { TerminalEnvironmentManager } from './terminal'; -const deactivateTasks: { (): Promise; }[] = []; +const deactivateTasks: { (): Promise }[] = []; export async function deactivate(): Promise { for (const task of deactivateTasks) { @@ -73,7 +73,7 @@ async function createModel(context: ExtensionContext, outputChannel: OutputChann version: info.version, env: environment, }); - const model = new Model(git, askpass, context.globalState, outputChannel); + const model = new Model(git, askpass, context.globalState, outputChannel, telemetryReporter); disposables.push(model); const onRepository = () => commands.executeCommand('setContext', 'gitOpenRepositoryCount', `${model.repositories.length}`); @@ -165,7 +165,7 @@ export async function _activate(context: ExtensionContext): Promise outputChannel.show()); disposables.push(outputChannel); - const { name, version, aiKey } = require('../package.json') as { name: string, version: string, aiKey: string }; + const { name, version, aiKey } = require('../package.json') as { name: string; version: string; aiKey: string }; const telemetryReporter = new TelemetryReporter(name, version, aiKey); deactivateTasks.push(() => telemetryReporter.dispose()); @@ -192,6 +192,11 @@ export async function _activate(context: ExtensionContext): Promise { const config = workspace.getConfiguration('git'); const autoRepositoryDetection = config.get('autoRepositoryDetection'); - const repositoryScanMaxDepth = config.get('repositoryScanMaxDepth', 1); // Log repository scan settings if (Log.logLevel <= LogLevel.Trace) { this.outputChannel.appendLine(`${logTimestamp()} Trace: autoRepositoryDetection="${autoRepositoryDetection}"`); - this.outputChannel.appendLine(`${logTimestamp()} Trace: repositoryScanMaxDepth=${repositoryScanMaxDepth}`); } if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'subFolders') { @@ -157,7 +156,10 @@ export class Model implements IRemoteSourcePublisherRegistry, IPushErrorHandlerR const root = folder.uri.fsPath; // Workspace folder children - const subfolders = new Set(await this.traverseWorkspaceFolder(root, repositoryScanMaxDepth)); + const repositoryScanMaxDepth = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanMaxDepth', 1); + const repositoryScanIgnoredFolders = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanIgnoredFolders', []); + + const subfolders = new Set(await this.traverseWorkspaceFolder(root, repositoryScanMaxDepth, repositoryScanIgnoredFolders)); // Repository scan folders const scanPaths = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('scanRepositories') || []; @@ -178,7 +180,7 @@ export class Model implements IRemoteSourcePublisherRegistry, IPushErrorHandlerR })); } - private async traverseWorkspaceFolder(workspaceFolder: string, maxDepth: number): Promise { + private async traverseWorkspaceFolder(workspaceFolder: string, maxDepth: number, repositoryScanIgnoredFolders: string[]): Promise { const result: string[] = []; const foldersToTravers = [{ path: workspaceFolder, depth: 0 }]; @@ -188,7 +190,9 @@ export class Model implements IRemoteSourcePublisherRegistry, IPushErrorHandlerR if (currentFolder.depth < maxDepth || maxDepth === -1) { const children = await fs.promises.readdir(currentFolder.path, { withFileTypes: true }); const childrenFolders = children - .filter(dirent => dirent.isDirectory() && dirent.name !== '.git') + .filter(dirent => + dirent.isDirectory() && dirent.name !== '.git' && + !repositoryScanIgnoredFolders.find(f => pathEquals(dirent.name, f))) .map(dirent => path.join(currentFolder.path, dirent.name)); result.push(...childrenFolders); @@ -331,7 +335,7 @@ export class Model implements IRemoteSourcePublisherRegistry, IPushErrorHandlerR } const dotGit = await this.git.getRepositoryDotGit(repositoryRoot); - const repository = new Repository(this.git.open(repositoryRoot, dotGit), this, this, this.globalState, this.outputChannel); + const repository = new Repository(this.git.open(repositoryRoot, dotGit), this, this, this.globalState, this.outputChannel, this.telemetryReporter); this.open(repository); repository.status(); // do not await this, we want SCM to know about the repo asap diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 09c64ec1750..97b7847c56e 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -5,7 +5,8 @@ import * as fs from 'fs'; import * as path from 'path'; -import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, FileDecoration, commands } from 'vscode'; +import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, FileDecoration, commands, Tab } from 'vscode'; +import TelemetryReporter from '@vscode/extension-telemetry'; import * as nls from 'vscode-nls'; import { Branch, Change, ForcePushMode, GitErrorCodes, LogOptions, Ref, RefType, Remote, Status, CommitOptions, BranchQuery, FetchOptions } from './api/git'; import { AutoFetcher } from './autofetch'; @@ -13,12 +14,13 @@ import { debounce, memoize, throttle } from './decorators'; import { Commit, GitError, Repository as BaseRepository, Stash, Submodule, LogFileOptions } from './git'; import { StatusBarCommands } from './statusbar'; import { toGitUri } from './uri'; -import { anyEvent, combinedDisposable, debounceEvent, dispose, EmptyDisposable, eventToPromise, filterEvent, find, IDisposable, isDescendant, logTimestamp, onceEvent } from './util'; +import { anyEvent, combinedDisposable, debounceEvent, dispose, EmptyDisposable, eventToPromise, filterEvent, find, IDisposable, isDescendant, logTimestamp, onceEvent, pathEquals, relativePath } from './util'; import { IFileWatcher, watch } from './watch'; import { Log, LogLevel } from './log'; import { IPushErrorHandlerRegistry } from './pushError'; import { ApiRepository } from './api/api1'; import { IRemoteSourcePublisherRegistry } from './remotePublisher'; +import { ActionButtonCommand } from './actionButton'; const timeout = (millis: number) => new Promise(c => setTimeout(c, millis)); @@ -853,7 +855,8 @@ export class Repository implements Disposable { private pushErrorHandlerRegistry: IPushErrorHandlerRegistry, remoteSourcePublisherRegistry: IRemoteSourcePublisherRegistry, globalState: Memento, - outputChannel: OutputChannel + outputChannel: OutputChannel, + private telemetryReporter: TelemetryReporter ) { const workspaceWatcher = workspace.createFileSystemWatcher('**'); this.disposables.push(workspaceWatcher); @@ -964,6 +967,11 @@ export class Repository implements Disposable { statusBar.onDidChange(() => this._sourceControl.statusBarCommands = statusBar.commands, null, this.disposables); this._sourceControl.statusBarCommands = statusBar.commands; + const actionButton = new ActionButtonCommand(this); + this.disposables.push(actionButton); + actionButton.onDidChange(() => this._sourceControl.actionButton = actionButton.button); + this._sourceControl.actionButton = actionButton.button; + const progressManager = new ProgressManager(this); this.disposables.push(progressManager); @@ -1069,7 +1077,7 @@ export class Repository implements Disposable { return await this.repository.getCommitTemplate(); } - getConfigs(): Promise<{ key: string; value: string; }[]> { + getConfigs(): Promise<{ key: string; value: string }[]> { return this.run(Operation.Config, () => this.repository.getConfigs('local')); } @@ -1150,8 +1158,11 @@ export class Repository implements Disposable { return this.run(Operation.HashObject, () => this.repository.hashObject(data)); } - async add(resources: Uri[], opts?: { update?: boolean; }): Promise { - await this.run(Operation.Add, () => this.repository.add(resources.map(r => r.fsPath), opts)); + async add(resources: Uri[], opts?: { update?: boolean }): Promise { + await this.run(Operation.Add, async () => { + await this.repository.add(resources.map(r => r.fsPath), opts); + this.closeDiffEditors([], [...resources.map(r => r.fsPath)]); + }); } async rm(resources: Uri[]): Promise { @@ -1159,16 +1170,28 @@ export class Repository implements Disposable { } async stage(resource: Uri, contents: string): Promise { - const relativePath = path.relative(this.repository.root, resource.fsPath).replace(/\\/g, '/'); - await this.run(Operation.Stage, () => this.repository.stage(relativePath, contents)); + const path = relativePath(this.repository.root, resource.fsPath).replace(/\\/g, '/'); + await this.run(Operation.Stage, async () => { + await this.repository.stage(path, contents); + this.closeDiffEditors([], [...resource.fsPath]); + }); this._onDidChangeOriginalResource.fire(resource); } async revert(resources: Uri[]): Promise { - await this.run(Operation.RevertFiles, () => this.repository.revert('HEAD', resources.map(r => r.fsPath))); + await this.run(Operation.RevertFiles, async () => { + await this.repository.revert('HEAD', resources.map(r => r.fsPath)); + this.closeDiffEditors([...resources.length !== 0 ? + resources.map(r => r.fsPath) : + this.indexGroup.resourceStates.map(r => r.resourceUri.fsPath)], []); + }); } 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) { @@ -1177,6 +1200,7 @@ export class Repository implements Disposable { } await this.repository.rebaseContinue(); + this.closeDiffEditors(indexResources, workingGroupResources); }); } else { await this.run(Operation.Commit, async () => { @@ -1193,6 +1217,7 @@ export class Repository implements Disposable { } await this.repository.commit(message, opts); + this.closeDiffEditors(indexResources, workingGroupResources); }); } } @@ -1236,9 +1261,34 @@ export class Repository implements Disposable { await this.repository.clean(toClean); await this.repository.checkout('', toCheckout); await this.repository.updateSubmodules(submodulesToUpdate); + + this.closeDiffEditors([], [...toClean, ...toCheckout]); }); } + private closeDiffEditors(indexResources: string[], workingTreeResources: string[]): void { + const config = workspace.getConfiguration('git', Uri.file(this.root)); + if (!config.get('closeDiffOnOperation', false)) { return; } + + const diffEditorTabsToClose: Tab[] = []; + + // Index + diffEditorTabsToClose.push(...window.tabs + .filter(t => + t.resource && t.resource.scheme === 'git' && t.viewId === 'diff' && + indexResources.some(r => pathEquals(r, t.resource!.fsPath)))); + + // Working Tree + diffEditorTabsToClose.push(...window.tabs + .filter(t => + t.resource && t.resource.scheme === 'file' && t.viewId === 'diff' && + workingTreeResources.some(r => pathEquals(r, t.resource!.fsPath)) && + t.additionalResourcesAndViewIds.find(r => r.resource!.scheme === 'git'))); + + // Close editors + diffEditorTabsToClose.forEach(t => t.close()); + } + async branch(name: string, _checkout: boolean, _ref?: string): Promise { await this.run(Operation.Branch, () => this.repository.branch(name, _checkout, _ref)); } @@ -1287,11 +1337,11 @@ export class Repository implements Disposable { await this.run(Operation.DeleteTag, () => this.repository.deleteTag(name)); } - async checkout(treeish: string, opts?: { detached?: boolean; }): Promise { + async checkout(treeish: string, opts?: { detached?: boolean }): Promise { await this.run(Operation.Checkout, () => this.repository.checkout(treeish, [], opts)); } - async checkoutTracking(treeish: string, opts: { detached?: boolean; } = {}): Promise { + async checkoutTracking(treeish: string, opts: { detached?: boolean } = {}): Promise { await this.run(Operation.CheckoutTracking, () => this.repository.checkout(treeish, [], { ...opts, track: true })); } @@ -1324,7 +1374,7 @@ export class Repository implements Disposable { } @throttle - async fetchDefault(options: { silent?: boolean; } = {}): Promise { + async fetchDefault(options: { silent?: boolean } = {}): Promise { await this._fetch({ silent: options.silent }); } @@ -1342,7 +1392,7 @@ export class Repository implements Disposable { await this._fetch(options); } - private async _fetch(options: { remote?: string, ref?: string, all?: boolean, prune?: boolean, depth?: number, silent?: boolean; } = {}): Promise { + private async _fetch(options: { remote?: string; ref?: string; all?: boolean; prune?: boolean; depth?: number; silent?: boolean } = {}): Promise { if (!options.prune) { const config = workspace.getConfiguration('git', Uri.file(this.root)); const prune = config.get('pruneOnFetch'); @@ -1543,16 +1593,16 @@ export class Repository implements Disposable { async show(ref: string, filePath: string): Promise { return await this.run(Operation.Show, async () => { - const relativePath = path.relative(this.repository.root, filePath).replace(/\\/g, '/'); + const path = relativePath(this.repository.root, filePath).replace(/\\/g, '/'); const configFiles = workspace.getConfiguration('files', Uri.file(filePath)); const defaultEncoding = configFiles.get('encoding'); const autoGuessEncoding = configFiles.get('autoGuessEncoding'); try { - return await this.repository.bufferString(`${ref}:${relativePath}`, defaultEncoding, autoGuessEncoding); + return await this.repository.bufferString(`${ref}:${path}`, defaultEncoding, autoGuessEncoding); } catch (err) { if (err.gitErrorCode === GitErrorCodes.WrongCase) { - const gitRelativePath = await this.repository.getGitRelativePath(ref, relativePath); + const gitRelativePath = await this.repository.getGitRelativePath(ref, path); return await this.repository.bufferString(`${ref}:${gitRelativePath}`, defaultEncoding, autoGuessEncoding); } @@ -1563,16 +1613,16 @@ export class Repository implements Disposable { async buffer(ref: string, filePath: string): Promise { return this.run(Operation.Show, () => { - const relativePath = path.relative(this.repository.root, filePath).replace(/\\/g, '/'); - return this.repository.buffer(`${ref}:${relativePath}`); + const path = relativePath(this.repository.root, filePath).replace(/\\/g, '/'); + return this.repository.buffer(`${ref}:${path}`); }); } - getObjectDetails(ref: string, filePath: string): Promise<{ mode: string, object: string, size: number; }> { + getObjectDetails(ref: string, filePath: string): Promise<{ mode: string; object: string; size: number }> { return this.run(Operation.GetObjectDetails, () => this.repository.getObjectDetails(ref, filePath)); } - detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string; }> { + detectObjectType(object: string): Promise<{ mimetype: string; encoding?: string }> { return this.run(Operation.Show, () => this.repository.detectObjectType(object)); } @@ -1608,7 +1658,7 @@ export class Repository implements Disposable { return await this.run(Operation.Ignore, async () => { const ignoreFile = `${this.repository.root}${path.sep}.gitignore`; const textToAppend = files - .map(uri => path.relative(this.repository.root, uri.fsPath).replace(/\\/g, '/')) + .map(uri => relativePath(this.repository.root, uri.fsPath).replace(/\\/g, '/')) .join('\n'); const document = await new Promise(c => fs.exists(ignoreFile, c)) @@ -1802,7 +1852,18 @@ export class Repository implements Disposable { const limit = scopedConfig.get('statusLimit', 10000); - const { status, didHitLimit } = await this.repository.getStatus({ limit, ignoreSubmodules }); + const { status, statusLength, didHitLimit } = await this.repository.getStatus({ limit, ignoreSubmodules }); + + if (didHitLimit) { + /* __GDPR__ + "statusLimit" : { + "ignoreSubmodules": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "limit": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "statusLength": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } + } + */ + this.telemetryReporter.sendTelemetryEvent('statusLimit', { ignoreSubmodules: String(ignoreSubmodules) }, { limit, statusLength }); + } const config = workspace.getConfiguration('git'); const shouldIgnore = config.get('ignoreLimitWarning') === true; @@ -1922,38 +1983,6 @@ export class Repository implements Disposable { return undefined; }); - let actionButton: SourceControl['actionButton']; - if (HEAD !== undefined) { - const config = workspace.getConfiguration('git', Uri.file(this.repository.root)); - const showActionButton = config.get('showUnpublishedCommitsButton', 'whenEmpty'); - const postCommitCommand = config.get('postCommitCommand'); - - if (showActionButton === 'always' || (showActionButton === 'whenEmpty' && workingTree.length === 0 && index.length === 0 && untracked.length === 0 && merge.length === 0 && postCommitCommand !== 'sync' && postCommitCommand !== 'push')) { - if (HEAD.name && HEAD.commit) { - if (HEAD.upstream) { - if (HEAD.ahead) { - const rebaseWhenSync = config.get('rebaseWhenSync'); - - actionButton = { - command: rebaseWhenSync ? 'git.syncRebase' : 'git.sync', - title: localize('scm button sync title', '$(sync) Sync Changes {0}{1}', HEAD.behind ? `${HEAD.behind}$(arrow-down) ` : '', `${HEAD.ahead}$(arrow-up)`), - tooltip: this.syncTooltip, - arguments: [this._sourceControl], - }; - } - } else { - actionButton = { - command: 'git.publish', - title: localize('scm button publish title', "$(cloud-upload) Publish Branch"), - tooltip: localize('scm button publish tooltip', "Publish Branch"), - arguments: [this._sourceControl], - }; - } - } - } - } - this._sourceControl.actionButton = actionButton; - // set resource groups this.mergeGroup.resourceStates = merge; this.indexGroup.resourceStates = index; diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts index f9859e16c15..bb61552c1da 100644 --- a/extensions/git/src/util.ts +++ b/extensions/git/src/util.ts @@ -4,11 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Disposable, EventEmitter } from 'vscode'; -import { dirname, sep } from 'path'; +import { dirname, sep, relative } from 'path'; import { Readable } from 'stream'; import { promises as fs, createReadStream } from 'fs'; import * as byline from 'byline'; +export const isMacintosh = process.platform === 'darwin'; +export const isWindows = process.platform === 'win32'; + export function log(...args: any[]): void { console.log.apply(console, ['git:', ...args]); } @@ -172,7 +175,7 @@ export async function mkdirp(path: string, mode?: number): Promise { } export function uniqueFilter(keyFn: (t: T) => string): (t: T) => boolean { - const seen: { [key: string]: boolean; } = Object.create(null); + const seen: { [key: string]: boolean } = Object.create(null); return element => { const key = keyFn(element); @@ -284,8 +287,14 @@ export function detectUnicodeEncoding(buffer: Buffer): Encoding | null { return null; } -function isWindowsPath(path: string): boolean { - return /^[a-zA-Z]:\\/.test(path); +function normalizePath(path: string): string { + // Windows & Mac are currently being handled + // as case insensitive file systems in VS Code. + if (isWindows || isMacintosh) { + return path.toLowerCase(); + } + + return path; } export function isDescendant(parent: string, descendant: string): boolean { @@ -297,23 +306,26 @@ export function isDescendant(parent: string, descendant: string): boolean { parent += sep; } - // Windows is case insensitive - if (isWindowsPath(parent)) { - parent = parent.toLowerCase(); - descendant = descendant.toLowerCase(); - } - - return descendant.startsWith(parent); + return normalizePath(descendant).startsWith(normalizePath(parent)); } export function pathEquals(a: string, b: string): boolean { - // Windows is case insensitive - if (isWindowsPath(a)) { - a = a.toLowerCase(); - b = b.toLowerCase(); + return normalizePath(a) === normalizePath(b); +} + +/** + * Given the `repository.root` compute the relative path while trying to preserve + * the casing of the resource URI. The `repository.root` segment of the path can + * have a casing mismatch if the folder/workspace is being opened with incorrect + * casing. + */ +export function relativePath(from: string, to: string): string { + if (isDescendant(from, to) && from.length < to.length) { + return to.substring(from.length + 1); } - return a === b; + // Fallback to `path.relative` + return relative(from, to); } export function* splitInChunks(array: string[], maxChunkLength: number): IterableIterator { @@ -383,7 +395,7 @@ export class Limiter { } } -type Completion = { success: true, value: T } | { success: false, err: any }; +type Completion = { success: true; value: T } | { success: false; err: any }; export class PromiseSource { diff --git a/extensions/git/tsconfig.json b/extensions/git/tsconfig.json index 99129079e48..13997275056 100644 --- a/extensions/git/tsconfig.json +++ b/extensions/git/tsconfig.json @@ -14,6 +14,7 @@ "../../src/vscode-dts/vscode.proposed.scmActionButton.d.ts", "../../src/vscode-dts/vscode.proposed.scmSelectedProvider.d.ts", "../../src/vscode-dts/vscode.proposed.scmValidation.d.ts", + "../../src/vscode-dts/vscode.proposed.tabs.d.ts", "../../src/vscode-dts/vscode.proposed.timeline.d.ts", "../types/lib.textEncoder.d.ts" ] diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index caaefa755dd..f69be195555 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -26,16 +26,21 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" integrity sha512-El3+WJk2D/ppWNd2X05aiP5l2k4EwF7KwheknQZls+I26eSICoWRhRIJ56jGgw2dqNGQ5LtNajmBU2ajS28EvQ== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/which@^1.0.28": version "1.0.28" resolved "https://registry.yarnpkg.com/@types/which/-/which-1.0.28.tgz#016e387629b8817bed653fe32eab5d11279c8df6" integrity sha1-AW44dim4gXvtZT/jLqtdESecjfY= +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== + "@vscode/iconv-lite-umd@0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz#d2f1e0664ee6036408f9743fee264ea0699b0e48" @@ -61,11 +66,6 @@ jschardet@3.0.0: resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== -vscode-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== - vscode-nls@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.0.0.tgz#4001c8a6caba5cedb23a9c5ce1090395c0e44002" diff --git a/extensions/github-authentication/package.json b/extensions/github-authentication/package.json index aa406294e16..15125363872 100644 --- a/extensions/github-authentication/package.json +++ b/extensions/github-authentication/package.json @@ -58,14 +58,14 @@ "vscode:prepublish": "npm run compile" }, "dependencies": { - "node-fetch": "2.6.1", + "node-fetch": "2.6.7", "uuid": "8.1.0", - "vscode-extension-telemetry": "0.4.4", + "@vscode/extension-telemetry": "0.4.6", "vscode-nls": "^5.0.0", "vscode-tas-client": "^0.1.22" }, "devDependencies": { - "@types/node": "14.x", + "@types/node": "16.x", "@types/node-fetch": "^2.5.7", "@types/uuid": "8.0.0" }, diff --git a/extensions/github-authentication/src/common/utils.ts b/extensions/github-authentication/src/common/utils.ts index 9ffbddec0b8..c9511ff9b79 100644 --- a/extensions/github-authentication/src/common/utils.ts +++ b/extensions/github-authentication/src/common/utils.ts @@ -49,7 +49,7 @@ const passthrough = (value: any, resolve: (value?: any) => void) => resolve(valu */ export function promiseFromEvent( event: Event, - adapter: PromiseAdapter = passthrough): { promise: Promise, cancel: EventEmitter } { + adapter: PromiseAdapter = passthrough): { promise: Promise; cancel: EventEmitter } { let subscription: Disposable; let cancel = new EventEmitter(); return { diff --git a/extensions/github-authentication/src/experimentationService.ts b/extensions/github-authentication/src/experimentationService.ts index ccfc1942407..e3297ddd50e 100644 --- a/extensions/github-authentication/src/experimentationService.ts +++ b/extensions/github-authentication/src/experimentationService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import TelemetryReporter from 'vscode-extension-telemetry'; +import TelemetryReporter from '@vscode/extension-telemetry'; import { getExperimentationService, IExperimentationService, IExperimentationTelemetry, TargetPopulation } from 'vscode-tas-client'; export class ExperimentationTelemetry implements IExperimentationTelemetry { diff --git a/extensions/github-authentication/src/github.ts b/extensions/github-authentication/src/github.ts index 7053dfb39ce..824c3d3aff6 100644 --- a/extensions/github-authentication/src/github.ts +++ b/extensions/github-authentication/src/github.ts @@ -9,7 +9,7 @@ import { Keychain } from './common/keychain'; import { GitHubEnterpriseServer, GitHubServer, IGitHubServer } from './githubServer'; import { arrayEquals } from './common/utils'; import { ExperimentationTelemetry } from './experimentationService'; -import TelemetryReporter from 'vscode-extension-telemetry'; +import TelemetryReporter from '@vscode/extension-telemetry'; import { Log } from './common/logger'; interface SessionData { @@ -18,7 +18,7 @@ interface SessionData { label?: string; displayName?: string; id: string; - } + }; scopes: string[]; accessToken: string; } @@ -39,7 +39,7 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid private _disposable: vscode.Disposable; constructor(private readonly context: vscode.ExtensionContext, private readonly type: AuthProviderType) { - const { name, version, aiKey } = context.extension.packageJSON as { name: string, version: string, aiKey: string }; + const { name, version, aiKey } = context.extension.packageJSON as { name: string; version: string; aiKey: string }; this._telemetryReporter = new ExperimentationTelemetry(context, new TelemetryReporter(name, version, aiKey)); if (this.type === AuthProviderType.github) { @@ -149,7 +149,7 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid if (scopesSeen.has(scopesStr)) { return undefined; } - let userInfo: { id: string, accountName: string } | undefined; + let userInfo: { id: string; accountName: string } | undefined; if (!session.account) { try { userInfo = await this._githubServer.getUserInfo(session.accessToken); diff --git a/extensions/github-authentication/src/githubServer.ts b/extensions/github-authentication/src/githubServer.ts index 91503c3a12e..92313d030a7 100644 --- a/extensions/github-authentication/src/githubServer.ts +++ b/extensions/github-authentication/src/githubServer.ts @@ -41,7 +41,7 @@ function parseQuery(uri: vscode.Uri) { export interface IGitHubServer extends vscode.Disposable { login(scopes: string): Promise; - getUserInfo(token: string): Promise<{ id: string, accountName: string }>; + getUserInfo(token: string): Promise<{ id: string; accountName: string }>; sendAdditionalTelemetryInfo(token: string): Promise; friendlyName: string; type: AuthProviderType; @@ -77,7 +77,7 @@ async function getScopes(token: string, serverUri: vscode.Uri, logger: Log): Pro } } -async function getUserInfo(token: string, serverUri: vscode.Uri, logger: Log): Promise<{ id: string, accountName: string }> { +async function getUserInfo(token: string, serverUri: vscode.Uri, logger: Log): Promise<{ id: string; accountName: string }> { let result: Response; try { logger.info('Getting user info...'); @@ -119,7 +119,7 @@ export class GitHubServer implements IGitHubServer { private _onDidManuallyProvideToken = new vscode.EventEmitter(); private _pendingStates = new Map(); - private _codeExchangePromises = new Map, cancel: vscode.EventEmitter }>(); + private _codeExchangePromises = new Map; cancel: vscode.EventEmitter }>(); private _statusBarCommandId = `${this.type}.provide-manually`; private _disposable: vscode.Disposable; private _uriHandler = new UriEventHandler(this._logger); @@ -220,19 +220,20 @@ export class GitHubServer implements IGitHubServer { const json = await result.json() as IGitHubDeviceCodeResponse; - await vscode.env.clipboard.writeText(json.user_code); const modalResult = await vscode.window.showInformationMessage( localize('code.title', "Your Code: {0}", json.user_code), { modal: true, - detail: localize('code.detail', "The above one-time code has been copied to your clipboard. To finish authenticating, paste it on GitHub.") - }, 'Continue to GitHub'); + detail: localize('code.detail', "To finish authenticating, navigate to GitHub and paste in the above one-time code.") + }, 'Copy & Continue to GitHub'); - if (modalResult !== 'Continue to GitHub') { + if (modalResult !== 'Copy & Continue to GitHub') { throw new Error('Cancelled'); } + await vscode.env.clipboard.writeText(json.user_code); + const uriToOpen = await vscode.env.asExternalUri(vscode.Uri.parse(json.verification_uri)); await vscode.env.openExternal(uriToOpen); @@ -381,7 +382,7 @@ export class GitHubServer implements IGitHubServer { this._uriHandler.handleUri(vscode.Uri.parse(uri.trim())); } - public getUserInfo(token: string): Promise<{ id: string, accountName: string }> { + public getUserInfo(token: string): Promise<{ id: string; accountName: string }> { return getUserInfo(token, this.getServerUri('/user'), this._logger); } @@ -405,7 +406,7 @@ export class GitHubServer implements IGitHubServer { }); if (result.ok) { - const json: { student: boolean, faculty: boolean } = await result.json(); + const json: { student: boolean; faculty: boolean } = await result.json(); /* __GDPR__ "session" : { @@ -439,7 +440,7 @@ export class GitHubServer implements IGitHubServer { return; } - const json: { verifiable_password_authentication: boolean, installed_version: string } = await result.json(); + const json: { verifiable_password_authentication: boolean; installed_version: string } = await result.json(); /* __GDPR__ "ghe-session" : { @@ -503,7 +504,7 @@ export class GitHubEnterpriseServer implements IGitHubServer { return vscode.Uri.parse(`${apiUri.scheme}://${apiUri.authority}/api/v3${path}`); } - public async getUserInfo(token: string): Promise<{ id: string, accountName: string }> { + public async getUserInfo(token: string): Promise<{ id: string; accountName: string }> { return getUserInfo(token, this.getServerUri('/user'), this._logger); } @@ -521,7 +522,7 @@ export class GitHubEnterpriseServer implements IGitHubServer { return; } - const json: { verifiable_password_authentication: boolean, installed_version: string } = await result.json(); + const json: { verifiable_password_authentication: boolean; installed_version: string } = await result.json(); /* __GDPR__ "ghe-session" : { diff --git a/extensions/github-authentication/yarn.lock b/extensions/github-authentication/yarn.lock index 2de4db70a92..fb2e57d92b5 100644 --- a/extensions/github-authentication/yarn.lock +++ b/extensions/github-authentication/yarn.lock @@ -15,16 +15,21 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.5.tgz#3d03acd3b3414cf67faf999aed11682ed121f22b" integrity sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/uuid@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.0.0.tgz#165aae4819ad2174a17476dbe66feebd549556c0" integrity sha512-xSQfNcvOiE5f9dyd4Kzxbof1aTrLobL278pGLKOZI6esGfZ7ts9Ka16CzIN6Y8hFHE1C7jIBZokULhK1bOgjRw== +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -75,10 +80,12 @@ mime-types@^2.1.12: dependencies: mime-db "1.44.0" -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" tas-client@0.1.21: version "0.1.21" @@ -87,16 +94,16 @@ tas-client@0.1.21: dependencies: axios "^0.21.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + uuid@8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== -vscode-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== - vscode-nls@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" @@ -108,3 +115,16 @@ vscode-tas-client@^0.1.22: integrity sha512-1sYH73nhiSRVQgfZkLQNJW7VzhKM9qNbCe8QyXgiKkLhH4GflDXRPAK4yy4P41jUgula+Fc9G7i5imj1dlKfaw== dependencies: tas-client "0.1.21" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" diff --git a/extensions/github/markdown.css b/extensions/github/markdown.css index e6b118cb8d9..a8cb5840ccc 100644 --- a/extensions/github/markdown.css +++ b/extensions/github/markdown.css @@ -1,4 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + .vscode-dark img[src$=\#gh-light-mode-only], .vscode-light img[src$=\#gh-dark-mode-only] { - display: none; + display: none; } diff --git a/extensions/github/package.json b/extensions/github/package.json index 7c0013fd7a8..f86f98683af 100644 --- a/extensions/github/package.json +++ b/extensions/github/package.json @@ -80,7 +80,7 @@ "vscode-nls": "^4.1.2" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/github/src/publish.ts b/extensions/github/src/publish.ts index af75e3e476b..0954e2c67ff 100644 --- a/extensions/github/src/publish.ts +++ b/extensions/github/src/publish.ts @@ -50,7 +50,7 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository) folder = pick.folder.uri; } - let quickpick = vscode.window.createQuickPick(); + let quickpick = vscode.window.createQuickPick(); quickpick.ignoreFocusOut = true; quickpick.placeholder = 'Repository Name'; diff --git a/extensions/github/src/pushErrorHandler.ts b/extensions/github/src/pushErrorHandler.ts index b4609a67561..73abed1ccd6 100644 --- a/extensions/github/src/pushErrorHandler.ts +++ b/extensions/github/src/pushErrorHandler.ts @@ -41,7 +41,7 @@ async function handlePushError(repository: Repository, remote: Remote, refspec: try { if (isInCodespaces()) { // Call into the codespaces extension to fork the repository - const resp = await commands.executeCommand<{ repository: CreateForkResponseData, ref: string }>('github.codespaces.forkRepository'); + const resp = await commands.executeCommand<{ repository: CreateForkResponseData; ref: string }>('github.codespaces.forkRepository'); if (!resp) { throw new Error('Unable to fork respository'); } diff --git a/extensions/github/src/remoteSourceProvider.ts b/extensions/github/src/remoteSourceProvider.ts index 5ea6fd21bbc..a9655d904bd 100644 --- a/extensions/github/src/remoteSourceProvider.ts +++ b/extensions/github/src/remoteSourceProvider.ts @@ -7,7 +7,7 @@ import { RemoteSourceProvider, RemoteSource } from './typings/git-base'; import { getOctokit } from './auth'; import { Octokit } from '@octokit/rest'; -function parse(url: string): { owner: string, repo: string } | undefined { +function parse(url: string): { owner: string; repo: string } | undefined { const match = /^https:\/\/github\.com\/([^/]+)\/([^/]+)\.git/i.exec(url) || /^git@github\.com:([^/]+)\/([^/]+)\.git/i.exec(url); return (match && { owner: match[1], repo: match[2] }) ?? undefined; diff --git a/extensions/github/yarn.lock b/extensions/github/yarn.lock index 94f7a26da9d..9933736b08e 100644 --- a/extensions/github/yarn.lock +++ b/extensions/github/yarn.lock @@ -99,10 +99,10 @@ dependencies: "@types/node" ">= 8" -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/node@>= 8": version "14.0.23" @@ -125,9 +125,11 @@ is-plain-object@^3.0.0: integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== node-fetch@^2.3.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" once@^1.4.0: version "1.4.0" @@ -136,6 +138,11 @@ once@^1.4.0: dependencies: wrappy "1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + tunnel@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" @@ -151,6 +158,19 @@ vscode-nls@^4.1.2: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" diff --git a/extensions/grunt/package.json b/extensions/grunt/package.json index 7e5c605ec00..8dd9eced530 100644 --- a/extensions/grunt/package.json +++ b/extensions/grunt/package.json @@ -20,7 +20,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "main": "./out/main", "activationEvents": [ diff --git a/extensions/grunt/yarn.lock b/extensions/grunt/yarn.lock index f7a30098ef4..22c406bc73f 100644 --- a/extensions/grunt/yarn.lock +++ b/extensions/grunt/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/gulp/package.json b/extensions/gulp/package.json index 995da7fbe5d..8352957083e 100644 --- a/extensions/gulp/package.json +++ b/extensions/gulp/package.json @@ -20,7 +20,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "main": "./out/main", "activationEvents": [ diff --git a/extensions/gulp/yarn.lock b/extensions/gulp/yarn.lock index f7a30098ef4..22c406bc73f 100644 --- a/extensions/gulp/yarn.lock +++ b/extensions/gulp/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/html-language-features/client/src/browser/htmlClientMain.ts b/extensions/html-language-features/client/src/browser/htmlClientMain.ts index 843bf79aeb2..b69cca75854 100644 --- a/extensions/html-language-features/client/src/browser/htmlClientMain.ts +++ b/extensions/html-language-features/client/src/browser/htmlClientMain.ts @@ -12,7 +12,7 @@ declare const Worker: { new(stringUrl: string): any; }; declare const TextDecoder: { - new(encoding?: string): { decode(buffer: ArrayBuffer): string; }; + new(encoding?: string): { decode(buffer: ArrayBuffer): string }; }; // this method is called when vs code is activated diff --git a/extensions/html-language-features/client/src/htmlClient.ts b/extensions/html-language-features/client/src/htmlClient.ts index d24c0ec9205..aefa985c62e 100644 --- a/extensions/html-language-features/client/src/htmlClient.ts +++ b/extensions/html-language-features/client/src/htmlClient.ts @@ -75,12 +75,12 @@ export interface TelemetryReporter { export type LanguageClientConstructor = (name: string, description: string, clientOptions: LanguageClientOptions) => CommonLanguageClient; export interface Runtime { - TextDecoder: { new(encoding?: string): { decode(buffer: ArrayBuffer): string; } }; + TextDecoder: { new(encoding?: string): { decode(buffer: ArrayBuffer): string } }; fileFs?: FileSystemProvider; telemetry?: TelemetryReporter; readonly timer: { setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): Disposable; - } + }; } export function startClient(context: ExtensionContext, newLanguageClient: LanguageClientConstructor, runtime: Runtime) { diff --git a/extensions/html-language-features/client/src/node/htmlClientMain.ts b/extensions/html-language-features/client/src/node/htmlClientMain.ts index be25363eff4..4c7d24e397c 100644 --- a/extensions/html-language-features/client/src/node/htmlClientMain.ts +++ b/extensions/html-language-features/client/src/node/htmlClientMain.ts @@ -9,7 +9,7 @@ import { startClient, LanguageClientConstructor } from '../htmlClient'; import { ServerOptions, TransportKind, LanguageClientOptions, LanguageClient } from 'vscode-languageclient/node'; import { TextDecoder } from 'util'; import * as fs from 'fs'; -import TelemetryReporter from 'vscode-extension-telemetry'; +import TelemetryReporter from '@vscode/extension-telemetry'; let telemetry: TelemetryReporter | undefined; diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 99f7cb5df82..20fd71e95ae 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -261,13 +261,13 @@ ] }, "dependencies": { - "vscode-extension-telemetry": "0.4.4", + "@vscode/extension-telemetry": "0.4.6", "vscode-languageclient": "^7.0.0", "vscode-nls": "^5.0.0", - "vscode-uri": "^3.0.2" + "vscode-uri": "^3.0.3" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index 8fdc49e0ea8..95a9cedc406 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -9,16 +9,16 @@ }, "main": "./out/node/htmlServerMain", "dependencies": { - "vscode-css-languageservice": "^5.1.9", + "vscode-css-languageservice": "^5.1.12", "vscode-html-languageservice": "^4.2.1", "vscode-languageserver": "^7.0.0", - "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-textdocument": "^1.0.3", "vscode-nls": "^5.0.0", - "vscode-uri": "^3.0.2" + "vscode-uri": "^3.0.3" }, "devDependencies": { "@types/mocha": "^8.2.0", - "@types/node": "14.x" + "@types/node": "16.x" }, "scripts": { "compile": "npx gulp compile-extension:html-language-features-server", diff --git a/extensions/html-language-features/server/src/htmlServer.ts b/extensions/html-language-features/server/src/htmlServer.ts index 033ed22c564..2144b17ad70 100644 --- a/extensions/html-language-features/server/src/htmlServer.ts +++ b/extensions/html-language-features/server/src/htmlServer.ts @@ -71,7 +71,7 @@ export interface RuntimeEnvironment { readonly timer: { setImmediate(callback: (...args: any[]) => void, ...args: any[]): Disposable; setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): Disposable; - } + }; } diff --git a/extensions/html-language-features/server/src/languageModelCache.ts b/extensions/html-language-features/server/src/languageModelCache.ts index 06d331bca8a..048d84d37cd 100644 --- a/extensions/html-language-features/server/src/languageModelCache.ts +++ b/extensions/html-language-features/server/src/languageModelCache.ts @@ -12,7 +12,7 @@ export interface LanguageModelCache { } export function getLanguageModelCache(maxEntries: number, cleanupIntervalTimeInSec: number, parse: (document: TextDocument) => T): LanguageModelCache { - let languageModels: { [uri: string]: { version: number, languageId: string, cTime: number, languageModel: T } } = {}; + let languageModels: { [uri: string]: { version: number; languageId: string; cTime: number; languageModel: T } } = {}; let nModels = 0; let cleanupInterval: NodeJS.Timer | undefined = undefined; diff --git a/extensions/html-language-features/server/src/modes/embeddedSupport.ts b/extensions/html-language-features/server/src/modes/embeddedSupport.ts index c3b8ffde437..941510d3deb 100644 --- a/extensions/html-language-features/server/src/modes/embeddedSupport.ts +++ b/extensions/html-language-features/server/src/modes/embeddedSupport.ts @@ -20,7 +20,7 @@ export interface HTMLDocumentRegions { export const CSS_STYLE_RULE = '__'; -interface EmbeddedRegion { languageId: string | undefined; start: number; end: number; attributeValue?: boolean; } +interface EmbeddedRegion { languageId: string | undefined; start: number; end: number; attributeValue?: boolean } export function getDocumentRegions(languageService: LanguageService, document: TextDocument): HTMLDocumentRegions { diff --git a/extensions/html-language-features/server/src/modes/htmlMode.ts b/extensions/html-language-features/server/src/modes/htmlMode.ts index 04c37a2b491..58a3ded2bee 100644 --- a/extensions/html-language-features/server/src/modes/htmlMode.ts +++ b/extensions/html-language-features/server/src/modes/htmlMode.ts @@ -55,7 +55,7 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: async getFoldingRanges(document: TextDocument): Promise { return htmlLanguageService.getFoldingRanges(document); }, - async doAutoInsert(document: TextDocument, position: Position, kind: 'autoQuote' | 'autoClose', settings = workspace.settings) { + async doAutoInsert(document: TextDocument, position: Position, kind: 'autoQuote' | 'autoClose', settings = workspace.settings) { const offset = document.offsetAt(position); const text = document.getText(); if (kind === 'autoQuote') { diff --git a/extensions/html-language-features/server/src/modes/javascriptMode.ts b/extensions/html-language-features/server/src/modes/javascriptMode.ts index 85b9a8ae2e0..301af0e58c5 100644 --- a/extensions/html-language-features/server/src/modes/javascriptMode.ts +++ b/extensions/html-language-features/server/src/modes/javascriptMode.ts @@ -362,7 +362,7 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache Promise; onDocumentRemoved(document: TextDocument): void; getSemanticTokens?(document: TextDocument): Promise; - getSemanticTokenLegend?(): { types: string[], modifiers: string[] }; + getSemanticTokenLegend?(): { types: string[]; modifiers: string[] }; dispose(): void; } @@ -97,7 +97,7 @@ export interface LanguageModeRange extends Range { attributeValue?: boolean; } -export function getLanguageModes(supportedLanguages: { [languageId: string]: boolean; }, workspace: Workspace, clientCapabilities: ClientCapabilities, requestService: FileSystemProvider): LanguageModes { +export function getLanguageModes(supportedLanguages: { [languageId: string]: boolean }, workspace: Workspace, clientCapabilities: ClientCapabilities, requestService: FileSystemProvider): LanguageModes { const htmlLanguageService = getHTMLLanguageService({ clientCapabilities, fileSystemProvider: requestService }); const cssLanguageService = getCSSLanguageService({ clientCapabilities, fileSystemProvider: requestService }); diff --git a/extensions/html-language-features/server/src/modes/semanticTokens.ts b/extensions/html-language-features/server/src/modes/semanticTokens.ts index f386a0daba6..38b0b23c519 100644 --- a/extensions/html-language-features/server/src/modes/semanticTokens.ts +++ b/extensions/html-language-features/server/src/modes/semanticTokens.ts @@ -20,7 +20,7 @@ export interface SemanticTokenProvider { export function newSemanticTokenProvider(languageModes: LanguageModes): SemanticTokenProvider { // combined legend across modes - const legend: { types: string[], modifiers: string[] } = { types: [], modifiers: [] }; + const legend: { types: string[]; modifiers: string[] } = { types: [], modifiers: [] }; const legendMappings: { [modeId: string]: LegendMapping } = {}; for (let mode of languageModes.getAllModes()) { diff --git a/extensions/html-language-features/server/src/test/completions.test.ts b/extensions/html-language-features/server/src/test/completions.test.ts index b64d7dee860..223234ec5fa 100644 --- a/extensions/html-language-features/server/src/test/completions.test.ts +++ b/extensions/html-language-features/server/src/test/completions.test.ts @@ -14,7 +14,7 @@ export interface ItemDescription { documentation?: string; kind?: CompletionItemKind; resultText?: string; - command?: { title: string, command: string }; + command?: { title: string; command: string }; notAvailable?: boolean; } @@ -46,7 +46,7 @@ export function assertCompletion(completions: CompletionList, expected: ItemDesc const testUri = 'test://test/test.html'; -export async function testCompletionFor(value: string, expected: { count?: number, items?: ItemDescription[] }, uri = testUri, workspaceFolders?: WorkspaceFolder[]): Promise { +export async function testCompletionFor(value: string, expected: { count?: number; items?: ItemDescription[] }, uri = testUri, workspaceFolders?: WorkspaceFolder[]): Promise { let offset = value.indexOf('|'); value = value.substr(0, offset) + value.substr(offset + 1); diff --git a/extensions/html-language-features/server/src/test/rename.test.ts b/extensions/html-language-features/server/src/test/rename.test.ts index b2aa23cc016..5c3d557224c 100644 --- a/extensions/html-language-features/server/src/test/rename.test.ts +++ b/extensions/html-language-features/server/src/test/rename.test.ts @@ -18,7 +18,7 @@ async function testRename(value: string, newName: string, expectedDocContent: st folders: [{ name: 'foo', uri: 'test://foo' }] }; const languageModes = getLanguageModes({ css: true, javascript: true }, workspace, ClientCapabilities.LATEST, getNodeFileFS()); - const javascriptMode = languageModes.getMode('javascript') + const javascriptMode = languageModes.getMode('javascript'); const position = document.positionAt(offset); if (javascriptMode) { @@ -36,7 +36,7 @@ async function testRename(value: string, newName: string, expectedDocContent: st const newDocContent = TextDocument.applyEdits(document, edits); assert.strictEqual(newDocContent, expectedDocContent, `Expected: ${expectedDocContent}\nActual: ${newDocContent}`); } else { - assert.fail('should have javascriptMode but no') + assert.fail('should have javascriptMode but no'); } } @@ -50,15 +50,15 @@ async function testNoRename(value: string, newName: string): Promise { folders: [{ name: 'foo', uri: 'test://foo' }] }; const languageModes = getLanguageModes({ css: true, javascript: true }, workspace, ClientCapabilities.LATEST, getNodeFileFS()); - const javascriptMode = languageModes.getMode('javascript') + const javascriptMode = languageModes.getMode('javascript'); const position = document.positionAt(offset); if (javascriptMode) { const workspaceEdit: WorkspaceEdit | null = await javascriptMode.doRename!(document, position, newName); - assert.ok(workspaceEdit?.changes === undefined, 'Should not rename but rename happened') + assert.ok(workspaceEdit?.changes === undefined, 'Should not rename but rename happened'); } else { - assert.fail('should have javascriptMode but no') + assert.fail('should have javascriptMode but no'); } } @@ -73,7 +73,7 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; const output = [ '', @@ -84,10 +84,10 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; - await testRename(input.join('\n'), 'h', output.join('\n')) - }) + await testRename(input.join('\n'), 'h', output.join('\n')); + }); test('Rename Function', async () => { const input = [ @@ -102,7 +102,7 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; const output = [ '', @@ -116,10 +116,10 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; - await testRename(input.join('\n'), 'sayName', output.join('\n')) - }) + await testRename(input.join('\n'), 'sayName', output.join('\n')); + }); test('Rename Function Params', async () => { const input = [ @@ -134,7 +134,7 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; const output = [ '', @@ -148,10 +148,10 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; - await testRename(input.join('\n'), 'newName', output.join('\n')) - }) + await testRename(input.join('\n'), 'newName', output.join('\n')); + }); test('Rename Class', async () => { const input = [ @@ -163,7 +163,7 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; const output = [ '', @@ -174,10 +174,10 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; - await testRename(input.join('\n'), 'Bar', output.join('\n')) - }) + await testRename(input.join('\n'), 'Bar', output.join('\n')); + }); test('Cannot Rename literal', async () => { const stringLiteralInput = [ @@ -188,7 +188,7 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; const numberLiteralInput = [ '', '', @@ -197,9 +197,9 @@ suite('HTML Javascript Rename', () => { '', '', '' - ] + ]; - await testNoRename(stringLiteralInput.join('\n'), 'something') - await testNoRename(numberLiteralInput.join('\n'), 'hhhh') - }) + await testNoRename(stringLiteralInput.join('\n'), 'something'); + await testNoRename(numberLiteralInput.join('\n'), 'hhhh'); + }); }); diff --git a/extensions/html-language-features/server/src/test/words.test.ts b/extensions/html-language-features/server/src/test/words.test.ts index 95ed0f8e231..132589e6867 100644 --- a/extensions/html-language-features/server/src/test/words.test.ts +++ b/extensions/html-language-features/server/src/test/words.test.ts @@ -10,7 +10,7 @@ import * as path from 'path'; suite('HTML Language Configuration', () => { const config = JSON.parse((fs.readFileSync(path.join(__dirname, '../../../../html/language-configuration.json')).toString())); - function createRegex(str: string | { pattern: string, flags: string }): RegExp { + function createRegex(str: string | { pattern: string; flags: string }): RegExp { if (typeof str === 'string') { return new RegExp(str, 'g'); } diff --git a/extensions/html-language-features/server/src/utils/strings.ts b/extensions/html-language-features/server/src/utils/strings.ts index ff62faeee75..00a2ddcbd51 100644 --- a/extensions/html-language-features/server/src/utils/strings.ts +++ b/extensions/html-language-features/server/src/utils/strings.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -export function getWordAtText(text: string, offset: number, wordDefinition: RegExp): { start: number, length: number } { +export function getWordAtText(text: string, offset: number, wordDefinition: RegExp): { start: number; length: number } { let lineStart = offset; while (lineStart > 0 && !isNewlineCharacter(text.charCodeAt(lineStart - 1))) { lineStart--; diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index 73cdea4e73d..cce214f3546 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -7,15 +7,15 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== -vscode-css-languageservice@^5.1.9: - version "5.1.9" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.9.tgz#9d473e5c61fa6d4d62719d9b8715ff6c644bf14e" - integrity sha512-/tFOWeZBL3Oc9Zc+2MAi3rEwiXJTSZsvjB+M7nSjWLbGPUIjukUA7YzLgsBoUfR35sPJYnXWUkL56PdfIYM8GA== +vscode-css-languageservice@^5.1.12: + version "5.1.12" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.12.tgz#eed3a6a1bb8a7a70636ef07cd742a034c71635a1" + integrity sha512-293C5C2732Rbhh3opTs+nQBpC5Dd+oYrEA8lc0OWdyt40oYmJ331FV7NMF1SLFSIcOFB5XveLiWUZak2oyc49Q== dependencies: vscode-languageserver-textdocument "^1.0.1" vscode-languageserver-types "^3.16.0" @@ -50,6 +50,11 @@ vscode-languageserver-textdocument@^1.0.1: resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f" integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA== +vscode-languageserver-textdocument@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.3.tgz#879f2649bfa5a6e07bc8b392c23ede2dfbf43eff" + integrity sha512-ynEGytvgTb6HVSUwPJIAZgiHQmPCx8bZ8w5um5Lz+q5DjP0Zj8wTFhQpyg8xaMvefDytw2+HH5yzqS+FhsR28A== + vscode-languageserver-types@3.16.0, vscode-languageserver-types@^3.16.0: version "3.16.0" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" @@ -71,3 +76,8 @@ vscode-uri@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0" integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA== + +vscode-uri@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" + integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== diff --git a/extensions/html-language-features/yarn.lock b/extensions/html-language-features/yarn.lock index 65ed0650211..f9db6d421a7 100644 --- a/extensions/html-language-features/yarn.lock +++ b/extensions/html-language-features/yarn.lock @@ -2,10 +2,15 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== + +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== balanced-match@^1.0.0: version "1.0.0" @@ -46,11 +51,6 @@ semver@^7.3.4: dependencies: lru-cache "^6.0.0" -vscode-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== - vscode-jsonrpc@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" @@ -83,10 +83,10 @@ vscode-nls@^5.0.0: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA== -vscode-uri@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0" - integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA== +vscode-uri@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" + integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== yallist@^4.0.0: version "4.0.0" diff --git a/extensions/image-preview/media/main.js b/extensions/image-preview/media/main.js index 116f2942ed6..984e586c0f6 100644 --- a/extensions/image-preview/media/main.js +++ b/extensions/image-preview/media/main.js @@ -86,8 +86,8 @@ scale = 'fit'; image.classList.add('scale-to-fit'); image.classList.remove('pixelated'); - image.style.minWidth = 'auto'; - image.style.width = 'auto'; + // @ts-ignore Non-standard CSS property + image.style.zoom = 'normal'; vscode.setState(undefined); } else { scale = clamp(newScale, MIN_SCALE, MAX_SCALE); @@ -101,8 +101,8 @@ const dy = (window.scrollY + container.clientHeight / 2) / container.scrollHeight; image.classList.remove('scale-to-fit'); - image.style.minWidth = `${(image.naturalWidth * scale)}px`; - image.style.width = `${(image.naturalWidth * scale)}px`; + // @ts-ignore Non-standard CSS property + image.style.zoom = scale; const newScrollX = container.scrollWidth * dx - container.clientWidth / 2; const newScrollY = container.scrollHeight * dy - container.clientHeight / 2; @@ -319,6 +319,11 @@ }); window.addEventListener('message', e => { + if (e.origin !== window.origin) { + console.error('Dropping message from unknown origin in image preview'); + return; + } + switch (e.data.type) { case 'setScale': updateScale(e.data.scale); diff --git a/extensions/image-preview/package.json b/extensions/image-preview/package.json index a48f91c9ee1..286cc9b4daa 100644 --- a/extensions/image-preview/package.json +++ b/extensions/image-preview/package.json @@ -79,7 +79,7 @@ "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" }, "dependencies": { - "vscode-extension-telemetry": "0.4.4", + "@vscode/extension-telemetry": "0.4.6", "vscode-nls": "^5.0.0" }, "repository": { diff --git a/extensions/image-preview/yarn.lock b/extensions/image-preview/yarn.lock index e33774dcad6..89c03026025 100644 --- a/extensions/image-preview/yarn.lock +++ b/extensions/image-preview/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -vscode-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== vscode-nls@^5.0.0: version "5.0.0" diff --git a/extensions/ipynb/src/test/serializers.test.ts b/extensions/ipynb/src/test/serializers.test.ts index 49c16af97ba..26ca5b32aa9 100644 --- a/extensions/ipynb/src/test/serializers.test.ts +++ b/extensions/ipynb/src/test/serializers.test.ts @@ -633,5 +633,5 @@ suite('ipynb serializer', () => { assert.equal(mimeTypes, expectedMimeTypesOrder.join(',')); }); }); - }) + }); }); diff --git a/extensions/jake/package.json b/extensions/jake/package.json index 4bb8793f3ee..0e5ebc4ea8b 100644 --- a/extensions/jake/package.json +++ b/extensions/jake/package.json @@ -20,7 +20,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "main": "./out/main", "activationEvents": [ diff --git a/extensions/jake/yarn.lock b/extensions/jake/yarn.lock index f7a30098ef4..22c406bc73f 100644 --- a/extensions/jake/yarn.lock +++ b/extensions/jake/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/javascript/javascript-language-configuration.json b/extensions/javascript/javascript-language-configuration.json index d43cc356cb4..8fa9cb9786e 100644 --- a/extensions/javascript/javascript-language-configuration.json +++ b/extensions/javascript/javascript-language-configuration.json @@ -1,31 +1,103 @@ { + // Note that this file should stay in sync with 'typescript-language-basics/language-configuration.json' "comments": { "lineComment": "//", - "blockComment": [ "/*", "*/" ] + "blockComment": [ + "/*", + "*/" + ] }, "brackets": [ - ["${", "}"], - ["{", "}"], - ["[", "]"], - ["(", ")"] + [ + "${", + "}" + ], + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ] ], "autoClosingPairs": [ - { "open": "{", "close": "}" }, - { "open": "[", "close": "]" }, - { "open": "(", "close": ")" }, - { "open": "'", "close": "'", "notIn": ["string", "comment"] }, - { "open": "\"", "close": "\"", "notIn": ["string"] }, - { "open": "`", "close": "`", "notIn": ["string", "comment"] }, - { "open": "/**", "close": " */", "notIn": ["string"] } + { + "open": "{", + "close": "}" + }, + { + "open": "[", + "close": "]" + }, + { + "open": "(", + "close": ")" + }, + { + "open": "'", + "close": "'", + "notIn": [ + "string", + "comment" + ] + }, + { + "open": "\"", + "close": "\"", + "notIn": [ + "string" + ] + }, + { + "open": "`", + "close": "`", + "notIn": [ + "string", + "comment" + ] + }, + { + "open": "/**", + "close": " */", + "notIn": [ + "string" + ] + } ], "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["'", "'"], - ["\"", "\""], - ["`", "`"], - ["<", ">"] + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ], + [ + "'", + "'" + ], + [ + "\"", + "\"" + ], + [ + "`", + "`" + ], + [ + "<", + ">" + ] ], "autoCloseBefore": ";:.,=}])>` \n\t", "folding": { @@ -33,5 +105,89 @@ "start": "^\\s*//\\s*#?region\\b", "end": "^\\s*//\\s*#?endregion\\b" } - } + }, + "wordPattern": { + "pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>/\\?\\s]+)", + }, + "indentationRules": { + "decreaseIndentPattern": { + "pattern": "^((?!.*?/\\*).*\\*\/)?\\s*[\\}\\]].*$" + }, + "increaseIndentPattern": { + "pattern": "^((?!//).)*(\\{([^}\"'`/]*|(\\t|[ ])*//.*)|\\([^)\"'`/]*|\\[[^\\]\"'`/]*)$" + }, + // e.g. * ...| or */| or *-----*/| + "unIndentedLinePattern": { + "pattern": "^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$|^(\\t|[ ])*[ ]\\*/\\s*$|^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$" + } + }, + "onEnterRules": [ + { + // e.g. /** | */ + "beforeText": { + "pattern": "^\\s*/\\*\\*(?!/)([^\\*]|\\*(?!/))*$" + }, + "afterText": { + "pattern": "^\\s*\\*/$" + }, + "action": { + "indent": "indentOutdent", + "appendText": " * " + } + }, + { + // e.g. /** ...| + "beforeText": { + "pattern": "^\\s*/\\*\\*(?!/)([^\\*]|\\*(?!/))*$" + }, + "action": { + "indent": "none", + "appendText": " * " + } + }, + { + // e.g. * ...| + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$" + }, + "previousLineText": { + "pattern": "(?=^(\\s*(/\\*\\*|\\*)).*)(?=(?!(\\s*\\*/)))" + }, + "action": { + "indent": "none", + "appendText": "* " + } + }, + { + // e.g. */| + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*/\\s*$" + }, + "action": { + "indent": "none", + "removeText": 1 + }, + }, + { + // e.g. *-----*/| + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$" + }, + "action": { + "indent": "none", + "removeText": 1 + }, + }, + { + "beforeText": { + "pattern": "^\\s*(\\bcase\\s.+:|\\bdefault:)$" + }, + "afterText": { + "pattern": "^(?!\\s*(\\bcase\\b|\\bdefault\\b))" + }, + "action": { + "indent": "indent" + } + } + ] } diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index e25adfe34fe..5eab3c69bd1 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.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/TypeScript-TmLanguage/commit/644389aef914fc6fbc97a4dd799cc2d1431ffc87", + "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/56b7270f094b036256774702e3b7f96490981190", "name": "JavaScript (with React support)", "scopeName": "source.js", "patterns": [ @@ -5293,6 +5293,27 @@ } } }, + { + "begin": "(?x)((@)template)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + } + ] + }, { "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", "captures": { diff --git a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json index 44c08055382..c4789cde4e8 100644 --- a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScriptReact.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/TypeScript-TmLanguage/commit/644389aef914fc6fbc97a4dd799cc2d1431ffc87", + "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/56b7270f094b036256774702e3b7f96490981190", "name": "JavaScript (with React support)", "scopeName": "source.js.jsx", "patterns": [ @@ -5293,6 +5293,27 @@ } } }, + { + "begin": "(?x)((@)template)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + } + ] + }, { "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", "captures": { diff --git a/extensions/javascript/tags-language-configuration.json b/extensions/javascript/tags-language-configuration.json index 0d5bcc51ccf..6616eeca797 100644 --- a/extensions/javascript/tags-language-configuration.json +++ b/extensions/javascript/tags-language-configuration.json @@ -1,32 +1,152 @@ { "comments": { - "blockComment": [ "{/*", "*/}" ] + "blockComment": [ + "{/*", + "*/}" + ] }, "brackets": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["<", ">"] + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ], + [ + "<", + ">" + ] ], "colorizedBracketPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"] + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ] ], "autoClosingPairs": [ - { "open": "{", "close": "}" }, - { "open": "[", "close": "]" }, - { "open": "(", "close": ")" }, - { "open": "'", "close": "'", "notIn": ["string", "comment"] }, - { "open": "\"", "close": "\"", "notIn": ["string"] }, - { "open": "/**", "close": " */", "notIn": ["string"] } + { + "open": "{", + "close": "}" + }, + { + "open": "[", + "close": "]" + }, + { + "open": "(", + "close": ")" + }, + { + "open": "'", + "close": "'", + "notIn": [ + "string", + "comment" + ] + }, + { + "open": "\"", + "close": "\"", + "notIn": [ + "string" + ] + }, + { + "open": "/**", + "close": " */", + "notIn": [ + "string" + ] + } ], "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["<", ">"], - ["'", "'"], - ["\"", "\""] - ] -} \ No newline at end of file + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ], + [ + "<", + ">" + ], + [ + "'", + "'" + ], + [ + "\"", + "\"" + ] + ], + "wordPattern": { + "pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\$\\^\\&\\*\\(\\)\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:'\"\\,\\.\\<\\>\\/\\s]+)" + }, + "onEnterRules": [ + { + "beforeText": { + "pattern": "<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr))([_:\\w][_:\\w\\-.\\d]*)([^/>]*(?!/)>)[^<]*$", + "flags": "i" + }, + "afterText": { + "pattern": "^<\\/([_:\\w][_:\\w-.\\d]*)\\s*>$", + "flags": "i" + }, + "action": { + "indent": "indentOutdent" + } + }, + { + "beforeText": { + "pattern": "<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr))([_:\\w][_:\\w\\-.\\d]*)([^/>]*(?!/)>)[^<]*$", + "flags": "i" + }, + "action": { + "indent": "indent" + } + }, + { + // `beforeText` only applies to tokens of a given language. Since we are dealing with jsx-tags, + // make sure we apply to the closing `>` of a tag so that mixed language spans + // such as `
` are handled properly. + "beforeText": { + "pattern": "^>$" + }, + "afterText": { + "pattern": "/^<\\/([_:\\w][_:\\w-.\\d]*)\\s*>$", + "flags": "i" + }, + "action": { + "indent": "indentOutdent" + } + }, + { + "beforeText": { + "pattern": "^>$" + }, + "action": { + "indent": "indent" + } + } + ], +} diff --git a/extensions/json-language-features/client/src/jsonClient.ts b/extensions/json-language-features/client/src/jsonClient.ts index 01604b92d4e..8fa87867bb4 100644 --- a/extensions/json-language-features/client/src/jsonClient.ts +++ b/extensions/json-language-features/client/src/jsonClient.ts @@ -59,7 +59,7 @@ namespace ResultLimitReachedNotification { interface Settings { json?: { schemas?: JSONSchemaSettings[]; - format?: { enable: boolean; }; + format?: { enable: boolean }; resultLimit?: number; }; http?: { @@ -96,7 +96,7 @@ export type LanguageClientConstructor = (name: string, description: string, clie export interface Runtime { schemaRequests: SchemaRequestService; - telemetry?: TelemetryReporter + telemetry?: TelemetryReporter; } export interface SchemaRequestService { diff --git a/extensions/json-language-features/client/src/node/jsonClientMain.ts b/extensions/json-language-features/client/src/node/jsonClientMain.ts index b5ec23c29a9..9809074a5a9 100644 --- a/extensions/json-language-features/client/src/node/jsonClientMain.ts +++ b/extensions/json-language-features/client/src/node/jsonClientMain.ts @@ -11,7 +11,7 @@ import { promises as fs } from 'fs'; import * as path from 'path'; import { xhr, XHRResponse, getErrorStatusDescription, Headers } from 'request-light'; -import TelemetryReporter from 'vscode-extension-telemetry'; +import TelemetryReporter from '@vscode/extension-telemetry'; import { JSONSchemaCache } from './schemaCache'; let telemetry: TelemetryReporter | undefined; diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 6e87db294bb..520cb43cb5a 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -23,9 +23,6 @@ "supported": true } }, - "enabledApiProposals": [ - "languageStatus" - ], "scripts": { "compile": "npx gulp compile-extension:json-language-features-client compile-extension:json-language-features-server", "watch": "npx gulp watch-extension:json-language-features-client watch-extension:json-language-features-server", @@ -145,12 +142,12 @@ }, "dependencies": { "request-light": "^0.5.7", - "vscode-extension-telemetry": "0.4.4", + "@vscode/extension-telemetry": "0.4.6", "vscode-languageclient": "^7.0.0", "vscode-nls": "^5.0.0" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 77f01729428..65cd7dc407c 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -14,13 +14,13 @@ "dependencies": { "jsonc-parser": "^3.0.0", "request-light": "^0.5.7", - "vscode-json-languageservice": "^4.2.0-next.2", + "vscode-json-languageservice": "^4.2.0", "vscode-languageserver": "^7.0.0", - "vscode-uri": "^3.0.2" + "vscode-uri": "^3.0.3" }, "devDependencies": { "@types/mocha": "^8.2.0", - "@types/node": "14.x" + "@types/node": "16.x" }, "scripts": { "prepublishOnly": "npm run clean && npm run compile", diff --git a/extensions/json-language-features/server/src/jsonServer.ts b/extensions/json-language-features/server/src/jsonServer.ts index 612c5a22bda..a44baf31f30 100644 --- a/extensions/json-language-features/server/src/jsonServer.ts +++ b/extensions/json-language-features/server/src/jsonServer.ts @@ -56,12 +56,12 @@ export interface RequestService { export interface RuntimeEnvironment { file?: RequestService; - http?: RequestService + http?: RequestService; configureHttpRequests?(proxy: string, strictSSL: boolean): void; readonly timer: { setImmediate(callback: (...args: any[]) => void, ...args: any[]): Disposable; setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): Disposable; - } + }; } export function startServer(connection: Connection, runtime: RuntimeEnvironment) { @@ -168,7 +168,7 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) interface Settings { json: { schemas: JSONSchemaSettings[]; - format: { enable: boolean; }; + format: { enable: boolean }; resultLimit?: number; }; http: { @@ -185,7 +185,7 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) const limitExceededWarnings = function () { - const pendingWarnings: { [uri: string]: { features: { [name: string]: string }; timeout?: Disposable; } } = {}; + const pendingWarnings: { [uri: string]: { features: { [name: string]: string }; timeout?: Disposable } } = {}; const showLimitedNotification = (uri: string, resultLimit: number) => { const warning = pendingWarnings[uri]; @@ -358,7 +358,7 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment) connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] }); }); - const pendingValidationRequests: { [uri: string]: Disposable; } = {}; + const pendingValidationRequests: { [uri: string]: Disposable } = {}; const validationDelayMs = 300; function cleanPendingValidation(textDocument: TextDocument): void { diff --git a/extensions/json-language-features/server/src/languageModelCache.ts b/extensions/json-language-features/server/src/languageModelCache.ts index 561de4a9a7a..6deac59515e 100644 --- a/extensions/json-language-features/server/src/languageModelCache.ts +++ b/extensions/json-language-features/server/src/languageModelCache.ts @@ -12,7 +12,7 @@ export interface LanguageModelCache { } export function getLanguageModelCache(maxEntries: number, cleanupIntervalTimeInSec: number, parse: (document: TextDocument) => T): LanguageModelCache { - let languageModels: { [uri: string]: { version: number, languageId: string, cTime: number, languageModel: T } } = {}; + let languageModels: { [uri: string]: { version: number; languageId: string; cTime: number; languageModel: T } } = {}; let nModels = 0; let cleanupInterval: NodeJS.Timer | undefined = undefined; diff --git a/extensions/json-language-features/server/src/node/jsonServerMain.ts b/extensions/json-language-features/server/src/node/jsonServerMain.ts index 4cb387095aa..ad1ae439e59 100644 --- a/extensions/json-language-features/server/src/node/jsonServerMain.ts +++ b/extensions/json-language-features/server/src/node/jsonServerMain.ts @@ -36,7 +36,7 @@ function getHTTPRequestService(): RequestService { function getFileRequestService(): RequestService { return { - getContent(location: string, encoding?: string) { + getContent(location: string, encoding?: BufferEncoding) { return new Promise((c, e) => { const uri = Uri.parse(location); fs.readFile(uri.fsPath, encoding, (err, buf) => { diff --git a/extensions/json-language-features/server/yarn.lock b/extensions/json-language-features/server/yarn.lock index 1d1a3e53460..20cebe1fe27 100644 --- a/extensions/json-language-features/server/yarn.lock +++ b/extensions/json-language-features/server/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== jsonc-parser@^3.0.0: version "3.0.0" @@ -22,16 +22,16 @@ request-light@^0.5.7: resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.5.7.tgz#1c448c22153b55d2cd278eb414df24a5ad6e6d5e" integrity sha512-i/wKzvcx7Er8tZnvqSxWuNO5ZGggu2UgZAqj/RyZ0si7lBTXL7kZiI/dWxzxnQjaY7s5HEy1qK21Do4Ncr6cVw== -vscode-json-languageservice@^4.2.0-next.2: - version "4.2.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-4.2.0-next.2.tgz#9e47e06e8228948ddbc84ecd29d3fa724f3a2ea0" - integrity sha512-P0sdiZS7bM8+bxrkpL7XPwwhmZj94pcJIAZUh/QeessvYtXFnRmOEybe20rC+CS7b7DfwFcVt0p4p93hGZQ5gg== +vscode-json-languageservice@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-4.2.0.tgz#df0693b69ba2fbf0a6add896087b6f1c9c38f06a" + integrity sha512-XNawv0Vdy/sUK0S+hGf7cq/qsVAbIniGJr89TvZOqMCNJmpgKTy1e8PL1aWW0uy6BfWMG7vxa5lZb3ypuFtuGQ== dependencies: jsonc-parser "^3.0.0" - vscode-languageserver-textdocument "^1.0.1" + vscode-languageserver-textdocument "^1.0.3" vscode-languageserver-types "^3.16.0" vscode-nls "^5.0.0" - vscode-uri "^3.0.2" + vscode-uri "^3.0.3" vscode-jsonrpc@6.0.0: version "6.0.0" @@ -46,10 +46,10 @@ vscode-languageserver-protocol@3.16.0: vscode-jsonrpc "6.0.0" vscode-languageserver-types "3.16.0" -vscode-languageserver-textdocument@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f" - integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA== +vscode-languageserver-textdocument@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.3.tgz#879f2649bfa5a6e07bc8b392c23ede2dfbf43eff" + integrity sha512-ynEGytvgTb6HVSUwPJIAZgiHQmPCx8bZ8w5um5Lz+q5DjP0Zj8wTFhQpyg8xaMvefDytw2+HH5yzqS+FhsR28A== vscode-languageserver-types@3.16.0, vscode-languageserver-types@^3.16.0: version "3.16.0" @@ -68,7 +68,7 @@ vscode-nls@^5.0.0: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA== -vscode-uri@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0" - integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA== +vscode-uri@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" + integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index dd68c87d0a5..5315a0e5315 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -2,10 +2,15 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== + +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== balanced-match@^1.0.0: version "1.0.0" @@ -51,11 +56,6 @@ semver@^7.3.4: dependencies: lru-cache "^6.0.0" -vscode-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== - vscode-jsonrpc@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" diff --git a/extensions/julia/cgmanifest.json b/extensions/julia/cgmanifest.json index 4c1fbf73268..9640a863021 100644 --- a/extensions/julia/cgmanifest.json +++ b/extensions/julia/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "JuliaEditorSupport/atom-language-julia", "repositoryUrl": "https://github.com/JuliaEditorSupport/atom-language-julia", - "commitHash": "cbf818c487848f8ab1293e0ff6650aaa3bf02f98" + "commitHash": "0805e96e0856cab9b33a1f1025f5613cfa19189b" } }, "license": "MIT", - "version": "0.21.2" + "version": "0.22.1" } ], "version": 1 diff --git a/extensions/julia/syntaxes/julia.tmLanguage.json b/extensions/julia/syntaxes/julia.tmLanguage.json index 0de484237d9..3d78b0f5975 100644 --- a/extensions/julia/syntaxes/julia.tmLanguage.json +++ b/extensions/julia/syntaxes/julia.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/JuliaEditorSupport/atom-language-julia/commit/cbf818c487848f8ab1293e0ff6650aaa3bf02f98", + "version": "https://github.com/JuliaEditorSupport/atom-language-julia/commit/0805e96e0856cab9b33a1f1025f5613cfa19189b", "name": "Julia", "scopeName": "source.julia", "comment": "This grammar is used by Atom (Oniguruma), GitHub (PCRE), and VSCode (Oniguruma),\nso all regexps must be compatible with both engines.\n\nSpecs:\n- https://github.com/kkos/oniguruma/blob/master/doc/RE\n- https://www.pcre.org/current/doc/html/", @@ -56,12 +56,12 @@ "name": "meta.bracket.julia" } }, - "end": "(?:\\])(?:(\\.)?'*)", + "end": "(\\])((?:\\.)?'*)", "endCaptures": { - "0": { + "1": { "name": "meta.bracket.julia" }, - "1": { + "2": { "name": "keyword.operator.transpose.julia" } }, @@ -95,10 +95,13 @@ "name": "meta.bracket.julia" } }, - "end": "\\)", + "end": "(\\))((?:\\.)?'*)", "endCaptures": { - "0": { + "1": { "name": "meta.bracket.julia" + }, + "2": { + "name": "keyword.operator.transpose.julia" } }, "patterns": [ @@ -286,7 +289,7 @@ "number": { "patterns": [ { - "match": "((?"] + ["\\left<", "\\right>"], + ["\\bigl(", "\\bigr)"], + ["\\bigl[", "\\bigr]"], + ["\\bigl\\{", "\\bigr\\}"], + ["\\Bigl(", "\\Bigr)"], + ["\\Bigl[", "\\Bigr]"], + ["\\Bigl\\{", "\\Bigr\\}"], + ["\\biggl(", "\\biggr)"], + ["\\biggl[", "\\biggr]"], + ["\\biggl\\{", "\\biggr\\}"], + ["\\Biggl(", "\\Biggr)"], + ["\\Biggl[", "\\Biggr]"], + ["\\Biggl\\{", "\\Biggr\\}"], + ["\\langle", "\\rangle"], + ["\\lvert", "\\rvert"], + ["\\lVert", "\\rVert"], + ["\\left|", "\\right|"], + ["\\left\\vert", "\\right\\vert"], + ["\\left\\|", "\\right\\|"], + ["\\left\\Vert", "\\right\\Vert"], + ["\\left\\langle", "\\right\\rangle"], + ["\\left\\lvert", "\\right\\rvert"], + ["\\left\\lVert", "\\right\\rVert"], + ["\\bigl\\langle", "\\bigr\\rangle"], + ["\\bigl|", "\\bigr|"], + ["\\bigl\\vert", "\\bigr\\vert"], + ["\\bigl\\lvert", "\\bigr\\rvert"], + ["\\bigl\\|", "\\bigr\\|"], + ["\\bigl\\lVert", "\\bigr\\rVert"], + ["\\bigl\\Vert", "\\bigr\\Vert"], + ["\\Bigl\\langle", "\\Bigr\\rangle"], + ["\\Bigl|", "\\Bigr|"], + ["\\Bigl\\lvert", "\\Bigr\\rvert"], + ["\\Bigl\\vert", "\\Bigr\\vert"], + ["\\Bigl\\|", "\\Bigr\\|"], + ["\\Bigl\\lVert", "\\Bigr\\rVert"], + ["\\Bigl\\Vert", "\\Bigr\\Vert"], + ["\\biggl\\langle", "\\biggr\\rangle"], + ["\\biggl|", "\\biggr|"], + ["\\biggl\\lvert", "\\biggr\\rvert"], + ["\\biggl\\vert", "\\biggr\\vert"], + ["\\biggl\\|", "\\biggr\\|"], + ["\\biggl\\lVert", "\\biggr\\rVert"], + ["\\biggl\\Vert", "\\biggr\\Vert"], + ["\\Biggl\\langle", "\\Biggr\\rangle"], + ["\\Biggl|", "\\Biggr|"], + ["\\Biggl\\lvert", "\\Biggr\\rvert"], + ["\\Biggl\\vert", "\\Biggr\\vert"], + ["\\Biggl\\|", "\\Biggr\\|"], + ["\\Biggl\\lVert", "\\Biggr\\rVert"], + ["\\Biggl\\Vert", "\\Biggr\\Vert"] ], "autoClosingPairs": [ ["\\left(", "\\right)"], ["\\left[", "\\right]"], - ["\\left{", "\\right}"], + ["\\left\\{", "\\right\\}"], ["\\bigl(", "\\bigr)"], ["\\bigl[", "\\bigr]"], - ["\\bigl{", "\\bigr}"], + ["\\bigl\\{", "\\bigr\\}"], ["\\Bigl(", "\\Bigr)"], ["\\Bigl[", "\\Bigr]"], - ["\\Bigl{", "\\Bigr}"], + ["\\Bigl\\{", "\\Bigr\\}"], ["\\biggl(", "\\biggr)"], ["\\biggl[", "\\biggr]"], - ["\\biggl{", "\\biggr}"], + ["\\biggl\\{", "\\biggr\\}"], ["\\Biggl(", "\\Biggr)"], ["\\Biggl[", "\\Biggr]"], - ["\\Biggl{", "\\Biggr}"], + ["\\Biggl\\{", "\\Biggr\\}"], ["\\(", "\\)"], ["\\[", "\\]"], ["\\{", "\\}"], diff --git a/extensions/latex/markdown-latex-combined-language-configuration.json b/extensions/latex/markdown-latex-combined-language-configuration.json index 089701b0e2f..a42a4989a92 100644 --- a/extensions/latex/markdown-latex-combined-language-configuration.json +++ b/extensions/latex/markdown-latex-combined-language-configuration.json @@ -1,6 +1,5 @@ { "comments": { - // symbols used for start and end a block comment. Remove this entry if your language does not support block comments "blockComment": [ "" @@ -21,24 +20,74 @@ ["\\left\\{", "\\right\\}"], ["\\left\\{", "\\right."], ["\\left.", "\\right\\}"], - ["\\left<", "\\right>"] + ["\\left<", "\\right>"], + ["\\bigl(", "\\bigr)"], + ["\\bigl[", "\\bigr]"], + ["\\bigl\\{", "\\bigr\\}"], + ["\\Bigl(", "\\Bigr)"], + ["\\Bigl[", "\\Bigr]"], + ["\\Bigl\\{", "\\Bigr\\}"], + ["\\biggl(", "\\biggr)"], + ["\\biggl[", "\\biggr]"], + ["\\biggl\\{", "\\biggr\\}"], + ["\\Biggl(", "\\Biggr)"], + ["\\Biggl[", "\\Biggr]"], + ["\\Biggl\\{", "\\Biggr\\}"], + ["\\langle", "\\rangle"], + ["\\lvert", "\\rvert"], + ["\\lVert", "\\rVert"], + ["\\left|", "\\right|"], + ["\\left\\vert", "\\right\\vert"], + ["\\left\\|", "\\right\\|"], + ["\\left\\Vert", "\\right\\Vert"], + ["\\left\\langle", "\\right\\rangle"], + ["\\left\\lvert", "\\right\\rvert"], + ["\\left\\lVert", "\\right\\rVert"], + ["\\bigl\\langle", "\\bigr\\rangle"], + ["\\bigl|", "\\bigr|"], + ["\\bigl\\vert", "\\bigr\\vert"], + ["\\bigl\\lvert", "\\bigr\\rvert"], + ["\\bigl\\|", "\\bigr\\|"], + ["\\bigl\\lVert", "\\bigr\\rVert"], + ["\\bigl\\Vert", "\\bigr\\Vert"], + ["\\Bigl\\langle", "\\Bigr\\rangle"], + ["\\Bigl|", "\\Bigr|"], + ["\\Bigl\\lvert", "\\Bigr\\rvert"], + ["\\Bigl\\vert", "\\Bigr\\vert"], + ["\\Bigl\\|", "\\Bigr\\|"], + ["\\Bigl\\lVert", "\\Bigr\\rVert"], + ["\\Bigl\\Vert", "\\Bigr\\Vert"], + ["\\biggl\\langle", "\\biggr\\rangle"], + ["\\biggl|", "\\biggr|"], + ["\\biggl\\lvert", "\\biggr\\rvert"], + ["\\biggl\\vert", "\\biggr\\vert"], + ["\\biggl\\|", "\\biggr\\|"], + ["\\biggl\\lVert", "\\biggr\\rVert"], + ["\\biggl\\Vert", "\\biggr\\Vert"], + ["\\Biggl\\langle", "\\Biggr\\rangle"], + ["\\Biggl|", "\\Biggr|"], + ["\\Biggl\\lvert", "\\Biggr\\rvert"], + ["\\Biggl\\vert", "\\Biggr\\vert"], + ["\\Biggl\\|", "\\Biggr\\|"], + ["\\Biggl\\lVert", "\\Biggr\\rVert"], + ["\\Biggl\\Vert", "\\Biggr\\Vert"] ], "autoClosingPairs": [ ["\\left(", "\\right)"], ["\\left[", "\\right]"], - ["\\left{", "\\right}"], + ["\\left\\{", "\\right\\}"], ["\\bigl(", "\\bigr)"], ["\\bigl[", "\\bigr]"], - ["\\bigl{", "\\bigr}"], + ["\\bigl\\{", "\\bigr\\}"], ["\\Bigl(", "\\Bigr)"], ["\\Bigl[", "\\Bigr]"], - ["\\Bigl{", "\\Bigr}"], + ["\\Bigl\\{", "\\Bigr\\}"], ["\\biggl(", "\\biggr)"], ["\\biggl[", "\\biggr]"], - ["\\biggl{", "\\biggr}"], + ["\\biggl\\{", "\\biggr\\}"], ["\\Biggl(", "\\Biggr)"], ["\\Biggl[", "\\Biggr]"], - ["\\Biggl{", "\\Biggr}"], + ["\\Biggl\\{", "\\Biggr\\}"], ["\\(", "\\)"], ["\\[", "\\]"], ["\\{", "\\}"], @@ -56,19 +105,19 @@ ["$", "$"], ["`", "`"], ["_", "_"], - ["*", "*"], + ["*", "*"] ], "indentationRules": { "increaseIndentPattern": "\\\\begin{(?!document)([^}]*)}(?!.*\\\\end{\\1})", "decreaseIndentPattern": "^\\s*\\\\end{(?!document)" }, + "autoCloseBefore": ";:.,=}])>\\` \n\t$", + "wordPattern": "([^\\s`'\"~_!?|$#@%^&*\\-=+;:,.<>(){}[\\]\\/]+)", "folding": { "offSide": true, "markers": { "start": "^\\s*", "end": "^\\s*" } - }, - "autoCloseBefore": ";:.,=}])>\\` \n\t$", - "wordPattern": "([^\\s`'\"~_!?|$#@%^&*\\-=+;:,.<>(){}[\\]\\/]+)" + } } diff --git a/extensions/latex/syntaxes/Bibtex.tmLanguage.json b/extensions/latex/syntaxes/Bibtex.tmLanguage.json index f86b49a22f3..3fe919168e8 100644 --- a/extensions/latex/syntaxes/Bibtex.tmLanguage.json +++ b/extensions/latex/syntaxes/Bibtex.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/jlelong/vscode-latex-basics/commit/45cf7d1b88b959dcb16bccf60da7ef4494c1acc9", + "version": "https://github.com/jlelong/vscode-latex-basics/commit/b98c2d4911652824fc990f4b26c9c30be59b78a2", "name": "BibTeX", "scopeName": "text.bibtex", "comment": "Grammar based on description from http://artis.imag.fr/~Xavier.Decoret/resources/xdkbibtex/bibtex_summary.html#comment\n\t\n\tTODO: Does not support @preamble\n\t", diff --git a/extensions/latex/syntaxes/LaTeX.tmLanguage.json b/extensions/latex/syntaxes/LaTeX.tmLanguage.json index 129859024d6..b47a2f4b009 100644 --- a/extensions/latex/syntaxes/LaTeX.tmLanguage.json +++ b/extensions/latex/syntaxes/LaTeX.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/jlelong/vscode-latex-basics/commit/e1bb99ae10eae344e7c72f5b17e81ff7377991c4", + "version": "https://github.com/jlelong/vscode-latex-basics/commit/b98c2d4911652824fc990f4b26c9c30be59b78a2", "name": "LaTeX", "scopeName": "text.tex.latex", "patterns": [ @@ -465,7 +465,7 @@ "end": "(\\\\end\\{\\2\\}(?:\\s*\\n)?)" }, { - "begin": "((?:\\s*)\\\\begin\\{((?:julia|jl)code(?:\\*)?)\\}(?:\\[.*\\])?)", + "begin": "((?:\\s*)\\\\begin\\{((?:julia|jl)(?:code|verbatim|block|concode|console|converbatim)(?:\\*)?)\\}(?:\\[.*\\])?)", "captures": { "1": { "patterns": [ diff --git a/extensions/latex/syntaxes/TeX.tmLanguage.json b/extensions/latex/syntaxes/TeX.tmLanguage.json index 2c7b91ee5e8..ff494480295 100644 --- a/extensions/latex/syntaxes/TeX.tmLanguage.json +++ b/extensions/latex/syntaxes/TeX.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/jlelong/vscode-latex-basics/commit/afcc321aa1c119c37eb1aa3e2c1aa30bd039dd7f", + "version": "https://github.com/jlelong/vscode-latex-basics/commit/b98c2d4911652824fc990f4b26c9c30be59b78a2", "name": "TeX", "scopeName": "text.tex", "patterns": [ @@ -167,7 +167,7 @@ "name": "punctuation.math.bracket.pair.tex" }, { - "match": "\\\\(left|right|((big|bigg|Big|Bigg)[lr]?))([\\(\\[\\<\\>\\]\\)\\.]|\\\\{|\\\\})", + "match": "\\\\(left|right|((big|bigg|Big|Bigg)[lr]?))([\\(\\[\\<\\>\\]\\)\\.\\|]|\\\\[{}|]|\\\\[lr]?[Vv]ert|\\\\[lr]angle|\\\\\\|)", "name": "punctuation.math.bracket.pair.big.tex" }, { diff --git a/extensions/latex/syntaxes/markdown-latex-combined.tmLanguage.json b/extensions/latex/syntaxes/markdown-latex-combined.tmLanguage.json index 05e23e8686d..6c9720e38bf 100644 --- a/extensions/latex/syntaxes/markdown-latex-combined.tmLanguage.json +++ b/extensions/latex/syntaxes/markdown-latex-combined.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/jlelong/vscode-latex-basics/commit/db888fc191f6b5610cd6866cc49017fc3dfb00b5", + "version": "https://github.com/jlelong/vscode-latex-basics/commit/5f26a6daf70352a6f3f40b3b4437a605f5d954ee", "name": "Markdown", "scopeName": "text.tex.markdown_latex_combined", "patterns": [ @@ -1784,6 +1784,72 @@ } ] }, + "fenced_code_block_latex": { + "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(latex|tex)((\\s+|:|,|\\{|\\?)[^`~]*)?$)", + "name": "markup.fenced_code.block.markdown", + "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$", + "beginCaptures": { + "3": { + "name": "punctuation.definition.markdown" + }, + "4": { + "name": "fenced_code.block.language.markdown" + }, + "5": { + "name": "fenced_code.block.language.attributes.markdown" + } + }, + "endCaptures": { + "3": { + "name": "punctuation.definition.markdown" + } + }, + "patterns": [ + { + "begin": "(^|\\G)(\\s*)(.*)", + "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", + "contentName": "meta.embedded.block.latex", + "patterns": [ + { + "include": "text.tex.latex" + } + ] + } + ] + }, + "fenced_code_block_bibtex": { + "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(bibtex)((\\s+|:|,|\\{|\\?)[^`~]*)?$)", + "name": "markup.fenced_code.block.markdown", + "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$", + "beginCaptures": { + "3": { + "name": "punctuation.definition.markdown" + }, + "4": { + "name": "fenced_code.block.language.markdown" + }, + "5": { + "name": "fenced_code.block.language.attributes.markdown" + } + }, + "endCaptures": { + "3": { + "name": "punctuation.definition.markdown" + } + }, + "patterns": [ + { + "begin": "(^|\\G)(\\s*)(.*)", + "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", + "contentName": "meta.embedded.block.bibtex", + "patterns": [ + { + "include": "text.bibtex" + } + ] + } + ] + }, "fenced_code_block": { "patterns": [ { @@ -1942,6 +2008,12 @@ { "include": "#fenced_code_block_elixir" }, + { + "include": "#fenced_code_block_latex" + }, + { + "include": "#fenced_code_block_bibtex" + }, { "include": "#fenced_code_block_unknown" } @@ -2480,13 +2552,13 @@ "image-inline": { "captures": { "1": { - "name": "punctuation.definition.string.begin.markdown" + "name": "punctuation.definition.link.description.begin.markdown" }, "2": { "name": "string.other.link.description.markdown" }, "4": { - "name": "punctuation.definition.string.end.markdown" + "name": "punctuation.definition.link.description.end.markdown" }, "5": { "name": "punctuation.definition.metadata.markdown" @@ -2537,13 +2609,13 @@ "image-ref": { "captures": { "1": { - "name": "punctuation.definition.string.begin.markdown" + "name": "punctuation.definition.link.description.begin.markdown" }, "2": { "name": "string.other.link.description.markdown" }, "4": { - "name": "punctuation.definition.string.begin.markdown" + "name": "punctuation.definition.link.description.end.markdown" }, "5": { "name": "punctuation.definition.constant.markdown" @@ -2652,13 +2724,13 @@ "link-inline": { "captures": { "1": { - "name": "punctuation.definition.string.begin.markdown" + "name": "punctuation.definition.link.title.begin.markdown" }, "2": { "name": "string.other.link.title.markdown" }, "4": { - "name": "punctuation.definition.string.end.markdown" + "name": "punctuation.definition.link.title.end.markdown" }, "5": { "name": "punctuation.definition.metadata.markdown" @@ -2709,13 +2781,13 @@ "link-ref": { "captures": { "1": { - "name": "punctuation.definition.string.begin.markdown" + "name": "punctuation.definition.link.title.begin.markdown" }, "2": { "name": "string.other.link.title.markdown" }, "4": { - "name": "punctuation.definition.string.end.markdown" + "name": "punctuation.definition.link.title.end.markdown" }, "5": { "name": "punctuation.definition.constant.begin.markdown" @@ -2733,13 +2805,13 @@ "link-ref-literal": { "captures": { "1": { - "name": "punctuation.definition.string.begin.markdown" + "name": "punctuation.definition.link.title.begin.markdown" }, "2": { "name": "string.other.link.title.markdown" }, "4": { - "name": "punctuation.definition.string.end.markdown" + "name": "punctuation.definition.link.title.end.markdown" }, "5": { "name": "punctuation.definition.constant.begin.markdown" @@ -2754,13 +2826,13 @@ "link-ref-shortcut": { "captures": { "1": { - "name": "punctuation.definition.string.begin.markdown" + "name": "punctuation.definition.link.title.begin.markdown" }, "2": { "name": "string.other.link.title.markdown" }, "3": { - "name": "punctuation.definition.string.end.markdown" + "name": "punctuation.definition.link.title.end.markdown" } }, "match": "(\\[)(\\S+?)(\\])", diff --git a/extensions/lua/cgmanifest.json b/extensions/lua/cgmanifest.json index 6cefc1ca59e..2318a09b737 100644 --- a/extensions/lua/cgmanifest.json +++ b/extensions/lua/cgmanifest.json @@ -4,13 +4,13 @@ "component": { "type": "git", "git": { - "name": "textmate/lua.tmbundle", - "repositoryUrl": "https://github.com/textmate/lua.tmbundle", - "commitHash": "8ae5641365b28f697121ba1133890e8d81f5b00e" + "name": "sumneko/lua.tmbundle", + "repositoryUrl": "https://github.com/sumneko/lua.tmbundle", + "commitHash": "e531d0a651f1de222c6059d6e2edaca61b4dd4c4" } }, "licenseDetail": [ - "Copyright (c) textmate-lua.tmbundle project authors", + "Copyright (c) sumneko-lua.tmbundle project authors", "", "If not otherwise specified (see below), files in this repository fall under the following license:", "", @@ -25,7 +25,7 @@ "\"tidy\" is accompanied by \"tidy-license.txt\"." ], "license": "TextMate Bundle License", - "version": "0.0.0" + "version": "1.0.0" } ], "version": 1 diff --git a/extensions/lua/package.json b/extensions/lua/package.json index 8161da9f705..43e18471bac 100644 --- a/extensions/lua/package.json +++ b/extensions/lua/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/lua.tmbundle Syntaxes/Lua.plist ./syntaxes/lua.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin sumneko/lua.tmbundle Syntaxes/Lua.plist ./syntaxes/lua.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/lua/syntaxes/lua.tmLanguage.json b/extensions/lua/syntaxes/lua.tmLanguage.json index c2b31570531..4ef52fccff2 100644 --- a/extensions/lua/syntaxes/lua.tmLanguage.json +++ b/extensions/lua/syntaxes/lua.tmLanguage.json @@ -1,146 +1,99 @@ { "information_for_contributors": [ - "This file has been converted from https://github.com/textmate/lua.tmbundle/blob/master/Syntaxes/Lua.plist", + "This file has been converted from https://github.com/sumneko/lua.tmbundle/blob/master/Syntaxes/Lua.plist", "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/textmate/lua.tmbundle/commit/8ae5641365b28f697121ba1133890e8d81f5b00e", + "version": "https://github.com/sumneko/lua.tmbundle/commit/e531d0a651f1de222c6059d6e2edaca61b4dd4c4", "name": "Lua", "scopeName": "source.lua", "patterns": [ { - "begin": "\\b(?:(local)\\s+)?(function)\\s*(?:\\s+([a-zA-Z_][a-zA-Z0-9_]*(?:([\\.:])[a-zA-Z_][a-zA-Z0-9_]*)?)\\s*)?(\\()", + "begin": "\\b(?:(local)\\s+)?(function)\\b(?![,:])", "beginCaptures": { "1": { - "name": "storage.modifier.local.lua" + "name": "keyword.local.lua" }, "2": { "name": "keyword.control.lua" - }, - "3": { - "name": "entity.name.function.lua" - }, - "4": { - "name": "punctuation.separator.parameter.lua" - }, - "5": { - "name": "punctuation.definition.parameters.begin.lua" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.parameters.end.lua" } }, + "end": "(?<=[\\)\\-{}\\[\\]\"'])", "name": "meta.function.lua", "patterns": [ { - "match": "[a-zA-Z_][a-zA-Z0-9_]*", - "name": "variable.parameter.function.lua" + "include": "#comment" }, { - "match": ",", - "name": "punctuation.separator.arguments.lua" + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.definition.parameters.begin.lua" + } + }, + "end": "(\\))|(?=[\\-\\.{}\\[\\]\"'])", + "endCaptures": { + "1": { + "name": "punctuation.definition.parameters.finish.lua" + } + }, + "name": "meta.parameter.lua", + "patterns": [ + { + "include": "#comment" + }, + { + "match": "[a-zA-Z_][a-zA-Z0-9_]*", + "name": "variable.parameter.function.lua" + }, + { + "match": ",", + "name": "punctuation.separator.arguments.lua" + }, + { + "begin": ":", + "beginCaptures": { + "0": { + "name": "punctuation.separator.arguments.lua" + } + }, + "end": "(?=[\\),])", + "patterns": [ + { + "include": "#luadoc.type" + } + ] + } + ] + }, + { + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b\\s*(?=:)", + "name": "entity.name.class.lua" + }, + { + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b", + "name": "entity.name.function.lua" } ] }, - { - "match": "(?", + "captures": { + "1": { + "name": "string.tag.lua" + } + } + }, + { + "match": "\\<[a-zA-Z_\\*][a-zA-Z0-9_\\.\\*\\-]*\\>", + "name": "storage.type.generic.lua" + }, + { + "match": "\\b(break|do|else|for|if|elseif|goto|return|then|repeat|while|until|end|in)\\b", "name": "keyword.control.lua" }, { - "match": "(?=?|(?=?|(?|\\<", + "name": "keyword.operator.lua" + } + ] + }, + { + "begin": "(?<=---\\s*)@see", + "beginCaptures": { + "0": { + "name": "storage.type.annotation.lua" + } + }, + "end": "(?=\\n)", + "patterns": [ + { + "match": "\\b([a-zA-Z_\\*][a-zA-Z0-9_\\.\\*\\-]*)", + "name": "support.class.lua" + }, + { + "match": "#", + "name": "keyword.operator.lua" + } + ] + }, + { + "begin": "(?<=---\\s*)@diagnostic", + "beginCaptures": { + "0": { + "name": "storage.type.annotation.lua" + } + }, + "end": "(?=\\n)", + "patterns": [ + { + "begin": "([a-zA-Z_\\-0-9]+)[ \\t]*(:)?", + "beginCaptures": { + "1": { + "name": "keyword.other.unit" + }, + "2": { + "name": "keyword.operator.unit" + } + }, + "end": "(?=\\n)", + "patterns": [ + { + "match": "\\b([a-zA-Z_\\*][a-zA-Z0-9_\\-]*)", + "name": "support.class.lua" + }, + { + "match": ",", + "name": "keyword.operator.lua" + } + ] + } + ] + }, + { + "begin": "(?<=---\\s*)@module", + "beginCaptures": { + "0": { + "name": "storage.type.annotation.lua" + } + }, + "end": "(?=\\n)", + "patterns": [ + { + "include": "#string" + } + ] + }, + { + "match": "(?<=---\\s*)@(async|nodiscard)", + "name": "storage.type.annotation.lua" + }, + { + "begin": "(?<=---)\\|\\s*[\\>\\+]?", + "beginCaptures": { + "0": { + "name": "storage.type.annotation.lua" + } + }, + "end": "(?=[\\n#])", + "patterns": [ + { + "include": "#string" + } + ] + } + ] + }, + "luadoc.type": { + "patterns": [ + { + "begin": "\\bfun\\b", + "beginCaptures": { + "0": { + "name": "keyword.control.lua" + } + }, + "end": "(?=\\s)", + "patterns": [ + { + "match": "[\\(\\),:\\?][ \\t]*", + "name": "keyword.operator.lua" + }, + { + "match": "([a-zA-Z_][a-zA-Z0-9_\\.\\*\\[\\]\\<\\>\\,\\-]*)(?", + "name": "storage.type.generic.lua" + }, + { + "match": "\\basync\\b", + "name": "entity.name.tag.lua" + }, + { + "match": "[\\{\\}\\:\\,\\?\\|\\`][ \\t]*", + "name": "keyword.operator.lua" + }, + { + "begin": "(?=[a-zA-Z_\\.\\*\"'\\[])", + "end": "(?=[\\s\\)\\,\\?\\:\\}\\|])", + "patterns": [ + { + "match": "([a-zA-Z0-9_\\.\\*\\[\\]\\<\\>\\,\\-]+)(? { * If an exact match, returns a single element. If the line is between elements, * returns the element prior to and the element after the given line. */ -export function getElementsForSourceLine(targetLine: number, documentVersion: number): { previous: CodeLineElement; next?: CodeLineElement; } { +export function getElementsForSourceLine(targetLine: number, documentVersion: number): { previous: CodeLineElement; next?: CodeLineElement } { const lineNumber = Math.floor(targetLine); const lines = getCodeLineElements(documentVersion); let previous = lines[0] || null; @@ -71,7 +71,7 @@ export function getElementsForSourceLine(targetLine: number, documentVersion: nu /** * Find the html elements that are at a specific pixel offset on the page. */ -export function getLineElementsAtPageOffset(offset: number, documentVersion: number): { previous: CodeLineElement; next?: CodeLineElement; } { +export function getLineElementsAtPageOffset(offset: number, documentVersion: number): { previous: CodeLineElement; next?: CodeLineElement } { const lines = getCodeLineElements(documentVersion); const position = offset - window.scrollY; let lo = -1; @@ -98,7 +98,7 @@ export function getLineElementsAtPageOffset(offset: number, documentVersion: num return { previous: hiElement }; } -function getElementBounds({ element }: CodeLineElement): { top: number, height: number } { +function getElementBounds({ element }: CodeLineElement): { top: number; height: number } { const myBounds = element.getBoundingClientRect(); // Some code line elements may contain other code line elements. diff --git a/extensions/markdown-language-features/preview-src/settings.ts b/extensions/markdown-language-features/preview-src/settings.ts index a1212fdf432..1ba5604f90e 100644 --- a/extensions/markdown-language-features/preview-src/settings.ts +++ b/extensions/markdown-language-features/preview-src/settings.ts @@ -6,7 +6,7 @@ export interface PreviewSettings { readonly source: string; readonly line?: number; - readonly fragment?: string + readonly fragment?: string; readonly lineCount: number; readonly scrollPreviewWithEditor?: boolean; readonly scrollEditorWithPreview: boolean; diff --git a/extensions/markdown-language-features/src/extension.ts b/extensions/markdown-language-features/src/extension.ts index 588bc9d1da8..7602cee8ed8 100644 --- a/extensions/markdown-language-features/src/extension.ts +++ b/extensions/markdown-language-features/src/extension.ts @@ -55,7 +55,7 @@ function registerMarkdownLanguageFeatures( return vscode.Disposable.from( vscode.languages.registerDocumentSymbolProvider(selector, symbolProvider), - vscode.languages.registerDocumentLinkProvider(selector, new LinkProvider()), + vscode.languages.registerDocumentLinkProvider(selector, new LinkProvider(engine)), vscode.languages.registerFoldingRangeProvider(selector, new MarkdownFoldingProvider(engine)), vscode.languages.registerSelectionRangeProvider(selector, new MarkdownSmartSelect(engine)), vscode.languages.registerWorkspaceSymbolProvider(new MarkdownWorkspaceSymbolProvider(symbolProvider)), diff --git a/extensions/markdown-language-features/src/features/documentLinkProvider.ts b/extensions/markdown-language-features/src/features/documentLinkProvider.ts index 53c6bda676c..86be23fdfb9 100644 --- a/extensions/markdown-language-features/src/features/documentLinkProvider.ts +++ b/extensions/markdown-language-features/src/features/documentLinkProvider.ts @@ -6,6 +6,7 @@ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { OpenDocumentLinkCommand } from '../commands/openDocumentLink'; +import { MarkdownEngine } from '../markdownEngine'; import { getUriForLinkWithKnownExternalScheme, isOfScheme, Schemes } from '../util/links'; import { dirname } from '../util/path'; @@ -14,7 +15,7 @@ const localize = nls.loadMessageBundle(); function parseLink( document: vscode.TextDocument, link: string, -): { uri: vscode.Uri, tooltip?: string } | undefined { +): { uri: vscode.Uri; tooltip?: string } | undefined { const cleanLink = stripAngleBrackets(link); const externalSchemeUri = getUriForLinkWithKnownExternalScheme(cleanLink); @@ -105,33 +106,67 @@ export function stripAngleBrackets(link: string) { const linkPattern = /(\[((!\[[^\]]*?\]\(\s*)([^\s\(\)]+?)\s*\)\]|(?:\\\]|[^\]])*\])\(\s*)(([^\s\(\)]|\([^\s\(\)]*?\))+)\s*(".*?")?\)/g; const referenceLinkPattern = /(\[((?:\\\]|[^\]])+)\]\[\s*?)([^\s\]]*?)\]/g; const definitionPattern = /^([\t ]*\[(?!\^)((?:\\\]|[^\]])+)\]:\s*)([^<]\S*|<[^>]+>)/gm; +const inlineCodePattern = /(?:^|[^`])(`+)(?:.+?|.*?(?:(?:\r?\n).+?)*?)(?:\r?\n)?\1(?:$|[^`])/gm; + +interface CodeInDocument { + /** + * code blocks and fences each represented by [line_start,line_end). + */ + readonly multiline: ReadonlyArray<[number, number]>; + + /** + * inline code spans each represented by {@link vscode.Range}. + */ + readonly inline: readonly vscode.Range[]; +} + +async function findCode(document: vscode.TextDocument, engine: MarkdownEngine): Promise { + const tokens = await engine.parse(document); + const multiline = tokens.filter(t => (t.type === 'code_block' || t.type === 'fence') && !!t.map).map(t => t.map) as [number, number][]; + + const text = document.getText(); + const inline = [...text.matchAll(inlineCodePattern)].map(match => { + const start = match.index || 0; + return new vscode.Range(document.positionAt(start), document.positionAt(start + match[0].length)); + }); + + return { multiline, inline }; +} + +function isLinkInsideCode(code: CodeInDocument, link: vscode.DocumentLink) { + return code.multiline.some(interval => link.range.start.line >= interval[0] && link.range.start.line < interval[1]) || + code.inline.some(position => position.intersection(link.range)); +} export default class LinkProvider implements vscode.DocumentLinkProvider { + constructor( + private readonly engine: MarkdownEngine + ) { } - public provideDocumentLinks( + public async provideDocumentLinks( document: vscode.TextDocument, _token: vscode.CancellationToken - ): vscode.DocumentLink[] { + ): Promise { const text = document.getText(); - return [ - ...this.providerInlineLinks(text, document), + ...(await this.providerInlineLinks(text, document)), ...this.provideReferenceLinks(text, document) ]; } - private providerInlineLinks( + private async providerInlineLinks( text: string, document: vscode.TextDocument, - ): vscode.DocumentLink[] { + ): Promise { const results: vscode.DocumentLink[] = []; + const codeInDocument = await findCode(document, this.engine); for (const match of text.matchAll(linkPattern)) { const matchImage = match[4] && extractDocumentLink(document, match[3].length + 1, match[4], match.index); - if (matchImage) { + if (matchImage && !isLinkInsideCode(codeInDocument, matchImage)) { results.push(matchImage); } const matchLink = extractDocumentLink(document, match[1].length, match[5], match.index); - if (matchLink) { + if (matchLink && !isLinkInsideCode(codeInDocument, matchLink)) { results.push(matchLink); } } @@ -190,7 +225,7 @@ export default class LinkProvider implements vscode.DocumentLinkProvider { } public static getDefinitions(text: string, document: vscode.TextDocument) { - const out = new Map(); + const out = new Map(); for (const match of text.matchAll(definitionPattern)) { const pre = match[1]; const reference = match[2]; diff --git a/extensions/markdown-language-features/src/features/documentSymbolProvider.ts b/extensions/markdown-language-features/src/features/documentSymbolProvider.ts index 1f1904ec6b7..065602ea368 100644 --- a/extensions/markdown-language-features/src/features/documentSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/documentSymbolProvider.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; -import { SkinnyTextDocument, TableOfContentsProvider, TocEntry } from '../tableOfContentsProvider'; +import { SkinnyTextDocument, TableOfContents, TocEntry } from '../tableOfContentsProvider'; interface MarkdownSymbol { readonly level: number; @@ -20,22 +20,22 @@ export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolPr ) { } public async provideDocumentSymbolInformation(document: SkinnyTextDocument): Promise { - const toc = await new TableOfContentsProvider(this.engine, document).getToc(); - return toc.map(entry => this.toSymbolInformation(entry)); + const toc = await TableOfContents.create(this.engine, document); + return toc.entries.map(entry => this.toSymbolInformation(entry)); } public async provideDocumentSymbols(document: SkinnyTextDocument): Promise { - const toc = await new TableOfContentsProvider(this.engine, document).getToc(); + const toc = await TableOfContents.create(this.engine, document); const root: MarkdownSymbol = { level: -Infinity, children: [], parent: undefined }; - this.buildTree(root, toc); + this.buildTree(root, toc.entries); return root.children; } - private buildTree(parent: MarkdownSymbol, entries: TocEntry[]) { + private buildTree(parent: MarkdownSymbol, entries: readonly TocEntry[]) { if (!entries.length) { return; } diff --git a/extensions/markdown-language-features/src/features/foldingProvider.ts b/extensions/markdown-language-features/src/features/foldingProvider.ts index a8db242d138..305649e753e 100644 --- a/extensions/markdown-language-features/src/features/foldingProvider.ts +++ b/extensions/markdown-language-features/src/features/foldingProvider.ts @@ -6,7 +6,7 @@ import Token = require('markdown-it/lib/token'); import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; -import { TableOfContentsProvider } from '../tableOfContentsProvider'; +import { TableOfContents } from '../tableOfContentsProvider'; const rangeLimit = 5000; @@ -38,7 +38,7 @@ export default class MarkdownFoldingProvider implements vscode.FoldingRangeProvi const regionMarkers = tokens.filter(isRegionMarker) .map(token => ({ line: token.map[0], isStart: isStartRegion(token.content) })); - const nestingStack: { line: number, isStart: boolean }[] = []; + const nestingStack: { line: number; isStart: boolean }[] = []; return regionMarkers .map(marker => { if (marker.isStart) { @@ -54,9 +54,8 @@ export default class MarkdownFoldingProvider implements vscode.FoldingRangeProvi } private async getHeaderFoldingRanges(document: vscode.TextDocument) { - const tocProvider = new TableOfContentsProvider(this.engine, document); - const toc = await tocProvider.getToc(); - return toc.map(entry => { + const toc = await TableOfContents.create(this.engine, document); + return toc.entries.map(entry => { let endLine = entry.location.range.end.line; if (document.lineAt(endLine).isEmptyOrWhitespace && endLine >= entry.line + 1) { endLine = endLine - 1; diff --git a/extensions/markdown-language-features/src/features/pathCompletions.ts b/extensions/markdown-language-features/src/features/pathCompletions.ts index 001a69a5bfc..adb675277ff 100644 --- a/extensions/markdown-language-features/src/features/pathCompletions.ts +++ b/extensions/markdown-language-features/src/features/pathCompletions.ts @@ -6,7 +6,7 @@ import { dirname, resolve } from 'path'; import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; -import { TableOfContentsProvider } from '../tableOfContentsProvider'; +import { TableOfContents } from '../tableOfContentsProvider'; import { resolveUriToMarkdownFile } from '../util/openDocumentLink'; import LinkProvider from './documentLinkProvider'; @@ -60,7 +60,7 @@ interface CompletionContext { /** * Info if the link looks like it is for an anchor: `[](#header)` */ - readonly anchorInfo?: AnchorContext + readonly anchorInfo?: AnchorContext; } export class PathCompletionProvider implements vscode.CompletionItemProvider { @@ -232,13 +232,12 @@ export class PathCompletionProvider implements vscode.CompletionItemProvider { } private async *provideHeaderSuggestions(document: vscode.TextDocument, position: vscode.Position, context: CompletionContext, insertionRange: vscode.Range): AsyncIterable { - const tocProvider = new TableOfContentsProvider(this.engine, document); - const toc = await tocProvider.getToc(); - for (const entry of toc) { + const toc = await TableOfContents.createForDocumentOrNotebook(this.engine, document); + for (const entry of toc.entries) { const replacementRange = new vscode.Range(insertionRange.start, position.translate({ characterDelta: context.linkSuffix.length })); yield { kind: vscode.CompletionItemKind.Reference, - label: '#' + entry.slug.value, + label: '#' + decodeURI(entry.slug.value), range: { inserting: insertionRange, replacing: replacementRange, @@ -288,23 +287,44 @@ export class PathCompletionProvider implements vscode.CompletionItemProvider { } private resolveReference(document: vscode.TextDocument, ref: string): vscode.Uri | undefined { + const docUri = this.getFileUriOfTextDocument(document); + if (ref.startsWith('/')) { - const workspaceFolder = vscode.workspace.getWorkspaceFolder(document.uri); + const workspaceFolder = vscode.workspace.getWorkspaceFolder(docUri); if (workspaceFolder) { return vscode.Uri.joinPath(workspaceFolder.uri, ref); + } else { + return this.resolvePath(docUri, ref.slice(1)); } } + return this.resolvePath(docUri, ref); + } + + private resolvePath(root: vscode.Uri, ref: string): vscode.Uri | undefined { try { - if (document.uri.scheme === 'file') { - return vscode.Uri.file(resolve(dirname(document.uri.fsPath), ref)); + if (root.scheme === 'file') { + return vscode.Uri.file(resolve(dirname(root.fsPath), ref)); } else { - return document.uri.with({ - path: resolve(dirname(document.uri.path), ref), + return root.with({ + path: resolve(dirname(root.path), ref), }); } - } catch (e) { + } catch { return undefined; } } + + private getFileUriOfTextDocument(document: vscode.TextDocument) { + if (document.uri.scheme === 'vscode-notebook-cell') { + const notebook = vscode.workspace.notebookDocuments + .find(notebook => notebook.getCells().some(cell => cell.document === document)); + + if (notebook) { + return notebook.uri; + } + } + + return document.uri; + } } diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 16c28212ec3..69d9d23066f 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -26,7 +26,7 @@ interface WebviewMessage { interface CacheImageSizesMessage extends WebviewMessage { readonly type: 'cacheImageSizes'; - readonly body: { id: string, width: number, height: number; }[]; + readonly body: { id: string; width: number; height: number }[]; } interface RevealLineMessage extends WebviewMessage { @@ -79,7 +79,7 @@ export class PreviewDocumentVersion { interface MarkdownPreviewDelegate { getTitle?(resource: vscode.Uri): string; - getAdditionalState(): {}, + getAdditionalState(): {}; openPreviewLinkToMarkdownFile(markdownLink: vscode.Uri, fragment: string): void; } @@ -117,7 +117,7 @@ class MarkdownPreview extends Disposable implements WebviewResourceProvider { private currentVersion?: PreviewDocumentVersion; private isScrolling = false; private _disposed: boolean = false; - private imageInfo: { readonly id: string, readonly width: number, readonly height: number; }[] = []; + private imageInfo: { readonly id: string; readonly width: number; readonly height: number }[] = []; private readonly _fileWatchersBySrc = new Map(); private readonly _unwatchedImageSchemes = new Set(['https', 'http', 'data']); @@ -521,6 +521,8 @@ export interface ManagedMarkdownPreview { export class StaticMarkdownPreview extends Disposable implements ManagedMarkdownPreview { + public static readonly customEditorViewType = 'vscode.markdown.preview.editor'; + public static revive( resource: vscode.Uri, webview: vscode.WebviewPanel, @@ -552,7 +554,11 @@ export class StaticMarkdownPreview extends Disposable implements ManagedMarkdown const topScrollLocation = scrollLine ? new StartingScrollLine(scrollLine) : undefined; this.preview = this._register(new MarkdownPreview(this._webviewPanel, resource, topScrollLocation, { getAdditionalState: () => { return {}; }, - openPreviewLinkToMarkdownFile: () => { /* todo */ } + openPreviewLinkToMarkdownFile: (markdownLink, fragment) => { + return vscode.commands.executeCommand('vscode.openWith', markdownLink.with({ + fragment + }), StaticMarkdownPreview.customEditorViewType, this._webviewPanel.viewColumn); + } }, engine, contentProvider, _previewConfigurations, logger, contributionProvider)); this._register(this._webviewPanel.onDidDispose(() => { @@ -642,6 +648,8 @@ export class DynamicMarkdownPreview extends Disposable implements ManagedMarkdow contributionProvider: MarkdownContributionProvider, engine: MarkdownEngine, ): DynamicMarkdownPreview { + webview.iconPath = contentProvider.iconPath; + return new DynamicMarkdownPreview(webview, input, contentProvider, previewConfigurations, logger, topmostLineMonitor, contributionProvider, engine); } @@ -661,6 +669,8 @@ export class DynamicMarkdownPreview extends Disposable implements ManagedMarkdow DynamicMarkdownPreview.getPreviewTitle(input.resource, input.locked), previewColumn, { enableFindWidget: true, }); + webview.iconPath = contentProvider.iconPath; + return new DynamicMarkdownPreview(webview, input, contentProvider, previewConfigurations, logger, topmostLineMonitor, contributionProvider, engine); } diff --git a/extensions/markdown-language-features/src/features/previewContentProvider.ts b/extensions/markdown-language-features/src/features/previewContentProvider.ts index 8a973f9faa0..172d37c838a 100644 --- a/extensions/markdown-language-features/src/features/previewContentProvider.ts +++ b/extensions/markdown-language-features/src/features/previewContentProvider.ts @@ -52,7 +52,14 @@ export class MarkdownContentProvider { private readonly cspArbiter: ContentSecurityPolicyArbiter, private readonly contributionProvider: MarkdownContributionProvider, private readonly logger: Logger - ) { } + ) { + this.iconPath = { + dark: vscode.Uri.joinPath(this.context.extensionUri, 'media', 'preview-dark.svg'), + light: vscode.Uri.joinPath(this.context.extensionUri, 'media', 'preview-light.svg'), + }; + } + + public readonly iconPath: { light: vscode.Uri; dark: vscode.Uri }; public async provideTextDocumentContent( markdownDocument: vscode.TextDocument, diff --git a/extensions/markdown-language-features/src/features/previewManager.ts b/extensions/markdown-language-features/src/features/previewManager.ts index 5797ddb8865..6b7e3bdbc89 100644 --- a/extensions/markdown-language-features/src/features/previewManager.ts +++ b/extensions/markdown-language-features/src/features/previewManager.ts @@ -65,8 +65,6 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview private _activePreview: ManagedMarkdownPreview | undefined = undefined; - private readonly customEditorViewType = 'vscode.markdown.preview.editor'; - public constructor( private readonly _contentProvider: MarkdownContentProvider, private readonly _logger: Logger, @@ -75,7 +73,7 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview ) { super(); this._register(vscode.window.registerWebviewPanelSerializer(DynamicMarkdownPreview.viewType, this)); - this._register(vscode.window.registerCustomEditorProvider(this.customEditorViewType, this, { + this._register(vscode.window.registerCustomEditorProvider(StaticMarkdownPreview.customEditorViewType, this, { webviewOptions: { enableFindWidget: true } })); diff --git a/extensions/markdown-language-features/src/features/smartSelect.ts b/extensions/markdown-language-features/src/features/smartSelect.ts index 5faae2b4ead..fdeab7990e2 100644 --- a/extensions/markdown-language-features/src/features/smartSelect.ts +++ b/extensions/markdown-language-features/src/features/smartSelect.ts @@ -5,7 +5,7 @@ import Token = require('markdown-it/lib/token'); import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; -import { TableOfContentsProvider, TocEntry } from '../tableOfContentsProvider'; +import { TableOfContents, TocEntry } from '../tableOfContentsProvider'; interface MarkdownItTokenWithMap extends Token { map: [number, number]; @@ -53,24 +53,22 @@ export default class MarkdownSmartSelect implements vscode.SelectionRangeProvide } private async getHeaderSelectionRange(document: vscode.TextDocument, position: vscode.Position): Promise { + const toc = await TableOfContents.create(this.engine, document); - const tocProvider = new TableOfContentsProvider(this.engine, document); - const toc = await tocProvider.getToc(); - - const headerInfo = getHeadersForPosition(toc, position); + const headerInfo = getHeadersForPosition(toc.entries, position); const headers = headerInfo.headers; let currentRange: vscode.SelectionRange | undefined; for (let i = 0; i < headers.length; i++) { - currentRange = createHeaderRange(headers[i], i === headers.length - 1, headerInfo.headerOnThisLine, currentRange, getFirstChildHeader(document, headers[i], toc)); + currentRange = createHeaderRange(headers[i], i === headers.length - 1, headerInfo.headerOnThisLine, currentRange, getFirstChildHeader(document, headers[i], toc.entries)); } return currentRange; } } -function getHeadersForPosition(toc: TocEntry[], position: vscode.Position): { headers: TocEntry[], headerOnThisLine: boolean } { +function getHeadersForPosition(toc: readonly TocEntry[], position: vscode.Position): { headers: TocEntry[]; headerOnThisLine: boolean } { const enclosingHeaders = toc.filter(header => header.location.range.start.line <= position.line && header.location.range.end.line >= position.line); const sortedHeaders = enclosingHeaders.sort((header1, header2) => (header1.line - position.line) - (header2.line - position.line)); const onThisLine = toc.find(header => header.line === position.line) !== undefined; @@ -166,7 +164,7 @@ function createFencedRange(token: MarkdownItTokenWithMap, cursorLine: number, do } function createBoldRange(lineText: string, cursorChar: number, cursorLine: number, parent?: vscode.SelectionRange): vscode.SelectionRange | undefined { - const regex = /(?:\*\*([^*]+)(?:\*([^*]+)([^*]+)\*)*([^*]+)\*\*)/g; + const regex = /\*\*([^*]+\*?[^*]+\*?[^*]+)\*\*/gim; const matches = [...lineText.matchAll(regex)].filter(match => lineText.indexOf(match[0]) <= cursorChar && lineText.indexOf(match[0]) + match[0].length >= cursorChar); if (matches.length) { // should only be one match, so select first and index 0 contains the entire match @@ -238,7 +236,7 @@ function isBlockElement(token: Token): boolean { return !['list_item_close', 'paragraph_close', 'bullet_list_close', 'inline', 'heading_close', 'heading_open'].includes(token.type); } -function getFirstChildHeader(document: vscode.TextDocument, header?: TocEntry, toc?: TocEntry[]): vscode.Position | undefined { +function getFirstChildHeader(document: vscode.TextDocument, header?: TocEntry, toc?: readonly TocEntry[]): vscode.Position | undefined { let childRange: vscode.Position | undefined; if (header && toc) { let children = toc.filter(t => header.location.range.contains(t.location.range) && t.location.range.start.line > header.location.range.start.line).sort((t1, t2) => t1.line - t2.line); diff --git a/extensions/markdown-language-features/src/tableOfContentsProvider.ts b/extensions/markdown-language-features/src/tableOfContentsProvider.ts index 4f0c55d0a2c..f8a71987d15 100644 --- a/extensions/markdown-language-features/src/tableOfContentsProvider.ts +++ b/extensions/markdown-language-features/src/tableOfContentsProvider.ts @@ -6,6 +6,7 @@ import * as vscode from 'vscode'; import { MarkdownEngine } from './markdownEngine'; import { githubSlugifier, Slug } from './slugify'; +import { isMarkdownFile } from './util/file'; export interface TocEntry { readonly slug: Slug; @@ -28,34 +29,46 @@ export interface SkinnyTextDocument { getText(): string; } -export class TableOfContentsProvider { - private toc?: TocEntry[]; +export class TableOfContents { - public constructor( - private engine: MarkdownEngine, - private document: SkinnyTextDocument - ) { } + public static async create(engine: MarkdownEngine, document: SkinnyTextDocument,): Promise { + const entries = await this.buildToc(engine, document); + return new TableOfContents(entries); + } - public async getToc(): Promise { - if (!this.toc) { - try { - this.toc = await this.buildToc(this.document); - } catch (e) { - this.toc = []; + public static async createForDocumentOrNotebook(engine: MarkdownEngine, document: SkinnyTextDocument): Promise { + if (document.uri.scheme === 'vscode-notebook-cell') { + const notebook = vscode.workspace.notebookDocuments + .find(notebook => notebook.getCells().some(cell => cell.document === document)); + + if (notebook) { + const entries: TocEntry[] = []; + + for (const cell of notebook.getCells()) { + if (cell.kind === vscode.NotebookCellKind.Markup && isMarkdownFile(cell.document)) { + entries.push(...(await this.buildToc(engine, cell.document))); + } + } + + return new TableOfContents(entries); } } - return this.toc; + + return this.create(engine, document); } - public async lookup(fragment: string): Promise { - const toc = await this.getToc(); + private constructor( + public readonly entries: readonly TocEntry[], + ) { } + + public lookup(fragment: string): TocEntry | undefined { const slug = githubSlugifier.fromHeading(fragment); - return toc.find(entry => entry.slug.equals(slug)); + return this.entries.find(entry => entry.slug.equals(slug)); } - private async buildToc(document: SkinnyTextDocument): Promise { + private static async buildToc(engine: MarkdownEngine, document: SkinnyTextDocument): Promise { const toc: TocEntry[] = []; - const tokens = await this.engine.parse(document); + const tokens = await engine.parse(document); const existingSlugEntries = new Map(); @@ -78,8 +91,8 @@ export class TableOfContentsProvider { toc.push({ slug, - text: TableOfContentsProvider.getHeaderText(line.text), - level: TableOfContentsProvider.getHeaderLevel(heading.markup), + text: TableOfContents.getHeaderText(line.text), + level: TableOfContents.getHeaderLevel(heading.markup), line: lineNumber, location: new vscode.Location(document.uri, new vscode.Range(lineNumber, 0, lineNumber, line.text.length)) diff --git a/extensions/markdown-language-features/src/telemetryReporter.ts b/extensions/markdown-language-features/src/telemetryReporter.ts index 1104332512d..fed59ea71c4 100644 --- a/extensions/markdown-language-features/src/telemetryReporter.ts +++ b/extensions/markdown-language-features/src/telemetryReporter.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { default as VSCodeTelemetryReporter } from 'vscode-extension-telemetry'; +import { default as VSCodeTelemetryReporter } from '@vscode/extension-telemetry'; interface IPackageInfo { name: string; diff --git a/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts b/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts index 5f333de8b9a..2394240a1cd 100644 --- a/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts +++ b/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts @@ -7,15 +7,16 @@ import * as assert from 'assert'; import 'mocha'; import * as vscode from 'vscode'; import LinkProvider from '../features/documentLinkProvider'; +import { createNewMarkdownEngine } from './engine'; import { InMemoryDocument } from './inMemoryDocument'; -import { noopToken } from './util'; +import { joinLines, noopToken } from './util'; const testFile = vscode.Uri.joinPath(vscode.workspace.workspaceFolders![0].uri, 'x.md'); function getLinksForFile(fileContents: string) { const doc = new InMemoryDocument(testFile, fileContents); - const provider = new LinkProvider(); + const provider = new LinkProvider(createNewMarkdownEngine()); return provider.provideDocumentLinks(doc, noopToken); } @@ -27,63 +28,63 @@ function assertRangeEqual(expected: vscode.Range, actual: vscode.Range) { } suite('markdown.DocumentLinkProvider', () => { - test('Should not return anything for empty document', () => { - const links = getLinksForFile(''); + test('Should not return anything for empty document', async () => { + const links = await getLinksForFile(''); assert.strictEqual(links.length, 0); }); - test('Should not return anything for simple document without links', () => { - const links = getLinksForFile('# a\nfdasfdfsafsa'); + test('Should not return anything for simple document without links', async () => { + const links = await getLinksForFile('# a\nfdasfdfsafsa'); assert.strictEqual(links.length, 0); }); - test('Should detect basic http links', () => { - const links = getLinksForFile('a [b](https://example.com) c'); + test('Should detect basic http links', async () => { + const links = await getLinksForFile('a [b](https://example.com) c'); assert.strictEqual(links.length, 1); const [link] = links; assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 25)); }); - test('Should detect basic workspace links', () => { + test('Should detect basic workspace links', async () => { { - const links = getLinksForFile('a [b](./file) c'); + const links = await getLinksForFile('a [b](./file) c'); assert.strictEqual(links.length, 1); const [link] = links; assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 12)); } { - const links = getLinksForFile('a [b](file.png) c'); + const links = await getLinksForFile('a [b](file.png) c'); assert.strictEqual(links.length, 1); const [link] = links; assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 14)); } }); - test('Should detect links with title', () => { - const links = getLinksForFile('a [b](https://example.com "abc") c'); + test('Should detect links with title', async () => { + const links = await getLinksForFile('a [b](https://example.com "abc") c'); assert.strictEqual(links.length, 1); const [link] = links; assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 25)); }); // #35245 - test('Should handle links with escaped characters in name', () => { - const links = getLinksForFile('a [b\\]](./file)'); + test('Should handle links with escaped characters in name', async () => { + const links = await getLinksForFile('a [b\\]](./file)'); assert.strictEqual(links.length, 1); const [link] = links; assertRangeEqual(link.range, new vscode.Range(0, 8, 0, 14)); }); - test('Should handle links with balanced parens', () => { + test('Should handle links with balanced parens', async () => { { - const links = getLinksForFile('a [b](https://example.com/a()c) c'); + const links = await getLinksForFile('a [b](https://example.com/a()c) c'); assert.strictEqual(links.length, 1); const [link] = links; assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 30)); } { - const links = getLinksForFile('a [b](https://example.com/a(b)c) c'); + const links = await getLinksForFile('a [b](https://example.com/a(b)c) c'); assert.strictEqual(links.length, 1); const [link] = links; assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 31)); @@ -91,15 +92,15 @@ suite('markdown.DocumentLinkProvider', () => { } { // #49011 - const links = getLinksForFile('[A link](http://ThisUrlhasParens/A_link(in_parens))'); + const links = await getLinksForFile('[A link](http://ThisUrlhasParens/A_link(in_parens))'); assert.strictEqual(links.length, 1); const [link] = links; assertRangeEqual(link.range, new vscode.Range(0, 9, 0, 50)); } }); - test('Should handle two links without space', () => { - const links = getLinksForFile('a ([test](test)[test2](test2)) c'); + test('Should handle two links without space', async () => { + const links = await getLinksForFile('a ([test](test)[test2](test2)) c'); assert.strictEqual(links.length, 2); const [link1, link2] = links; assertRangeEqual(link1.range, new vscode.Range(0, 10, 0, 14)); @@ -107,23 +108,23 @@ suite('markdown.DocumentLinkProvider', () => { }); // #49238 - test('should handle hyperlinked images', () => { + test('should handle hyperlinked images', async () => { { - const links = getLinksForFile('[![alt text](image.jpg)](https://example.com)'); + const links = await getLinksForFile('[![alt text](image.jpg)](https://example.com)'); assert.strictEqual(links.length, 2); const [link1, link2] = links; assertRangeEqual(link1.range, new vscode.Range(0, 13, 0, 22)); assertRangeEqual(link2.range, new vscode.Range(0, 25, 0, 44)); } { - const links = getLinksForFile('[![a]( whitespace.jpg )]( https://whitespace.com )'); + const links = await getLinksForFile('[![a]( whitespace.jpg )]( https://whitespace.com )'); assert.strictEqual(links.length, 2); const [link1, link2] = links; assertRangeEqual(link1.range, new vscode.Range(0, 7, 0, 21)); assertRangeEqual(link2.range, new vscode.Range(0, 26, 0, 48)); } { - const links = getLinksForFile('[![a](img1.jpg)](file1.txt) text [![a](img2.jpg)](file2.txt)'); + const links = await getLinksForFile('[![a](img1.jpg)](file1.txt) text [![a](img2.jpg)](file2.txt)'); assert.strictEqual(links.length, 4); const [link1, link2, link3, link4] = links; assertRangeEqual(link1.range, new vscode.Range(0, 6, 0, 14)); @@ -133,13 +134,13 @@ suite('markdown.DocumentLinkProvider', () => { } }); - test('Should not consider link references starting with ^ character valid (#107471)', () => { - const links = getLinksForFile('[^reference]: https://example.com'); + test('Should not consider link references starting with ^ character valid (#107471)', async () => { + const links = await getLinksForFile('[^reference]: https://example.com'); assert.strictEqual(links.length, 0); }); - test('Should find definitions links with spaces in angle brackets (#136073)', () => { - const links = getLinksForFile([ + test('Should find definitions links with spaces in angle brackets (#136073)', async () => { + const links = await getLinksForFile([ '[a]: ', '[b]: ', ].join('\n')); @@ -149,6 +150,73 @@ suite('markdown.DocumentLinkProvider', () => { assertRangeEqual(link1.range, new vscode.Range(0, 6, 0, 9)); assertRangeEqual(link2.range, new vscode.Range(1, 6, 1, 8)); }); + + test('Should not consider links in code fenced with backticks', async () => { + const text = joinLines( + '```', + '[b](https://example.com)', + '```'); + const links = await getLinksForFile(text); + assert.strictEqual(links.length, 0); + }); + + test('Should not consider links in code fenced with tilda', async () => { + const text = joinLines( + '~~~', + '[b](https://example.com)', + '~~~'); + const links = await getLinksForFile(text); + assert.strictEqual(links.length, 0); + }); + + test('Should not consider links in indented code', async () => { + const links = await getLinksForFile(' [b](https://example.com)'); + assert.strictEqual(links.length, 0); + }); + + test('Should not consider links in inline code span', async () => { + const links = await getLinksForFile('`[b](https://example.com)`'); + assert.strictEqual(links.length, 0); + }); + + test('Should not consider links with code span inside', async () => { + const links = await getLinksForFile('[li`nk](https://example.com`)'); + assert.strictEqual(links.length, 0); + }); + + test('Should not consider links in multiline inline code span', async () => { + const text = joinLines( + '`` ', + '[b](https://example.com)', + '``'); + const links = await getLinksForFile(text); + assert.strictEqual(links.length, 0); + }); + + test('Should not consider links in multiline inline code span between between text', async () => { + const text = joinLines( + '[b](https://1.com) `[b](https://2.com)', + '` [b](https://3.com)'); + const links = await getLinksForFile(text); + assert.deepStrictEqual(links.map(l => l.target?.authority), ['1.com', '3.com']); + }); + + test('Should not consider links in multiline inline code span with new line after the first backtick', async () => { + const text = joinLines( + '`', + '[b](https://example.com)`'); + const links = await getLinksForFile(text); + assert.strictEqual(links.length, 0); + }); + + test('Should not miss links in invalid multiline inline code span', async () => { + const text = joinLines( + '`` ', + '', + '[b](https://example.com)', + '', + '``'); + const links = await getLinksForFile(text); + assert.strictEqual(links.length, 1); + }); }); - - diff --git a/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts b/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts index c3027e5dfb8..ff9a0c8f7e7 100644 --- a/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts +++ b/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import 'mocha'; import * as vscode from 'vscode'; -import { TableOfContentsProvider } from '../tableOfContentsProvider'; +import { TableOfContents } from '../tableOfContentsProvider'; import { createNewMarkdownEngine } from './engine'; import { InMemoryDocument } from './inMemoryDocument'; @@ -16,36 +16,36 @@ const testFileName = vscode.Uri.file('test.md'); suite('markdown.TableOfContentsProvider', () => { test('Lookup should not return anything for empty document', async () => { const doc = new InMemoryDocument(testFileName, ''); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); - assert.strictEqual(await provider.lookup(''), undefined); - assert.strictEqual(await provider.lookup('foo'), undefined); + assert.strictEqual(provider.lookup(''), undefined); + assert.strictEqual(provider.lookup('foo'), undefined); }); test('Lookup should not return anything for document with no headers', async () => { const doc = new InMemoryDocument(testFileName, 'a *b*\nc'); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); - assert.strictEqual(await provider.lookup(''), undefined); - assert.strictEqual(await provider.lookup('foo'), undefined); - assert.strictEqual(await provider.lookup('a'), undefined); - assert.strictEqual(await provider.lookup('b'), undefined); + assert.strictEqual(provider.lookup(''), undefined); + assert.strictEqual(provider.lookup('foo'), undefined); + assert.strictEqual(provider.lookup('a'), undefined); + assert.strictEqual(provider.lookup('b'), undefined); }); test('Lookup should return basic #header', async () => { const doc = new InMemoryDocument(testFileName, `# a\nx\n# c`); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); { - const entry = await provider.lookup('a'); + const entry = provider.lookup('a'); assert.ok(entry); assert.strictEqual(entry!.line, 0); } { - assert.strictEqual(await provider.lookup('x'), undefined); + assert.strictEqual(provider.lookup('x'), undefined); } { - const entry = await provider.lookup('c'); + const entry = provider.lookup('c'); assert.ok(entry); assert.strictEqual(entry!.line, 2); } @@ -53,40 +53,40 @@ suite('markdown.TableOfContentsProvider', () => { test('Lookups should be case in-sensitive', async () => { const doc = new InMemoryDocument(testFileName, `# fOo\n`); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); - assert.strictEqual((await provider.lookup('fOo'))!.line, 0); - assert.strictEqual((await provider.lookup('foo'))!.line, 0); - assert.strictEqual((await provider.lookup('FOO'))!.line, 0); + assert.strictEqual((provider.lookup('fOo'))!.line, 0); + assert.strictEqual((provider.lookup('foo'))!.line, 0); + assert.strictEqual((provider.lookup('FOO'))!.line, 0); }); test('Lookups should ignore leading and trailing white-space, and collapse internal whitespace', async () => { const doc = new InMemoryDocument(testFileName, `# f o o \n`); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); - assert.strictEqual((await provider.lookup('f o o'))!.line, 0); - assert.strictEqual((await provider.lookup(' f o o'))!.line, 0); - assert.strictEqual((await provider.lookup(' f o o '))!.line, 0); - assert.strictEqual((await provider.lookup('f o o'))!.line, 0); - assert.strictEqual((await provider.lookup('f o o'))!.line, 0); + assert.strictEqual((provider.lookup('f o o'))!.line, 0); + assert.strictEqual((provider.lookup(' f o o'))!.line, 0); + assert.strictEqual((provider.lookup(' f o o '))!.line, 0); + assert.strictEqual((provider.lookup('f o o'))!.line, 0); + assert.strictEqual((provider.lookup('f o o'))!.line, 0); - assert.strictEqual(await provider.lookup('f'), undefined); - assert.strictEqual(await provider.lookup('foo'), undefined); - assert.strictEqual(await provider.lookup('fo o'), undefined); + assert.strictEqual(provider.lookup('f'), undefined); + assert.strictEqual(provider.lookup('foo'), undefined); + assert.strictEqual(provider.lookup('fo o'), undefined); }); test('should handle special characters #44779', async () => { const doc = new InMemoryDocument(testFileName, `# Indentação\n`); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); - assert.strictEqual((await provider.lookup('indentação'))!.line, 0); + assert.strictEqual((provider.lookup('indentação'))!.line, 0); }); test('should handle special characters 2, #48482', async () => { const doc = new InMemoryDocument(testFileName, `# Инструкция - Делай Раз, Делай Два\n`); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); - assert.strictEqual((await provider.lookup('инструкция---делай-раз-делай-два'))!.line, 0); + assert.strictEqual((provider.lookup('инструкция---делай-раз-делай-два'))!.line, 0); }); test('should handle special characters 3, #37079', async () => { @@ -97,32 +97,32 @@ suite('markdown.TableOfContentsProvider', () => { ### Заголовок Header 3 ## Заголовок`); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); - assert.strictEqual((await provider.lookup('header-2'))!.line, 0); - assert.strictEqual((await provider.lookup('header-3'))!.line, 1); - assert.strictEqual((await provider.lookup('Заголовок-2'))!.line, 2); - assert.strictEqual((await provider.lookup('Заголовок-3'))!.line, 3); - assert.strictEqual((await provider.lookup('Заголовок-header-3'))!.line, 4); - assert.strictEqual((await provider.lookup('Заголовок'))!.line, 5); + assert.strictEqual((provider.lookup('header-2'))!.line, 0); + assert.strictEqual((provider.lookup('header-3'))!.line, 1); + assert.strictEqual((provider.lookup('Заголовок-2'))!.line, 2); + assert.strictEqual((provider.lookup('Заголовок-3'))!.line, 3); + assert.strictEqual((provider.lookup('Заголовок-header-3'))!.line, 4); + assert.strictEqual((provider.lookup('Заголовок'))!.line, 5); }); test('Lookup should support suffixes for repeated headers', async () => { const doc = new InMemoryDocument(testFileName, `# a\n# a\n## a`); - const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + const provider = await TableOfContents.create(createNewMarkdownEngine(), doc); { - const entry = await provider.lookup('a'); + const entry = provider.lookup('a'); assert.ok(entry); assert.strictEqual(entry!.line, 0); } { - const entry = await provider.lookup('a-1'); + const entry = provider.lookup('a-1'); assert.ok(entry); assert.strictEqual(entry!.line, 1); } { - const entry = await provider.lookup('a-2'); + const entry = provider.lookup('a-2'); assert.ok(entry); assert.strictEqual(entry!.line, 2); } diff --git a/extensions/markdown-language-features/src/util/dispose.ts b/extensions/markdown-language-features/src/util/dispose.ts index 548094c28e5..175acf7b367 100644 --- a/extensions/markdown-language-features/src/util/dispose.ts +++ b/extensions/markdown-language-features/src/util/dispose.ts @@ -8,9 +8,7 @@ import * as vscode from 'vscode'; export function disposeAll(disposables: vscode.Disposable[]) { while (disposables.length) { const item = disposables.pop(); - if (item) { - item.dispose(); - } + item?.dispose(); } } @@ -39,4 +37,4 @@ export abstract class Disposable { protected get isDisposed() { return this._isDisposed; } -} \ No newline at end of file +} diff --git a/extensions/markdown-language-features/src/util/openDocumentLink.ts b/extensions/markdown-language-features/src/util/openDocumentLink.ts index 0db6b30862e..542cdbdb763 100644 --- a/extensions/markdown-language-features/src/util/openDocumentLink.ts +++ b/extensions/markdown-language-features/src/util/openDocumentLink.ts @@ -6,7 +6,7 @@ import * as path from 'path'; import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; -import { TableOfContentsProvider } from '../tableOfContentsProvider'; +import { TableOfContents } from '../tableOfContentsProvider'; import { isMarkdownFile } from './file'; import { extname } from './path'; @@ -104,8 +104,8 @@ function getViewColumn(resource: vscode.Uri): vscode.ViewColumn { } async function tryRevealLineUsingTocFragment(engine: MarkdownEngine, editor: vscode.TextEditor, fragment: string): Promise { - const toc = new TableOfContentsProvider(engine, editor.document); - const entry = await toc.lookup(fragment); + const toc = await TableOfContents.create(engine, editor.document); + const entry = toc.lookup(fragment); if (entry) { const lineStart = new vscode.Range(entry.line, 0, entry.line, 0); editor.selection = new vscode.Selection(lineStart.start, lineStart.end); diff --git a/extensions/markdown-language-features/src/util/topmostLineMonitor.ts b/extensions/markdown-language-features/src/util/topmostLineMonitor.ts index f2e0e2061ca..ad20cd0a7fd 100644 --- a/extensions/markdown-language-features/src/util/topmostLineMonitor.ts +++ b/extensions/markdown-language-features/src/util/topmostLineMonitor.ts @@ -38,7 +38,7 @@ export class TopmostLineMonitor extends Disposable { })); } - private readonly _onChanged = this._register(new vscode.EventEmitter<{ readonly resource: vscode.Uri, readonly line: number }>()); + private readonly _onChanged = this._register(new vscode.EventEmitter<{ readonly resource: vscode.Uri; readonly line: number }>()); public readonly onDidChanged = this._onChanged.event; public setPreviousStaticEditorLine(scrollLocation: LastScrollLocation): void { diff --git a/extensions/markdown-language-features/test-workspace/a.md b/extensions/markdown-language-features/test-workspace/a.md index 568bad19d4f..ac33150e63d 100644 --- a/extensions/markdown-language-features/test-workspace/a.md +++ b/extensions/markdown-language-features/test-workspace/a.md @@ -4,7 +4,17 @@ [./b.md](./b.md) -[/b.md](/b.md) +[/b.md](/b.md) `[/b.md](/b.md)` [b#header1](b#header1) +``` +[b](b) +``` + +~~~ +[b](b) +~~~ + + // Indented code + [b](b) diff --git a/extensions/markdown-language-features/yarn.lock b/extensions/markdown-language-features/yarn.lock index 279b1a3cb03..fea78e561e1 100644 --- a/extensions/markdown-language-features/yarn.lock +++ b/extensions/markdown-language-features/yarn.lock @@ -54,6 +54,11 @@ resolved "https://registry.yarnpkg.com/@types/vscode-webview/-/vscode-webview-1.57.0.tgz#bad5194d45ae8d03afc1c0f67f71ff5e7a243bbf" integrity sha512-x3Cb/SMa1IwRHfSvKaZDZOTh4cNoG505c3NjTqGlMC082m++x/ETUmtYniDsw6SSmYzZXO8KBNhYxR0+VqymqA== +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -117,11 +122,6 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -vscode-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== - vscode-nls@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" diff --git a/extensions/markdown-math/language-configuration.json b/extensions/markdown-math/language-configuration.json deleted file mode 100644 index 50e1a820422..00000000000 --- a/extensions/markdown-math/language-configuration.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "comments": { - "lineComment": "%" - }, - // symbols used as brackets - "brackets": [ - [ - "{", - "}" - ], - [ - "[", - "]" - ], - [ - "(", - ")" - ] - ], - "autoClosingPairs": [ - { - "open": "{", - "close": "}" - }, - { - "open": "[", - "close": "]" - }, - { - "open": "(", - "close": ")" - } - ], - "surroundingPairs": [ - [ - "(", - ")" - ], - [ - "[", - "]" - ], - [ - "{", - "}" - ], - [ - "'", - "'" - ], - [ - "\"", - "\"" - ] - ] -} diff --git a/extensions/markdown-math/package.json b/extensions/markdown-math/package.json index 5a4dbe3080b..8267989daee 100644 --- a/extensions/markdown-math/package.json +++ b/extensions/markdown-math/package.json @@ -26,8 +26,7 @@ "languages": [ { "id": "markdown-math", - "aliases": [], - "configuration": "./language-configuration.json" + "aliases": [] } ], "grammars": [ @@ -43,7 +42,7 @@ "text.html.markdown" ], "embeddedLanguages": { - "meta.embedded.math.markdown": "markdown-math" + "meta.embedded.math.markdown": "latex" } }, { @@ -53,7 +52,7 @@ "text.html.markdown" ], "embeddedLanguages": { - "meta.embedded.math.markdown": "markdown-math" + "meta.embedded.math.markdown": "latex" } } ], diff --git a/extensions/markdown-math/yarn.lock b/extensions/markdown-math/yarn.lock index afbc51221af..013a6eb85f6 100644 --- a/extensions/markdown-math/yarn.lock +++ b/extensions/markdown-math/yarn.lock @@ -4,7 +4,7 @@ "@iktakahiro/markdown-it-katex@https://github.com/mjbvz/markdown-it-katex.git": version "4.0.1" - resolved "https://github.com/mjbvz/markdown-it-katex.git#820d9025ad84937eb3f9f7efbc1be7595e20b19f" + resolved "https://github.com/mjbvz/markdown-it-katex.git#b1ed14de467031f5d4f9c1588dd1868cab0b8744" dependencies: katex "^0.13.0" @@ -18,14 +18,14 @@ resolved "https://registry.yarnpkg.com/@types/vscode-notebook-renderer/-/vscode-notebook-renderer-1.60.0.tgz#8a67d561f48ddf46a95dfa9f712a79c72c7b8f7a" integrity sha512-u7TD2uuEZTVuitx0iijOJdKI0JLiQP6PsSBSRy2XmHXUOXcp5p1S56NrjOEDoF+PIHd3NL3eO6KTRSf5nukDqQ== -commander@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== katex@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.0.tgz#62900e56c1ad8fdf7da23399e50d7a7b690b39ab" - integrity sha512-6cHbzbegYgS9vvVGuH8UA+o97X+ZshtboSqJJCdq7trBYzuD75JNwr7Ef606xkUjecPPhFnyB+afx1dVafielg== + version "0.13.24" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905" + integrity sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w== dependencies: - commander "^6.0.0" + commander "^8.0.0" diff --git a/extensions/merge-conflict/package.json b/extensions/merge-conflict/package.json index 942abb0ce9f..128538a8ad9 100644 --- a/extensions/merge-conflict/package.json +++ b/extensions/merge-conflict/package.json @@ -14,7 +14,7 @@ "Other" ], "capabilities": { - "virtualWorkspaces": false, + "virtualWorkspaces": true, "untrustedWorkspaces": { "supported": true } @@ -159,7 +159,7 @@ "vscode-nls": "^5.0.0" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/merge-conflict/src/contentProvider.ts b/extensions/merge-conflict/src/contentProvider.ts index d0e2b92a56c..5c24854b00e 100644 --- a/extensions/merge-conflict/src/contentProvider.ts +++ b/extensions/merge-conflict/src/contentProvider.ts @@ -23,7 +23,7 @@ export default class MergeConflictContentProvider implements vscode.TextDocument async provideTextDocumentContent(uri: vscode.Uri): Promise { try { - const { scheme, ranges } = JSON.parse(uri.query) as { scheme: string, ranges: [{ line: number, character: number }[], { line: number, character: number }[]][] }; + const { scheme, ranges } = JSON.parse(uri.query) as { scheme: string; ranges: [{ line: number; character: number }[], { line: number; character: number }[]][] }; // complete diff const document = await vscode.workspace.openTextDocument(uri.with({ scheme, query: '' })); diff --git a/extensions/merge-conflict/src/documentMergeConflict.ts b/extensions/merge-conflict/src/documentMergeConflict.ts index d3d421f22d1..3e8b44ba87d 100644 --- a/extensions/merge-conflict/src/documentMergeConflict.ts +++ b/extensions/merge-conflict/src/documentMergeConflict.ts @@ -32,7 +32,7 @@ export class DocumentMergeConflict implements interfaces.IDocumentMergeConflict return editor.edit((edit) => this.applyEdit(type, editor.document, edit)); } - public applyEdit(type: interfaces.CommitType, document: vscode.TextDocument, edit: { replace(range: vscode.Range, newText: string): void; }): void { + public applyEdit(type: interfaces.CommitType, document: vscode.TextDocument, edit: { replace(range: vscode.Range, newText: string): void }): void { // Each conflict is a set of ranges as follows, note placements or newlines // which may not in spans @@ -62,7 +62,7 @@ export class DocumentMergeConflict implements interfaces.IDocumentMergeConflict } } - private replaceRangeWithContent(content: string, edit: { replace(range: vscode.Range, newText: string): void; }) { + private replaceRangeWithContent(content: string, edit: { replace(range: vscode.Range, newText: string): void }) { if (this.isNewlineOnly(content)) { edit.replace(this.range, ''); return; diff --git a/extensions/merge-conflict/src/documentTracker.ts b/extensions/merge-conflict/src/documentTracker.ts index 74a7d9dfe99..7d2f57be3cb 100644 --- a/extensions/merge-conflict/src/documentTracker.ts +++ b/extensions/merge-conflict/src/documentTracker.ts @@ -17,12 +17,8 @@ class ScanTask { this.delayTask = new Delayer(delayTime); } - public addOrigin(name: string): boolean { - if (this.origins.has(name)) { - return false; - } - - return false; + public addOrigin(name: string): void { + this.origins.add(name); } public hasOrigin(name: string): boolean { diff --git a/extensions/merge-conflict/src/interfaces.ts b/extensions/merge-conflict/src/interfaces.ts index 836bb5baa5a..0943c263541 100644 --- a/extensions/merge-conflict/src/interfaces.ts +++ b/extensions/merge-conflict/src/interfaces.ts @@ -25,7 +25,7 @@ export interface IExtensionConfiguration { export interface IDocumentMergeConflict extends IDocumentMergeConflictDescriptor { commitEdit(type: CommitType, editor: vscode.TextEditor, edit?: vscode.TextEditorEdit): Thenable; - applyEdit(type: CommitType, document: vscode.TextDocument, edit: { replace(range: vscode.Range, newText: string): void; }): void; + applyEdit(type: CommitType, document: vscode.TextDocument, edit: { replace(range: vscode.Range, newText: string): void }): void; } export interface IDocumentMergeConflictDescriptor { diff --git a/extensions/merge-conflict/yarn.lock b/extensions/merge-conflict/yarn.lock index ede1d9c7736..699f1238a9b 100644 --- a/extensions/merge-conflict/yarn.lock +++ b/extensions/merge-conflict/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + 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.0.0: version "5.0.0" diff --git a/extensions/microsoft-authentication/media/auth.html b/extensions/microsoft-authentication/media/index.html similarity index 93% rename from extensions/microsoft-authentication/media/auth.html rename to extensions/microsoft-authentication/media/index.html index 0fcba4e3c62..9c0a9eec080 100644 --- a/extensions/microsoft-authentication/media/auth.html +++ b/extensions/microsoft-authentication/media/index.html @@ -1,10 +1,9 @@ - + - Azure Account - Sign In diff --git a/extensions/microsoft-authentication/package.json b/extensions/microsoft-authentication/package.json index 7495da51405..82fecbf5e91 100644 --- a/extensions/microsoft-authentication/package.json +++ b/extensions/microsoft-authentication/package.json @@ -15,6 +15,9 @@ "activationEvents": [ "onAuthenticationRequest:microsoft" ], + "enabledApiProposals": [ + "idToken" + ], "capabilities": { "virtualWorkspaces": true, "untrustedWorkspaces": { @@ -44,7 +47,7 @@ "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" }, "devDependencies": { - "@types/node": "14.x", + "@types/node": "16.x", "@types/node-fetch": "^2.5.7", "@types/randombytes": "^2.0.0", "@types/sha.js": "^2.4.0", @@ -52,12 +55,12 @@ }, "dependencies": { "buffer": "^5.6.0", - "node-fetch": "2.6.1", + "node-fetch": "2.6.7", "randombytes": "~2.1.0", "sha.js": "2.4.11", "stream": "0.0.2", "uuid": "^8.2.0", - "vscode-extension-telemetry": "0.4.4", + "@vscode/extension-telemetry": "0.4.6", "vscode-nls": "^5.0.0" }, "repository": { diff --git a/extensions/microsoft-authentication/src/AADHelper.ts b/extensions/microsoft-authentication/src/AADHelper.ts index 724311e0458..0590b8dd7d6 100644 --- a/extensions/microsoft-authentication/src/AADHelper.ts +++ b/extensions/microsoft-authentication/src/AADHelper.ts @@ -7,16 +7,16 @@ import * as randomBytes from 'randombytes'; import * as querystring from 'querystring'; import { Buffer } from 'buffer'; import * as vscode from 'vscode'; -import { createServer, startServer } from './authServer'; - +import * as nls from 'vscode-nls'; import { v4 as uuid } from 'uuid'; +import fetch, { Response } from 'node-fetch'; import { Keychain } from './keychain'; import Logger from './logger'; import { toBase64UrlEncoding } from './utils'; -import fetch, { Response } from 'node-fetch'; import { sha256 } from './env/node/sha256'; -import * as nls from 'vscode-nls'; -import { MicrosoftAuthenticationSession } from './microsoft-authentication'; +import { BetterTokenStorage, IDidChangeInOtherWindowEvent } from './betterSecretStorage'; +import { LoopbackAuthServer } from './authServer'; +import path = require('path'); const localize = nls.loadMessageBundle(); @@ -59,9 +59,9 @@ interface IStoredSession { scope: string; // Scopes are alphabetized and joined with a space account: { label?: string; - displayName?: string, - id: string - } + displayName?: string; + id: string; + }; } export interface ITokenResponse { @@ -80,11 +80,11 @@ export interface IMicrosoftTokens { } interface IScopeData { - scopes: string[], - scopeStr: string, - scopesToSend: string, - clientId: string, - tenant: string + scopes: string[]; + scopeStr: string; + scopesToSend: string; + clientId: string; + tenant: string; } function parseQuery(uri: vscode.Uri) { @@ -106,241 +106,80 @@ class UriEventHandler extends vscode.EventEmitter implements vscode. } export class AzureActiveDirectoryService { + // For details on why this is set to 2/3... see https://github.com/microsoft/vscode/issues/133201#issuecomment-966668197 + private static REFRESH_TIMEOUT_MODIFIER = 1000 * 2 / 3; + private static POLLING_CONSTANT = 1000 * 60 * 30; private _tokens: IToken[] = []; private _refreshTimeouts: Map = new Map(); private _refreshingPromise: Promise | undefined; private _uriHandler: UriEventHandler; - private _disposable: vscode.Disposable; // Used to keep track of current requests when not using the local server approach. private _pendingStates = new Map(); private _codeExchangePromises = new Map>(); private _codeVerfifiers = new Map(); - private _keychain: Keychain; + private readonly _tokenStorage: BetterTokenStorage; constructor(private _context: vscode.ExtensionContext) { - this._keychain = new Keychain(_context); + this._tokenStorage = new BetterTokenStorage('microsoft.login.keylist', _context); this._uriHandler = new UriEventHandler(); - this._disposable = vscode.Disposable.from( - vscode.window.registerUriHandler(this._uriHandler), - this._context.secrets.onDidChange(() => this.checkForUpdates())); + _context.subscriptions.push(vscode.window.registerUriHandler(this._uriHandler)); + _context.subscriptions.push(this._tokenStorage.onDidChangeInOtherWindow((e) => this.checkForUpdates(e))); } public async initialize(): Promise { - Logger.info('Reading sessions from keychain...'); - const storedData = await this._keychain.getToken(); - if (!storedData) { - Logger.info('No stored sessions found.'); - return; - } - Logger.info('Got stored sessions!'); + Logger.info('Reading sessions from secret storage...'); + let sessions = await this._tokenStorage.getAll(); + Logger.info(`Got ${sessions.length} stored sessions`); - try { - const sessions = this.parseStoredData(storedData); - const refreshes = sessions.map(async session => { - Logger.trace(`Read the following session from the keychain with the following scopes: ${session.scope}`); - if (!session.refreshToken) { - Logger.trace(`Session with the following scopes does not have a refresh token so we will not try to refresh it: ${session.scope}`); - return Promise.resolve(); - } - - try { - const scopes = session.scope.split(' '); - const scopeData: IScopeData = { - scopes, - scopeStr: session.scope, - // filter our special scopes - scopesToSend: scopes.filter(s => !s.startsWith('VSCODE_')).join(' '), - clientId: this.getClientId(scopes), - tenant: this.getTenantId(scopes), - }; - await this.refreshToken(session.refreshToken, scopeData, session.id); - } catch (e) { - // If we aren't connected to the internet, then wait and try to refresh again later. - if (e.message === REFRESH_NETWORK_FAILURE) { - this._tokens.push({ - accessToken: undefined, - refreshToken: session.refreshToken, - account: { - label: session.account.label ?? session.account.displayName!, - id: session.account.id - }, - scope: session.scope, - sessionId: session.id - }); - } else { - await this.removeSession(session.id); - } - } - }); - - await Promise.all(refreshes); - } catch (e) { - Logger.error(`Failed to initialize stored data: ${e}`); - await this.clearSessions(); - } - } - - private parseStoredData(data: string): IStoredSession[] { - return JSON.parse(data); - } - - private async storeTokenData(): Promise { - const serializedData: IStoredSession[] = this._tokens.map(token => { - return { - id: token.sessionId, - refreshToken: token.refreshToken, - scope: token.scope, - account: token.account - }; - }); - - Logger.trace('storing data into keychain...'); - await this._keychain.setToken(JSON.stringify(serializedData)); - } - - private async checkForUpdates(): Promise { - const added: vscode.AuthenticationSession[] = []; - let removed: vscode.AuthenticationSession[] = []; - const storedData = await this._keychain.getToken(); - if (storedData) { - try { - const sessions = this.parseStoredData(storedData); - let promises = sessions.map(async session => { - const matchesExisting = this._tokens.some(token => token.scope === session.scope && token.sessionId === session.id); - if (!matchesExisting && session.refreshToken) { - try { - const scopes = session.scope.split(' '); - const scopeData: IScopeData = { - scopes, - scopeStr: session.scope, - // filter our special scopes - scopesToSend: scopes.filter(s => !s.startsWith('VSCODE_')).join(' '), - clientId: this.getClientId(scopes), - tenant: this.getTenantId(scopes), - }; - const token = await this.refreshToken(session.refreshToken, scopeData, session.id); - added.push(this.convertToSessionSync(token)); - } catch (e) { - // Network failures will automatically retry on next poll. - if (e.message !== REFRESH_NETWORK_FAILURE) { - await this.removeSession(session.id); - } - } - } - }); - - promises = promises.concat(this._tokens.map(async token => { - const matchesExisting = sessions.some(session => token.scope === session.scope && token.sessionId === session.id); - if (!matchesExisting) { - await this.removeSession(token.sessionId); - removed.push(this.convertToSessionSync(token)); - } - })); - - await Promise.all(promises); - } catch (e) { - Logger.error(e.message); - // if data is improperly formatted, remove all of it and send change event - removed = this._tokens.map(this.convertToSessionSync); - this.clearSessions(); - } - } else { - if (this._tokens.length) { - // Log out all, remove all local data - removed = this._tokens.map(this.convertToSessionSync); - Logger.info('No stored keychain data, clearing local data'); - - this._tokens = []; - - this._refreshTimeouts.forEach(timeout => { - clearTimeout(timeout); - }); - - this._refreshTimeouts.clear(); - } + if (!sessions.length) { + sessions = await this.migrate(); } - if (added.length || removed.length) { - Logger.info(`Sending change event with ${added.length} added and ${removed.length} removed`); - onDidChangeSessions.fire({ added: added, removed: removed, changed: [] }); - } - } - - /** - * Return a session object without checking for expiry and potentially refreshing. - * @param token The token information. - */ - private convertToSessionSync(token: IToken): MicrosoftAuthenticationSession { - return { - id: token.sessionId, - accessToken: token.accessToken!, - idToken: token.idToken, - account: token.account, - scopes: token.scope.split(' ') - }; - } - - private async convertToSession(token: IToken): Promise { - const resolvedTokens = await this.resolveAccessAndIdTokens(token); - return { - id: token.sessionId, - accessToken: resolvedTokens.accessToken, - idToken: resolvedTokens.idToken, - account: token.account, - scopes: token.scope.split(' ') - }; - } - - private async resolveAccessAndIdTokens(token: IToken): Promise { - if (token.accessToken && (!token.expiresAt || token.expiresAt > Date.now())) { - token.expiresAt - ? Logger.info(`Token available from cache (for scopes ${token.scope}), expires in ${token.expiresAt - Date.now()} milliseconds`) - : Logger.info('Token available from cache (for scopes ${token.scope})'); - return Promise.resolve({ - accessToken: token.accessToken, - idToken: token.idToken - }); - } - - try { - Logger.info(`Token expired or unavailable (for scopes ${token.scope}), trying refresh`); - const scopes = token.scope.split(' '); + const refreshes = sessions.map(async session => { + Logger.trace(`Read the following stored session with scopes: ${session.scope}`); + const scopes = session.scope.split(' '); const scopeData: IScopeData = { scopes, - scopeStr: token.scope, + scopeStr: session.scope, // filter our special scopes scopesToSend: scopes.filter(s => !s.startsWith('VSCODE_')).join(' '), clientId: this.getClientId(scopes), tenant: this.getTenantId(scopes), }; - const refreshedToken = await this.refreshToken(token.refreshToken, scopeData, token.sessionId); - if (refreshedToken.accessToken) { - return { - accessToken: refreshedToken.accessToken, - idToken: refreshedToken.idToken - }; - } else { - throw new Error(); + try { + await this.refreshToken(session.refreshToken, scopeData, session.id); + } catch (e) { + // If we aren't connected to the internet, then wait and try to refresh again later. + if (e.message === REFRESH_NETWORK_FAILURE) { + this._tokens.push({ + accessToken: undefined, + refreshToken: session.refreshToken, + account: { + label: session.account.label ?? session.account.displayName!, + id: session.account.id + }, + scope: session.scope, + sessionId: session.id + }); + } else { + Logger.error(e); + await this.removeSession(session.id); + } + } + }); + + const result = await Promise.allSettled(refreshes); + for (const res of result) { + if (res.status === 'rejected') { + Logger.error(`Failed to initialize stored data: ${res.reason}`); + this.clearSessions(); } - } catch (e) { - throw new Error('Unavailable due to network problems'); } } - private getTokenClaims(accessToken: string): ITokenClaims { - try { - return JSON.parse(Buffer.from(accessToken.split('.')[1], 'base64').toString()); - } catch (e) { - Logger.error(e.message); - throw new Error('Unable to read token claims'); - } - } - - get sessions(): Promise { - return Promise.all(this._tokens.map(token => this.convertToSession(token))); - } + //#region session operations async getSessions(scopes?: string[]): Promise { Logger.info(`Getting sessions for ${scopes?.join(',') ?? 'all scopes'}...`); @@ -364,7 +203,13 @@ export class AzureActiveDirectoryService { return Promise.all(matchingTokens.map(token => this.convertToSession(token))); } - public async createSession(scopes: string[]): Promise { + public createSession(scopes: string[]): Promise { + if (!scopes.includes('openid')) { + scopes.push('openid'); + } + if (!scopes.includes('email')) { + scopes.push('email'); + } const scopeData: IScopeData = { scopes, scopeStr: scopes.join(' '), @@ -382,100 +227,67 @@ export class AzureActiveDirectoryService { const runsRemote = vscode.env.remoteName !== undefined; const runsServerless = vscode.env.remoteName === undefined && vscode.env.uiKind === vscode.UIKind.Web; if (runsRemote || runsServerless) { - return this.loginWithoutLocalServer(scopeData); + return this.createSessionWithoutLocalServer(scopeData); } - const nonce = randomBytes(16).toString('base64'); - const { server, redirectPromise, codePromise } = createServer(nonce); - - let token: IToken | undefined; try { - const port = await startServer(server); - vscode.env.openExternal(vscode.Uri.parse(`http://localhost:${port}/signin?nonce=${encodeURIComponent(nonce)}`)); - - const redirectReq = await redirectPromise; - if ('err' in redirectReq) { - const { err, res } = redirectReq; - res.writeHead(302, { Location: `/?error=${encodeURIComponent(err && err.message || 'Unknown error')}` }); - res.end(); - throw err; - } - - const host = redirectReq.req.headers.host || ''; - const updatedPortStr = (/^[^:]+:(\d+)$/.exec(Array.isArray(host) ? host[0] : host) || [])[1]; - const updatedPort = updatedPortStr ? parseInt(updatedPortStr, 10) : port; - - const state = `${updatedPort},${encodeURIComponent(nonce)}`; - - const codeVerifier = toBase64UrlEncoding(randomBytes(32).toString('base64')); - const codeChallenge = toBase64UrlEncoding(await sha256(codeVerifier)); - - const loginUrl = `${loginEndpointUrl}${scopeData.tenant}/oauth2/v2.0/authorize?response_type=code&response_mode=query&client_id=${encodeURIComponent(scopeData.clientId)}&redirect_uri=${encodeURIComponent(redirectUrl)}&state=${state}&scope=${encodeURIComponent(scopeData.scopesToSend)}&prompt=select_account&code_challenge_method=S256&code_challenge=${codeChallenge}`; - - redirectReq.res.writeHead(302, { Location: loginUrl }); - redirectReq.res.end(); - - const codeRes = await codePromise; - const res = codeRes.res; - - try { - if ('err' in codeRes) { - throw codeRes.err; - } - token = await this.exchangeCodeForToken(codeRes.code, codeVerifier, scopeData); - await this.setToken(token, scopeData); - Logger.info(`Login successful for scopes: ${scopeData.scopeStr}`); - res.writeHead(302, { Location: '/' }); - const session = await this.convertToSession(token); - return session; - } catch (err) { - res.writeHead(302, { Location: `/?error=${encodeURIComponent(err && err.message || 'Unknown error')}` }); - throw err; - } finally { - res.end(); - } + return this.createSessionWithLocalServer(scopeData); } catch (e) { Logger.error(`Error creating session for scopes: ${scopeData.scopeStr} Error: ${e}`); // If the error was about starting the server, try directly hitting the login endpoint instead if (e.message === 'Error listening to server' || e.message === 'Closed' || e.message === 'Timeout waiting for port') { - return this.loginWithoutLocalServer(scopeData); + return this.createSessionWithoutLocalServer(scopeData); } throw e; + } + } + + private async createSessionWithLocalServer(scopeData: IScopeData) { + const codeVerifier = toBase64UrlEncoding(randomBytes(32).toString('base64')); + const codeChallenge = toBase64UrlEncoding(await sha256(codeVerifier)); + const qs = querystring.stringify({ + response_type: 'code', + response_mode: 'query', + client_id: scopeData.clientId, + redirect_uri: redirectUrl, + scope: scopeData.scopesToSend, + prompt: 'select_account', + code_challenge_method: 'S256', + code_challenge: codeChallenge, + }); + const loginUrl = `${loginEndpointUrl}${scopeData.tenant}/oauth2/v2.0/authorize?${qs}`; + const server = new LoopbackAuthServer(path.join(__dirname, '../media'), loginUrl); + await server.start(); + server.state = `${server.port},${encodeURIComponent(server.nonce)}`; + + let codeToExchange; + try { + vscode.env.openExternal(vscode.Uri.parse(`http://127.0.0.1:${server.port}/signin?nonce=${encodeURIComponent(server.nonce)}`)); + const { code } = await server.waitForOAuthResponse(); + codeToExchange = code; } finally { setTimeout(() => { - server.close(); + void server.stop(); }, 5000); } - } - public dispose(): void { - this._disposable.dispose(); - } - - private getCallbackEnvironment(callbackUri: vscode.Uri): string { - if (callbackUri.scheme !== 'https' && callbackUri.scheme !== 'http') { - return callbackUri.scheme; - } - - switch (callbackUri.authority) { - case 'online.visualstudio.com': - return 'vso'; - case 'online-ppe.core.vsengsaas.visualstudio.com': - return 'vsoppe'; - case 'online.dev.core.vsengsaas.visualstudio.com': - return 'vsodev'; - default: - return callbackUri.authority; + const token = await this.exchangeCodeForToken(codeToExchange, codeVerifier, scopeData); + if (token.expiresIn) { + this.setSessionTimeout(token.sessionId, token.refreshToken, scopeData, token.expiresIn * AzureActiveDirectoryService.REFRESH_TIMEOUT_MODIFIER); } + await this.setToken(token, scopeData); + Logger.info(`Login successful for scopes: ${scopeData.scopeStr}`); + const session = await this.convertToSession(token); + return session; } - private async loginWithoutLocalServer(scopeData: IScopeData): Promise { + private async createSessionWithoutLocalServer(scopeData: IScopeData): Promise { const callbackUri = await vscode.env.asExternalUri(vscode.Uri.parse(`${vscode.env.uriScheme}://vscode.microsoft-authentication`)); const nonce = randomBytes(16).toString('base64'); const port = (callbackUri.authority.match(/:([0-9]*)$/) || [])[1] || (callbackUri.scheme === 'https' ? 443 : 80); - const callbackEnvironment = this.getCallbackEnvironment(callbackUri); + const callbackEnvironment = AzureActiveDirectoryService.getCallbackEnvironment(callbackUri); const state = `${callbackEnvironment},${port},${encodeURIComponent(nonce)},${encodeURIComponent(callbackUri.query)}`; const signInUrl = `${loginEndpointUrl}${scopeData.tenant}/oauth2/v2.0/authorize`; let uri = vscode.Uri.parse(signInUrl); @@ -514,6 +326,232 @@ export class AzureActiveDirectoryService { }); } + public async removeSession(sessionId: string, writeToDisk: boolean = true): Promise { + Logger.info(`Logging out of session '${sessionId}'`); + const tokenIndex = this._tokens.findIndex(token => token.sessionId === sessionId); + if (tokenIndex === -1) { + Logger.info(`Session not found '${sessionId}'`); + return undefined; + } + + const token = this._tokens[tokenIndex]; + this._tokens.splice(tokenIndex, 1); + this.removeSessionTimeout(sessionId); + + if (writeToDisk) { + await this._tokenStorage.delete(sessionId); + } + + const session = this.convertToSessionSync(token); + Logger.info(`Sending change event for session that was removed with scopes: ${token.scope}`); + onDidChangeSessions.fire({ added: [], removed: [session], changed: [] }); + Logger.info(`Logged out of session '${sessionId}' with scopes: ${token.scope}`); + return session; + } + + public async clearSessions() { + Logger.info('Logging out of all sessions'); + this._tokens = []; + await this._tokenStorage.deleteAll(); + + this._refreshTimeouts.forEach(timeout => { + clearTimeout(timeout); + }); + + this._refreshTimeouts.clear(); + } + + //#endregion + + //#region timeout + + private setSessionTimeout(sessionId: string, refreshToken: string, scopeData: IScopeData, timeout: number) { + this.removeSessionTimeout(sessionId); + this._refreshTimeouts.set(sessionId, setTimeout(async () => { + try { + const refreshedToken = await this.refreshToken(refreshToken, scopeData, sessionId); + Logger.info('Triggering change session event...'); + onDidChangeSessions.fire({ added: [], removed: [], changed: [this.convertToSessionSync(refreshedToken)] }); + } catch (e) { + if (e.message !== REFRESH_NETWORK_FAILURE) { + await this.removeSession(sessionId); + } + } + }, timeout)); + } + + private removeSessionTimeout(sessionId: string): void { + const timeout = this._refreshTimeouts.get(sessionId); + if (timeout) { + clearTimeout(timeout); + this._refreshTimeouts.delete(sessionId); + } + } + + //#endregion + + //#region convert operations + + private convertToTokenSync(json: ITokenResponse, scopeData: IScopeData, existingId?: string): IToken { + let claims = undefined; + + try { + if (json.id_token) { + Logger.info('Attempting to parse id_token instead since access_token was not parsable'); + claims = JSON.parse(Buffer.from(json.id_token.split('.')[1], 'base64').toString()); + } else { + claims = JSON.parse(Buffer.from(json.access_token.split('.')[1], 'base64').toString()); + } + } catch (e) { + throw e; + } + + return { + expiresIn: json.expires_in, + expiresAt: json.expires_in ? Date.now() + json.expires_in * 1000 : undefined, + accessToken: json.access_token, + idToken: json.id_token, + refreshToken: json.refresh_token, + scope: scopeData.scopeStr, + sessionId: existingId || `${claims.tid}/${(claims.oid || (claims.altsecid || '' + claims.ipd || ''))}/${uuid()}`, + account: { + label: `${claims.name} - ${claims.email}` || claims.email || claims.unique_name || claims.preferred_username || 'user@example.com', + id: `${claims.tid}/${(claims.oid || (claims.altsecid || '' + claims.ipd || ''))}` + } + }; + } + + /** + * Return a session object without checking for expiry and potentially refreshing. + * @param token The token information. + */ + private convertToSessionSync(token: IToken): vscode.AuthenticationSession { + return { + id: token.sessionId, + accessToken: token.accessToken!, + idToken: token.idToken, + account: token.account, + scopes: token.scope.split(' ') + }; + } + + private async convertToSession(token: IToken): Promise { + if (token.accessToken && (!token.expiresAt || token.expiresAt > Date.now())) { + token.expiresAt + ? Logger.info(`Token available from cache (for scopes ${token.scope}), expires in ${token.expiresAt - Date.now()} milliseconds`) + : Logger.info('Token available from cache (for scopes ${token.scope})'); + return { + id: token.sessionId, + accessToken: token.accessToken, + idToken: token.idToken, + account: token.account, + scopes: token.scope.split(' ') + }; + } + + try { + Logger.info(`Token expired or unavailable (for scopes ${token.scope}), trying refresh`); + const scopes = token.scope.split(' '); + const scopeData: IScopeData = { + scopes, + scopeStr: token.scope, + // filter our special scopes + scopesToSend: scopes.filter(s => !s.startsWith('VSCODE_')).join(' '), + clientId: this.getClientId(scopes), + tenant: this.getTenantId(scopes), + }; + const refreshedToken = await this.refreshToken(token.refreshToken, scopeData, token.sessionId); + if (refreshedToken.accessToken) { + return { + id: token.sessionId, + accessToken: refreshedToken.accessToken, + idToken: refreshedToken.idToken, + account: token.account, + scopes: token.scope.split(' ') + }; + } else { + throw new Error(); + } + } catch (e) { + throw new Error('Unavailable due to network problems'); + } + } + + //#endregion + + //#region refresh logic + + private async refreshToken(refreshToken: string, scopeData: IScopeData, sessionId: string): Promise { + this._refreshingPromise = this.doRefreshToken(refreshToken, scopeData, sessionId); + try { + const result = await this._refreshingPromise; + return result; + } finally { + this._refreshingPromise = undefined; + } + } + + private async doRefreshToken(refreshToken: string, scopeData: IScopeData, sessionId: string): Promise { + Logger.info(`Refreshing token for scopes: ${scopeData.scopeStr}`); + const postData = querystring.stringify({ + refresh_token: refreshToken, + client_id: scopeData.clientId, + grant_type: 'refresh_token', + scope: scopeData.scopesToSend + }); + + const proxyEndpoints: { [providerId: string]: string } | undefined = await vscode.commands.executeCommand('workbench.getCodeExchangeProxyEndpoints'); + const endpointUrl = proxyEndpoints?.microsoft || loginEndpointUrl; + const endpoint = `${endpointUrl}${scopeData.tenant}/oauth2/v2.0/token`; + + try { + const json = await this.fetchTokenResponse(endpoint, postData, scopeData); + const token = this.convertToTokenSync(json, scopeData, sessionId); + if (token.expiresIn) { + this.setSessionTimeout(token.sessionId, token.refreshToken, scopeData, token.expiresIn * AzureActiveDirectoryService.REFRESH_TIMEOUT_MODIFIER); + } + await this.setToken(token, scopeData); + Logger.info(`Token refresh success for scopes: ${token.scope}`); + return token; + } catch (e) { + if (e.message === REFRESH_NETWORK_FAILURE) { + // We were unable to refresh because of a network failure (i.e. the user lost internet access). + // so set up a timeout to try again later. + this.setSessionTimeout(sessionId, refreshToken, scopeData, AzureActiveDirectoryService.POLLING_CONSTANT); + throw e; + } + vscode.window.showErrorMessage(localize('signOut', "You have been signed out because reading stored authentication information failed.")); + Logger.error(`Refreshing token failed (for scopes: ${scopeData.scopeStr}): ${e.message}`); + throw new Error('Refreshing token failed'); + } + } + + //#endregion + + //#region scope parsers + + private getClientId(scopes: string[]) { + return scopes.reduce((prev, current) => { + if (current.startsWith('VSCODE_CLIENT_ID:')) { + return current.split('VSCODE_CLIENT_ID:')[1]; + } + return prev; + }, undefined) ?? DEFAULT_CLIENT_ID; + } + + private getTenantId(scopes: string[]) { + return scopes.reduce((prev, current) => { + if (current.startsWith('VSCODE_TENANT:')) { + return current.split('VSCODE_TENANT:')[1]; + } + return prev; + }, undefined) ?? DEFAULT_TENANT; + } + + //#endregion + + //#region oauth flow + private async handleCodeResponse(scopeData: IScopeData): Promise { let uriEventListener: vscode.Disposable; return new Promise((resolve: (value: vscode.AuthenticationSession) => void, reject) => { @@ -533,6 +571,9 @@ export class AzureActiveDirectoryService { } const token = await this.exchangeCodeForToken(code, verifier, scopeData); + if (token.expiresIn) { + this.setSessionTimeout(token.sessionId, token.refreshToken, scopeData, token.expiresIn * AzureActiveDirectoryService.REFRESH_TIMEOUT_MODIFIER); + } await this.setToken(token, scopeData); const session = await this.convertToSession(token); @@ -550,83 +591,6 @@ export class AzureActiveDirectoryService { }); } - private async setToken(token: IToken, scopeData: IScopeData): Promise { - Logger.info(`Setting token for scopes: ${scopeData.scopeStr}`); - const existingTokenIndex = this._tokens.findIndex(t => t.sessionId === token.sessionId); - if (existingTokenIndex > -1) { - this._tokens.splice(existingTokenIndex, 1, token); - } else { - this._tokens.push(token); - } - - this.clearSessionTimeout(token.sessionId); - - if (token.expiresIn) { - this._refreshTimeouts.set(token.sessionId, setTimeout(async () => { - try { - const refreshedToken = await this.refreshToken(token.refreshToken, scopeData, token.sessionId); - Logger.info('Triggering change session event...'); - onDidChangeSessions.fire({ added: [], removed: [], changed: [this.convertToSessionSync(refreshedToken)] }); - } catch (e) { - if (e.message !== REFRESH_NETWORK_FAILURE) { - await this.removeSession(token.sessionId); - onDidChangeSessions.fire({ added: [], removed: [this.convertToSessionSync(token)], changed: [] }); - } - } - // For details on why this is set to 2/3... see https://github.com/microsoft/vscode/issues/133201#issuecomment-966668197 - }, 1000 * (token.expiresIn * 2 / 3))); - } - - await this.storeTokenData(); - } - - private getTokenFromResponse(json: ITokenResponse, scopeData: IScopeData, existingId?: string): IToken { - let claims = undefined; - - try { - claims = this.getTokenClaims(json.access_token); - } catch (e) { - if (json.id_token) { - Logger.info('Failed to fetch token claims from access_token. Attempting to parse id_token instead'); - claims = this.getTokenClaims(json.id_token); - } else { - throw e; - } - } - - return { - expiresIn: json.expires_in, - expiresAt: json.expires_in ? Date.now() + json.expires_in * 1000 : undefined, - accessToken: json.access_token, - idToken: json.id_token, - refreshToken: json.refresh_token, - scope: scopeData.scopeStr, - sessionId: existingId || `${claims.tid}/${(claims.oid || (claims.altsecid || '' + claims.ipd || ''))}/${uuid()}`, - account: { - label: claims.email || claims.unique_name || claims.preferred_username || 'user@example.com', - id: `${claims.tid}/${(claims.oid || (claims.altsecid || '' + claims.ipd || ''))}` - } - }; - } - - private getClientId(scopes: string[]) { - return scopes.reduce((prev, current) => { - if (current.startsWith('VSCODE_CLIENT_ID:')) { - return current.split('VSCODE_CLIENT_ID:')[1]; - } - return prev; - }, undefined) ?? DEFAULT_CLIENT_ID; - } - - private getTenantId(scopes: string[]) { - return scopes.reduce((prev, current) => { - if (current.startsWith('VSCODE_TENANT:')) { - return current.split('VSCODE_TENANT:')[1]; - } - return prev; - }, undefined) ?? DEFAULT_TENANT; - } - private async exchangeCodeForToken(code: string, codeVerifier: string, scopeData: IScopeData): Promise { Logger.info(`Exchanging login code for token for scopes: ${scopeData.scopeStr}`); try { @@ -645,23 +609,13 @@ export class AzureActiveDirectoryService { const json = await this.fetchTokenResponse(endpoint, postData, scopeData); Logger.info(`Exchanging login code for token (for scopes: ${scopeData.scopeStr}) succeeded!`); - return this.getTokenFromResponse(json, scopeData); + return this.convertToTokenSync(json, scopeData); } catch (e) { Logger.error(`Error exchanging code for token (for scopes ${scopeData.scopeStr}): ${e}`); throw e; } } - private async refreshToken(refreshToken: string, scopeData: IScopeData, sessionId: string): Promise { - this._refreshingPromise = this.doRefreshToken(refreshToken, scopeData, sessionId); - try { - const result = await this._refreshingPromise; - return result; - } finally { - this._refreshingPromise = undefined; - } - } - private async fetchTokenResponse(endpoint: string, postData: string, scopeData: IScopeData): Promise { let attempts = 0; while (attempts <= 3) { @@ -702,97 +656,119 @@ export class AzureActiveDirectoryService { throw new Error(REFRESH_NETWORK_FAILURE); } - private async doRefreshToken(refreshToken: string, scopeData: IScopeData, sessionId: string): Promise { - Logger.info(`Refreshing token for scopes: ${scopeData.scopeStr}`); - const postData = querystring.stringify({ - refresh_token: refreshToken, - client_id: scopeData.clientId, - grant_type: 'refresh_token', - scope: scopeData.scopesToSend - }); + //#endregion - const proxyEndpoints: { [providerId: string]: string } | undefined = await vscode.commands.executeCommand('workbench.getCodeExchangeProxyEndpoints'); - const endpointUrl = proxyEndpoints?.microsoft || loginEndpointUrl; - const endpoint = `${endpointUrl}${scopeData.tenant}/oauth2/v2.0/token`; + //#region storage operations + + private async setToken(token: IToken, scopeData: IScopeData): Promise { + Logger.info(`Setting token for scopes: ${scopeData.scopeStr}`); + + const existingTokenIndex = this._tokens.findIndex(t => t.sessionId === token.sessionId); + if (existingTokenIndex > -1) { + this._tokens.splice(existingTokenIndex, 1, token); + } else { + this._tokens.push(token); + } + + await this._tokenStorage.store(token.sessionId, { + id: token.sessionId, + refreshToken: token.refreshToken, + scope: token.scope, + account: token.account + }); + } + + private async checkForUpdates(e: IDidChangeInOtherWindowEvent): Promise { + const added: vscode.AuthenticationSession[] = []; + const removed: vscode.AuthenticationSession[] = []; + for (const key of e.added) { + const session = await this._tokenStorage.get(key); + if (!session) { + Logger.error('session not found that was apparently just added'); + return; + } + const matchesExisting = this._tokens.some(token => token.scope === session.scope && token.sessionId === session.id); + if (!matchesExisting && session.refreshToken) { + try { + const scopes = session.scope.split(' '); + const scopeData: IScopeData = { + scopes, + scopeStr: session.scope, + // filter our special scopes + scopesToSend: scopes.filter(s => !s.startsWith('VSCODE_')).join(' '), + clientId: this.getClientId(scopes), + tenant: this.getTenantId(scopes), + }; + Logger.info(`Session added in another window with scopes: ${session.scope}`); + const token = await this.refreshToken(session.refreshToken, scopeData, session.id); + Logger.info(`Sending change event for session that was added with scopes: ${scopeData.scopeStr}`); + onDidChangeSessions.fire({ added: [this.convertToSessionSync(token)], removed: [], changed: [] }); + return; + } catch (e) { + // Network failures will automatically retry on next poll. + if (e.message !== REFRESH_NETWORK_FAILURE) { + await this.removeSession(session.id); + } + return; + } + } + } + + for (const { value } of e.removed) { + Logger.info(`Session removed in another window with scopes: ${value.scope}`); + const session = await this.removeSession(value.id, false); + if (session) { + removed.push(session); + } + } + } + + private async migrate() { + Logger.info('Attempting to migrate stored sessions.'); + const migrated = this._context.globalState.get<{ migrated: boolean }>('microsoft-better-storage-layout-migrated'); + if (migrated?.migrated) { + return []; + } + await this._context.globalState.update('microsoft-better-storage-layout-migrated', { migrated: true }); + const keychain = new Keychain(this._context); + const storedData = await keychain.getToken(); + if (!storedData) { + Logger.info('No stored sessions found.'); + return []; + } try { - const json = await this.fetchTokenResponse(endpoint, postData, scopeData); - const token = this.getTokenFromResponse(json, scopeData, sessionId); - await this.setToken(token, scopeData); - Logger.info(`Token refresh success for scopes: ${token.scope}`); - return token; + const sessions = JSON.parse(storedData) as IStoredSession[]; + Logger.info(`Migrated ${sessions.length} stored sessions.`); + return sessions; } catch (e) { - if (e.message === REFRESH_NETWORK_FAILURE) { - // We were unable to refresh because of a network failure (i.e. the user lost internet access). - // so set up a timeout to try again later. - this.pollForReconnect(sessionId, refreshToken, scopeData); - throw e; - } - vscode.window.showErrorMessage(localize('signOut', "You have been signed out because reading stored authentication information failed.")); - Logger.error(`Refreshing token failed (for scopes: ${scopeData.scopeStr}): ${e.message}`); - throw new Error('Refreshing token failed'); + Logger.info('Failed to parse stored sessions. Migrating no sessions.'); + return []; + } finally { + await keychain.deleteToken(); } } - private clearSessionTimeout(sessionId: string): void { - const timeout = this._refreshTimeouts.get(sessionId); - if (timeout) { - clearTimeout(timeout); - this._refreshTimeouts.delete(sessionId); + //#endregion + + //#region static methods + + private static getCallbackEnvironment(callbackUri: vscode.Uri): string { + if (callbackUri.scheme !== 'https' && callbackUri.scheme !== 'http') { + return callbackUri.scheme; + } + + switch (callbackUri.authority) { + case 'online.visualstudio.com': + return 'vso'; + case 'online-ppe.core.vsengsaas.visualstudio.com': + return 'vsoppe'; + case 'online.dev.core.vsengsaas.visualstudio.com': + return 'vsodev'; + default: + return callbackUri.authority; } } - private removeInMemorySessionData(sessionId: string): IToken | undefined { - const tokenIndex = this._tokens.findIndex(token => token.sessionId === sessionId); - let token: IToken | undefined; - if (tokenIndex > -1) { - token = this._tokens[tokenIndex]; - this._tokens.splice(tokenIndex, 1); - } - - this.clearSessionTimeout(sessionId); - return token; - } - - private pollForReconnect(sessionId: string, refreshToken: string, scopeData: IScopeData): void { - this.clearSessionTimeout(sessionId); - Logger.trace(`Setting up reconnection timeout for scopes: ${scopeData.scopeStr}...`); - this._refreshTimeouts.set(sessionId, setTimeout(async () => { - try { - const refreshedToken = await this.refreshToken(refreshToken, scopeData, sessionId); - onDidChangeSessions.fire({ added: [], removed: [], changed: [this.convertToSessionSync(refreshedToken)] }); - } catch (e) { - this.pollForReconnect(sessionId, refreshToken, scopeData); - } - }, 1000 * 60 * 30)); - } - - public async removeSession(sessionId: string): Promise { - Logger.info(`Logging out of session '${sessionId}'`); - const token = this.removeInMemorySessionData(sessionId); - let session: vscode.AuthenticationSession | undefined; - if (token) { - session = this.convertToSessionSync(token); - } - - if (this._tokens.length === 0) { - await this._keychain.deleteToken(); - } else { - await this.storeTokenData(); - } - - return session; - } - - public async clearSessions() { - Logger.info('Logging out of all sessions'); - this._tokens = []; - await this._keychain.deleteToken(); - - this._refreshTimeouts.forEach(timeout => { - clearTimeout(timeout); - }); - - this._refreshTimeouts.clear(); - } + //#endregion } diff --git a/extensions/microsoft-authentication/src/authServer.ts b/extensions/microsoft-authentication/src/authServer.ts index bc4a52103c1..158d0db257f 100644 --- a/extensions/microsoft-authentication/src/authServer.ts +++ b/extensions/microsoft-authentication/src/authServer.ts @@ -2,65 +2,13 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ - import * as http from 'http'; -import * as url from 'url'; +import { URL } from 'url'; import * as fs from 'fs'; import * as path from 'path'; +import { randomBytes } from 'crypto'; -interface Deferred { - resolve: (result: T | Promise) => void; - reject: (reason: any) => void; -} - -/** - * Asserts that the argument passed in is neither undefined nor null. - */ -function assertIsDefined(arg: T | null | undefined): T { - if (typeof (arg) === 'undefined' || arg === null) { - throw new Error('Assertion Failed: argument is undefined or null'); - } - - return arg; -} - -export async function startServer(server: http.Server): Promise { - let portTimer: NodeJS.Timer; - - function cancelPortTimer() { - clearTimeout(portTimer); - } - - const port = new Promise((resolve, reject) => { - portTimer = setTimeout(() => { - reject(new Error('Timeout waiting for port')); - }, 5000); - - server.on('listening', () => { - const address = server.address(); - if (typeof address === 'string') { - resolve(address); - } else { - resolve(assertIsDefined(address).port.toString()); - } - }); - - server.on('error', _ => { - reject(new Error('Error listening to server')); - }); - - server.on('close', () => { - reject(new Error('Closed')); - }); - - server.listen(0, '127.0.0.1'); - }); - - port.then(cancelPortTimer, cancelPortTimer); - return port; -} - -function sendFile(res: http.ServerResponse, filepath: string, contentType: string) { +function sendFile(res: http.ServerResponse, filepath: string) { fs.readFile(filepath, (err, body) => { if (err) { console.error(err); @@ -68,89 +16,173 @@ function sendFile(res: http.ServerResponse, filepath: string, contentType: strin res.end(); } else { res.writeHead(200, { - 'Content-Length': body.length, - 'Content-Type': contentType + 'content-length': body.length, }); res.end(body); } }); } -async function callback(nonce: string, reqUrl: url.Url): Promise { - const query = reqUrl.query; - if (!query || typeof query === 'string') { - throw new Error('No query received.'); - } - - let error = query.error_description || query.error; - - if (!error) { - const state = (query.state as string) || ''; - const receivedNonce = (state.split(',')[1] || '').replace(/ /g, '+'); - if (receivedNonce !== nonce) { - error = 'Nonce does not match.'; - } - } - - const code = query.code as string; - if (!error && code) { - return code; - } - - throw new Error((error as string) || 'No code received.'); +interface IOAuthResult { + code: string; + state: string; } -export function createServer(nonce: string) { - type RedirectResult = { req: http.IncomingMessage; res: http.ServerResponse; } | { err: any; res: http.ServerResponse; }; - let deferredRedirect: Deferred; - const redirectPromise = new Promise((resolve, reject) => deferredRedirect = { resolve, reject }); +interface ILoopbackServer { + /** + * If undefined, the server is not started yet. + */ + port: number | undefined; - type CodeResult = { code: string; res: http.ServerResponse; } | { err: any; res: http.ServerResponse; }; - let deferredCode: Deferred; - const codePromise = new Promise((resolve, reject) => deferredCode = { resolve, reject }); + /** + * The nonce used + */ + nonce: string; - const codeTimer = setTimeout(() => { - deferredCode.reject(new Error('Timeout waiting for code')); - }, 5 * 60 * 1000); + /** + * The state parameter used in the OAuth flow. + */ + state: string | undefined; - function cancelCodeTimer() { - clearTimeout(codeTimer); + /** + * Starts the server. + * @returns The port to listen on. + * @throws If the server fails to start. + * @throws If the server is already started. + */ + start(): Promise; + /** + * Stops the server. + * @throws If the server is not started. + * @throws If the server fails to stop. + */ + stop(): Promise; + /** + * Returns a promise that resolves to the result of the OAuth flow. + */ + waitForOAuthResponse(): Promise; +} + +export class LoopbackAuthServer implements ILoopbackServer { + private readonly _server: http.Server; + private readonly _resultPromise: Promise; + private _startingRedirect: URL; + + public nonce = randomBytes(16).toString('base64'); + public port: number | undefined; + + public set state(state: string | undefined) { + if (state) { + this._startingRedirect.searchParams.set('state', state); + } else { + this._startingRedirect.searchParams.delete('state'); + } + } + public get state(): string | undefined { + return this._startingRedirect.searchParams.get('state') ?? undefined; } - const server = http.createServer(function (req, res) { - const reqUrl = url.parse(req.url!, /* parseQueryString */ true); - switch (reqUrl.pathname) { - case '/signin': { - const receivedNonce = ((reqUrl.query.nonce as string) || '').replace(/ /g, '+'); - if (receivedNonce === nonce) { - deferredRedirect.resolve({ req, res }); - } else { - const err = new Error('Nonce does not match.'); - deferredRedirect.resolve({ err, res }); + constructor(serveRoot: string, startingRedirect: string) { + if (!serveRoot) { + throw new Error('serveRoot must be defined'); + } + if (!startingRedirect) { + throw new Error('startingRedirect must be defined'); + } + this._startingRedirect = new URL(startingRedirect); + let deferred: { resolve: (result: IOAuthResult) => void; reject: (reason: any) => void }; + this._resultPromise = new Promise((resolve, reject) => deferred = { resolve, reject }); + + this._server = http.createServer((req, res) => { + const reqUrl = new URL(req.url!, `http://${req.headers.host}`); + switch (reqUrl.pathname) { + case '/signin': { + const receivedNonce = (reqUrl.searchParams.get('nonce') ?? '').replace(/ /g, '+'); + if (receivedNonce !== this.nonce) { + res.writeHead(302, { location: `/?error=${encodeURIComponent('Nonce does not match.')}` }); + res.end(); + } + res.writeHead(302, { location: this._startingRedirect.toString() }); + res.end(); + break; } - break; + case '/callback': { + const code = reqUrl.searchParams.get('code') ?? undefined; + const state = reqUrl.searchParams.get('state') ?? undefined; + if (!code || !state) { + res.writeHead(400); + res.end(); + return; + } + if (this.state !== state) { + res.writeHead(302, { location: `/?error=${encodeURIComponent('State does not match.')}` }); + res.end(); + throw new Error('State does not match.'); + } + deferred.resolve({ code, state }); + res.writeHead(302, { location: '/' }); + res.end(); + break; + } + // Serve the static files + case '/': + sendFile(res, path.join(serveRoot, 'index.html')); + break; + default: + // substring to get rid of leading '/' + sendFile(res, path.join(serveRoot, reqUrl.pathname.substring(1))); + break; } - case '/': - sendFile(res, path.join(__dirname, '../media/auth.html'), 'text/html; charset=utf-8'); - break; - case '/auth.css': - sendFile(res, path.join(__dirname, '../media/auth.css'), 'text/css; charset=utf-8'); - break; - case '/callback': - deferredCode.resolve(callback(nonce, reqUrl) - .then(code => ({ code, res }), err => ({ err, res }))); - break; - default: - res.writeHead(404); - res.end(); - break; - } - }); + }); + } - codePromise.then(cancelCodeTimer, cancelCodeTimer); - return { - server, - redirectPromise, - codePromise - }; + public start(): Promise { + return new Promise((resolve, reject) => { + if (this._server.listening) { + throw new Error('Server is already started'); + } + const portTimeout = setTimeout(() => { + reject(new Error('Timeout waiting for port')); + }, 5000); + this._server.on('listening', () => { + const address = this._server.address(); + if (typeof address === 'string') { + this.port = parseInt(address); + } else if (address instanceof Object) { + this.port = address.port; + } else { + throw new Error('Unable to determine port'); + } + + clearTimeout(portTimeout); + resolve(this.port); + }); + this._server.on('error', err => { + reject(new Error(`Error listening to server: ${err}`)); + }); + this._server.on('close', () => { + reject(new Error('Closed')); + }); + this._server.listen(0, '127.0.0.1'); + }); + } + + public stop(): Promise { + return new Promise((resolve, reject) => { + if (!this._server.listening) { + throw new Error('Server is not started'); + } + this._server.close((err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } + + public waitForOAuthResponse(): Promise { + return this._resultPromise; + } } diff --git a/extensions/microsoft-authentication/src/betterSecretStorage.ts b/extensions/microsoft-authentication/src/betterSecretStorage.ts new file mode 100644 index 00000000000..001b12d003d --- /dev/null +++ b/extensions/microsoft-authentication/src/betterSecretStorage.ts @@ -0,0 +1,247 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import Logger from './logger'; +import { Event, EventEmitter, ExtensionContext, SecretStorage, SecretStorageChangeEvent } from 'vscode'; + +export interface IDidChangeInOtherWindowEvent { + added: string[]; + updated: string[]; + removed: Array<{ key: string; value: T }>; +} + +export class BetterTokenStorage { + // set before and after _tokensPromise is set so getTokens can handle multiple operations. + private _operationInProgress = false; + // the current state. Don't use this directly and call getTokens() so that you ensure you + // have awaited for all operations. + private _tokensPromise: Promise> = Promise.resolve(new Map()); + + // The vscode SecretStorage instance for this extension. + private readonly _secretStorage: SecretStorage; + + private _didChangeInOtherWindow = new EventEmitter>(); + public onDidChangeInOtherWindow: Event> = this._didChangeInOtherWindow.event; + + /** + * + * @param keylistKey The key in the secret storage that will hold the list of keys associated with this instance of BetterTokenStorage + * @param context the vscode Context used to register disposables and retreive the vscode.SecretStorage for this instance of VS Code + */ + constructor(private keylistKey: string, context: ExtensionContext) { + this._secretStorage = context.secrets; + context.subscriptions.push(context.secrets.onDidChange((e) => this.handleSecretChange(e))); + this.initialize(); + } + + private initialize(): void { + this._operationInProgress = true; + this._tokensPromise = new Promise((resolve, _) => { + this._secretStorage.get(this.keylistKey).then( + keyListStr => { + if (!keyListStr) { + resolve(new Map()); + return; + } + + const keyList: Array = JSON.parse(keyListStr); + // Gather promises that contain key value pairs our of secret storage + const promises = keyList.map(key => new Promise<{ key: string; value: string | undefined }>((res, rej) => { + this._secretStorage.get(key).then((value) => { + res({ key, value }); + }, rej); + })); + Promise.allSettled(promises).then((results => { + const tokens = new Map(); + results.forEach(p => { + if (p.status === 'fulfilled' && p.value.value) { + const secret = this.parseSecret(p.value.value); + tokens.set(p.value.key, secret); + } else if (p.status === 'rejected') { + Logger.error(p.reason); + } else { + Logger.error('Key was not found in SecretStorage.'); + } + }); + resolve(tokens); + })); + }, + err => { + Logger.error(err); + resolve(new Map()); + }); + }); + this._operationInProgress = false; + } + + async get(key: string): Promise { + const tokens = await this.getTokens(); + return tokens.get(key); + } + + async getAll(): Promise { + const tokens = await this.getTokens(); + const values = new Array(); + for (const [_, value] of tokens) { + values.push(value); + } + return values; + } + + async store(key: string, value: T): Promise { + const tokens = await this.getTokens(); + + const isAddition = !tokens.has(key); + tokens.set(key, value); + const valueStr = this.serializeSecret(value); + this._operationInProgress = true; + this._tokensPromise = new Promise((resolve, _) => { + const promises = [this._secretStorage.store(key, valueStr)]; + + // if we are adding a secret we need to update the keylist too + if (isAddition) { + promises.push(this.updateKeyList(tokens)); + } + + Promise.allSettled(promises).then(results => { + results.forEach(r => { + if (r.status === 'rejected') { + Logger.error(r.reason); + } + }); + resolve(tokens); + }); + }); + this._operationInProgress = false; + } + + async delete(key: string): Promise { + const tokens = await this.getTokens(); + if (!tokens.has(key)) { + return; + } + tokens.delete(key); + + this._operationInProgress = true; + this._tokensPromise = new Promise((resolve, _) => { + Promise.allSettled([ + this._secretStorage.delete(key), + this.updateKeyList(tokens) + ]).then(results => { + results.forEach(r => { + if (r.status === 'rejected') { + Logger.error(r.reason); + } + }); + resolve(tokens); + }); + }); + this._operationInProgress = false; + } + + async deleteAll(): Promise { + const tokens = await this.getTokens(); + const promises = []; + for (const [key] of tokens) { + promises.push(this.delete(key)); + } + await Promise.all(promises); + } + + private async updateKeyList(tokens: Map) { + const keyList = []; + for (const [key] of tokens) { + keyList.push(key); + } + + const keyListStr = JSON.stringify(keyList); + await this._secretStorage.store(this.keylistKey, keyListStr); + } + + protected parseSecret(secret: string): T { + return JSON.parse(secret); + } + + protected serializeSecret(secret: T): string { + return JSON.stringify(secret); + } + + // This is the one way to get tokens to ensure all other operations that + // came before you have been processed. + private async getTokens(): Promise> { + let tokens; + do { + tokens = await this._tokensPromise; + } while (this._operationInProgress); + return tokens; + } + + // This is a crucial function that handles whether or not the token has changed in + // a different window of VS Code and sends the necessary event if it has. + // Scenarios this should cover: + // * Added in another window + // * Updated in another window + // * Deleted in another window + // * Added in this window + // * Updated in this window + // * Deleted in this window + private async handleSecretChange(e: SecretStorageChangeEvent) { + const key = e.key; + + // The KeyList is only a list of keys to aid initial start up of VS Code to know which + // Keys are associated with this handler. + if (key === this.keylistKey) { + return; + } + const tokens = await this.getTokens(); + + this._operationInProgress = true; + this._tokensPromise = new Promise((resolve, _) => { + this._secretStorage.get(key).then( + storageSecretStr => { + if (!storageSecretStr) { + // true -> secret was deleted in another window + // false -> secret was deleted in this window + if (tokens.has(key)) { + const value = tokens.get(key)!; + tokens.delete(key); + this._didChangeInOtherWindow.fire({ added: [], updated: [], removed: [{ key, value }] }); + } + return tokens; + } + + const storageSecret = this.parseSecret(storageSecretStr); + const cachedSecret = tokens.get(key); + + if (!cachedSecret) { + // token was added in another window + tokens.set(key, storageSecret); + this._didChangeInOtherWindow.fire({ added: [key], updated: [], removed: [] }); + return tokens; + } + + const cachedSecretStr = this.serializeSecret(cachedSecret); + if (storageSecretStr !== cachedSecretStr) { + // token was updated in another window + tokens.set(key, storageSecret); + this._didChangeInOtherWindow.fire({ added: [], updated: [key], removed: [] }); + } + + // what's in our token cache and what's in storage must be the same + // which means this should cover the last two scenarios of + // Added in this window & Updated in this window. + return tokens; + }, + err => { + Logger.error(err); + resolve(tokens); + }).then(resolve, err => { + Logger.error(err); + resolve(tokens); + }); + }); + this._operationInProgress = false; + } +} diff --git a/extensions/microsoft-authentication/src/extension.ts b/extensions/microsoft-authentication/src/extension.ts index 09565f2b231..f43467f2b91 100644 --- a/extensions/microsoft-authentication/src/extension.ts +++ b/extensions/microsoft-authentication/src/extension.ts @@ -5,15 +5,13 @@ import * as vscode from 'vscode'; import { AzureActiveDirectoryService, onDidChangeSessions } from './AADHelper'; -import TelemetryReporter from 'vscode-extension-telemetry'; +import TelemetryReporter from '@vscode/extension-telemetry'; export async function activate(context: vscode.ExtensionContext) { - const { name, version, aiKey } = context.extension.packageJSON as { name: string, version: string, aiKey: string }; + const { name, version, aiKey } = context.extension.packageJSON as { name: string; version: string; aiKey: string }; const telemetryReporter = new TelemetryReporter(name, version, aiKey); const loginService = new AzureActiveDirectoryService(context); - context.subscriptions.push(loginService); - await loginService.initialize(); context.subscriptions.push(vscode.authentication.registerAuthenticationProvider('microsoft', 'Microsoft', { diff --git a/extensions/microsoft-authentication/tsconfig.json b/extensions/microsoft-authentication/tsconfig.json index 51edc522bc6..6de9590bdc8 100644 --- a/extensions/microsoft-authentication/tsconfig.json +++ b/extensions/microsoft-authentication/tsconfig.json @@ -18,6 +18,7 @@ ], "include": [ "src/**/*", - "../../src/vscode-dts/vscode.d.ts" + "../../src/vscode-dts/vscode.d.ts", + "../../src/vscode-dts/vscode.proposed.idToken.d.ts" ] } diff --git a/extensions/microsoft-authentication/yarn.lock b/extensions/microsoft-authentication/yarn.lock index 10e31136323..459cfdb7324 100644 --- a/extensions/microsoft-authentication/yarn.lock +++ b/extensions/microsoft-authentication/yarn.lock @@ -15,10 +15,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806" integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/randombytes@^2.0.0": version "2.0.0" @@ -39,6 +39,11 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.0.0.tgz#165aae4819ad2174a17476dbe66feebd549556c0" integrity sha512-xSQfNcvOiE5f9dyd4Kzxbof1aTrLobL278pGLKOZI6esGfZ7ts9Ka16CzIN6Y8hFHE1C7jIBZokULhK1bOgjRw== +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -105,10 +110,12 @@ mime-types@^2.1.12: dependencies: mime-db "1.44.0" -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" randombytes@~2.1.0: version "2.1.0" @@ -142,17 +149,30 @@ stream@0.0.2: dependencies: emitter-component "^1.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + uuid@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e" integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q== -vscode-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== - vscode-nls@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" diff --git a/extensions/notebook-renderers/.gitignore b/extensions/notebook-renderers/.gitignore new file mode 100644 index 00000000000..e81e8443dd2 --- /dev/null +++ b/extensions/notebook-renderers/.gitignore @@ -0,0 +1 @@ +renderer-out diff --git a/extensions/notebook-renderers/README.md b/extensions/notebook-renderers/README.md new file mode 100644 index 00000000000..3fe79076f63 --- /dev/null +++ b/extensions/notebook-renderers/README.md @@ -0,0 +1,9 @@ +# Builtin Notebook Output Renderers for Visual Studio Code + +**Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled. + +## Features + +This extension provides the following notebook renderers for VS Code: + +- Image renderer for png, jpeg and gif diff --git a/extensions/notebook-renderers/esbuild.js b/extensions/notebook-renderers/esbuild.js new file mode 100644 index 00000000000..5b54e668b3b --- /dev/null +++ b/extensions/notebook-renderers/esbuild.js @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +const path = require('path'); +const esbuild = require('esbuild'); + +const args = process.argv.slice(2); + +const isWatch = args.indexOf('--watch') >= 0; + +let outputRoot = __dirname; +const outputRootIndex = args.indexOf('--outputRoot'); +if (outputRootIndex >= 0) { + outputRoot = args[outputRootIndex + 1]; +} + +const outDir = path.join(outputRoot, 'renderer-out'); + +esbuild.build({ + entryPoints: [ + path.join(__dirname, 'src', 'index.ts'), + ], + bundle: true, + minify: false, + sourcemap: false, + format: 'esm', + outdir: outDir, + platform: 'browser', + target: ['es2020'], + incremental: isWatch, +}).catch(() => process.exit(1)); diff --git a/extensions/notebook-renderers/package.json b/extensions/notebook-renderers/package.json new file mode 100644 index 00000000000..69b63281480 --- /dev/null +++ b/extensions/notebook-renderers/package.json @@ -0,0 +1,50 @@ +{ + "name": "builtin-notebook-renderers", + "displayName": "%displayName%", + "description": "%description%", + "publisher": "vscode", + "version": "1.0.0", + "license": "MIT", + "engines": { + "vscode": "^1.57.0" + }, + "capabilities": { + "virtualWorkspaces": true, + "untrustedWorkspaces": { + "supported": true + } + }, + "contributes": { + "notebookRenderer": [ + { + "id": "vscode-builtin-notebook-renderer", + "entrypoint": "./renderer-out/index.js", + "displayName": "VS Code Builtin Notebook Output Renderer", + "requiresMessaging": "never", + "mimeTypes": [ + "image/gif", + "image/png", + "image/jpeg", + "image/svg+xml", + "text/html", + "application/javascript", + "application/vnd.code.notebook.error" + ] + } + ] + }, + "scripts": { + "compile": "npm run build-notebook", + "watch": "node ./esbuild --watch", + "build-notebook": "node ./esbuild" + }, + "dependencies": { + }, + "devDependencies": { + "@types/vscode-notebook-renderer": "^1.60.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/vscode.git" + } +} diff --git a/extensions/notebook-renderers/package.nls.json b/extensions/notebook-renderers/package.nls.json new file mode 100644 index 00000000000..70b82dbe8ca --- /dev/null +++ b/extensions/notebook-renderers/package.nls.json @@ -0,0 +1,4 @@ +{ + "displayName": "Builtin Notebook Output Renderers", + "description": "Provides basic output renderers for notebooks" +} diff --git a/extensions/notebook-renderers/src/ansi.ts b/extensions/notebook-renderers/src/ansi.ts new file mode 100644 index 00000000000..185dd27276b --- /dev/null +++ b/extensions/notebook-renderers/src/ansi.ts @@ -0,0 +1,447 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { RGBA, Color } from './color'; +import { ansiColorIdentifiers } from './colorMap'; +import { linkify } from './linkify'; + + +export function handleANSIOutput(text: string): HTMLSpanElement { + let workspaceFolder = undefined; + + const root: HTMLSpanElement = document.createElement('span'); + const textLength: number = text.length; + + let styleNames: string[] = []; + let customFgColor: RGBA | string | undefined; + let customBgColor: RGBA | string | undefined; + let customUnderlineColor: RGBA | string | undefined; + let colorsInverted: boolean = false; + let currentPos: number = 0; + let buffer: string = ''; + + while (currentPos < textLength) { + + let sequenceFound: boolean = false; + + // Potentially an ANSI escape sequence. + // See http://ascii-table.com/ansi-escape-sequences.php & https://en.wikipedia.org/wiki/ANSI_escape_code + if (text.charCodeAt(currentPos) === 27 && text.charAt(currentPos + 1) === '[') { + + const startPos: number = currentPos; + currentPos += 2; // Ignore 'Esc[' as it's in every sequence. + + let ansiSequence: string = ''; + + while (currentPos < textLength) { + const char: string = text.charAt(currentPos); + ansiSequence += char; + + currentPos++; + + // Look for a known sequence terminating character. + if (char.match(/^[ABCDHIJKfhmpsu]$/)) { + sequenceFound = true; + break; + } + + } + + if (sequenceFound) { + + // Flush buffer with previous styles. + appendStylizedStringToContainer(root, buffer, styleNames, workspaceFolder, customFgColor, customBgColor, customUnderlineColor); + + buffer = ''; + + /* + * Certain ranges that are matched here do not contain real graphics rendition sequences. For + * the sake of having a simpler expression, they have been included anyway. + */ + if (ansiSequence.match(/^(?:[34][0-8]|9[0-7]|10[0-7]|[0-9]|2[1-5,7-9]|[34]9|5[8,9]|1[0-9])(?:;[349][0-7]|10[0-7]|[013]|[245]|[34]9)?(?:;[012]?[0-9]?[0-9])*;?m$/)) { + + const styleCodes: number[] = ansiSequence.slice(0, -1) // Remove final 'm' character. + .split(';') // Separate style codes. + .filter(elem => elem !== '') // Filter empty elems as '34;m' -> ['34', '']. + .map(elem => parseInt(elem, 10)); // Convert to numbers. + + if (styleCodes[0] === 38 || styleCodes[0] === 48 || styleCodes[0] === 58) { + // Advanced color code - can't be combined with formatting codes like simple colors can + // Ignores invalid colors and additional info beyond what is necessary + const colorType = (styleCodes[0] === 38) ? 'foreground' : ((styleCodes[0] === 48) ? 'background' : 'underline'); + + if (styleCodes[1] === 5) { + set8BitColor(styleCodes, colorType); + } else if (styleCodes[1] === 2) { + set24BitColor(styleCodes, colorType); + } + } else { + setBasicFormatters(styleCodes); + } + + } else { + // Unsupported sequence so simply hide it. + } + + } else { + currentPos = startPos; + } + } + + if (sequenceFound === false) { + buffer += text.charAt(currentPos); + currentPos++; + } + } + + // Flush remaining text buffer if not empty. + if (buffer) { + appendStylizedStringToContainer(root, buffer, styleNames, workspaceFolder, customFgColor, customBgColor, customUnderlineColor); + } + + return root; + + /** + * Change the foreground or background color by clearing the current color + * and adding the new one. + * @param colorType If `'foreground'`, will change the foreground color, if + * `'background'`, will change the background color, and if `'underline'` + * will set the underline color. + * @param color Color to change to. If `undefined` or not provided, + * will clear current color without adding a new one. + */ + function changeColor(colorType: 'foreground' | 'background' | 'underline', color?: RGBA | string | undefined): void { + if (colorType === 'foreground') { + customFgColor = color; + } else if (colorType === 'background') { + customBgColor = color; + } else if (colorType === 'underline') { + customUnderlineColor = color; + } + styleNames = styleNames.filter(style => style !== `code-${colorType}-colored`); + if (color !== undefined) { + styleNames.push(`code-${colorType}-colored`); + } + } + + /** + * Swap foreground and background colors. Used for color inversion. Caller should check + * [] flag to make sure it is appropriate to turn ON or OFF (if it is already inverted don't call + */ + function reverseForegroundAndBackgroundColors(): void { + const oldFgColor: RGBA | string | undefined = customFgColor; + changeColor('foreground', customBgColor); + changeColor('background', oldFgColor); + } + + /** + * Calculate and set basic ANSI formatting. Supports ON/OFF of bold, italic, underline, + * double underline, crossed-out/strikethrough, overline, dim, blink, rapid blink, + * reverse/invert video, hidden, superscript, subscript and alternate font codes, + * clearing/resetting of foreground, background and underline colors, + * setting normal foreground and background colors, and bright foreground and + * background colors. Not to be used for codes containing advanced colors. + * Will ignore invalid codes. + * @param styleCodes Array of ANSI basic styling numbers, which will be + * applied in order. New colors and backgrounds clear old ones; new formatting + * does not. + * @see {@link https://en.wikipedia.org/wiki/ANSI_escape_code#SGR } + */ + function setBasicFormatters(styleCodes: number[]): void { + for (const code of styleCodes) { + switch (code) { + case 0: { // reset (everything) + styleNames = []; + customFgColor = undefined; + customBgColor = undefined; + break; + } + case 1: { // bold + styleNames = styleNames.filter(style => style !== `code-bold`); + styleNames.push('code-bold'); + break; + } + case 2: { // dim + styleNames = styleNames.filter(style => style !== `code-dim`); + styleNames.push('code-dim'); + break; + } + case 3: { // italic + styleNames = styleNames.filter(style => style !== `code-italic`); + styleNames.push('code-italic'); + break; + } + case 4: { // underline + styleNames = styleNames.filter(style => (style !== `code-underline` && style !== `code-double-underline`)); + styleNames.push('code-underline'); + break; + } + case 5: { // blink + styleNames = styleNames.filter(style => style !== `code-blink`); + styleNames.push('code-blink'); + break; + } + case 6: { // rapid blink + styleNames = styleNames.filter(style => style !== `code-rapid-blink`); + styleNames.push('code-rapid-blink'); + break; + } + case 7: { // invert foreground and background + if (!colorsInverted) { + colorsInverted = true; + reverseForegroundAndBackgroundColors(); + } + break; + } + case 8: { // hidden + styleNames = styleNames.filter(style => style !== `code-hidden`); + styleNames.push('code-hidden'); + break; + } + case 9: { // strike-through/crossed-out + styleNames = styleNames.filter(style => style !== `code-strike-through`); + styleNames.push('code-strike-through'); + break; + } + case 10: { // normal default font + styleNames = styleNames.filter(style => !style.startsWith('code-font')); + break; + } + case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: { // font codes (and 20 is 'blackletter' font code) + styleNames = styleNames.filter(style => !style.startsWith('code-font')); + styleNames.push(`code-font-${code - 10}`); + break; + } + case 21: { // double underline + styleNames = styleNames.filter(style => (style !== `code-underline` && style !== `code-double-underline`)); + styleNames.push('code-double-underline'); + break; + } + case 22: { // normal intensity (bold off and dim off) + styleNames = styleNames.filter(style => (style !== `code-bold` && style !== `code-dim`)); + break; + } + case 23: { // Neither italic or blackletter (font 10) + styleNames = styleNames.filter(style => (style !== `code-italic` && style !== `code-font-10`)); + break; + } + case 24: { // not underlined (Neither singly nor doubly underlined) + styleNames = styleNames.filter(style => (style !== `code-underline` && style !== `code-double-underline`)); + break; + } + case 25: { // not blinking + styleNames = styleNames.filter(style => (style !== `code-blink` && style !== `code-rapid-blink`)); + break; + } + case 27: { // not reversed/inverted + if (colorsInverted) { + colorsInverted = false; + reverseForegroundAndBackgroundColors(); + } + break; + } + case 28: { // not hidden (reveal) + styleNames = styleNames.filter(style => style !== `code-hidden`); + break; + } + case 29: { // not crossed-out + styleNames = styleNames.filter(style => style !== `code-strike-through`); + break; + } + case 53: { // overlined + styleNames = styleNames.filter(style => style !== `code-overline`); + styleNames.push('code-overline'); + break; + } + case 55: { // not overlined + styleNames = styleNames.filter(style => style !== `code-overline`); + break; + } + case 39: { // default foreground color + changeColor('foreground', undefined); + break; + } + case 49: { // default background color + changeColor('background', undefined); + break; + } + case 59: { // default underline color + changeColor('underline', undefined); + break; + } + case 73: { // superscript + styleNames = styleNames.filter(style => (style !== `code-superscript` && style !== `code-subscript`)); + styleNames.push('code-superscript'); + break; + } + case 74: { // subscript + styleNames = styleNames.filter(style => (style !== `code-superscript` && style !== `code-subscript`)); + styleNames.push('code-subscript'); + break; + } + case 75: { // neither superscript or subscript + styleNames = styleNames.filter(style => (style !== `code-superscript` && style !== `code-subscript`)); + break; + } + default: { + setBasicColor(code); + break; + } + } + } + } + + /** + * Calculate and set styling for complicated 24-bit ANSI color codes. + * @param styleCodes Full list of integer codes that make up the full ANSI + * sequence, including the two defining codes and the three RGB codes. + * @param colorType If `'foreground'`, will set foreground color, if + * `'background'`, will set background color, and if it is `'underline'` + * will set the underline color. + * @see {@link https://en.wikipedia.org/wiki/ANSI_escape_code#24-bit } + */ + function set24BitColor(styleCodes: number[], colorType: 'foreground' | 'background' | 'underline'): void { + if (styleCodes.length >= 5 && + styleCodes[2] >= 0 && styleCodes[2] <= 255 && + styleCodes[3] >= 0 && styleCodes[3] <= 255 && + styleCodes[4] >= 0 && styleCodes[4] <= 255) { + const customColor = new RGBA(styleCodes[2], styleCodes[3], styleCodes[4]); + changeColor(colorType, customColor); + } + } + + /** + * Calculate and set styling for advanced 8-bit ANSI color codes. + * @param styleCodes Full list of integer codes that make up the ANSI + * sequence, including the two defining codes and the one color code. + * @param colorType If `'foreground'`, will set foreground color, if + * `'background'`, will set background color and if it is `'underline'` + * will set the underline color. + * @see {@link https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit } + */ + function set8BitColor(styleCodes: number[], colorType: 'foreground' | 'background' | 'underline'): void { + let colorNumber = styleCodes[2]; + const color = calcANSI8bitColor(colorNumber); + + if (color) { + changeColor(colorType, color); + } else if (colorNumber >= 0 && colorNumber <= 15) { + if (colorType === 'underline') { + // for underline colors we just decode the 0-15 color number to theme color, set and return + changeColor(colorType, ansiColorIdentifiers[colorNumber].colorValue); + return; + } + // Need to map to one of the four basic color ranges (30-37, 90-97, 40-47, 100-107) + colorNumber += 30; + if (colorNumber >= 38) { + // Bright colors + colorNumber += 52; + } + if (colorType === 'background') { + colorNumber += 10; + } + setBasicColor(colorNumber); + } + } + + /** + * Calculate and set styling for basic bright and dark ANSI color codes. Uses + * theme colors if available. Automatically distinguishes between foreground + * and background colors; does not support color-clearing codes 39 and 49. + * @param styleCode Integer color code on one of the following ranges: + * [30-37, 90-97, 40-47, 100-107]. If not on one of these ranges, will do + * nothing. + */ + function setBasicColor(styleCode: number): void { + // const theme = themeService.getColorTheme(); + let colorType: 'foreground' | 'background' | undefined; + let colorIndex: number | undefined; + + if (styleCode >= 30 && styleCode <= 37) { + colorIndex = styleCode - 30; + colorType = 'foreground'; + } else if (styleCode >= 90 && styleCode <= 97) { + colorIndex = (styleCode - 90) + 8; // High-intensity (bright) + colorType = 'foreground'; + } else if (styleCode >= 40 && styleCode <= 47) { + colorIndex = styleCode - 40; + colorType = 'background'; + } else if (styleCode >= 100 && styleCode <= 107) { + colorIndex = (styleCode - 100) + 8; // High-intensity (bright) + colorType = 'background'; + } + + if (colorIndex !== undefined && colorType) { + changeColor(colorType, ansiColorIdentifiers[colorIndex]?.colorValue); + } + } +} + +export function appendStylizedStringToContainer( + root: HTMLElement, + stringContent: string, + cssClasses: string[], + workspaceFolder: string | undefined, + customTextColor?: RGBA | string, + customBackgroundColor?: RGBA | string, + customUnderlineColor?: RGBA | string +): void { + if (!root || !stringContent) { + return; + } + + const container = linkify(stringContent, true, workspaceFolder); + + container.className = cssClasses.join(' '); + if (customTextColor) { + container.style.color = typeof customTextColor === 'string' ? customTextColor : Color.Format.CSS.formatRGB(new Color(customTextColor)); + } + if (customBackgroundColor) { + container.style.backgroundColor = typeof customBackgroundColor === 'string' ? customBackgroundColor : Color.Format.CSS.formatRGB(new Color(customBackgroundColor)); + } + if (customUnderlineColor) { + container.style.textDecorationColor = typeof customUnderlineColor === 'string' ? customUnderlineColor : Color.Format.CSS.formatRGB(new Color(customUnderlineColor)); + } + root.appendChild(container); +} + +/** + * Calculate the color from the color set defined in the ANSI 8-bit standard. + * Standard and high intensity colors are not defined in the standard as specific + * colors, so these and invalid colors return `undefined`. + * @see {@link https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit } for info. + * @param colorNumber The number (ranging from 16 to 255) referring to the color + * desired. + */ +export function calcANSI8bitColor(colorNumber: number): RGBA | undefined { + if (colorNumber % 1 !== 0) { + // Should be integer + return; + } if (colorNumber >= 16 && colorNumber <= 231) { + // Converts to one of 216 RGB colors + colorNumber -= 16; + + let blue: number = colorNumber % 6; + colorNumber = (colorNumber - blue) / 6; + let green: number = colorNumber % 6; + colorNumber = (colorNumber - green) / 6; + let red: number = colorNumber; + + // red, green, blue now range on [0, 5], need to map to [0,255] + const convFactor: number = 255 / 5; + blue = Math.round(blue * convFactor); + green = Math.round(green * convFactor); + red = Math.round(red * convFactor); + + return new RGBA(red, green, blue); + } else if (colorNumber >= 232 && colorNumber <= 255) { + // Converts to a grayscale value + colorNumber -= 232; + const colorLevel: number = Math.round(colorNumber / 23 * 255); + return new RGBA(colorLevel, colorLevel, colorLevel); + } else { + return; + } +} diff --git a/extensions/notebook-renderers/src/color.ts b/extensions/notebook-renderers/src/color.ts new file mode 100644 index 00000000000..2c01cae1071 --- /dev/null +++ b/extensions/notebook-renderers/src/color.ts @@ -0,0 +1,1055 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const enum CharCode { + Null = 0, + /** + * The `\b` character. + */ + Backspace = 8, + /** + * The `\t` character. + */ + Tab = 9, + /** + * The `\n` character. + */ + LineFeed = 10, + /** + * The `\r` character. + */ + CarriageReturn = 13, + Space = 32, + /** + * The `!` character. + */ + ExclamationMark = 33, + /** + * The `"` character. + */ + DoubleQuote = 34, + /** + * The `#` character. + */ + Hash = 35, + /** + * The `$` character. + */ + DollarSign = 36, + /** + * The `%` character. + */ + PercentSign = 37, + /** + * The `&` character. + */ + Ampersand = 38, + /** + * The `'` character. + */ + SingleQuote = 39, + /** + * The `(` character. + */ + OpenParen = 40, + /** + * The `)` character. + */ + CloseParen = 41, + /** + * The `*` character. + */ + Asterisk = 42, + /** + * The `+` character. + */ + Plus = 43, + /** + * The `,` character. + */ + Comma = 44, + /** + * The `-` character. + */ + Dash = 45, + /** + * The `.` character. + */ + Period = 46, + /** + * The `/` character. + */ + Slash = 47, + + Digit0 = 48, + Digit1 = 49, + Digit2 = 50, + Digit3 = 51, + Digit4 = 52, + Digit5 = 53, + Digit6 = 54, + Digit7 = 55, + Digit8 = 56, + Digit9 = 57, + + /** + * The `:` character. + */ + Colon = 58, + /** + * The `;` character. + */ + Semicolon = 59, + /** + * The `<` character. + */ + LessThan = 60, + /** + * The `=` character. + */ + Equals = 61, + /** + * The `>` character. + */ + GreaterThan = 62, + /** + * The `?` character. + */ + QuestionMark = 63, + /** + * The `@` character. + */ + AtSign = 64, + + A = 65, + B = 66, + C = 67, + D = 68, + E = 69, + F = 70, + G = 71, + H = 72, + I = 73, + J = 74, + K = 75, + L = 76, + M = 77, + N = 78, + O = 79, + P = 80, + Q = 81, + R = 82, + S = 83, + T = 84, + U = 85, + V = 86, + W = 87, + X = 88, + Y = 89, + Z = 90, + + /** + * The `[` character. + */ + OpenSquareBracket = 91, + /** + * The `\` character. + */ + Backslash = 92, + /** + * The `]` character. + */ + CloseSquareBracket = 93, + /** + * The `^` character. + */ + Caret = 94, + /** + * The `_` character. + */ + Underline = 95, + /** + * The ``(`)`` character. + */ + BackTick = 96, + + a = 97, + b = 98, + c = 99, + d = 100, + e = 101, + f = 102, + g = 103, + h = 104, + i = 105, + j = 106, + k = 107, + l = 108, + m = 109, + n = 110, + o = 111, + p = 112, + q = 113, + r = 114, + s = 115, + t = 116, + u = 117, + v = 118, + w = 119, + x = 120, + y = 121, + z = 122, + + /** + * The `{` character. + */ + OpenCurlyBrace = 123, + /** + * The `|` character. + */ + Pipe = 124, + /** + * The `}` character. + */ + CloseCurlyBrace = 125, + /** + * The `~` character. + */ + Tilde = 126, + + U_Combining_Grave_Accent = 0x0300, // U+0300 Combining Grave Accent + U_Combining_Acute_Accent = 0x0301, // U+0301 Combining Acute Accent + U_Combining_Circumflex_Accent = 0x0302, // U+0302 Combining Circumflex Accent + U_Combining_Tilde = 0x0303, // U+0303 Combining Tilde + U_Combining_Macron = 0x0304, // U+0304 Combining Macron + U_Combining_Overline = 0x0305, // U+0305 Combining Overline + U_Combining_Breve = 0x0306, // U+0306 Combining Breve + U_Combining_Dot_Above = 0x0307, // U+0307 Combining Dot Above + U_Combining_Diaeresis = 0x0308, // U+0308 Combining Diaeresis + U_Combining_Hook_Above = 0x0309, // U+0309 Combining Hook Above + U_Combining_Ring_Above = 0x030A, // U+030A Combining Ring Above + U_Combining_Double_Acute_Accent = 0x030B, // U+030B Combining Double Acute Accent + U_Combining_Caron = 0x030C, // U+030C Combining Caron + U_Combining_Vertical_Line_Above = 0x030D, // U+030D Combining Vertical Line Above + U_Combining_Double_Vertical_Line_Above = 0x030E, // U+030E Combining Double Vertical Line Above + U_Combining_Double_Grave_Accent = 0x030F, // U+030F Combining Double Grave Accent + U_Combining_Candrabindu = 0x0310, // U+0310 Combining Candrabindu + U_Combining_Inverted_Breve = 0x0311, // U+0311 Combining Inverted Breve + U_Combining_Turned_Comma_Above = 0x0312, // U+0312 Combining Turned Comma Above + U_Combining_Comma_Above = 0x0313, // U+0313 Combining Comma Above + U_Combining_Reversed_Comma_Above = 0x0314, // U+0314 Combining Reversed Comma Above + U_Combining_Comma_Above_Right = 0x0315, // U+0315 Combining Comma Above Right + U_Combining_Grave_Accent_Below = 0x0316, // U+0316 Combining Grave Accent Below + U_Combining_Acute_Accent_Below = 0x0317, // U+0317 Combining Acute Accent Below + U_Combining_Left_Tack_Below = 0x0318, // U+0318 Combining Left Tack Below + U_Combining_Right_Tack_Below = 0x0319, // U+0319 Combining Right Tack Below + U_Combining_Left_Angle_Above = 0x031A, // U+031A Combining Left Angle Above + U_Combining_Horn = 0x031B, // U+031B Combining Horn + U_Combining_Left_Half_Ring_Below = 0x031C, // U+031C Combining Left Half Ring Below + U_Combining_Up_Tack_Below = 0x031D, // U+031D Combining Up Tack Below + U_Combining_Down_Tack_Below = 0x031E, // U+031E Combining Down Tack Below + U_Combining_Plus_Sign_Below = 0x031F, // U+031F Combining Plus Sign Below + U_Combining_Minus_Sign_Below = 0x0320, // U+0320 Combining Minus Sign Below + U_Combining_Palatalized_Hook_Below = 0x0321, // U+0321 Combining Palatalized Hook Below + U_Combining_Retroflex_Hook_Below = 0x0322, // U+0322 Combining Retroflex Hook Below + U_Combining_Dot_Below = 0x0323, // U+0323 Combining Dot Below + U_Combining_Diaeresis_Below = 0x0324, // U+0324 Combining Diaeresis Below + U_Combining_Ring_Below = 0x0325, // U+0325 Combining Ring Below + U_Combining_Comma_Below = 0x0326, // U+0326 Combining Comma Below + U_Combining_Cedilla = 0x0327, // U+0327 Combining Cedilla + U_Combining_Ogonek = 0x0328, // U+0328 Combining Ogonek + U_Combining_Vertical_Line_Below = 0x0329, // U+0329 Combining Vertical Line Below + U_Combining_Bridge_Below = 0x032A, // U+032A Combining Bridge Below + U_Combining_Inverted_Double_Arch_Below = 0x032B, // U+032B Combining Inverted Double Arch Below + U_Combining_Caron_Below = 0x032C, // U+032C Combining Caron Below + U_Combining_Circumflex_Accent_Below = 0x032D, // U+032D Combining Circumflex Accent Below + U_Combining_Breve_Below = 0x032E, // U+032E Combining Breve Below + U_Combining_Inverted_Breve_Below = 0x032F, // U+032F Combining Inverted Breve Below + U_Combining_Tilde_Below = 0x0330, // U+0330 Combining Tilde Below + U_Combining_Macron_Below = 0x0331, // U+0331 Combining Macron Below + U_Combining_Low_Line = 0x0332, // U+0332 Combining Low Line + U_Combining_Double_Low_Line = 0x0333, // U+0333 Combining Double Low Line + U_Combining_Tilde_Overlay = 0x0334, // U+0334 Combining Tilde Overlay + U_Combining_Short_Stroke_Overlay = 0x0335, // U+0335 Combining Short Stroke Overlay + U_Combining_Long_Stroke_Overlay = 0x0336, // U+0336 Combining Long Stroke Overlay + U_Combining_Short_Solidus_Overlay = 0x0337, // U+0337 Combining Short Solidus Overlay + U_Combining_Long_Solidus_Overlay = 0x0338, // U+0338 Combining Long Solidus Overlay + U_Combining_Right_Half_Ring_Below = 0x0339, // U+0339 Combining Right Half Ring Below + U_Combining_Inverted_Bridge_Below = 0x033A, // U+033A Combining Inverted Bridge Below + U_Combining_Square_Below = 0x033B, // U+033B Combining Square Below + U_Combining_Seagull_Below = 0x033C, // U+033C Combining Seagull Below + U_Combining_X_Above = 0x033D, // U+033D Combining X Above + U_Combining_Vertical_Tilde = 0x033E, // U+033E Combining Vertical Tilde + U_Combining_Double_Overline = 0x033F, // U+033F Combining Double Overline + U_Combining_Grave_Tone_Mark = 0x0340, // U+0340 Combining Grave Tone Mark + U_Combining_Acute_Tone_Mark = 0x0341, // U+0341 Combining Acute Tone Mark + U_Combining_Greek_Perispomeni = 0x0342, // U+0342 Combining Greek Perispomeni + U_Combining_Greek_Koronis = 0x0343, // U+0343 Combining Greek Koronis + U_Combining_Greek_Dialytika_Tonos = 0x0344, // U+0344 Combining Greek Dialytika Tonos + U_Combining_Greek_Ypogegrammeni = 0x0345, // U+0345 Combining Greek Ypogegrammeni + U_Combining_Bridge_Above = 0x0346, // U+0346 Combining Bridge Above + U_Combining_Equals_Sign_Below = 0x0347, // U+0347 Combining Equals Sign Below + U_Combining_Double_Vertical_Line_Below = 0x0348, // U+0348 Combining Double Vertical Line Below + U_Combining_Left_Angle_Below = 0x0349, // U+0349 Combining Left Angle Below + U_Combining_Not_Tilde_Above = 0x034A, // U+034A Combining Not Tilde Above + U_Combining_Homothetic_Above = 0x034B, // U+034B Combining Homothetic Above + U_Combining_Almost_Equal_To_Above = 0x034C, // U+034C Combining Almost Equal To Above + U_Combining_Left_Right_Arrow_Below = 0x034D, // U+034D Combining Left Right Arrow Below + U_Combining_Upwards_Arrow_Below = 0x034E, // U+034E Combining Upwards Arrow Below + U_Combining_Grapheme_Joiner = 0x034F, // U+034F Combining Grapheme Joiner + U_Combining_Right_Arrowhead_Above = 0x0350, // U+0350 Combining Right Arrowhead Above + U_Combining_Left_Half_Ring_Above = 0x0351, // U+0351 Combining Left Half Ring Above + U_Combining_Fermata = 0x0352, // U+0352 Combining Fermata + U_Combining_X_Below = 0x0353, // U+0353 Combining X Below + U_Combining_Left_Arrowhead_Below = 0x0354, // U+0354 Combining Left Arrowhead Below + U_Combining_Right_Arrowhead_Below = 0x0355, // U+0355 Combining Right Arrowhead Below + U_Combining_Right_Arrowhead_And_Up_Arrowhead_Below = 0x0356, // U+0356 Combining Right Arrowhead And Up Arrowhead Below + U_Combining_Right_Half_Ring_Above = 0x0357, // U+0357 Combining Right Half Ring Above + U_Combining_Dot_Above_Right = 0x0358, // U+0358 Combining Dot Above Right + U_Combining_Asterisk_Below = 0x0359, // U+0359 Combining Asterisk Below + U_Combining_Double_Ring_Below = 0x035A, // U+035A Combining Double Ring Below + U_Combining_Zigzag_Above = 0x035B, // U+035B Combining Zigzag Above + U_Combining_Double_Breve_Below = 0x035C, // U+035C Combining Double Breve Below + U_Combining_Double_Breve = 0x035D, // U+035D Combining Double Breve + U_Combining_Double_Macron = 0x035E, // U+035E Combining Double Macron + U_Combining_Double_Macron_Below = 0x035F, // U+035F Combining Double Macron Below + U_Combining_Double_Tilde = 0x0360, // U+0360 Combining Double Tilde + U_Combining_Double_Inverted_Breve = 0x0361, // U+0361 Combining Double Inverted Breve + U_Combining_Double_Rightwards_Arrow_Below = 0x0362, // U+0362 Combining Double Rightwards Arrow Below + U_Combining_Latin_Small_Letter_A = 0x0363, // U+0363 Combining Latin Small Letter A + U_Combining_Latin_Small_Letter_E = 0x0364, // U+0364 Combining Latin Small Letter E + U_Combining_Latin_Small_Letter_I = 0x0365, // U+0365 Combining Latin Small Letter I + U_Combining_Latin_Small_Letter_O = 0x0366, // U+0366 Combining Latin Small Letter O + U_Combining_Latin_Small_Letter_U = 0x0367, // U+0367 Combining Latin Small Letter U + U_Combining_Latin_Small_Letter_C = 0x0368, // U+0368 Combining Latin Small Letter C + U_Combining_Latin_Small_Letter_D = 0x0369, // U+0369 Combining Latin Small Letter D + U_Combining_Latin_Small_Letter_H = 0x036A, // U+036A Combining Latin Small Letter H + U_Combining_Latin_Small_Letter_M = 0x036B, // U+036B Combining Latin Small Letter M + U_Combining_Latin_Small_Letter_R = 0x036C, // U+036C Combining Latin Small Letter R + U_Combining_Latin_Small_Letter_T = 0x036D, // U+036D Combining Latin Small Letter T + U_Combining_Latin_Small_Letter_V = 0x036E, // U+036E Combining Latin Small Letter V + U_Combining_Latin_Small_Letter_X = 0x036F, // U+036F Combining Latin Small Letter X + + /** + * Unicode Character 'LINE SEPARATOR' (U+2028) + * http://www.fileformat.info/info/unicode/char/2028/index.htm + */ + LINE_SEPARATOR = 0x2028, + /** + * Unicode Character 'PARAGRAPH SEPARATOR' (U+2029) + * http://www.fileformat.info/info/unicode/char/2029/index.htm + */ + PARAGRAPH_SEPARATOR = 0x2029, + /** + * Unicode Character 'NEXT LINE' (U+0085) + * http://www.fileformat.info/info/unicode/char/0085/index.htm + */ + NEXT_LINE = 0x0085, + + // http://www.fileformat.info/info/unicode/category/Sk/list.htm + U_CIRCUMFLEX = 0x005E, // U+005E CIRCUMFLEX + U_GRAVE_ACCENT = 0x0060, // U+0060 GRAVE ACCENT + U_DIAERESIS = 0x00A8, // U+00A8 DIAERESIS + U_MACRON = 0x00AF, // U+00AF MACRON + U_ACUTE_ACCENT = 0x00B4, // U+00B4 ACUTE ACCENT + U_CEDILLA = 0x00B8, // U+00B8 CEDILLA + U_MODIFIER_LETTER_LEFT_ARROWHEAD = 0x02C2, // U+02C2 MODIFIER LETTER LEFT ARROWHEAD + U_MODIFIER_LETTER_RIGHT_ARROWHEAD = 0x02C3, // U+02C3 MODIFIER LETTER RIGHT ARROWHEAD + U_MODIFIER_LETTER_UP_ARROWHEAD = 0x02C4, // U+02C4 MODIFIER LETTER UP ARROWHEAD + U_MODIFIER_LETTER_DOWN_ARROWHEAD = 0x02C5, // U+02C5 MODIFIER LETTER DOWN ARROWHEAD + U_MODIFIER_LETTER_CENTRED_RIGHT_HALF_RING = 0x02D2, // U+02D2 MODIFIER LETTER CENTRED RIGHT HALF RING + U_MODIFIER_LETTER_CENTRED_LEFT_HALF_RING = 0x02D3, // U+02D3 MODIFIER LETTER CENTRED LEFT HALF RING + U_MODIFIER_LETTER_UP_TACK = 0x02D4, // U+02D4 MODIFIER LETTER UP TACK + U_MODIFIER_LETTER_DOWN_TACK = 0x02D5, // U+02D5 MODIFIER LETTER DOWN TACK + U_MODIFIER_LETTER_PLUS_SIGN = 0x02D6, // U+02D6 MODIFIER LETTER PLUS SIGN + U_MODIFIER_LETTER_MINUS_SIGN = 0x02D7, // U+02D7 MODIFIER LETTER MINUS SIGN + U_BREVE = 0x02D8, // U+02D8 BREVE + U_DOT_ABOVE = 0x02D9, // U+02D9 DOT ABOVE + U_RING_ABOVE = 0x02DA, // U+02DA RING ABOVE + U_OGONEK = 0x02DB, // U+02DB OGONEK + U_SMALL_TILDE = 0x02DC, // U+02DC SMALL TILDE + U_DOUBLE_ACUTE_ACCENT = 0x02DD, // U+02DD DOUBLE ACUTE ACCENT + U_MODIFIER_LETTER_RHOTIC_HOOK = 0x02DE, // U+02DE MODIFIER LETTER RHOTIC HOOK + U_MODIFIER_LETTER_CROSS_ACCENT = 0x02DF, // U+02DF MODIFIER LETTER CROSS ACCENT + U_MODIFIER_LETTER_EXTRA_HIGH_TONE_BAR = 0x02E5, // U+02E5 MODIFIER LETTER EXTRA-HIGH TONE BAR + U_MODIFIER_LETTER_HIGH_TONE_BAR = 0x02E6, // U+02E6 MODIFIER LETTER HIGH TONE BAR + U_MODIFIER_LETTER_MID_TONE_BAR = 0x02E7, // U+02E7 MODIFIER LETTER MID TONE BAR + U_MODIFIER_LETTER_LOW_TONE_BAR = 0x02E8, // U+02E8 MODIFIER LETTER LOW TONE BAR + U_MODIFIER_LETTER_EXTRA_LOW_TONE_BAR = 0x02E9, // U+02E9 MODIFIER LETTER EXTRA-LOW TONE BAR + U_MODIFIER_LETTER_YIN_DEPARTING_TONE_MARK = 0x02EA, // U+02EA MODIFIER LETTER YIN DEPARTING TONE MARK + U_MODIFIER_LETTER_YANG_DEPARTING_TONE_MARK = 0x02EB, // U+02EB MODIFIER LETTER YANG DEPARTING TONE MARK + U_MODIFIER_LETTER_UNASPIRATED = 0x02ED, // U+02ED MODIFIER LETTER UNASPIRATED + U_MODIFIER_LETTER_LOW_DOWN_ARROWHEAD = 0x02EF, // U+02EF MODIFIER LETTER LOW DOWN ARROWHEAD + U_MODIFIER_LETTER_LOW_UP_ARROWHEAD = 0x02F0, // U+02F0 MODIFIER LETTER LOW UP ARROWHEAD + U_MODIFIER_LETTER_LOW_LEFT_ARROWHEAD = 0x02F1, // U+02F1 MODIFIER LETTER LOW LEFT ARROWHEAD + U_MODIFIER_LETTER_LOW_RIGHT_ARROWHEAD = 0x02F2, // U+02F2 MODIFIER LETTER LOW RIGHT ARROWHEAD + U_MODIFIER_LETTER_LOW_RING = 0x02F3, // U+02F3 MODIFIER LETTER LOW RING + U_MODIFIER_LETTER_MIDDLE_GRAVE_ACCENT = 0x02F4, // U+02F4 MODIFIER LETTER MIDDLE GRAVE ACCENT + U_MODIFIER_LETTER_MIDDLE_DOUBLE_GRAVE_ACCENT = 0x02F5, // U+02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT + U_MODIFIER_LETTER_MIDDLE_DOUBLE_ACUTE_ACCENT = 0x02F6, // U+02F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT + U_MODIFIER_LETTER_LOW_TILDE = 0x02F7, // U+02F7 MODIFIER LETTER LOW TILDE + U_MODIFIER_LETTER_RAISED_COLON = 0x02F8, // U+02F8 MODIFIER LETTER RAISED COLON + U_MODIFIER_LETTER_BEGIN_HIGH_TONE = 0x02F9, // U+02F9 MODIFIER LETTER BEGIN HIGH TONE + U_MODIFIER_LETTER_END_HIGH_TONE = 0x02FA, // U+02FA MODIFIER LETTER END HIGH TONE + U_MODIFIER_LETTER_BEGIN_LOW_TONE = 0x02FB, // U+02FB MODIFIER LETTER BEGIN LOW TONE + U_MODIFIER_LETTER_END_LOW_TONE = 0x02FC, // U+02FC MODIFIER LETTER END LOW TONE + U_MODIFIER_LETTER_SHELF = 0x02FD, // U+02FD MODIFIER LETTER SHELF + U_MODIFIER_LETTER_OPEN_SHELF = 0x02FE, // U+02FE MODIFIER LETTER OPEN SHELF + U_MODIFIER_LETTER_LOW_LEFT_ARROW = 0x02FF, // U+02FF MODIFIER LETTER LOW LEFT ARROW + U_GREEK_LOWER_NUMERAL_SIGN = 0x0375, // U+0375 GREEK LOWER NUMERAL SIGN + U_GREEK_TONOS = 0x0384, // U+0384 GREEK TONOS + U_GREEK_DIALYTIKA_TONOS = 0x0385, // U+0385 GREEK DIALYTIKA TONOS + U_GREEK_KORONIS = 0x1FBD, // U+1FBD GREEK KORONIS + U_GREEK_PSILI = 0x1FBF, // U+1FBF GREEK PSILI + U_GREEK_PERISPOMENI = 0x1FC0, // U+1FC0 GREEK PERISPOMENI + U_GREEK_DIALYTIKA_AND_PERISPOMENI = 0x1FC1, // U+1FC1 GREEK DIALYTIKA AND PERISPOMENI + U_GREEK_PSILI_AND_VARIA = 0x1FCD, // U+1FCD GREEK PSILI AND VARIA + U_GREEK_PSILI_AND_OXIA = 0x1FCE, // U+1FCE GREEK PSILI AND OXIA + U_GREEK_PSILI_AND_PERISPOMENI = 0x1FCF, // U+1FCF GREEK PSILI AND PERISPOMENI + U_GREEK_DASIA_AND_VARIA = 0x1FDD, // U+1FDD GREEK DASIA AND VARIA + U_GREEK_DASIA_AND_OXIA = 0x1FDE, // U+1FDE GREEK DASIA AND OXIA + U_GREEK_DASIA_AND_PERISPOMENI = 0x1FDF, // U+1FDF GREEK DASIA AND PERISPOMENI + U_GREEK_DIALYTIKA_AND_VARIA = 0x1FED, // U+1FED GREEK DIALYTIKA AND VARIA + U_GREEK_DIALYTIKA_AND_OXIA = 0x1FEE, // U+1FEE GREEK DIALYTIKA AND OXIA + U_GREEK_VARIA = 0x1FEF, // U+1FEF GREEK VARIA + U_GREEK_OXIA = 0x1FFD, // U+1FFD GREEK OXIA + U_GREEK_DASIA = 0x1FFE, // U+1FFE GREEK DASIA + + U_IDEOGRAPHIC_FULL_STOP = 0x3002, // U+3002 IDEOGRAPHIC FULL STOP + U_LEFT_CORNER_BRACKET = 0x300C, // U+300C LEFT CORNER BRACKET + U_RIGHT_CORNER_BRACKET = 0x300D, // U+300D RIGHT CORNER BRACKET + U_LEFT_BLACK_LENTICULAR_BRACKET = 0x3010, // U+3010 LEFT BLACK LENTICULAR BRACKET + U_RIGHT_BLACK_LENTICULAR_BRACKET = 0x3011, // U+3011 RIGHT BLACK LENTICULAR BRACKET + + + U_OVERLINE = 0x203E, // Unicode Character 'OVERLINE' + + /** + * UTF-8 BOM + * Unicode Character 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF) + * http://www.fileformat.info/info/unicode/char/feff/index.htm + */ + UTF8_BOM = 65279, + + U_FULLWIDTH_SEMICOLON = 0xFF1B, // U+FF1B FULLWIDTH SEMICOLON + U_FULLWIDTH_COMMA = 0xFF0C, // U+FF0C FULLWIDTH COMMA +} + +function roundFloat(number: number, decimalPoints: number): number { + const decimal = Math.pow(10, decimalPoints); + return Math.round(number * decimal) / decimal; +} + +export class RGBA { + _rgbaBrand: void = undefined; + + /** + * Red: integer in [0-255] + */ + readonly r: number; + + /** + * Green: integer in [0-255] + */ + readonly g: number; + + /** + * Blue: integer in [0-255] + */ + readonly b: number; + + /** + * Alpha: float in [0-1] + */ + readonly a: number; + + constructor(r: number, g: number, b: number, a: number = 1) { + this.r = Math.min(255, Math.max(0, r)) | 0; + this.g = Math.min(255, Math.max(0, g)) | 0; + this.b = Math.min(255, Math.max(0, b)) | 0; + this.a = roundFloat(Math.max(Math.min(1, a), 0), 3); + } + + static equals(a: RGBA, b: RGBA): boolean { + return a.r === b.r && a.g === b.g && a.b === b.b && a.a === b.a; + } +} + +export class HSLA { + + _hslaBrand: void = undefined; + + /** + * Hue: integer in [0, 360] + */ + readonly h: number; + + /** + * Saturation: float in [0, 1] + */ + readonly s: number; + + /** + * Luminosity: float in [0, 1] + */ + readonly l: number; + + /** + * Alpha: float in [0, 1] + */ + readonly a: number; + + constructor(h: number, s: number, l: number, a: number) { + this.h = Math.max(Math.min(360, h), 0) | 0; + this.s = roundFloat(Math.max(Math.min(1, s), 0), 3); + this.l = roundFloat(Math.max(Math.min(1, l), 0), 3); + this.a = roundFloat(Math.max(Math.min(1, a), 0), 3); + } + + static equals(a: HSLA, b: HSLA): boolean { + return a.h === b.h && a.s === b.s && a.l === b.l && a.a === b.a; + } + + /** + * Converts an RGB color value to HSL. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes r, g, and b are contained in the set [0, 255] and + * returns h in the set [0, 360], s, and l in the set [0, 1]. + */ + static fromRGBA(rgba: RGBA): HSLA { + const r = rgba.r / 255; + const g = rgba.g / 255; + const b = rgba.b / 255; + const a = rgba.a; + + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + let h = 0; + let s = 0; + const l = (min + max) / 2; + const chroma = max - min; + + if (chroma > 0) { + s = Math.min((l <= 0.5 ? chroma / (2 * l) : chroma / (2 - (2 * l))), 1); + + switch (max) { + case r: h = (g - b) / chroma + (g < b ? 6 : 0); break; + case g: h = (b - r) / chroma + 2; break; + case b: h = (r - g) / chroma + 4; break; + } + + h *= 60; + h = Math.round(h); + } + return new HSLA(h, s, l, a); + } + + private static _hue2rgb(p: number, q: number, t: number): number { + if (t < 0) { + t += 1; + } + if (t > 1) { + t -= 1; + } + if (t < 1 / 6) { + return p + (q - p) * 6 * t; + } + if (t < 1 / 2) { + return q; + } + if (t < 2 / 3) { + return p + (q - p) * (2 / 3 - t) * 6; + } + return p; + } + + /** + * Converts an HSL color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h in the set [0, 360] s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + */ + static toRGBA(hsla: HSLA): RGBA { + const h = hsla.h / 360; + const { s, l, a } = hsla; + let r: number, g: number, b: number; + + if (s === 0) { + r = g = b = l; // achromatic + } else { + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + r = HSLA._hue2rgb(p, q, h + 1 / 3); + g = HSLA._hue2rgb(p, q, h); + b = HSLA._hue2rgb(p, q, h - 1 / 3); + } + + return new RGBA(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), a); + } +} + +export class HSVA { + + _hsvaBrand: void = undefined; + + /** + * Hue: integer in [0, 360] + */ + readonly h: number; + + /** + * Saturation: float in [0, 1] + */ + readonly s: number; + + /** + * Value: float in [0, 1] + */ + readonly v: number; + + /** + * Alpha: float in [0, 1] + */ + readonly a: number; + + constructor(h: number, s: number, v: number, a: number) { + this.h = Math.max(Math.min(360, h), 0) | 0; + this.s = roundFloat(Math.max(Math.min(1, s), 0), 3); + this.v = roundFloat(Math.max(Math.min(1, v), 0), 3); + this.a = roundFloat(Math.max(Math.min(1, a), 0), 3); + } + + static equals(a: HSVA, b: HSVA): boolean { + return a.h === b.h && a.s === b.s && a.v === b.v && a.a === b.a; + } + + // from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm + static fromRGBA(rgba: RGBA): HSVA { + const r = rgba.r / 255; + const g = rgba.g / 255; + const b = rgba.b / 255; + const cmax = Math.max(r, g, b); + const cmin = Math.min(r, g, b); + const delta = cmax - cmin; + const s = cmax === 0 ? 0 : (delta / cmax); + let m: number; + + if (delta === 0) { + m = 0; + } else if (cmax === r) { + m = ((((g - b) / delta) % 6) + 6) % 6; + } else if (cmax === g) { + m = ((b - r) / delta) + 2; + } else { + m = ((r - g) / delta) + 4; + } + + return new HSVA(Math.round(m * 60), s, cmax, rgba.a); + } + + // from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm + static toRGBA(hsva: HSVA): RGBA { + const { h, s, v, a } = hsva; + const c = v * s; + const x = c * (1 - Math.abs((h / 60) % 2 - 1)); + const m = v - c; + let [r, g, b] = [0, 0, 0]; + + if (h < 60) { + r = c; + g = x; + } else if (h < 120) { + r = x; + g = c; + } else if (h < 180) { + g = c; + b = x; + } else if (h < 240) { + g = x; + b = c; + } else if (h < 300) { + r = x; + b = c; + } else if (h <= 360) { + r = c; + b = x; + } + + r = Math.round((r + m) * 255); + g = Math.round((g + m) * 255); + b = Math.round((b + m) * 255); + + return new RGBA(r, g, b, a); + } +} + +export class Color { + + static fromHex(hex: string): Color { + return Color.Format.CSS.parseHex(hex) || Color.red; + } + + readonly rgba: RGBA; + private _hsla?: HSLA; + get hsla(): HSLA { + if (this._hsla) { + return this._hsla; + } else { + return HSLA.fromRGBA(this.rgba); + } + } + + private _hsva?: HSVA; + get hsva(): HSVA { + if (this._hsva) { + return this._hsva; + } + return HSVA.fromRGBA(this.rgba); + } + + constructor(arg: RGBA | HSLA | HSVA) { + if (!arg) { + throw new Error('Color needs a value'); + } else if (arg instanceof RGBA) { + this.rgba = arg; + } else if (arg instanceof HSLA) { + this._hsla = arg; + this.rgba = HSLA.toRGBA(arg); + } else if (arg instanceof HSVA) { + this._hsva = arg; + this.rgba = HSVA.toRGBA(arg); + } else { + throw new Error('Invalid color ctor argument'); + } + } + + equals(other: Color | null): boolean { + return !!other && RGBA.equals(this.rgba, other.rgba) && HSLA.equals(this.hsla, other.hsla) && HSVA.equals(this.hsva, other.hsva); + } + + /** + * http://www.w3.org/TR/WCAG20/#relativeluminancedef + * Returns the number in the set [0, 1]. O => Darkest Black. 1 => Lightest white. + */ + getRelativeLuminance(): number { + const R = Color._relativeLuminanceForComponent(this.rgba.r); + const G = Color._relativeLuminanceForComponent(this.rgba.g); + const B = Color._relativeLuminanceForComponent(this.rgba.b); + const luminance = 0.2126 * R + 0.7152 * G + 0.0722 * B; + + return roundFloat(luminance, 4); + } + + private static _relativeLuminanceForComponent(color: number): number { + const c = color / 255; + return (c <= 0.03928) ? c / 12.92 : Math.pow(((c + 0.055) / 1.055), 2.4); + } + + /** + * http://www.w3.org/TR/WCAG20/#contrast-ratiodef + * Returns the contrast ration number in the set [1, 21]. + */ + getContrastRatio(another: Color): number { + const lum1 = this.getRelativeLuminance(); + const lum2 = another.getRelativeLuminance(); + return lum1 > lum2 ? (lum1 + 0.05) / (lum2 + 0.05) : (lum2 + 0.05) / (lum1 + 0.05); + } + + /** + * http://24ways.org/2010/calculating-color-contrast + * Return 'true' if darker color otherwise 'false' + */ + isDarker(): boolean { + const yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1000; + return yiq < 128; + } + + /** + * http://24ways.org/2010/calculating-color-contrast + * Return 'true' if lighter color otherwise 'false' + */ + isLighter(): boolean { + const yiq = (this.rgba.r * 299 + this.rgba.g * 587 + this.rgba.b * 114) / 1000; + return yiq >= 128; + } + + isLighterThan(another: Color): boolean { + const lum1 = this.getRelativeLuminance(); + const lum2 = another.getRelativeLuminance(); + return lum1 > lum2; + } + + isDarkerThan(another: Color): boolean { + const lum1 = this.getRelativeLuminance(); + const lum2 = another.getRelativeLuminance(); + return lum1 < lum2; + } + + lighten(factor: number): Color { + return new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l + this.hsla.l * factor, this.hsla.a)); + } + + darken(factor: number): Color { + return new Color(new HSLA(this.hsla.h, this.hsla.s, this.hsla.l - this.hsla.l * factor, this.hsla.a)); + } + + transparent(factor: number): Color { + const { r, g, b, a } = this.rgba; + return new Color(new RGBA(r, g, b, a * factor)); + } + + isTransparent(): boolean { + return this.rgba.a === 0; + } + + isOpaque(): boolean { + return this.rgba.a === 1; + } + + opposite(): Color { + return new Color(new RGBA(255 - this.rgba.r, 255 - this.rgba.g, 255 - this.rgba.b, this.rgba.a)); + } + + blend(c: Color): Color { + const rgba = c.rgba; + + // Convert to 0..1 opacity + const thisA = this.rgba.a; + const colorA = rgba.a; + + const a = thisA + colorA * (1 - thisA); + if (a < 1e-6) { + return Color.transparent; + } + + const r = this.rgba.r * thisA / a + rgba.r * colorA * (1 - thisA) / a; + const g = this.rgba.g * thisA / a + rgba.g * colorA * (1 - thisA) / a; + const b = this.rgba.b * thisA / a + rgba.b * colorA * (1 - thisA) / a; + + return new Color(new RGBA(r, g, b, a)); + } + + makeOpaque(opaqueBackground: Color): Color { + if (this.isOpaque() || opaqueBackground.rgba.a !== 1) { + // only allow to blend onto a non-opaque color onto a opaque color + return this; + } + + const { r, g, b, a } = this.rgba; + + // https://stackoverflow.com/questions/12228548/finding-equivalent-color-with-opacity + return new Color(new RGBA( + opaqueBackground.rgba.r - a * (opaqueBackground.rgba.r - r), + opaqueBackground.rgba.g - a * (opaqueBackground.rgba.g - g), + opaqueBackground.rgba.b - a * (opaqueBackground.rgba.b - b), + 1 + )); + } + + flatten(...backgrounds: Color[]): Color { + const background = backgrounds.reduceRight((accumulator, color) => { + return Color._flatten(color, accumulator); + }); + return Color._flatten(this, background); + } + + private static _flatten(foreground: Color, background: Color) { + const backgroundAlpha = 1 - foreground.rgba.a; + return new Color(new RGBA( + backgroundAlpha * background.rgba.r + foreground.rgba.a * foreground.rgba.r, + backgroundAlpha * background.rgba.g + foreground.rgba.a * foreground.rgba.g, + backgroundAlpha * background.rgba.b + foreground.rgba.a * foreground.rgba.b + )); + } + + private _toString?: string; + toString(): string { + if (!this._toString) { + this._toString = Color.Format.CSS.format(this); + } + return this._toString; + } + + static getLighterColor(of: Color, relative: Color, factor?: number): Color { + if (of.isLighterThan(relative)) { + return of; + } + factor = factor ? factor : 0.5; + const lum1 = of.getRelativeLuminance(); + const lum2 = relative.getRelativeLuminance(); + factor = factor * (lum2 - lum1) / lum2; + return of.lighten(factor); + } + + static getDarkerColor(of: Color, relative: Color, factor?: number): Color { + if (of.isDarkerThan(relative)) { + return of; + } + factor = factor ? factor : 0.5; + const lum1 = of.getRelativeLuminance(); + const lum2 = relative.getRelativeLuminance(); + factor = factor * (lum1 - lum2) / lum1; + return of.darken(factor); + } + + static readonly white = new Color(new RGBA(255, 255, 255, 1)); + static readonly black = new Color(new RGBA(0, 0, 0, 1)); + static readonly red = new Color(new RGBA(255, 0, 0, 1)); + static readonly blue = new Color(new RGBA(0, 0, 255, 1)); + static readonly green = new Color(new RGBA(0, 255, 0, 1)); + static readonly cyan = new Color(new RGBA(0, 255, 255, 1)); + static readonly lightgrey = new Color(new RGBA(211, 211, 211, 1)); + static readonly transparent = new Color(new RGBA(0, 0, 0, 0)); +} + +export namespace Color { + export namespace Format { + export namespace CSS { + + export function formatRGB(color: Color): string { + if (color.rgba.a === 1) { + return `rgb(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b})`; + } + + return Color.Format.CSS.formatRGBA(color); + } + + export function formatRGBA(color: Color): string { + return `rgba(${color.rgba.r}, ${color.rgba.g}, ${color.rgba.b}, ${+(color.rgba.a).toFixed(2)})`; + } + + export function formatHSL(color: Color): string { + if (color.hsla.a === 1) { + return `hsl(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%)`; + } + + return Color.Format.CSS.formatHSLA(color); + } + + export function formatHSLA(color: Color): string { + return `hsla(${color.hsla.h}, ${(color.hsla.s * 100).toFixed(2)}%, ${(color.hsla.l * 100).toFixed(2)}%, ${color.hsla.a.toFixed(2)})`; + } + + function _toTwoDigitHex(n: number): string { + const r = n.toString(16); + return r.length !== 2 ? '0' + r : r; + } + + /** + * Formats the color as #RRGGBB + */ + export function formatHex(color: Color): string { + return `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}`; + } + + /** + * Formats the color as #RRGGBBAA + * If 'compact' is set, colors without transparancy will be printed as #RRGGBB + */ + export function formatHexA(color: Color, compact = false): string { + if (compact && color.rgba.a === 1) { + return Color.Format.CSS.formatHex(color); + } + + return `#${_toTwoDigitHex(color.rgba.r)}${_toTwoDigitHex(color.rgba.g)}${_toTwoDigitHex(color.rgba.b)}${_toTwoDigitHex(Math.round(color.rgba.a * 255))}`; + } + + /** + * The default format will use HEX if opaque and RGBA otherwise. + */ + export function format(color: Color): string { + if (color.isOpaque()) { + return Color.Format.CSS.formatHex(color); + } + + return Color.Format.CSS.formatRGBA(color); + } + + /** + * Converts an Hex color value to a Color. + * returns r, g, and b are contained in the set [0, 255] + * @param hex string (#RGB, #RGBA, #RRGGBB or #RRGGBBAA). + */ + export function parseHex(hex: string): Color | null { + const length = hex.length; + + if (length === 0) { + // Invalid color + return null; + } + + if (hex.charCodeAt(0) !== CharCode.Hash) { + // Does not begin with a # + return null; + } + + if (length === 7) { + // #RRGGBB format + const r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2)); + const g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4)); + const b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6)); + return new Color(new RGBA(r, g, b, 1)); + } + + if (length === 9) { + // #RRGGBBAA format + const r = 16 * _parseHexDigit(hex.charCodeAt(1)) + _parseHexDigit(hex.charCodeAt(2)); + const g = 16 * _parseHexDigit(hex.charCodeAt(3)) + _parseHexDigit(hex.charCodeAt(4)); + const b = 16 * _parseHexDigit(hex.charCodeAt(5)) + _parseHexDigit(hex.charCodeAt(6)); + const a = 16 * _parseHexDigit(hex.charCodeAt(7)) + _parseHexDigit(hex.charCodeAt(8)); + return new Color(new RGBA(r, g, b, a / 255)); + } + + if (length === 4) { + // #RGB format + const r = _parseHexDigit(hex.charCodeAt(1)); + const g = _parseHexDigit(hex.charCodeAt(2)); + const b = _parseHexDigit(hex.charCodeAt(3)); + return new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b)); + } + + if (length === 5) { + // #RGBA format + const r = _parseHexDigit(hex.charCodeAt(1)); + const g = _parseHexDigit(hex.charCodeAt(2)); + const b = _parseHexDigit(hex.charCodeAt(3)); + const a = _parseHexDigit(hex.charCodeAt(4)); + return new Color(new RGBA(16 * r + r, 16 * g + g, 16 * b + b, (16 * a + a) / 255)); + } + + // Invalid color + return null; + } + + function _parseHexDigit(charCode: CharCode): number { + switch (charCode) { + case CharCode.Digit0: return 0; + case CharCode.Digit1: return 1; + case CharCode.Digit2: return 2; + case CharCode.Digit3: return 3; + case CharCode.Digit4: return 4; + case CharCode.Digit5: return 5; + case CharCode.Digit6: return 6; + case CharCode.Digit7: return 7; + case CharCode.Digit8: return 8; + case CharCode.Digit9: return 9; + case CharCode.a: return 10; + case CharCode.A: return 10; + case CharCode.b: return 11; + case CharCode.B: return 11; + case CharCode.c: return 12; + case CharCode.C: return 12; + case CharCode.d: return 13; + case CharCode.D: return 13; + case CharCode.e: return 14; + case CharCode.E: return 14; + case CharCode.f: return 15; + case CharCode.F: return 15; + } + return 0; + } + } + } +} diff --git a/extensions/notebook-renderers/src/colorMap.ts b/extensions/notebook-renderers/src/colorMap.ts new file mode 100644 index 00000000000..934ad06acec --- /dev/null +++ b/extensions/notebook-renderers/src/colorMap.ts @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const ansiColorIdentifiers: { colorName: string; colorValue: string }[] = []; +export const ansiColorMap: { [key: string]: { index: number } } = { + 'terminal.ansiBlack': { + index: 0, + }, + 'terminal.ansiRed': { + index: 1, + }, + 'terminal.ansiGreen': { + index: 2, + }, + 'terminal.ansiYellow': { + index: 3, + }, + 'terminal.ansiBlue': { + index: 4, + }, + 'terminal.ansiMagenta': { + index: 5, + }, + 'terminal.ansiCyan': { + index: 6, + }, + 'terminal.ansiWhite': { + index: 7, + }, + 'terminal.ansiBrightBlack': { + index: 8, + }, + 'terminal.ansiBrightRed': { + index: 9, + }, + 'terminal.ansiBrightGreen': { + index: 10, + }, + 'terminal.ansiBrightYellow': { + index: 11, + }, + 'terminal.ansiBrightBlue': { + index: 12, + }, + 'terminal.ansiBrightMagenta': { + index: 13, + }, + 'terminal.ansiBrightCyan': { + index: 14, + }, + 'terminal.ansiBrightWhite': { + index: 15, + } +}; + +for (const id in ansiColorMap) { + const entry = ansiColorMap[id]; + const colorName = id.substring(13); + ansiColorIdentifiers[entry.index] = { colorName, colorValue: 'var(--vscode-' + id.replace('.', '-') + ')' }; +} diff --git a/extensions/notebook-renderers/src/index.ts b/extensions/notebook-renderers/src/index.ts new file mode 100644 index 00000000000..2e2113fa00f --- /dev/null +++ b/extensions/notebook-renderers/src/index.ts @@ -0,0 +1,163 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { ActivationFunction, OutputItem } from 'vscode-notebook-renderer'; +import { handleANSIOutput } from './ansi'; + +interface IDisposable { + dispose(): void; +} + +function renderImage(outputInfo: OutputItem, element: HTMLElement): IDisposable { + const blob = new Blob([outputInfo.data()], { type: outputInfo.mime }); + const src = URL.createObjectURL(blob); + const disposable = { + dispose: () => { + URL.revokeObjectURL(src); + } + }; + + const image = document.createElement('img'); + image.src = src; + const display = document.createElement('div'); + display.classList.add('display'); + display.appendChild(image); + element.appendChild(display); + + return disposable; +} + +const ttPolicy = window.trustedTypes?.createPolicy('notebookRenderer', { + createHTML: value => value, + createScript: value => value, +}); + +const preservedScriptAttributes: (keyof HTMLScriptElement)[] = [ + 'type', 'src', 'nonce', 'noModule', 'async', +]; + +const domEval = (container: Element) => { + const arr = Array.from(container.getElementsByTagName('script')); + for (let n = 0; n < arr.length; n++) { + const node = arr[n]; + const scriptTag = document.createElement('script'); + const trustedScript = ttPolicy?.createScript(node.innerText) ?? node.innerText; + scriptTag.text = trustedScript as string; + for (const key of preservedScriptAttributes) { + const val = node[key] || node.getAttribute && node.getAttribute(key); + if (val) { + scriptTag.setAttribute(key, val as any); + } + } + + // TODO@connor4312: should script with src not be removed? + container.appendChild(scriptTag).parentNode!.removeChild(scriptTag); + } +}; + +function renderHTML(outputInfo: OutputItem, container: HTMLElement): void { + const htmlContent = outputInfo.text(); + const element = document.createElement('div'); + const trustedHtml = ttPolicy?.createHTML(htmlContent) ?? htmlContent; + element.innerHTML = trustedHtml as string; + container.appendChild(element); + domEval(element); +} + +function renderJavascript(outputInfo: OutputItem, container: HTMLElement): void { + const str = outputInfo.text(); + const scriptVal = ``; + const element = document.createElement('div'); + const trustedHtml = ttPolicy?.createHTML(scriptVal) ?? scriptVal; + element.innerHTML = trustedHtml as string; + container.appendChild(element); + domEval(element); +} + +function renderError(outputIfo: OutputItem, container: HTMLElement): void { + const element = document.createElement('div'); + container.appendChild(element); + type ErrorLike = Partial; + + let err: ErrorLike; + try { + err = JSON.parse(outputIfo.text()); + } catch (e) { + console.log(e); + return; + } + + console.log(err); + + if (err.stack) { + const stack = document.createElement('pre'); + stack.classList.add('traceback'); + stack.style.margin = '8px 0'; + stack.appendChild(handleANSIOutput(err.stack)); + container.appendChild(stack); + } else { + const header = document.createElement('div'); + const headerMessage = err.name && err.message ? `${err.name}: ${err.message}` : err.name || err.message; + if (headerMessage) { + header.innerText = headerMessage; + container.appendChild(header); + } + } + + container.classList.add('error'); +} + +export const activate: ActivationFunction = (ctx) => { + const disposables = new Map(); + + return { + renderOutputItem: (outputInfo, element) => { + switch (outputInfo.mime) { + case 'text/html': + case 'image/svg+xml': + { + if (!ctx.workspace.isTrusted) { + return; + } + + renderHTML(outputInfo, element); + } + break; + case 'application/javascript': + { + if (!ctx.workspace.isTrusted) { + return; + } + + renderJavascript(outputInfo, element); + } + break; + case 'image/gif': + case 'image/png': + case 'image/jpeg': + { + const disposable = renderImage(outputInfo, element); + disposables.set(outputInfo.id, disposable); + } + break; + case 'application/vnd.code.notebook.error': + { + renderError(outputInfo, element); + } + default: + break; + } + + + }, + disposeOutputItem: (id: string | undefined) => { + if (id) { + disposables.get(id)?.dispose(); + } else { + disposables.forEach(d => d.dispose()); + } + } + }; +}; diff --git a/extensions/notebook-renderers/src/linkify.ts b/extensions/notebook-renderers/src/linkify.ts new file mode 100644 index 00000000000..2ce09ec1bfd --- /dev/null +++ b/extensions/notebook-renderers/src/linkify.ts @@ -0,0 +1,181 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const CONTROL_CODES = '\\u0000-\\u0020\\u007f-\\u009f'; +const WEB_LINK_REGEX = new RegExp('(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\\/\\/|data:|www\\.)[^\\s' + CONTROL_CODES + '"]{2,}[^\\s' + CONTROL_CODES + '"\')}\\],:;.!?]', 'ug'); + +const WIN_ABSOLUTE_PATH = /(?:[a-zA-Z]:(?:(?:\\|\/)[\w\.-]*)+)/; +const WIN_RELATIVE_PATH = /(?:(?:\~|\.)(?:(?:\\|\/)[\w\.-]*)+)/; +const WIN_PATH = new RegExp(`(${WIN_ABSOLUTE_PATH.source}|${WIN_RELATIVE_PATH.source})`); +const POSIX_PATH = /((?:\~|\.)?(?:\/[\w\.-]*)+)/; +const LINE_COLUMN = /(?:\:([\d]+))?(?:\:([\d]+))?/; +const isWindows = navigator.userAgent.indexOf('Windows') >= 0; +const PATH_LINK_REGEX = new RegExp(`${isWindows ? WIN_PATH.source : POSIX_PATH.source}${LINE_COLUMN.source}`, 'g'); + +const MAX_LENGTH = 2000; + +type LinkKind = 'web' | 'path' | 'text'; +type LinkPart = { + kind: LinkKind; + value: string; + captures: string[]; +}; + +export class LinkDetector { + constructor( + ) { + // noop + } + + /** + * Matches and handles web urls, absolute and relative file links in the string provided. + * Returns element that wraps the processed string, where matched links are replaced by . + * 'onclick' event is attached to all anchored links that opens them in the editor. + * When splitLines is true, each line of the text, even if it contains no links, is wrapped in a + * and added as a child of the returned . + */ + linkify(text: string, splitLines?: boolean, workspaceFolder?: string): HTMLElement { + if (splitLines) { + const lines = text.split('\n'); + for (let i = 0; i < lines.length - 1; i++) { + lines[i] = lines[i] + '\n'; + } + if (!lines[lines.length - 1]) { + // Remove the last element ('') that split added. + lines.pop(); + } + const elements = lines.map(line => this.linkify(line, false, workspaceFolder)); + if (elements.length === 1) { + // Do not wrap single line with extra span. + return elements[0]; + } + const container = document.createElement('span'); + elements.forEach(e => container.appendChild(e)); + return container; + } + + const container = document.createElement('span'); + for (const part of this.detectLinks(text)) { + try { + switch (part.kind) { + case 'text': + container.appendChild(document.createTextNode(part.value)); + break; + case 'web': + container.appendChild(this.createWebLink(part.value)); + break; + case 'path': { + container.appendChild(document.createTextNode(part.value)); + + // const path = part.captures[0]; + // const lineNumber = part.captures[1] ? Number(part.captures[1]) : 0; + // const columnNumber = part.captures[2] ? Number(part.captures[2]) : 0; + // container.appendChild(this.createPathLink(part.value, path, lineNumber, columnNumber, workspaceFolder)); + break; + } + } + } catch (e) { + container.appendChild(document.createTextNode(part.value)); + } + } + return container; + } + + private createWebLink(url: string): Node { + const link = this.createLink(url); + + return link; + } + + // private createPathLink(text: string, path: string, lineNumber: number, columnNumber: number, workspaceFolder: string | undefined): Node { + // if (path[0] === '/' && path[1] === '/') { + // // Most likely a url part which did not match, for example ftp://path. + // return document.createTextNode(text); + // } + + // const options = { selection: { startLineNumber: lineNumber, startColumn: columnNumber } }; + // if (path[0] === '.') { + // if (!workspaceFolder) { + // return document.createTextNode(text); + // } + // const uri = workspaceFolder.toResource(path); + // const link = this.createLink(text); + // this.decorateLink(link, uri, (preserveFocus: boolean) => this.editorService.openEditor({ resource: uri, options: { ...options, preserveFocus } })); + // return link; + // } + + // if (path[0] === '~') { + // const userHome = this.pathService.resolvedUserHome; + // if (userHome) { + // path = osPath.join(userHome.fsPath, path.substring(1)); + // } + // } + + // const link = this.createLink(text); + // link.tabIndex = 0; + // const uri = URI.file(osPath.normalize(path)); + // this.fileService.resolve(uri).then(stat => { + // if (stat.isDirectory) { + // return; + // } + // this.decorateLink(link, uri, (preserveFocus: boolean) => this.editorService.openEditor({ resource: uri, options: { ...options, preserveFocus } })); + // }).catch(() => { + // // If the uri can not be resolved we should not spam the console with error, remain quite #86587 + // }); + // return link; + // } + + private createLink(text: string): HTMLElement { + const link = document.createElement('a'); + link.textContent = text; + return link; + } + + private detectLinks(text: string): LinkPart[] { + if (text.length > MAX_LENGTH) { + return [{ kind: 'text', value: text, captures: [] }]; + } + + const regexes: RegExp[] = [WEB_LINK_REGEX, PATH_LINK_REGEX]; + const kinds: LinkKind[] = ['web', 'path']; + const result: LinkPart[] = []; + + const splitOne = (text: string, regexIndex: number) => { + if (regexIndex >= regexes.length) { + result.push({ value: text, kind: 'text', captures: [] }); + return; + } + const regex = regexes[regexIndex]; + let currentIndex = 0; + let match; + regex.lastIndex = 0; + while ((match = regex.exec(text)) !== null) { + const stringBeforeMatch = text.substring(currentIndex, match.index); + if (stringBeforeMatch) { + splitOne(stringBeforeMatch, regexIndex + 1); + } + const value = match[0]; + result.push({ + value: value, + kind: kinds[regexIndex], + captures: match.slice(1) + }); + currentIndex = match.index + value.length; + } + const stringAfterMatches = text.substring(currentIndex); + if (stringAfterMatches) { + splitOne(stringAfterMatches, regexIndex + 1); + } + }; + + splitOne(text, 0); + return result; + } +} + +const linkDetector = new LinkDetector(); +export function linkify(text: string, splitLines?: boolean, workspaceFolder?: string) { + return linkDetector.linkify(text, splitLines, workspaceFolder); +} diff --git a/extensions/notebook-renderers/tsconfig.json b/extensions/notebook-renderers/tsconfig.json new file mode 100644 index 00000000000..2032bf87b0d --- /dev/null +++ b/extensions/notebook-renderers/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "./out", + "lib": [ + "dom" + ] + }, + "include": [ + "src/**/*", + "../../src/vscode-dts/vscode.d.ts", + "../../src/vscode-dts/vscode.proposed.notebookEditor.d.ts", + "../../src/vscode-dts/vscode.proposed.notebookEditorEdit.d.ts", + ] +} diff --git a/extensions/notebook-renderers/yarn.lock b/extensions/notebook-renderers/yarn.lock new file mode 100644 index 00000000000..06ac4e135c3 --- /dev/null +++ b/extensions/notebook-renderers/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/vscode-notebook-renderer@^1.60.0": + version "1.60.0" + resolved "https://registry.yarnpkg.com/@types/vscode-notebook-renderer/-/vscode-notebook-renderer-1.60.0.tgz#8a67d561f48ddf46a95dfa9f712a79c72c7b8f7a" + integrity sha512-u7TD2uuEZTVuitx0iijOJdKI0JLiQP6PsSBSRy2XmHXUOXcp5p1S56NrjOEDoF+PIHd3NL3eO6KTRSf5nukDqQ== diff --git a/extensions/npm/package.json b/extensions/npm/package.json index b674260dd5b..6df1a4835e7 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/minimatch": "^3.0.3", - "@types/node": "14.x", + "@types/node": "16.x", "@types/which": "^2.0.0" }, "resolutions": { diff --git a/extensions/npm/src/features/bowerJSONContribution.ts b/extensions/npm/src/features/bowerJSONContribution.ts index 11b4d7f74dd..df89c700afe 100644 --- a/extensions/npm/src/features/bowerJSONContribution.ts +++ b/extensions/npm/src/features/bowerJSONContribution.ts @@ -69,7 +69,7 @@ export class BowerJSONContribution implements IJSONContribution { try { const obj = JSON.parse(success.responseText); if (Array.isArray(obj)) { - const results = <{ name: string; description: string; }[]>obj; + const results = <{ name: string; description: string }[]>obj; for (const result of results) { const name = result.name; const description = result.description || ''; diff --git a/extensions/npm/src/features/packageJSONContribution.ts b/extensions/npm/src/features/packageJSONContribution.ts index 23d7b4678b8..ad638d7d4c2 100644 --- a/extensions/npm/src/features/packageJSONContribution.ts +++ b/extensions/npm/src/features/packageJSONContribution.ts @@ -102,7 +102,7 @@ export class PackageJSONContribution implements IJSONContribution { try { const obj = JSON.parse(success.responseText); if (obj && obj.objects && Array.isArray(obj.objects)) { - const results = <{ package: SearchPackageInfo; }[]>obj.objects; + const results = <{ package: SearchPackageInfo }[]>obj.objects; for (const result of results) { this.processPackage(result.package, addValue, isLast, collector); } @@ -162,7 +162,7 @@ export class PackageJSONContribution implements IJSONContribution { try { const obj = JSON.parse(success.responseText); if (obj && Array.isArray(obj.objects)) { - const objects = <{ package: SearchPackageInfo; }[]>obj.objects; + const objects = <{ package: SearchPackageInfo }[]>obj.objects; for (let object of objects) { this.processPackage(object.package, addValue, isLast, collector); } @@ -374,7 +374,7 @@ interface SearchPackageInfo { name: string; description?: string; version?: string; - links?: { homepage?: string; }; + links?: { homepage?: string }; } interface ViewPackageInfo { diff --git a/extensions/npm/src/preferred-pm.ts b/extensions/npm/src/preferred-pm.ts index 346413730ef..58be79acfdb 100644 --- a/extensions/npm/src/preferred-pm.ts +++ b/extensions/npm/src/preferred-pm.ts @@ -56,7 +56,7 @@ async function isNPMPreferred(pkgPath: string): Promise { return { isPreferred: lockfileExists, hasLockfile: lockfileExists }; } -export async function findPreferredPM(pkgPath: string): Promise<{ name: string, multipleLockFilesDetected: boolean }> { +export async function findPreferredPM(pkgPath: string): Promise<{ name: string; multipleLockFilesDetected: boolean }> { const detectedPackageManagerNames: string[] = []; const detectedPackageManagerProperties: PreferredProperties[] = []; diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index baa99bda779..49dd4a7c868 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -34,13 +34,13 @@ let cachedTasks: TaskWithLocation[] | undefined = undefined; const INSTALL_SCRIPT = 'install'; export interface TaskLocation { - document: Uri, - line: Position + document: Uri; + line: Position; } export interface TaskWithLocation { - task: Task, - location?: Location + task: Task; + location?: Location; } export class NpmTaskProvider implements TaskProvider { @@ -416,7 +416,7 @@ export async function startDebugging(context: ExtensionContext, scriptName: stri } -export type StringMap = { [s: string]: string; }; +export type StringMap = { [s: string]: string }; export function findScriptAtPosition(document: TextDocument, buffer: string, position: Position): string | undefined { const read = readScripts(document, buffer); diff --git a/extensions/npm/yarn.lock b/extensions/npm/yarn.lock index 4728dbc860c..bba9ffdbf39 100644 --- a/extensions/npm/yarn.lock +++ b/extensions/npm/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/which@^2.0.0": version "2.0.0" diff --git a/extensions/package.json b/extensions/package.json index 2ccf33541dd..e626c14d237 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -4,7 +4,7 @@ "license": "MIT", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "4.5.4" + "typescript": "^4.6.0-dev.20220208" }, "scripts": { "postinstall": "node ./postinstall" diff --git a/extensions/php-language-features/package.json b/extensions/php-language-features/package.json index 03176a05573..8c0d484535b 100644 --- a/extensions/php-language-features/package.json +++ b/extensions/php-language-features/package.json @@ -78,7 +78,7 @@ "which": "^2.0.2" }, "devDependencies": { - "@types/node": "14.x", + "@types/node": "16.x", "@types/which": "^2.0.0" }, "repository": { diff --git a/extensions/php-language-features/src/features/phpGlobals.ts b/extensions/php-language-features/src/features/phpGlobals.ts index 5af41a0edc7..889acd7a842 100644 --- a/extensions/php-language-features/src/features/phpGlobals.ts +++ b/extensions/php-language-features/src/features/phpGlobals.ts @@ -5,8 +5,8 @@ // file generated from PHP53Schema.xml using php-exclude_generate_php_globals.js -export interface IEntry { description?: string; signature?: string; } -export interface IEntries { [name: string]: IEntry; } +export interface IEntry { description?: string; signature?: string } +export interface IEntries { [name: string]: IEntry } export const globalvariables: IEntries = { $GLOBALS: { diff --git a/extensions/php-language-features/yarn.lock b/extensions/php-language-features/yarn.lock index 09b31c80123..8dec3aadc63 100644 --- a/extensions/php-language-features/yarn.lock +++ b/extensions/php-language-features/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/which@^2.0.0": version "2.0.0" diff --git a/extensions/r/cgmanifest.json b/extensions/r/cgmanifest.json index dbd7971a2e3..e9ce7c7e783 100644 --- a/extensions/r/cgmanifest.json +++ b/extensions/r/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "Ikuyadeu/vscode-R", "repositoryUrl": "https://github.com/Ikuyadeu/vscode-R", - "commitHash": "f99fdd79533b62b0b6eb6142190963349aa621d7" + "commitHash": "d968decca543045fb3488d62a27ff2ecfa3c40c4" } }, "license": "MIT", - "version": "2.3.2" + "version": "2.3.5" } ], "version": 1 diff --git a/extensions/r/syntaxes/r.tmLanguage.json b/extensions/r/syntaxes/r.tmLanguage.json index d008b51cf52..68cc06bb306 100644 --- a/extensions/r/syntaxes/r.tmLanguage.json +++ b/extensions/r/syntaxes/r.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/Ikuyadeu/vscode-R/commit/f99fdd79533b62b0b6eb6142190963349aa621d7", + "version": "https://github.com/Ikuyadeu/vscode-R/commit/d968decca543045fb3488d62a27ff2ecfa3c40c4", "name": "R", "scopeName": "source.r", "patterns": [ @@ -140,6 +140,17 @@ }, "match": "([[:alpha:].][[:alnum:]._]*)\\s*(=)(?=[^=])" }, + { + "captures": { + "1": { + "name": "variable.parameter.r" + }, + "2": { + "name": "keyword.operator.assignment.r" + } + }, + "match": "(`[^`]+`)\\s*(=)(?=[^=])" + }, { "match": "\\b([\\d_][[:alnum:]._]+)\\b", "name": "invalid.illegal.variable.other.r" @@ -151,6 +162,10 @@ { "match": "\\b([[:alnum:]._]+)\\b", "name": "variable.other.r" + }, + { + "match": "(`[^`]+`)", + "name": "variable.other.r" } ] }, @@ -204,6 +219,96 @@ }, "strings": { "patterns": [ + { + "begin": "[rR]\"(-*)\\[", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.raw.begin.r" + } + }, + "end": "\\]\\1\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.raw.end.r" + } + }, + "name": "string.quoted.double.raw.r" + }, + { + "begin": "[rR]'(-*)\\[", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.raw.begin.r" + } + }, + "end": "\\]\\1'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.raw.end.r" + } + }, + "name": "string.quoted.single.raw.r" + }, + { + "begin": "[rR]\"(-*)\\{", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.raw.begin.r" + } + }, + "end": "\\}\\1\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.raw.end.r" + } + }, + "name": "string.quoted.double.raw.r" + }, + { + "begin": "[rR]'(-*)\\{", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.raw.begin.r" + } + }, + "end": "\\}\\1'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.raw.end.r" + } + }, + "name": "string.quoted.single.raw.r" + }, + { + "begin": "[rR]\"(-*)\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.raw.begin.r" + } + }, + "end": "\\)\\1\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.raw.end.r" + } + }, + "name": "string.quoted.double.raw.r" + }, + { + "begin": "[rR]'(-*)\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.raw.begin.r" + } + }, + "end": "\\)\\1'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.raw.end.r" + } + }, + "name": "string.quoted.single.raw.r" + }, { "begin": "\"", "beginCaptures": { @@ -245,27 +350,6 @@ "name": "constant.character.escape.r" } ] - }, - { - "begin": "`", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.r" - } - }, - "end": "`", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.r" - } - }, - "name": "variable.parameter.r", - "patterns": [ - { - "match": "\\\\.", - "name": "variable.parameter.r" - } - ] } ] }, @@ -400,7 +484,7 @@ }, { "match": "(?:[a-zA-Z._][\\w.]*|`[^`]+`)", - "name": "variable.parameter.r" + "name": "variable.other.r" }, { "begin": "(?==)", @@ -451,7 +535,7 @@ }, { "match": "(?:[a-zA-Z._][\\w.]*|`[^`]+`)(?=\\s[^=])", - "name": "variable.parameter.r" + "name": "variable.other.r" }, { "begin": "(?==)", @@ -466,12 +550,6 @@ "match": ",", "name": "punctuation.separator.parameters.r" }, - { - "end": "\\)", - "endCaptures": { - "0": "punctuation.section.parens.end.r" - } - }, { "include": "source.r" } diff --git a/extensions/scss/cgmanifest.json b/extensions/scss/cgmanifest.json index a67a4f54609..12247769ce2 100644 --- a/extensions/scss/cgmanifest.json +++ b/extensions/scss/cgmanifest.json @@ -6,12 +6,12 @@ "git": { "name": "atom/language-sass", "repositoryUrl": "https://github.com/atom/language-sass", - "commitHash": "303bbf0c250fe380b9e57375598cfd916110758b" + "commitHash": "f52ab12f7f9346cc2568129d8c4419bd3d506b47" } }, "license": "MIT", "description": "The file syntaxes/scss.json was derived from the Atom package https://github.com/atom/language-sass which was originally converted from the TextMate bundle https://github.com/alexsancho/SASS.tmbundle.", - "version": "0.61.4" + "version": "0.62.1" } ], "version": 1 diff --git a/extensions/search-result/src/extension.ts b/extensions/search-result/src/extension.ts index fb3a7edb110..3c397453d04 100644 --- a/extensions/search-result/src/extension.ts +++ b/extensions/search-result/src/extension.ts @@ -13,7 +13,7 @@ const SEARCH_RESULT_SELECTOR = { language: 'search-result', exclusive: true }; const DIRECTIVES = ['# Query:', '# Flags:', '# Including:', '# Excluding:', '# ContextLines:']; const FLAGS = ['RegExp', 'CaseSensitive', 'IgnoreExcludeSettings', 'WordMatch']; -let cachedLastParse: { version: number, parse: ParsedSearchResults, uri: vscode.Uri } | undefined; +let cachedLastParse: { version: number; parse: ParsedSearchResults; uri: vscode.Uri } | undefined; let documentChangeListener: vscode.Disposable | undefined; @@ -174,8 +174,8 @@ function relativePathToUri(path: string, resultsUri: vscode.Uri): vscode.Uri | u return undefined; } -type ParsedSearchFileLine = { type: 'file', location: vscode.LocationLink, allLocations: vscode.LocationLink[], path: string }; -type ParsedSearchResultLine = { type: 'result', locations: Required[], isContext: boolean, prefixRange: vscode.Range }; +type ParsedSearchFileLine = { type: 'file'; location: vscode.LocationLink; allLocations: vscode.LocationLink[]; path: string }; +type ParsedSearchResultLine = { type: 'result'; locations: Required[]; isContext: boolean; prefixRange: vscode.Range }; type ParsedSearchResults = Array; const isFileLine = (line: ParsedSearchResultLine | ParsedSearchFileLine): line is ParsedSearchFileLine => line.type === 'file'; const isResultLine = (line: ParsedSearchResultLine | ParsedSearchFileLine): line is ParsedSearchResultLine => line.type === 'result'; @@ -227,14 +227,6 @@ function parseSearchResults(document: vscode.TextDocument, token?: vscode.Cancel let locations: Required[] = []; - // Allow line number, indentation, etc to take you to definition as well. - locations.push({ - targetRange, - targetSelectionRange: new vscode.Range(lineNumber, 0, lineNumber, 1), - targetUri: currentTarget, - originSelectionRange: new vscode.Range(i, 0, i, metadataOffset - 1), - }); - let lastEnd = metadataOffset; let offset = 0; ELISION_REGEX.lastIndex = metadataOffset; @@ -258,8 +250,19 @@ function parseSearchResults(document: vscode.TextDocument, token?: vscode.Cancel originSelectionRange: new vscode.Range(i, lastEnd, i, line.length), }); } + // only show result lines in file-level peek + if (separator.includes(':')) { + currentTargetLocations?.push(...locations); + } - currentTargetLocations?.push(...locations); + // Allow line number, indentation, etc to take you to definition as well. + let convenienceLocation: Required = { + targetRange, + targetSelectionRange: new vscode.Range(lineNumber, 0, lineNumber, 1), + targetUri: currentTarget, + originSelectionRange: new vscode.Range(i, 0, i, metadataOffset - 1), + }; + locations.push(convenienceLocation); links[i] = { type: 'result', locations, isContext: separator === ' ', prefixRange: new vscode.Range(i, 0, i, metadataOffset) }; } } diff --git a/extensions/search-result/syntaxes/generateTMLanguage.js b/extensions/search-result/syntaxes/generateTMLanguage.js index f42955f9fb1..ac97b6900f7 100644 --- a/extensions/search-result/syntaxes/generateTMLanguage.js +++ b/extensions/search-result/syntaxes/generateTMLanguage.js @@ -1,3 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + // @ts-check const mappings = [ diff --git a/extensions/simple-browser/package.json b/extensions/simple-browser/package.json index 38752cc7520..6ce11704fa4 100644 --- a/extensions/simple-browser/package.json +++ b/extensions/simple-browser/package.json @@ -68,7 +68,7 @@ "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" }, "dependencies": { - "vscode-extension-telemetry": "0.4.4", + "@vscode/extension-telemetry": "0.4.6", "vscode-nls": "^5.0.0" }, "devDependencies": { diff --git a/extensions/simple-browser/src/dispose.ts b/extensions/simple-browser/src/dispose.ts index 03c494c7cea..175acf7b367 100644 --- a/extensions/simple-browser/src/dispose.ts +++ b/extensions/simple-browser/src/dispose.ts @@ -8,9 +8,7 @@ import * as vscode from 'vscode'; export function disposeAll(disposables: vscode.Disposable[]) { while (disposables.length) { const item = disposables.pop(); - if (item) { - item.dispose(); - } + item?.dispose(); } } diff --git a/extensions/simple-browser/src/extension.ts b/extensions/simple-browser/src/extension.ts index 5df81217a61..ff3649c7baf 100644 --- a/extensions/simple-browser/src/extension.ts +++ b/extensions/simple-browser/src/extension.ts @@ -59,8 +59,8 @@ export function activate(context: vscode.ExtensionContext) { })); context.subscriptions.push(vscode.commands.registerCommand(openApiCommand, (url: vscode.Uri, showOptions?: { - preserveFocus?: boolean, - viewColumn: vscode.ViewColumn, + preserveFocus?: boolean; + viewColumn: vscode.ViewColumn; }) => { manager.show(url.toString(), showOptions); })); diff --git a/extensions/simple-browser/yarn.lock b/extensions/simple-browser/yarn.lock index 84810cc6597..54a54b18ae4 100644 --- a/extensions/simple-browser/yarn.lock +++ b/extensions/simple-browser/yarn.lock @@ -7,16 +7,16 @@ resolved "https://registry.yarnpkg.com/@types/vscode-webview/-/vscode-webview-1.57.0.tgz#bad5194d45ae8d03afc1c0f67f71ff5e7a243bbf" integrity sha512-x3Cb/SMa1IwRHfSvKaZDZOTh4cNoG505c3NjTqGlMC082m++x/ETUmtYniDsw6SSmYzZXO8KBNhYxR0+VqymqA== +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== + 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-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== - vscode-nls@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" diff --git a/extensions/sql/language-configuration.json b/extensions/sql/language-configuration.json index cf96472ffd8..6878d8ca72f 100644 --- a/extensions/sql/language-configuration.json +++ b/extensions/sql/language-configuration.json @@ -23,7 +23,13 @@ ["\"", "\""], ["'", "'"], ["`", "`"] - ] + ], + "folding": { + "markers": { + "start": "^\\s*--\\s*#region\\b", + "end": "^\\s*--\\s*#endregion\\b" + } + }, // enhancedBrackets:[ // { openTrigger: 'n', open: /begin$/i, closeComplete: 'end', matchCase: true }, @@ -31,4 +37,4 @@ // { openTrigger: 'n', open: /when$/i, closeComplete: 'then', matchCase: true } // ], // noindentBrackets: '()', -} \ No newline at end of file +} diff --git a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json index 92bea194626..27b9277f724 100644 --- a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json +++ b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json @@ -347,7 +347,7 @@ }, { "name": "HTML String", - "scope": "string.quoted.double.html, punctuation.definition.string.begin.html, punctuation.definition.string.end.html", + "scope": "string.quoted.double.html, punctuation.definition.string.begin.html, punctuation.definition.string.end.html, punctuation.definition.string.end.html source, string.quoted.double.html source", "settings": { "fontStyle": "", "foreground": "#9AA83A" diff --git a/extensions/typescript-basics/cgmanifest.json b/extensions/typescript-basics/cgmanifest.json index fedaa286599..7e854bdb7b5 100644 --- a/extensions/typescript-basics/cgmanifest.json +++ b/extensions/typescript-basics/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "TypeScript-TmLanguage", "repositoryUrl": "https://github.com/microsoft/TypeScript-TmLanguage", - "commitHash": "644389aef914fc6fbc97a4dd799cc2d1431ffc87" + "commitHash": "56b7270f094b036256774702e3b7f96490981190" } }, "license": "MIT", diff --git a/extensions/typescript-basics/language-configuration.json b/extensions/typescript-basics/language-configuration.json index d43cc356cb4..37eece9a00a 100644 --- a/extensions/typescript-basics/language-configuration.json +++ b/extensions/typescript-basics/language-configuration.json @@ -1,31 +1,103 @@ { + // Note that this file should stay in sync with 'javascript-language-basics/javascript-language-configuration.json' "comments": { "lineComment": "//", - "blockComment": [ "/*", "*/" ] + "blockComment": [ + "/*", + "*/" + ] }, "brackets": [ - ["${", "}"], - ["{", "}"], - ["[", "]"], - ["(", ")"] + [ + "${", + "}" + ], + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ] ], "autoClosingPairs": [ - { "open": "{", "close": "}" }, - { "open": "[", "close": "]" }, - { "open": "(", "close": ")" }, - { "open": "'", "close": "'", "notIn": ["string", "comment"] }, - { "open": "\"", "close": "\"", "notIn": ["string"] }, - { "open": "`", "close": "`", "notIn": ["string", "comment"] }, - { "open": "/**", "close": " */", "notIn": ["string"] } + { + "open": "{", + "close": "}" + }, + { + "open": "[", + "close": "]" + }, + { + "open": "(", + "close": ")" + }, + { + "open": "'", + "close": "'", + "notIn": [ + "string", + "comment" + ] + }, + { + "open": "\"", + "close": "\"", + "notIn": [ + "string" + ] + }, + { + "open": "`", + "close": "`", + "notIn": [ + "string", + "comment" + ] + }, + { + "open": "/**", + "close": " */", + "notIn": [ + "string" + ] + } ], "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["'", "'"], - ["\"", "\""], - ["`", "`"], - ["<", ">"] + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ], + [ + "'", + "'" + ], + [ + "\"", + "\"" + ], + [ + "`", + "`" + ], + [ + "<", + ">" + ] ], "autoCloseBefore": ";:.,=}])>` \n\t", "folding": { @@ -33,5 +105,89 @@ "start": "^\\s*//\\s*#?region\\b", "end": "^\\s*//\\s*#?endregion\\b" } - } + }, + "wordPattern": { + "pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>/\\?\\s]+)", + }, + "indentationRules": { + "decreaseIndentPattern": { + "pattern": "^((?!.*?/\\*).*\\*\/)?\\s*[\\}\\]].*$" + }, + "increaseIndentPattern": { + "pattern": "^((?!//).)*(\\{([^}\"'`/]*|(\\t|[ ])*//.*)|\\([^)\"'`/]*|\\[[^\\]\"'`/]*)$" + }, + // e.g. * ...| or */| or *-----*/| + "unIndentedLinePattern": { + "pattern": "^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$|^(\\t|[ ])*[ ]\\*/\\s*$|^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$" + } + }, + "onEnterRules": [ + { + // e.g. /** | */ + "beforeText": { + "pattern": "^\\s*/\\*\\*(?!/)([^\\*]|\\*(?!/))*$" + }, + "afterText": { + "pattern": "^\\s*\\*/$" + }, + "action": { + "indent": "indentOutdent", + "appendText": " * " + } + }, + { + // e.g. /** ...| + "beforeText": { + "pattern": "^\\s*/\\*\\*(?!/)([^\\*]|\\*(?!/))*$" + }, + "action": { + "indent": "none", + "appendText": " * " + } + }, + { + // e.g. * ...| + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$" + }, + "previousLineText": { + "pattern": "(?=^(\\s*(/\\*\\*|\\*)).*)(?=(?!(\\s*\\*/)))" + }, + "action": { + "indent": "none", + "appendText": "* " + } + }, + { + // e.g. */| + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*/\\s*$" + }, + "action": { + "indent": "none", + "removeText": 1 + }, + }, + { + // e.g. *-----*/| + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$" + }, + "action": { + "indent": "none", + "removeText": 1 + }, + }, + { + "beforeText": { + "pattern": "^\\s*(\\bcase\\s.+:|\\bdefault:)$" + }, + "afterText": { + "pattern": "^(?!\\s*(\\bcase\\b|\\bdefault\\b))" + }, + "action": { + "indent": "indent" + } + } + ] } diff --git a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json index 6237552fb08..5ff736e03dc 100644 --- a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScript.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/TypeScript-TmLanguage/commit/644389aef914fc6fbc97a4dd799cc2d1431ffc87", + "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/56b7270f094b036256774702e3b7f96490981190", "name": "TypeScript", "scopeName": "source.ts", "patterns": [ @@ -5342,6 +5342,27 @@ } } }, + { + "begin": "(?x)((@)template)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + } + ] + }, { "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", "captures": { diff --git a/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json index 86fae5fa912..beecaf45809 100644 --- a/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScriptReact.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/TypeScript-TmLanguage/commit/644389aef914fc6fbc97a4dd799cc2d1431ffc87", + "version": "https://github.com/microsoft/TypeScript-TmLanguage/commit/56b7270f094b036256774702e3b7f96490981190", "name": "TypeScriptReact", "scopeName": "source.tsx", "patterns": [ @@ -5293,6 +5293,27 @@ } } }, + { + "begin": "(?x)((@)template)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + } + ] + }, { "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", "captures": { diff --git a/extensions/typescript-language-features/extension.webpack.config.js b/extensions/typescript-language-features/extension.webpack.config.js index b8f77666761..de88398eca0 100644 --- a/extensions/typescript-language-features/extension.webpack.config.js +++ b/extensions/typescript-language-features/extension.webpack.config.js @@ -14,9 +14,6 @@ module.exports = withDefaults({ resolve: { mainFields: ['module', 'main'] }, - externals: { - 'typescript-vscode-sh-plugin': 'commonjs vscode' // used by build/lib/extensions to know what node_modules to bundle - }, entry: { extension: './src/extension.ts', } diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 4b8b384df29..73c434dec17 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -9,8 +9,7 @@ "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "enabledApiProposals": [ "inlayHints", - "languageStatus", - "quickPickSeparators", + "markdownStringBaseUri", "resolvers", "workspaceTrust" ], @@ -37,13 +36,14 @@ "Programming Languages" ], "dependencies": { + "@vscode/extension-telemetry": "0.4.6", "jsonc-parser": "^2.2.1", "semver": "5.5.1", - "vscode-extension-telemetry": "0.4.4", - "vscode-nls": "^5.0.0" + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.3" }, "devDependencies": { - "@types/node": "14.x", + "@types/node": "16.x", "@types/semver": "^5.5.0" }, "scripts": { @@ -728,25 +728,25 @@ "type": "boolean", "default": true, "description": "%configuration.suggest.completeJSDocs%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.suggest.completeJSDocs": { "type": "boolean", "default": true, "description": "%configuration.suggest.completeJSDocs%", - "scope": "resource" + "scope": "language-overridable" }, "javascript.suggest.jsdoc.generateReturns": { "type": "boolean", "default": true, "markdownDescription": "%configuration.suggest.jsdoc.generateReturns%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.suggest.jsdoc.generateReturns": { "type": "boolean", "default": true, "markdownDescription": "%configuration.suggest.jsdoc.generateReturns%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.locale": { "type": "string", @@ -786,7 +786,7 @@ ], "default": "auto", "markdownDescription": "%typescript.preferences.quoteStyle%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.preferences.quoteStyle": { "type": "string", @@ -797,7 +797,7 @@ ], "default": "auto", "markdownDescription": "%typescript.preferences.quoteStyle%", - "scope": "resource" + "scope": "language-overridable" }, "javascript.preferences.importModuleSpecifier": { "type": "string", @@ -815,7 +815,7 @@ ], "default": "shortest", "description": "%typescript.preferences.importModuleSpecifier%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.preferences.importModuleSpecifier": { "type": "string", @@ -833,7 +833,7 @@ ], "default": "shortest", "description": "%typescript.preferences.importModuleSpecifier%", - "scope": "resource" + "scope": "language-overridable" }, "javascript.preferences.importModuleSpecifierEnding": { "type": "string", @@ -851,7 +851,7 @@ ], "default": "auto", "description": "%typescript.preferences.importModuleSpecifierEnding%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.preferences.importModuleSpecifierEnding": { "type": "string", @@ -869,7 +869,7 @@ ], "default": "auto", "description": "%typescript.preferences.importModuleSpecifierEnding%", - "scope": "resource" + "scope": "language-overridable" }, "javascript.preferences.jsxAttributeCompletionStyle": { "type": "string", @@ -885,7 +885,7 @@ ], "default": "auto", "description": "%typescript.preferences.jsxAttributeCompletionStyle%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.preferences.jsxAttributeCompletionStyle": { "type": "string", @@ -901,7 +901,7 @@ ], "default": "auto", "description": "%typescript.preferences.jsxAttributeCompletionStyle%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.preferences.includePackageJsonAutoImports": { "type": "string", @@ -924,26 +924,26 @@ "default": true, "description": "%typescript.preferences.useAliasesForRenames%", "deprecationMessage": "%typescript.preferences.renameShorthandProperties.deprecationMessage%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.preferences.renameShorthandProperties": { "type": "boolean", "default": true, "description": "%typescript.preferences.useAliasesForRenames%", "deprecationMessage": "%typescript.preferences.renameShorthandProperties.deprecationMessage%", - "scope": "resource" + "scope": "language-overridable" }, "javascript.preferences.useAliasesForRenames": { "type": "boolean", "default": true, "description": "%typescript.preferences.useAliasesForRenames%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.preferences.useAliasesForRenames": { "type": "boolean", "default": true, "description": "%typescript.preferences.useAliasesForRenames%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.updateImportsOnFileMove.enabled": { "type": "string", @@ -980,24 +980,26 @@ "typescript.autoClosingTags": { "type": "boolean", "default": true, - "description": "%typescript.autoClosingTags%" + "description": "%typescript.autoClosingTags%", + "scope": "language-overridable" }, "javascript.autoClosingTags": { "type": "boolean", "default": true, - "description": "%typescript.autoClosingTags%" + "description": "%typescript.autoClosingTags%", + "scope": "language-overridable" }, "javascript.suggest.enabled": { "type": "boolean", "default": true, "description": "%typescript.suggest.enabled%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.suggest.enabled": { "type": "boolean", "default": true, "description": "%typescript.suggest.enabled%", - "scope": "resource" + "scope": "language-overridable" }, "typescript.surveys.enabled": { "type": "boolean", diff --git a/extensions/typescript-language-features/src/commands/learnMoreAboutRefactorings.ts b/extensions/typescript-language-features/src/commands/learnMoreAboutRefactorings.ts index b166397e38b..c1c21f363ee 100644 --- a/extensions/typescript-language-features/src/commands/learnMoreAboutRefactorings.ts +++ b/extensions/typescript-language-features/src/commands/learnMoreAboutRefactorings.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { isTypeScriptDocument } from '../utils/languageModeIds'; +import { isTypeScriptDocument } from '../utils/languageIds'; import { Command } from './commandManager'; export class LearnMoreAboutRefactoringsCommand implements Command { diff --git a/extensions/typescript-language-features/src/extension.browser.ts b/extensions/typescript-language-features/src/extension.browser.ts index 3880a894792..6bb57c02dc9 100644 --- a/extensions/typescript-language-features/src/extension.browser.ts +++ b/extensions/typescript-language-features/src/extension.browser.ts @@ -7,7 +7,6 @@ import * as vscode from 'vscode'; import { Api, getExtensionApi } from './api'; import { CommandManager } from './commands/commandManager'; import { registerBaseCommands } from './commands/index'; -import { LanguageConfigurationManager } from './languageFeatures/languageConfiguration'; import { createLazyClientHost, lazilyActivateClient } from './lazyClientHost'; import { noopRequestCancellerFactory } from './tsServer/cancellation'; import { noopLogDirectoryProvider } from './tsServer/logDirectoryProvider'; @@ -46,8 +45,6 @@ export function activate( const commandManager = new CommandManager(); context.subscriptions.push(commandManager); - context.subscriptions.push(new LanguageConfigurationManager()); - const onCompletionAccepted = new vscode.EventEmitter(); context.subscriptions.push(onCompletionAccepted); diff --git a/extensions/typescript-language-features/src/extension.ts b/extensions/typescript-language-features/src/extension.ts index 24406ed1977..e6ae13e5daa 100644 --- a/extensions/typescript-language-features/src/extension.ts +++ b/extensions/typescript-language-features/src/extension.ts @@ -8,7 +8,6 @@ import * as vscode from 'vscode'; import { Api, getExtensionApi } from './api'; import { CommandManager } from './commands/commandManager'; import { registerBaseCommands } from './commands/index'; -import { LanguageConfigurationManager } from './languageFeatures/languageConfiguration'; import { createLazyClientHost, lazilyActivateClient } from './lazyClientHost'; import { nodeRequestCancellerFactory } from './tsServer/cancellation.electron'; import { NodeLogDirectoryProvider } from './tsServer/logDirectoryProvider.electron'; @@ -35,8 +34,6 @@ export function activate( const logDirectoryProvider = new NodeLogDirectoryProvider(context); const versionProvider = new DiskTypeScriptVersionProvider(); - context.subscriptions.push(new LanguageConfigurationManager()); - const activeJsTsEditorTracker = new ActiveJsTsEditorTracker(); context.subscriptions.push(activeJsTsEditorTracker); @@ -69,5 +66,5 @@ export function activate( } export function deactivate() { - fs.rmdirSync(temp.getInstanceTempDir(), { recursive: true }); + fs.rmSync(temp.getInstanceTempDir(), { recursive: true, force: true }); } diff --git a/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts b/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts index 20140d39711..3e510c793af 100644 --- a/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts +++ b/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts @@ -9,8 +9,9 @@ import type * as Proto from '../../protocol'; import * as PConst from '../../protocol.const'; import { CachedResponse } from '../../tsServer/cachedResponse'; import { ClientCapability, ITypeScriptServiceClient } from '../../typescriptService'; -import { conditionalRegistration, requireConfiguration, requireSomeCapability } from '../../utils/dependentRegistration'; +import { conditionalRegistration, requireGlobalConfiguration, requireSomeCapability } from '../../utils/dependentRegistration'; import { DocumentSelector } from '../../utils/documentSelector'; +import { LanguageDescription } from '../../utils/languageDescription'; import * as typeConverters from '../../utils/typeConverters'; import { getSymbolRange, ReferencesCodeLens, TypeScriptBaseCodeLensProvider } from './baseCodeLensProvider'; @@ -89,12 +90,12 @@ export default class TypeScriptImplementationsCodeLensProvider extends TypeScrip export function register( selector: DocumentSelector, - modeId: string, + language: LanguageDescription, client: ITypeScriptServiceClient, cachedResponse: CachedResponse, ) { return conditionalRegistration([ - requireConfiguration(modeId, 'implementationsCodeLens.enabled'), + requireGlobalConfiguration(language.id, 'implementationsCodeLens.enabled'), requireSomeCapability(client, ClientCapability.Semantic), ], () => { return vscode.languages.registerCodeLensProvider(selector.semantic, diff --git a/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts b/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts index 54913aecb8a..e3280c2387f 100644 --- a/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts +++ b/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts @@ -10,8 +10,9 @@ import * as PConst from '../../protocol.const'; import { CachedResponse } from '../../tsServer/cachedResponse'; import { ExecutionTarget } from '../../tsServer/server'; import { ClientCapability, ITypeScriptServiceClient } from '../../typescriptService'; -import { conditionalRegistration, requireConfiguration, requireSomeCapability } from '../../utils/dependentRegistration'; +import { conditionalRegistration, requireGlobalConfiguration, requireSomeCapability } from '../../utils/dependentRegistration'; import { DocumentSelector } from '../../utils/documentSelector'; +import { LanguageDescription } from '../../utils/languageDescription'; import * as typeConverters from '../../utils/typeConverters'; import { getSymbolRange, ReferencesCodeLens, TypeScriptBaseCodeLensProvider } from './baseCodeLensProvider'; @@ -21,7 +22,7 @@ export class TypeScriptReferencesCodeLensProvider extends TypeScriptBaseCodeLens public constructor( client: ITypeScriptServiceClient, protected _cachedResponse: CachedResponse, - private modeId: string + private readonly language: LanguageDescription ) { super(client, _cachedResponse); } @@ -70,7 +71,7 @@ export class TypeScriptReferencesCodeLensProvider extends TypeScriptBaseCodeLens switch (item.kind) { case PConst.Kind.function: { - const showOnAllFunctions = vscode.workspace.getConfiguration(this.modeId).get('referencesCodeLens.showOnAllFunctions'); + const showOnAllFunctions = vscode.workspace.getConfiguration(this.language.id).get('referencesCodeLens.showOnAllFunctions'); if (showOnAllFunctions) { return getSymbolRange(document, item); } @@ -126,15 +127,15 @@ export class TypeScriptReferencesCodeLensProvider extends TypeScriptBaseCodeLens export function register( selector: DocumentSelector, - modeId: string, + language: LanguageDescription, client: ITypeScriptServiceClient, cachedResponse: CachedResponse, ) { return conditionalRegistration([ - requireConfiguration(modeId, 'referencesCodeLens.enabled'), + requireGlobalConfiguration(language.id, 'referencesCodeLens.enabled'), requireSomeCapability(client, ClientCapability.Semantic), ], () => { return vscode.languages.registerCodeLensProvider(selector.semantic, - new TypeScriptReferencesCodeLensProvider(client, cachedResponse, modeId)); + new TypeScriptReferencesCodeLensProvider(client, cachedResponse, language)); }); } diff --git a/extensions/typescript-language-features/src/languageFeatures/completions.ts b/extensions/typescript-language-features/src/languageFeatures/completions.ts index 64eae964725..8cd15f148ea 100644 --- a/extensions/typescript-language-features/src/languageFeatures/completions.ts +++ b/extensions/typescript-language-features/src/languageFeatures/completions.ts @@ -12,8 +12,9 @@ import { ClientCapability, ITypeScriptServiceClient, ServerResponse } from '../t import API from '../utils/api'; import { nulToken } from '../utils/cancellation'; import { applyCodeAction } from '../utils/codeAction'; -import { conditionalRegistration, requireConfiguration, requireSomeCapability } from '../utils/dependentRegistration'; +import { conditionalRegistration, requireSomeCapability } from '../utils/dependentRegistration'; import { DocumentSelector } from '../utils/documentSelector'; +import { LanguageDescription } from '../utils/languageDescription'; import { parseKindModifier } from '../utils/modifiers'; import * as Previewer from '../utils/previewer'; import { snippetForFunctionCall } from '../utils/snippetForFunctionCall'; @@ -37,12 +38,12 @@ interface CompletionContext { readonly dotAccessorContext?: DotAccessorContext; readonly enableCallCompletions: boolean; - readonly useCodeSnippetsOnMethodSuggest: boolean, + readonly useCodeSnippetsOnMethodSuggest: boolean; readonly wordRange: vscode.Range | undefined; readonly line: string; - readonly useFuzzyWordRangeLogic: boolean, + readonly useFuzzyWordRangeLogic: boolean; } type ResolvedCompletionItem = { @@ -205,10 +206,8 @@ class MyCompletionItem extends vscode.CompletionItem { const detail = response.body[0]; - if (!this.detail && detail.displayParts.length) { - this.detail = Previewer.plainWithLinks(detail.displayParts, client); - } - this.documentation = this.getDocumentation(client, detail, this); + this.detail = this.getDetails(client, detail); + this.documentation = this.getDocumentation(client, detail, this.document.uri); const codeAction = this.getCodeActions(detail, filepath); const commands: vscode.Command[] = [{ @@ -248,19 +247,28 @@ class MyCompletionItem extends vscode.CompletionItem { return this._resolvedPromise.promise; } + private getDetails( + client: ITypeScriptServiceClient, + detail: Proto.CompletionEntryDetails, + ): string | undefined { + const parts: string[] = []; + + for (const action of detail.codeActions ?? []) { + parts.push(action.description); + } + + parts.push(Previewer.plainWithLinks(detail.displayParts, client)); + return parts.join('\n\n'); + } + private getDocumentation( client: ITypeScriptServiceClient, detail: Proto.CompletionEntryDetails, - item: MyCompletionItem + baseUri: vscode.Uri, ): vscode.MarkdownString | undefined { const documentation = new vscode.MarkdownString(); - if (detail.source) { - const importPath = `'${Previewer.plainWithLinks(detail.source, client)}'`; - const autoImportLabel = localize('autoImportLabel', 'Auto import from {0}', importPath); - item.detail = `${autoImportLabel}\n${item.detail}`; - } Previewer.addMarkdownDocumentation(documentation, detail.documentation, detail.tags, client); - + documentation.baseUri = baseUri; return documentation.value.length ? documentation : undefined; } @@ -298,7 +306,7 @@ class MyCompletionItem extends vscode.CompletionItem { private getCodeActions( detail: Proto.CompletionEntryDetails, filepath: string - ): { command?: vscode.Command, additionalTextEdits?: vscode.TextEdit[] } { + ): { command?: vscode.Command; additionalTextEdits?: vscode.TextEdit[] } { if (!detail.codeActions || !detail.codeActions.length) { return {}; } @@ -643,7 +651,7 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider< constructor( private readonly client: ITypeScriptServiceClient, - private readonly modeId: string, + private readonly language: LanguageDescription, private readonly typingsStatus: TypingsStatus, private readonly fileConfigurationManager: FileConfigurationManager, commandManager: CommandManager, @@ -661,6 +669,10 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider< token: vscode.CancellationToken, context: vscode.CompletionContext ): Promise | undefined> { + if (!vscode.workspace.getConfiguration(this.language.id, document).get('suggest.enabled')) { + return undefined; + } + if (this.typingsStatus.isAcquiringTypings) { return Promise.reject>({ label: localize( @@ -678,7 +690,7 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider< } const line = document.lineAt(position.line); - const completionConfiguration = CompletionConfiguration.getConfigurationForResource(this.modeId, document.uri); + const completionConfiguration = CompletionConfiguration.getConfigurationForResource(this.language.id, document.uri); if (!this.shouldTrigger(context, line, position, completionConfiguration)) { return undefined; @@ -919,7 +931,7 @@ function shouldExcludeCompletionEntry( export function register( selector: DocumentSelector, - modeId: string, + language: LanguageDescription, client: ITypeScriptServiceClient, typingsStatus: TypingsStatus, fileConfigurationManager: FileConfigurationManager, @@ -928,11 +940,10 @@ export function register( onCompletionAccepted: (item: vscode.CompletionItem) => void ) { return conditionalRegistration([ - requireConfiguration(modeId, 'suggest.enabled'), requireSomeCapability(client, ClientCapability.EnhancedSyntax, ClientCapability.Semantic), ], () => { return vscode.languages.registerCompletionItemProvider(selector.syntax, - new TypeScriptCompletionItemProvider(client, modeId, typingsStatus, fileConfigurationManager, commandManager, telemetryReporter, onCompletionAccepted), + new TypeScriptCompletionItemProvider(client, language, typingsStatus, fileConfigurationManager, commandManager, telemetryReporter, onCompletionAccepted), ...TypeScriptCompletionItemProvider.triggerCharacters); }); } diff --git a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts index c79e44c63eb..174a69346c1 100644 --- a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts +++ b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts @@ -9,7 +9,7 @@ import { ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; import { Disposable } from '../utils/dispose'; import * as fileSchemes from '../utils/fileSchemes'; -import { isTypeScriptDocument } from '../utils/languageModeIds'; +import { isTypeScriptDocument } from '../utils/languageIds'; import { equals } from '../utils/objects'; import { ResourceMap } from '../utils/resourceMap'; @@ -167,11 +167,11 @@ export default class FileConfigurationManager extends Disposable { const config = vscode.workspace.getConfiguration( isTypeScriptDocument(document) ? 'typescript' : 'javascript', - document.uri); + document); const preferencesConfig = vscode.workspace.getConfiguration( isTypeScriptDocument(document) ? 'typescript.preferences' : 'javascript.preferences', - document.uri); + document); const preferences: Proto.UserPreferences = { quotePreference: this.getQuoteStylePreference(preferencesConfig), diff --git a/extensions/typescript-language-features/src/languageFeatures/fileReferences.ts b/extensions/typescript-language-features/src/languageFeatures/fileReferences.ts index 010f4038c7a..68685848035 100644 --- a/extensions/typescript-language-features/src/languageFeatures/fileReferences.ts +++ b/extensions/typescript-language-features/src/languageFeatures/fileReferences.ts @@ -8,7 +8,7 @@ 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/languageModeIds'; +import { isSupportedLanguageMode } from '../utils/languageIds'; import * as typeConverters from '../utils/typeConverters'; const localize = nls.loadMessageBundle(); diff --git a/extensions/typescript-language-features/src/languageFeatures/formatting.ts b/extensions/typescript-language-features/src/languageFeatures/formatting.ts index cf19d59ab92..fa9b9723c43 100644 --- a/extensions/typescript-language-features/src/languageFeatures/formatting.ts +++ b/extensions/typescript-language-features/src/languageFeatures/formatting.ts @@ -6,8 +6,9 @@ import * as vscode from 'vscode'; import type * as Proto from '../protocol'; import { ITypeScriptServiceClient } from '../typescriptService'; -import { conditionalRegistration, requireConfiguration } from '../utils/dependentRegistration'; +import { conditionalRegistration, requireGlobalConfiguration } from '../utils/dependentRegistration'; import { DocumentSelector } from '../utils/documentSelector'; +import { LanguageDescription } from '../utils/languageDescription'; import * as typeConverters from '../utils/typeConverters'; import FileConfigurationManager from './fileConfigurationManager'; @@ -86,12 +87,12 @@ class TypeScriptFormattingProvider implements vscode.DocumentRangeFormattingEdit export function register( selector: DocumentSelector, - modeId: string, + language: LanguageDescription, client: ITypeScriptServiceClient, fileConfigurationManager: FileConfigurationManager ) { return conditionalRegistration([ - requireConfiguration(modeId, 'format.enable'), + requireGlobalConfiguration(language.id, 'format.enable'), ], () => { const formattingProvider = new TypeScriptFormattingProvider(client, fileConfigurationManager); return vscode.Disposable.from( diff --git a/extensions/typescript-language-features/src/languageFeatures/hover.ts b/extensions/typescript-language-features/src/languageFeatures/hover.ts index 62113e8ce31..a717e088a3f 100644 --- a/extensions/typescript-language-features/src/languageFeatures/hover.ts +++ b/extensions/typescript-language-features/src/languageFeatures/hover.ts @@ -68,7 +68,8 @@ class TypeScriptHoverProvider implements vscode.HoverProvider { displayParts.push(data.displayString); parts.push(new vscode.MarkdownString().appendCodeblock(displayParts.join(' '), 'typescript')); } - parts.push(markdownDocumentation(data.documentation, data.tags, this.client)); + const md = markdownDocumentation(data.documentation, data.tags, this.client, resource); + parts.push(md); return parts; } } diff --git a/extensions/typescript-language-features/src/languageFeatures/inlayHints.ts b/extensions/typescript-language-features/src/languageFeatures/inlayHints.ts index a31cbd1ea52..b3a90b993b0 100644 --- a/extensions/typescript-language-features/src/languageFeatures/inlayHints.ts +++ b/extensions/typescript-language-features/src/languageFeatures/inlayHints.ts @@ -7,9 +7,10 @@ import * as vscode from 'vscode'; import type * as Proto from '../protocol'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; -import { Condition, conditionalRegistration, requireMinVersion, requireSomeCapability } from '../utils/dependentRegistration'; +import { conditionalRegistration, requireMinVersion, requireSomeCapability } from '../utils/dependentRegistration'; import { Disposable } from '../utils/dispose'; import { DocumentSelector } from '../utils/documentSelector'; +import { LanguageDescription } from '../utils/languageDescription'; import { Position } from '../utils/typeConverters'; import FileConfigurationManager, { getInlayHintsPreferences, InlayHintSettingNames } from './fileConfigurationManager'; @@ -31,15 +32,14 @@ class TypeScriptInlayHintsProvider extends Disposable implements vscode.InlayHin public readonly onDidChangeInlayHints = this._onDidChangeInlayHints.event; constructor( - modeId: string, - languageIds: readonly string[], + private readonly language: LanguageDescription, private readonly client: ITypeScriptServiceClient, private readonly fileConfigurationManager: FileConfigurationManager ) { super(); this._register(vscode.workspace.onDidChangeConfiguration(e => { - if (inlayHintSettingNames.some(settingName => e.affectsConfiguration(modeId + '.' + settingName))) { + if (inlayHintSettingNames.some(settingName => e.affectsConfiguration(language.id + '.' + settingName))) { this._onDidChangeInlayHints.fire(); } })); @@ -47,7 +47,7 @@ class TypeScriptInlayHintsProvider extends Disposable implements vscode.InlayHin // When a JS/TS file changes, change inlay hints for all visible editors // since changes in one file can effect the hints the others. this._register(vscode.workspace.onDidChangeTextDocument(e => { - if (languageIds.includes(e.document.languageId)) { + if (language.languageIds.includes(e.document.languageId)) { this._onDidChangeInlayHints.fire(); } })); @@ -59,6 +59,10 @@ class TypeScriptInlayHintsProvider extends Disposable implements vscode.InlayHin return []; } + if (!areInlayHintsEnabledForFile(this.language, model)) { + return []; + } + const start = model.offsetAt(range.start); const length = model.offsetAt(range.end) - start; @@ -71,60 +75,50 @@ class TypeScriptInlayHintsProvider extends Disposable implements vscode.InlayHin return response.body.map(hint => { const result = new vscode.InlayHint( - hint.text, Position.fromLocation(hint.position), + hint.text, hint.kind && fromProtocolInlayHintKind(hint.kind) ); - result.whitespaceBefore = hint.whitespaceBefore; - result.whitespaceAfter = hint.whitespaceAfter; + result.paddingLeft = hint.whitespaceBefore; + result.paddingRight = hint.whitespaceAfter; return result; }); } } - -function fromProtocolInlayHintKind(kind: Proto.InlayHintKind): vscode.InlayHintKind { +function fromProtocolInlayHintKind(kind: Proto.InlayHintKind): vscode.InlayHintKind | undefined { switch (kind) { case 'Parameter': return vscode.InlayHintKind.Parameter; case 'Type': return vscode.InlayHintKind.Type; - case 'Enum': return vscode.InlayHintKind.Other; - default: return vscode.InlayHintKind.Other; + case 'Enum': return undefined; + default: return undefined; } } -export function requireInlayHintsConfiguration( - language: string -) { - return new Condition( - () => { - const config = vscode.workspace.getConfiguration(language, null); - const preferences = getInlayHintsPreferences(config); +function areInlayHintsEnabledForFile(language: LanguageDescription, document: vscode.TextDocument) { + const config = vscode.workspace.getConfiguration(language.id, document); + const preferences = getInlayHintsPreferences(config); - return preferences.includeInlayParameterNameHints === 'literals' || - preferences.includeInlayParameterNameHints === 'all' || - preferences.includeInlayEnumMemberValueHints || - preferences.includeInlayFunctionLikeReturnTypeHints || - preferences.includeInlayFunctionParameterTypeHints || - preferences.includeInlayPropertyDeclarationTypeHints || - preferences.includeInlayVariableTypeHints; - }, - vscode.workspace.onDidChangeConfiguration - ); + return preferences.includeInlayParameterNameHints === 'literals' || + preferences.includeInlayParameterNameHints === 'all' || + preferences.includeInlayEnumMemberValueHints || + preferences.includeInlayFunctionLikeReturnTypeHints || + preferences.includeInlayFunctionParameterTypeHints || + preferences.includeInlayPropertyDeclarationTypeHints || + preferences.includeInlayVariableTypeHints; } export function register( selector: DocumentSelector, - modeId: string, - languageIds: readonly string[], + language: LanguageDescription, client: ITypeScriptServiceClient, fileConfigurationManager: FileConfigurationManager ) { return conditionalRegistration([ - requireInlayHintsConfiguration(modeId), requireMinVersion(client, TypeScriptInlayHintsProvider.minVersion), requireSomeCapability(client, ClientCapability.Semantic), ], () => { - const provider = new TypeScriptInlayHintsProvider(modeId, languageIds, client, fileConfigurationManager); + const provider = new TypeScriptInlayHintsProvider(language, client, fileConfigurationManager); return vscode.languages.registerInlayHintsProvider(selector.semantic, provider); }); } diff --git a/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts b/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts index 66a51dc239a..3c481dcc177 100644 --- a/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts +++ b/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts @@ -6,8 +6,8 @@ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { ITypeScriptServiceClient } from '../typescriptService'; -import { conditionalRegistration, requireConfiguration } from '../utils/dependentRegistration'; import { DocumentSelector } from '../utils/documentSelector'; +import { LanguageDescription } from '../utils/languageDescription'; import * as typeConverters from '../utils/typeConverters'; import FileConfigurationManager from './fileConfigurationManager'; @@ -38,6 +38,7 @@ class JsDocCompletionProvider implements vscode.CompletionItemProvider { constructor( private readonly client: ITypeScriptServiceClient, + private readonly language: LanguageDescription, private readonly fileConfigurationManager: FileConfigurationManager, ) { } @@ -46,6 +47,10 @@ class JsDocCompletionProvider implements vscode.CompletionItemProvider { position: vscode.Position, token: vscode.CancellationToken ): Promise { + if (!vscode.workspace.getConfiguration(this.language.id, document).get('suggest.completeJSDocs')) { + return undefined; + } + const file = this.client.toOpenedFilePath(document); if (!file) { return undefined; @@ -121,16 +126,12 @@ export function templateToSnippet(template: string): vscode.SnippetString { export function register( selector: DocumentSelector, - modeId: string, + language: LanguageDescription, client: ITypeScriptServiceClient, fileConfigurationManager: FileConfigurationManager, ): vscode.Disposable { - return conditionalRegistration([ - requireConfiguration(modeId, 'suggest.completeJSDocs') - ], () => { - return vscode.languages.registerCompletionItemProvider(selector.syntax, - new JsDocCompletionProvider(client, fileConfigurationManager), - '*'); - }); + return vscode.languages.registerCompletionItemProvider(selector.syntax, + new JsDocCompletionProvider(client, language, fileConfigurationManager), + '*'); } diff --git a/extensions/typescript-language-features/src/languageFeatures/languageConfiguration.ts b/extensions/typescript-language-features/src/languageFeatures/languageConfiguration.ts deleted file mode 100644 index 4c47cd0cdfc..00000000000 --- a/extensions/typescript-language-features/src/languageFeatures/languageConfiguration.ts +++ /dev/null @@ -1,105 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/* -------------------------------------------------------------------------------------------- - * Includes code from typescript-sublime-plugin project, obtained from - * https://github.com/microsoft/TypeScript-Sublime-Plugin/blob/master/TypeScript%20Indent.tmPreferences - * ------------------------------------------------------------------------------------------ */ - -import * as vscode from 'vscode'; -import { Disposable } from '../utils/dispose'; -import * as languageModeIds from '../utils/languageModeIds'; - -const jsTsLanguageConfiguration: vscode.LanguageConfiguration = { - indentationRules: { - decreaseIndentPattern: /^((?!.*?\/\*).*\*\/)?\s*[\}\]].*$/, - increaseIndentPattern: /^((?!\/\/).)*(\{([^}"'`]*|(\t|[ ])*\/\/.*)|\([^)"'`]*|\[[^\]"'`]*)$/, - // e.g. * ...| or */| or *-----*/| - unIndentedLinePattern: /^(\t|[ ])*[ ]\*[^/]*\*\/\s*$|^(\t|[ ])*[ ]\*\/\s*$|^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/ - }, - wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g, - onEnterRules: [ - { - // e.g. /** | */ - beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, - afterText: /^\s*\*\/$/, - action: { indentAction: vscode.IndentAction.IndentOutdent, appendText: ' * ' }, - }, { - // e.g. /** ...| - beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, - action: { indentAction: vscode.IndentAction.None, appendText: ' * ' }, - }, { - // e.g. * ...| - beforeText: /^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/, - previousLineText: /(?=^(\s*(\/\*\*|\*)).*)(?=(?!(\s*\*\/)))/, - action: { indentAction: vscode.IndentAction.None, appendText: '* ' }, - }, { - // e.g. */| - beforeText: /^(\t|[ ])*[ ]\*\/\s*$/, - action: { indentAction: vscode.IndentAction.None, removeText: 1 }, - }, - { - // e.g. *-----*/| - beforeText: /^(\t|[ ])*[ ]\*[^/]*\*\/\s*$/, - action: { indentAction: vscode.IndentAction.None, removeText: 1 }, - }, - { - beforeText: /^\s*(\bcase\s.+:|\bdefault:)$/, - afterText: /^(?!\s*(\bcase\b|\bdefault\b))/, - action: { indentAction: vscode.IndentAction.Indent }, - } - ] -}; - -const EMPTY_ELEMENTS: string[] = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr']; - -const jsxTagsLanguageConfiguration: vscode.LanguageConfiguration = { - wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g, - onEnterRules: [ - { - beforeText: new RegExp(`<(?!(?:${EMPTY_ELEMENTS.join('|')}))([_:\\w][_:\\w\\-.\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i'), - afterText: /^<\/([_:\w][_:\w-.\d]*)\s*>$/i, - action: { indentAction: vscode.IndentAction.IndentOutdent } - }, - { - beforeText: new RegExp(`<(?!(?:${EMPTY_ELEMENTS.join('|')}))([_:\\w][_:\\w\\-.\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i'), - action: { indentAction: vscode.IndentAction.Indent } - }, - { - // `beforeText` only applies to tokens of a given language. Since we are dealing with jsx-tags, - // make sure we apply to the closing `>` of a tag so that mixed language spans - // such as `
` are handled properly. - beforeText: /^>$/, - afterText: /^<\/([_:\w][_:\w-.\d]*)\s*>$/i, - action: { indentAction: vscode.IndentAction.IndentOutdent } - }, - { - beforeText: /^>$/, - action: { indentAction: vscode.IndentAction.Indent } - }, - ], -}; - -export class LanguageConfigurationManager extends Disposable { - - constructor() { - super(); - const standardLanguages = [ - languageModeIds.javascript, - languageModeIds.javascriptreact, - languageModeIds.typescript, - languageModeIds.typescriptreact, - ]; - for (const language of standardLanguages) { - this.registerConfiguration(language, jsTsLanguageConfiguration); - } - - this.registerConfiguration(languageModeIds.jsxTags, jsxTagsLanguageConfiguration); - } - - private registerConfiguration(language: string, config: vscode.LanguageConfiguration) { - this._register(vscode.languages.setLanguageConfiguration(language, config)); - } -} diff --git a/extensions/typescript-language-features/src/languageFeatures/quickFix.ts b/extensions/typescript-language-features/src/languageFeatures/quickFix.ts index 4cb76badff9..977bc20dc61 100644 --- a/extensions/typescript-language-features/src/languageFeatures/quickFix.ts +++ b/extensions/typescript-language-features/src/languageFeatures/quickFix.ts @@ -370,7 +370,7 @@ const fixAllErrorCodes = new Map([ [2345, 2339], ]); -const preferredFixes = new Map([ +const preferredFixes = new Map([ [fixNames.annotateWithTypeFromJSDoc, { priority: 2 }], [fixNames.constructorForDerivedNeedSuperCall, { priority: 2 }], [fixNames.extendsInterfaceBecomesImplements, { priority: 2 }], diff --git a/extensions/typescript-language-features/src/languageFeatures/refactor.ts b/extensions/typescript-language-features/src/languageFeatures/refactor.ts index fe820d332da..392cc5a3e18 100644 --- a/extensions/typescript-language-features/src/languageFeatures/refactor.ts +++ b/extensions/typescript-language-features/src/languageFeatures/refactor.ts @@ -22,7 +22,7 @@ const localize = nls.loadMessageBundle(); interface DidApplyRefactoringCommand_Args { - readonly codeAction: InlinedCodeAction + readonly codeAction: InlinedCodeAction; } class DidApplyRefactoringCommand implements Command { diff --git a/extensions/typescript-language-features/src/languageFeatures/semanticTokens.ts b/extensions/typescript-language-features/src/languageFeatures/semanticTokens.ts index 420a7a3326c..1b7342eba15 100644 --- a/extensions/typescript-language-features/src/languageFeatures/semanticTokens.ts +++ b/extensions/typescript-language-features/src/languageFeatures/semanticTokens.ts @@ -33,11 +33,6 @@ export function register( }); } -/** - * Prototype of a DocumentSemanticTokensProvider, relying on the experimental `encodedSemanticClassifications-full` request from the TypeScript server. - * As the results retured by the TypeScript server are limited, we also add a Typescript plugin (typescript-vscode-sh-plugin) to enrich the returned token. - * See https://github.com/aeschli/typescript-vscode-sh-plugin. - */ class DocumentSemanticTokensProvider implements vscode.DocumentSemanticTokensProvider, vscode.DocumentRangeSemanticTokensProvider { constructor(private readonly client: ITypeScriptServiceClient) { @@ -111,10 +106,9 @@ class DocumentSemanticTokensProvider implements vscode.DocumentSemanticTokensPro let tokenModifiers = 0; let tokenType = getTokenTypeFromClassification(tsClassification); if (tokenType !== undefined) { - // it's a classification as returned by the typescript-vscode-sh-plugin tokenModifiers = getTokenModifierFromClassification(tsClassification); } else { - // typescript-vscode-sh-plugin is not present + // an old TypeScript server that uses the original ExperimentalProtocol.ClassificationType's tokenType = tokenTypeMap[tsClassification]; if (tokenType === undefined) { continue; diff --git a/extensions/typescript-language-features/src/languageFeatures/signatureHelp.ts b/extensions/typescript-language-features/src/languageFeatures/signatureHelp.ts index 177eda86ceb..1d9c66caa09 100644 --- a/extensions/typescript-language-features/src/languageFeatures/signatureHelp.ts +++ b/extensions/typescript-language-features/src/languageFeatures/signatureHelp.ts @@ -42,7 +42,7 @@ class TypeScriptSignatureHelpProvider implements vscode.SignatureHelpProvider { const info = response.body; const result = new vscode.SignatureHelp(); - result.signatures = info.items.map(signature => this.convertSignature(signature)); + result.signatures = info.items.map(signature => this.convertSignature(signature, document.uri)); result.activeSignature = this.getActiveSignature(context, info, result.signatures); result.activeParameter = this.getActiveParameter(info); @@ -70,10 +70,10 @@ class TypeScriptSignatureHelpProvider implements vscode.SignatureHelpProvider { return info.argumentIndex; } - private convertSignature(item: Proto.SignatureHelpItem) { + private convertSignature(item: Proto.SignatureHelpItem, baseUri: vscode.Uri) { const signature = new vscode.SignatureInformation( Previewer.plainWithLinks(item.prefixDisplayParts, this.client), - Previewer.markdownDocumentation(item.documentation, item.tags.filter(x => x.name !== 'param'), this.client)); + Previewer.markdownDocumentation(item.documentation, item.tags.filter(x => x.name !== 'param'), this.client, baseUri)); let textIndex = signature.label.length; const separatorLabel = Previewer.plainWithLinks(item.separatorDisplayParts, this.client); @@ -84,7 +84,7 @@ class TypeScriptSignatureHelpProvider implements vscode.SignatureHelpProvider { signature.parameters.push( new vscode.ParameterInformation( [textIndex, textIndex + label.length], - Previewer.markdownDocumentation(parameter.documentation, [], this.client))); + Previewer.markdownDocumentation(parameter.documentation, [], this.client, baseUri))); textIndex += label.length; signature.label += label; diff --git a/extensions/typescript-language-features/src/languageFeatures/tagClosing.ts b/extensions/typescript-language-features/src/languageFeatures/tagClosing.ts index b09592d4703..aeaa1bbcaae 100644 --- a/extensions/typescript-language-features/src/languageFeatures/tagClosing.ts +++ b/extensions/typescript-language-features/src/languageFeatures/tagClosing.ts @@ -7,9 +7,10 @@ import * as vscode from 'vscode'; import type * as Proto from '../protocol'; import { ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; -import { Condition, conditionalRegistration, requireConfiguration, requireMinVersion } from '../utils/dependentRegistration'; +import { Condition, conditionalRegistration, requireMinVersion } from '../utils/dependentRegistration'; import { Disposable } from '../utils/dispose'; import { DocumentSelector } from '../utils/documentSelector'; +import { LanguageDescription } from '../utils/languageDescription'; import * as typeConverters from '../utils/typeConverters'; class TagClosing extends Disposable { @@ -139,29 +140,34 @@ class TagClosing extends Disposable { } } -function requireActiveDocument( - selector: vscode.DocumentSelector +function requireActiveDocumentSetting( + selector: vscode.DocumentSelector, + language: LanguageDescription, ) { return new Condition( () => { const editor = vscode.window.activeTextEditor; - return !!(editor && vscode.languages.match(selector, editor.document)); + if (!editor || !vscode.languages.match(selector, editor.document)) { + return false; + } + + return !!vscode.workspace.getConfiguration(language.id, editor.document).get('autoClosingTags'); }, handler => { return vscode.Disposable.from( vscode.window.onDidChangeActiveTextEditor(handler), - vscode.workspace.onDidOpenTextDocument(handler)); + vscode.workspace.onDidOpenTextDocument(handler), + vscode.workspace.onDidChangeConfiguration(handler)); }); } export function register( selector: DocumentSelector, - modeId: string, + language: LanguageDescription, client: ITypeScriptServiceClient, ) { return conditionalRegistration([ requireMinVersion(client, TagClosing.minVersion), - requireConfiguration(modeId, 'autoClosingTags'), - requireActiveDocument(selector.syntax) + requireActiveDocumentSetting(selector.syntax, language) ], () => new TagClosing(client)); } diff --git a/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts b/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts index e8baac3b6ad..4ceba028361 100644 --- a/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts +++ b/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as jsonc from 'jsonc-parser'; -import { basename, dirname, join } from 'path'; +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, flatten } from '../utils/arrays'; +import { exists } from '../utils/fs'; function mapChildren(node: jsonc.Node | undefined, f: (x: jsonc.Node) => R): R[] { return node && node.type === 'array' && node.children @@ -14,15 +17,23 @@ function mapChildren(node: jsonc.Node | undefined, f: (x: jsonc.Node) => R): : []; } +const openExtendsLinkCommandId = '_typescript.openExtendsLink'; +type OpenExtendsLinkCommandArgs = { + resourceUri: vscode.Uri; + extendsValue: string; +}; + +const localize = nls.loadMessageBundle(); + class TsconfigLinkProvider implements vscode.DocumentLinkProvider { public provideDocumentLinks( document: vscode.TextDocument, _token: vscode.CancellationToken - ): vscode.ProviderResult { + ): vscode.DocumentLink[] { const root = jsonc.parseTree(document.getText()); if (!root) { - return null; + return []; } return coalesce([ @@ -38,17 +49,18 @@ class TsconfigLinkProvider implements vscode.DocumentLinkProvider { return undefined; } - if (extendsNode.value.startsWith('.')) { - return new vscode.DocumentLink( - this.getRange(document, extendsNode), - vscode.Uri.file(join(dirname(document.uri.fsPath), extendsNode.value + (extendsNode.value.endsWith('.json') ? '' : '.json'))) - ); + const extendsValue: string = extendsNode.value; + if (extendsValue.startsWith('/')) { + return undefined; } - const workspaceFolderPath = vscode.workspace.getWorkspaceFolder(document.uri)!.uri.fsPath; + const args: OpenExtendsLinkCommandArgs = { + resourceUri: document.uri, + extendsValue: extendsValue + }; return new vscode.DocumentLink( this.getRange(document, extendsNode), - vscode.Uri.file(join(workspaceFolderPath, 'node_modules', extendsNode.value + (extendsNode.value.endsWith('.json') ? '' : '.json'))) + vscode.Uri.parse(`command:${openExtendsLinkCommandId}?${JSON.stringify(args)}`) ); } @@ -91,21 +103,88 @@ 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.file(join(dirname(document.uri.fsPath), 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.file(join(dirname(document.uri.fsPath), node.value, 'tsconfig.json')); } private getRange(document: vscode.TextDocument, node: jsonc.Node) { - const offset = node!.offset; + const offset = node.offset; const start = document.positionAt(offset + 1); - const end = document.positionAt(offset + (node!.length - 1)); + const end = document.positionAt(offset + (node.length - 1)); return new vscode.Range(start, end); } } +async function resolveNodeModulesPath(baseDirUri: vscode.Uri, pathCandidates: string[]): Promise { + let currentUri = baseDirUri; + const baseCandidate = pathCandidates[0]; + const sepIndex = baseCandidate.startsWith('@') ? 2 : 1; + const moduleBasePath = baseCandidate.split(posix.sep).slice(0, sepIndex).join(posix.sep); + while (true) { + const moduleAbsoluteUrl = vscode.Uri.joinPath(currentUri, 'node_modules', moduleBasePath); + let moduleStat: vscode.FileStat | undefined; + try { + moduleStat = await vscode.workspace.fs.stat(moduleAbsoluteUrl); + } catch (err) { + // noop + } + + if (moduleStat && (moduleStat.type & vscode.FileType.Directory)) { + for (const uriCandidate of pathCandidates + .map((relativePath) => relativePath.split(posix.sep).slice(sepIndex).join(posix.sep)) + // skip empty paths within module + .filter(Boolean) + .map((relativeModulePath) => vscode.Uri.joinPath(moduleAbsoluteUrl, relativeModulePath)) + ) { + if (await exists(uriCandidate)) { + return uriCandidate; + } + } + // Continue to looking for potentially another version + } + + const oldUri = currentUri; + currentUri = vscode.Uri.joinPath(currentUri, '..'); + + // Can't go next. Reached the system root + if (oldUri.path === currentUri.path) { + return; + } + } +} + +// Reference: https://github.com/microsoft/TypeScript/blob/febfd442cdba343771f478cf433b0892f213ad2f/src/compiler/commandLineParser.ts#L3005 +/** +* @returns Returns undefined in case of lack of result while trying to resolve from node_modules +*/ +async function getTsconfigPath(baseDirUri: vscode.Uri, extendsValue: string): Promise { + // Don't take into account a case, where tsconfig might be resolved from the root (see the reference) + // e.g. C:/projects/shared-tsconfig/tsconfig.json (note that C: prefix is optional) + + const isRelativePath = ['./', '../'].some(str => extendsValue.startsWith(str)); + if (isRelativePath) { + const absolutePath = vscode.Uri.joinPath(baseDirUri, extendsValue); + if (await exists(absolutePath) || absolutePath.path.endsWith('.json')) { + return absolutePath; + } + return absolutePath.with({ + path: `${absolutePath.path}.json` + }); + } + + // Otherwise resolve like a module + return resolveNodeModulesPath(baseDirUri, [ + extendsValue, + ...extendsValue.endsWith('.json') ? [] : [ + `${extendsValue}.json`, + `${extendsValue}/tsconfig.json`, + ] + ]); +} + export function register() { const patterns: vscode.GlobPattern[] = [ '**/[jt]sconfig.json', @@ -118,5 +197,16 @@ export function register() { languages.map(language => patterns.map((pattern): vscode.DocumentFilter => ({ language, pattern })))); - return vscode.languages.registerDocumentLinkProvider(selector, new TsconfigLinkProvider()); + return vscode.Disposable.from( + 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)); + return; + } + // Will suggest to create a .json variant if it doesn't exist yet (but only for relative paths) + await vscode.commands.executeCommand('vscode.open', tsconfigPath); + }), + vscode.languages.registerDocumentLinkProvider(selector, new TsconfigLinkProvider()), + ); } diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index 3f031e9b140..4a3669e142d 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -43,7 +43,7 @@ export default class LanguageProvider extends Disposable { private get documentSelector(): DocumentSelector { const semantic: vscode.DocumentFilter[] = []; const syntax: vscode.DocumentFilter[] = []; - for (const language of this.description.modeIds) { + for (const language of this.description.languageIds) { syntax.push({ language }); for (const scheme of fileSchemes.semanticSupportedSchemes) { semantic.push({ language, scheme }); @@ -60,9 +60,9 @@ export default class LanguageProvider extends Disposable { await Promise.all([ import('./languageFeatures/callHierarchy').then(provider => this._register(provider.register(selector, this.client))), - import('./languageFeatures/codeLens/implementationsCodeLens').then(provider => this._register(provider.register(selector, this.description.id, this.client, cachedResponse))), - import('./languageFeatures/codeLens/referencesCodeLens').then(provider => this._register(provider.register(selector, this.description.id, this.client, cachedResponse))), - import('./languageFeatures/completions').then(provider => this._register(provider.register(selector, this.description.id, this.client, this.typingsStatus, this.fileConfigurationManager, this.commandManager, this.telemetryReporter, this.onCompletionAccepted))), + import('./languageFeatures/codeLens/implementationsCodeLens').then(provider => this._register(provider.register(selector, this.description, this.client, cachedResponse))), + import('./languageFeatures/codeLens/referencesCodeLens').then(provider => this._register(provider.register(selector, this.description, this.client, cachedResponse))), + import('./languageFeatures/completions').then(provider => this._register(provider.register(selector, this.description, this.client, this.typingsStatus, this.fileConfigurationManager, this.commandManager, this.telemetryReporter, this.onCompletionAccepted))), import('./languageFeatures/definitions').then(provider => this._register(provider.register(selector, this.client))), import('./languageFeatures/directiveCommentCompletions').then(provider => this._register(provider.register(selector, this.client))), import('./languageFeatures/documentHighlight').then(provider => this._register(provider.register(selector, this.client))), @@ -70,10 +70,10 @@ export default class LanguageProvider extends Disposable { import('./languageFeatures/fileReferences').then(provider => this._register(provider.register(this.client, this.commandManager))), import('./languageFeatures/fixAll').then(provider => this._register(provider.register(selector, this.client, this.fileConfigurationManager, this.client.diagnosticsManager))), import('./languageFeatures/folding').then(provider => this._register(provider.register(selector, this.client))), - import('./languageFeatures/formatting').then(provider => this._register(provider.register(selector, this.description.id, this.client, this.fileConfigurationManager))), + import('./languageFeatures/formatting').then(provider => this._register(provider.register(selector, this.description, this.client, this.fileConfigurationManager))), import('./languageFeatures/hover').then(provider => this._register(provider.register(selector, this.client, this.fileConfigurationManager))), import('./languageFeatures/implementations').then(provider => this._register(provider.register(selector, this.client))), - import('./languageFeatures/jsDocCompletions').then(provider => this._register(provider.register(selector, this.description.id, this.client, this.fileConfigurationManager))), + import('./languageFeatures/jsDocCompletions').then(provider => this._register(provider.register(selector, this.description, this.client, this.fileConfigurationManager))), import('./languageFeatures/organizeImports').then(provider => this._register(provider.register(selector, this.client, this.commandManager, this.fileConfigurationManager, this.telemetryReporter))), import('./languageFeatures/quickFix').then(provider => this._register(provider.register(selector, this.client, this.fileConfigurationManager, this.commandManager, this.client.diagnosticsManager, this.telemetryReporter))), import('./languageFeatures/refactor').then(provider => this._register(provider.register(selector, this.client, this.fileConfigurationManager, this.commandManager, this.telemetryReporter))), @@ -82,9 +82,9 @@ export default class LanguageProvider extends Disposable { import('./languageFeatures/semanticTokens').then(provider => this._register(provider.register(selector, this.client))), import('./languageFeatures/signatureHelp').then(provider => this._register(provider.register(selector, this.client))), import('./languageFeatures/smartSelect').then(provider => this._register(provider.register(selector, this.client))), - import('./languageFeatures/tagClosing').then(provider => this._register(provider.register(selector, this.description.id, this.client))), + import('./languageFeatures/tagClosing').then(provider => this._register(provider.register(selector, this.description, this.client))), import('./languageFeatures/typeDefinitions').then(provider => this._register(provider.register(selector, this.client))), - import('./languageFeatures/inlayHints').then(provider => this._register(provider.register(selector, this.description.id, this.description.modeIds, this.client, this.fileConfigurationManager))), + import('./languageFeatures/inlayHints').then(provider => this._register(provider.register(selector, this.description, this.client, this.fileConfigurationManager))), ]); } @@ -100,7 +100,7 @@ export default class LanguageProvider extends Disposable { } public handlesDocument(doc: vscode.TextDocument): boolean { - return this.description.modeIds.includes(doc.languageId) || this.handlesConfigFile(doc.uri); + return this.description.languageIds.includes(doc.languageId) || this.handlesConfigFile(doc.uri); } private handlesConfigFile(resource: vscode.Uri) { @@ -132,7 +132,7 @@ export default class LanguageProvider extends Disposable { this.client.bufferSyncSupport.requestAllDiagnostics(); } - public diagnosticsReceived(diagnosticsKind: DiagnosticKind, file: vscode.Uri, diagnostics: (vscode.Diagnostic & { reportUnnecessary: any, reportDeprecated: any })[]): void { + public diagnosticsReceived(diagnosticsKind: DiagnosticKind, file: vscode.Uri, diagnostics: (vscode.Diagnostic & { reportUnnecessary: any; reportDeprecated: any })[]): void { if (diagnosticsKind !== DiagnosticKind.Syntax && !this.client.hasCapabilityForResource(file, ClientCapability.Semantic)) { return; } diff --git a/extensions/typescript-language-features/src/lazyClientHost.ts b/extensions/typescript-language-features/src/lazyClientHost.ts index 638aa0f7ee8..1a7432674fc 100644 --- a/extensions/typescript-language-features/src/lazyClientHost.ts +++ b/extensions/typescript-language-features/src/lazyClientHost.ts @@ -23,14 +23,14 @@ export function createLazyClientHost( context: vscode.ExtensionContext, onCaseInsensitiveFileSystem: boolean, services: { - pluginManager: PluginManager, - commandManager: CommandManager, - logDirectoryProvider: ILogDirectoryProvider, - cancellerFactory: OngoingRequestCancellerFactory, - versionProvider: ITypeScriptVersionProvider, - processFactory: TsServerProcessFactory, - activeJsTsEditorTracker: ActiveJsTsEditorTracker, - serviceConfigurationProvider: ServiceConfigurationProvider, + pluginManager: PluginManager; + commandManager: CommandManager; + logDirectoryProvider: ILogDirectoryProvider; + cancellerFactory: OngoingRequestCancellerFactory; + versionProvider: ITypeScriptVersionProvider; + processFactory: TsServerProcessFactory; + activeJsTsEditorTracker: ActiveJsTsEditorTracker; + serviceConfigurationProvider: ServiceConfigurationProvider; }, onCompletionAccepted: (item: vscode.CompletionItem) => void, ): Lazy { @@ -56,7 +56,7 @@ export function lazilyActivateClient( const disposables: vscode.Disposable[] = []; const supportedLanguage = flatten([ - ...standardLanguageDescriptions.map(x => x.modeIds), + ...standardLanguageDescriptions.map(x => x.languageIds), ...pluginManager.plugins.map(x => x.languages) ]); diff --git a/extensions/typescript-language-features/src/test/testUtils.ts b/extensions/typescript-language-features/src/test/testUtils.ts index 883a196bf14..106df7f6118 100644 --- a/extensions/typescript-language-features/src/test/testUtils.ts +++ b/extensions/typescript-language-features/src/test/testUtils.ts @@ -153,7 +153,7 @@ export function onChangedDocument(documentUri: vscode.Uri, disposables: vscode.D export async function retryUntilDocumentChanges( documentUri: vscode.Uri, - options: { retries: number, timeout: number }, + options: { retries: number; timeout: number }, disposables: vscode.Disposable[], exec: () => Thenable, ) { diff --git a/extensions/typescript-language-features/src/test/unit/cachedResponse.test.ts b/extensions/typescript-language-features/src/test/unit/cachedResponse.test.ts index 1b0dd441120..49a9049013a 100644 --- a/extensions/typescript-language-features/src/test/unit/cachedResponse.test.ts +++ b/extensions/typescript-language-features/src/test/unit/cachedResponse.test.ts @@ -118,7 +118,7 @@ function createResponse(command: string): Proto.Response { }; } -function createEventualResponder(): { promise: Promise, resolve: (x: T) => void } { +function createEventualResponder(): { promise: Promise; resolve: (x: T) => void } { let resolve: (value: T) => void; const promise = new Promise(r => { resolve = r; }); return { promise, resolve: resolve! }; diff --git a/extensions/typescript-language-features/src/test/unit/previewer.test.ts b/extensions/typescript-language-features/src/test/unit/previewer.test.ts index 764cb1a3f81..2f7af37383b 100644 --- a/extensions/typescript-language-features/src/test/unit/previewer.test.ts +++ b/extensions/typescript-language-features/src/test/unit/previewer.test.ts @@ -30,7 +30,7 @@ suite('typescript.previewer', () => { markdownDocumentation( 'x {@link http://www.example.com/foo} y {@link https://api.jquery.com/bind/#bind-eventType-eventData-handler} z', [], - noopToResource + noopToResource, undefined ).value, 'x [http://www.example.com/foo](http://www.example.com/foo) y [https://api.jquery.com/bind/#bind-eventType-eventData-handler](https://api.jquery.com/bind/#bind-eventType-eventData-handler) z'); }); @@ -40,7 +40,7 @@ suite('typescript.previewer', () => { markdownDocumentation( 'x {@link http://www.example.com/foo abc xyz} y {@link http://www.example.com/bar|b a z} z', [], - noopToResource + noopToResource, undefined ).value, 'x [abc xyz](http://www.example.com/foo) y [b a z](http://www.example.com/bar) z'); }); @@ -50,7 +50,7 @@ suite('typescript.previewer', () => { markdownDocumentation( 'x {@linkcode http://www.example.com/foo} y {@linkplain http://www.example.com/bar} z', [], - noopToResource + noopToResource, undefined ).value, 'x [`http://www.example.com/foo`](http://www.example.com/foo) y [http://www.example.com/bar](http://www.example.com/bar) z'); }); @@ -71,7 +71,7 @@ suite('typescript.previewer', () => { markdownDocumentation( 'x {@link http://www.example.com/foo y {@link http://www.example.com/bar bar} z', [], - noopToResource + noopToResource, undefined ).value, 'x {@link http://www.example.com/foo y [bar](http://www.example.com/bar) z'); }); diff --git a/extensions/typescript-language-features/src/tsServer/bufferSyncSupport.ts b/extensions/typescript-language-features/src/tsServer/bufferSyncSupport.ts index ba04ec7e302..ed6af73fcf4 100644 --- a/extensions/typescript-language-features/src/tsServer/bufferSyncSupport.ts +++ b/extensions/typescript-language-features/src/tsServer/bufferSyncSupport.ts @@ -11,7 +11,7 @@ import { coalesce } from '../utils/arrays'; import { Delayer, setImmediate } from '../utils/async'; import { nulToken } from '../utils/cancellation'; import { Disposable } from '../utils/dispose'; -import * as languageModeIds from '../utils/languageModeIds'; +import * as languageModeIds from '../utils/languageIds'; import { ResourceMap } from '../utils/resourceMap'; import * as typeConverters from '../utils/typeConverters'; diff --git a/extensions/typescript-language-features/src/tsServer/server.ts b/extensions/typescript-language-features/src/tsServer/server.ts index 482c3f9fa47..fd6b9fa1d08 100644 --- a/extensions/typescript-language-features/src/tsServer/server.ts +++ b/extensions/typescript-language-features/src/tsServer/server.ts @@ -41,7 +41,7 @@ export interface ITypeScriptServer { * @return A list of all execute requests. If there are multiple entries, the first item is the primary * request while the rest are secondary ones. */ - executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean, executionTarget?: ExecutionTarget }): Array> | undefined>; + executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean; token?: vscode.CancellationToken; expectsResult: boolean; lowPriority?: boolean; executionTarget?: ExecutionTarget }): Array> | undefined>; dispose(): void; } @@ -186,9 +186,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe return false; } finally { const callback = this.fetchCallback(seq); - if (callback) { - callback.onSuccess(new ServerResponse.Cancelled(`Cancelled request ${seq} - ${command}`)); - } + callback?.onSuccess(new ServerResponse.Cancelled(`Cancelled request ${seq} - ${command}`)); } } @@ -209,7 +207,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe } } - public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean, executionTarget?: ExecutionTarget }): Array> | undefined> { + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean; token?: vscode.CancellationToken; expectsResult: boolean; lowPriority?: boolean; executionTarget?: ExecutionTarget }): Array> | undefined> { const request = this._requestQueue.createRequest(command, args); const requestInfo: RequestItem = { request, @@ -273,9 +271,7 @@ export class ProcessBasedTsServer extends Disposable implements ITypeScriptServe this.write(serverRequest); } catch (err) { const callback = this.fetchCallback(serverRequest.seq); - if (callback) { - callback.onError(err); - } + callback?.onError(err); } } @@ -414,7 +410,7 @@ export class GetErrRoutingTsServer extends Disposable implements ITypeScriptServ private readonly router: RequestRouter; public constructor( - servers: { getErr: ITypeScriptServer, primary: ITypeScriptServer }, + servers: { getErr: ITypeScriptServer; primary: ITypeScriptServer }, delegate: TsServerDelegate, ) { super(); @@ -467,7 +463,7 @@ export class GetErrRoutingTsServer extends Disposable implements ITypeScriptServ this.mainServer.kill(); } - public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean, executionTarget?: ExecutionTarget }): Array> | undefined> { + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean; token?: vscode.CancellationToken; expectsResult: boolean; lowPriority?: boolean; executionTarget?: ExecutionTarget }): Array> | undefined> { return this.router.execute(command, args, executeInfo); } } @@ -523,7 +519,7 @@ export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServ private _projectLoading = true; public constructor( - servers: { syntax: ITypeScriptServer, semantic: ITypeScriptServer }, + servers: { syntax: ITypeScriptServer; semantic: ITypeScriptServer }, delegate: TsServerDelegate, enableDynamicRouting: boolean, ) { @@ -607,7 +603,7 @@ export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServ this.semanticServer.kill(); } - public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean, executionTarget?: ExecutionTarget }): Array> | undefined> { + public executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean; token?: vscode.CancellationToken; expectsResult: boolean; lowPriority?: boolean; executionTarget?: ExecutionTarget }): Array> | undefined> { return this.router.execute(command, args, executeInfo); } } diff --git a/extensions/typescript-language-features/src/tsServer/spawner.ts b/extensions/typescript-language-features/src/tsServer/spawner.ts index 752c7a9607e..c1716e68862 100644 --- a/extensions/typescript-language-features/src/tsServer/spawner.ts +++ b/extensions/typescript-language-features/src/tsServer/spawner.ts @@ -186,7 +186,7 @@ export class TypeScriptServerSpawner { apiVersion: API, pluginManager: PluginManager, cancellationPipeName: string | undefined, - ): { args: string[], tsServerLogFile: string | undefined, tsServerTraceDirectory: string | undefined } { + ): { args: string[]; tsServerLogFile: string | undefined; tsServerTraceDirectory: string | undefined } { const args: string[] = []; let tsServerLogFile: string | undefined; let tsServerTraceDirectory: string | undefined; @@ -245,7 +245,7 @@ export class TypeScriptServerSpawner { const isUsingBundledTypeScriptVersion = currentVersion.path === this._versionProvider.defaultVersion.path; for (const plugin of pluginManager.plugins) { if (isUsingBundledTypeScriptVersion || plugin.enableForWorkspaceTypeScriptVersions) { - pluginPaths.push(isWeb() ? plugin.uri.toString() : plugin.uri.path); + pluginPaths.push(isWeb() ? plugin.uri.toString() : plugin.uri.fsPath); } } } diff --git a/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts b/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts index f67db7f3858..0543a6ae847 100644 --- a/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts +++ b/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts @@ -64,14 +64,14 @@ export default class TypeScriptServiceClientHost extends Disposable { context: vscode.ExtensionContext, onCaseInsensitiveFileSystem: boolean, services: { - pluginManager: PluginManager, - commandManager: CommandManager, - logDirectoryProvider: ILogDirectoryProvider, - cancellerFactory: OngoingRequestCancellerFactory, - versionProvider: ITypeScriptVersionProvider, - processFactory: TsServerProcessFactory, - activeJsTsEditorTracker: ActiveJsTsEditorTracker, - serviceConfigurationProvider: ServiceConfigurationProvider, + pluginManager: PluginManager; + commandManager: CommandManager; + logDirectoryProvider: ILogDirectoryProvider; + cancellerFactory: OngoingRequestCancellerFactory; + versionProvider: ITypeScriptVersionProvider; + processFactory: TsServerProcessFactory; + activeJsTsEditorTracker: ActiveJsTsEditorTracker; + serviceConfigurationProvider: ServiceConfigurationProvider; }, onCompletionAccepted: (item: vscode.CompletionItem) => void, ) { @@ -121,7 +121,7 @@ export default class TypeScriptServiceClientHost extends Disposable { if (plugin.configNamespace && plugin.languages.length) { this.registerExtensionLanguageProvider({ id: plugin.configNamespace, - modeIds: Array.from(plugin.languages), + languageIds: Array.from(plugin.languages), diagnosticSource: 'ts-plugin', diagnosticLanguage: DiagnosticLanguage.TypeScript, diagnosticOwner: 'typescript', @@ -138,7 +138,7 @@ export default class TypeScriptServiceClientHost extends Disposable { if (languages.size) { this.registerExtensionLanguageProvider({ id: 'typescript-plugins', - modeIds: Array.from(languages.values()), + languageIds: Array.from(languages.values()), diagnosticSource: 'ts-plugin', diagnosticLanguage: DiagnosticLanguage.TypeScript, diagnosticOwner: 'typescript', @@ -166,7 +166,7 @@ export default class TypeScriptServiceClientHost extends Disposable { private getAllModeIds(descriptions: LanguageDescription[], pluginManager: PluginManager) { const allModeIds = flatten([ - ...descriptions.map(x => x.modeIds), + ...descriptions.map(x => x.languageIds), ...pluginManager.plugins.map(x => x.languages) ]); return allModeIds; @@ -268,11 +268,11 @@ export default class TypeScriptServiceClientHost extends Disposable { private createMarkerDatas( diagnostics: Proto.Diagnostic[], source: string - ): (vscode.Diagnostic & { reportUnnecessary: any, reportDeprecated: any })[] { + ): (vscode.Diagnostic & { reportUnnecessary: any; reportDeprecated: any })[] { return diagnostics.map(tsDiag => this.tsDiagnosticToVsDiagnostic(tsDiag, source)); } - private tsDiagnosticToVsDiagnostic(diagnostic: Proto.Diagnostic, source: string): vscode.Diagnostic & { reportUnnecessary: any, reportDeprecated: any } { + private tsDiagnosticToVsDiagnostic(diagnostic: Proto.Diagnostic, source: string): vscode.Diagnostic & { reportUnnecessary: any; reportDeprecated: any } { const { start, end, text } = diagnostic; const range = new vscode.Range(typeConverters.Position.fromLocation(start), typeConverters.Position.fromLocation(end)); const converted = new vscode.Diagnostic(range, text, this.getDiagnosticSeverity(diagnostic)); @@ -299,7 +299,7 @@ export default class TypeScriptServiceClientHost extends Disposable { } converted.tags = tags.length ? tags : undefined; - const resultConverted = converted as vscode.Diagnostic & { reportUnnecessary: any, reportDeprecated: any }; + const resultConverted = converted as vscode.Diagnostic & { reportUnnecessary: any; reportDeprecated: any }; resultConverted.reportUnnecessary = diagnostic.reportsUnnecessary; resultConverted.reportDeprecated = diagnostic.reportsDeprecated; return resultConverted; diff --git a/extensions/typescript-language-features/src/typescriptService.ts b/extensions/typescript-language-features/src/typescriptService.ts index 1bbeb598d3f..5afaac77ecd 100644 --- a/extensions/typescript-language-features/src/typescriptService.ts +++ b/extensions/typescript-language-features/src/typescriptService.ts @@ -150,7 +150,7 @@ export interface ITypeScriptServiceClient { * @return The normalized path or `undefined` if the document is not open on the server. */ toOpenedFilePath(document: vscode.TextDocument, options?: { - suppressAlertOnFailure?: boolean + suppressAlertOnFailure?: boolean; }): string | undefined; /** @@ -160,7 +160,7 @@ export interface ITypeScriptServiceClient { getWorkspaceRootForResource(resource: vscode.Uri): string | undefined; - readonly onTsServerStarted: vscode.Event<{ version: TypeScriptVersion, usedApiVersion: API }>; + readonly onTsServerStarted: vscode.Event<{ version: TypeScriptVersion; usedApiVersion: API }>; readonly onProjectLanguageServiceStateChanged: vscode.Event; readonly onDidBeginInstallTypings: vscode.Event; readonly onDidEndInstallTypings: vscode.Event; diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index f95fb60e84b..0b8993e97a9 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -99,7 +99,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType private readonly workspaceState: vscode.Memento; - private _onReady?: { promise: Promise; resolve: () => void; reject: () => void; }; + private _onReady?: { promise: Promise; resolve: () => void; reject: () => void }; private _configuration: TypeScriptServiceConfiguration; private pluginPathsProvider: TypeScriptPluginPathsProvider; private readonly _versionManager: TypeScriptVersionManager; @@ -130,12 +130,12 @@ export default class TypeScriptServiceClient extends Disposable implements IType private readonly context: vscode.ExtensionContext, onCaseInsenitiveFileSystem: boolean, services: { - pluginManager: PluginManager, - logDirectoryProvider: ILogDirectoryProvider, - cancellerFactory: OngoingRequestCancellerFactory, - versionProvider: ITypeScriptVersionProvider, - processFactory: TsServerProcessFactory, - serviceConfigurationProvider: ServiceConfigurationProvider, + pluginManager: PluginManager; + logDirectoryProvider: ILogDirectoryProvider; + cancellerFactory: OngoingRequestCancellerFactory; + versionProvider: ITypeScriptVersionProvider; + processFactory: TsServerProcessFactory; + serviceConfigurationProvider: ServiceConfigurationProvider; }, allModeIds: readonly string[] ) { @@ -290,7 +290,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType this.serverState = this.startService(true); } - private readonly _onTsServerStarted = this._register(new vscode.EventEmitter<{ version: TypeScriptVersion, usedApiVersion: API }>()); + private readonly _onTsServerStarted = this._register(new vscode.EventEmitter<{ version: TypeScriptVersion; usedApiVersion: API }>()); public readonly onTsServerStarted = this._onTsServerStarted.event; private readonly _onDiagnosticsReceived = this._register(new vscode.EventEmitter()); @@ -830,7 +830,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType })[0]!; } - private executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean, token?: vscode.CancellationToken, expectsResult: boolean, lowPriority?: boolean, requireSemantic?: boolean }): Array> | undefined> { + private executeImpl(command: keyof TypeScriptRequests, args: any, executeInfo: { isAsync: boolean; token?: vscode.CancellationToken; expectsResult: boolean; lowPriority?: boolean; requireSemantic?: boolean }): Array> | undefined> { this.bufferSyncSupport.beforeCommand(command); const runningServerState = this.service(); return runningServerState.server.executeImpl(command, args, executeInfo); @@ -996,7 +996,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType function getReportIssueArgsForError( error: TypeScriptServerError, logPath: string | undefined, -): { extensionId: string, issueTitle: string, issueBody: string } | undefined { +): { extensionId: string; issueTitle: string; issueBody: string } | undefined { if (!error.serverStack || !error.serverMessage) { return undefined; } @@ -1063,7 +1063,7 @@ function getDignosticsKind(event: Proto.Event) { class ServerInitializingIndicator extends Disposable { - private _task?: { project: string | undefined, resolve: () => void }; + private _task?: { project: string | undefined; resolve: () => void }; public reset(): void { if (this._task) { diff --git a/extensions/typescript-language-features/src/ui/intellisenseStatus.ts b/extensions/typescript-language-features/src/ui/intellisenseStatus.ts index 87758230999..449973047ad 100644 --- a/extensions/typescript-language-features/src/ui/intellisenseStatus.ts +++ b/extensions/typescript-language-features/src/ui/intellisenseStatus.ts @@ -9,7 +9,7 @@ import { CommandManager } from '../commands/commandManager'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; import { ActiveJsTsEditorTracker } from '../utils/activeJsTsEditorTracker'; import { Disposable } from '../utils/dispose'; -import { isSupportedLanguageMode, isTypeScriptDocument, jsTsLanguageModes } from '../utils/languageModeIds'; +import { isSupportedLanguageMode, isTypeScriptDocument, jsTsLanguageModes } from '../utils/languageIds'; import { isImplicitProjectConfigFile, openOrCreateConfig, openProjectConfigForFile, openProjectConfigOrPromptToCreate, ProjectType } from '../utils/tsconfig'; const localize = nls.loadMessageBundle(); diff --git a/extensions/typescript-language-features/src/ui/versionStatus.ts b/extensions/typescript-language-features/src/ui/versionStatus.ts index 98a292ac97d..d577e22b194 100644 --- a/extensions/typescript-language-features/src/ui/versionStatus.ts +++ b/extensions/typescript-language-features/src/ui/versionStatus.ts @@ -9,7 +9,7 @@ import { SelectTypeScriptVersionCommand } from '../commands/selectTypeScriptVers import { TypeScriptVersion } from '../tsServer/versionProvider'; import { ITypeScriptServiceClient } from '../typescriptService'; import { Disposable } from '../utils/dispose'; -import { jsTsLanguageModes } from '../utils/languageModeIds'; +import { jsTsLanguageModes } from '../utils/languageIds'; const localize = nls.loadMessageBundle(); diff --git a/extensions/typescript-language-features/src/utils/activeJsTsEditorTracker.ts b/extensions/typescript-language-features/src/utils/activeJsTsEditorTracker.ts index f26380b3b7f..ab9e9576d67 100644 --- a/extensions/typescript-language-features/src/utils/activeJsTsEditorTracker.ts +++ b/extensions/typescript-language-features/src/utils/activeJsTsEditorTracker.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import { Disposable } from './dispose'; import { isJsConfigOrTsConfigFileName } from './languageDescription'; -import { isSupportedLanguageMode } from './languageModeIds'; +import { isSupportedLanguageMode } from './languageIds'; /** * Tracks the active JS/TS editor. diff --git a/extensions/typescript-language-features/src/utils/async.ts b/extensions/typescript-language-features/src/utils/async.ts index 3ec25abee2a..75ccf258f28 100644 --- a/extensions/typescript-language-features/src/utils/async.ts +++ b/extensions/typescript-language-features/src/utils/async.ts @@ -46,9 +46,7 @@ export class Delayer { if (delay >= 0 || this.timeout === null) { this.timeout = setTimeout(() => { this.timeout = null; - if (this.onSuccess) { - this.onSuccess(undefined); - } + this.onSuccess?.(undefined); }, delay >= 0 ? delay : this.defaultDelay); } diff --git a/extensions/typescript-language-features/src/utils/dependentRegistration.ts b/extensions/typescript-language-features/src/utils/dependentRegistration.ts index 1b96c9b0bb3..3d97b8a8e7f 100644 --- a/extensions/typescript-language-features/src/utils/dependentRegistration.ts +++ b/extensions/typescript-language-features/src/utils/dependentRegistration.ts @@ -83,13 +83,13 @@ export function requireMinVersion( ); } -export function requireConfiguration( - language: string, +export function requireGlobalConfiguration( + section: string, configValue: string, ) { return new Condition( () => { - const config = vscode.workspace.getConfiguration(language, null); + const config = vscode.workspace.getConfiguration(section, null); return !!config.get(configValue); }, vscode.workspace.onDidChangeConfiguration diff --git a/extensions/typescript-language-features/src/utils/dispose.ts b/extensions/typescript-language-features/src/utils/dispose.ts index 548094c28e5..175acf7b367 100644 --- a/extensions/typescript-language-features/src/utils/dispose.ts +++ b/extensions/typescript-language-features/src/utils/dispose.ts @@ -8,9 +8,7 @@ import * as vscode from 'vscode'; export function disposeAll(disposables: vscode.Disposable[]) { while (disposables.length) { const item = disposables.pop(); - if (item) { - item.dispose(); - } + item?.dispose(); } } @@ -39,4 +37,4 @@ export abstract class Disposable { protected get isDisposed() { return this._isDisposed; } -} \ No newline at end of file +} diff --git a/extensions/typescript-language-features/src/utils/languageDescription.ts b/extensions/typescript-language-features/src/utils/languageDescription.ts index f607a7cf22b..95c165bf14d 100644 --- a/extensions/typescript-language-features/src/utils/languageDescription.ts +++ b/extensions/typescript-language-features/src/utils/languageDescription.ts @@ -5,7 +5,7 @@ import { basename } from 'path'; import * as vscode from 'vscode'; -import * as languageModeIds from './languageModeIds'; +import * as languageIds from './languageIds'; export const enum DiagnosticLanguage { JavaScript, @@ -19,10 +19,10 @@ export interface LanguageDescription { readonly diagnosticOwner: string; readonly diagnosticSource: string; readonly diagnosticLanguage: DiagnosticLanguage; - readonly modeIds: readonly string[]; + readonly languageIds: readonly string[]; readonly configFilePattern?: RegExp; readonly isExternal?: boolean; - readonly standardFileExtensions: readonly string[], + readonly standardFileExtensions: readonly string[]; } export const standardLanguageDescriptions: LanguageDescription[] = [ @@ -31,7 +31,7 @@ export const standardLanguageDescriptions: LanguageDescription[] = [ diagnosticOwner: 'typescript', diagnosticSource: 'ts', diagnosticLanguage: DiagnosticLanguage.TypeScript, - modeIds: [languageModeIds.typescript, languageModeIds.typescriptreact], + languageIds: [languageIds.typescript, languageIds.typescriptreact], configFilePattern: /^tsconfig(\..*)?\.json$/gi, standardFileExtensions: [ 'ts', @@ -44,7 +44,7 @@ export const standardLanguageDescriptions: LanguageDescription[] = [ diagnosticOwner: 'typescript', diagnosticSource: 'ts', diagnosticLanguage: DiagnosticLanguage.JavaScript, - modeIds: [languageModeIds.javascript, languageModeIds.javascriptreact], + languageIds: [languageIds.javascript, languageIds.javascriptreact], configFilePattern: /^jsconfig(\..*)?\.json$/gi, standardFileExtensions: [ 'js', diff --git a/extensions/typescript-language-features/src/utils/languageModeIds.ts b/extensions/typescript-language-features/src/utils/languageIds.ts similarity index 100% rename from extensions/typescript-language-features/src/utils/languageModeIds.ts rename to extensions/typescript-language-features/src/utils/languageIds.ts diff --git a/extensions/typescript-language-features/src/utils/managedFileContext.ts b/extensions/typescript-language-features/src/utils/managedFileContext.ts index 750cc74c7d0..bca5675a49d 100644 --- a/extensions/typescript-language-features/src/utils/managedFileContext.ts +++ b/extensions/typescript-language-features/src/utils/managedFileContext.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode'; import { ActiveJsTsEditorTracker } from './activeJsTsEditorTracker'; import { Disposable } from './dispose'; import { isJsConfigOrTsConfigFileName } from './languageDescription'; -import { isSupportedLanguageMode } from './languageModeIds'; +import { isSupportedLanguageMode } from './languageIds'; /**E * When clause context set when the current file is managed by vscode's built-in typescript extension. diff --git a/extensions/typescript-language-features/src/utils/plugins.ts b/extensions/typescript-language-features/src/utils/plugins.ts index e71cdebb529..0716aba36cb 100644 --- a/extensions/typescript-language-features/src/utils/plugins.ts +++ b/extensions/typescript-language-features/src/utils/plugins.ts @@ -12,7 +12,7 @@ export interface TypeScriptServerPlugin { readonly name: string; readonly enableForWorkspaceTypeScriptVersions: boolean; readonly languages: ReadonlyArray; - readonly configNamespace?: string + readonly configNamespace?: string; } namespace TypeScriptServerPlugin { @@ -54,7 +54,7 @@ export class PluginManager extends Disposable { private readonly _onDidUpdatePlugins = this._register(new vscode.EventEmitter()); public readonly onDidChangePlugins = this._onDidUpdatePlugins.event; - private readonly _onDidUpdateConfig = this._register(new vscode.EventEmitter<{ pluginId: string, config: {} }>()); + private readonly _onDidUpdateConfig = this._register(new vscode.EventEmitter<{ pluginId: string; config: {} }>()); public readonly onDidUpdateConfig = this._onDidUpdateConfig.event; public setConfiguration(pluginId: string, config: {}) { diff --git a/extensions/typescript-language-features/src/utils/previewer.ts b/extensions/typescript-language-features/src/utils/previewer.ts index bacbaaffce2..9d685dcc2fe 100644 --- a/extensions/typescript-language-features/src/utils/previewer.ts +++ b/extensions/typescript-language-features/src/utils/previewer.ts @@ -130,7 +130,7 @@ function convertLinkTags( const out: string[] = []; - let currentLink: { name?: string, target?: Proto.FileSpan, text?: string, readonly linkcode: boolean } | undefined; + let currentLink: { name?: string; target?: Proto.FileSpan; text?: string; readonly linkcode: boolean } | undefined; for (const part of parts) { switch (part.kind) { case 'link': @@ -199,9 +199,11 @@ export function markdownDocumentation( documentation: Proto.SymbolDisplayPart[] | string, tags: Proto.JSDocTagInfo[], filePathConverter: IFilePathToResourceConverter, + baseUri: vscode.Uri | undefined, ): vscode.MarkdownString { const out = new vscode.MarkdownString(); addMarkdownDocumentation(out, documentation, tags, filePathConverter); + out.baseUri = baseUri; return out; } diff --git a/extensions/typescript-language-features/src/utils/resourceMap.ts b/extensions/typescript-language-features/src/utils/resourceMap.ts index 89d131f809f..cf97365831c 100644 --- a/extensions/typescript-language-features/src/utils/resourceMap.ts +++ b/extensions/typescript-language-features/src/utils/resourceMap.ts @@ -21,12 +21,12 @@ export class ResourceMap { return resource.toString(true); }; - private readonly _map = new Map(); + private readonly _map = new Map(); constructor( protected readonly _normalizePath: (resource: vscode.Uri) => string | undefined = ResourceMap.defaultPathNormalizer, protected readonly config: { - readonly onCaseInsensitiveFileSystem: boolean, + readonly onCaseInsensitiveFileSystem: boolean; }, ) { } @@ -76,7 +76,7 @@ export class ResourceMap { return Array.from(this._map.values(), x => x.value); } - public get entries(): Iterable<{ resource: vscode.Uri, value: T }> { + public get entries(): Iterable<{ resource: vscode.Uri; value: T }> { return this._map.values(); } diff --git a/extensions/typescript-language-features/src/utils/snippetForFunctionCall.ts b/extensions/typescript-language-features/src/utils/snippetForFunctionCall.ts index e0185db581b..2c5a0fd515c 100644 --- a/extensions/typescript-language-features/src/utils/snippetForFunctionCall.ts +++ b/extensions/typescript-language-features/src/utils/snippetForFunctionCall.ts @@ -8,9 +8,9 @@ import type * as Proto from '../protocol'; import * as PConst from '../protocol.const'; export function snippetForFunctionCall( - item: { insertText?: string | vscode.SnippetString; label: string; }, + item: { insertText?: string | vscode.SnippetString; label: string }, displayParts: ReadonlyArray -): { snippet: vscode.SnippetString, parameterCount: number } { +): { snippet: vscode.SnippetString; parameterCount: number } { if (item.insertText && typeof item.insertText !== 'string') { return { snippet: item.insertText, parameterCount: 0 }; } diff --git a/extensions/typescript-language-features/src/utils/telemetry.ts b/extensions/typescript-language-features/src/utils/telemetry.ts index 5231c0fb35a..2ef271de107 100644 --- a/extensions/typescript-language-features/src/utils/telemetry.ts +++ b/extensions/typescript-language-features/src/utils/telemetry.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import VsCodeTelemetryReporter from 'vscode-extension-telemetry'; +import VsCodeTelemetryReporter from '@vscode/extension-telemetry'; import { memoize } from './memoize'; interface PackageInfo { diff --git a/extensions/typescript-language-features/src/utils/tracer.ts b/extensions/typescript-language-features/src/utils/tracer.ts index 445b828d0c6..de3b0c933c7 100644 --- a/extensions/typescript-language-features/src/utils/tracer.ts +++ b/extensions/typescript-language-features/src/utils/tracer.ts @@ -30,7 +30,7 @@ namespace Trace { } interface RequestExecutionMetadata { - readonly queuingStartTime: number + readonly queuingStartTime: number; } export default class Tracer { diff --git a/extensions/typescript-language-features/src/utils/typingsStatus.ts b/extensions/typescript-language-features/src/utils/typingsStatus.ts index c9b9a909a8e..0fe6e71605d 100644 --- a/extensions/typescript-language-features/src/utils/typingsStatus.ts +++ b/extensions/typescript-language-features/src/utils/typingsStatus.ts @@ -106,7 +106,7 @@ export class AtaProgressReporter extends Disposable { const selected = await vscode.window.showWarningMessage( localize( 'typesInstallerInitializationFailed.title', - "Could not install typings files for JavaScript language features. Please ensure that NPM is installed or configure 'typescript.npm' in your user settings. Click [here]({0}) to learn more.", + "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' ), dontShowAgain); diff --git a/extensions/typescript-language-features/tsconfig.json b/extensions/typescript-language-features/tsconfig.json index 757f9ec5984..883b4b81749 100644 --- a/extensions/typescript-language-features/tsconfig.json +++ b/extensions/typescript-language-features/tsconfig.json @@ -12,7 +12,7 @@ "../../src/vscode-dts/vscode.d.ts", "../../src/vscode-dts/vscode.proposed.inlayHints.d.ts", "../../src/vscode-dts/vscode.proposed.languageStatus.d.ts", - "../../src/vscode-dts/vscode.proposed.quickPickSeparators.d.ts", + "../../src/vscode-dts/vscode.proposed.markdownStringBaseUri.d.ts", "../../src/vscode-dts/vscode.proposed.resolvers.d.ts", "../../src/vscode-dts/vscode.proposed.workspaceTrust.d.ts", ] diff --git a/extensions/typescript-language-features/yarn.lock b/extensions/typescript-language-features/yarn.lock index 4e215bbb7a6..d388994e0bc 100644 --- a/extensions/typescript-language-features/yarn.lock +++ b/extensions/typescript-language-features/yarn.lock @@ -2,16 +2,21 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/semver@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== +"@vscode/extension-telemetry@0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz#2f4c5bf81adf6b2e4ddba54759355e1559c5476b" + integrity sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw== + jsonc-parser@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz#59549150b133f2efacca48fe9ce1ec0659af2342" @@ -22,12 +27,12 @@ semver@5.5.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== -vscode-extension-telemetry@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.4.tgz#e5d5ac90ea7d07ec054f5310893d95d43d5984b0" - integrity sha512-LzirNf2GnykXCAqqWrvj+snYqgkPVyjwM72tYOHgcZiG/ZRuNjmqlgvs+SomEJdmD8cutduitPmhoyIuzOrVfA== - vscode-nls@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA== + +vscode-uri@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" + integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json index 45de8bf3b0a..1f9007e1fcc 100644 --- a/extensions/vscode-api-tests/package.json +++ b/extensions/vscode-api-tests/package.json @@ -18,7 +18,7 @@ "fsChunks", "inlayHints", "inlineCompletions", - "languageStatus", + "markdownStringBaseUri", "notebookCellExecutionState", "notebookConcatTextDocument", "notebookContentProvider", @@ -41,7 +41,6 @@ "taskPresentationGroup", "terminalDataWriteEvent", "terminalDimensions", - "terminalLocation", "terminalNameChangeEvent", "testCoverage", "testObserver", @@ -51,7 +50,8 @@ "tokenInformation", "treeViewDragAndDrop", "treeViewReveal", - "workspaceTrust" + "workspaceTrust", + "telemetry" ], "private": true, "activationEvents": [], @@ -202,7 +202,7 @@ }, "devDependencies": { "@types/mocha": "^8.2.0", - "@types/node": "14.x" + "@types/node": "16.x" }, "repository": { "type": "git", diff --git a/extensions/vscode-api-tests/src/memfs.ts b/extensions/vscode-api-tests/src/memfs.ts index 8c8bad5b162..4f0129da6cb 100644 --- a/extensions/vscode-api-tests/src/memfs.ts +++ b/extensions/vscode-api-tests/src/memfs.ts @@ -82,7 +82,7 @@ export class TestFS implements vscode.FileSystemProvider { throw vscode.FileSystemError.FileNotFound(); } - writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void { + writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean }): void { let basename = path.posix.basename(uri.path); let parent = this._lookupParentDirectory(uri); let entry = parent.entries.get(basename); diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts index bb5b6d26993..1d08ee961c2 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts @@ -134,6 +134,17 @@ suite('vscode API - commands', () => { e2 = error; } assert.ok(e2); + + + // we support strings but only http/https. those we cannot test but we can + // enforce that other schemes are treated strict + try { + await commands.executeCommand('vscode.open', 'file:///some/path/not/http'); + assert.fail('expecting exception'); + } catch { + assert.ok(true); + } + }); test('api-command: vscode.open with untitled supports associated resource (#138925)', async function () { diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/ipynb.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/ipynb.test.ts index fff6e06ab16..44359de5e84 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/ipynb.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/ipynb.test.ts @@ -7,8 +7,8 @@ import * as assert from 'assert'; import 'mocha'; import * as vscode from 'vscode'; -suite('ipynb NotebookSerializer', function () { - test.skip('Can open an ipynb notebook', async () => { +(vscode.env.uiKind === vscode.UIKind.Web ? suite.skip : suite)('ipynb NotebookSerializer', function () { + test('Can open an ipynb notebook', async () => { assert.ok(vscode.workspace.workspaceFolders); const workspace = vscode.workspace.workspaceFolders[0]; const uri = vscode.Uri.joinPath(workspace.uri, 'test.ipynb'); diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts index ed75f597dc5..dd30fce0aa4 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts @@ -111,14 +111,14 @@ suite('vscode API - languages', () => { vscode.languages.registerDocumentLinkProvider({ language: 'java', scheme: testFs.scheme }, linkProvider); const links = await vscode.commands.executeCommand('vscode.executeLinkProvider', doc.uri); - assert.strictEqual(2, links && links.length); + assert.strictEqual(links && links.length, 2, links.map(l => !l.target).join(', ')); let [link1, link2] = links!.sort((l1, l2) => l1.range.start.compareTo(l2.range.start)); - assert.strictEqual(target.toString(), link1.target && link1.target.toString()); - assertEqualRange(range, link1.range); + assert.strictEqual(link1.target && link1.target.toString(), target.toString()); + assertEqualRange(link1.range, range); - assert.strictEqual('http://a.com/', link2.target && link2.target.toString()); - assertEqualRange(new vscode.Range(new vscode.Position(0, 13), new vscode.Position(0, 25)), link2.range); + assert.strictEqual(link2.target && link2.target.toString(), 'http://a.com/'); + assertEqualRange(link2.range, new vscode.Range(new vscode.Position(0, 13), new vscode.Position(0, 25))); }); test('diagnostics & CodeActionProvider', async function () { diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index 8a5d124c8ef..d434bc7149c 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -347,7 +347,7 @@ import { assertNoRpc, poll } from '../utils'; suite('window.onDidWriteTerminalData', () => { test('should listen to all future terminal data events', (done) => { const openEvents: string[] = []; - const dataEvents: { name: string, data: string }[] = []; + const dataEvents: { name: string; data: string }[] = []; const closeEvents: string[] = []; disposables.push(window.onDidOpenTerminal(e => openEvents.push(e.name))); diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts index 6ca97ec932e..03d796e4e1d 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts @@ -113,7 +113,7 @@ suite('vscode API - webview', () => { `); await ready; - const firstResponse = await sendRecieveMessage(webview, { type: 'add' }); + const firstResponse = await sendReceiveMessage(webview, { type: 'add' }); assert.strictEqual(firstResponse.value, 1); // Swap away from the webview @@ -126,11 +126,11 @@ suite('vscode API - webview', () => { await ready2; // We should still have old state - const secondResponse = await sendRecieveMessage(webview, { type: 'get' }); + const secondResponse = await sendReceiveMessage(webview, { type: 'get' }); assert.strictEqual(secondResponse.value, 1); }); - test('webviews should preserve their context when they are moved between view columns', async () => { + test.skip('webviews should preserve their context when they are moved between view columns', async () => { // TODO@mjbvz https://github.com/microsoft/vscode/issues/141001 const doc = await vscode.workspace.openTextDocument(testDocument); await vscode.window.showTextDocument(doc, vscode.ViewColumn.One); @@ -140,14 +140,14 @@ suite('vscode API - webview', () => { webview.webview.html = statefulWebviewHtml; await ready; - const firstResponse = await sendRecieveMessage(webview, { type: 'add' }); + const firstResponse = await sendReceiveMessage(webview, { type: 'add' }); assert.strictEqual(firstResponse.value, 1); // Now move webview to new view column webview.reveal(vscode.ViewColumn.Two); // We should still have old state - const secondResponse = await sendRecieveMessage(webview, { type: 'get' }); + const secondResponse = await sendReceiveMessage(webview, { type: 'get' }); assert.strictEqual(secondResponse.value, 1); }); @@ -160,7 +160,7 @@ suite('vscode API - webview', () => { webview.webview.html = statefulWebviewHtml; await ready; - const firstResponse = await sendRecieveMessage(webview, { type: 'add' }); + const firstResponse = await sendReceiveMessage(webview, { type: 'add' }); assert.strictEqual((await firstResponse).value, 1); // Swap away from the webview @@ -171,7 +171,7 @@ suite('vscode API - webview', () => { webview.reveal(vscode.ViewColumn.One); // We should still have old state - const secondResponse = await sendRecieveMessage(webview, { type: 'get' }); + const secondResponse = await sendReceiveMessage(webview, { type: 'get' }); assert.strictEqual(secondResponse.value, 1); }); @@ -211,7 +211,7 @@ suite('vscode API - webview', () => { webview.reveal(vscode.ViewColumn.One); // We should still have old scroll pos - const secondResponse = await sendRecieveMessage(webview, { type: 'get' }); + const secondResponse = await sendReceiveMessage(webview, { type: 'get' }); assert.strictEqual(Math.round(secondResponse.value), 100); }); @@ -222,7 +222,7 @@ suite('vscode API - webview', () => { webview.webview.html = statefulWebviewHtml; await ready; - const firstResponse = await sendRecieveMessage(webview, { type: 'add' }); + const firstResponse = await sendReceiveMessage(webview, { type: 'add' }); assert.strictEqual((await firstResponse).value, 1); // Swap away from the webview @@ -230,14 +230,14 @@ suite('vscode API - webview', () => { await vscode.window.showTextDocument(doc); // Try posting a message to our hidden webview - const secondResponse = await sendRecieveMessage(webview, { type: 'add' }); + const secondResponse = await sendReceiveMessage(webview, { type: 'add' }); assert.strictEqual((await secondResponse).value, 2); // Now show webview again webview.reveal(vscode.ViewColumn.One); // We should still have old state - const thirdResponse = await sendRecieveMessage(webview, { type: 'get' }); + const thirdResponse = await sendReceiveMessage(webview, { type: 'get' }); assert.strictEqual(thirdResponse.value, 2); }); @@ -277,29 +277,29 @@ suite('vscode API - webview', () => { { const imagePath = webview.webview.asWebviewUri(workspaceFile('image.png')); - const response = await sendRecieveMessage(webview, { src: imagePath.toString() }); + const response = await sendReceiveMessage(webview, { src: imagePath.toString() }); assert.strictEqual(response.value, true); } // { // // #102188. Resource filename containing special characters like '%', '#', '?'. // const imagePath = webview.webview.asWebviewUri(workspaceFile('image%02.png')); - // const response = await sendRecieveMessage(webview, { src: imagePath.toString() }); + // const response = await sendReceiveMessage(webview, { src: imagePath.toString() }); // assert.strictEqual(response.value, true); // } // { // // #102188. Resource filename containing special characters like '%', '#', '?'. // const imagePath = webview.webview.asWebviewUri(workspaceFile('image%.png')); - // const response = await sendRecieveMessage(webview, { src: imagePath.toString() }); + // const response = await sendReceiveMessage(webview, { src: imagePath.toString() }); // assert.strictEqual(response.value, true); // } { const imagePath = webview.webview.asWebviewUri(workspaceFile('no-such-image.png')); - const response = await sendRecieveMessage(webview, { src: imagePath.toString() }); + const response = await sendReceiveMessage(webview, { src: imagePath.toString() }); assert.strictEqual(response.value, false); } { const imagePath = webview.webview.asWebviewUri(workspaceFile('..', '..', '..', 'resources', 'linux', 'code.png')); - const response = await sendRecieveMessage(webview, { src: imagePath.toString() }); + const response = await sendReceiveMessage(webview, { src: imagePath.toString() }); assert.strictEqual(response.value, false); } }); @@ -323,11 +323,11 @@ suite('vscode API - webview', () => { `); { - const response = sendRecieveMessage(webview, { src: webview.webview.asWebviewUri(workspaceFile('sub', 'image.png')).toString() }); + const response = sendReceiveMessage(webview, { src: webview.webview.asWebviewUri(workspaceFile('sub', 'image.png')).toString() }); assert.strictEqual((await response).value, true); } { - const response = sendRecieveMessage(webview, { src: webview.webview.asWebviewUri(workspaceFile('image.png')).toString() }); + const response = sendReceiveMessage(webview, { src: webview.webview.asWebviewUri(workspaceFile('image.png')).toString() }); assert.strictEqual((await response).value, false); } }); @@ -357,7 +357,7 @@ suite('vscode API - webview', () => { // Firefox service workers never seem to get any 'fetch' requests here. Other browsers work fine return; } - const firstResponse = await sendRecieveMessage(webview, { src: imagePath.toString() }); + const firstResponse = await sendReceiveMessage(webview, { src: imagePath.toString() }); assert.strictEqual(firstResponse.value, true); }); @@ -574,7 +574,7 @@ function getMessage(webview: vscode.WebviewPanel): Promise { }); } -function sendRecieveMessage(webview: vscode.WebviewPanel, message: T): Promise { +function sendReceiveMessage(webview: vscode.WebviewPanel, message: T): Promise { const p = getMessage(webview); webview.webview.postMessage(message); return p; diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts index 2e374955f69..5e11d739cba 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts @@ -33,47 +33,49 @@ import { assertNoRpc } from '../utils'; }); suite('ShellExecution', () => { - test('Execution from onDidEndTaskProcess and onDidStartTaskProcess are equal to original', () => { - return new Promise(async (resolve) => { - const task = new Task({ type: 'testTask' }, TaskScope.Workspace, 'echo', 'testTask', new ShellExecution('echo', ['hello test'])); - let taskExecution: TaskExecution | undefined; - const executeDoneEvent: EventEmitter = new EventEmitter(); - const taskExecutionShouldBeSet: Promise = new Promise(resolve => { - const disposable = executeDoneEvent.event(() => { - resolve(); - disposable.dispose(); - }); + test('Execution from onDidEndTaskProcess and onDidStartTaskProcess are equal to original', async () => { + const executeDoneEvent: EventEmitter = new EventEmitter(); + const taskExecutionShouldBeSet: Promise = new Promise(resolve => { + const disposable = executeDoneEvent.event(() => { + resolve(); + disposable.dispose(); }); - let count = 2; - const progressMade: EventEmitter = new EventEmitter(); - let startSucceeded = false; - let endSucceeded = false; + }); + + const progressMade: EventEmitter = new EventEmitter(); + let count = 2; + let startSucceeded = false; + let endSucceeded = false; + const testDonePromise = new Promise(resolve => { disposables.push(progressMade.event(() => { count--; if ((count === 0) && startSucceeded && endSucceeded) { resolve(); } })); - - - disposables.push(tasks.onDidStartTaskProcess(async (e) => { - await taskExecutionShouldBeSet; - if (e.execution === taskExecution) { - startSucceeded = true; - progressMade.fire(); - } - })); - - disposables.push(tasks.onDidEndTaskProcess(async (e) => { - await taskExecutionShouldBeSet; - if (e.execution === taskExecution) { - endSucceeded = true; - progressMade.fire(); - } - })); - taskExecution = await tasks.executeTask(task); - executeDoneEvent.fire(); }); + + const task = new Task({ type: 'testTask' }, TaskScope.Workspace, 'echo', 'testTask', new ShellExecution('echo', ['hello test'])); + let taskExecution: TaskExecution | undefined; + + disposables.push(tasks.onDidStartTaskProcess(async (e) => { + await taskExecutionShouldBeSet; + if (e.execution === taskExecution) { + startSucceeded = true; + progressMade.fire(); + } + })); + + disposables.push(tasks.onDidEndTaskProcess(async (e) => { + await taskExecutionShouldBeSet; + if (e.execution === taskExecution) { + endSucceeded = true; + progressMade.fire(); + } + })); + taskExecution = await tasks.executeTask(task); + executeDoneEvent.fire(); + await testDonePromise; }); test('dependsOn task should start with a different processId (#118256)', async () => { @@ -294,86 +296,93 @@ import { assertNoRpc } from '../utils'; }); }); - test('A task can be fetched and executed (#100577)', () => { - return new Promise(async (resolve, reject) => { - class CustomTerminal implements Pseudoterminal { - private readonly writeEmitter = new EventEmitter(); - public readonly onDidWrite: Event = this.writeEmitter.event; - public async close(): Promise { } - private closeEmitter = new EventEmitter(); - onDidClose: Event = this.closeEmitter.event; - public open(): void { - this.closeEmitter.fire(); - resolve(); - } + test('A task can be fetched and executed (#100577)', async () => { + class CustomTerminal implements Pseudoterminal { + private readonly writeEmitter = new EventEmitter(); + public readonly onDidWrite: Event = this.writeEmitter.event; + public async close(): Promise { } + private closeEmitter = new EventEmitter(); + onDidClose: Event = this.closeEmitter.event; + private readonly _onDidOpen = new EventEmitter(); + public readonly onDidOpen = this._onDidOpen.event; + public open(): void { + this._onDidOpen.fire(); + this.closeEmitter.fire(); } + } - function buildTask(): Task { - const task = new Task( - { - type: 'customTesting', - }, - TaskScope.Workspace, - 'Test Task', - 'customTesting', - new CustomExecution( - async (): Promise => { - return new CustomTerminal(); - } - ) - ); - return task; - } - - disposables.push(tasks.registerTaskProvider('customTesting', { - provideTasks: () => { - return [buildTask()]; - }, - resolveTask(_task: Task): undefined { - return undefined; - } - })); - - const task = await tasks.fetchTasks({ type: 'customTesting' }); - - if (task && task.length > 0) { - await tasks.executeTask(task[0]); - } else { - reject('fetched task can\'t be undefined'); - } + const customTerminal = new CustomTerminal(); + const terminalOpenedPromise = new Promise(resolve => { + const disposable = customTerminal.onDidOpen(() => { + disposable.dispose(); + resolve(); + }); }); + + function buildTask(): Task { + const task = new Task( + { + type: 'customTesting', + }, + TaskScope.Workspace, + 'Test Task', + 'customTesting', + new CustomExecution( + async (): Promise => { + return customTerminal; + } + ) + ); + return task; + } + + disposables.push(tasks.registerTaskProvider('customTesting', { + provideTasks: () => { + return [buildTask()]; + }, + resolveTask(_task: Task): undefined { + return undefined; + } + })); + + + const task = await tasks.fetchTasks({ type: 'customTesting' }); + + if (task && task.length > 0) { + await tasks.executeTask(task[0]); + } else { + assert.fail('fetched task can\'t be undefined'); + } + await terminalOpenedPromise; }); - test('A task can be fetched with default task group information', () => { - return new Promise(async (resolve, reject) => { - // Add default to tasks.json since this is not possible using an API yet. - const tasksConfig = workspace.getConfiguration('tasks'); - await tasksConfig.update('version', '2.0.0', ConfigurationTarget.Workspace); - await tasksConfig.update('tasks', [ - { - label: 'Run this task', - type: 'shell', - command: 'sleep 1', - problemMatcher: [], - group: { - kind: 'build', - isDefault: 'true' - } + test('A task can be fetched with default task group information', async () => { + // Add default to tasks.json since this is not possible using an API yet. + const tasksConfig = workspace.getConfiguration('tasks'); + await tasksConfig.update('version', '2.0.0', ConfigurationTarget.Workspace); + await tasksConfig.update('tasks', [ + { + label: 'Run this task', + type: 'shell', + command: 'sleep 1', + problemMatcher: [], + group: { + kind: 'build', + isDefault: 'true' } - ], ConfigurationTarget.Workspace); - - const task = (await tasks.fetchTasks()); - - if (task && task.length > 0) { - const grp = task[0].group; - assert.strictEqual(grp?.isDefault, true); - resolve(); - } else { - reject('fetched task can\'t be undefined'); } - // Reset tasks.json - await tasksConfig.update('tasks', []); - }); + ], ConfigurationTarget.Workspace); + + const task = (await tasks.fetchTasks()); + + if (task && task.length > 0) { + const grp = task[0].group; + assert.strictEqual(grp?.isDefault, true); + } else { + assert.fail('fetched task can\'t be undefined'); + } + // Reset tasks.json + await tasksConfig.update('tasks', []); }); test('Tasks can be run back to back', async () => { diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.watcher.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.watcher.test.ts index 029951fc9b1..13041ce380b 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/workspace.watcher.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/workspace.watcher.test.ts @@ -12,7 +12,7 @@ suite('vscode API - workspace-watcher', () => { interface IWatchRequest { uri: vscode.Uri; - options: { recursive: boolean; excludes: string[] } + options: { recursive: boolean; excludes: string[] }; } class WatcherTestFs extends TestFS { diff --git a/extensions/vscode-api-tests/yarn.lock b/extensions/vscode-api-tests/yarn.lock index b54d6b48836..13c5c61dbd9 100644 --- a/extensions/vscode-api-tests/yarn.lock +++ b/extensions/vscode-api-tests/yarn.lock @@ -7,7 +7,7 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.0.tgz#3eb56d13a1de1d347ecb1957c6860c911704bc44" integrity sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== diff --git a/extensions/vscode-colorize-tests/package.json b/extensions/vscode-colorize-tests/package.json index b27439bf8b6..e2517c811f2 100644 --- a/extensions/vscode-colorize-tests/package.json +++ b/extensions/vscode-colorize-tests/package.json @@ -20,7 +20,7 @@ "jsonc-parser": "2.2.1" }, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "contributes": { "semanticTokenTypes": [ diff --git a/extensions/vscode-colorize-tests/test/colorize-fixtures/makefile b/extensions/vscode-colorize-tests/test/colorize-fixtures/makefile index 7720e43ae4d..3f77d04fa52 100644 --- a/extensions/vscode-colorize-tests/test/colorize-fixtures/makefile +++ b/extensions/vscode-colorize-tests/test/colorize-fixtures/makefile @@ -41,7 +41,7 @@ echo: @-./point-and-slash-should-not-be-highlighted define defined - $(info Checking existance of $(1) $(flavor $(1))) + $(info Checking existence of $(1) $(flavor $(1))) $(if $(filter undefined,$(flavor $(1))),0,1) endef diff --git a/extensions/vscode-colorize-tests/test/colorize-results/makefile.json b/extensions/vscode-colorize-tests/test/colorize-results/makefile.json index 2acfa87705a..4226a1306b2 100644 --- a/extensions/vscode-colorize-tests/test/colorize-results/makefile.json +++ b/extensions/vscode-colorize-tests/test/colorize-results/makefile.json @@ -1232,7 +1232,7 @@ } }, { - "c": " Checking existance of ", + "c": " Checking existence of ", "t": "source.makefile meta.scope.conditional.makefile string.interpolated.makefile meta.scope.function-call.makefile", "r": { "dark_plus": "string: #CE9178", @@ -3398,4 +3398,4 @@ "hc_black": "default: #FFFFFF" } } -] \ No newline at end of file +] diff --git a/extensions/vscode-colorize-tests/test/colorize-results/test_cs.json b/extensions/vscode-colorize-tests/test/colorize-results/test_cs.json index 546dc4a2e1c..3d512fb61a6 100644 --- a/extensions/vscode-colorize-tests/test/colorize-results/test_cs.json +++ b/extensions/vscode-colorize-tests/test/colorize-results/test_cs.json @@ -1552,13 +1552,13 @@ }, { "c": "List", - "t": "source.cs storage.type.cs", + "t": "source.cs entity.name.type.cs", "r": { - "dark_plus": "storage.type.cs: #4EC9B0", - "light_plus": "storage.type.cs: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.cs: #4EC9B0" + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1640,13 +1640,13 @@ }, { "c": "List", - "t": "source.cs storage.type.cs", + "t": "source.cs entity.name.type.cs", "r": { - "dark_plus": "storage.type.cs: #4EC9B0", - "light_plus": "storage.type.cs: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.cs: #4EC9B0" + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1794,13 +1794,13 @@ }, { "c": "List", - "t": "source.cs storage.type.cs", + "t": "source.cs entity.name.type.cs", "r": { - "dark_plus": "storage.type.cs: #4EC9B0", - "light_plus": "storage.type.cs: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.cs: #4EC9B0" + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1882,13 +1882,13 @@ }, { "c": "List", - "t": "source.cs storage.type.cs", + "t": "source.cs entity.name.type.cs", "r": { - "dark_plus": "storage.type.cs: #4EC9B0", - "light_plus": "storage.type.cs: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.cs: #4EC9B0" + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2003,13 +2003,13 @@ }, { "c": "List", - "t": "source.cs storage.type.cs", + "t": "source.cs entity.name.type.cs", "r": { - "dark_plus": "storage.type.cs: #4EC9B0", - "light_plus": "storage.type.cs: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.cs: #4EC9B0" + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" } }, { diff --git a/extensions/vscode-colorize-tests/test/colorize-results/test_lua.json b/extensions/vscode-colorize-tests/test/colorize-results/test_lua.json index 16117e5a94a..634986f9090 100644 --- a/extensions/vscode-colorize-tests/test/colorize-results/test_lua.json +++ b/extensions/vscode-colorize-tests/test/colorize-results/test_lua.json @@ -89,7 +89,7 @@ }, { "c": "(", - "t": "source.lua meta.function.lua punctuation.definition.parameters.begin.lua", + "t": "source.lua meta.function.lua meta.parameter.lua punctuation.definition.parameters.begin.lua", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -100,7 +100,7 @@ }, { "c": "n", - "t": "source.lua meta.function.lua variable.parameter.function.lua", + "t": "source.lua meta.function.lua meta.parameter.lua variable.parameter.function.lua", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -111,7 +111,7 @@ }, { "c": ")", - "t": "source.lua meta.function.lua punctuation.definition.parameters.end.lua", + "t": "source.lua meta.function.lua meta.parameter.lua punctuation.definition.parameters.finish.lua", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -143,7 +143,29 @@ } }, { - "c": " n ", + "c": " ", + "t": "source.lua", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "n", + "t": "source.lua variable.other.lua", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", "t": "source.lua", "r": { "dark_plus": "default: #D4D4D4", @@ -177,7 +199,7 @@ }, { "c": "0", - "t": "source.lua constant.numeric.integer.lua", + "t": "source.lua constant.numeric.float.lua", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #098658", @@ -243,7 +265,7 @@ }, { "c": "1", - "t": "source.lua constant.numeric.integer.lua", + "t": "source.lua constant.numeric.float.lua", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #098658", @@ -297,7 +319,29 @@ } }, { - "c": " n ", + "c": " ", + "t": "source.lua", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "n", + "t": "source.lua variable.other.lua", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", "t": "source.lua", "r": { "dark_plus": "default: #D4D4D4", @@ -331,17 +375,17 @@ }, { "c": "fact", - "t": "source.lua support.function.any-method.lua", + "t": "source.lua entity.name.function.lua", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "support.function: #DCDCAA" + "hc_black": "entity.name.function: #DCDCAA" } }, { - "c": "(n", + "c": "(", "t": "source.lua", "r": { "dark_plus": "default: #D4D4D4", @@ -351,6 +395,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "n", + "t": "source.lua variable.other.lua", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, { "c": "-", "t": "source.lua keyword.operator.lua", @@ -364,7 +419,7 @@ }, { "c": "1", - "t": "source.lua constant.numeric.integer.lua", + "t": "source.lua constant.numeric.float.lua", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #098658", @@ -506,7 +561,29 @@ } }, { - "c": " a ", + "c": " ", + "t": "source.lua", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "a", + "t": "source.lua variable.other.lua", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", "t": "source.lua", "r": { "dark_plus": "default: #D4D4D4", @@ -661,17 +738,39 @@ }, { "c": "fact", - "t": "source.lua support.function.any-method.lua", + "t": "source.lua entity.name.function.lua", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "support.function: #DCDCAA" + "hc_black": "entity.name.function: #DCDCAA" } }, { - "c": "(a))", + "c": "(", + "t": "source.lua", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "a", + "t": "source.lua variable.other.lua", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": "))", "t": "source.lua", "r": { "dark_plus": "default: #D4D4D4", @@ -681,4 +780,4 @@ "hc_black": "default: #FFFFFF" } } -] +] \ No newline at end of file diff --git a/extensions/vscode-colorize-tests/yarn.lock b/extensions/vscode-colorize-tests/yarn.lock index 15725cff502..44d4327771e 100644 --- a/extensions/vscode-colorize-tests/yarn.lock +++ b/extensions/vscode-colorize-tests/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== jsonc-parser@2.2.1: version "2.2.1" diff --git a/extensions/vscode-custom-editor-tests/package.json b/extensions/vscode-custom-editor-tests/package.json index 778f5c56cf0..1a17bd5d6cb 100644 --- a/extensions/vscode-custom-editor-tests/package.json +++ b/extensions/vscode-custom-editor-tests/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@types/mocha": "^8.2.0", - "@types/node": "14.x", + "@types/node": "16.x", "@types/p-limit": "^2.2.0" }, "contributes": { diff --git a/extensions/vscode-custom-editor-tests/src/test/customEditor.test.ts b/extensions/vscode-custom-editor-tests/src/test/customEditor.test.ts index 3474de57425..7fc68f61c02 100644 --- a/extensions/vscode-custom-editor-tests/src/test/customEditor.test.ts +++ b/extensions/vscode-custom-editor-tests/src/test/customEditor.test.ts @@ -21,7 +21,7 @@ const commands = Object.freeze({ undo: 'undo', }); -async function writeRandomFile(options: { ext: string; contents: string; }): Promise { +async function writeRandomFile(options: { ext: string; contents: string }): Promise { const fakeFile = randomFilePath({ root: testWorkspaceRoot, ext: options.ext }); await fs.promises.writeFile(fakeFile.fsPath, Buffer.from(options.contents)); return fakeFile; diff --git a/extensions/vscode-custom-editor-tests/src/test/utils.ts b/extensions/vscode-custom-editor-tests/src/test/utils.ts index 7ed2afcaca3..80d2eea16a4 100644 --- a/extensions/vscode-custom-editor-tests/src/test/utils.ts +++ b/extensions/vscode-custom-editor-tests/src/test/utils.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; -export function randomFilePath(args: { root: vscode.Uri, ext: string }): vscode.Uri { +export function randomFilePath(args: { root: vscode.Uri; ext: string }): vscode.Uri { const fileName = rndName(); return vscode.Uri.joinPath(args.root, fileName + args.ext); } diff --git a/extensions/vscode-custom-editor-tests/yarn.lock b/extensions/vscode-custom-editor-tests/yarn.lock index 52588b92820..2943060a078 100644 --- a/extensions/vscode-custom-editor-tests/yarn.lock +++ b/extensions/vscode-custom-editor-tests/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/p-limit@^2.2.0": version "2.2.0" diff --git a/extensions/vscode-notebook-tests/package.json b/extensions/vscode-notebook-tests/package.json index 3cf93067634..e0a672ca179 100644 --- a/extensions/vscode-notebook-tests/package.json +++ b/extensions/vscode-notebook-tests/package.json @@ -33,7 +33,7 @@ }, "dependencies": {}, "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "contributes": { "commands": [ diff --git a/extensions/vscode-notebook-tests/src/utils.ts b/extensions/vscode-notebook-tests/src/utils.ts index 0adaf940ea9..9aad81fbf89 100644 --- a/extensions/vscode-notebook-tests/src/utils.ts +++ b/extensions/vscode-notebook-tests/src/utils.ts @@ -82,7 +82,7 @@ export class TestFS implements vscode.FileSystemProvider { throw vscode.FileSystemError.FileNotFound(); } - writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void { + writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean; overwrite: boolean }): void { const basename = path.posix.basename(uri.path); const parent = this._lookupParentDirectory(uri); let entry = parent.entries.get(basename); diff --git a/extensions/vscode-notebook-tests/yarn.lock b/extensions/vscode-notebook-tests/yarn.lock index 995b2c2f8b3..e724e7fffa3 100644 --- a/extensions/vscode-notebook-tests/yarn.lock +++ b/extensions/vscode-notebook-tests/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== diff --git a/extensions/vscode-test-resolver/package.json b/extensions/vscode-test-resolver/package.json index 37fdefbfe2a..da90e7e3809 100644 --- a/extensions/vscode-test-resolver/package.json +++ b/extensions/vscode-test-resolver/package.json @@ -32,7 +32,7 @@ ], "main": "./out/extension", "devDependencies": { - "@types/node": "14.x" + "@types/node": "16.x" }, "capabilities": { "untrustedWorkspaces": { diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts index 6c9c6d3087e..4a6b1b202d3 100644 --- a/extensions/vscode-test-resolver/src/extension.ts +++ b/extensions/vscode-test-resolver/src/extension.ts @@ -85,28 +85,23 @@ export function activate(context: vscode.ExtensionContext) { const { updateUrl, commit, quality, serverDataFolderName, serverApplicationName, dataFolderName } = getProductConfiguration(); const commandArgs = ['--host=127.0.0.1', '--port=0', '--disable-telemetry', '--use-host-proxy', '--accept-server-license-terms']; const env = getNewEnv(); - const remoteDataDir = process.env['TESTRESOLVER_DATA_FOLDER'] || path.join(os.homedir(), serverDataFolderName || `${dataFolderName}-testresolver`); + const remoteDataDir = process.env['TESTRESOLVER_DATA_FOLDER'] || path.join(os.homedir(), `${serverDataFolderName || dataFolderName}-testresolver`); const logsDir = process.env['TESTRESOLVER_LOGS_FOLDER']; if (logsDir) { commandArgs.push('--logsPath', logsDir); } - env['VSCODE_AGENT_FOLDER'] = remoteDataDir; outputChannel.appendLine(`Using data folder at ${remoteDataDir}`); + commandArgs.push('--server-data-dir', remoteDataDir); - const connectionTokenFile = path.join(remoteDataDir, `${process.pid}-${new Date().getTime()}.token`); - if (!fs.existsSync(remoteDataDir)) { - fs.mkdirSync(remoteDataDir, { recursive: true }); - } - fs.writeFileSync(connectionTokenFile, connectionToken); - commandArgs.push('--connection-token-file', connectionTokenFile); + commandArgs.push('--connection-token', connectionToken); if (!commit) { // dev mode const serverCommand = process.platform === 'win32' ? 'code-server.bat' : 'code-server.sh'; const vscodePath = path.resolve(path.join(context.extensionPath, '..', '..')); - const serverCommandPath = path.join(vscodePath, 'resources', 'server', 'bin-dev', serverCommand); + const serverCommandPath = path.join(vscodePath, 'scripts', serverCommand); - outputChannel.appendLine(`Launching server: VSCODE_AGENT_FOLDER="${remoteDataDir}" "${serverCommandPath}" ${commandArgs.join(' ')}`); + outputChannel.appendLine(`Launching server: "${serverCommandPath}" ${commandArgs.join(' ')}`); extHostProcess = cp.spawn(serverCommandPath, commandArgs, { env, cwd: vscodePath }); } else { @@ -143,11 +138,6 @@ export function activate(context: vscode.ExtensionContext) { if (extHostProcess) { terminateProcess(extHostProcess, context.extensionPath); } - try { - fs.unlinkSync(connectionTokenFile); - } catch (_e) { - //ignore - } } }); }); @@ -354,7 +344,7 @@ export function activate(context: vscode.ExtensionContext) { vscode.commands.executeCommand('setContext', 'forwardedPortsViewEnabled', true); } -type ActionItem = (vscode.MessageItem & { execute: () => void; }); +type ActionItem = (vscode.MessageItem & { execute: () => void }); function getActions(): ActionItem[] { const actions: ActionItem[] = []; @@ -428,7 +418,7 @@ async function tunnelFactory(tunnelOptions: vscode.TunnelOptions, tunnelCreation return createTunnelService(); - function newTunnel(localAddress: { host: string, port: number }): vscode.Tunnel { + function newTunnel(localAddress: { host: string; port: number }): vscode.Tunnel { const onDidDispose: vscode.EventEmitter = new vscode.EventEmitter(); let isDisposed = false; return { diff --git a/extensions/vscode-test-resolver/src/util/processes.ts b/extensions/vscode-test-resolver/src/util/processes.ts index 3bc12725522..f16d0678c52 100644 --- a/extensions/vscode-test-resolver/src/util/processes.ts +++ b/extensions/vscode-test-resolver/src/util/processes.ts @@ -16,14 +16,14 @@ export function terminateProcess(p: cp.ChildProcess, extensionPath: string): Ter const options: any = { stdio: ['pipe', 'pipe', 'ignore'] }; - cp.execFileSync('taskkill', ['/T', '/F', '/PID', p.pid.toString()], options); + cp.execFileSync('taskkill', ['/T', '/F', '/PID', p.pid!.toString()], options); } catch (err) { return { success: false, error: err }; } } else if (process.platform === 'darwin' || process.platform === 'linux') { try { const cmd = path.join(extensionPath, 'scripts', 'terminateProcess.sh'); - const result = cp.spawnSync(cmd, [p.pid.toString()]); + const result = cp.spawnSync(cmd, [p.pid!.toString()]); if (result.error) { return { success: false, error: result.error }; } diff --git a/extensions/vscode-test-resolver/yarn.lock b/extensions/vscode-test-resolver/yarn.lock index 995b2c2f8b3..e724e7fffa3 100644 --- a/extensions/vscode-test-resolver/yarn.lock +++ b/extensions/vscode-test-resolver/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== diff --git a/extensions/yarn.lock b/extensions/yarn.lock index 131cac52096..f631f0a77bd 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -24,10 +24,10 @@ fast-plist@0.1.2: resolved "https://registry.yarnpkg.com/fast-plist/-/fast-plist-0.1.2.tgz#a45aff345196006d406ca6cdcd05f69051ef35b8" integrity sha1-pFr/NFGWAG1AbKbNzQX2kFHvNbg= -typescript@4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" - integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== +typescript@^4.6.0-dev.20220208: + version "4.6.0-dev.20220208" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.0-dev.20220208.tgz#24a0371626f614f7805fb326bc6a4229eb81e630" + integrity sha512-2yfS4UYfkLnpVkjs2IEl7T++ojqdPiV5S/akYv1trTf50TZHmGnyhF5Umo2iLWZEuSDmBCe2K52x5qzBXDi+mQ== vscode-grammar-updater@^1.0.3: version "1.0.3" diff --git a/package.json b/package.json index 90ceabae395..a11f27446a5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", - "version": "1.64.0", - "distro": "2f8cd32bd3ccb8db0b208794ccd3a873f7b75192", + "version": "1.65.0", + "distro": "8922d59448b923922cbc9f0fa0a065fe35a6807f", "author": { "name": "Microsoft Corporation" }, @@ -9,8 +9,9 @@ "main": "./out/main", "private": true, "scripts": { - "test": "mocha", - "test-browser": "node test/unit/browser/index.js", + "test": "echo Please run any of the test scripts from the scripts folder.", + "test-browser": "npx playwright install && node test/unit/browser/index.js", + "test-browser-no-install": "node test/unit/browser/index.js", "test-node": "mocha test/unit/node/index.js --delay --ui=tdd --exit", "preinstall": "node build/npm/preinstall.js", "postinstall": "node build/npm/postinstall.js", @@ -34,7 +35,7 @@ "7z": "7z", "update-grammars": "node build/npm/update-all-grammars.js", "update-localization-extension": "node build/npm/update-localization-extension.js", - "smoketest": "cd test/smoke && yarn compile && node test/index.js", + "smoketest": "node build/lib/preLaunch.js && cd test/smoke && yarn compile && node test/index.js", "smoketest-no-compile": "cd test/smoke && node test/index.js", "download-builtin-extensions": "node build/lib/builtInExtensions.js", "download-builtin-extensions-cg": "node build/lib/builtInExtensionsCG.js", @@ -43,14 +44,13 @@ "vscode-dts-compile-check": "tsc -p src/tsconfig.vscode-dts.json && tsc -p src/tsconfig.vscode-proposed-dts.json", "valid-layers-check": "node build/lib/layersChecker.js", "update-distro": "node build/npm/update-distro.js", - "web": "node resources/web/code-web.js", + "web": "echo 'yarn web' is replaced by './scripts/code-server' or './scripts/code-web'", "compile-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-web", "watch-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js watch-web", "eslint": "node build/eslint", "playwright-install": "node build/azure-pipelines/common/installPlaywright.js", "compile-build": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-build", "compile-extensions-build": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-extensions-build", - "compile-integration-tests": "tsc -p test/integration/browser", "minify-vscode": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js minify-vscode", "minify-vscode-reh": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js minify-vscode-reh", "minify-vscode-reh-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js minify-vscode-reh-web", @@ -64,7 +64,7 @@ "@vscode/debugprotocol": "1.51.0", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/ripgrep": "^1.14.1", - "@vscode/sqlite3": "4.0.12", + "@vscode/sqlite3": "5.0.7", "@vscode/sudo-prompt": "9.3.1", "@vscode/vscode-languagedetection": "1.0.21", "applicationinsights": "1.4.2", @@ -82,21 +82,21 @@ "tas-client-umd": "0.1.4", "v8-inspect-profiler": "^0.1.0", "vscode-oniguruma": "1.6.1", - "vscode-proxy-agent": "^0.11.0", + "vscode-proxy-agent": "^0.12.0", "vscode-regexpp": "^3.1.0", "vscode-textmate": "6.0.0", - "xterm": "4.17.0-beta.7", - "xterm-addon-search": "0.9.0-beta.8", - "xterm-addon-serialize": "0.7.0-beta.6", - "xterm-addon-unicode11": "0.4.0-beta.1", - "xterm-addon-webgl": "0.12.0-beta.21", - "xterm-headless": "4.17.0-beta.7", + "xterm": "4.18.0-beta.2", + "xterm-addon-search": "0.9.0-beta.10", + "xterm-addon-serialize": "0.7.0-beta.8", + "xterm-addon-unicode11": "0.4.0-beta.3", + "xterm-addon-webgl": "0.12.0-beta.24", + "xterm-headless": "4.18.0-beta.2", "yauzl": "^2.9.2", "yazl": "^2.4.3" }, "devDependencies": { "7zip": "0.0.6", - "@playwright/test": "1.18.0-rc1", + "@playwright/test": "1.18.0", "@types/applicationinsights": "0.20.0", "@types/cookie": "^0.3.3", "@types/copy-webpack-plugin": "^6.0.3", @@ -109,31 +109,34 @@ "@types/keytar": "^4.4.0", "@types/minimist": "^1.2.1", "@types/mocha": "^8.2.0", - "@types/node": "14.x", + "@types/node": "16.x", "@types/sinon": "^10.0.2", "@types/sinon-test": "^2.4.2", "@types/trusted-types": "^1.0.6", "@types/webpack": "^4.41.25", - "@types/wicg-file-system-access": "^2020.9.2", + "@types/wicg-file-system-access": "^2020.9.5", "@types/windows-foreground-love": "^0.3.0", "@types/windows-mutex": "^0.4.0", "@types/windows-process-tree": "^0.2.0", "@types/winreg": "^1.2.30", "@types/yauzl": "^2.9.1", "@types/yazl": "^2.4.2", - "@typescript-eslint/eslint-plugin": "3.2.0", - "@typescript-eslint/parser": "^3.3.0", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", + "@vscode/telemetry-extractor": "^1.9.5", + "@vscode/test-web": "^0.0.22", "ansi-colors": "^3.2.3", "asar": "^3.0.3", "chromium-pickle-js": "^0.2.0", + "cookie": "^0.4.0", "copy-webpack-plugin": "^6.0.3", "cson-parser": "^1.3.3", "css-loader": "^3.2.0", "cssnano": "^4.1.11", "debounce": "^1.0.0", "deemon": "^1.4.0", - "electron": "13.5.1", - "eslint": "6.8.0", + "electron": "16.0.8", + "eslint": "8.7.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-jsdoc": "^19.1.0", "event-stream": "3.3.4", @@ -205,7 +208,6 @@ "vinyl": "^2.0.0", "vinyl-fs": "^3.0.0", "vscode-nls-dev": "^3.3.1", - "vscode-telemetry-extractor": "^1.9.5", "webpack": "^5.42.0", "webpack-cli": "^4.7.2", "webpack-stream": "^6.1.2", @@ -229,4 +231,4 @@ "elliptic": "^6.5.3", "nwmatcher": "^1.4.4" } -} \ No newline at end of file +} diff --git a/product.json b/product.json index 8432c4ba44c..0551d56904a 100644 --- a/product.json +++ b/product.json @@ -10,6 +10,7 @@ "serverLicense": [], "serverLicensePrompt": "", "serverApplicationName": "code-server-oss", + "serverDataFolderName": ".vscode-server-oss", "win32DirName": "Microsoft Code OSS", "win32NameVersion": "Microsoft Code OSS", "win32RegValueName": "CodeOSS", @@ -66,7 +67,7 @@ }, { "name": "ms-vscode.js-debug", - "version": "1.62.0", + "version": "1.64.3", "repo": "https://github.com/microsoft/vscode-js-debug", "metadata": { "id": "25629058-ddac-4e17-abba-74678e126c5d", diff --git a/remote/.yarnrc b/remote/.yarnrc index bce4202aea7..7ed92313214 100644 --- a/remote/.yarnrc +++ b/remote/.yarnrc @@ -1,3 +1,4 @@ disturl "http://nodejs.org/dist" -target "14.16.0" +target "16.9.1" runtime "node" +build_from_source "true" diff --git a/remote/package.json b/remote/package.json index 85942f951a8..4f6bcaa001c 100644 --- a/remote/package.json +++ b/remote/package.json @@ -14,27 +14,27 @@ "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.3", "jschardet": "3.0.0", - "minimist": "^1.2.5", "keytar": "7.6.0", + "minimist": "^1.2.5", "native-watchdog": "1.3.0", "node-pty": "0.11.0-beta11", "spdlog": "^0.13.0", "tas-client-umd": "0.1.4", "vscode-oniguruma": "1.6.1", - "vscode-proxy-agent": "^0.11.0", + "vscode-proxy-agent": "^0.12.0", "vscode-regexpp": "^3.1.0", "vscode-textmate": "6.0.0", - "xterm": "4.17.0-beta.7", - "xterm-addon-search": "0.9.0-beta.8", - "xterm-addon-serialize": "0.7.0-beta.6", - "xterm-addon-unicode11": "0.4.0-beta.1", - "xterm-addon-webgl": "0.12.0-beta.21", - "xterm-headless": "4.17.0-beta.7", + "xterm": "4.18.0-beta.2", + "xterm-addon-search": "0.9.0-beta.10", + "xterm-addon-serialize": "0.7.0-beta.8", + "xterm-addon-unicode11": "0.4.0-beta.3", + "xterm-addon-webgl": "0.12.0-beta.24", + "xterm-headless": "4.18.0-beta.2", "yauzl": "^2.9.2", "yazl": "^2.4.3" }, "optionalDependencies": { - "vscode-windows-registry": "1.0.4", + "@vscode/windows-registry": "1.0.5", "windows-process-tree": "^0.3.2" } } diff --git a/remote/web/package.json b/remote/web/package.json index d3d15a76f1c..1145c7ca05a 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -10,9 +10,9 @@ "tas-client-umd": "0.1.4", "vscode-oniguruma": "1.6.1", "vscode-textmate": "6.0.0", - "xterm": "4.17.0-beta.7", - "xterm-addon-search": "0.9.0-beta.8", - "xterm-addon-unicode11": "0.4.0-beta.1", - "xterm-addon-webgl": "0.12.0-beta.21" + "xterm": "4.18.0-beta.2", + "xterm-addon-search": "0.9.0-beta.10", + "xterm-addon-unicode11": "0.4.0-beta.3", + "xterm-addon-webgl": "0.12.0-beta.24" } } diff --git a/remote/web/yarn.lock b/remote/web/yarn.lock index d316b5c9411..2fdc5732cc5 100644 --- a/remote/web/yarn.lock +++ b/remote/web/yarn.lock @@ -113,22 +113,22 @@ vscode-textmate@6.0.0: resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210" integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ== -xterm-addon-search@0.9.0-beta.8: - version "0.9.0-beta.8" - resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.8.tgz#b3cbe364e24ea5765c36cba47c78a14acbe69062" - integrity sha512-FCv5zo6BVc7DaG3kLEOskKDCns7y2fRHqmZDrSmyfCd1lPmm9OA3UYdxZy5BtNkn6bc8amwpB7J2bIdu8VV7Qg== +xterm-addon-search@0.9.0-beta.10: + version "0.9.0-beta.10" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.10.tgz#80677a5e105d4410feae92b90fcdd5b538067070" + integrity sha512-fxKwbsu+ZNgZ689sAX1PHhWAW+8/abAGD8B7SMWwelKhJmbRybHoaLAYCeUrZJlJHljwjgW3Ptk7OpONNydh1A== -xterm-addon-unicode11@0.4.0-beta.1: - version "0.4.0-beta.1" - resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.1.tgz#aeefd26e87bad15d8dfd8a1e0b804fe408c9b882" - integrity sha512-pG8mpxnqpYDry0e20vuEFKhd4kKIcLLNwdNftNvfo+R/EjYRnTYnF+H8L+7eQHq6hqDH61xCEP4H4qR2CyT4pg== +xterm-addon-unicode11@0.4.0-beta.3: + version "0.4.0-beta.3" + resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" + integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== -xterm-addon-webgl@0.12.0-beta.21: - version "0.12.0-beta.21" - resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.21.tgz#8c476d25ec40b7535dedbd87b9cdf5eeeb41fc93" - integrity sha512-aeZcjxbtPfkVutNnXqCv9E5V4DoYecUFztWOjBzI/dgC1xfMOMVWzsymK9H1EUfd6u0ymEIeOjvX9bHsXNUzdA== +xterm-addon-webgl@0.12.0-beta.24: + version "0.12.0-beta.24" + resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.24.tgz#5c17256933991856554c95c9bd1eaab42e9727a0" + integrity sha512-+wZxKReEOlfN9JRHyikoffA6Do61/THR7QY35ajkQo0lLutKr6hTd/TLTuZh0PhFVelgTgudpXqlP++Lc0WFIA== -xterm@4.17.0-beta.7: - version "4.17.0-beta.7" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.17.0-beta.7.tgz#c11d52403a8d6456b92f2086e1797c64018328d6" - integrity sha512-FhC12WUljy8pTWr0oquVE0U567H1ZPAREKkN+wWLSZODNJwc8/txP2Ajg9byG++bkxfBP3CNEmDzaP0hoall8Q== +xterm@4.18.0-beta.2: + version "4.18.0-beta.2" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.18.0-beta.2.tgz#50e0de2ebe22fd1600e6d7fbc78136a843bb4c1d" + integrity sha512-fzsSI0xL3HuWBuw5o3xPcR8/R8tTpSd60hHtf0Z2ZrIXDRdniJMw+StOv/xZNp2CUY6LcSiF9MmM0ylgiLHbdw== diff --git a/remote/yarn.lock b/remote/yarn.lock index 8161461200c..a3c7e842a41 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -114,6 +114,11 @@ resolved "https://registry.yarnpkg.com/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz#89b48f293f6aa3341bb888c1118d16ff13b032d3" integrity sha512-zSUH9HYCw5qsCtd7b31yqkpaCU6jhtkKLkvOOA8yTrIRfBSOFb8PPhgmMicD7B/m+t4PwOJXzU1XDtrM9Fd3/g== +"@vscode/windows-registry@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@vscode/windows-registry/-/windows-registry-1.0.5.tgz#a6c463ac123ee7b23f9b90935aea086a97a778dc" + integrity sha512-xEA/L3ki8qMSer3hwdm590G43YCjpMb7evqS5aSPFFAhAYepvVr12/szKFgx1v1aQHOcR2riWg5YqBLajOZoaw== + agent-base@4: version "4.2.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" @@ -264,11 +269,6 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -data-uri-to-buffer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== - debug@3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -372,33 +372,11 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -file-uri-to-path@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" - integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -ftp@^0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -413,18 +391,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -get-uri@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" - integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== - dependencies: - "@tootallnate/once" "1" - data-uri-to-buffer "3" - debug "4" - file-uri-to-path "2" - fs-extra "^8.1.0" - ftp "^0.3.10" - github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" @@ -435,11 +401,6 @@ graceful-fs@4.2.8: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -491,7 +452,7 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -518,11 +479,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -533,13 +489,6 @@ jschardet@3.0.0: resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - keytar@7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.6.0.tgz#498e796443cb543d31722099443f29d7b5c44100" @@ -708,16 +657,6 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@^2.0.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -850,11 +789,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -914,11 +848,6 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -929,15 +858,14 @@ vscode-oniguruma@1.6.1: resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz#2bf4dfcfe3dd2e56eb549a3068c8ee39e6c30ce5" integrity sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ== -vscode-proxy-agent@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.11.0.tgz#9dc8d2bb9d448f1e33bb1caef97a741289660f2f" - integrity sha512-Y5mHjDGq/OKOvKG0IwCYfj25cvQ2cLEil8ce8n55IZHRAP9RF3e1sKU4ZUNDB8X2NIpKwyltrWpK9tFFE/kc3g== +vscode-proxy-agent@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.12.0.tgz#0775f464b9519b0c903da4dcf50851e1453f4e48" + integrity sha512-jS7950hE9Kq6T18vYewVl0N9acEBD3d+scbPew2Nti7d61THBrhVF9FQjc8TLfrUZ//UzzOFO8why+F0kHDdNw== dependencies: "@tootallnate/once" "^1.1.2" agent-base "^6.0.2" debug "^4.3.1" - get-uri "^3.0.2" http-proxy-agent "^4.0.1" https-proxy-agent "^5.0.0" socks-proxy-agent "^5.0.0" @@ -961,11 +889,6 @@ vscode-windows-ca-certs@^0.3.0: dependencies: node-addon-api "^3.0.2" -vscode-windows-registry@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vscode-windows-registry/-/vscode-windows-registry-1.0.4.tgz#9e565a497c84b6b82d200f88930baeff12912079" - integrity sha512-vjYaMzEygZrb8bN6I33XTajpF/gtDOk5CtQPPSaxanXg2kkrerEM9qovY6t6FtBGl3oLq6YHytYdYw4IpXgJdA== - wide-align@^1.1.0: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -985,40 +908,35 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= +xterm-addon-search@0.9.0-beta.10: + version "0.9.0-beta.10" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.10.tgz#80677a5e105d4410feae92b90fcdd5b538067070" + integrity sha512-fxKwbsu+ZNgZ689sAX1PHhWAW+8/abAGD8B7SMWwelKhJmbRybHoaLAYCeUrZJlJHljwjgW3Ptk7OpONNydh1A== -xterm-addon-search@0.9.0-beta.8: - version "0.9.0-beta.8" - resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.8.tgz#b3cbe364e24ea5765c36cba47c78a14acbe69062" - integrity sha512-FCv5zo6BVc7DaG3kLEOskKDCns7y2fRHqmZDrSmyfCd1lPmm9OA3UYdxZy5BtNkn6bc8amwpB7J2bIdu8VV7Qg== +xterm-addon-serialize@0.7.0-beta.8: + version "0.7.0-beta.8" + resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.8.tgz#b91584656d7433d60efae6c2f58fdc8bd75b439c" + integrity sha512-LIovTZSwHz+/lSRQx2VPf9j7pPkhYN+L8DzEUJeTFQhtpQpLYYb0slOndSMkp0zvDVbiHqweeebvAB2zu0b4PQ== -xterm-addon-serialize@0.7.0-beta.6: - version "0.7.0-beta.6" - resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.6.tgz#f1512f0690821d0c2a88700fb706c1212f69a39a" - integrity sha512-tP/larcKOQaCgfq5XlQT8plTRwi2fZHqy8UqbMnZ6LQZajvc01oGp5njaasfXu5vyIFhugp5fgH5vy5zgspbwg== +xterm-addon-unicode11@0.4.0-beta.3: + version "0.4.0-beta.3" + resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" + integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== -xterm-addon-unicode11@0.4.0-beta.1: - version "0.4.0-beta.1" - resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.1.tgz#aeefd26e87bad15d8dfd8a1e0b804fe408c9b882" - integrity sha512-pG8mpxnqpYDry0e20vuEFKhd4kKIcLLNwdNftNvfo+R/EjYRnTYnF+H8L+7eQHq6hqDH61xCEP4H4qR2CyT4pg== +xterm-addon-webgl@0.12.0-beta.24: + version "0.12.0-beta.24" + resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.24.tgz#5c17256933991856554c95c9bd1eaab42e9727a0" + integrity sha512-+wZxKReEOlfN9JRHyikoffA6Do61/THR7QY35ajkQo0lLutKr6hTd/TLTuZh0PhFVelgTgudpXqlP++Lc0WFIA== -xterm-addon-webgl@0.12.0-beta.21: - version "0.12.0-beta.21" - resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.21.tgz#8c476d25ec40b7535dedbd87b9cdf5eeeb41fc93" - integrity sha512-aeZcjxbtPfkVutNnXqCv9E5V4DoYecUFztWOjBzI/dgC1xfMOMVWzsymK9H1EUfd6u0ymEIeOjvX9bHsXNUzdA== +xterm-headless@4.18.0-beta.2: + version "4.18.0-beta.2" + resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.18.0-beta.2.tgz#b930ac8a79626ef4443cd3ab1a86d1a96039fef8" + integrity sha512-V4CSLfjqE1/pV+3HEs8l0T5W3FORoVX2f17AIUTSsuXUunNXcpib+g6ExxnR9Nm5ztbYnmZIX8AA3mClpqO1OQ== -xterm-headless@4.17.0-beta.7: - version "4.17.0-beta.7" - resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.17.0-beta.7.tgz#6ae3f5436a29f7e4554c6d9d7f4f3eb958d18240" - integrity sha512-1JoKhlsENqWqDIKNHxm5jBQj3Es3gHHM+wDi9ESyodn6J+FpTkM5859wnL+/rEm7PKKvahPICqjTSjdXq5Jv9g== - -xterm@4.17.0-beta.7: - version "4.17.0-beta.7" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.17.0-beta.7.tgz#c11d52403a8d6456b92f2086e1797c64018328d6" - integrity sha512-FhC12WUljy8pTWr0oquVE0U567H1ZPAREKkN+wWLSZODNJwc8/txP2Ajg9byG++bkxfBP3CNEmDzaP0hoall8Q== +xterm@4.18.0-beta.2: + version "4.18.0-beta.2" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.18.0-beta.2.tgz#50e0de2ebe22fd1600e6d7fbc78136a843bb4c1d" + integrity sha512-fzsSI0xL3HuWBuw5o3xPcR8/R8tTpSd60hHtf0Z2ZrIXDRdniJMw+StOv/xZNp2CUY6LcSiF9MmM0ylgiLHbdw== yauzl@^2.9.2: version "2.10.0" diff --git a/resources/darwin/bin/code.sh b/resources/darwin/bin/code.sh index 20aee89edf9..eecdf9c68b5 100755 --- a/resources/darwin/bin/code.sh +++ b/resources/darwin/bin/code.sh @@ -3,8 +3,23 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. -function realpath() { python -c "import os,sys; print(os.path.realpath(sys.argv[1]))" "$0"; } -CONTENTS="$(dirname "$(dirname "$(dirname "$(dirname "$(realpath "$0")")")")")" +function app_realpath() { + SOURCE=$1 + while [ -h "$SOURCE" ]; do + DIR=$(dirname "$SOURCE") + SOURCE=$(readlink "$SOURCE") + [[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE + done + SOURCE_DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" + echo "${SOURCE_DIR%%${SOURCE_DIR#*.app}}" +} + +APP_PATH="$(app_realpath "${BASH_SOURCE[0]}")" +if [ -z "$APP_PATH" ]; then + echo "Unable to determine app path from symlink : ${BASH_SOURCE[0]}" + exit 1 +fi +CONTENTS="$APP_PATH/Contents" ELECTRON="$CONTENTS/MacOS/Electron" CLI="$CONTENTS/Resources/app/out/cli.js" ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" --ms-enable-electron-run-as-node "$@" diff --git a/resources/server/bin-dev/code-server.bat b/resources/server/bin-dev/code-server.bat deleted file mode 100644 index d6a61b53267..00000000000 --- a/resources/server/bin-dev/code-server.bat +++ /dev/null @@ -1,43 +0,0 @@ -@echo off -setlocal - -title VSCode Remote Agent - -pushd %~dp0\..\..\.. - -:: Configuration -set NODE_ENV=development -set VSCODE_DEV=1 - -:: Sync built-in extensions -call yarn download-builtin-extensions - -FOR /F "tokens=*" %%g IN ('node build/lib/node.js') do (SET NODE=%%g) - -:: Download nodejs executable for remote -IF NOT EXIST "%NODE%" ( - call yarn gulp node -) - -:: Launch Agent -set _FIRST_ARG=%1 -if "%_FIRST_ARG:~0,9%"=="--inspect" ( - set INSPECT=%1 - shift -) else ( - set INSPECT= -) - -:loop1 -if "%~1"=="" goto after_loop -set RESTVAR=%RESTVAR% %1 -shift -goto loop1 - -:after_loop - -call "%NODE%" %INSPECT% "out\vs\server\main.js" %RESTVAR% - -popd - -endlocal diff --git a/resources/server/bin-dev/code-web.js b/resources/server/bin-dev/code-web.js deleted file mode 100644 index 0fdb7c76d2c..00000000000 --- a/resources/server/bin-dev/code-web.js +++ /dev/null @@ -1,87 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// @ts-check - -const cp = require('child_process'); -const path = require('path'); -const os = require('os'); - -const serverArgs = []; - -// Server Config -let PORT = 9888; -let DRIVER = undefined; -let LOGS_PATH = undefined; - -// Workspace Config -let FOLDER = undefined; -let WORKSPACE = undefined; - -// Settings Sync Config -let GITHUB_AUTH_TOKEN = undefined; -let ENABLE_SYNC = false; - -for (let idx = 0; idx <= process.argv.length - 2; idx++) { - const arg = process.argv[idx]; - switch (arg) { - case '--port': PORT = Number(process.argv[idx + 1]); break; - case '--folder': FOLDER = process.argv[idx + 1]; break; - case '--workspace': WORKSPACE = process.argv[idx + 1]; break; - case '--driver': DRIVER = process.argv[idx + 1]; break; - case '--github-auth': GITHUB_AUTH_TOKEN = process.argv[idx + 1]; break; - case '--logsPath': LOGS_PATH = process.argv[idx + 1]; break; - case '--enable-sync': ENABLE_SYNC = true; break; - } -} - -serverArgs.push('--port', String(PORT)); -if (FOLDER) { - serverArgs.push('--folder', FOLDER); -} -if (WORKSPACE) { - serverArgs.push('--workspace', WORKSPACE); -} -if (DRIVER) { - serverArgs.push('--driver', DRIVER); - - // given a DRIVER, we auto-shutdown when tests are done - serverArgs.push('--enable-remote-auto-shutdown', '--remote-auto-shutdown-without-delay'); -} -if (LOGS_PATH) { - serverArgs.push('--logsPath', LOGS_PATH); -} -if (GITHUB_AUTH_TOKEN) { - serverArgs.push('--github-auth', GITHUB_AUTH_TOKEN); -} -if (ENABLE_SYNC) { - serverArgs.push('--enable-sync', true); -} - -// Connection Token -serverArgs.push('--connection-token', '00000'); - -// Server should really only listen from localhost -serverArgs.push('--host', '127.0.0.1'); - -const env = { ...process.env }; -env['VSCODE_AGENT_FOLDER'] = env['VSCODE_AGENT_FOLDER'] || path.join(os.homedir(), '.vscode-web-dev'); -const entryPoint = path.join(__dirname, '..', '..', '..', 'out', 'vs', 'server', 'main.js'); - -startServer(); - -function startServer() { - const proc = cp.spawn(process.execPath, [entryPoint, ...serverArgs], { env }); - - proc.stdout.on('data', data => { - // Log everything - console.log(data.toString()); - }); - - // Log errors - proc.stderr.on('data', data => { - console.error(data.toString()); - }); -} diff --git a/resources/server/bin-dev/helpers/browser.cmd b/resources/server/bin-dev/helpers/browser.cmd index 4f195ce7ec8..7a21259de3c 100644 --- a/resources/server/bin-dev/helpers/browser.cmd +++ b/resources/server/bin-dev/helpers/browser.cmd @@ -2,5 +2,5 @@ setlocal SET VSCODE_PATH=%~dp0..\..\..\.. FOR /F "tokens=* USEBACKQ" %%g IN (`where /r "%VSCODE_PATH%\.build\node" node.exe`) do (SET "NODE=%%g") -call "%NODE%" "%VSCODE_PATH%\out\vs\server\cli.js" "Code Server - Dev" "" "" "code.cmd" "--openExternal" %* +call "%NODE%" "%VSCODE_PATH%\out\server-cli.js" "Code Server - Dev" "" "" "code.cmd" "--openExternal" %* endlocal diff --git a/resources/server/bin-dev/helpers/browser.sh b/resources/server/bin-dev/helpers/browser.sh index 60ff85d6e77..5ab90398f47 100755 --- a/resources/server/bin-dev/helpers/browser.sh +++ b/resources/server/bin-dev/helpers/browser.sh @@ -14,5 +14,5 @@ PROD_NAME="Code Server - Dev" VERSION="" COMMIT="" EXEC_NAME="" -CLI_SCRIPT="$VSCODE_PATH/out/vs/server/cli.js" +CLI_SCRIPT="$VSCODE_PATH/out/server-cli.js" node "$CLI_SCRIPT" "$PROD_NAME" "$VERSION" "$COMMIT" "$EXEC_NAME" "--openExternal" "$@" diff --git a/resources/server/bin-dev/remote-cli/code.cmd b/resources/server/bin-dev/remote-cli/code.cmd index 044a63a14a5..fd1d2c5ca49 100644 --- a/resources/server/bin-dev/remote-cli/code.cmd +++ b/resources/server/bin-dev/remote-cli/code.cmd @@ -2,5 +2,5 @@ setlocal SET VSCODE_PATH=%~dp0..\..\..\.. FOR /F "tokens=* USEBACKQ" %%g IN (`where /r "%VSCODE_PATH%\.build\node" node.exe`) do (SET "NODE=%%g") -call "%NODE%" "%VSCODE_PATH%\out\vs\server\cli.js" "Code Server - Dev" "" "" "code.cmd" %* +call "%NODE%" "%VSCODE_PATH%\out\server-cli.js" "Code Server - Dev" "" "" "code.cmd" %* endlocal diff --git a/resources/server/bin-dev/remote-cli/code.sh b/resources/server/bin-dev/remote-cli/code.sh index 18165bfe3ce..1d0bc9b5c85 100755 --- a/resources/server/bin-dev/remote-cli/code.sh +++ b/resources/server/bin-dev/remote-cli/code.sh @@ -14,5 +14,5 @@ PROD_NAME="Code Server - Dev" VERSION="" COMMIT="" EXEC_NAME="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")" -CLI_SCRIPT="$VSCODE_PATH/out/vs/server/cli.js" +CLI_SCRIPT="$VSCODE_PATH/out/server-cli.js" node "$CLI_SCRIPT" "$PROD_NAME" "$VERSION" "$COMMIT" "$EXEC_NAME" "$@" diff --git a/resources/server/bin/code-server-darwin.sh b/resources/server/bin/code-server-darwin.sh new file mode 100644 index 00000000000..6f109c38432 --- /dev/null +++ b/resources/server/bin/code-server-darwin.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env sh +# +# Copyright (c) Microsoft Corporation. All rights reserved. +# + +case "$1" in + --inspect*) INSPECT="$1"; shift;; +esac + +function realpath() { python -c "import os,sys; print(os.path.realpath(sys.argv[1]))" "$0"; } +ROOT=$(dirname $(dirname $(realpath "$0"))) + +"$ROOT/node" ${INSPECT:-} "$ROOT/out/server-main.js" "$@" diff --git a/resources/server/bin/code-server.sh b/resources/server/bin/code-server-linux.sh similarity index 57% rename from resources/server/bin/code-server.sh rename to resources/server/bin/code-server-linux.sh index 982180598ee..b162cc656b8 100644 --- a/resources/server/bin/code-server.sh +++ b/resources/server/bin/code-server-linux.sh @@ -7,6 +7,6 @@ case "$1" in --inspect*) INSPECT="$1"; shift;; esac -ROOT=$(dirname "$(dirname "$0")") +ROOT=$(dirname $(dirname $(readlink -f $0))) -"$ROOT/node" ${INSPECT:-} "$ROOT/out/vs/server/main.js" "$@" +"$ROOT/node" ${INSPECT:-} "$ROOT/out/server-main.js" "$@" diff --git a/resources/server/bin/code-server.cmd b/resources/server/bin/code-server.cmd index 57e163af8ce..d2bebf81851 100644 --- a/resources/server/bin/code-server.cmd +++ b/resources/server/bin/code-server.cmd @@ -19,6 +19,6 @@ goto loop1 :after_loop -"%ROOT_DIR%\node.exe" %INSPECT% "%ROOT_DIR%\out\vs\server\main.js" %RESTVAR% +"%ROOT_DIR%\node.exe" %INSPECT% "%ROOT_DIR%\out\server-main.js" %RESTVAR% endlocal diff --git a/resources/server/bin/helpers/browser.cmd b/resources/server/bin/helpers/browser.cmd index 5bf6d0fcb68..ffa6b1cf57d 100644 --- a/resources/server/bin/helpers/browser.cmd +++ b/resources/server/bin/helpers/browser.cmd @@ -1,5 +1,5 @@ @echo off setlocal set ROOT_DIR=%~dp0..\.. -call "%ROOT_DIR%\node.exe" "%ROOT_DIR%\out\vs\server\cli.js" "@@APPNAME@@" "@@VERSION@@" "@@COMMIT@@" "@@APPNAME@@.cmd" "--openExternal" %* +call "%ROOT_DIR%\node.exe" "%ROOT_DIR%\out\server-cli.js" "@@APPNAME@@" "@@VERSION@@" "@@COMMIT@@" "@@APPNAME@@.cmd" "--openExternal" %* endlocal diff --git a/resources/server/bin/helpers/browser.sh b/resources/server/bin/helpers/browser.sh index 2cc3570be96..de9d64a0501 100644 --- a/resources/server/bin/helpers/browser.sh +++ b/resources/server/bin/helpers/browser.sh @@ -8,5 +8,5 @@ APP_NAME="@@APPNAME@@" VERSION="@@VERSION@@" COMMIT="@@COMMIT@@" EXEC_NAME="@@APPNAME@@" -CLI_SCRIPT="$ROOT/out/vs/server/cli.js" +CLI_SCRIPT="$ROOT/out/server-cli.js" "$ROOT/node" "$CLI_SCRIPT" "$APP_NAME" "$VERSION" "$COMMIT" "$EXEC_NAME" "--openExternal" "$@" diff --git a/resources/server/bin/remote-cli/code.cmd b/resources/server/bin/remote-cli/code.cmd index a33c6d3cf5c..e69a3117381 100644 --- a/resources/server/bin/remote-cli/code.cmd +++ b/resources/server/bin/remote-cli/code.cmd @@ -1,5 +1,5 @@ @echo off setlocal set ROOT_DIR=%~dp0..\.. -call "%ROOT_DIR%\node.exe" "%ROOT_DIR%\out\vs\server\cli.js" "@@APPNAME@@" "@@VERSION@@" "@@COMMIT@@" "@@APPNAME@@.cmd" %* +call "%ROOT_DIR%\node.exe" "%ROOT_DIR%\out\server-cli.js" "@@APPNAME@@" "@@VERSION@@" "@@COMMIT@@" "@@APPNAME@@.cmd" %* endlocal diff --git a/resources/server/bin/remote-cli/code.sh b/resources/server/bin/remote-cli/code.sh index 20ed0ff4cfb..5f282991ab4 100644 --- a/resources/server/bin/remote-cli/code.sh +++ b/resources/server/bin/remote-cli/code.sh @@ -8,5 +8,5 @@ APP_NAME="@@APPNAME@@" VERSION="@@VERSION@@" COMMIT="@@COMMIT@@" EXEC_NAME="@@APPNAME@@" -CLI_SCRIPT="$ROOT/out/vs/server/cli.js" +CLI_SCRIPT="$ROOT/out/server-cli.js" "$ROOT/node" "$CLI_SCRIPT" "$APP_NAME" "$VERSION" "$COMMIT" "$EXEC_NAME" "$@" diff --git a/resources/server/bin/server-old.cmd b/resources/server/bin/server-old.cmd index cdf9e5a552e..3b459b30d37 100644 --- a/resources/server/bin/server-old.cmd +++ b/resources/server/bin/server-old.cmd @@ -19,6 +19,6 @@ goto loop1 :after_loop -"%ROOT_DIR%node.exe" %INSPECT% "%ROOT_DIR%out\vs\server\main.js" --compatibility=1.63 %RESTVAR% +"%ROOT_DIR%node.exe" %INSPECT% "%ROOT_DIR%out\server-main.js" --compatibility=1.63 %RESTVAR% endlocal diff --git a/resources/server/bin/server-old.sh b/resources/server/bin/server-old.sh index 593a00ae6ce..7861d790be3 100644 --- a/resources/server/bin/server-old.sh +++ b/resources/server/bin/server-old.sh @@ -9,4 +9,4 @@ esac ROOT="$(dirname "$0")" -"$ROOT/node" ${INSPECT:-} "$ROOT/out/vs/server/main.js" --compatibility=1.63 "$@" +"$ROOT/node" ${INSPECT:-} "$ROOT/out/server-main.js" --compatibility=1.63 "$@" diff --git a/resources/web/callback.html b/resources/web/callback.html deleted file mode 100644 index 81f217e980b..00000000000 --- a/resources/web/callback.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - Visual Studio Code - - - - - - - - Visual Studio Code - -
-
- You can close this page now. -
-
- - - diff --git a/resources/web/code-web.js b/resources/web/code-web.js deleted file mode 100644 index 1f038e7d5f8..00000000000 --- a/resources/web/code-web.js +++ /dev/null @@ -1,663 +0,0 @@ -#!/usr/bin/env node - -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// @ts-check - -const http = require('http'); -const url = require('url'); -const fs = require('fs'); -const path = require('path'); -const util = require('util'); -const opn = require('opn'); -const minimist = require('minimist'); -const fancyLog = require('fancy-log'); -const ansiColors = require('ansi-colors'); -const remote = require('gulp-remote-retry-src'); -const vfs = require('vinyl-fs'); -const uuid = require('uuid'); - -const extensions = require('../../build/lib/extensions'); -const { getBuiltInExtensions } = require('../../build/lib/builtInExtensions'); - -const APP_ROOT = path.join(__dirname, '..', '..'); -const BUILTIN_EXTENSIONS_ROOT = path.join(APP_ROOT, 'extensions'); -const BUILTIN_MARKETPLACE_EXTENSIONS_ROOT = path.join(APP_ROOT, '.build', 'builtInExtensions'); -const WEB_DEV_EXTENSIONS_ROOT = path.join(APP_ROOT, '.build', 'builtInWebDevExtensions'); -const WEB_MAIN = path.join(APP_ROOT, 'src', 'vs', 'code', 'browser', 'workbench', 'workbench-dev.html'); - -// This is useful to simulate real world CORS -const ALLOWED_CORS_ORIGINS = [ - 'http://localhost:8081', - 'http://127.0.0.1:8081', - 'http://localhost:8080', - 'http://127.0.0.1:8080', -]; - -const WEB_PLAYGROUND_VERSION = '0.0.13'; - -const args = minimist(process.argv, { - boolean: [ - 'no-launch', - 'help', - 'verbose', - 'wrap-iframe', - 'enable-sync', - ], - string: [ - 'scheme', - 'host', - 'port', - 'local_port', - 'extension', - 'extensionId', - 'github-auth', - 'open-file' - ], -}); - -if (args.help) { - console.log( - 'yarn web [options]\n' + - ' --no-launch Do not open Code in the browser\n' + - ' --wrap-iframe Wrap the Web Worker Extension Host in an iframe\n' + - ' --enable-sync Enable sync by default\n' + - ' --scheme Protocol (https or http)\n' + - ' --host Remote host\n' + - ' --port Remote/Local port\n' + - ' --local_port Local port override\n' + - ' --extension Path of an extension to include\n' + - ' --extensionId Id of an extension to include\n' + - ' --open-file uri of the file to open. Also support selections in the file. Eg: scheme://authority/path#L1:2-L10:3\n' + - ' --github-auth Github authentication token\n' + - ' --verbose Print out more information\n' + - ' --help\n' + - '[Example]\n' + - ' yarn web --scheme https --host example.com --port 8080 --local_port 30000' - ); - process.exit(0); -} - -const PORT = args.port || process.env.PORT || 8080; -const LOCAL_PORT = args.local_port || process.env.LOCAL_PORT || PORT; -const SCHEME = args.scheme || process.env.VSCODE_SCHEME || 'http'; -const HOST = args.host || 'localhost'; -const AUTHORITY = process.env.VSCODE_AUTHORITY || `${HOST}:${PORT}`; - -const exists = (path) => util.promisify(fs.exists)(path); -const readFile = (path) => util.promisify(fs.readFile)(path); - -async function getBuiltInExtensionInfos() { - await getBuiltInExtensions(); - - const allExtensions = []; - /** @type {Object.} */ - const locations = {}; - - const [localExtensions, marketplaceExtensions, webDevExtensions] = await Promise.all([ - extensions.scanBuiltinExtensions(BUILTIN_EXTENSIONS_ROOT), - extensions.scanBuiltinExtensions(BUILTIN_MARKETPLACE_EXTENSIONS_ROOT), - ensureWebDevExtensions().then(() => extensions.scanBuiltinExtensions(WEB_DEV_EXTENSIONS_ROOT)) - ]); - for (const ext of localExtensions) { - allExtensions.push(ext); - locations[ext.extensionPath] = path.join(BUILTIN_EXTENSIONS_ROOT, ext.extensionPath); - } - for (const ext of marketplaceExtensions) { - allExtensions.push(ext); - locations[ext.extensionPath] = path.join(BUILTIN_MARKETPLACE_EXTENSIONS_ROOT, ext.extensionPath); - } - for (const ext of webDevExtensions) { - allExtensions.push(ext); - locations[ext.extensionPath] = path.join(WEB_DEV_EXTENSIONS_ROOT, ext.extensionPath); - } - for (const ext of allExtensions) { - if (ext.packageJSON.browser) { - let mainFilePath = path.join(locations[ext.extensionPath], ext.packageJSON.browser); - if (path.extname(mainFilePath) !== '.js') { - mainFilePath += '.js'; - } - if (!await exists(mainFilePath)) { - fancyLog(`${ansiColors.red('Error')}: Could not find ${mainFilePath}. Use ${ansiColors.cyan('yarn watch-web')} to build the built-in extensions.`); - } - } - } - return { extensions: allExtensions, locations }; -} - -async function ensureWebDevExtensions() { - - // Playground (https://github.com/microsoft/vscode-web-playground) - const webDevPlaygroundRoot = path.join(WEB_DEV_EXTENSIONS_ROOT, 'vscode-web-playground'); - const webDevPlaygroundExists = await exists(webDevPlaygroundRoot); - - let downloadPlayground = false; - if (webDevPlaygroundExists) { - try { - const webDevPlaygroundPackageJson = JSON.parse(((await readFile(path.join(webDevPlaygroundRoot, 'package.json'))).toString())); - if (webDevPlaygroundPackageJson.version !== WEB_PLAYGROUND_VERSION) { - downloadPlayground = true; - } - } catch (error) { - downloadPlayground = true; - } - } else { - downloadPlayground = true; - } - - if (downloadPlayground) { - if (args.verbose) { - fancyLog(`${ansiColors.magenta('Web Development extensions')}: Downloading vscode-web-playground to ${webDevPlaygroundRoot}`); - } - await new Promise((resolve, reject) => { - remote(['package.json', 'dist/extension.js', 'dist/extension.js.map'], { - base: 'https://raw.githubusercontent.com/microsoft/vscode-web-playground/main/' - }).pipe(vfs.dest(webDevPlaygroundRoot)).on('end', resolve).on('error', reject); - }); - } else { - if (args.verbose) { - fancyLog(`${ansiColors.magenta('Web Development extensions')}: Using existing vscode-web-playground in ${webDevPlaygroundRoot}`); - } - } -} - -async function getCommandlineProvidedExtensionInfos() { - const extensions = []; - - /** @type {Object.} */ - const locations = {}; - - let extensionArg = args['extension']; - let extensionIdArg = args['extensionId']; - if (!extensionArg && !extensionIdArg) { - return { extensions, locations }; - } - - if (extensionArg) { - const extensionPaths = Array.isArray(extensionArg) ? extensionArg : [extensionArg]; - await Promise.all(extensionPaths.map(async extensionPath => { - extensionPath = path.resolve(process.cwd(), extensionPath); - const packageJSON = await getExtensionPackageJSON(extensionPath); - if (packageJSON) { - const extensionId = `${packageJSON.publisher}.${packageJSON.name}`; - extensions.push({ scheme: SCHEME, authority: AUTHORITY, path: `/extension/${extensionId}` }); - locations[extensionId] = extensionPath; - } - })); - } - - if (extensionIdArg) { - extensions.push(...(Array.isArray(extensionIdArg) ? extensionIdArg : [extensionIdArg])); - } - - return { extensions, locations }; -} - -async function getExtensionPackageJSON(extensionPath) { - - const packageJSONPath = path.join(extensionPath, 'package.json'); - if (await exists(packageJSONPath)) { - try { - let packageJSON = JSON.parse((await readFile(packageJSONPath)).toString()); - if (packageJSON.main && !packageJSON.browser) { - return; // unsupported - } - return packageJSON; - } catch (e) { - console.log(e); - } - } - return undefined; -} - -const builtInExtensionsPromise = getBuiltInExtensionInfos(); -const commandlineProvidedExtensionsPromise = getCommandlineProvidedExtensionInfos(); - -const mapCallbackUriToRequestId = new Map(); - -/** - * @param req {http.IncomingMessage} - * @param res {http.ServerResponse} - */ -const requestHandler = (req, res) => { - const parsedUrl = url.parse(req.url, true); - const pathname = parsedUrl.pathname; - - res.setHeader('Access-Control-Allow-Origin', '*'); - - try { - if (/(\/static)?\/favicon\.ico/.test(pathname)) { - // favicon - return serveFile(req, res, path.join(APP_ROOT, 'resources', 'win32', 'code.ico')); - } - if (/(\/static)?\/manifest\.json/.test(pathname)) { - // manifest - res.writeHead(200, { 'Content-Type': 'application/json' }); - return res.end(JSON.stringify({ - 'name': 'Code - OSS', - 'short_name': 'Code - OSS', - 'start_url': '/', - 'lang': 'en-US', - 'display': 'standalone' - })); - } - if (/^\/static\//.test(pathname)) { - // static requests - return handleStatic(req, res, parsedUrl); - } - if (/^\/extension\//.test(pathname)) { - // default extension requests - return handleExtension(req, res, parsedUrl); - } - if (pathname === '/') { - // main web - return handleRoot(req, res); - } else if (pathname === '/callback') { - // callback support - return handleCallback(req, res, parsedUrl); - } else if (pathname === '/fetch-callback') { - // callback fetch support - return handleFetchCallback(req, res, parsedUrl); - } else if (pathname === '/builtin') { - // builtin extnesions JSON - return handleBuiltInExtensions(req, res, parsedUrl); - } - - return serveError(req, res, 404, 'Not found.'); - } catch (error) { - console.error(error.toString()); - - return serveError(req, res, 500, 'Internal Server Error.'); - } -}; - -const server = http.createServer(requestHandler); -server.listen(LOCAL_PORT, () => { - if (LOCAL_PORT !== PORT) { - console.log(`Operating location at http://0.0.0.0:${LOCAL_PORT}`); - } - console.log(`Web UI available at ${SCHEME}://${AUTHORITY}`); -}); -server.on('error', err => { - console.error(`Error occurred in server:`); - console.error(err); -}); - -/** - * @param {import('http').IncomingMessage} req - */ -function addCORSReplyHeader(req) { - if (typeof req.headers['origin'] !== 'string') { - // not a CORS request - return false; - } - return (ALLOWED_CORS_ORIGINS.indexOf(req.headers['origin']) >= 0); -} - -/** - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - * @param {import('url').UrlWithParsedQuery} parsedUrl - */ -async function handleBuiltInExtensions(req, res, parsedUrl) { - const { extensions } = await builtInExtensionsPromise; - res.writeHead(200, { 'Content-Type': 'application/json' }); - return res.end(JSON.stringify(extensions)); -} - -/** - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - * @param {import('url').UrlWithParsedQuery} parsedUrl - */ -async function handleStatic(req, res, parsedUrl) { - - if (/^\/static\/extensions\//.test(parsedUrl.pathname)) { - const relativePath = decodeURIComponent(parsedUrl.pathname.substr('/static/extensions/'.length)); - const filePath = getExtensionFilePath(relativePath, (await builtInExtensionsPromise).locations); - const responseHeaders = {}; - if (addCORSReplyHeader(req)) { - responseHeaders['Access-Control-Allow-Origin'] = '*'; - } - if (!filePath) { - return serveError(req, res, 400, `Bad request.`, responseHeaders); - } - return serveFile(req, res, filePath, responseHeaders); - } - - // Strip `/static/` from the path - const relativeFilePath = path.normalize(decodeURIComponent(parsedUrl.pathname.substr('/static/'.length))); - - return serveFile(req, res, path.join(APP_ROOT, relativeFilePath)); -} - -/** - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - * @param {import('url').UrlWithParsedQuery} parsedUrl - */ -async function handleExtension(req, res, parsedUrl) { - // Strip `/extension/` from the path - const relativePath = decodeURIComponent(parsedUrl.pathname.substr('/extension/'.length)); - const filePath = getExtensionFilePath(relativePath, (await commandlineProvidedExtensionsPromise).locations); - const responseHeaders = {}; - if (addCORSReplyHeader(req)) { - responseHeaders['Access-Control-Allow-Origin'] = '*'; - } - if (!filePath) { - return serveError(req, res, 400, `Bad request.`, responseHeaders); - } - return serveFile(req, res, filePath, responseHeaders); -} - -/** - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - */ -async function handleRoot(req, res) { - let folderUri = { scheme: 'memfs', path: `/sample-folder` }; - - const match = req.url && req.url.match(/\?([^#]+)/); - if (match) { - const qs = new URLSearchParams(match[1]); - - let gh = qs.get('gh'); - if (gh) { - if (gh.startsWith('/')) { - gh = gh.substr(1); - } - - const [owner, repo, ...branch] = gh.split('/', 3); - const ref = branch.join('/'); - folderUri = { scheme: 'github', authority: `${owner}+${repo}${ref ? `+${ref}` : ''}`, path: '/' }; - } else { - let cs = qs.get('cs'); - if (cs) { - if (cs.startsWith('/')) { - cs = cs.substr(1); - } - - const [owner, repo, ...branch] = cs.split('/'); - const ref = branch.join('/'); - folderUri = { scheme: 'codespace', authority: `${owner}+${repo}${ref ? `+${ref}` : ''}`, path: '/' }; - } - } - } - - const { extensions: builtInExtensions } = await builtInExtensionsPromise; - const { extensions: additionalBuiltinExtensions, locations: staticLocations } = await commandlineProvidedExtensionsPromise; - - const dedupedBuiltInExtensions = []; - for (const builtInExtension of builtInExtensions) { - const extensionId = `${builtInExtension.packageJSON.publisher}.${builtInExtension.packageJSON.name}`; - if (staticLocations[extensionId]) { - fancyLog(`${ansiColors.magenta('BuiltIn extensions')}: Ignoring built-in ${extensionId} because it was overridden via --extension argument`); - continue; - } - - dedupedBuiltInExtensions.push(builtInExtension); - } - - if (args.verbose) { - fancyLog(`${ansiColors.magenta('BuiltIn extensions')}: ${dedupedBuiltInExtensions.map(e => path.basename(e.extensionPath)).join(', ')}`); - fancyLog(`${ansiColors.magenta('Additional extensions')}: ${additionalBuiltinExtensions.map(e => typeof e === 'string' ? e : path.basename(e.path)).join(', ') || 'None'}`); - } - - const openFileUrl = args['open-file'] ? url.parse(args['open-file'], true) : undefined; - let selection; - if (openFileUrl?.hash) { - const rangeMatch = /L(?\d+)(?::(?\d+))?((?:-L(?\d+))(?::(?\d+))?)?/.exec(openFileUrl.hash); - if (rangeMatch?.groups) { - const { startLineNumber, startColumn, endLineNumber, endColumn } = rangeMatch.groups; - const start = { line: parseInt(startLineNumber), column: startColumn ? (parseInt(startColumn) || 1) : 1 }; - const end = endLineNumber ? { line: parseInt(endLineNumber), column: endColumn ? (parseInt(endColumn) || 1) : 1 } : start; - selection = { start, end } - } - } - const webConfigJSON = { - folderUri: folderUri, - additionalBuiltinExtensions, - defaultLayout: openFileUrl ? { - force: true, - editors: [{ - uri: { - scheme: openFileUrl.protocol.substring(0, openFileUrl.protocol.length - 1), - authority: openFileUrl.host, - path: openFileUrl.path, - }, - selection, - }] - } : undefined, - settingsSyncOptions: args['enable-sync'] ? { - enabled: true - } : undefined - }; - if (args['wrap-iframe']) { - webConfigJSON._wrapWebWorkerExtHostInIframe = true; - } - - const authSessionInfo = args['github-auth'] ? { - id: uuid.v4(), - providerId: 'github', - accessToken: args['github-auth'], - scopes: [['user:email'], ['repo']] - } : undefined; - - const data = (await readFile(WEB_MAIN)).toString() - .replace('{{WORKBENCH_WEB_CONFIGURATION}}', () => escapeAttribute(JSON.stringify(webConfigJSON))) // use a replace function to avoid that regexp replace patterns ($&, $0, ...) are applied - .replace('{{WORKBENCH_BUILTIN_EXTENSIONS}}', () => escapeAttribute(JSON.stringify(dedupedBuiltInExtensions))) - .replace('{{WORKBENCH_AUTH_SESSION}}', () => authSessionInfo ? escapeAttribute(JSON.stringify(authSessionInfo)) : '') - .replace('{{WEBVIEW_ENDPOINT}}', ''); - - const headers = { - 'Content-Type': 'text/html', - 'Content-Security-Policy': 'require-trusted-types-for \'script\';' - }; - res.writeHead(200, headers); - return res.end(data); -} - -/** - * Handle HTTP requests for /callback - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - * @param {import('url').UrlWithParsedQuery} parsedUrl -*/ -async function handleCallback(req, res, parsedUrl) { - const wellKnownKeys = ['vscode-requestId', 'vscode-scheme', 'vscode-authority', 'vscode-path', 'vscode-query', 'vscode-fragment']; - const [requestId, vscodeScheme, vscodeAuthority, vscodePath, vscodeQuery, vscodeFragment] = wellKnownKeys.map(key => { - const value = getFirstQueryValue(parsedUrl, key); - if (value) { - return decodeURIComponent(value); - } - - return value; - }); - - if (!requestId) { - res.writeHead(400, { 'Content-Type': 'text/plain' }); - return res.end(`Bad request.`); - } - - // merge over additional query values that we got - let query = vscodeQuery; - let index = 0; - getFirstQueryValues(parsedUrl, wellKnownKeys).forEach((value, key) => { - if (!query) { - query = ''; - } - - const prefix = (index++ === 0) ? '' : '&'; - query += `${prefix}${key}=${value}`; - }); - - - // add to map of known callbacks - mapCallbackUriToRequestId.set(requestId, JSON.stringify({ scheme: vscodeScheme || 'code-oss', authority: vscodeAuthority, path: vscodePath, query, fragment: vscodeFragment })); - return serveFile(req, res, path.join(APP_ROOT, 'resources', 'web', 'callback.html'), { 'Content-Type': 'text/html' }); -} - -/** - * Handle HTTP requests for /fetch-callback - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - * @param {import('url').UrlWithParsedQuery} parsedUrl -*/ -async function handleFetchCallback(req, res, parsedUrl) { - const requestId = getFirstQueryValue(parsedUrl, 'vscode-requestId'); - if (!requestId) { - res.writeHead(400, { 'Content-Type': 'text/plain' }); - return res.end(`Bad request.`); - } - - const knownCallbackUri = mapCallbackUriToRequestId.get(requestId); - if (knownCallbackUri) { - mapCallbackUriToRequestId.delete(requestId); - } - - res.writeHead(200, { 'Content-Type': 'text/json' }); - return res.end(knownCallbackUri); -} - -/** - * @param {import('url').UrlWithParsedQuery} parsedUrl - * @param {string} key - * @returns {string | undefined} -*/ -function getFirstQueryValue(parsedUrl, key) { - const result = parsedUrl.query[key]; - return Array.isArray(result) ? result[0] : result; -} - -/** - * @param {import('url').UrlWithParsedQuery} parsedUrl - * @param {string[] | undefined} ignoreKeys - * @returns {Map} -*/ -function getFirstQueryValues(parsedUrl, ignoreKeys) { - const queryValues = new Map(); - - for (const key in parsedUrl.query) { - if (ignoreKeys && ignoreKeys.indexOf(key) >= 0) { - continue; - } - - const value = getFirstQueryValue(parsedUrl, key); - if (typeof value === 'string') { - queryValues.set(key, value); - } - } - - return queryValues; -} - -/** - * @param {string} value - */ -function escapeAttribute(value) { - return value.replace(/"/g, '"'); -} - -/** - * @param {string} relativePath - * @param {Object.} locations - * @returns {string | undefined} -*/ -function getExtensionFilePath(relativePath, locations) { - const firstSlash = relativePath.indexOf('/'); - if (firstSlash === -1) { - return undefined; - } - const extensionId = relativePath.substr(0, firstSlash); - - const extensionPath = locations[extensionId]; - if (!extensionPath) { - return undefined; - } - return path.join(extensionPath, relativePath.substr(firstSlash + 1)); -} - -/** - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - * @param {string} errorMessage - */ -function serveError(req, res, errorCode, errorMessage, responseHeaders = Object.create(null)) { - responseHeaders['Content-Type'] = 'text/plain'; - res.writeHead(errorCode, responseHeaders); - res.end(errorMessage); -} - -const textMimeType = { - '.html': 'text/html', - '.js': 'text/javascript', - '.json': 'application/json', - '.css': 'text/css', - '.svg': 'image/svg+xml', -}; - -const mapExtToMediaMimes = { - '.bmp': 'image/bmp', - '.gif': 'image/gif', - '.ico': 'image/x-icon', - '.jpe': 'image/jpg', - '.jpeg': 'image/jpg', - '.jpg': 'image/jpg', - '.png': 'image/png', - '.tga': 'image/x-tga', - '.tif': 'image/tiff', - '.tiff': 'image/tiff', - '.woff': 'application/font-woff' -}; - -/** - * @param {string} forPath - */ -function getMediaMime(forPath) { - const ext = path.extname(forPath); - - return mapExtToMediaMimes[ext.toLowerCase()]; -} - -/** - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - * @param {string} filePath - */ -async function serveFile(req, res, filePath, responseHeaders = Object.create(null)) { - try { - - // Sanity checks - filePath = path.normalize(filePath); // ensure no "." and ".." - - const stat = await util.promisify(fs.stat)(filePath); - - // Check if file modified since - const etag = `W/"${[stat.ino, stat.size, stat.mtime.getTime()].join('-')}"`; // weak validator (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) - if (req.headers['if-none-match'] === etag) { - res.writeHead(304); - return res.end(); - } - - // Headers - responseHeaders['Content-Type'] = textMimeType[path.extname(filePath)] || getMediaMime(filePath) || 'text/plain'; - responseHeaders['Etag'] = etag; - - res.writeHead(200, responseHeaders); - - // Data - fs.createReadStream(filePath).pipe(res); - } catch (error) { - console.error(error.toString()); - responseHeaders['Content-Type'] = 'text/plain'; - res.writeHead(404, responseHeaders); - return res.end('Not found'); - } -} - -if (args.launch !== false) { - opn(`${SCHEME}://${HOST}:${PORT}`); -} diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index 999a5b5445c..a56c068f4ac 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -10,7 +10,7 @@ COMMIT="@@COMMIT@@" APP_NAME="@@APPNAME@@" QUALITY="@@QUALITY@@" NAME="@@NAME@@" -DATAFOLDER="@@DATAFOLDER@@" +SERVERDATAFOLDER="@@SERVERDATAFOLDER@@" VSCODE_PATH="$(dirname "$(dirname "$(realpath "$0")")")" ELECTRON="$VSCODE_PATH/$NAME.exe" @@ -49,7 +49,7 @@ if [ $IN_WSL = true ]; then if [ -n "$WSL_EXT_WLOC" ]; then # replace \r\n with \n in WSL_EXT_WLOC WSL_CODE=$(wslpath -u "${WSL_EXT_WLOC%%[[:cntrl:]]}")/scripts/wslCode.sh - "$WSL_CODE" "$COMMIT" "$QUALITY" "$ELECTRON" "$APP_NAME" "$DATAFOLDER" "$@" + "$WSL_CODE" "$COMMIT" "$QUALITY" "$ELECTRON" "$APP_NAME" "$SERVERDATAFOLDER" "$@" exit $? fi diff --git a/resources/server/web.bat b/scripts/code-server.bat similarity index 55% rename from resources/server/web.bat rename to scripts/code-server.bat index d131dafffc6..fd7e8d46028 100644 --- a/resources/server/web.bat +++ b/scripts/code-server.bat @@ -1,9 +1,9 @@ @echo off setlocal -title VSCode Web Server +title VSCode Server -pushd %~dp0\..\.. +pushd %~dp0\.. :: Configuration set NODE_ENV=development @@ -12,13 +12,17 @@ set VSCODE_DEV=1 :: Sync built-in extensions call yarn download-builtin-extensions -:: Download nodejs executable for remote -call yarn gulp node +:: Node executable +FOR /F "tokens=*" %%g IN ('node build/lib/node.js') do (SET NODE=%%g) + +if not exist "%NODE%" ( + :: Download nodejs executable for remote + call yarn gulp node +) :: Launch Server -FOR /F "tokens=*" %%g IN ('node build/lib/node.js') do (SET NODE=%%g) -call "%NODE%" resources\server\bin-dev\code-web.js %* +call "%NODE%" scripts\code-server.js %* popd -endlocal \ No newline at end of file +endlocal diff --git a/scripts/code-server.js b/scripts/code-server.js new file mode 100644 index 00000000000..f4d34131cb3 --- /dev/null +++ b/scripts/code-server.js @@ -0,0 +1,84 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// @ts-check + +const cp = require('child_process'); +const path = require('path'); +const opn = require('opn'); +const crypto = require('crypto'); +const minimist = require('minimist'); + +function main() { + + const args = minimist(process.argv.slice(2), { + boolean: [ + 'help', + 'launch' + ], + string: [ + 'host', + 'port', + 'driver', + 'connection-token', + 'server-data-dir' + ], + }); + + if (args.help) { + console.log( + './scripts/code-server.sh|bat [options]\n' + + ' --launch Opens a browser' + ); + startServer(['--help']); + return; + } + + const serverArgs = process.argv.slice(2).filter(v => v !== '--launch'); + + const HOST = args['host'] ?? 'localhost'; + const PORT = args['port'] ?? '9888'; + const TOKEN = args['connection-token'] ?? String(crypto.randomInt(0xffffffff)); + + if (args['connection-token'] === undefined && args['connection-token-file'] === undefined && !args['without-connection-token']) { + serverArgs.push('--connection-token', TOKEN); + } + if (args['host'] === undefined) { + serverArgs.push('--host', HOST); + } + if (args['port'] === undefined) { + serverArgs.push('--port', PORT); + } + + startServer(serverArgs); + if (args['launch']) { + opn(`http://${HOST}:${PORT}/?tkn=${TOKEN}`); + } +} + +function startServer(programArgs) { + const env = { ...process.env }; + + const entryPoint = path.join(__dirname, '..', 'out', 'server-main.js'); + + console.log(`Starting server: ${entryPoint} ${programArgs.join(' ')}`); + const proc = cp.spawn(process.execPath, [entryPoint, ...programArgs], { env, stdio: 'inherit' }); + + proc.on('exit', (code) => process.exit(code)); + + process.on('exit', () => proc.kill()); + process.on('SIGINT', () => { + proc.kill(); + process.exit(128 + 2); // https://nodejs.org/docs/v14.16.0/api/process.html#process_signal_events + }); + process.on('SIGTERM', () => { + proc.kill(); + process.exit(128 + 15); // https://nodejs.org/docs/v14.16.0/api/process.html#process_signal_events + }); + +} + +main(); + diff --git a/resources/server/web.sh b/scripts/code-server.sh similarity index 61% rename from resources/server/web.sh rename to scripts/code-server.sh index da072e5f2d0..6e31e233fa0 100755 --- a/resources/server/web.sh +++ b/scripts/code-server.sh @@ -2,9 +2,9 @@ if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } - ROOT=$(dirname $(dirname $(dirname $(realpath "$0")))) + ROOT=$(dirname $(dirname $(realpath "$0"))) else - ROOT=$(dirname $(dirname $(dirname $(readlink -f $0)))) + ROOT=$(dirname $(dirname $(readlink -f $0))) fi function code() { @@ -13,14 +13,15 @@ function code() { # Sync built-in extensions yarn download-builtin-extensions - # Load remote node - yarn gulp node - NODE=$(node build/lib/node.js) + if [ ! -e $NODE ];then + # Load remote node + yarn gulp node + fi NODE_ENV=development \ VSCODE_DEV=1 \ - $NODE $(dirname "$0")/bin-dev/code-web.js "$@" + $NODE ./scripts/code-server.js "$@" } code "$@" diff --git a/scripts/code-web.bat b/scripts/code-web.bat new file mode 100644 index 00000000000..312024c3d42 --- /dev/null +++ b/scripts/code-web.bat @@ -0,0 +1,24 @@ +@echo off +setlocal + +title VSCode Web Serverless + +pushd %~dp0\.. + +:: Sync built-in extensions +call yarn download-builtin-extensions + +:: Node executable +FOR /F "tokens=*" %%g IN ('node build/lib/node.js') do (SET NODE=%%g) + +if not exist "%NODE%" ( + :: Download nodejs executable for remote + call yarn gulp node +) + +:: Launch Server +call "%NODE%" scripts\code-web.js %* + +popd + +endlocal diff --git a/scripts/code-web.js b/scripts/code-web.js new file mode 100644 index 00000000000..5130e27b9b9 --- /dev/null +++ b/scripts/code-web.js @@ -0,0 +1,149 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// @ts-check + +const testWebLocation = require.resolve('@vscode/test-web'); + +const fs = require('fs'); +const path = require('path'); +const cp = require('child_process'); + +const minimist = require('minimist'); +const fancyLog = require('fancy-log'); +const ansiColors = require('ansi-colors'); +const remote = require('gulp-remote-retry-src'); +const vfs = require('vinyl-fs'); +const opn = require('opn'); + +const APP_ROOT = path.join(__dirname, '..'); +const WEB_DEV_EXTENSIONS_ROOT = path.join(APP_ROOT, '.build', 'builtInWebDevExtensions'); + +const WEB_PLAYGROUND_VERSION = '0.0.13'; + +async function main() { + + const args = minimist(process.argv.slice(2), { + boolean: [ + 'help', + 'playground' + ], + string: [ + 'host', + 'port', + 'extensionPath', + 'browser', + 'browserType' + ], + }); + + if (args.help) { + console.log( + './scripts/code-web.sh|bat [options]\n' + + ' --playground Include the vscode-web-playground extension (added by default if no folderPath is provided)\n' + ); + startServer(['--help']); + return; + } + + const serverArgs = []; + + const HOST = args['host'] ?? 'localhost'; + const PORT = args['port'] ?? '8080'; + + if (args['host'] === undefined) { + serverArgs.push('--host', HOST); + } + if (args['port'] === undefined) { + serverArgs.push('--port', PORT); + } + if (args['playground'] === true || (args['_'].length === 0 && !args['--folder-uri'])) { + serverArgs.push('--extensionPath', WEB_DEV_EXTENSIONS_ROOT); + serverArgs.push('--folder-uri', 'memfs:///sample-folder'); + await ensureWebDevExtensions(args['verbose']); + } + + let openSystemBrowser = false; + if (!args['browser'] && !args['browserType']) { + serverArgs.push('--browserType', 'none'); + openSystemBrowser = true; + } + + serverArgs.push('--sourcesPath', APP_ROOT); + + serverArgs.push(...process.argv.slice(2).filter(v => !v.startsWith('--playground') && v !== '--no-playground')); + + + startServer(serverArgs); + if (openSystemBrowser) { + opn(`http://${HOST}:${PORT}/`); + } +} + +function startServer(runnerArguments) { + const env = { ...process.env }; + + console.log(`Starting @vscode/test-web: ${testWebLocation} ${runnerArguments.join(' ')}`); + const proc = cp.spawn(process.execPath, [testWebLocation, ...runnerArguments], { env, stdio: 'inherit' }); + + proc.on('exit', (code) => process.exit(code)); + + process.on('exit', () => proc.kill()); + process.on('SIGINT', () => { + proc.kill(); + process.exit(128 + 2); // https://nodejs.org/docs/v14.16.0/api/process.html#process_signal_events + }); + process.on('SIGTERM', () => { + proc.kill(); + process.exit(128 + 15); // https://nodejs.org/docs/v14.16.0/api/process.html#process_signal_events + }); +} + +async function directoryExists(path) { + try { + return (await fs.promises.stat(path)).isDirectory(); + } catch { + return false; + } +} + +async function ensureWebDevExtensions(verbose) { + + // Playground (https://github.com/microsoft/vscode-web-playground) + const webDevPlaygroundRoot = path.join(WEB_DEV_EXTENSIONS_ROOT, 'vscode-web-playground'); + const webDevPlaygroundExists = await directoryExists(webDevPlaygroundRoot); + + let downloadPlayground = false; + if (webDevPlaygroundExists) { + try { + const webDevPlaygroundPackageJson = JSON.parse(((await fs.promises.readFile(path.join(webDevPlaygroundRoot, 'package.json'))).toString())); + if (webDevPlaygroundPackageJson.version !== WEB_PLAYGROUND_VERSION) { + downloadPlayground = true; + } + } catch (error) { + downloadPlayground = true; + } + } else { + downloadPlayground = true; + } + + if (downloadPlayground) { + if (verbose) { + fancyLog(`${ansiColors.magenta('Web Development extensions')}: Downloading vscode-web-playground to ${webDevPlaygroundRoot}`); + } + await new Promise((resolve, reject) => { + remote(['package.json', 'dist/extension.js', 'dist/extension.js.map'], { + base: 'https://raw.githubusercontent.com/microsoft/vscode-web-playground/main/' + }).pipe(vfs.dest(webDevPlaygroundRoot)).on('end', resolve).on('error', reject); + }); + } else { + if (verbose) { + fancyLog(`${ansiColors.magenta('Web Development extensions')}: Using existing vscode-web-playground in ${webDevPlaygroundRoot}`); + } + } +} + + +main(); diff --git a/resources/server/bin-dev/code-server.sh b/scripts/code-web.sh similarity index 53% rename from resources/server/bin-dev/code-server.sh rename to scripts/code-web.sh index 99a47c4fb22..19313a61e01 100755 --- a/resources/server/bin-dev/code-server.sh +++ b/scripts/code-web.sh @@ -2,9 +2,9 @@ if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } - ROOT=$(dirname $(dirname $(dirname $(dirname $(realpath "$0"))))) + ROOT=$(dirname $(dirname $(realpath "$0"))) else - ROOT=$(dirname $(dirname $(dirname $(dirname $(readlink -f $0))))) + ROOT=$(dirname $(dirname $(readlink -f $0))) fi function code() { @@ -14,15 +14,14 @@ function code() { yarn download-builtin-extensions NODE=$(node build/lib/node.js) - - # Download nodejs - if [ ! -f $NODE ]; then + if [ ! -e $NODE ];then + # Load remote node yarn gulp node fi - NODE_ENV=development \ - VSCODE_DEV=1 \ - $NODE "$ROOT/out/vs/server/main.js" "$@" + NODE=$(node build/lib/node.js) + + $NODE ./scripts/code-web.js "$@" } code "$@" diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index 3da6d3c9e62..309bfd91e33 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -47,52 +47,77 @@ if "%INTEGRATION_TEST_ELECTRON_PATH%"=="" ( :: Tests standalone (AMD) +echo. +echo ### node.js integration tests call .\scripts\test.bat --runGlob **\*.integrationTest.js %* if %errorlevel% neq 0 exit /b %errorlevel% :: Tests in the extension host -set ALL_PLATFORMS_API_TESTS_EXTRA_ARGS=--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=%VSCODECRASHDIR% --logsPath=%VSCODELOGSDIR% --no-cached-data --disable-updates --disable-keytar --disable-extensions --disable-workspace-trust --user-data-dir=%VSCODEUSERDATADIR% +set API_TESTS_EXTRA_ARGS=--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=%VSCODECRASHDIR% --logsPath=%VSCODELOGSDIR% --no-cached-data --disable-updates --disable-keytar --disable-extensions --disable-workspace-trust --user-data-dir=%VSCODEUSERDATADIR% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-api-tests\testWorkspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\singlefolder-tests %ALL_PLATFORMS_API_TESTS_EXTRA_ARGS% +echo. +echo ### API tests (folder) +call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-api-tests\testWorkspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\singlefolder-tests %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-api-tests\testworkspace.code-workspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\workspace-tests %ALL_PLATFORMS_API_TESTS_EXTRA_ARGS% +echo. +echo ### API tests (workspace) +call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-api-tests\testworkspace.code-workspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=%~dp0\..\extensions\vscode-api-tests --extensionTestsPath=%~dp0\..\extensions\vscode-api-tests\out\workspace-tests %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-colorize-tests\test --extensionDevelopmentPath=%~dp0\..\extensions\vscode-colorize-tests --extensionTestsPath=%~dp0\..\extensions\vscode-colorize-tests\out %ALL_PLATFORMS_API_TESTS_EXTRA_ARGS% +echo. +echo ### Colorize tests +call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-colorize-tests\test --extensionDevelopmentPath=%~dp0\..\extensions\vscode-colorize-tests --extensionTestsPath=%~dp0\..\extensions\vscode-colorize-tests\out %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\typescript-language-features\test-workspace --extensionDevelopmentPath=%~dp0\..\extensions\typescript-language-features --extensionTestsPath=%~dp0\..\extensions\typescript-language-features\out\test\unit --enable-proposed-api=vscode.typescript-language-features %ALL_PLATFORMS_API_TESTS_EXTRA_ARGS% +echo. +echo ### TypeScript tests +call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\typescript-language-features\test-workspace --extensionDevelopmentPath=%~dp0\..\extensions\typescript-language-features --extensionTestsPath=%~dp0\..\extensions\typescript-language-features\out\test\unit --enable-proposed-api=vscode.typescript-language-features %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\markdown-language-features\test-workspace --extensionDevelopmentPath=%~dp0\..\extensions\markdown-language-features --extensionTestsPath=%~dp0\..\extensions\markdown-language-features\out\test %ALL_PLATFORMS_API_TESTS_EXTRA_ARGS% +echo. +echo ### Markdown tests +call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\markdown-language-features\test-workspace --extensionDevelopmentPath=%~dp0\..\extensions\markdown-language-features --extensionTestsPath=%~dp0\..\extensions\markdown-language-features\out\test %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\emmet\test-workspace --extensionDevelopmentPath=%~dp0\..\extensions\emmet --extensionTestsPath=%~dp0\..\extensions\emmet\out\test %ALL_PLATFORMS_API_TESTS_EXTRA_ARGS% +echo. +echo ### Emmet tests +call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\emmet\test-workspace --extensionDevelopmentPath=%~dp0\..\extensions\emmet --extensionTestsPath=%~dp0\..\extensions\emmet\out\test %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% +echo. +echo ### Git tests for /f "delims=" %%i in ('node -p "require('fs').realpathSync.native(require('os').tmpdir())"') do set TEMPDIR=%%i set GITWORKSPACE=%TEMPDIR%\git-%RANDOM% mkdir %GITWORKSPACE% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %GITWORKSPACE% --extensionDevelopmentPath=%~dp0\..\extensions\git --extensionTestsPath=%~dp0\..\extensions\git\out\test --enable-proposed-api=vscode.git %ALL_PLATFORMS_API_TESTS_EXTRA_ARGS% +call "%INTEGRATION_TEST_ELECTRON_PATH%" %GITWORKSPACE% --extensionDevelopmentPath=%~dp0\..\extensions\git --extensionTestsPath=%~dp0\..\extensions\git\out\test --enable-proposed-api=vscode.git %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% +echo. +echo ### Ipynb tests set IPYNBWORKSPACE=%TEMPDIR%\ipynb-%RANDOM% mkdir %IPYNBWORKSPACE% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %IPYNBWORKSPACE% --extensionDevelopmentPath=%~dp0\..\extensions\ipynb --extensionTestsPath=%~dp0\..\extensions\ipynb\out\test %ALL_PLATFORMS_API_TESTS_EXTRA_ARGS% +call "%INTEGRATION_TEST_ELECTRON_PATH%" %IPYNBWORKSPACE% --extensionDevelopmentPath=%~dp0\..\extensions\ipynb --extensionTestsPath=%~dp0\..\extensions\ipynb\out\test %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% :: Tests standalone (CommonJS) +echo. +echo ### CSS tests call %~dp0\node-electron.bat %~dp0\..\extensions\css-language-features/server/test/index.js if %errorlevel% neq 0 exit /b %errorlevel% +echo. +echo ### HTML tests call %~dp0\node-electron.bat %~dp0\..\extensions\html-language-features/server/test/index.js if %errorlevel% neq 0 exit /b %errorlevel% + +:: Cleanup + rmdir /s /q %VSCODEUSERDATADIR% popd diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 2eb8ce50a73..2fb82e34740 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -14,6 +14,7 @@ fi VSCODEUSERDATADIR=`mktemp -d 2>/dev/null` VSCODECRASHDIR=$ROOT/.build/crashes VSCODELOGSDIR=$ROOT/.build/logs/integration-tests + cd $ROOT # Figure out which Electron to use for running tests @@ -45,7 +46,6 @@ else # Configuration for more verbose output export VSCODE_CLI=1 - export ELECTRON_ENABLE_STACK_DUMPING=1 export ELECTRON_ENABLE_LOGGING=1 echo "Storing crash reports into '$VSCODECRASHDIR'." @@ -53,54 +53,87 @@ else echo "Running integration tests with '$INTEGRATION_TEST_ELECTRON_PATH' as build." fi -if [ -z "$INTEGRATION_TEST_APP_NAME" ]; then - after_suite() { true; } -else - after_suite() { killall $INTEGRATION_TEST_APP_NAME || true; } -fi - # Tests standalone (AMD) +echo +echo "### node.js integration tests" +echo ./scripts/test.sh --runGlob **/*.integrationTest.js "$@" -after_suite # Tests in the extension host -ALL_PLATFORMS_API_TESTS_EXTRA_ARGS="--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=$VSCODECRASHDIR --logsPath=$VSCODELOGSDIR --no-cached-data --disable-updates --disable-keytar --disable-extensions --disable-workspace-trust --user-data-dir=$VSCODEUSERDATADIR" +API_TESTS_EXTRA_ARGS="--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=$VSCODECRASHDIR --logsPath=$VSCODELOGSDIR --no-cached-data --disable-updates --disable-keytar --disable-extensions --disable-workspace-trust --user-data-dir=$VSCODEUSERDATADIR" -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/vscode-api-tests/testWorkspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/singlefolder-tests $ALL_PLATFORMS_API_TESTS_EXTRA_ARGS -after_suite +if [ -z "$INTEGRATION_TEST_APP_NAME" ]; then + kill_app() { true; } +else + kill_app() { killall $INTEGRATION_TEST_APP_NAME || true; } +fi -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/vscode-api-tests/testworkspace.code-workspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/workspace-tests $ALL_PLATFORMS_API_TESTS_EXTRA_ARGS -after_suite +echo +echo "### API tests (folder)" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/vscode-api-tests/testWorkspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/singlefolder-tests $API_TESTS_EXTRA_ARGS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out $ALL_PLATFORMS_API_TESTS_EXTRA_ARGS -after_suite +echo +echo "### API tests (workspace)" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/vscode-api-tests/testworkspace.code-workspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/workspace-tests $API_TESTS_EXTRA_ARGS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/typescript-language-features/test-workspace --enable-proposed-api=vscode.typescript-language-features --extensionDevelopmentPath=$ROOT/extensions/typescript-language-features --extensionTestsPath=$ROOT/extensions/typescript-language-features/out/test/unit $ALL_PLATFORMS_API_TESTS_EXTRA_ARGS -after_suite +echo +echo "### Colorize tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out $API_TESTS_EXTRA_ARGS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/markdown-language-features/test-workspace --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test $ALL_PLATFORMS_API_TESTS_EXTRA_ARGS -after_suite +echo +echo "### TypeScript tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/typescript-language-features/test-workspace --enable-proposed-api=vscode.typescript-language-features --extensionDevelopmentPath=$ROOT/extensions/typescript-language-features --extensionTestsPath=$ROOT/extensions/typescript-language-features/out/test/unit $API_TESTS_EXTRA_ARGS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/emmet/test-workspace --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test $ALL_PLATFORMS_API_TESTS_EXTRA_ARGS -after_suite +echo +echo "### Markdown tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/markdown-language-features/test-workspace --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test $API_TESTS_EXTRA_ARGS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $(mktemp -d 2>/dev/null) --enable-proposed-api=vscode.git --extensionDevelopmentPath=$ROOT/extensions/git --extensionTestsPath=$ROOT/extensions/git/out/test $ALL_PLATFORMS_API_TESTS_EXTRA_ARGS -after_suite +echo +echo "### Emmet tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $ROOT/extensions/emmet/test-workspace --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test $API_TESTS_EXTRA_ARGS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $(mktemp -d 2>/dev/null) --extensionDevelopmentPath=$ROOT/extensions/ipynb --extensionTestsPath=$ROOT/extensions/ipynb/out/test $ALL_PLATFORMS_API_TESTS_EXTRA_ARGS -after_suite +echo +echo "### Git tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $(mktemp -d 2>/dev/null) --enable-proposed-api=vscode.git --extensionDevelopmentPath=$ROOT/extensions/git --extensionTestsPath=$ROOT/extensions/git/out/test $API_TESTS_EXTRA_ARGS +kill_app + +echo +echo "### Ipynb tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS $(mktemp -d 2>/dev/null) --extensionDevelopmentPath=$ROOT/extensions/ipynb --extensionTestsPath=$ROOT/extensions/ipynb/out/test $API_TESTS_EXTRA_ARGS +kill_app # Tests standalone (CommonJS) +echo +echo "### CSS tests" +echo cd $ROOT/extensions/css-language-features/server && $ROOT/scripts/node-electron.sh test/index.js -after_suite +echo +echo "### HTML tests" +echo cd $ROOT/extensions/html-language-features/server && $ROOT/scripts/node-electron.sh test/index.js -after_suite + + +# Cleanup rm -rf $VSCODEUSERDATADIR diff --git a/resources/server/test/test-remote-integration.bat b/scripts/test-remote-integration.bat similarity index 84% rename from resources/server/test/test-remote-integration.bat rename to scripts/test-remote-integration.bat index c31dff424d2..396737b831e 100644 --- a/resources/server/test/test-remote-integration.bat +++ b/scripts/test-remote-integration.bat @@ -1,7 +1,7 @@ @echo off setlocal -pushd %~dp0\..\..\.. +pushd %~dp0\.. IF "%~1" == "" ( set AUTHORITY=vscode-remote://test+test/ @@ -20,24 +20,24 @@ IF "%VSCODEUSERDATADIR%" == "" ( ) set REMOTE_VSCODE=%AUTHORITY%%EXT_PATH% -set VSCODECRASHDIR=%~dp0\..\..\..\.build\crashes -set VSCODELOGSDIR=%~dp0\..\..\..\.build\logs\integration-tests-remote +set VSCODECRASHDIR=%~dp0\..\.build\crashes +set VSCODELOGSDIR=%~dp0\..\.build\logs\integration-tests-remote set TESTRESOLVER_DATA_FOLDER=%TMP%\testresolverdatafolder-%RANDOM%-%TIME:~6,5% set TESTRESOLVER_LOGS_FOLDER=%VSCODELOGSDIR%\server if "%VSCODE_REMOTE_SERVER_PATH%"=="" ( - echo "Using remote server out of sources for integration tests" + echo Using remote server out of sources for integration tests ) else ( set TESTRESOLVER_INSTALL_BUILTIN_EXTENSION=ms-vscode.vscode-smoketest-check - echo "Using %VSCODE_REMOTE_SERVER_PATH% as server path" + echo Using '%VSCODE_REMOTE_SERVER_PATH%' as server path ) set API_TESTS_EXTRA_ARGS=--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=%VSCODECRASHDIR% --logsPath=%VSCODELOGSDIR% --no-cached-data --disable-updates --disable-keytar --disable-inspect --disable-workspace-trust --user-data-dir=%VSCODEUSERDATADIR% :: Figure out which Electron to use for running tests if "%INTEGRATION_TEST_ELECTRON_PATH%"=="" ( - echo "Storing crash reports into '%VSCODECRASHDIR%'." - echo "Storing log files into '%VSCODELOGSDIR%'." + echo Storing crash reports into '%VSCODECRASHDIR%' + echo Storing log files into '%VSCODELOGSDIR%' :: Tests in the extension host running from sources call .\scripts\code.bat --folder-uri=%REMOTE_VSCODE%/vscode-api-tests/testWorkspace --extensionDevelopmentPath=%REMOTE_VSCODE%/vscode-api-tests --extensionTestsPath=%REMOTE_VSCODE%/vscode-api-tests/out/singlefolder-tests %API_TESTS_EXTRA_ARGS% @@ -46,14 +46,16 @@ if "%INTEGRATION_TEST_ELECTRON_PATH%"=="" ( call .\scripts\code.bat --file-uri=%REMOTE_VSCODE%/vscode-api-tests/testworkspace.code-workspace --extensionDevelopmentPath=%REMOTE_VSCODE%/vscode-api-tests --extensionTestsPath=%REMOTE_VSCODE%/vscode-api-tests/out/workspace-tests %API_TESTS_EXTRA_ARGS% if %errorlevel% neq 0 exit /b %errorlevel% ) else ( - echo "Storing crash reports into '%VSCODECRASHDIR%'." - echo "Storing log files into '%VSCODELOGSDIR%'." - echo "Using %INTEGRATION_TEST_ELECTRON_PATH% as Electron path" + echo Storing crash reports into '%VSCODECRASHDIR%' + echo Storing log files into '%VSCODELOGSDIR%' + echo Using %INTEGRATION_TEST_ELECTRON_PATH% as Electron path :: Run from a built: need to compile all test extensions :: because we run extension tests from their source folders :: and the build bundles extensions into .build webpacked call yarn gulp compile-extension:vscode-api-tests^ + compile-extension:microsoft-authentication^ + compile-extension:github-authentication^ compile-extension:vscode-test-resolver :: Configuration for more verbose output diff --git a/resources/server/test/test-remote-integration.sh b/scripts/test-remote-integration.sh similarity index 69% rename from resources/server/test/test-remote-integration.sh rename to scripts/test-remote-integration.sh index 71fee7327b4..39c36592e24 100755 --- a/resources/server/test/test-remote-integration.sh +++ b/scripts/test-remote-integration.sh @@ -1,21 +1,23 @@ -#!/bin/bash +#!/usr/bin/env bash set -e if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } - ROOT=$(dirname $(dirname $(dirname $(dirname $(realpath "$0"))))) - VSCODEUSERDATADIR=`mktemp -d -t 'myuserdatadir'` - TESTRESOLVER_DATA_FOLDER=`mktemp -d -t 'testresolverdatafolder'` + ROOT=$(dirname $(dirname $(realpath "$0"))) else - ROOT=$(dirname $(dirname $(dirname $(dirname $(readlink -f $0))))) - VSCODEUSERDATADIR=`mktemp -d 2>/dev/null` - TESTRESOLVER_DATA_FOLDER=`mktemp -d 2>/dev/null` + ROOT=$(dirname $(dirname $(readlink -f $0))) # --disable-dev-shm-usage --use-gl=swiftshader: when run on docker containers where size of /dev/shm # partition < 64MB which causes OOM failure for chromium compositor that uses the partition for shared memory LINUX_EXTRA_ARGS="--disable-dev-shm-usage --use-gl=swiftshader" fi +VSCODEUSERDATADIR=`mktemp -d 2>/dev/null` +VSCODECRASHDIR=$ROOT/.build/crashes +VSCODELOGSDIR=$ROOT/.build/logs/integration-tests-remote +TESTRESOLVER_DATA_FOLDER=`mktemp -d 2>/dev/null` + cd $ROOT + if [[ "$1" == "" ]]; then AUTHORITY=vscode-remote://test+test EXT_PATH=$ROOT/extensions @@ -28,25 +30,20 @@ else fi export REMOTE_VSCODE=$AUTHORITY$EXT_PATH -VSCODECRASHDIR=$ROOT/.build/crashes -VSCODELOGSDIR=$ROOT/.build/logs/integration-tests-remote # Figure out which Electron to use for running tests if [ -z "$INTEGRATION_TEST_ELECTRON_PATH" ] then - echo "Storing crash reports into '$VSCODECRASHDIR'." - echo "Storing log files into '$VSCODELOGSDIR'." - - # code.sh makes sure Test Extensions are compiled + # Run out of sources: no need to compile as code.sh takes care of it INTEGRATION_TEST_ELECTRON_PATH="./scripts/code.sh" # No extra arguments when running out of sources EXTRA_INTEGRATION_TEST_ARGUMENTS="" -else + echo "Storing crash reports into '$VSCODECRASHDIR'." echo "Storing log files into '$VSCODELOGSDIR'." - echo "Using $INTEGRATION_TEST_ELECTRON_PATH as Electron path for integration tests" - + echo "Running remote integration tests out of sources." +else # Run from a built: need to compile all test extensions # because we run extension tests from their source folders # and the build bundles extensions into .build webpacked @@ -56,21 +53,21 @@ else compile-extension:typescript-language-features \ compile-extension:emmet \ compile-extension:git \ + compile-extension:ipynb \ + compile-extension:microsoft-authentication \ + compile-extension:github-authentication \ compile-extension-media # Configuration for more verbose output export VSCODE_CLI=1 - export ELECTRON_ENABLE_STACK_DUMPING=1 export ELECTRON_ENABLE_LOGGING=1 # Running from a build, we need to enable the vscode-test-resolver extension EXTRA_INTEGRATION_TEST_ARGUMENTS="--extensions-dir=$EXT_PATH --enable-proposed-api=vscode.vscode-test-resolver --enable-proposed-api=vscode.vscode-api-tests --enable-proposed-api=vscode.image-preview --enable-proposed-api=vscode.git" -fi -if [ -z "$INTEGRATION_TEST_APP_NAME" ]; then - after_suite() { true; } -else - after_suite() { killall $INTEGRATION_TEST_APP_NAME || true; } + echo "Storing crash reports into '$VSCODECRASHDIR'." + echo "Storing log files into '$VSCODELOGSDIR'." + echo "Running remote integration tests with $INTEGRATION_TEST_ELECTRON_PATH as build." fi export TESTRESOLVER_DATA_FOLDER=$TESTRESOLVER_DATA_FOLDER @@ -85,29 +82,59 @@ else export TESTRESOLVER_INSTALL_BUILTIN_EXTENSION='ms-vscode.vscode-smoketest-check' fi -# Tests in the extension host +if [ -z "$INTEGRATION_TEST_APP_NAME" ]; then + kill_app() { true; } +else + kill_app() { killall $INTEGRATION_TEST_APP_NAME || true; } +fi -API_TESTS_DEFAULT_EXTRA_ARGS="--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=$VSCODECRASHDIR --logsPath=$VSCODELOGSDIR --no-cached-data --disable-updates --disable-keytar --disable-inspect --disable-workspace-trust --user-data-dir=$VSCODEUSERDATADIR" +API_TESTS_EXTRA_ARGS="--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=$VSCODECRASHDIR --logsPath=$VSCODELOGSDIR --no-cached-data --disable-updates --disable-keytar --disable-workspace-trust --user-data-dir=$VSCODEUSERDATADIR" -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$REMOTE_VSCODE/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$REMOTE_VSCODE/vscode-api-tests --extensionTestsPath=$REMOTE_VSCODE/vscode-api-tests/out/singlefolder-tests $API_TESTS_DEFAULT_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS -after_suite +echo +echo "### API tests (folder)" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$REMOTE_VSCODE/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$REMOTE_VSCODE/vscode-api-tests --extensionTestsPath=$REMOTE_VSCODE/vscode-api-tests/out/singlefolder-tests $API_TESTS_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --file-uri=$REMOTE_VSCODE/vscode-api-tests/testworkspace.code-workspace --extensionDevelopmentPath=$REMOTE_VSCODE/vscode-api-tests --extensionTestsPath=$REMOTE_VSCODE/vscode-api-tests/out/workspace-tests $API_TESTS_DEFAULT_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS -after_suite +echo +echo "### API tests (workspace)" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --file-uri=$REMOTE_VSCODE/vscode-api-tests/testworkspace.code-workspace --extensionDevelopmentPath=$REMOTE_VSCODE/vscode-api-tests --extensionTestsPath=$REMOTE_VSCODE/vscode-api-tests/out/workspace-tests $API_TESTS_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$REMOTE_VSCODE/typescript-language-features/test-workspace --enable-proposed-api=vscode.typescript-language-features --extensionDevelopmentPath=$REMOTE_VSCODE/typescript-language-features --extensionTestsPath=$REMOTE_VSCODE/typescript-language-features/out/test/unit $API_TESTS_DEFAULT_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS -after_suite +echo +echo "### TypeScript tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$REMOTE_VSCODE/typescript-language-features/test-workspace --enable-proposed-api=vscode.typescript-language-features --extensionDevelopmentPath=$REMOTE_VSCODE/typescript-language-features --extensionTestsPath=$REMOTE_VSCODE/typescript-language-features/out/test/unit $API_TESTS_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$REMOTE_VSCODE/markdown-language-features/test-workspace --extensionDevelopmentPath=$REMOTE_VSCODE/markdown-language-features --extensionTestsPath=$REMOTE_VSCODE/markdown-language-features/out/test $API_TESTS_DEFAULT_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS -after_suite +echo +echo "### Markdown tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$REMOTE_VSCODE/markdown-language-features/test-workspace --extensionDevelopmentPath=$REMOTE_VSCODE/markdown-language-features --extensionTestsPath=$REMOTE_VSCODE/markdown-language-features/out/test $API_TESTS_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$REMOTE_VSCODE/emmet/test-workspace --extensionDevelopmentPath=$REMOTE_VSCODE/emmet --extensionTestsPath=$REMOTE_VSCODE/emmet/out/test $API_TESTS_DEFAULT_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS -after_suite +echo +echo "### Emmet tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$REMOTE_VSCODE/emmet/test-workspace --extensionDevelopmentPath=$REMOTE_VSCODE/emmet --extensionTestsPath=$REMOTE_VSCODE/emmet/out/test $API_TESTS_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS +kill_app -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$AUTHORITY$(mktemp -d 2>/dev/null) --extensionDevelopmentPath=$REMOTE_VSCODE/git --extensionTestsPath=$REMOTE_VSCODE/git/out/test $API_TESTS_DEFAULT_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS -after_suite +echo +echo "### Git tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$AUTHORITY$(mktemp -d 2>/dev/null) --extensionDevelopmentPath=$REMOTE_VSCODE/git --extensionTestsPath=$REMOTE_VSCODE/git/out/test $API_TESTS_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS +kill_app + +echo +echo "### Ipynb tests" +echo +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_EXTRA_ARGS --folder-uri=$AUTHORITY$(mktemp -d 2>/dev/null) --extensionDevelopmentPath=$REMOTE_VSCODE/ipynb --extensionTestsPath=$REMOTE_VSCODE/ipynb/out/test $API_TESTS_EXTRA_ARGS $EXTRA_INTEGRATION_TEST_ARGUMENTS +kill_app + + +# Cleanup -# Clean up if [[ "$3" == "" ]]; then rm -rf $VSCODEUSERDATADIR fi diff --git a/resources/server/test/test-web-integration.bat b/scripts/test-web-integration.bat similarity index 84% rename from resources/server/test/test-web-integration.bat rename to scripts/test-web-integration.bat index d063276409b..6f778843e05 100644 --- a/resources/server/test/test-web-integration.bat +++ b/scripts/test-web-integration.bat @@ -1,7 +1,7 @@ @echo off setlocal -pushd %~dp0\..\..\.. +pushd %~dp0\.. IF "%~1" == "" ( set AUTHORITY=vscode-remote://test+test/ @@ -18,9 +18,9 @@ IF "%~1" == "" ( set REMOTE_VSCODE=%AUTHORITY%%EXT_PATH% if "%VSCODE_REMOTE_SERVER_PATH%"=="" ( - echo "Using remote server out of sources for integration web tests" + echo Using remote server out of sources for integration web tests ) else ( - echo "Using %VSCODE_REMOTE_SERVER_PATH% as server path for web integration tests" + echo Using '%VSCODE_REMOTE_SERVER_PATH%' as server path for web integration tests :: Run from a built: need to compile all test extensions :: because we run extension tests from their source folders @@ -33,21 +33,38 @@ if "%VSCODE_REMOTE_SERVER_PATH%"=="" ( compile-extension-media ) +if not exist ".\test\integration\browser\out\index.js" ( + call yarn --cwd test/integration/browser compile + call yarn playwright-install +) + +echo. +echo ### API tests (folder) call node .\test\integration\browser\out\index.js --workspacePath=.\extensions\vscode-api-tests\testWorkspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=.\extensions\vscode-api-tests --extensionTestsPath=.\extensions\vscode-api-tests\out\singlefolder-tests %* if %errorlevel% neq 0 exit /b %errorlevel% +echo. +echo ### API tests (workspace) call node .\test\integration\browser\out\index.js --workspacePath=.\extensions\vscode-api-tests\testworkspace.code-workspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=.\extensions\vscode-api-tests --extensionTestsPath=.\extensions\vscode-api-tests\out\workspace-tests %* if %errorlevel% neq 0 exit /b %errorlevel% +echo. +echo ### TypeScript tests call node .\test\integration\browser\out\index.js --workspacePath=.\extensions\typescript-language-features\test-workspace --extensionDevelopmentPath=.\extensions\typescript-language-features --extensionTestsPath=.\extensions\typescript-language-features\out\test\unit %* if %errorlevel% neq 0 exit /b %errorlevel% +echo. +echo ### Markdown tests call node .\test\integration\browser\out\index.js --workspacePath=.\extensions\markdown-language-features\test-workspace --extensionDevelopmentPath=.\extensions\markdown-language-features --extensionTestsPath=.\extensions\markdown-language-features\out\test %* if %errorlevel% neq 0 exit /b %errorlevel% +echo. +echo ### Emmet tests call node .\test\integration\browser\out\index.js --workspacePath=.\extensions\emmet\test-workspace --extensionDevelopmentPath=.\extensions\emmet --extensionTestsPath=.\extensions\emmet\out\test %* if %errorlevel% neq 0 exit /b %errorlevel% +echo. +echo ### Git tests for /f "delims=" %%i in ('node -p "require('fs').realpathSync.native(require('os').tmpdir())"') do set TEMPDIR=%%i set GITWORKSPACE=%TEMPDIR%\git-%RANDOM% mkdir %GITWORKSPACE% diff --git a/resources/server/test/test-web-integration.sh b/scripts/test-web-integration.sh similarity index 75% rename from resources/server/test/test-web-integration.sh rename to scripts/test-web-integration.sh index 8c6962b4244..f1b6c7683ac 100755 --- a/resources/server/test/test-web-integration.sh +++ b/scripts/test-web-integration.sh @@ -1,11 +1,11 @@ -#!/bin/bash +#!/usr/bin/env bash set -e if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } - ROOT=$(dirname $(dirname $(dirname $(dirname $(realpath "$0"))))) + ROOT=$(dirname $(dirname $(realpath "$0"))) else - ROOT=$(dirname $(dirname $(dirname $(dirname $(readlink -f $0))))) + ROOT=$(dirname $(dirname $(readlink -f $0))) fi cd $ROOT @@ -24,13 +24,49 @@ else compile-extension:typescript-language-features \ compile-extension:emmet \ compile-extension:git \ + compile-extension:ipynb \ compile-extension-media fi +if [ ! -e 'test/integration/browser/out/index.js' ];then + yarn --cwd test/integration/browser compile + yarn playwright-install +fi + # Tests in the extension host + +echo +echo "### API tests (folder)" +echo node test/integration/browser/out/index.js --workspacePath $ROOT/extensions/vscode-api-tests/testWorkspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/singlefolder-tests "$@" + +echo +echo "### API tests (workspace)" +echo node test/integration/browser/out/index.js --workspacePath $ROOT/extensions/vscode-api-tests/testworkspace.code-workspace --enable-proposed-api=vscode.vscode-api-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out/workspace-tests "$@" + +echo +echo "### TypeScript tests" +echo node test/integration/browser/out/index.js --workspacePath $ROOT/extensions/typescript-language-features/test-workspace --extensionDevelopmentPath=$ROOT/extensions/typescript-language-features --extensionTestsPath=$ROOT/extensions/typescript-language-features/out/test/unit "$@" + +echo +echo "### Markdown tests" +echo node test/integration/browser/out/index.js --workspacePath $ROOT/extensions/markdown-language-features/test-workspace --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test "$@" + +echo +echo "### Emmet tests" +echo node test/integration/browser/out/index.js --workspacePath $ROOT/extensions/emmet/test-workspace --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test "$@" + +echo +echo "### Git tests" +echo node test/integration/browser/out/index.js --workspacePath $(mktemp -d 2>/dev/null) --enable-proposed-api=vscode.git --extensionDevelopmentPath=$ROOT/extensions/git --extensionTestsPath=$ROOT/extensions/git/out/test "$@" + +echo +echo "### Ipynb tests" +echo +node test/integration/browser/out/index.js --workspacePath $(mktemp -d 2>/dev/null) --enable-proposed-api=vscode.ipynb --extensionDevelopmentPath=$ROOT/extensions/ipynb --extensionTestsPath=$ROOT/extensions/ipynb/out/test "$@" + diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index c11168a2bc7..3acef21ad52 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -37,9 +37,6 @@ if (process.env['VSCODE_PARENT_PID']) { terminateWhenParentTerminates(); } -// Configure Crash Reporter -configureCrashReporter(); - // Load AMD entry point require('./bootstrap-amd').load(process.env['VSCODE_AMD_ENTRYPOINT']); @@ -266,18 +263,4 @@ function terminateWhenParentTerminates() { } } -function configureCrashReporter() { - const crashReporterOptionsRaw = process.env['VSCODE_CRASH_REPORTER_START_OPTIONS']; - if (typeof crashReporterOptionsRaw === 'string') { - try { - const crashReporterOptions = JSON.parse(crashReporterOptionsRaw); - if (crashReporterOptions && process['crashReporter'] /* Electron only */) { - process['crashReporter'].start(crashReporterOptions); - } - } catch (error) { - console.error(error); - } - } -} - //#endregion diff --git a/src/buildfile.js b/src/buildfile.js index 5b9b061df45..f5df248ba21 100644 --- a/src/buildfile.js +++ b/src/buildfile.js @@ -22,7 +22,7 @@ exports.base = [ } ]; -exports.workerExtensionHost = [createEditorWorkerModuleDescription('vs/workbench/services/extensions/worker/extensionHostWorker')]; +exports.workerExtensionHost = [createEditorWorkerModuleDescription('vs/workbench/api/worker/extensionHostWorker')]; exports.workerNotebook = [createEditorWorkerModuleDescription('vs/workbench/contrib/notebook/common/services/notebookSimpleWorker')]; exports.workerSharedProcess = [createEditorWorkerModuleDescription('vs/platform/sharedProcess/electron-browser/sharedProcessWorkerMain')]; exports.workerLanguageDetection = [createEditorWorkerModuleDescription('vs/workbench/services/languageDetection/browser/languageDetectionSimpleWorker')]; diff --git a/src/main.js b/src/main.js index 0c2981ec2d0..c9347d4516b 100644 --- a/src/main.js +++ b/src/main.js @@ -21,12 +21,11 @@ const os = require('os'); const bootstrap = require('./bootstrap'); const bootstrapNode = require('./bootstrap-node'); const { getUserDataPath } = require('./vs/platform/environment/node/userDataPath'); +const { stripComments } = require('./vs/base/common/stripComments'); /** @type {Partial} */ const product = require('../product.json'); const { app, protocol, crashReporter } = require('electron'); -app.allowRendererProcessReuse = false; - // Enable portable support const portable = bootstrapNode.configurePortable(product); @@ -173,10 +172,7 @@ function configureCommandlineSwitchesSync(cliArgs) { 'enable-proposed-api', // Log level to use. Default is 'info'. Allowed values are 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'. - 'log-level', - - // Enables render process reuse. Default value is 'false'. See https://github.com/electron/electron/issues/18397 - 'enable-render-process-reuse' + 'log-level' ]; // Read argv config @@ -221,12 +217,6 @@ function configureCommandlineSwitchesSync(cliArgs) { process.argv.push('--log', argvValue); } break; - - case 'enable-render-process-reuse': - if (argvValue === true) { - app.allowRendererProcessReuse = true; - } - break; } } }); @@ -583,34 +573,6 @@ async function resolveNlsConfiguration() { return nlsConfiguration; } -/** - * @param {string} content - * @returns {string} - */ -function stripComments(content) { - const regexp = /("(?:[^\\"]*(?:\\.)?)*")|('(?:[^\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; - - return content.replace(regexp, function (match, m1, m2, m3, m4) { - // Only one of m1, m2, m3, m4 matches - if (m3) { - // A block comment. Replace with nothing - return ''; - } else if (m4) { - // A line comment. If it ends in \r?\n then keep it. - const length_1 = m4.length; - if (length_1 > 2 && m4[length_1 - 1] === '\n') { - return m4[length_1 - 2] === '\r' ? '\r\n' : '\n'; - } - else { - return ''; - } - } else { - // We match a string - return match; - } - }); -} - /** * Language tags are case insensitive however an amd loader is case sensitive * To make this work on case preserving & insensitive FS we do the following: diff --git a/src/vs/server/cli.js b/src/server-cli.js similarity index 79% rename from src/vs/server/cli.js rename to src/server-cli.js index ae9ba20eb5c..fdfdac48b99 100644 --- a/src/vs/server/cli.js +++ b/src/server-cli.js @@ -13,9 +13,9 @@ delete process.env['ELECTRON_RUN_AS_NODE']; if (process.env['VSCODE_DEV']) { // When running out of sources, we need to load node modules from remote/node_modules, // which are compiled against nodejs, not electron - process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] = process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] || path.join(__dirname, '..', '..', '..', 'remote', 'node_modules'); - require('../../bootstrap-node').injectNodeModuleLookupPath(process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']); + process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] = process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] || path.join(__dirname, '..', 'remote', 'node_modules'); + require('./bootstrap-node').injectNodeModuleLookupPath(process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']); } else { delete process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']; } -require('../../bootstrap-amd').load('vs/server/remoteCli'); +require('./bootstrap-amd').load('vs/server/node/server.cli'); diff --git a/src/vs/server/main.js b/src/server-main.js similarity index 85% rename from src/vs/server/main.js rename to src/server-main.js index 2ea56faa042..a0bee88bd95 100644 --- a/src/vs/server/main.js +++ b/src/server-main.js @@ -5,9 +5,9 @@ // @ts-check -const perf = require('../base/common/performance'); +const perf = require('./vs/base/common/performance'); const performance = require('perf_hooks').performance; -const product = require('../../../product.json'); +const product = require('../product.json'); const readline = require('readline'); const http = require('http'); @@ -38,12 +38,12 @@ async function start() { if (parsedArgs['compatibility'] === '1.63') { console.warn(`server.sh is being replaced by 'bin/${product.serverApplicationName}'. Please migrate to the new command and adopt the following new default behaviors:`); - console.warn('* connection token is mandatody unless --without-connection-token is used'); - console.warn('* host defaults to 127.0.0.1'); + console.warn('* connection token is mandatory unless --without-connection-token is used'); + console.warn('* host defaults to `localhost`'); } /** - * @typedef { import('./remoteExtensionHostAgentServer').IServerAPI } IServerAPI + * @typedef { import('./vs/server/node/remoteExtensionHostAgentServer').IServerAPI } IServerAPI */ /** @type {IServerAPI | null} */ let _remoteExtensionHostAgentServer = null; @@ -101,7 +101,7 @@ async function start() { const remoteExtensionHostAgentServer = await getRemoteExtensionHostAgentServer(); return remoteExtensionHostAgentServer.handleServerError(err); }); - const host = parsedArgs['host'] || (parsedArgs['compatibility'] !== '1.63' ? '127.0.0.1' : undefined); + const host = parsedArgs['host'] || (parsedArgs['compatibility'] !== '1.63' ? 'localhost' : undefined); const nodeListenOptions = ( parsedArgs['socket-path'] ? { path: parsedArgs['socket-path'] } @@ -147,9 +147,9 @@ async function start() { } /** - * If `--pick - port` and `--port` is specified, connect to that port. + * If `--pick-port` and `--port` is specified, connect to that port. * - * If not and a port range is specified through `--pick - port` + * If not and a port range is specified through `--pick-port` * then find a free port in that range. Throw error if no * free port available in range. * @@ -176,14 +176,15 @@ async function parsePort(host, strPort, strPickPort) { if (port !== undefined) { return port; } - console.warn(`--port: Could not find free port in range: ${range.start} - ${range.end}.`); + console.warn(`--port: Could not find free port in range: ${range.start} - ${range.end} (inclusive).`); process.exit(1); } else { - console.warn(`--port "${strPort}" is not a valid number or range.`); + console.warn(`--port "${strPort}" is not a valid number or range. Ranges must be in the form 'from-to' with 'from' an integer larger than 0 and not larger than 'end'.`); process.exit(1); } } + // pick-port is deprecated and will be removed soon if (strPickPort) { const range = parseRange(strPickPort); if (range) { @@ -194,11 +195,11 @@ async function parsePort(host, strPort, strPickPort) { if (port !== undefined) { return port; } - console.log(`--pick - port: Could not find free port in range: ${range.start} - ${range.end}.`); + console.log(`--pick-port: Could not find free port in range: ${range.start} - ${range.end}.`); process.exit(1); } } else { - console.log(`--pick - port "${strPickPort}" is not properly formatted.`); + console.log(`--pick-port "${strPickPort}" is not a valid range. Ranges must be in the form 'from-to' with 'from' an integer larger than 0 and not larger than 'end'.`); process.exit(1); } } @@ -212,7 +213,10 @@ async function parsePort(host, strPort, strPickPort) { function parseRange(strRange) { const match = strRange.match(/^(\d+)-(\d+)$/); if (match) { - return { start: parseInt(match[1], 10), end: parseInt(match[2], 10) }; + const start = parseInt(match[1], 10), end = parseInt(match[2], 10); + if (start > 0 && start <= end && end <= 65535) { + return { start, end }; + } } return undefined; } @@ -239,7 +243,7 @@ async function findFreePort(host, start, end) { }); }); }; - for (let port = start; port < end; port++) { + for (let port = start; port <= end; port++) { if (await testPort(port)) { return port; } @@ -247,7 +251,7 @@ async function findFreePort(host, start, end) { return undefined; } -/** @returns { Promise } */ +/** @returns { Promise } */ function loadCode() { return new Promise((resolve, reject) => { const path = require('path'); @@ -255,12 +259,12 @@ function loadCode() { if (process.env['VSCODE_DEV']) { // When running out of sources, we need to load node modules from remote/node_modules, // which are compiled against nodejs, not electron - process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] = process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] || path.join(__dirname, '..', '..', '..', 'remote', 'node_modules'); - require('../../bootstrap-node').injectNodeModuleLookupPath(process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']); + process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] = process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH'] || path.join(__dirname, '..', 'remote', 'node_modules'); + require('./bootstrap-node').injectNodeModuleLookupPath(process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']); } else { delete process.env['VSCODE_INJECT_NODE_MODULE_LOOKUP_PATH']; } - require('../../bootstrap-amd').load('vs/server/remoteExtensionHostAgent', resolve, reject); + require('./bootstrap-amd').load('vs/server/node/server.main', resolve, reject); }); } diff --git a/src/tsconfig.monaco.json b/src/tsconfig.monaco.json index 5d97fdf7095..f9f0c874eb6 100644 --- a/src/tsconfig.monaco.json +++ b/src/tsconfig.monaco.json @@ -27,6 +27,7 @@ "exclude": [ "node_modules/*", "vs/platform/files/browser/htmlFileSystemProvider.ts", + "vs/platform/files/browser/webFileSystemAccess.ts", "vs/platform/assignment/*" ] } diff --git a/src/tsec.exemptions.json b/src/tsec.exemptions.json index b25eebfee5f..02f70161510 100644 --- a/src/tsec.exemptions.json +++ b/src/tsec.exemptions.json @@ -14,11 +14,11 @@ "vs/base/browser/markdownRenderer.ts", "vs/base/browser/defaultWorkerFactory.ts", "vs/base/worker/workerMain.ts", - "vs/editor/browser/core/markdownRenderer.ts", + "vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts", "vs/editor/browser/view/domLineBreaksComputer.ts", "vs/editor/browser/view/viewLayer.ts", "vs/editor/browser/widget/diffEditorWidget.ts", - "vs/editor/contrib/inlineCompletions/ghostTextWidget.ts", + "vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts", "vs/editor/browser/widget/diffReview.ts", "vs/editor/standalone/browser/colorizer.ts", "vs/workbench/api/worker/extHostExtensionService.ts", diff --git a/src/vs/base/browser/contextmenu.ts b/src/vs/base/browser/contextmenu.ts index a25dd8f20b7..e594f0073e8 100644 --- a/src/vs/base/browser/contextmenu.ts +++ b/src/vs/base/browser/contextmenu.ts @@ -16,7 +16,7 @@ export interface IContextMenuEvent { } export interface IContextMenuDelegate { - getAnchor(): HTMLElement | { x: number; y: number; width?: number; height?: number; }; + getAnchor(): HTMLElement | { x: number; y: number; width?: number; height?: number }; getActions(): readonly IAction[]; getCheckedActionsRepresentation?(action: IAction): 'radio' | 'checkbox'; getActionViewItem?(action: IAction): IActionViewItem | undefined; diff --git a/src/vs/base/browser/defaultWorkerFactory.ts b/src/vs/base/browser/defaultWorkerFactory.ts index 9337a931327..147ccc7c21b 100644 --- a/src/vs/base/browser/defaultWorkerFactory.ts +++ b/src/vs/base/browser/defaultWorkerFactory.ts @@ -8,21 +8,21 @@ import { IWorker, IWorkerCallback, IWorkerFactory, logOnceWebWorkerWarning } fro const ttPolicy = window.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value }); -function getWorker(workerId: string, label: string): Worker | Promise { +function getWorker(label: string): Worker | Promise { // Option for hosts to overwrite the worker script (used in the standalone editor) if (globals.MonacoEnvironment) { if (typeof globals.MonacoEnvironment.getWorker === 'function') { - return globals.MonacoEnvironment.getWorker(workerId, label); + return globals.MonacoEnvironment.getWorker('workerMain.js', label); } if (typeof globals.MonacoEnvironment.getWorkerUrl === 'function') { - const workerUrl = globals.MonacoEnvironment.getWorkerUrl(workerId, label); + const workerUrl = globals.MonacoEnvironment.getWorkerUrl('workerMain.js', label); return new Worker(ttPolicy ? ttPolicy.createScriptURL(workerUrl) as unknown as string : workerUrl, { name: label }); } } // ESM-comment-begin if (typeof require === 'function') { // check if the JS lives on a different origin - const workerMain = require.toUrl('./' + workerId); // explicitly using require.toUrl(), see https://github.com/microsoft/vscode/issues/107440#issuecomment-698982321 + const workerMain = require.toUrl('vs/base/worker/workerMain.js'); // explicitly using require.toUrl(), see https://github.com/microsoft/vscode/issues/107440#issuecomment-698982321 const workerUrl = getWorkerBootstrapUrl(workerMain, label); return new Worker(ttPolicy ? ttPolicy.createScriptURL(workerUrl) as unknown as string : workerUrl, { name: label }); } @@ -63,7 +63,7 @@ class WebWorker implements IWorker { constructor(moduleId: string, id: number, label: string, onMessageCallback: IWorkerCallback, onErrorCallback: (err: any) => void) { this.id = id; - const workerOrPromise = getWorker('workerMain.js', label); + const workerOrPromise = getWorker(label); if (isPromiseLike(workerOrPromise)) { this.worker = workerOrPromise; } else { diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 97aca920558..395b58cfe1a 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -9,7 +9,7 @@ import { IKeyboardEvent, StandardKeyboardEvent } from 'vs/base/browser/keyboardE import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { TimeoutTimer } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { Emitter, Event } from 'vs/base/common/event'; +import * as event from 'vs/base/common/event'; import * as dompurify from 'vs/base/browser/dompurify/dompurify'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -149,7 +149,7 @@ export function addDisposableNonBubblingPointerOutListener(node: Element, handle }); } -export function createEventEmitter(target: HTMLElement, type: K, options?: boolean | AddEventListenerOptions): Emitter { +export function createEventEmitter(target: HTMLElement, type: K, options?: boolean | AddEventListenerOptions): event.Emitter { let domListener: DomListener | null = null; const handler = (e: HTMLElementEventMap[K]) => result.fire(e); const onFirstListenerAdd = () => { @@ -163,7 +163,7 @@ export function createEventEmitter(target: domListener = null; } }; - const result = new Emitter({ onFirstListenerAdd, onLastListenerRemove }); + const result = new event.Emitter({ onFirstListenerAdd, onLastListenerRemove }); return result; } @@ -308,17 +308,12 @@ export interface IEventMerger { (lastEvent: R | null, currentEvent: E): R; } -export interface DOMEvent { - preventDefault(): void; - stopPropagation(): void; -} - const MINIMUM_TIME_MS = 8; -const DEFAULT_EVENT_MERGER: IEventMerger = function (lastEvent: DOMEvent | null, currentEvent: DOMEvent) { +const DEFAULT_EVENT_MERGER: IEventMerger = function (lastEvent: Event | null, currentEvent: Event) { return currentEvent; }; -class TimeoutThrottledDomListener extends Disposable { +class TimeoutThrottledDomListener extends Disposable { constructor(node: any, type: string, handler: (event: R) => void, eventMerger: IEventMerger = DEFAULT_EVENT_MERGER, minimumTimeMs: number = MINIMUM_TIME_MS) { super(); @@ -348,7 +343,7 @@ class TimeoutThrottledDomListener extends Disposable { } } -export function addDisposableThrottledListener(node: any, type: string, handler: (event: R) => void, eventMerger?: IEventMerger, minimumTimeMs?: number): IDisposable { +export function addDisposableThrottledListener(node: any, type: string, handler: (event: R) => void, eventMerger?: IEventMerger, minimumTimeMs?: number): IDisposable { return new TimeoutThrottledDomListener(node, type, handler, eventMerger, minimumTimeMs); } @@ -495,7 +490,7 @@ export class Dimension implements IDimension { } } -export function getTopLeftOffset(element: HTMLElement): { left: number; top: number; } { +export function getTopLeftOffset(element: HTMLElement): { left: number; top: number } { // Adapted from WinJS.Utilities.getPosition // and added borders to the mix @@ -924,8 +919,8 @@ export const EventHelper = { }; export interface IFocusTracker extends Disposable { - onDidFocus: Event; - onDidBlur: Event; + onDidFocus: event.Event; + onDidBlur: event.Event; refreshState(): void; } @@ -949,11 +944,11 @@ export function restoreParentsScrollTop(node: Element, state: number[]): void { class FocusTracker extends Disposable implements IFocusTracker { - private readonly _onDidFocus = this._register(new Emitter()); - public readonly onDidFocus: Event = this._onDidFocus.event; + private readonly _onDidFocus = this._register(new event.Emitter()); + public readonly onDidFocus: event.Event = this._onDidFocus.event; - private readonly _onDidBlur = this._register(new Emitter()); - public readonly onDidBlur: Event = this._onDidBlur.event; + private readonly _onDidBlur = this._register(new event.Emitter()); + public readonly onDidBlur: event.Event = this._onDidBlur.event; private _refreshStateHandler: () => void; @@ -1049,7 +1044,7 @@ export enum Namespace { SVG = 'http://www.w3.org/2000/svg' } -function _$(namespace: Namespace, description: string, attrs?: { [key: string]: any; }, ...children: Array): T { +function _$(namespace: Namespace, description: string, attrs?: { [key: string]: any }, ...children: Array): T { let match = SELECTOR_REGEX.exec(description); if (!match) { @@ -1098,11 +1093,11 @@ function _$(namespace: Namespace, description: string, attrs? return result as T; } -export function $(description: string, attrs?: { [key: string]: any; }, ...children: Array): T { +export function $(description: string, attrs?: { [key: string]: any }, ...children: Array): T { return _$(Namespace.HTML, description, attrs, ...children); } -$.SVG = function (description: string, attrs?: { [key: string]: any; }, ...children: Array): T { +$.SVG = function (description: string, attrs?: { [key: string]: any }, ...children: Array): T { return _$(Namespace.SVG, description, attrs, ...children); }; @@ -1173,7 +1168,7 @@ export function getElementsByTagName(tag: string): HTMLElement[] { return Array.prototype.slice.call(document.getElementsByTagName(tag), 0); } -export function finalHandler(fn: (event: T) => any): (event: T) => any { +export function finalHandler(fn: (event: T) => any): (event: T) => any { return e => { e.preventDefault(); e.stopPropagation(); @@ -1343,7 +1338,7 @@ export function triggerUpload(): Promise { input.multiple = true; // Resolve once the input event has fired once - Event.once(Event.fromDOMEventEmitter(input, 'input'))(() => { + event.Event.once(event.Event.fromDOMEventEmitter(input, 'input'))(() => { resolve(withNullAsUndefined(input.files)); }); @@ -1482,22 +1477,6 @@ export function multibyteAwareBtoa(str: string): string { return btoa(toBinary(str)); } -/** - * Typings for the https://wicg.github.io/file-system-access - * - * Use `supported(window)` to find out if the browser supports this kind of API. - */ -export namespace WebFileSystemAccess { - - export function supported(obj: any & Window): boolean { - if (typeof obj?.showDirectoryPicker === 'function') { - return true; - } - - return false; - } -} - type ModifierKey = 'alt' | 'ctrl' | 'shift' | 'meta'; export interface IModifierKeyStatus { @@ -1510,7 +1489,7 @@ export interface IModifierKeyStatus { event?: KeyboardEvent; } -export class ModifierKeyEmitter extends Emitter { +export class ModifierKeyEmitter extends event.Emitter { private readonly _subscriptions = new DisposableStore(); private _keyStatus: IModifierKeyStatus; diff --git a/src/vs/base/browser/globalMouseMoveMonitor.ts b/src/vs/base/browser/globalMouseMoveMonitor.ts index d481de95624..46298cd6d51 100644 --- a/src/vs/base/browser/globalMouseMoveMonitor.ts +++ b/src/vs/base/browser/globalMouseMoveMonitor.ts @@ -39,7 +39,7 @@ export function standardMouseMoveMerger(lastEvent: IStandardMouseMoveEventData | }; } -export class GlobalMouseMoveMonitor implements IDisposable { +export class GlobalMouseMoveMonitor implements IDisposable { private readonly _hooks = new DisposableStore(); private _mouseMoveEventMerger: IEventMerger | null = null; diff --git a/src/vs/base/browser/indexedDB.ts b/src/vs/base/browser/indexedDB.ts index f85bff8244a..1ca9458eb92 100644 --- a/src/vs/base/browser/indexedDB.ts +++ b/src/vs/base/browser/indexedDB.ts @@ -105,8 +105,8 @@ export class IndexedDB { this.database = null; } - runInTransaction(store: string, transactionMode: IDBTransactionMode, dbRequestFn: (store: IDBObjectStore) => IDBRequest[]): Promise - runInTransaction(store: string, transactionMode: IDBTransactionMode, dbRequestFn: (store: IDBObjectStore) => IDBRequest): Promise + runInTransaction(store: string, transactionMode: IDBTransactionMode, dbRequestFn: (store: IDBObjectStore) => IDBRequest[]): Promise; + runInTransaction(store: string, transactionMode: IDBTransactionMode, dbRequestFn: (store: IDBObjectStore) => IDBRequest): Promise; async runInTransaction(store: string, transactionMode: IDBTransactionMode, dbRequestFn: (store: IDBObjectStore) => IDBRequest | IDBRequest[]): Promise { if (!this.database) { throw new Error(`IndexedDB database '${this.name}' is not opened.`); diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index cd58eb0fedf..813218db45b 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -17,11 +17,11 @@ import { IMarkdownString, parseHrefAndDimensions, removeMarkdownEscapes } from ' import { markdownEscapeEscapedIcons } from 'vs/base/common/iconLabels'; import { defaultGenerator } from 'vs/base/common/idGenerator'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import * as marked from 'vs/base/common/marked/marked'; +import { marked } from 'vs/base/common/marked/marked'; import { parse } from 'vs/base/common/marshalling'; import { FileAccess, Schemas } from 'vs/base/common/network'; import { cloneAndChange } from 'vs/base/common/objects'; -import { resolvePath } from 'vs/base/common/resources'; +import { dirname, resolvePath } from 'vs/base/common/resources'; import { escape } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; @@ -30,9 +30,8 @@ export interface MarkedOptions extends marked.MarkedOptions { } export interface MarkdownRenderOptions extends FormattedTextRenderOptions { - codeBlockRenderer?: (languageId: string, value: string) => Promise; - asyncRenderCallback?: () => void; - baseUrl?: URI; + readonly codeBlockRenderer?: (languageId: string, value: string) => Promise; + readonly asyncRenderCallback?: () => void; } /** @@ -41,7 +40,7 @@ export interface MarkdownRenderOptions extends FormattedTextRenderOptions { * **Note** that for most cases you should be using [`MarkdownRenderer`](./src/vs/editor/browser/core/markdownRenderer.ts) * which comes with support for pretty code block rendering and which uses the default way of handling links. */ -export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRenderOptions = {}, markedOptions: MarkedOptions = {}): { element: HTMLElement, dispose: () => void } { +export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRenderOptions = {}, markedOptions: MarkedOptions = {}): { element: HTMLElement; dispose: () => void } { const disposables = new DisposableStore(); let isDisposed = false; @@ -123,24 +122,25 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende return ''; }; renderer.link = (href, title, text): string => { + if (typeof href !== 'string') { + return ''; + } + // Remove markdown escapes. Workaround for https://github.com/chjj/marked/issues/829 if (href === text) { // raw link case text = removeMarkdownEscapes(text); } href = _href(href, false); - if (options.baseUrl) { - const hasScheme = /^\w[\w\d+.-]*:/.test(href); - if (!hasScheme) { - href = resolvePath(options.baseUrl, href).toString(); - } + if (markdown.baseUri) { + href = resolveWithBaseUri(URI.from(markdown.baseUri), href); } - title = removeMarkdownEscapes(title); + title = typeof title === 'string' ? removeMarkdownEscapes(title) : ''; href = removeMarkdownEscapes(href); if ( !href - || href.match(/^data:|javascript:/i) - || (href.match(/^command:/i) && !markdown.isTrusted) - || href.match(/^command:(\/\/\/)?_workbench\.downloadResource/i) + || /^data:|javascript:/i.test(href) + || (/^command:/i.test(href) && !markdown.isTrusted) + || /^command:(\/\/\/)?_workbench\.downloadResource/i.test(href) ) { // drop the link return text; @@ -161,13 +161,13 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende if (options.codeBlockRenderer) { renderer.code = (code, lang) => { - const value = options.codeBlockRenderer!(lang, code); + const value = options.codeBlockRenderer!(lang ?? '', code); // when code-block rendering is async we return sync // but update the node with the real result later. const id = defaultGenerator.nextId(); raceCancellation(Promise.all([value, withInnerHTML]), cts.token).then(values => { if (!isDisposed && values) { - const span = element.querySelector(`div[data-code="${id}"]`); + const span = element.querySelector(`div[data-code="${id}"]`); if (span) { DOM.reset(span, values[0]); } @@ -198,8 +198,11 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende } } try { - const href = target.dataset['href']; + let href = target.dataset['href']; if (href) { + if (markdown.baseUri) { + href = resolveWithBaseUri(URI.from(markdown.baseUri), href); + } options.actionHandler!.callback(href, mouseEvent); } } catch (err) { @@ -251,17 +254,16 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende markdownHtmlDoc.body.querySelectorAll('img') .forEach(img => { - if (img.src) { - let href = _href(img.src, true); - + const src = img.getAttribute('src'); // Get the raw 'src' attribute value as text, not the resolved 'src' + if (src) { + let href = src; try { - const hrefAsUri = URI.parse(href); - if (options.baseUrl && hrefAsUri.scheme === Schemas.file) { // absolute or relative local path, or file: uri - href = resolvePath(options.baseUrl, href).toString(); + if (markdown.baseUri) { // absolute or relative local path, or file: uri + href = resolveWithBaseUri(URI.from(markdown.baseUri), href); } } catch (err) { } - img.src = href; + img.src = _href(href, true); } }); @@ -290,6 +292,19 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende }; } +function resolveWithBaseUri(baseUri: URI, href: string): string { + const hasScheme = /^\w[\w\d+.-]*:/.test(href); + if (hasScheme) { + return href; + } + + if (baseUri.path.endsWith('/')) { + return resolvePath(baseUri, href).toString(); + } else { + return resolvePath(dirname(baseUri), href).toString(); + } +} + function sanitizeRenderedMarkdown( options: { isTrusted?: boolean }, renderedMarkdown: string, @@ -335,7 +350,7 @@ function sanitizeRenderedMarkdown( } } -function getSanitizerOptions(options: { readonly isTrusted?: boolean }): { config: dompurify.Config, allowedSchemes: string[] } { +function getSanitizerOptions(options: { readonly isTrusted?: boolean }): { config: dompurify.Config; allowedSchemes: string[] } { const allowedSchemes = [ Schemas.http, Schemas.https, diff --git a/src/vs/base/browser/touch.ts b/src/vs/base/browser/touch.ts index cebe652db4a..72bd66c6adf 100644 --- a/src/vs/base/browser/touch.ts +++ b/src/vs/base/browser/touch.ts @@ -75,7 +75,7 @@ export class Gesture extends Disposable { private ignoreTargets: HTMLElement[]; private handle: IDisposable | null; - private activeTouches: { [id: number]: TouchData; }; + private activeTouches: { [id: number]: TouchData }; private _lastSetTapCountTime: number; diff --git a/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts index fbad9465c9a..2ea4bc96091 100644 --- a/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts +++ b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts @@ -289,10 +289,12 @@ export class BreadcrumbsWidget { } private _render(start: number): void { + let didChange = false; for (; start < this._items.length && start < this._nodes.length; start++) { let item = this._items[start]; let node = this._nodes[start]; this._renderItem(item, node); + didChange = true; } // case a: more nodes -> remove them while (start < this._nodes.length) { @@ -300,6 +302,7 @@ export class BreadcrumbsWidget { if (free) { this._freeNodes.push(free); free.remove(); + didChange = true; } } @@ -311,9 +314,12 @@ export class BreadcrumbsWidget { this._renderItem(item, node); this._domNode.appendChild(node); this._nodes.push(node); + didChange = true; } } - this.layout(undefined); + if (didChange) { + this.layout(undefined); + } } private _renderItem(item: BreadcrumbsItem, container: HTMLDivElement): void { diff --git a/src/vs/base/browser/ui/centered/centeredViewLayout.ts b/src/vs/base/browser/ui/centered/centeredViewLayout.ts index 29e72ce7684..b16ac4334ca 100644 --- a/src/vs/base/browser/ui/centered/centeredViewLayout.ts +++ b/src/vs/base/browser/ui/centered/centeredViewLayout.ts @@ -21,7 +21,7 @@ const GOLDEN_RATIO = { rightMarginRatio: 0.1909 }; -function createEmptyView(background: Color | undefined): ISplitViewView<{ top: number, left: number }> { +function createEmptyView(background: Color | undefined): ISplitViewView<{ top: number; left: number }> { const element = $('.centered-layout-margin'); element.style.height = '100%'; if (background) { @@ -37,7 +37,7 @@ function createEmptyView(background: Color | undefined): ISplitViewView<{ top: n }; } -function toSplitViewView(view: IView, getHeight: () => number): ISplitViewView<{ top: number, left: number }> { +function toSplitViewView(view: IView, getHeight: () => number): ISplitViewView<{ top: number; left: number }> { return { element: view.element, get maximumSize() { return view.maximumWidth; }, @@ -53,12 +53,12 @@ export interface ICenteredViewStyles extends ISplitViewStyles { export class CenteredViewLayout implements IDisposable { - private splitView?: SplitView<{ top: number, left: number }>; + private splitView?: SplitView<{ top: number; left: number }>; private width: number = 0; private height: number = 0; private style!: ICenteredViewStyles; private didLayout = false; - private emptyViews: ISplitViewView<{ top: number, left: number }>[] | undefined; + private emptyViews: ISplitViewView<{ top: number; left: number }>[] | undefined; private readonly splitViewDisposables = new DisposableStore(); constructor(private container: HTMLElement, private view: IView, public readonly state: CenteredViewState = { leftMarginRatio: GOLDEN_RATIO.leftMarginRatio, rightMarginRatio: GOLDEN_RATIO.rightMarginRatio }) { diff --git a/src/vs/base/browser/ui/codicons/codicon/codicon.css b/src/vs/base/browser/ui/codicons/codicon/codicon.css index 4b256e0917c..acfc8297605 100644 --- a/src/vs/base/browser/ui/codicons/codicon/codicon.css +++ b/src/vs/base/browser/ui/codicons/codicon/codicon.css @@ -15,6 +15,7 @@ text-decoration: none; text-rendering: auto; text-align: center; + text-transform: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; user-select: none; diff --git a/src/vs/base/browser/ui/codicons/codicon/codicon.ttf b/src/vs/base/browser/ui/codicons/codicon/codicon.ttf index 7e45be54381..1095acb90f2 100644 Binary files a/src/vs/base/browser/ui/codicons/codicon/codicon.ttf and b/src/vs/base/browser/ui/codicons/codicon/codicon.ttf differ diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index d6d21c6fade..b45468dd137 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IContextMenuProvider } from 'vs/base/browser/contextmenu'; -import { $, addDisposableListener, append, DOMEvent, EventHelper, EventType } from 'vs/base/browser/dom'; +import { $, addDisposableListener, append, EventHelper, EventType } from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { EventType as GestureEventType, Gesture } from 'vs/base/browser/touch'; import { AnchorAlignment, IAnchor, IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; @@ -121,7 +121,7 @@ export class BaseDropdown extends ActionRunner { return !!this.visible; } - protected onEvent(e: DOMEvent, activeElement: HTMLElement): void { + protected onEvent(_e: Event, activeElement: HTMLElement): void { this.hide(); } diff --git a/src/vs/base/browser/ui/findinput/findInput.ts b/src/vs/base/browser/ui/findinput/findInput.ts index 676ba3f070d..3879b55ec5f 100644 --- a/src/vs/base/browser/ui/findinput/findInput.ts +++ b/src/vs/base/browser/ui/findinput/findInput.ts @@ -72,8 +72,8 @@ export class FindInput extends Widget { protected controls: HTMLDivElement; protected regex: RegexCheckbox; - private wholeWords: WholeWordsCheckbox; - private caseSensitive: CaseSensitiveCheckbox; + protected wholeWords: WholeWordsCheckbox; + protected caseSensitive: CaseSensitiveCheckbox; public domNode: HTMLElement; public inputBox: HistoryInputBox; diff --git a/src/vs/base/browser/ui/grid/grid.ts b/src/vs/base/browser/ui/grid/grid.ts index 457976d1317..6a8982c175b 100644 --- a/src/vs/base/browser/ui/grid/grid.ts +++ b/src/vs/base/browser/ui/grid/grid.ts @@ -197,7 +197,7 @@ function getGridLocation(element: HTMLElement): GridLocation { export type DistributeSizing = { type: 'distribute' }; export type SplitSizing = { type: 'split' }; -export type InvisibleSizing = { type: 'invisible', cachedVisibleSize: number }; +export type InvisibleSizing = { type: 'invisible'; cachedVisibleSize: number }; export type Sizing = DistributeSizing | SplitSizing | InvisibleSizing; export namespace Sizing { @@ -261,7 +261,7 @@ export class Grid extends Disposable { /** * Fires whenever a view within the grid changes its size constraints. */ - readonly onDidChange: Event<{ width: number; height: number; } | undefined>; + readonly onDidChange: Event<{ width: number; height: number } | undefined>; /** * Fires whenever the user scrolls a {@link SplitView} within @@ -776,8 +776,8 @@ export class SerializableGrid extends Grid { } } -export type GridNodeDescriptor = { size?: number, groups?: GridNodeDescriptor[] }; -export type GridDescriptor = { orientation: Orientation, groups?: GridNodeDescriptor[] }; +export type GridNodeDescriptor = { size?: number; groups?: GridNodeDescriptor[] }; +export type GridDescriptor = { orientation: Orientation; groups?: GridNodeDescriptor[] }; export function sanitizeGridNodeDescriptor(nodeDescriptor: GridNodeDescriptor, rootNode: boolean): void { if (!rootNode && nodeDescriptor.groups && nodeDescriptor.groups.length <= 1) { @@ -819,7 +819,7 @@ function createSerializedNode(nodeDescriptor: GridNodeDescriptor): ISerializedNo } } -function getDimensions(node: ISerializedNode, orientation: Orientation): { width?: number, height?: number } { +function getDimensions(node: ISerializedNode, orientation: Orientation): { width?: number; height?: number } { if (node.type === 'branch') { const childrenDimensions = node.data.map(c => getDimensions(c, orthogonal(orientation))); diff --git a/src/vs/base/browser/ui/hover/hoverWidget.ts b/src/vs/base/browser/ui/hover/hoverWidget.ts index 3593cdcba61..b86d896d15c 100644 --- a/src/vs/base/browser/ui/hover/hoverWidget.ts +++ b/src/vs/base/browser/ui/hover/hoverWidget.ts @@ -18,7 +18,7 @@ export class HoverWidget extends Disposable { public readonly containerDomNode: HTMLElement; public readonly contentsDomNode: HTMLElement; - private readonly _scrollbar: DomScrollableElement; + public readonly scrollbar: DomScrollableElement; constructor() { super(); @@ -31,26 +31,26 @@ export class HoverWidget extends Disposable { this.contentsDomNode = document.createElement('div'); this.contentsDomNode.className = 'monaco-hover-content'; - this._scrollbar = this._register(new DomScrollableElement(this.contentsDomNode, { + this.scrollbar = this._register(new DomScrollableElement(this.contentsDomNode, { consumeMouseWheelIfScrollbarIsNeeded: true })); - this.containerDomNode.appendChild(this._scrollbar.getDomNode()); + this.containerDomNode.appendChild(this.scrollbar.getDomNode()); } public onContentsChanged(): void { - this._scrollbar.scanDomNode(); + this.scrollbar.scanDomNode(); } } export class HoverAction extends Disposable { - public static render(parent: HTMLElement, actionOptions: { label: string, iconClass?: string, run: (target: HTMLElement) => void, commandId: string }, keybindingLabel: string | null) { + public static render(parent: HTMLElement, actionOptions: { label: string; iconClass?: string; run: (target: HTMLElement) => void; commandId: string }, keybindingLabel: string | null) { return new HoverAction(parent, actionOptions, keybindingLabel); } private readonly actionContainer: HTMLElement; private readonly action: HTMLElement; - private constructor(parent: HTMLElement, actionOptions: { label: string, iconClass?: string, run: (target: HTMLElement) => void, commandId: string }, keybindingLabel: string | null) { + private constructor(parent: HTMLElement, actionOptions: { label: string; iconClass?: string; run: (target: HTMLElement) => void; commandId: string }, keybindingLabel: string | null) { super(); this.actionContainer = dom.append(parent, $('div.action-container')); diff --git a/src/vs/base/browser/ui/iconLabel/iconLabel.ts b/src/vs/base/browser/ui/iconLabel/iconLabel.ts index 32f1d433d48..b400a4fd83e 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabel.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabel.ts @@ -6,10 +6,8 @@ import * as dom from 'vs/base/browser/dom'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { IHoverDelegate } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; -import { setupCustomHover, setupNativeHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover'; -import { CancellationToken } from 'vs/base/common/cancellation'; +import { ITooltipMarkdownString, setupCustomHover, setupNativeHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover'; import { IMatch } from 'vs/base/common/filters'; -import { IMarkdownString } from 'vs/base/common/htmlContent'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { equals } from 'vs/base/common/objects'; import { Range } from 'vs/base/common/range'; @@ -22,13 +20,8 @@ export interface IIconLabelCreationOptions { hoverDelegate?: IHoverDelegate; } -export interface IIconLabelMarkdownString { - markdown: IMarkdownString | string | HTMLElement | undefined | ((token: CancellationToken) => Promise); - markdownNotSupportedFallback: string | undefined; -} - export interface IIconLabelValueOptions { - title?: string | IIconLabelMarkdownString; + title?: string | ITooltipMarkdownString; descriptionTitle?: string; hideIcon?: boolean; extraClasses?: string[]; @@ -167,7 +160,7 @@ export class IconLabel extends Disposable { } } - private setupHover(htmlElement: HTMLElement, tooltip: string | IIconLabelMarkdownString | undefined): void { + private setupHover(htmlElement: HTMLElement, tooltip: string | ITooltipMarkdownString | undefined): void { const previousCustomHover = this.customHovers.get(htmlElement); if (previousCustomHover) { previousCustomHover.dispose(); diff --git a/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts b/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts index 606aa312210..eb557f16f88 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts @@ -6,16 +6,20 @@ import * as dom from 'vs/base/browser/dom'; import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; import { IHoverDelegate, IHoverDelegateOptions, IHoverDelegateTarget, IHoverWidget } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; -import { IIconLabelMarkdownString } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { TimeoutTimer } from 'vs/base/common/async'; -import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { IMarkdownString, isMarkdownString } from 'vs/base/common/htmlContent'; import { stripIcons } from 'vs/base/common/iconLabels'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { isFunction, isString } from 'vs/base/common/types'; import { localize } from 'vs/nls'; -export function setupNativeHover(htmlElement: HTMLElement, tooltip: string | IIconLabelMarkdownString | undefined): void { +export interface ITooltipMarkdownString { + markdown: IMarkdownString | string | undefined | ((token: CancellationToken) => Promise); + markdownNotSupportedFallback: string | undefined; +} + +export function setupNativeHover(htmlElement: HTMLElement, tooltip: string | ITooltipMarkdownString | undefined): void { if (isString(tooltip)) { // Icons don't render in the native hover so we strip them out htmlElement.title = stripIcons(tooltip); @@ -26,6 +30,10 @@ export function setupNativeHover(htmlElement: HTMLElement, tooltip: string | IIc } } +export type IHoverContent = string | ITooltipMarkdownString | HTMLElement | undefined; +type IResolvedHoverContent = IMarkdownString | string | HTMLElement | undefined; + + export interface ICustomHover extends IDisposable { /** @@ -41,11 +49,10 @@ export interface ICustomHover extends IDisposable { /** * Updates the contents of the hover. */ - update(tooltip: string | IIconLabelMarkdownString | HTMLElement): void; + update(tooltip: IHoverContent): void; } -type MarkdownTooltipContent = string | IIconLabelMarkdownString | HTMLElement | undefined; -type ResolvedMarkdownTooltipContent = IMarkdownString | string | HTMLElement | undefined; + class UpdatableHoverWidget implements IDisposable { private _hoverWidget: IHoverWidget | undefined; @@ -54,7 +61,7 @@ class UpdatableHoverWidget implements IDisposable { constructor(private hoverDelegate: IHoverDelegate, private target: IHoverDelegateTarget | HTMLElement, private fadeInAnimation: boolean) { } - async update(markdownTooltip: MarkdownTooltipContent, focus?: boolean): Promise { + async update(content: IHoverContent, focus?: boolean): Promise { if (this._cancellationTokenSource) { // there's an computation ongoing, cancel it this._cancellationTokenSource.dispose(true); @@ -65,10 +72,10 @@ class UpdatableHoverWidget implements IDisposable { } let resolvedContent; - if (markdownTooltip === undefined || isString(markdownTooltip) || markdownTooltip instanceof HTMLElement) { - resolvedContent = markdownTooltip; - } else if (!isFunction(markdownTooltip.markdown)) { - resolvedContent = markdownTooltip.markdown ?? markdownTooltip.markdownNotSupportedFallback; + if (content === undefined || isString(content) || content instanceof HTMLElement) { + resolvedContent = content; + } else if (!isFunction(content.markdown)) { + resolvedContent = content.markdown ?? content.markdownNotSupportedFallback; } else { // compute the content, potentially long-running @@ -80,7 +87,10 @@ class UpdatableHoverWidget implements IDisposable { // compute the content this._cancellationTokenSource = new CancellationTokenSource(); const token = this._cancellationTokenSource.token; - resolvedContent = await markdownTooltip.markdown(token); + resolvedContent = await content.markdown(token); + if (resolvedContent === undefined) { + resolvedContent = content.markdownNotSupportedFallback; + } if (this.isDisposed || token.isCancellationRequested) { // either the widget has been closed in the meantime @@ -92,7 +102,7 @@ class UpdatableHoverWidget implements IDisposable { this.show(resolvedContent, focus); } - private show(content: ResolvedMarkdownTooltipContent, focus?: boolean): void { + private show(content: IResolvedHoverContent, focus?: boolean): void { const oldHoverWidget = this._hoverWidget; if (this.hasContent(content)) { @@ -109,7 +119,7 @@ class UpdatableHoverWidget implements IDisposable { oldHoverWidget?.dispose(); } - private hasContent(content: ResolvedMarkdownTooltipContent): content is NonNullable { + private hasContent(content: IResolvedHoverContent): content is NonNullable { if (!content) { return false; } @@ -132,7 +142,7 @@ class UpdatableHoverWidget implements IDisposable { } } -export function setupCustomHover(hoverDelegate: IHoverDelegate, htmlElement: HTMLElement, markdownTooltip: string | IIconLabelMarkdownString | HTMLElement): ICustomHover { +export function setupCustomHover(hoverDelegate: IHoverDelegate, htmlElement: HTMLElement, content: IHoverContent): ICustomHover { let hoverPreparation: IDisposable | undefined; let hoverWidget: UpdatableHoverWidget | undefined; @@ -153,7 +163,7 @@ export function setupCustomHover(hoverDelegate: IHoverDelegate, htmlElement: HTM return new TimeoutTimer(async () => { if (!hoverWidget || hoverWidget.isDisposed) { hoverWidget = new UpdatableHoverWidget(hoverDelegate, target || htmlElement, delay > 0); - await hoverWidget.update(markdownTooltip, focus); + await hoverWidget.update(content, focus); } }, delay); }; @@ -193,9 +203,9 @@ export function setupCustomHover(hoverDelegate: IHoverDelegate, htmlElement: HTM hide: () => { hideHover(true, true); }, - update: async newTooltip => { - markdownTooltip = newTooltip; - await hoverWidget?.update(markdownTooltip); + update: async newContent => { + content = newContent; + await hoverWidget?.update(content); }, dispose: () => { mouseOverDomEmitter.dispose(); diff --git a/src/vs/base/browser/ui/list/list.ts b/src/vs/base/browser/ui/list/list.ts index 9ab58940629..29ebb8c14bc 100644 --- a/src/vs/base/browser/ui/list/list.ts +++ b/src/vs/base/browser/ui/list/list.ts @@ -57,11 +57,11 @@ export interface IListContextMenuEvent { browserEvent: UIEvent; element: T | undefined; index: number | undefined; - anchor: HTMLElement | { x: number; y: number; }; + anchor: HTMLElement | { x: number; y: number }; } export interface IIdentityProvider { - getId(element: T): { toString(): string; }; + getId(element: T): { toString(): string }; } export interface IKeyboardNavigationLabelProvider { @@ -71,7 +71,7 @@ export interface IKeyboardNavigationLabelProvider { * the list for filtering/navigating. Return `undefined` to make * an element always match. */ - getKeyboardNavigationLabel(element: T): { toString(): string | undefined; } | { toString(): string | undefined; }[] | undefined; + getKeyboardNavigationLabel(element: T): { toString(): string | undefined } | { toString(): string | undefined }[] | undefined; } export interface IKeyboardNavigationDelegate { diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 5f767fad029..7a5495dc0d6 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -19,9 +19,9 @@ import { getOrDefault } from 'vs/base/common/objects'; import { IRange, Range } from 'vs/base/common/range'; import { INewScrollDimensions, Scrollable, ScrollbarVisibility, ScrollEvent } from 'vs/base/common/scrollable'; import { ISpliceable } from 'vs/base/common/sequence'; -import { IListDragAndDrop, IListDragEvent, IListGestureEvent, IListMouseEvent, IListRenderer, IListTouchEvent, IListVirtualDelegate, ListDragOverEffect } from './list'; -import { RangeMap, shift } from './rangeMap'; -import { IRow, RowCache } from './rowCache'; +import { IListDragAndDrop, IListDragEvent, IListGestureEvent, IListMouseEvent, IListRenderer, IListTouchEvent, IListVirtualDelegate, ListDragOverEffect } from 'vs/base/browser/ui/list/list'; +import { RangeMap, shift } from 'vs/base/browser/ui/list/rangeMap'; +import { IRow, RowCache } from 'vs/base/browser/ui/list/rowCache'; interface IItem { readonly id: string; @@ -339,7 +339,11 @@ export class ListView implements ISpliceable, IDisposable { this.disposables.add(Gesture.addTarget(this.rowsContainer)); - this.scrollable = new Scrollable(getOrDefault(options, o => o.smoothScrolling, false) ? 125 : 0, cb => scheduleAtNextAnimationFrame(cb)); + this.scrollable = new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration: getOrDefault(options, o => o.smoothScrolling, false) ? 125 : 0, + scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(cb) + }); this.scrollableElement = this.disposables.add(new SmoothScrollableElement(this.rowsContainer, { alwaysConsumeMouseWheel: getOrDefault(options, o => o.alwaysConsumeMouseWheel, DefaultOptions.alwaysConsumeMouseWheel), horizontal: ScrollbarVisibility.Auto, @@ -472,7 +476,7 @@ export class ListView implements ISpliceable, IDisposable { // try to reuse rows, avoid removing them from DOM const rowsToDispose = new Map(); - for (let i = removeRange.start; i < removeRange.end; i++) { + for (let i = removeRange.end - 1; i >= removeRange.start; i--) { const item = this.items[i]; item.dragStartDisposable.dispose(); diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index fec4f39c434..55082221467 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -49,7 +49,7 @@ class TraitRenderer implements IListRenderer constructor(private trait: Trait) { } get templateId(): string { - return `template:${this.trait.trait}`; + return `template:${this.trait.name}`; } renderTemplate(container: HTMLElement): ITraitTemplateData { @@ -117,7 +117,7 @@ class Trait implements ISpliceable, IDisposable { private readonly _onChange = new Emitter(); readonly onChange: Event = this._onChange.event; - get trait(): string { return this._trait; } + get name(): string { return this._trait; } @memoize get renderer(): TraitRenderer { @@ -196,17 +196,19 @@ class Trait implements ISpliceable, IDisposable { class SelectionTrait extends Trait { - constructor() { + constructor(private setAriaSelected: boolean) { super('selected'); } override renderIndex(index: number, container: HTMLElement): void { super.renderIndex(index, container); - if (this.contains(index)) { - container.setAttribute('aria-selected', 'true'); - } else { - container.setAttribute('aria-selected', 'false'); + if (this.setAriaSelected) { + if (this.contains(index)) { + container.setAttribute('aria-selected', 'true'); + } else { + container.setAttribute('aria-selected', 'false'); + } } } } @@ -1315,7 +1317,7 @@ export class List implements ISpliceable, IThemable, IDisposable { private _options: IListOptions = DefaultOptions ) { const role = this._options.accessibilityProvider && this._options.accessibilityProvider.getWidgetRole ? this._options.accessibilityProvider?.getWidgetRole() : 'list'; - this.selection = new SelectionTrait(); + this.selection = new SelectionTrait(role !== 'listbox'); mixin(_options, defaultStyles, false); diff --git a/src/vs/base/browser/ui/menu/menu.ts b/src/vs/base/browser/ui/menu/menu.ts index e49b3f4bc18..c3852e44786 100644 --- a/src/vs/base/browser/ui/menu/menu.ts +++ b/src/vs/base/browser/ui/menu/menu.ts @@ -25,7 +25,6 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { isLinux, isMacintosh } from 'vs/base/common/platform'; import { ScrollbarVisibility, ScrollEvent } from 'vs/base/common/scrollable'; import * as strings from 'vs/base/common/strings'; -import * as nls from 'vs/nls'; export const MENU_MNEMONIC_REGEX = /\(&([^\s&])\)|(^|[^&])&([^\s&])/; export const MENU_ESCAPED_MNEMONIC_REGEX = /(&)?(&)([^\s&])/g; @@ -277,7 +276,7 @@ export class Menu extends ActionBar { this.styleSheet = Menu.globalStyleSheet; } } - this.styleSheet.textContent = getMenuWidgetCSS(style); + this.styleSheet.textContent = getMenuWidgetCSS(style, isInShadowDOM(container)); } style(style: IMenuStyles): void { @@ -620,22 +619,7 @@ class BaseMenuActionViewItem extends BaseActionViewItem { } override updateTooltip(): void { - let title: string | null = null; - - if (this.getAction().tooltip) { - title = this.getAction().tooltip; - - } else if (!this.options.label && this.getAction().label && this.options.icon) { - title = this.getAction().label; - - if (this.options.keybinding) { - title = nls.localize({ key: 'titleLabel', comment: ['action title', 'action keybinding'] }, "{0} ({1})", title, this.options.keybinding); - } - } - - if (title && this.item) { - this.item.title = title; - } + // menus should function like native menus and they do not have tooltips } override updateClass(): void { @@ -859,7 +843,7 @@ class SubmenuMenuActionViewItem extends BaseMenuActionViewItem { } } - private calculateSubmenuMenuLayout(windowDimensions: Dimension, submenu: Dimension, entry: IDomNodePagePosition, expandDirection: Direction): { top: number, left: number } { + private calculateSubmenuMenuLayout(windowDimensions: Dimension, submenu: Dimension, entry: IDomNodePagePosition, expandDirection: Direction): { top: number; left: number } { const ret = { top: 0, left: 0 }; // Start with horizontal @@ -1022,7 +1006,7 @@ export function cleanMnemonic(label: string): string { return label.replace(regex, mnemonicInText ? '$2$3' : '').trim(); } -function getMenuWidgetCSS(style: IMenuStyles): string { +function getMenuWidgetCSS(style: IMenuStyles, isForShadowDom: boolean): string { let result = /* css */` .monaco-menu { font-size: 13px; @@ -1311,101 +1295,106 @@ ${formatRule(Codicon.menuSubmenu)} .monaco-menu .action-item { cursor: default; -} +}`; -/* Arrows */ -.monaco-scrollable-element > .scrollbar > .scra { - cursor: pointer; - font-size: 11px !important; -} - -.monaco-scrollable-element > .visible { - opacity: 1; - - /* Background rule added for IE9 - to allow clicks on dom node */ - background:rgba(0,0,0,0); - - transition: opacity 100ms linear; -} -.monaco-scrollable-element > .invisible { - opacity: 0; - pointer-events: none; -} -.monaco-scrollable-element > .invisible.fade { - transition: opacity 800ms linear; -} - -/* Scrollable Content Inset Shadow */ -.monaco-scrollable-element > .shadow { - position: absolute; - display: none; -} -.monaco-scrollable-element > .shadow.top { - display: block; - top: 0; - left: 3px; - height: 3px; - width: 100%; -} -.monaco-scrollable-element > .shadow.left { - display: block; - top: 3px; - left: 0; - height: 100%; - width: 3px; -} -.monaco-scrollable-element > .shadow.top-left-corner { - display: block; - top: 0; - left: 0; - height: 3px; - width: 3px; -} -`; - - // Scrollbars - const scrollbarShadowColor = style.scrollbarShadow; - if (scrollbarShadowColor) { + if (isForShadowDom) { + // Only define scrollbar styles when used inside shadow dom, + // otherwise leave their styling to the global workbench styling. result += ` + /* Arrows */ + .monaco-scrollable-element > .scrollbar > .scra { + cursor: pointer; + font-size: 11px !important; + } + + .monaco-scrollable-element > .visible { + opacity: 1; + + /* Background rule added for IE9 - to allow clicks on dom node */ + background:rgba(0,0,0,0); + + transition: opacity 100ms linear; + } + .monaco-scrollable-element > .invisible { + opacity: 0; + pointer-events: none; + } + .monaco-scrollable-element > .invisible.fade { + transition: opacity 800ms linear; + } + + /* Scrollable Content Inset Shadow */ + .monaco-scrollable-element > .shadow { + position: absolute; + display: none; + } .monaco-scrollable-element > .shadow.top { - box-shadow: ${scrollbarShadowColor} 0 6px 6px -6px inset; + display: block; + top: 0; + left: 3px; + height: 3px; + width: 100%; } - .monaco-scrollable-element > .shadow.left { - box-shadow: ${scrollbarShadowColor} 6px 0 6px -6px inset; + display: block; + top: 3px; + left: 0; + height: 100%; + width: 3px; } - - .monaco-scrollable-element > .shadow.top.left { - box-shadow: ${scrollbarShadowColor} 6px 6px 6px -6px inset; + .monaco-scrollable-element > .shadow.top-left-corner { + display: block; + top: 0; + left: 0; + height: 3px; + width: 3px; } `; - } - const scrollbarSliderBackgroundColor = style.scrollbarSliderBackground; - if (scrollbarSliderBackgroundColor) { - result += ` - .monaco-scrollable-element > .scrollbar > .slider { - background: ${scrollbarSliderBackgroundColor}; - } - `; - } + // Scrollbars + const scrollbarShadowColor = style.scrollbarShadow; + if (scrollbarShadowColor) { + result += ` + .monaco-scrollable-element > .shadow.top { + box-shadow: ${scrollbarShadowColor} 0 6px 6px -6px inset; + } - const scrollbarSliderHoverBackgroundColor = style.scrollbarSliderHoverBackground; - if (scrollbarSliderHoverBackgroundColor) { - result += ` - .monaco-scrollable-element > .scrollbar > .slider:hover { - background: ${scrollbarSliderHoverBackgroundColor}; - } - `; - } + .monaco-scrollable-element > .shadow.left { + box-shadow: ${scrollbarShadowColor} 6px 0 6px -6px inset; + } - const scrollbarSliderActiveBackgroundColor = style.scrollbarSliderActiveBackground; - if (scrollbarSliderActiveBackgroundColor) { - result += ` - .monaco-scrollable-element > .scrollbar > .slider.active { - background: ${scrollbarSliderActiveBackgroundColor}; - } - `; + .monaco-scrollable-element > .shadow.top.left { + box-shadow: ${scrollbarShadowColor} 6px 6px 6px -6px inset; + } + `; + } + + const scrollbarSliderBackgroundColor = style.scrollbarSliderBackground; + if (scrollbarSliderBackgroundColor) { + result += ` + .monaco-scrollable-element > .scrollbar > .slider { + background: ${scrollbarSliderBackgroundColor}; + } + `; + } + + const scrollbarSliderHoverBackgroundColor = style.scrollbarSliderHoverBackground; + if (scrollbarSliderHoverBackgroundColor) { + result += ` + .monaco-scrollable-element > .scrollbar > .slider:hover { + background: ${scrollbarSliderHoverBackgroundColor}; + } + `; + } + + const scrollbarSliderActiveBackgroundColor = style.scrollbarSliderActiveBackground; + if (scrollbarSliderActiveBackgroundColor) { + result += ` + .monaco-scrollable-element > .scrollbar > .slider.active { + background: ${scrollbarSliderActiveBackgroundColor}; + } + `; + } } return result; diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index 1e64ff88c77..fbcc1fa7d7c 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -33,7 +33,7 @@ export interface IMenuBarOptions { alwaysOnMnemonics?: boolean; compactMode?: Direction; actionRunner?: IActionRunner; - getCompactMenuActions?: () => IAction[] + getCompactMenuActions?: () => IAction[]; } export interface MenuBarMenu { @@ -475,7 +475,7 @@ export class MenuBar extends Disposable { const prevNumMenusShown = this.numMenusShown; this.numMenusShown = 0; - const showableMenus = this.menus.filter(menu => menu.buttonElement !== undefined && menu.titleElement !== undefined) as (MenuBarMenuWithElements & { titleElement: HTMLElement, buttonElement: HTMLElement })[]; + const showableMenus = this.menus.filter(menu => menu.buttonElement !== undefined && menu.titleElement !== undefined) as (MenuBarMenuWithElements & { titleElement: HTMLElement; buttonElement: HTMLElement })[]; for (let menuBarMenu of showableMenus) { if (!full) { const size = menuBarMenu.buttonElement.offsetWidth; diff --git a/src/vs/base/browser/ui/mouseCursor/mouseCursor.css b/src/vs/base/browser/ui/mouseCursor/mouseCursor.css index 2a998c4d970..1d7ede84175 100644 --- a/src/vs/base/browser/ui/mouseCursor/mouseCursor.css +++ b/src/vs/base/browser/ui/mouseCursor/mouseCursor.css @@ -6,9 +6,3 @@ .monaco-mouse-cursor-text { cursor: text; } - -/* The following selector looks a bit funny, but that is needed to cover all the workbench and the editor!! */ -.vs-dark .mac .monaco-mouse-cursor-text, .hc-black .mac .monaco-mouse-cursor-text, -.vs-dark.mac .monaco-mouse-cursor-text, .hc-black.mac .monaco-mouse-cursor-text { - cursor: -webkit-image-set(url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAL0lEQVQoz2NgCD3x//9/BhBYBWdhgFVAiVW4JBFKGIa4AqD0//9D3pt4I4tAdAMAHTQ/j5Zom30AAAAASUVORK5CYII=') 1x, url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVRIx2NgYGBY/R8I/vx5eelX3n82IJ9FxGf6tksvf/8FiTMQAcAGQMDvSwu09abffY8QYSAScNk45G198eX//yev73/4///701eh//kZSARckrNBRvz//+8+6ZohwCzjGNjdgQxkAg7B9WADeBjIBqtJCbhRA0YNoIkBSNmaPEMoNmA0FkYNoFKhapJ6FGyAH3nauaSmPfwI0v/3OukVi0CIZ+F25KrtYcx/CTIy0e+rC7R1Z4KMICVTQQ14feVXIbR695u14+Ir4gwAAD49E54wc1kWAAAAAElFTkSuQmCC') 2x) 5 8, text; -} diff --git a/src/vs/base/browser/ui/progressbar/progressbar.css b/src/vs/base/browser/ui/progressbar/progressbar.css index e00c2ba27af..ad5d2ea629c 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.css +++ b/src/vs/base/browser/ui/progressbar/progressbar.css @@ -40,10 +40,10 @@ .monaco-progress-container.infinite.infinite-long-running .progress-bit { /* - The more smooth `linear` timing function can cause - higher GPU consumption as indicated in - https://github.com/microsoft/vscode/issues/97900 & - https://github.com/microsoft/vscode/issues/138396 + The more smooth `linear` timing function can cause + higher GPU consumption as indicated in + https://github.com/microsoft/vscode/issues/97900 & + https://github.com/microsoft/vscode/issues/138396 */ animation-timing-function: steps(100); } diff --git a/src/vs/base/browser/ui/sash/sash.ts b/src/vs/base/browser/ui/sash/sash.ts index c39e05486ea..210b95df4b5 100644 --- a/src/vs/base/browser/ui/sash/sash.ts +++ b/src/vs/base/browser/ui/sash/sash.ts @@ -424,7 +424,7 @@ export class Sash extends Disposable { const onTap = this._register(new DomEmitter(this.el, EventType.Tap)).event; const onDoubleTap = Event.map( Event.filter( - Event.debounce(onTap, (res, event) => ({ event, count: (res?.count ?? 0) + 1 }), 250), + Event.debounce(onTap, (res, event) => ({ event, count: (res?.count ?? 0) + 1 }), 250), ({ count }) => count === 2 ), ({ event }) => ({ ...event, target: event.initialTarget ?? null }) diff --git a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts index c0657e20221..aa6be1c229b 100644 --- a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +++ b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts @@ -175,6 +175,10 @@ export abstract class AbstractScrollableElement extends Widget { private readonly _onWillScroll = this._register(new Emitter()); public readonly onWillScroll: Event = this._onWillScroll.event; + public get options(): Readonly { + return this._options; + } + protected constructor(element: HTMLElement, options: ScrollableElementCreationOptions, scrollable: Scrollable) { super(); element.style.overflow = 'hidden'; @@ -556,7 +560,11 @@ export class ScrollableElement extends AbstractScrollableElement { constructor(element: HTMLElement, options: ScrollableElementCreationOptions) { options = options || {}; options.mouseWheelSmoothScroll = false; - const scrollable = new Scrollable(0, (callback) => dom.scheduleAtNextAnimationFrame(callback)); + const scrollable = new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration: 0, + scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(callback) + }); super(element, options, scrollable); this._register(scrollable); } @@ -590,12 +598,20 @@ export class SmoothScrollableElement extends AbstractScrollableElement { } -export class DomScrollableElement extends ScrollableElement { +export class DomScrollableElement extends AbstractScrollableElement { private _element: HTMLElement; constructor(element: HTMLElement, options: ScrollableElementCreationOptions) { - super(element, options); + options = options || {}; + options.mouseWheelSmoothScroll = false; + const scrollable = new Scrollable({ + forceIntegerValues: false, // See https://github.com/microsoft/vscode/issues/139877 + smoothScrollDuration: 0, + scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(callback) + }); + super(element, options, scrollable); + this._register(scrollable); this._element = element; this.onScroll((e) => { if (e.scrollTopChanged) { @@ -608,6 +624,14 @@ export class DomScrollableElement extends ScrollableElement { this.scanDomNode(); } + public setScrollPosition(update: INewScrollPosition): void { + this._scrollable.setScrollPositionNow(update); + } + + public getScrollPosition(): IScrollPosition { + return this._scrollable.getCurrentScrollPosition(); + } + public scanDomNode(): void { // width, scrollLeft, scrollWidth, height, scrollTop, scrollHeight this.setScrollDimensions({ diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index 90f20648564..f1a181ca650 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -777,8 +777,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi this._register(onSelectDropDownKeyDown.filter(e => (e.keyCode >= KeyCode.Digit0 && e.keyCode <= KeyCode.KeyZ) || (e.keyCode >= KeyCode.Semicolon && e.keyCode <= KeyCode.NumpadDivide)).on(this.onCharacter, this)); // SetUp list mouse controller - control navigation, disabled items, focus - - this._register(dom.addDisposableListener(this.selectList.getHTMLElement(), dom.EventType.POINTER_DOWN, e => this.onPointerDown(e))); + this._register(dom.addDisposableListener(this.selectList.getHTMLElement(), dom.EventType.POINTER_UP, e => this.onPointerUp(e))); this._register(this.selectList.onMouseOver(e => typeof e.index !== 'undefined' && this.selectList.setFocus([e.index]))); this._register(this.selectList.onDidChangeFocus(e => this.onListFocus(e))); @@ -800,7 +799,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi // List mouse controller - active exit, select option, fire onDidSelect if change, return focus to parent select // Also takes in touchend events - private onPointerDown(e: PointerEvent): void { + private onPointerUp(e: PointerEvent): void { if (!this.selectList.length) { return; @@ -814,7 +813,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi } // Check our mouse event is on an option (not scrollbar) - if (!!target.classList.contains('slider')) { + if (target.classList.contains('slider')) { return; } diff --git a/src/vs/base/browser/ui/splitview/paneview.ts b/src/vs/base/browser/ui/splitview/paneview.ts index b02f4066ef0..c341624db8a 100644 --- a/src/vs/base/browser/ui/splitview/paneview.ts +++ b/src/vs/base/browser/ui/splitview/paneview.ts @@ -5,9 +5,10 @@ import { isFirefox } from 'vs/base/browser/browser'; import { DataTransfers } from 'vs/base/browser/dnd'; -import { $, addDisposableListener, append, clearNode, EventHelper, trackFocus } from 'vs/base/browser/dom'; +import { $, addDisposableListener, append, clearNode, EventHelper, EventType, trackFocus } from 'vs/base/browser/dom'; import { DomEmitter } from 'vs/base/browser/event'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { Gesture, EventType as TouchEventType } from 'vs/base/browser/touch'; import { Orientation } from 'vs/base/browser/ui/sash/sash'; import { Color, RGBA } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; @@ -233,11 +234,15 @@ export abstract class Pane extends Disposable implements IView { this._register(onHeaderKeyDown.filter(e => e.keyCode === KeyCode.RightArrow) .event(() => this.setExpanded(true), null)); - this._register(addDisposableListener(this.header, 'click', e => { - if (!e.defaultPrevented) { - this.setExpanded(!this.isExpanded()); - } - })); + this._register(Gesture.addTarget(this.header)); + + [EventType.CLICK, TouchEventType.Tap].forEach(eventType => { + this._register(addDisposableListener(this.header, eventType, e => { + if (!e.defaultPrevented) { + this.setExpanded(!this.isExpanded()); + } + })); + }); this.body = append(this.element, $('.pane-body')); this.renderBody(this.body); @@ -300,7 +305,7 @@ class PaneDraggable extends Disposable { private dragOverCounter = 0; // see https://github.com/microsoft/vscode/issues/14470 - private _onDidDrop = this._register(new Emitter<{ from: Pane, to: Pane }>()); + private _onDidDrop = this._register(new Emitter<{ from: Pane; to: Pane }>()); readonly onDidDrop = this._onDidDrop.event; constructor(private pane: Pane, private dnd: IPaneDndController, private context: IDndContext) { @@ -439,8 +444,8 @@ export class PaneView extends Disposable { private splitview: SplitView; private animationTimer: number | undefined = undefined; - private _onDidDrop = this._register(new Emitter<{ from: Pane, to: Pane }>()); - readonly onDidDrop: Event<{ from: Pane, to: Pane }> = this._onDidDrop.event; + private _onDidDrop = this._register(new Emitter<{ from: Pane; to: Pane }>()); + readonly onDidDrop: Event<{ from: Pane; to: Pane }> = this._onDidDrop.event; orientation: Orientation; readonly onDidSashChange: Event; diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index 12d1505e17b..636a9c536c3 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -9,7 +9,7 @@ import { SmoothScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollable import { pushToEnd, pushToStart, range } from 'vs/base/common/arrays'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; -import { combinedDisposable, Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, Disposable, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { clamp } from 'vs/base/common/numbers'; import { Scrollable, ScrollbarVisibility, ScrollEvent } from 'vs/base/common/scrollable'; import * as types from 'vs/base/common/types'; @@ -333,12 +333,12 @@ export type DistributeSizing = { type: 'distribute' }; * When adding or removing views, split the delta space with another * specific view, indexed by the provided `index`. */ -export type SplitSizing = { type: 'split', index: number }; +export type SplitSizing = { type: 'split'; index: number }; /** * When adding or removing views, assume the view is invisible. */ -export type InvisibleSizing = { type: 'invisible', cachedVisibleSize: number }; +export type InvisibleSizing = { type: 'invisible'; cachedVisibleSize: number }; /** * When adding or removing views, the sizing provides fine grained @@ -546,7 +546,11 @@ export class SplitView extends Disposable { this.sashContainer = append(this.el, $('.sash-container')); this.viewContainer = $('.split-view-container'); - this.scrollable = new Scrollable(125, scheduleAtNextAnimationFrame); + this.scrollable = new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration: 125, + scheduleAtNextAnimationFrame + }); this.scrollableElement = this._register(new SmoothScrollableElement(this.viewContainer, { vertical: this.orientation === Orientation.VERTICAL ? (options.scrollbarVisibility ?? ScrollbarVisibility.Auto) : ScrollbarVisibility.Hidden, horizontal: this.orientation === Orientation.HORIZONTAL ? (options.scrollbarVisibility ?? ScrollbarVisibility.Auto) : ScrollbarVisibility.Hidden @@ -1322,7 +1326,7 @@ export class SplitView extends Disposable { override dispose(): void { super.dispose(); - this.viewItems.forEach(i => i.dispose()); + dispose(this.viewItems); this.viewItems = []; this.sashItems.forEach(i => i.disposable.dispose()); diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index 0afc73fac81..f0224d3e4e7 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -282,7 +282,7 @@ export interface IAsyncDataTreeOptionsUpdate extends IAbstractTreeOptionsUpdate export interface IAsyncDataTreeUpdateChildrenOptions extends IObjectTreeSetChildrenOptions { } export interface IAsyncDataTreeOptions extends IAsyncDataTreeOptionsUpdate, Pick, Exclude, 'collapseByDefault'>> { - readonly collapseByDefault?: { (e: T): boolean; }; + readonly collapseByDefault?: { (e: T): boolean }; readonly identityProvider?: IIdentityProvider; readonly sorter?: ITreeSorter; readonly autoExpandSingleChildren?: boolean; @@ -312,7 +312,7 @@ export class AsyncDataTree implements IDisposable protected readonly root: IAsyncDataTreeNode; private readonly nodes = new Map>(); private readonly sorter?: ITreeSorter; - private readonly collapseByDefault?: { (e: T): boolean; }; + private readonly collapseByDefault?: { (e: T): boolean }; private readonly subTreeRefreshPromises = new Map, Promise>(); private readonly refreshPromises = new Map, CancelablePromise>>(); @@ -837,7 +837,7 @@ export class AsyncDataTree implements IDisposable } const nodesToForget = new Map>(); - const childrenTreeNodesById = new Map, collapsed: boolean; }>(); + const childrenTreeNodesById = new Map; collapsed: boolean }>(); for (const child of node.children) { nodesToForget.set(child.element as T, child); @@ -937,7 +937,7 @@ export class AsyncDataTree implements IDisposable const objectTreeOptions: IObjectTreeSetChildrenOptions> | undefined = options && { ...options, diffIdentityProvider: options!.diffIdentityProvider && { - getId(node: IAsyncDataTreeNode): { toString(): string; } { + getId(node: IAsyncDataTreeNode): { toString(): string } { return options!.diffIdentityProvider!.getId(node.element as T); } } diff --git a/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts b/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts index e37bbba27b5..8722c0afbe6 100644 --- a/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts @@ -388,7 +388,7 @@ function mapOptions(compressedNodeUnwrapper: CompressedNodeUnwra return { ...options, identityProvider: options.identityProvider && { - getId(node: ICompressedTreeNode): { toString(): string; } { + getId(node: ICompressedTreeNode): { toString(): string } { return options.identityProvider!.getId(compressedNodeUnwrapper(node)); } }, diff --git a/src/vs/base/browser/ui/tree/dataTree.ts b/src/vs/base/browser/ui/tree/dataTree.ts index 262313f2a2e..afb6fa662fe 100644 --- a/src/vs/base/browser/ui/tree/dataTree.ts +++ b/src/vs/base/browser/ui/tree/dataTree.ts @@ -157,7 +157,7 @@ export class DataTree extends AbstractTree boolean | undefined): { elements: Iterable>, size: number } { + private iterate(element: TInput | T, isCollapsed?: (el: T) => boolean | undefined): { elements: Iterable>; size: number } { const children = [...this.dataSource.getChildren(element)]; const elements = Iterable.map(children, element => { const { elements: children, size } = this.iterate(element, isCollapsed); diff --git a/src/vs/base/browser/ui/tree/indexTreeModel.ts b/src/vs/base/browser/ui/tree/indexTreeModel.ts index c24f78b5422..e62ac021289 100644 --- a/src/vs/base/browser/ui/tree/indexTreeModel.ts +++ b/src/vs/base/browser/ui/tree/indexTreeModel.ts @@ -70,7 +70,7 @@ export interface IIndexTreeModelSpliceOptions { /** * Callback for when a node is deleted. */ - onDidDeleteNode?: (node: ITreeNode) => void + onDidDeleteNode?: (node: ITreeNode) => void; } interface CollapsibleStateUpdate { @@ -713,7 +713,7 @@ export class IndexTreeModel, TFilterData = voi } // expensive - private getTreeNodeWithListIndex(location: number[]): { node: IIndexTreeNode, listIndex: number, revealed: boolean, visible: boolean } { + private getTreeNodeWithListIndex(location: number[]): { node: IIndexTreeNode; listIndex: number; revealed: boolean; visible: boolean } { if (location.length === 0) { return { node: this.root, listIndex: -1, revealed: true, visible: false }; } @@ -730,7 +730,7 @@ export class IndexTreeModel, TFilterData = voi return { node, listIndex, revealed, visible: visible && node.visible }; } - private getParentNodeWithListIndex(location: number[], node: IIndexTreeNode = this.root, listIndex: number = 0, revealed = true, visible = true): { parentNode: IIndexTreeNode; listIndex: number; revealed: boolean; visible: boolean; } { + private getParentNodeWithListIndex(location: number[], node: IIndexTreeNode = this.root, listIndex: number = 0, revealed = true, visible = true): { parentNode: IIndexTreeNode; listIndex: number; revealed: boolean; visible: boolean } { const [index, ...rest] = location; if (index < 0 || index > node.children.length) { diff --git a/src/vs/base/browser/ui/tree/objectTree.ts b/src/vs/base/browser/ui/tree/objectTree.ts index 1944c0c90fd..847cb86d2fe 100644 --- a/src/vs/base/browser/ui/tree/objectTree.ts +++ b/src/vs/base/browser/ui/tree/objectTree.ts @@ -163,7 +163,7 @@ class CompressibleRenderer, TFilterData, TTemplateDat } export interface ICompressibleKeyboardNavigationLabelProvider extends IKeyboardNavigationLabelProvider { - getCompressedNodeKeyboardNavigationLabel(elements: T[]): { toString(): string | undefined; } | undefined; + getCompressedNodeKeyboardNavigationLabel(elements: T[]): { toString(): string | undefined } | undefined; } export interface ICompressibleObjectTreeOptions extends IObjectTreeOptions { diff --git a/src/vs/base/browser/ui/tree/objectTreeModel.ts b/src/vs/base/browser/ui/tree/objectTreeModel.ts index daefce35be9..fe44f7e91c7 100644 --- a/src/vs/base/browser/ui/tree/objectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/objectTreeModel.ts @@ -33,7 +33,7 @@ export class ObjectTreeModel, TFilterData extends Non private nodes = new Map>(); private readonly nodesByIdentity = new Map>(); private readonly identityProvider?: IIdentityProvider; - private sorter?: ITreeSorter<{ element: T; }>; + private sorter?: ITreeSorter<{ element: T }>; readonly onDidSplice: Event>; readonly onDidChangeCollapseState: Event>; diff --git a/src/vs/base/browser/ui/tree/tree.ts b/src/vs/base/browser/ui/tree/tree.ts index 59d4c8255a4..0166e4cd3b6 100644 --- a/src/vs/base/browser/ui/tree/tree.ts +++ b/src/vs/base/browser/ui/tree/tree.ts @@ -153,7 +153,7 @@ export interface ITreeMouseEvent { export interface ITreeContextMenuEvent { browserEvent: UIEvent; element: T | null; - anchor: HTMLElement | { x: number; y: number; }; + anchor: HTMLElement | { x: number; y: number }; } export interface ITreeNavigator { diff --git a/src/vs/base/common/actions.ts b/src/vs/base/common/actions.ts index 86f0743bdc8..2fe5d37c03f 100644 --- a/src/vs/base/common/actions.ts +++ b/src/vs/base/common/actions.ts @@ -14,8 +14,8 @@ export interface ITelemetryData { } export type WorkbenchActionExecutedClassification = { - id: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - from: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + id: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + from: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; export type WorkbenchActionExecutedEvent = { @@ -258,7 +258,7 @@ export class EmptySubmenuAction extends Action { } } -export function toAction(props: { id: string, label: string, enabled?: boolean, checked?: boolean, run: Function; }): IAction { +export function toAction(props: { id: string; label: string; enabled?: boolean; checked?: boolean; run: Function }): IAction { return { id: props.id, label: props.label, diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index 0a66387f97b..8120619b243 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -198,7 +198,7 @@ export function sortedDiff(before: ReadonlyArray, after: ReadonlyArray, * Takes two *sorted* arrays and computes their delta (removed, added elements). * Finishes in `Math.min(before.length, after.length)` steps. */ -export function delta(before: ReadonlyArray, after: ReadonlyArray, compare: (a: T, b: T) => number): { removed: T[], added: T[] } { +export function delta(before: ReadonlyArray, after: ReadonlyArray, compare: (a: T, b: T) => number): { removed: T[]; added: T[] } { const splices = sortedDiff(before, after, compare); const removed: T[] = []; const added: T[] = []; @@ -421,9 +421,9 @@ export function range(arg: number, to?: number): number[] { return result; } -export function index(array: ReadonlyArray, indexer: (t: T) => string): { [key: string]: T; }; -export function index(array: ReadonlyArray, indexer: (t: T) => string, mapper: (t: T) => R): { [key: string]: R; }; -export function index(array: ReadonlyArray, indexer: (t: T) => string, mapper?: (t: T) => R): { [key: string]: R; } { +export function index(array: ReadonlyArray, indexer: (t: T) => string): { [key: string]: T }; +export function index(array: ReadonlyArray, indexer: (t: T) => string, mapper: (t: T) => R): { [key: string]: R }; +export function index(array: ReadonlyArray, indexer: (t: T) => string, mapper?: (t: T) => R): { [key: string]: R } { return array.reduce((r, t) => { r[indexer(t)] = mapper ? mapper(t) : t; return r; diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index 03bf8167370..0d170c9bd00 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -1115,7 +1115,7 @@ export interface IdleDeadline { */ export let runWhenIdle: (callback: (idle: IdleDeadline) => void, timeout?: number) => IDisposable; -declare function requestIdleCallback(callback: (args: IdleDeadline) => void, options?: { timeout: number; }): number; +declare function requestIdleCallback(callback: (args: IdleDeadline) => void, options?: { timeout: number }): number; declare function cancelIdleCallback(handle: number): void; (function () { diff --git a/src/vs/base/common/buffer.ts b/src/vs/base/common/buffer.ts index 546ecf27dcd..765a788327b 100644 --- a/src/vs/base/common/buffer.ts +++ b/src/vs/base/common/buffer.ts @@ -44,7 +44,7 @@ export class VSBuffer { * When running in a nodejs context, the backing store for the returned `VSBuffer` instance * might use a nodejs Buffer allocated from node's Buffer pool, which is not transferrable. */ - static fromString(source: string, options?: { dontUseNodeBuffer?: boolean; }): VSBuffer { + static fromString(source: string, options?: { dontUseNodeBuffer?: boolean }): VSBuffer { const dontUseNodeBuffer = options?.dontUseNodeBuffer || false; if (!dontUseNodeBuffer && hasBuffer) { return new VSBuffer(Buffer.from(source)); @@ -142,7 +142,7 @@ export class VSBuffer { } else if (ArrayBuffer.isView(array)) { this.buffer.set(new Uint8Array(array.buffer, array.byteOffset, array.byteLength), offset); } else { - throw new Error(`Unkown argument 'array'`); + throw new Error(`Unknown argument 'array'`); } } diff --git a/src/vs/base/common/codicons.ts b/src/vs/base/common/codicons.ts index 91597442034..a93f402d78a 100644 --- a/src/vs/base/common/codicons.ts +++ b/src/vs/base/common/codicons.ts @@ -39,12 +39,12 @@ export class Codicon implements CSSIcon { public get cssSelector() { return '.codicon.codicon-' + this.id; } // registry - private static _allCodicons : Codicon[] = []; + private static _allCodicons: Codicon[] = []; /** * @returns Returns all default icons covered by the codicon font. Only to be used by the icon registry in platform. */ - public static getAll() : readonly Codicon[] { + public static getAll(): readonly Codicon[] { return Codicon._allCodicons; } @@ -529,6 +529,19 @@ export class Codicon implements CSSIcon { public static readonly verifiedFilled = new Codicon('verified-filled', { fontCharacter: '\\ebe9' }); public static readonly newLine = new Codicon('newline', { fontCharacter: '\\ebea' }); public static readonly layout = new Codicon('layout', { fontCharacter: '\\ebeb' }); + public static readonly layoutActivitybarLeft = new Codicon('layout-activitybar-left', { fontCharacter: '\\ebec' }); + public static readonly layoutActivitybarRight = new Codicon('layout-activitybar-right', { fontCharacter: '\\ebed' }); + public static readonly layoutPanelLeft = new Codicon('layout-panel-left', { fontCharacter: '\\ebee' }); + public static readonly layoutPanelCenter = new Codicon('layout-panel-center', { fontCharacter: '\\ebef' }); + public static readonly layoutPanelJustify = new Codicon('layout-panel-justify', { fontCharacter: '\\ebf0' }); + public static readonly layoutPanelRight = new Codicon('layout-panel-right', { fontCharacter: '\\ebf1' }); + public static readonly layoutPanel = new Codicon('layout-panel', { fontCharacter: '\\ebf2' }); + public static readonly layoutSidebarLeft = new Codicon('layout-sidebar-left', { fontCharacter: '\\ebf3' }); + public static readonly layoutSidebarRight = new Codicon('layout-sidebar-right', { fontCharacter: '\\ebf4' }); + public static readonly layoutStatusbar = new Codicon('layout-statusbar', { fontCharacter: '\\ebf5' }); + public static readonly layoutMenubar = new Codicon('layout-menubar', { fontCharacter: '\\ebf6' }); + public static readonly layoutCentered = new Codicon('layout-centered', { fontCharacter: '\\ebf7' }); + public static readonly target = new Codicon('target', { fontCharacter: '\\ebf8' }); // derived icons, that could become separate icons diff --git a/src/vs/base/common/collections.ts b/src/vs/base/common/collections.ts index 24ed68bae5f..bc2f5c31950 100644 --- a/src/vs/base/common/collections.ts +++ b/src/vs/base/common/collections.ts @@ -36,7 +36,7 @@ export function values(from: IStringDictionary | INumberDictionary): T[ * Iterates over each entry in the provided dictionary. The iterator allows * to remove elements and will stop when the callback returns {{false}}. */ -export function forEach(from: IStringDictionary | INumberDictionary, callback: (entry: { key: any; value: T; }, remove: () => void) => any): void { +export function forEach(from: IStringDictionary | INumberDictionary, callback: (entry: { key: any; value: T }, remove: () => void) => any): void { for (let key in from) { if (hasOwnProperty.call(from, key)) { const result = callback({ key: key, value: (from as any)[key] }, function () { @@ -76,7 +76,7 @@ export function fromMap(original: Map): IStringDictionary { return result; } -export function diffSets(before: Set, after: Set): { removed: T[], added: T[] } { +export function diffSets(before: Set, after: Set): { removed: T[]; added: T[] } { const removed: T[] = []; const added: T[] = []; for (let element of before) { @@ -92,7 +92,7 @@ export function diffSets(before: Set, after: Set): { removed: T[], adde return { removed, added }; } -export function diffMaps(before: Map, after: Map): { removed: V[], added: V[] } { +export function diffMaps(before: Map, after: Map): { removed: V[]; added: V[] } { const removed: V[] = []; const added: V[] = []; for (let [index, value] of before) { diff --git a/src/vs/base/common/comparers.ts b/src/vs/base/common/comparers.ts index 7dbf8715671..64643232f7d 100644 --- a/src/vs/base/common/comparers.ts +++ b/src/vs/base/common/comparers.ts @@ -11,7 +11,7 @@ import { sep } from 'vs/base/common/path'; // than it is to use String.prototype.localeCompare() // A collator with numeric sorting enabled, and no sensitivity to case, accents or diacritics. -const intlFileNameCollatorBaseNumeric: IdleValue<{ collator: Intl.Collator, collatorIsNumeric: boolean }> = new IdleValue(() => { +const intlFileNameCollatorBaseNumeric: IdleValue<{ collator: Intl.Collator; collatorIsNumeric: boolean }> = new IdleValue(() => { const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }); return { collator: collator, diff --git a/src/vs/base/common/console.ts b/src/vs/base/common/console.ts index 478e06077a6..194abde45b5 100644 --- a/src/vs/base/common/console.ts +++ b/src/vs/base/common/console.ts @@ -27,7 +27,7 @@ export function isRemoteConsoleLog(obj: any): obj is IRemoteConsoleLog { return entry && typeof entry.type === 'string' && typeof entry.severity === 'string'; } -export function parse(entry: IRemoteConsoleLog): { args: any[], stack?: string } { +export function parse(entry: IRemoteConsoleLog): { args: any[]; stack?: string } { const args: any[] = []; let stack: string | undefined; diff --git a/src/vs/base/common/errors.ts b/src/vs/base/common/errors.ts index 19773ee31c8..5855b4efd8b 100644 --- a/src/vs/base/common/errors.ts +++ b/src/vs/base/common/errors.ts @@ -157,7 +157,7 @@ export class CancellationError extends Error { } /** - * @deprecated uses {@link CancellationError} + * @deprecated use {@link CancellationError `new CancellationError()`} instead */ export function canceled(): Error { const error = new Error(canceledName); diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 8160ace0dce..023ea8ef10f 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -390,8 +390,6 @@ export namespace Event { } } -export type Listener = [(e: T) => void, any] | ((e: T) => void); - export interface EmitterOptions { onFirstListenerAdd?: Function; onFirstListenerDidAdd?: Function; @@ -400,7 +398,7 @@ export interface EmitterOptions { leakWarningThreshold?: number; /** ONLY enable this during development */ - _profName?: string + _profName?: string; } @@ -462,7 +460,7 @@ class LeakageMonitor { } } - check(listenerCount: number): undefined | (() => void) { + check(stack: Stacktrace, listenerCount: number): undefined | (() => void) { let threshold = _globalLeakWarningThreshold; if (typeof this.customThreshold === 'number') { @@ -476,9 +474,8 @@ class LeakageMonitor { if (!this._stacks) { this._stacks = new Map(); } - const stack = new Error().stack!.split('\n').slice(3).join('\n'); - const count = (this._stacks.get(stack) || 0); - this._stacks.set(stack, count + 1); + const count = (this._stacks.get(stack.value) || 0); + this._stacks.set(stack.value, count + 1); this._warnCountdown -= 1; if (this._warnCountdown <= 0) { @@ -501,12 +498,67 @@ class LeakageMonitor { } return () => { - const count = (this._stacks!.get(stack) || 0); - this._stacks!.set(stack, count - 1); + const count = (this._stacks!.get(stack.value) || 0); + this._stacks!.set(stack.value, count - 1); }; } } +class Stacktrace { + + static create() { + return new Stacktrace(new Error()); + } + + private constructor(private readonly _error: Error) { } + + get value() { + // only access the stack late + return this._error.stack ?? ''; + } + + print() { + console.warn(this.value.split('\n').slice(2).join('\n')); + } +} + +export class SafeDisposable implements IDisposable { + + private static _noop = () => { }; + + dispose: () => void = SafeDisposable._noop; + unset: () => void = SafeDisposable._noop; + isset: () => boolean = () => false; + + set(disposable: IDisposable) { + let actual: IDisposable | undefined = disposable; + this.unset = () => actual = undefined; + this.isset = () => actual !== undefined; + this.dispose = () => { + if (actual) { + actual.dispose(); + actual = undefined; + } + }; + return this; + } +} + +class Listener { + + readonly subscription = new SafeDisposable(); + + constructor( + readonly callback: (e: T) => void, + readonly callbackThis: any | undefined, + readonly stack: Stacktrace | undefined + ) { } + + invoke(e: T) { + this.callback.call(this.callbackThis, e); + } +} + /** * The Emitter can be used to expose an Event to the public * to fire it from the insides. @@ -549,36 +601,42 @@ export class Emitter { */ get event(): Event { if (!this._event) { - this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => { + this._event = (callback: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => { if (!this._listeners) { this._listeners = new LinkedList(); } const firstListener = this._listeners.isEmpty(); - if (firstListener && this._options && this._options.onFirstListenerAdd) { + if (firstListener && this._options?.onFirstListenerAdd) { this._options.onFirstListenerAdd(this); } - const remove = this._listeners.push(!thisArgs ? listener : [listener, thisArgs]); + let removeMonitor: Function | undefined; + let stack: Stacktrace | undefined; + if (this._leakageMon) { + // check and record this emitter for potential leakage + stack = Stacktrace.create(); + removeMonitor = this._leakageMon.check(stack, this._listeners.size + 1); + } - if (firstListener && this._options && this._options.onFirstListenerDidAdd) { + const listener = new Listener(callback, thisArgs, stack); + const removeListener = this._listeners.push(listener); + + if (firstListener && this._options?.onFirstListenerDidAdd) { this._options.onFirstListenerDidAdd(this); } - if (this._options && this._options.onListenerDidAdd) { - this._options.onListenerDidAdd(this, listener, thisArgs); + if (this._options?.onListenerDidAdd) { + this._options.onListenerDidAdd(this, callback, thisArgs); } - // check and record this emitter for potential leakage - const removeMonitor = this._leakageMon?.check(this._listeners.size); - - const result = toDisposable(() => { + const result = listener.subscription.set(toDisposable(() => { if (removeMonitor) { removeMonitor(); } if (!this._disposed) { - remove(); + removeListener(); if (this._options && this._options.onLastListenerRemove) { const hasListeners = (this._listeners && !this._listeners.isEmpty()); if (!hasListeners) { @@ -586,7 +644,7 @@ export class Emitter { } } } - }); + })); if (disposables instanceof DisposableStore) { disposables.add(result); @@ -624,11 +682,7 @@ export class Emitter { while (this._deliveryQueue.size > 0) { const [listener, event] = this._deliveryQueue.shift()!; try { - if (typeof listener === 'function') { - listener.call(undefined, event); - } else { - listener[0].call(listener[1], event); - } + listener.invoke(event); } catch (e) { onUnexpectedError(e); } @@ -641,7 +695,32 @@ export class Emitter { dispose() { if (!this._disposed) { this._disposed = true; - this._listeners?.clear(); + + // It is bad to have listeners at the time of disposing an emitter, it is worst to have listeners keep the emitter + // alive via the reference that's embedded their disposables. Therefore we loop over all remaining listeners and + // unset their subscriptions/disposables. Looping and blaming remaining listeners is done on next tick because the + // the following programming pattern is very popular: + // + // const someModel = this._disposables.add(new ModelObject()); // (1) create and register model + // this._disposables.add(someModel.onDidChange(() => { ... }); // (2) subscribe and register model-event listener + // ...later... + // this._disposables.dispose(); disposes (1) then (2): don't warn after (1) but after the "overall dispose" is done + + if (this._listeners) { + const listeners = Array.from(this._listeners); + this._listeners.clear(); + + queueMicrotask(() => { + for (const listener of listeners) { + if (listener.subscription.isset()) { + listener.subscription.unset(); + // enable this to blame listeners that are still here + // listener.stack?.print(); + } + } + }); + + } this._deliveryQueue?.clear(); this._options?.onLastListenerRemove?.(); this._leakageMon?.dispose(); @@ -687,18 +766,14 @@ export class AsyncEmitter extends Emitter { throw new Error('waitUntil can NOT be called asynchronous'); } if (promiseJoin) { - p = promiseJoin(p, typeof listener === 'function' ? listener : listener[0]); + p = promiseJoin(p, listener.callback); } thenables.push(p); } }; try { - if (typeof listener === 'function') { - listener.call(undefined, event); - } else { - listener[0].call(listener[1], event); - } + listener.invoke(event); } catch (e) { onUnexpectedError(e); continue; @@ -770,7 +845,7 @@ export class DebounceEmitter extends PauseableEmitter { private readonly _delay: number; private _handle: any | undefined; - constructor(options: EmitterOptions & { merge: (input: T[]) => T, delay?: number }) { + constructor(options: EmitterOptions & { merge: (input: T[]) => T; delay?: number }) { super(options); this._delay = options.delay ?? 100; } @@ -818,7 +893,7 @@ export class EventMultiplexer implements IDisposable { private readonly emitter: Emitter; private hasListeners = false; - private events: { event: Event; listener: IDisposable | null; }[] = []; + private events: { event: Event; listener: IDisposable | null }[] = []; constructor() { this.emitter = new Emitter({ @@ -861,11 +936,11 @@ export class EventMultiplexer implements IDisposable { this.events.forEach(e => this.unhook(e)); } - private hook(e: { event: Event; listener: IDisposable | null; }): void { + private hook(e: { event: Event; listener: IDisposable | null }): void { e.listener = e.event(r => this.emitter.fire(r)); } - private unhook(e: { event: Event; listener: IDisposable | null; }): void { + private unhook(e: { event: Event; listener: IDisposable | null }): void { if (e.listener) { e.listener.dispose(); } diff --git a/src/vs/base/common/extpath.ts b/src/vs/base/common/extpath.ts index cf75fb39d85..d938a8184f3 100644 --- a/src/vs/base/common/extpath.ts +++ b/src/vs/base/common/extpath.ts @@ -201,6 +201,11 @@ export function isValidBasename(name: string | null | undefined, isWindowsOS: bo return true; } +/** + * @deprecated please use `IUriIdentityService.extUri.isEqual` instead. If you are + * in a context without services, consider to pass down the `extUri` from the outside + * or use `extUriBiasedIgnorePathCase` if you know what you are doing. + */ export function isEqual(pathA: string, pathB: string, ignoreCase?: boolean): boolean { const identityEquals = (pathA === pathB); if (!ignoreCase || identityEquals) { @@ -214,6 +219,11 @@ export function isEqual(pathA: string, pathB: string, ignoreCase?: boolean): boo return equalsIgnoreCase(pathA, pathB); } +/** + * @deprecated please use `IUriIdentityService.extUri.isEqualOrParent` instead. If + * you are in a context without services, consider to pass down the `extUri` from the + * outside, or use `extUriBiasedIgnorePathCase` if you know what you are doing. + */ export function isEqualOrParent(base: string, parentCandidate: string, ignoreCase?: boolean, separator = sep): boolean { if (base === parentCandidate) { return true; diff --git a/src/vs/base/common/fuzzyScorer.ts b/src/vs/base/common/fuzzyScorer.ts index f6ec001820a..aa074b3ea9a 100644 --- a/src/vs/base/common/fuzzyScorer.ts +++ b/src/vs/base/common/fuzzyScorer.ts @@ -885,7 +885,7 @@ export function prepareQuery(original: string): IPreparedQuery { return { original, originalLowercase, pathNormalized, normalized, normalizedLowercase, values, containsPathSeparator, expectContiguousMatch: expectExactMatch }; } -function normalizeQuery(original: string): { pathNormalized: string, normalized: string, normalizedLowercase: string } { +function normalizeQuery(original: string): { pathNormalized: string; normalized: string; normalizedLowercase: string } { let pathNormalized: string; if (isWindows) { pathNormalized = original.replace(/\//g, sep); // Help Windows users to search for paths when using slash diff --git a/src/vs/base/common/glob.ts b/src/vs/base/common/glob.ts index a3af409efa9..e720494366c 100644 --- a/src/vs/base/common/glob.ts +++ b/src/vs/base/common/glob.ts @@ -5,18 +5,31 @@ import { isThenable } from 'vs/base/common/async'; import { CharCode } from 'vs/base/common/charCode'; -import * as extpath from 'vs/base/common/extpath'; +import { isEqualOrParent } from 'vs/base/common/extpath'; import { LRUCache } from 'vs/base/common/map'; -import * as paths from 'vs/base/common/path'; -import * as strings from 'vs/base/common/strings'; +import { basename, extname, posix, sep } from 'vs/base/common/path'; +import { isLinux } from 'vs/base/common/platform'; +import { escapeRegExpCharacters } from 'vs/base/common/strings'; export interface IExpression { [pattern: string]: boolean | SiblingClause; } export interface IRelativePattern { - base: string; - pattern: string; + + /** + * A base file path to which this pattern will be matched against relatively. + */ + readonly base: string; + + /** + * A file glob pattern like `*.{ts,js}` that will be matched on file paths + * relative to the base path. + * + * Example: Given a base of `/home/work/folder` and a file path of `/home/work/folder/index.js`, + * the file glob pattern will match on `index.js`. + */ + readonly pattern: string; } export function getEmptyExpression(): IExpression { @@ -29,6 +42,7 @@ export interface SiblingClause { export const GLOBSTAR = '**'; export const GLOB_SPLIT = '/'; + const PATH_REGEX = '[/\\\\]'; // any slash or backslash const NO_PATH_REGEX = '[^/\\\\]'; // any non-slash and non-backslash const ALL_FORWARD_SLASHES = /\//g; @@ -161,7 +175,7 @@ function parseRegExp(pattern: string): string { // anything else gets escaped else { - res = strings.escapeRegExpCharacters(char); + res = escapeRegExpCharacters(char); } bracketVal += res; @@ -208,7 +222,7 @@ function parseRegExp(pattern: string): string { continue; default: - regEx += strings.escapeRegExpCharacters(char); + regEx += escapeRegExpCharacters(char); } } @@ -230,21 +244,25 @@ function parseRegExp(pattern: string): string { } // regexes to check for trivial glob patterns that just check for String#endsWith -const T1 = /^\*\*\/\*\.[\w\.-]+$/; // **/*.something -const T2 = /^\*\*\/([\w\.-]+)\/?$/; // **/something -const T3 = /^{\*\*\/[\*\.]?[\w\.-]+\/?(,\*\*\/[\*\.]?[\w\.-]+\/?)*}$/; // {**/*.something,**/*.else} or {**/package.json,**/project.json} -const T3_2 = /^{\*\*\/[\*\.]?[\w\.-]+(\/(\*\*)?)?(,\*\*\/[\*\.]?[\w\.-]+(\/(\*\*)?)?)*}$/; // Like T3, with optional trailing /** -const T4 = /^\*\*((\/[\w\.-]+)+)\/?$/; // **/something/else -const T5 = /^([\w\.-]+(\/[\w\.-]+)*)\/?$/; // something/else +const T1 = /^\*\*\/\*\.[\w\.-]+$/; // **/*.something +const T2 = /^\*\*\/([\w\.-]+)\/?$/; // **/something +const T3 = /^{\*\*\/\*?[\w\.-]+\/?(,\*\*\/\*?[\w\.-]+\/?)*}$/; // {**/*.something,**/*.else} or {**/package.json,**/project.json} +const T3_2 = /^{\*\*\/\*?[\w\.-]+(\/(\*\*)?)?(,\*\*\/\*?[\w\.-]+(\/(\*\*)?)?)*}$/; // Like T3, with optional trailing /** +const T4 = /^\*\*((\/[\w\.-]+)+)\/?$/; // **/something/else +const T5 = /^([\w\.-]+(\/[\w\.-]+)*)\/?$/; // something/else export type ParsedPattern = (path: string, basename?: string) => boolean; -// The ParsedExpression returns a Promise iff hasSibling returns a Promise. +// The `ParsedExpression` returns a `Promise` +// iff `hasSibling` returns a `Promise`. export type ParsedExpression = (path: string, basename?: string, hasSibling?: (name: string) => boolean | Promise) => string | null | Promise /* the matching pattern */; export interface IGlobOptions { + /** - * Simplify patterns for use as exclusion filters during tree traversal to skip entire subtrees. Cannot be used outside of a tree traversal. + * Simplify patterns for use as exclusion filters during + * tree traversal to skip entire subtrees. Cannot be used + * outside of a tree traversal. */ trimForExclusions?: boolean; } @@ -330,10 +348,15 @@ function wrapRelativePattern(parsedPattern: ParsedStringPattern, arg2: string | } return function (path, basename) { - if (!extpath.isEqualOrParent(path, arg2.base)) { + if (!isEqualOrParent(path, arg2.base, !isLinux)) { + // skip glob matching if `base` is not a parent of `path` return null; } - return parsedPattern(paths.relative(arg2.base, path), basename); + + // Given we have checked `base` being a parent of `path`, + // we can now remove the `base` portion of the `path` + // and only match on the remaining path components + return parsedPattern(path.substr(arg2.base.length + 1), basename); }; } @@ -394,10 +417,10 @@ function trivia3(pattern: string, options: IGlobOptions): ParsedStringPattern { // common patterns: **/something/else just need endsWith check, something/else just needs and equals check function trivia4and5(targetPath: string, pattern: string, matchPathEnds: boolean): ParsedStringPattern { - const usingPosixSep = paths.sep === paths.posix.sep; - const nativePath = usingPosixSep ? targetPath : targetPath.replace(ALL_FORWARD_SLASHES, paths.sep); - const nativePathEnd = paths.sep + nativePath; - const targetPathEnd = paths.posix.sep + targetPath; + const usingPosixSep = sep === posix.sep; + const nativePath = usingPosixSep ? targetPath : targetPath.replace(ALL_FORWARD_SLASHES, sep); + const nativePathEnd = sep + nativePath; + const targetPathEnd = posix.sep + targetPath; const parsedPattern: ParsedStringPattern = matchPathEnds ? function (testPath, basename) { return typeof testPath === 'string' && @@ -467,7 +490,7 @@ export function parse(arg1: string | IExpression | IRelativePattern, options: IG if (parsedPattern === NULL) { return FALSE; } - const resultPattern: ParsedPattern & { allBasenames?: string[]; allPaths?: string[]; } = function (path: string, basename?: string) { + const resultPattern: ParsedPattern & { allBasenames?: string[]; allPaths?: string[] } = function (path: string, basename?: string) { return !!parsedPattern(path, basename); }; if (parsedPattern.allBasenames) { @@ -578,21 +601,21 @@ function parsedExpression(expression: IExpression, options: IGlobOptions): Parse return resultExpression; } - const resultExpression: ParsedStringPattern = function (path: string, basename?: string, hasSibling?: (name: string) => boolean | Promise) { + const resultExpression: ParsedStringPattern = function (path: string, base?: string, hasSibling?: (name: string) => boolean | Promise) { let name: string | undefined = undefined; for (let i = 0, n = parsedPatterns.length; i < n; i++) { // Pattern matches path const parsedPattern = (parsedPatterns[i]); if (parsedPattern.requiresSiblings && hasSibling) { - if (!basename) { - basename = paths.basename(path); + if (!base) { + base = basename(path); } if (!name) { - name = basename.substr(0, basename.length - paths.extname(path).length); + name = base.substr(0, base.length - extname(path).length); } } - const result = parsedPattern(path, basename, name, hasSibling); + const result = parsedPattern(path, base, name, hasSibling); if (result) { return result; } @@ -698,5 +721,6 @@ function aggregateBasenameMatches(parsedPatterns: Array !(parsedPattern).basenames); aggregatedPatterns.push(aggregate); + return aggregatedPatterns; } diff --git a/src/vs/base/common/htmlContent.ts b/src/vs/base/common/htmlContent.ts index 1f410ba2d70..faf018947a0 100644 --- a/src/vs/base/common/htmlContent.ts +++ b/src/vs/base/common/htmlContent.ts @@ -5,13 +5,15 @@ import { illegalArgument } from 'vs/base/common/errors'; import { escapeIcons } from 'vs/base/common/iconLabels'; -import { UriComponents } from 'vs/base/common/uri'; +import { isEqual } from 'vs/base/common/resources'; +import { URI, UriComponents } from 'vs/base/common/uri'; export interface IMarkdownString { readonly value: string; readonly isTrusted?: boolean; readonly supportThemeIcons?: boolean; readonly supportHtml?: boolean; + readonly baseUri?: UriComponents; uris?: { [href: string]: UriComponents }; } @@ -26,10 +28,11 @@ export class MarkdownString implements IMarkdownString { public isTrusted?: boolean; public supportThemeIcons?: boolean; public supportHtml?: boolean; + public baseUri?: URI; constructor( value: string = '', - isTrustedOrOptions: boolean | { isTrusted?: boolean, supportThemeIcons?: boolean, supportHtml?: boolean } = false, + isTrustedOrOptions: boolean | { isTrusted?: boolean; supportThemeIcons?: boolean; supportHtml?: boolean } = false, ) { this.value = value; if (typeof this.value !== 'string') { @@ -99,7 +102,11 @@ export function markdownStringEqual(a: IMarkdownString, b: IMarkdownString): boo } else if (!a || !b) { return false; } else { - return a.value === b.value && a.isTrusted === b.isTrusted && a.supportThemeIcons === b.supportThemeIcons; + return a.value === b.value + && a.isTrusted === b.isTrusted + && a.supportThemeIcons === b.supportThemeIcons + && a.supportHtml === b.supportHtml + && (a.baseUri === b.baseUri || !!a.baseUri && !!b.baseUri && isEqual(URI.from(a.baseUri), URI.from(b.baseUri))); } } @@ -115,7 +122,7 @@ export function removeMarkdownEscapes(text: string): string { return text.replace(/\\([\\`*_{}[\]()#+\-.!])/g, '$1'); } -export function parseHrefAndDimensions(href: string): { href: string, dimensions: string[] } { +export function parseHrefAndDimensions(href: string): { href: string; dimensions: string[] } { const dimensions: string[] = []; const splitted = href.split('|').map(s => s.trim()); href = splitted[0]; diff --git a/src/vs/base/common/keyCodes.ts b/src/vs/base/common/keyCodes.ts index daf9711046e..b2d163954a1 100644 --- a/src/vs/base/common/keyCodes.ts +++ b/src/vs/base/common/keyCodes.ts @@ -420,7 +420,7 @@ export const enum ScanCode { class KeyCodeStrMap { public _keyCodeToStr: string[]; - public _strToKeyCode: { [str: string]: KeyCode; }; + public _strToKeyCode: { [str: string]: KeyCode }; constructor() { this._keyCodeToStr = []; @@ -445,10 +445,10 @@ const uiMap = new KeyCodeStrMap(); const userSettingsUSMap = new KeyCodeStrMap(); const userSettingsGeneralMap = new KeyCodeStrMap(); export const EVENT_KEY_CODE_MAP: { [keyCode: number]: KeyCode } = new Array(230); -export const NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE: { [nativeKeyCode: string]: KeyCode; } = {}; +export const NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE: { [nativeKeyCode: string]: KeyCode } = {}; const scanCodeIntToStr: string[] = []; -const scanCodeStrToInt: { [code: string]: number; } = Object.create(null); -const scanCodeLowerCaseStrToInt: { [code: string]: number; } = Object.create(null); +const scanCodeStrToInt: { [code: string]: number } = Object.create(null); +const scanCodeLowerCaseStrToInt: { [code: string]: number } = Object.create(null); export const ScanCodeUtils = { lowerCaseToEnum: (scanCode: string) => scanCodeLowerCaseStrToInt[scanCode] || ScanCode.None, diff --git a/src/vs/base/common/labels.ts b/src/vs/base/common/labels.ts index 44f8c5ac4d9..70ee48e82a0 100644 --- a/src/vs/base/common/labels.ts +++ b/src/vs/base/common/labels.ts @@ -12,9 +12,9 @@ import { rtrim, startsWithIgnoreCase } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; export interface IWorkspaceFolderProvider { - getWorkspaceFolder(resource: URI): { uri: URI, name?: string; } | null; + getWorkspaceFolder(resource: URI): { uri: URI; name?: string } | null; getWorkspace(): { - folders: { uri: URI, name?: string; }[]; + folders: { uri: URI; name?: string }[]; }; } @@ -100,7 +100,7 @@ export function normalizeDriveLetter(path: string, continueAsWindows?: boolean): return path; } -let normalizedUserHomeCached: { original: string; normalized: string; } = Object.create(null); +let normalizedUserHomeCached: { original: string; normalized: string } = Object.create(null); export function tildify(path: string, userHome: string): string { if (isWindows || !path || !userHome) { return path; // unsupported @@ -279,7 +279,7 @@ interface ISegment { * @param value string to which template is applied * @param values the values of the templates to use */ -export function template(template: string, values: { [key: string]: string | ISeparator | undefined | null; } = Object.create(null)): string { +export function template(template: string, values: { [key: string]: string | ISeparator | undefined | null } = Object.create(null)): string { const segments: ISegment[] = []; let inVariable = false; @@ -383,7 +383,7 @@ export function unmnemonicLabel(label: string): string { /** * Splits a path in name and parent path, supporting both '/' and '\' */ -export function splitName(fullPath: string): { name: string, parentPath: string; } { +export function splitName(fullPath: string): { name: string; parentPath: string } { const p = fullPath.indexOf('/') !== -1 ? posix : win32; const name = p.basename(fullPath); const parentPath = p.dirname(fullPath); diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index 0ffa00ff724..471d98b6487 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -345,7 +345,7 @@ export interface IReference extends IDisposable { export abstract class ReferenceCollection { - private readonly references: Map = new Map(); + private readonly references: Map = new Map(); acquire(key: string, ...args: any[]): IReference { let reference = this.references.get(key); diff --git a/src/vs/base/common/marked/marked.d.ts b/src/vs/base/common/marked/marked.d.ts index 6ed7e892728..5b7014ec2fb 100644 --- a/src/vs/base/common/marked/marked.d.ts +++ b/src/vs/base/common/marked/marked.d.ts @@ -1,107 +1,257 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// Type definitions for Marked 0.4 -// Project: https://github.com/markedjs/marked +// Type definitions for Marked 4.0 +// Project: https://github.com/markedjs/marked, https://marked.js.org // Definitions by: William Orr // BendingBender // CrossR +// Mike Wickett +// Hitomi Hatsukaze +// Ezra Celli +// Romain LE BARO +// Sarun Intaralawan +// Tony Brix +// Anatolii Titov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -export as namespace marked; - -export = marked; /** - * Compiles markdown to HTML. + * Compiles markdown to HTML synchronously. + * + * @param src String of markdown source to be compiled + * @param options Optional hash of options + * @return String of compiled HTML + */ +export function marked(src: string, options?: marked.MarkedOptions): string; + +/** + * Compiles markdown to HTML asynchronously. * * @param src String of markdown source to be compiled * @param callback Function called when the markdownString has been fully parsed when using async highlighting - * @return String of compiled HTML */ -declare function marked(src: string, callback: (error: any | undefined, parseResult: string) => void): string; +export function marked(src: string, callback: (error: any, parseResult: string) => void): void; /** - * Compiles markdown to HTML. + * Compiles markdown to HTML asynchronously. * * @param src String of markdown source to be compiled * @param options Hash of options * @param callback Function called when the markdownString has been fully parsed when using async highlighting - * @return String of compiled HTML */ -declare function marked(src: string, options?: marked.MarkedOptions, callback?: (error: any | undefined, parseResult: string) => void): string; +export function marked( + src: string, + options: marked.MarkedOptions, + callback: (error: any, parseResult: string) => void, +): void; -declare namespace marked { - /** - * @param src String of markdown source to be compiled - * @param options Hash of options - */ +export class Lexer extends marked.Lexer { } +export class Parser extends marked.Parser { } +export class Tokenizer extends marked.Tokenizer { } +export class Renderer extends marked.Renderer { } +export class TextRenderer extends marked.TextRenderer { } +export class Slugger extends marked.Slugger { } + +export namespace marked { + const defaults: MarkedOptions; + + /** + * @param src String of markdown source to be compiled + * @param options Hash of options + */ function lexer(src: string, options?: MarkedOptions): TokensList; - /** - * Compiles markdown to HTML. - * - * @param src String of markdown source to be compiled - * @param callback Function called when the markdownString has been fully parsed when using async highlighting - * @return String of compiled HTML - */ - function parse(src: string, callback: (error: any | undefined, parseResult: string) => void): string; + /** + * Compiles markdown to HTML. + * + * @param src String of markdown source to be compiled + * @param callback Function called when the markdownString has been fully parsed when using async highlighting + * @return String of compiled HTML + */ + function parse(src: string, callback: (error: any, parseResult: string) => void): string; - /** - * Compiles markdown to HTML. - * - * @param src String of markdown source to be compiled - * @param options Hash of options - * @param callback Function called when the markdownString has been fully parsed when using async highlighting - * @return String of compiled HTML - */ - function parse(src: string, options?: MarkedOptions, callback?: (error: any | undefined, parseResult: string) => void): string; + /** + * Compiles markdown to HTML. + * + * @param src String of markdown source to be compiled + * @param options Hash of options + * @param callback Function called when the markdownString has been fully parsed when using async highlighting + * @return String of compiled HTML + */ + function parse( + src: string, + options?: MarkedOptions, + callback?: (error: any, parseResult: string) => void, + ): string; - /** - * @param src Tokenized source as array of tokens - * @param options Hash of options - */ - function parser(src: TokensList, options?: MarkedOptions): string; + /** + * @param src Tokenized source as array of tokens + * @param options Hash of options + */ + function parser(src: Token[] | TokensList, options?: MarkedOptions): string; - /** - * Sets the default options. - * - * @param options Hash of options - */ + /** + * Compiles markdown to HTML without enclosing `p` tag. + * + * @param src String of markdown source to be compiled + * @param options Hash of options + * @return String of compiled HTML + */ + function parseInline(src: string, options?: MarkedOptions): string; + + /** + * Sets the default options. + * + * @param options Hash of options + */ + function options(options: MarkedOptions): typeof marked; + + /** + * Sets the default options. + * + * @param options Hash of options + */ function setOptions(options: MarkedOptions): typeof marked; - class Renderer { + /** + * Gets the original marked default options. + */ + function getDefaults(): MarkedOptions; + + function walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => void): typeof marked; + + /** + * Use Extension + * @param MarkedExtension + */ + function use(...extensions: MarkedExtension[]): void; + + class Tokenizer { constructor(options?: MarkedOptions); - code(code: string, language: string, isEscaped: boolean): string; - blockquote(quote: string): string; - html(html: string): string; - heading(text: string, level: number, raw: string): string; - hr(): string; - list(body: string, ordered: boolean): string; - listitem(text: string): string; - paragraph(text: string): string; - table(header: string, body: string): string; - tablerow(content: string): string; - tablecell(content: string, flags: { - header: boolean; - align: 'center' | 'left' | 'right' | null; - }): string; + options: MarkedOptions; + space(this: TokenizerThis, src: string): Tokens.Space | T; + code(this: TokenizerThis, src: string): Tokens.Code | T; + fences(this: TokenizerThis, src: string): Tokens.Code | T; + heading(this: TokenizerThis, src: string): Tokens.Heading | T; + hr(this: TokenizerThis, src: string): Tokens.Hr | T; + blockquote(this: TokenizerThis, src: string): Tokens.Blockquote | T; + list(this: TokenizerThis, src: string): Tokens.List | T; + html(this: TokenizerThis, src: string): Tokens.HTML | T; + def(this: TokenizerThis, src: string): Tokens.Def | T; + table(this: TokenizerThis, src: string): Tokens.Table | T; + lheading(this: TokenizerThis, src: string): Tokens.Heading | T; + paragraph(this: TokenizerThis, src: string): Tokens.Paragraph | T; + text(this: TokenizerThis, src: string): Tokens.Text | T; + escape(this: TokenizerThis, src: string): Tokens.Escape | T; + tag(this: TokenizerThis, src: string): Tokens.Tag | T; + link(this: TokenizerThis, src: string): Tokens.Image | Tokens.Link | T; + reflink( + this: TokenizerThis, + src: string, + links: Tokens.Link[] | Tokens.Image[], + ): Tokens.Link | Tokens.Image | Tokens.Text | T; + emStrong(this: TokenizerThis, src: string, maskedSrc: string, prevChar: string): Tokens.Em | Tokens.Strong | T; + codespan(this: TokenizerThis, src: string): Tokens.Codespan | T; + br(this: TokenizerThis, src: string): Tokens.Br | T; + del(this: TokenizerThis, src: string): Tokens.Del | T; + autolink(this: TokenizerThis, src: string, mangle: (cap: string) => string): Tokens.Link | T; + url(this: TokenizerThis, src: string, mangle: (cap: string) => string): Tokens.Link | T; + inlineText(this: TokenizerThis, src: string, smartypants: (cap: string) => string): Tokens.Text | T; + } + + type TokenizerObject = Partial, 'constructor' | 'options'>>; + + class Renderer { + constructor(options?: MarkedOptions); + options: MarkedOptions; + code(this: RendererThis, code: string, language: string | undefined, isEscaped: boolean): string | T; + blockquote(this: RendererThis, quote: string): string | T; + html(this: RendererThis, html: string): string | T; + heading( + this: RendererThis, + text: string, + level: 1 | 2 | 3 | 4 | 5 | 6, + raw: string, + slugger: Slugger, + ): string | T; + hr(this: RendererThis): string | T; + list(this: RendererThis, body: string, ordered: boolean, start: number): string | T; + listitem(this: RendererThis, text: string, task: boolean, checked: boolean): string | T; + checkbox(this: RendererThis, checked: boolean): string | T; + paragraph(this: RendererThis, text: string): string | T; + table(this: RendererThis, header: string, body: string): string | T; + tablerow(this: RendererThis, content: string): string | T; + tablecell( + this: RendererThis, + content: string, + flags: { + header: boolean; + align: 'center' | 'left' | 'right' | null; + }, + ): string | T; + strong(this: RendererThis, text: string): string | T; + em(this: RendererThis, text: string): string | T; + codespan(this: RendererThis, code: string): string | T; + br(this: RendererThis): string | T; + del(this: RendererThis, text: string): string | T; + link(this: RendererThis, href: string | null, title: string | null, text: string): string | T; + image(this: RendererThis, href: string | null, title: string | null, text: string): string | T; + text(this: RendererThis, text: string): string | T; + } + + type RendererObject = Partial, 'constructor' | 'options'>>; + + class TextRenderer { strong(text: string): string; em(text: string): string; - codespan(code: string): string; - br(): string; + codespan(text: string): string; del(text: string): string; - link(href: string, title: string, text: string): string; - image(href: string, title: string, text: string): string; text(text: string): string; + link(href: string | null, title: string | null, text: string): string; + image(href: string | null, title: string | null, text: string): string; + br(): string; + html(text: string): string; + } + + class Parser { + constructor(options?: MarkedOptions); + tokens: Token[] | TokensList; + token: Token | null; + options: MarkedOptions; + renderer: Renderer; + textRenderer: TextRenderer; + slugger: Slugger; + static parse(src: Token[] | TokensList, options?: MarkedOptions): string; + static parseInline(src: Token[], options?: MarkedOptions): string; + parse(src: Token[] | TokensList): string; + parseInline(src: Token[], renderer: Renderer): string; + next(): Token; } class Lexer { - rules: Rules; - tokens: TokensList; constructor(options?: MarkedOptions); + tokens: TokensList; + options: MarkedOptions; + rules: Rules; + static rules: Rules; + static lex(src: string, options?: MarkedOptions): TokensList; + static lexInline(src: string, options?: MarkedOptions): Token[]; lex(src: string): TokensList; + blockTokens(src: string, tokens: Token[]): Token[]; + blockTokens(src: string, tokens: TokensList): TokensList; + inline(src: string, tokens: Token[]): void; + inlineTokens(src: string, tokens: Token[]): Token[]; + state: { + inLink: boolean; + inRawBlock: boolean; + top: boolean; + }; + } + + class Slugger { + seen: { [slugValue: string]: number }; + slug(value: string, options?: SluggerOptions): string; + } + + interface SluggerOptions { + dryrun: boolean; } interface Rules { @@ -110,188 +260,342 @@ declare namespace marked { type TokensList = Token[] & { links: { - [key: string]: { href: string; title: string; } - } + [key: string]: { href: string | null; title: string | null }; + }; }; type Token = - Tokens.Space + | Tokens.Space | Tokens.Code | Tokens.Heading | Tokens.Table | Tokens.Hr - | Tokens.BlockquoteStart - | Tokens.BlockquoteEnd - | Tokens.ListStart - | Tokens.LooseItemStart - | Tokens.ListItemStart - | Tokens.ListItemEnd - | Tokens.ListEnd + | Tokens.Blockquote + | Tokens.List + | Tokens.ListItem | Tokens.Paragraph | Tokens.HTML - | Tokens.Text; + | Tokens.Text + | Tokens.Def + | Tokens.Escape + | Tokens.Tag + | Tokens.Image + | Tokens.Link + | Tokens.Strong + | Tokens.Em + | Tokens.Codespan + | Tokens.Br + | Tokens.Del; namespace Tokens { interface Space { type: 'space'; + raw: string; } interface Code { type: 'code'; - lang?: string; + raw: string; + codeBlockStyle?: 'indented' | undefined; + lang?: string | undefined; text: string; } interface Heading { type: 'heading'; + raw: string; depth: number; text: string; + tokens: Token[]; } interface Table { type: 'table'; - header: string[]; + raw: string; align: Array<'center' | 'left' | 'right' | null>; - cells: string[][]; + header: TableCell[]; + rows: TableCell[][]; + } + + interface TableCell { + text: string; + tokens: Token[]; } interface Hr { type: 'hr'; + raw: string; } - interface BlockquoteStart { - type: 'blockquote_start'; + interface Blockquote { + type: 'blockquote'; + raw: string; + text: string; + tokens: Token[]; } - interface BlockquoteEnd { - type: 'blockquote_end'; - } - - interface ListStart { - type: 'list_start'; + interface List { + type: 'list'; + raw: string; ordered: boolean; + start: number | ''; + loose: boolean; + items: ListItem[]; } - interface LooseItemStart { - type: 'loose_item_start'; - } - - interface ListItemStart { - type: 'list_item_start'; - } - - interface ListItemEnd { - type: 'list_item_end'; - } - - interface ListEnd { - type: 'list_end'; + interface ListItem { + type: 'list_item'; + raw: string; + task: boolean; + checked?: boolean | undefined; + loose: boolean; + text: string; + tokens: Token[]; } interface Paragraph { type: 'paragraph'; - pre?: boolean; + raw: string; + pre?: boolean | undefined; text: string; + tokens: Token[]; } interface HTML { type: 'html'; + raw: string; pre: boolean; text: string; } interface Text { type: 'text'; + raw: string; text: string; + tokens?: Token[] | undefined; + } + + interface Def { + type: 'def'; + raw: string; + tag: string; + href: string; + title: string; + } + + interface Escape { + type: 'escape'; + raw: string; + text: string; + } + + interface Tag { + type: 'text' | 'html'; + raw: string; + inLink: boolean; + inRawBlock: boolean; + text: string; + } + + interface Link { + type: 'link'; + raw: string; + href: string; + title: string; + text: string; + tokens: Token[]; + } + + interface Image { + type: 'image'; + raw: string; + href: string; + title: string; + text: string; + } + + interface Strong { + type: 'strong'; + raw: string; + text: string; + tokens: Token[]; + } + + interface Em { + type: 'em'; + raw: string; + text: string; + tokens: Token[]; + } + + interface Codespan { + type: 'codespan'; + raw: string; + text: string; + } + + interface Br { + type: 'br'; + raw: string; + } + + interface Del { + type: 'del'; + raw: string; + text: string; + tokens: Token[]; + } + + interface Generic { + [index: string]: any; + type: string; + raw: string; + tokens?: Token[] | undefined; } } - interface MarkedOptions { - /** - * A prefix URL for any relative link. - */ - baseUrl?: string; + interface TokenizerThis { + lexer: Lexer; + } - /** - * Enable GFM line breaks. This option requires the gfm option to be true. - */ - breaks?: boolean; + interface TokenizerExtension { + name: string; + level: 'block' | 'inline'; + start?: ((this: TokenizerThis, src: string) => number) | undefined; + tokenizer: (this: TokenizerThis, src: string, tokens: Token[] | TokensList) => Tokens.Generic | void; + childTokens?: string[] | undefined; + } - /** - * Enable GitHub flavored markdown. - */ - gfm?: boolean; + interface RendererThis { + parser: Parser; + } - /** - * Include an id attribute when emitting headings. - */ - headerIds?: boolean; + interface RendererExtension { + name: string; + renderer: (this: RendererThis, token: Tokens.Generic) => string | false; + } - /** - * Set the prefix for header tag ids. - */ - headerPrefix?: string; + interface MarkedExtension { + /** + * A prefix URL for any relative link. + */ + baseUrl?: string | undefined; - /** - * A function to highlight code blocks. The function takes three arguments: code, lang, and callback. - */ - highlight?(code: string, lang: string, callback?: (error: any | undefined, code: string) => void): string; + /** + * Enable GFM line breaks. This option requires the gfm option to be true. + */ + breaks?: boolean | undefined; - /** - * Set the prefix for code block classes. - */ - langPrefix?: string; + /** + * Add tokenizers and renderers to marked + */ + extensions?: + | Array + | undefined; - /** - * Mangle autolinks (). - */ - mangle?: boolean; + /** + * Enable GitHub flavored markdown. + */ + gfm?: boolean | undefined; - /** - * Conform to obscure parts of markdown.pl as much as possible. Don't fix any of the original markdown bugs or poor behavior. - */ - pedantic?: boolean; + /** + * Include an id attribute when emitting headings. + */ + headerIds?: boolean | undefined; - /** - * Type: object Default: new Renderer() - * - * An object containing functions to render tokens to HTML. - */ - renderer?: Renderer; + /** + * Set the prefix for header tag ids. + */ + headerPrefix?: string | undefined; - /** - * Sanitize the output. Ignore any HTML that has been input. - */ - sanitize?: boolean; + /** + * A function to highlight code blocks. The function can either be + * synchronous (returning a string) or asynchronous (callback invoked + * with an error if any occurred during highlighting and a string + * if highlighting was successful) + */ + highlight?( + code: string, + lang: string, + callback?: (error: any, code?: string) => void, + ): string | void; - /** - * Optionally sanitize found HTML with a sanitizer function. - */ + /** + * Set the prefix for code block classes. + */ + langPrefix?: string | undefined; + + /** + * Mangle autolinks (). + */ + mangle?: boolean | undefined; + + /** + * Conform to obscure parts of markdown.pl as much as possible. Don't fix any of the original markdown bugs or poor behavior. + */ + pedantic?: boolean | undefined; + + /** + * Type: object Default: new Renderer() + * + * An object containing functions to render tokens to HTML. + */ + renderer?: Renderer | RendererObject | undefined; + + /** + * Sanitize the output. Ignore any HTML that has been input. + */ + sanitize?: boolean | undefined; + + /** + * Optionally sanitize found HTML with a sanitizer function. + */ sanitizer?(html: string): string; - /** - * Shows an HTML error message when rendering fails. - */ - silent?: boolean; + /** + * Shows an HTML error message when rendering fails. + */ + silent?: boolean | undefined; - /** - * Use smarter list behavior than the original markdown. May eventually be default with the old behavior moved into pedantic. - */ - smartLists?: boolean; + /** + * Use smarter list behavior than the original markdown. May eventually be default with the old behavior moved into pedantic. + */ + smartLists?: boolean | undefined; - /** - * Use "smart" typographic punctuation for things like quotes and dashes. - */ - smartypants?: boolean; + /** + * Use "smart" typograhic punctuation for things like quotes and dashes. + */ + smartypants?: boolean | undefined; - /** - * Enable GFM tables. This option requires the gfm option to be true. - */ - tables?: boolean; + /** + * The tokenizer defines how to turn markdown text into tokens. + */ + tokenizer?: Tokenizer | TokenizerObject | undefined; - /** - * Generate closing slash for self-closing tags (
instead of
) - */ - xhtml?: boolean; + /** + * The walkTokens function gets called with every token. + * Child tokens are called before moving on to sibling tokens. + * Each token is passed by reference so updates are persisted when passed to the parser. + * The return value of the function is ignored. + */ + walkTokens?: ((token: Token) => void) | undefined; + /** + * Generate closing slash for self-closing tags (
instead of
) + */ + xhtml?: boolean | undefined; + } + + interface MarkedOptions extends Omit { + /** + * Type: object Default: new Renderer() + * + * An object containing functions to render tokens to HTML. + */ + renderer?: Renderer | undefined; + + /** + * The tokenizer defines how to turn markdown text into tokens. + */ + tokenizer?: Tokenizer | undefined; } } diff --git a/src/vs/base/common/marked/marked.js b/src/vs/base/common/marked/marked.js index 3a3f975c922..09c308378d4 100644 --- a/src/vs/base/common/marked/marked.js +++ b/src/vs/base/common/marked/marked.js @@ -1,6 +1,6 @@ /** * marked - a markdown parser - * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed) + * Copyright (c) 2011-2022, Christopher Jeffrey. (MIT Licensed) * https://github.com/markedjs/marked */ @@ -10,20 +10,19 @@ */ // ESM-uncomment-begin -// let __marked_exports; +// let __marked_exports = {}; // (function() { -// function define(factory) { -// __marked_exports = factory(); +// function define(deps, factory) { +// factory(__marked_exports); // } // define.amd = true; // ESM-uncomment-end (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.marked = factory()); -}(this, (function () { 'use strict'; - + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.marked = {})); +})(this, (function (exports) { 'use strict'; function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; @@ -37,6 +36,9 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); return Constructor; } @@ -78,9 +80,7 @@ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - var defaults$5 = {exports: {}}; - - function getDefaults$1() { + function getDefaults() { return { baseUrl: null, breaks: false, @@ -103,17 +103,11 @@ xhtml: false }; } - - function changeDefaults$1(newDefaults) { - defaults$5.exports.defaults = newDefaults; + exports.defaults = getDefaults(); + function changeDefaults(newDefaults) { + exports.defaults = newDefaults; } - defaults$5.exports = { - defaults: getDefaults$1(), - getDefaults: getDefaults$1, - changeDefaults: changeDefaults$1 - }; - /** * Helpers */ @@ -133,7 +127,7 @@ return escapeReplacements[ch]; }; - function escape$2(html, encode) { + function escape(html, encode) { if (encode) { if (escapeTest.test(html)) { return html.replace(escapeReplace, getEscapeReplacement); @@ -146,10 +140,8 @@ return html; } - var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; - - function unescape$1(html) { + function unescape(html) { // explicitly match decimal, hex, and named HTML entities return html.replace(unescapeTest, function (_, n) { n = n.toLowerCase(); @@ -162,10 +154,8 @@ return ''; }); } - var caret = /(^|[^\[])\^/g; - - function edit$1(regex, opt) { + function edit(regex, opt) { regex = regex.source || regex; opt = opt || ''; var obj = { @@ -181,16 +171,14 @@ }; return obj; } - var nonWordAndColonTest = /[^\w:]/g; var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; - - function cleanUrl$1(sanitize, base, href) { + function cleanUrl(sanitize, base, href) { if (sanitize) { var prot; try { - prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, '').toLowerCase(); + prot = decodeURIComponent(unescape(href)).replace(nonWordAndColonTest, '').toLowerCase(); } catch (e) { return null; } @@ -212,12 +200,10 @@ return href; } - var baseUrls = {}; var justDomain = /^[^:]+:\/*[^/]*$/; var protocol = /^([^:]+:)[\s\S]*$/; var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; - function resolveUrl(base, href) { if (!baseUrls[' ' + base]) { // we can ignore everything in base after the last slash of its path component, @@ -226,7 +212,7 @@ if (justDomain.test(base)) { baseUrls[' ' + base] = base + '/'; } else { - baseUrls[' ' + base] = rtrim$1(base, '/', true); + baseUrls[' ' + base] = rtrim(base, '/', true); } } @@ -249,12 +235,10 @@ return base + href; } } - - var noopTest$1 = { + var noopTest = { exec: function noopTest() {} }; - - function merge$2(obj) { + function merge(obj) { var i = 1, target, key; @@ -271,8 +255,7 @@ return obj; } - - function splitCells$1(tableRow, count) { + function splitCells(tableRow, count) { // ensure that every cell-delimiting pipe has a space // before it to distinguish it from an escaped pipe var row = tableRow.replace(/\|/g, function (match, offset, str) { @@ -321,8 +304,7 @@ // /c*$/ is vulnerable to REDOS. // invert: Remove suffix of non-c chars instead. Default falsey. - - function rtrim$1(str, c, invert) { + function rtrim(str, c, invert) { var l = str.length; if (l === 0) { @@ -346,8 +328,7 @@ return str.substr(0, l - suffLen); } - - function findClosingBracket$1(str, b) { + function findClosingBracket(str, b) { if (str.indexOf(b[1]) === -1) { return -1; } @@ -372,15 +353,13 @@ return -1; } - - function checkSanitizeDeprecation$1(opt) { + function checkSanitizeDeprecation(opt) { if (opt && opt.sanitize && !opt.silent) { console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options'); } } // copied from https://stackoverflow.com/a/5450113/806777 - - function repeatString$1(pattern, count) { + function repeatString(pattern, count) { if (count < 1) { return ''; } @@ -399,30 +378,9 @@ return result + pattern; } - var helpers = { - escape: escape$2, - unescape: unescape$1, - edit: edit$1, - cleanUrl: cleanUrl$1, - resolveUrl: resolveUrl, - noopTest: noopTest$1, - merge: merge$2, - splitCells: splitCells$1, - rtrim: rtrim$1, - findClosingBracket: findClosingBracket$1, - checkSanitizeDeprecation: checkSanitizeDeprecation$1, - repeatString: repeatString$1 - }; - - var defaults$4 = defaults$5.exports.defaults; - var rtrim = helpers.rtrim, - splitCells = helpers.splitCells, - _escape = helpers.escape, - findClosingBracket = helpers.findClosingBracket; - function outputLink(cap, link, raw, lexer) { var href = link.href; - var title = link.title ? _escape(link.title) : null; + var title = link.title ? escape(link.title) : null; var text = cap[1].replace(/\\([\[\]])/g, '$1'); if (cap[0].charAt(0) !== '!') { @@ -443,7 +401,7 @@ raw: raw, href: href, title: title, - text: _escape(text) + text: escape(text) }; } } @@ -477,9 +435,9 @@ */ - var Tokenizer_1 = /*#__PURE__*/function () { + var Tokenizer = /*#__PURE__*/function () { function Tokenizer(options) { - this.options = options || defaults$4; + this.options = options || exports.defaults; } var _proto = Tokenizer.prototype; @@ -487,18 +445,12 @@ _proto.space = function space(src) { var cap = this.rules.block.newline.exec(src); - if (cap) { - if (cap[0].length > 1) { + if (cap && cap[0].length > 0) { return { type: 'space', raw: cap[0] }; } - - return { - raw: '\n' - }; - } }; _proto.code = function code(src) { @@ -588,7 +540,7 @@ var cap = this.rules.block.list.exec(src); if (cap) { - var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, lines, itemContents; + var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly; var bull = cap[1].trim(); var isordered = bull.length > 1; var list = { @@ -606,83 +558,81 @@ } // Get next list item - var itemRegex = new RegExp("^( {0,3}" + bull + ")((?: [^\\n]*| *)(?:\\n[^\\n]*)*(?:\\n|$))"); // Get each top-level item + var itemRegex = new RegExp("^( {0,3}" + bull + ")((?: [^\\n]*)?(?:\\n|$))"); // Check if current bullet point can start a new List Item while (src) { - if (this.rules.block.hr.test(src)) { - // End list if we encounter an HR (possibly move into itemRegex?) - break; - } + endEarly = false; if (!(cap = itemRegex.exec(src))) { break; } - lines = cap[2].split('\n'); + if (this.rules.block.hr.test(src)) { + // End list if bullet was actually HR (possibly move into itemRegex?) + break; + } + + raw = cap[0]; + src = src.substring(raw.length); + line = cap[2].split('\n', 1)[0]; + nextLine = src.split('\n', 1)[0]; if (this.options.pedantic) { indent = 2; - itemContents = lines[0].trimLeft(); + itemContents = line.trimLeft(); } else { indent = cap[2].search(/[^ ]/); // Find first non-space char - indent = cap[1].length + (indent > 4 ? 1 : indent); // intented code blocks after 4 spaces; indent is always 1 + indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent - itemContents = lines[0].slice(indent - cap[1].length); + itemContents = line.slice(indent); + indent += cap[1].length; } blankLine = false; - raw = cap[0]; - if (!lines[0] && /^ *$/.test(lines[1])) { - // items begin with at most one blank line - raw = cap[1] + lines.slice(0, 2).join('\n') + '\n'; - list.loose = true; - lines = []; + if (!line && /^ *$/.test(nextLine)) { + // Items begin with at most one blank line + raw += nextLine + '\n'; + src = src.substring(nextLine.length + 1); + endEarly = true; } - var nextBulletRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}(?:[*+-]|\\d{1,9}[.)])"); + if (!endEarly) { + var nextBulletRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}(?:[*+-]|\\d{1,9}[.)])"); // Check if following lines should be included in List Item - for (i = 1; i < lines.length; i++) { - line = lines[i]; + while (src) { + rawLine = src.split('\n', 1)[0]; + line = rawLine; // Re-align to follow commonmark nesting rules if (this.options.pedantic) { - // Re-align to follow commonmark nesting rules line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' '); } // End list item if found start of new bullet if (nextBulletRegex.test(line)) { - raw = cap[1] + lines.slice(0, i).join('\n') + '\n'; break; - } // Until we encounter a blank line, item contents do not need indentation - - - if (!blankLine) { - if (!line.trim()) { - // Check if current line is empty - blankLine = true; - } // Dedent if possible - - - if (line.search(/[^ ]/) >= indent) { - itemContents += '\n' + line.slice(indent); - } else { - itemContents += '\n' + line; } - continue; - } // Dedent this line - - if (line.search(/[^ ]/) >= indent || !line.trim()) { + // Dedent if possible itemContents += '\n' + line.slice(indent); - continue; + } else if (!blankLine) { + // Until blank line, item doesn't need indentation + itemContents += '\n' + line; } else { - // Line was not properly indented; end of this item - raw = cap[1] + lines.slice(0, i).join('\n') + '\n'; + // Otherwise, improper indentation ends this item break; } + + if (!blankLine && !line.trim()) { + // Check if current line is blank + blankLine = true; + } + + raw += rawLine + '\n'; + src = src.substring(rawLine.length + 1); + } } if (!list.loose) { @@ -713,7 +663,6 @@ text: itemContents }); list.raw += raw; - src = src.slice(raw.length); } // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic @@ -725,10 +674,30 @@ for (i = 0; i < l; i++) { this.lexer.state.top = false; list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []); - - if (list.items[i].tokens.some(function (t) { + var spacers = list.items[i].tokens.filter(function (t) { return t.type === 'space'; - })) { + }); + var hasMultipleLineBreaks = spacers.every(function (t) { + var chars = t.raw.split(''); + var lineBreaks = 0; + + for (var _iterator = _createForOfIteratorHelperLoose(chars), _step; !(_step = _iterator()).done;) { + var _char = _step.value; + + if (_char === '\n') { + lineBreaks += 1; + } + + if (lineBreaks > 1) { + return true; + } + } + + return false; + }); + + if (!list.loose && spacers.length && hasMultipleLineBreaks) { + // Having a single line break doesn't mean a list is loose. A single line break is terminating the last list item list.loose = true; list.items[i].loose = true; } @@ -751,7 +720,7 @@ if (this.options.sanitize) { token.type = 'paragraph'; - token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]); + token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]); token.tokens = []; this.lexer.inline(token.text, token.tokens); } @@ -788,7 +757,7 @@ }; }), align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - rows: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [] + rows: cap[3] ? cap[3].replace(/\n[ \t]*$/, '').split('\n') : [] }; if (item.header.length === item.align.length) { @@ -890,14 +859,14 @@ } }; - _proto.escape = function escape(src) { + _proto.escape = function escape$1(src) { var cap = this.rules.inline.escape.exec(src); if (cap) { return { type: 'escape', raw: cap[0], - text: _escape(cap[1]) + text: escape(cap[1]) }; } }; @@ -923,7 +892,7 @@ raw: cap[0], inLink: this.lexer.state.inLink, inRawBlock: this.lexer.state.inRawBlock, - text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0] + text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]) : cap[0] }; } }; @@ -1020,7 +989,7 @@ var match = this.rules.inline.emStrong.lDelim.exec(src); if (!match) return; // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well - if (match[3] && prevChar.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/)) return; + if (match[3] && prevChar.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/)) return; var nextChar = match[1] || match[2] || ''; if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) { @@ -1093,7 +1062,7 @@ text = text.substring(1, text.length - 1); } - text = _escape(text, true); + text = escape(text, true); return { type: 'codespan', raw: cap[0], @@ -1133,10 +1102,10 @@ var text, href; if (cap[2] === '@') { - text = _escape(this.options.mangle ? mangle(cap[1]) : cap[1]); + text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]); href = 'mailto:' + text; } else { - text = _escape(cap[1]); + text = escape(cap[1]); href = text; } @@ -1161,7 +1130,7 @@ var text, href; if (cap[2] === '@') { - text = _escape(this.options.mangle ? mangle(cap[0]) : cap[0]); + text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]); href = 'mailto:' + text; } else { // do extended autolink path validation @@ -1172,7 +1141,7 @@ cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; } while (prevCapZero !== cap[0]); - text = _escape(cap[0]); + text = escape(cap[0]); if (cap[1] === 'www.') { href = 'http://' + text; @@ -1202,9 +1171,9 @@ var text; if (this.lexer.state.inRawBlock) { - text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0]; + text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]) : cap[0]; } else { - text = _escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]); + text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]); } return { @@ -1218,14 +1187,11 @@ return Tokenizer; }(); - var noopTest = helpers.noopTest, - edit = helpers.edit, - merge$1 = helpers.merge; /** * Block-Level Grammar */ - var block$1 = { + var block = { newline: /^(?: *(?:\n|$))+/, code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/, @@ -1243,64 +1209,69 @@ + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag + '|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag + ')', - def: /^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/, + def: /^ {0,3}\[(label)\]: *(?:\n *)?]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, table: noopTest, lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, // regex template, placeholders will be replaced according to different paragraph // interruption rules of commonmark and the original markdown spec: - _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/, + _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, text: /^[^\n]+/ }; - block$1._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/; - block$1._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; - block$1.def = edit(block$1.def).replace('label', block$1._label).replace('title', block$1._title).getRegex(); - block$1.bullet = /(?:[*+-]|\d{1,9}[.)])/; - block$1.listItemStart = edit(/^( *)(bull) */).replace('bull', block$1.bullet).getRegex(); - block$1.list = edit(block$1.list).replace(/bull/g, block$1.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block$1.def.source + ')').getRegex(); - block$1._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul'; - block$1._comment = /|$)/; - block$1.html = edit(block$1.html, 'i').replace('comment', block$1._comment).replace('tag', block$1._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); - block$1.paragraph = edit(block$1._paragraph).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs - .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt - .replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // pars can be interrupted by type (6) html blocks + block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/; + block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; + block.def = edit(block.def).replace('label', block._label).replace('title', block._title).getRegex(); + block.bullet = /(?:[*+-]|\d{1,9}[.)])/; + block.listItemStart = edit(/^( *)(bull) */).replace('bull', block.bullet).getRegex(); + block.list = edit(block.list).replace(/bull/g, block.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block.def.source + ')').getRegex(); + block._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul'; + block._comment = /|$)/; + block.html = edit(block.html, 'i').replace('comment', block._comment).replace('tag', block._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); + block.paragraph = edit(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs + .replace('|table', '').replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks .getRegex(); - block$1.blockquote = edit(block$1.blockquote).replace('paragraph', block$1.paragraph).getRegex(); + block.blockquote = edit(block.blockquote).replace('paragraph', block.paragraph).getRegex(); /** * Normal Block Grammar */ - block$1.normal = merge$1({}, block$1); + block.normal = merge({}, block); /** * GFM Block Grammar */ - block$1.gfm = merge$1({}, block$1.normal, { + block.gfm = merge({}, block.normal, { table: '^ *([^\\n ].*\\|.*)\\n' // Header - + ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)\\|?' // Align + + ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?' // Align + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells }); - block$1.gfm.table = edit(block$1.gfm.table).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt - .replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks + block.gfm.table = edit(block.gfm.table).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // tables can be interrupted by type (6) html blocks + .getRegex(); + block.gfm.paragraph = edit(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs + .replace('table', block.gfm.table) // interrupt paragraphs with table + .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks .getRegex(); /** * Pedantic grammar (original John Gruber's loose markdown specification) */ - block$1.pedantic = merge$1({}, block$1.normal, { + block.pedantic = merge({}, block.normal, { html: edit('^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag - + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block$1._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(), + + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: noopTest, // fences not supported - paragraph: edit(block$1.normal._paragraph).replace('hr', block$1.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block$1.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex() + paragraph: edit(block.normal._paragraph).replace('hr', block.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex() }); /** * Inline-Level Grammar */ - var inline$1 = { + var inline = { escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, url: noopTest, @@ -1311,15 +1282,15 @@ + '|^', // CDATA section link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, - reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/, - nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/, + reflink: /^!?\[(label)\]\[(ref)\]/, + nolink: /^!?\[(ref)\](?:\[\])?/, reflinkSearch: 'reflink|nolink(?!\\()', emStrong: { lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/, // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right. - // () Skip other delimiter (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a - rDelimAst: /\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/, - rDelimUnd: /\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _ + // () Skip orphan delim inside strong (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a + rDelimAst: /^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/, + rDelimUnd: /^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _ }, code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, @@ -1330,37 +1301,38 @@ }; // list of punctuation marks from CommonMark spec // without * and _ to handle the different emphasis markers * and _ - inline$1._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~'; - inline$1.punctuation = edit(inline$1.punctuation).replace(/punctuation/g, inline$1._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, + inline._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~'; + inline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, - inline$1.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g; - inline$1.escapedEmSt = /\\\*|\\_/g; - inline$1._comment = edit(block$1._comment).replace('(?:-->|$)', '-->').getRegex(); - inline$1.emStrong.lDelim = edit(inline$1.emStrong.lDelim).replace(/punct/g, inline$1._punctuation).getRegex(); - inline$1.emStrong.rDelimAst = edit(inline$1.emStrong.rDelimAst, 'g').replace(/punct/g, inline$1._punctuation).getRegex(); - inline$1.emStrong.rDelimUnd = edit(inline$1.emStrong.rDelimUnd, 'g').replace(/punct/g, inline$1._punctuation).getRegex(); - inline$1._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; - inline$1._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; - inline$1._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; - inline$1.autolink = edit(inline$1.autolink).replace('scheme', inline$1._scheme).replace('email', inline$1._email).getRegex(); - inline$1._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; - inline$1.tag = edit(inline$1.tag).replace('comment', inline$1._comment).replace('attribute', inline$1._attribute).getRegex(); - inline$1._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; - inline$1._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; - inline$1._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; - inline$1.link = edit(inline$1.link).replace('label', inline$1._label).replace('href', inline$1._href).replace('title', inline$1._title).getRegex(); - inline$1.reflink = edit(inline$1.reflink).replace('label', inline$1._label).getRegex(); - inline$1.reflinkSearch = edit(inline$1.reflinkSearch, 'g').replace('reflink', inline$1.reflink).replace('nolink', inline$1.nolink).getRegex(); + inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g; + inline.escapedEmSt = /\\\*|\\_/g; + inline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex(); + inline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex(); + inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'g').replace(/punct/g, inline._punctuation).getRegex(); + inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'g').replace(/punct/g, inline._punctuation).getRegex(); + inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; + inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; + inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; + inline.autolink = edit(inline.autolink).replace('scheme', inline._scheme).replace('email', inline._email).getRegex(); + inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; + inline.tag = edit(inline.tag).replace('comment', inline._comment).replace('attribute', inline._attribute).getRegex(); + inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; + inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; + inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; + inline.link = edit(inline.link).replace('label', inline._label).replace('href', inline._href).replace('title', inline._title).getRegex(); + inline.reflink = edit(inline.reflink).replace('label', inline._label).replace('ref', block._label).getRegex(); + inline.nolink = edit(inline.nolink).replace('ref', block._label).getRegex(); + inline.reflinkSearch = edit(inline.reflinkSearch, 'g').replace('reflink', inline.reflink).replace('nolink', inline.nolink).getRegex(); /** * Normal Inline Grammar */ - inline$1.normal = merge$1({}, inline$1); + inline.normal = merge({}, inline); /** * Pedantic Inline Grammar */ - inline$1.pedantic = merge$1({}, inline$1.normal, { + inline.pedantic = merge({}, inline.normal, { strong: { start: /^__|\*\*/, middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, @@ -1373,40 +1345,31 @@ endAst: /\*(?!\*)/g, endUnd: /_(?!_)/g }, - link: edit(/^!?\[(label)\]\((.*?)\)/).replace('label', inline$1._label).getRegex(), - reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline$1._label).getRegex() + link: edit(/^!?\[(label)\]\((.*?)\)/).replace('label', inline._label).getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline._label).getRegex() }); /** * GFM Inline Grammar */ - inline$1.gfm = merge$1({}, inline$1.normal, { - escape: edit(inline$1.escape).replace('])', '~|])').getRegex(), + inline.gfm = merge({}, inline.normal, { + escape: edit(inline.escape).replace('])', '~|])').getRegex(), _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ 0) { + // if there's a single \n as a spacer, it's terminating the last line, + // so move it there so that we don't get unecessary paragraph tags + tokens[tokens.length - 1].raw += '\n'; + } else { tokens.push(token); } @@ -1962,16 +1929,13 @@ return Lexer; }(); - var defaults$2 = defaults$5.exports.defaults; - var cleanUrl = helpers.cleanUrl, - escape$1 = helpers.escape; /** * Renderer */ - var Renderer_1 = /*#__PURE__*/function () { + var Renderer = /*#__PURE__*/function () { function Renderer(options) { - this.options = options || defaults$2; + this.options = options || exports.defaults; } var _proto = Renderer.prototype; @@ -1991,10 +1955,10 @@ _code = _code.replace(/\n$/, '') + '\n'; if (!lang) { - return '
' + (escaped ? _code : escape$1(_code, true)) + '
\n'; + return '
' + (escaped ? _code : escape(_code, true)) + '
\n'; } - return '
' + (escaped ? _code : escape$1(_code, true)) + '
\n'; + return '
' + (escaped ? _code : escape(_code, true)) + '
\n'; }; _proto.blockquote = function blockquote(quote) { @@ -2079,7 +2043,7 @@ return text; } - var out = '
URI) | null = null; @@ -127,6 +130,10 @@ class RemoteAuthoritiesImpl { this._connectionTokens[authority] = connectionToken; } + getPreferredWebSchema(): 'http' | 'https' { + return this._preferredWebSchema; + } + rewrite(uri: URI): URI { if (this._delegate) { return this._delegate(uri); @@ -140,7 +147,7 @@ class RemoteAuthoritiesImpl { const connectionToken = this._connectionTokens[authority]; let query = `path=${encodeURIComponent(uri.path)}`; if (typeof connectionToken === 'string') { - query += `&tkn=${encodeURIComponent(connectionToken)}`; + query += `&${connectionTokenQueryName}=${encodeURIComponent(connectionToken)}`; } return URI.from({ scheme: platform.isWeb ? this._preferredWebSchema : Schemas.vscodeRemoteResource, diff --git a/src/vs/base/common/objects.ts b/src/vs/base/common/objects.ts index 2e3e020856c..148d2d6b232 100644 --- a/src/vs/base/common/objects.ts +++ b/src/vs/base/common/objects.ts @@ -190,7 +190,7 @@ export function getOrDefault(obj: T, fn: (obj: T) => R | undefined, defaul return typeof result === 'undefined' ? defaultValue : result; } -type obj = { [key: string]: any; }; +type obj = { [key: string]: any }; /** * Returns an object that has keys for each value that is different in the base object. Keys * that do not exist in the target but in the base object are not considered. diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts index aa1e3dc4e1a..eea237c2b41 100644 --- a/src/vs/base/common/platform.ts +++ b/src/vs/base/common/platform.ts @@ -13,6 +13,7 @@ let _isNative = false; let _isWeb = false; let _isElectron = false; let _isIOS = false; +let _isCI = false; let _locale: string | undefined = undefined; let _language: string = LANGUAGE_DEFAULT; let _translationsConfigFile: string | undefined = undefined; @@ -20,7 +21,7 @@ let _userAgent: string | undefined = undefined; interface NLSConfig { locale: string; - availableLanguages: { [key: string]: string; }; + availableLanguages: { [key: string]: string }; _translationsConfigFile: string; } @@ -92,6 +93,7 @@ else if (typeof nodeProcess === 'object') { _isLinux = (nodeProcess.platform === 'linux'); _isLinuxSnap = _isLinux && !!nodeProcess.env['SNAP'] && !!nodeProcess.env['SNAP_REVISION']; _isElectron = isElectronProcess; + _isCI = !!nodeProcess.env['CI'] || !!nodeProcess.env['BUILD_ARTIFACTSTAGINGDIRECTORY']; _locale = LANGUAGE_DEFAULT; _language = LANGUAGE_DEFAULT; const rawNlsConfig = nodeProcess.env['VSCODE_NLS_CONFIG']; @@ -146,6 +148,11 @@ export const isNative = _isNative; export const isElectron = _isElectron; export const isWeb = _isWeb; export const isIOS = _isIOS; +/** + * Whether we run inside a CI environment, such as + * GH actions or Azure Pipelines. + */ +export const isCI = _isCI; export const platform = _platform; export const userAgent = _userAgent; @@ -247,3 +254,9 @@ export function isLittleEndian(): boolean { } return _isLittleEndian; } + +export const isChrome = !!(userAgent && userAgent.indexOf('Chrome') >= 0); +export const isFirefox = !!(userAgent && userAgent.indexOf('Firefox') >= 0); +export const isSafari = !!(!isChrome && (userAgent && userAgent.indexOf('Safari') >= 0)); +export const isEdge = !!(userAgent && userAgent.indexOf('Edg/') >= 0); +export const isAndroid = !!(userAgent && userAgent.indexOf('Android') >= 0); diff --git a/src/vs/base/common/process.ts b/src/vs/base/common/process.ts index c6341d951a9..cfa3c1c5a41 100644 --- a/src/vs/base/common/process.ts +++ b/src/vs/base/common/process.ts @@ -5,7 +5,7 @@ import { globals, INodeProcess, isMacintosh, isWindows } from 'vs/base/common/platform'; -let safeProcess: Omit & { arch: string | undefined; }; +let safeProcess: Omit & { arch: string | undefined }; declare const process: INodeProcess; // Native sandbox environment diff --git a/src/vs/base/common/processes.ts b/src/vs/base/common/processes.ts index 6c52c3f9ce2..db23e105808 100644 --- a/src/vs/base/common/processes.ts +++ b/src/vs/base/common/processes.ts @@ -19,7 +19,7 @@ export interface CommandOptions { * The environment of the executed program or shell. If omitted * the parent process' environment is used. */ - env?: { [key: string]: string; }; + env?: { [key: string]: string }; } export interface Executable { @@ -108,7 +108,7 @@ export function sanitizeProcessEnvironment(env: IProcessEnvironment, ...preserve }, {} as Record); const keysToRemove = [ /^ELECTRON_.+$/, - /^VSCODE_.+$/, + /^VSCODE_(?!SHELL_LOGIN).+$/, /^SNAP(|_.*)$/, /^GDK_PIXBUF_.+$/, ]; diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index f7c946c6dfa..c618db91a2a 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -13,21 +13,21 @@ export interface IBuiltInExtension { } export type ConfigurationSyncStore = { - url: string, - insidersUrl: string, - stableUrl: string, - canSwitch: boolean, - authenticationProviders: IStringDictionary<{ scopes: string[] }> + url: string; + insidersUrl: string; + stableUrl: string; + canSwitch: boolean; + authenticationProviders: IStringDictionary<{ scopes: string[] }>; }; export type ExtensionUntrustedWorkspaceSupport = { - readonly default?: boolean | 'limited', - readonly override?: boolean | 'limited' + readonly default?: boolean | 'limited'; + readonly override?: boolean | 'limited'; }; export type ExtensionVirtualWorkspaceSupport = { - readonly default?: boolean, - readonly override?: boolean + readonly default?: boolean; + readonly override?: boolean; }; export interface IProductConfiguration { @@ -51,7 +51,6 @@ export interface IProductConfiguration { readonly downloadUrl?: string; readonly updateUrl?: string; - readonly webEndpointUrl?: string; readonly webEndpointUrlTemplate?: string; readonly webviewContentExternalBaseUrlTemplate?: string; readonly target?: string; @@ -76,16 +75,16 @@ export interface IProductConfiguration { readonly recommendationsUrl: string; }; - readonly extensionTips?: { [id: string]: string; }; + readonly extensionTips?: { [id: string]: string }; readonly extensionImportantTips?: IStringDictionary; - readonly configBasedExtensionTips?: { [id: string]: IConfigBasedExtensionTip; }; - readonly exeBasedExtensionTips?: { [id: string]: IExeBasedExtensionTip; }; - readonly remoteExtensionTips?: { [remoteName: string]: IRemoteExtensionTip; }; - readonly extensionKeywords?: { [extension: string]: readonly string[]; }; + readonly configBasedExtensionTips?: { [id: string]: IConfigBasedExtensionTip }; + readonly exeBasedExtensionTips?: { [id: string]: IExeBasedExtensionTip }; + readonly remoteExtensionTips?: { [remoteName: string]: IRemoteExtensionTip }; + readonly extensionKeywords?: { [extension: string]: readonly string[] }; readonly keymapExtensionTips?: readonly string[]; readonly webExtensionTips?: readonly string[]; readonly languageExtensionTips?: readonly string[]; - readonly trustedExtensionUrlPublicKeys?: { [id: string]: string[]; }; + readonly trustedExtensionUrlPublicKeys?: { [id: string]: string[] }; readonly crashReporter?: { readonly companyName: string; @@ -99,8 +98,8 @@ export interface IProductConfiguration { }; readonly sendASmile?: { - readonly reportIssueUrl: string, - readonly requestFeatureUrl: string + readonly reportIssueUrl: string; + readonly requestFeatureUrl: string; }; readonly documentationUrl?: string; @@ -122,24 +121,26 @@ export interface IProductConfiguration { readonly serverGreeting: string[]; readonly serverLicense?: string[]; readonly serverLicensePrompt?: string; + readonly serverApplicationName: string; + readonly serverDataFolderName?: string; readonly npsSurveyUrl?: string; readonly cesSurveyUrl?: string; readonly surveys?: readonly ISurveyData[]; - readonly checksums?: { [path: string]: string; }; + readonly checksums?: { [path: string]: string }; readonly checksumFailMoreInfoUrl?: string; readonly appCenter?: IAppCenterConfiguration; readonly portable?: string; - readonly extensionKind?: { readonly [extensionId: string]: ('ui' | 'workspace' | 'web')[]; }; - readonly extensionPointExtensionKind?: { readonly [extensionPointId: string]: ('ui' | 'workspace' | 'web')[]; }; - readonly extensionSyncedKeys?: { readonly [extensionId: string]: string[]; }; + readonly extensionKind?: { readonly [extensionId: string]: ('ui' | 'workspace' | 'web')[] }; + readonly extensionPointExtensionKind?: { readonly [extensionPointId: string]: ('ui' | 'workspace' | 'web')[] }; + readonly extensionSyncedKeys?: { readonly [extensionId: string]: string[] }; /** @deprecated */ readonly extensionAllowedProposedApi?: readonly string[]; - readonly extensionEnabledApiProposals?: { readonly [extensionId: string]: string[] } + readonly extensionEnabledApiProposals?: { readonly [extensionId: string]: string[] }; readonly extensionUntrustedWorkspaceSupport?: { readonly [extensionId: string]: ExtensionUntrustedWorkspaceSupport }; readonly extensionVirtualWorkspacesSupport?: { readonly [extensionId: string]: ExtensionVirtualWorkspaceSupport }; @@ -164,14 +165,14 @@ export interface IConfigBasedExtensionTip { configPath: string; configName: string; configScheme?: string; - recommendations: IStringDictionary<{ name: string, remotes?: string[], important?: boolean, isExtensionPack?: boolean }>; + recommendations: IStringDictionary<{ name: string; remotes?: string[]; important?: boolean; isExtensionPack?: boolean }>; } export interface IExeBasedExtensionTip { friendlyName: string; windowsPath?: string; important?: boolean; - recommendations: IStringDictionary<{ name: string, important?: boolean, isExtensionPack?: boolean }>; + recommendations: IStringDictionary<{ name: string; important?: boolean; isExtensionPack?: boolean }>; } export interface IRemoteExtensionTip { diff --git a/src/vs/base/common/resources.ts b/src/vs/base/common/resources.ts index cd62839c133..4bcd8fb899f 100644 --- a/src/vs/base/common/resources.ts +++ b/src/vs/base/common/resources.ts @@ -90,7 +90,7 @@ export interface IExtUri { * @param pathFragment The path fragment to add to the URI path. * @returns The resulting URI. */ - joinPath(resource: URI, ...pathFragment: string[]): URI + joinPath(resource: URI, ...pathFragment: string[]): URI; /** * Normalizes the path part of a URI: Resolves `.` and `..` elements with directory names. * diff --git a/src/vs/base/common/scrollable.ts b/src/vs/base/common/scrollable.ts index d3a87b5c70e..7da28a8555d 100644 --- a/src/vs/base/common/scrollable.ts +++ b/src/vs/base/common/scrollable.ts @@ -54,6 +54,7 @@ export class ScrollState implements IScrollDimensions, IScrollPosition { public readonly scrollTop: number; constructor( + private readonly _forceIntegerValues: boolean, width: number, scrollWidth: number, scrollLeft: number, @@ -61,12 +62,14 @@ export class ScrollState implements IScrollDimensions, IScrollPosition { scrollHeight: number, scrollTop: number ) { - width = width | 0; - scrollWidth = scrollWidth | 0; - scrollLeft = scrollLeft | 0; - height = height | 0; - scrollHeight = scrollHeight | 0; - scrollTop = scrollTop | 0; + if (this._forceIntegerValues) { + width = width | 0; + scrollWidth = scrollWidth | 0; + scrollLeft = scrollLeft | 0; + height = height | 0; + scrollHeight = scrollHeight | 0; + scrollTop = scrollTop | 0; + } this.rawScrollLeft = scrollLeft; // before validation this.rawScrollTop = scrollTop; // before validation @@ -114,6 +117,7 @@ export class ScrollState implements IScrollDimensions, IScrollPosition { public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState { return new ScrollState( + this._forceIntegerValues, (typeof update.width !== 'undefined' ? update.width : this.width), (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth), useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft, @@ -125,6 +129,7 @@ export class ScrollState implements IScrollDimensions, IScrollPosition { public withScrollPosition(update: INewScrollPosition): ScrollState { return new ScrollState( + this._forceIntegerValues, this.width, this.scrollWidth, (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft), @@ -202,6 +207,21 @@ export interface INewScrollPosition { scrollTop?: number; } +export interface IScrollableOptions { + /** + * Define if the scroll values should always be integers. + */ + forceIntegerValues: boolean; + /** + * Set the duration (ms) used for smooth scroll animations. + */ + smoothScrollDuration: number; + /** + * A function to schedule an update at the next frame (used for smooth scroll animations). + */ + scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable; +} + export class Scrollable extends Disposable { _scrollableBrand: void = undefined; @@ -214,12 +234,12 @@ export class Scrollable extends Disposable { private _onScroll = this._register(new Emitter()); public readonly onScroll: Event = this._onScroll.event; - constructor(smoothScrollDuration: number, scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable) { + constructor(options: IScrollableOptions) { super(); - this._smoothScrollDuration = smoothScrollDuration; - this._scheduleAtNextAnimationFrame = scheduleAtNextAnimationFrame; - this._state = new ScrollState(0, 0, 0, 0, 0, 0); + this._smoothScrollDuration = options.smoothScrollDuration; + this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame; + this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0); this._smoothScrolling = null; } diff --git a/src/vs/base/common/stream.ts b/src/vs/base/common/stream.ts index be9b4b9d692..fa59ec53e04 100644 --- a/src/vs/base/common/stream.ts +++ b/src/vs/base/common/stream.ts @@ -159,8 +159,8 @@ export function isReadableBufferedStream(obj: unknown): obj is ReadableBuffer return isReadableStream(candidate.stream) && Array.isArray(candidate.buffer) && typeof candidate.ended === 'boolean'; } -export interface IReducer { - (data: T[]): T; +export interface IReducer { + (data: T[]): R; } export interface IDataTransformer { @@ -504,9 +504,9 @@ export function peekReadable(readable: Readable, reducer: IReducer, max * a stream fully, awaiting all the events without caring * about the data. */ -export function consumeStream(stream: ReadableStreamEvents, reducer: IReducer): Promise; +export function consumeStream(stream: ReadableStreamEvents, reducer: IReducer): Promise; export function consumeStream(stream: ReadableStreamEvents): Promise; -export function consumeStream(stream: ReadableStreamEvents, reducer?: IReducer): Promise { +export function consumeStream(stream: ReadableStreamEvents, reducer?: IReducer): Promise { return new Promise((resolve, reject) => { const chunks: T[] = []; diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index 3730de28ce3..0037912f68a 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -1048,7 +1048,7 @@ export class AmbiguousCharacters { // Generated using https://github.com/hediet/vscode-unicode-data // Stored as key1, value1, key2, value2, ... return JSON.parse( - '{\"_common\":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125],\"_default\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"cs\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"de\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"es\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"fr\":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"it\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"ja\":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],\"ko\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"pl\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"pt-BR\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"qps-ploc\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"ru\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"tr\":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"zh-hans\":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],\"zh-hant\":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}' + '{\"_common\":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125],\"_default\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"cs\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"de\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"es\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"fr\":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"it\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"ja\":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],\"ko\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"pl\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"pt-BR\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"qps-ploc\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"ru\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"tr\":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"zh-hans\":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],\"zh-hant\":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}' ); }); diff --git a/extensions/microsoft-authentication/src/microsoft-authentication.d.ts b/src/vs/base/common/stripComments.d.ts similarity index 50% rename from extensions/microsoft-authentication/src/microsoft-authentication.d.ts rename to src/vs/base/common/stripComments.d.ts index c04107ff5f4..69e662e9759 100644 --- a/extensions/microsoft-authentication/src/microsoft-authentication.d.ts +++ b/src/vs/base/common/stripComments.d.ts @@ -3,14 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AuthenticationSession } from 'vscode'; - /** - * Represents a session of a currently logged in Microsoft user. + * Strips single and multi line JavaScript comments from JSON + * content. Ignores characters in strings BUT doesn't support + * string continuation across multiple lines since it is not + * supported in JSON. + * @param content the content to strip comments from + * @returns the content without comments */ -export interface MicrosoftAuthenticationSession extends AuthenticationSession { - /** - * The id token. - */ - idToken?: string; -} \ No newline at end of file +export function stripComments(content: string): string; diff --git a/src/vs/base/common/stripComments.js b/src/vs/base/common/stripComments.js new file mode 100644 index 00000000000..ffc8dd7dbe5 --- /dev/null +++ b/src/vs/base/common/stripComments.js @@ -0,0 +1,60 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +//@ts-check + +(function () { + function factory(path, os, productName, cwd) { + // First group matches a double quoted string + // Second group matches a single quoted string + // Third group matches a multi line comment + // Forth group matches a single line comment + const regexp = /("[^"\\]*(?:\\.[^"\\]*)*")|('[^'\\]*(?:\\.[^'\\]*)*')|(\/\*[^\/\*]*(?:(?:\*|\/)[^\/\*]*)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; + + /** + * + * @param {string} content + * @returns {string} + */ + function stripComments(content) { + return content.replace(regexp, function (match, _m1, _m2, m3, m4) { + // Only one of m1, m2, m3, m4 matches + if (m3) { + // A block comment. Replace with nothing + return ''; + } else if (m4) { + // Since m4 is a single line comment is is at least of length 2 (e.g. //) + // If it ends in \r?\n then keep it. + const length = m4.length; + if (m4[length - 1] === '\n') { + return m4[length - 2] === '\r' ? '\r\n' : '\n'; + } + else { + return ''; + } + } else { + // We match a string + return match; + } + }); + } + return { + stripComments + }; + } + + + if (typeof define === 'function') { + // amd + define([], function () { return factory(); }); + } else if (typeof module === 'object' && typeof module.exports === 'object') { + // commonjs + module.exports = factory(); + } else { + console.trace('strip comments defined in UNKNOWN context (neither requirejs or commonjs)'); + } +})(); diff --git a/src/vs/base/common/types.ts b/src/vs/base/common/types.ts index 028b0c4eb54..602330b8bbc 100644 --- a/src/vs/base/common/types.ts +++ b/src/vs/base/common/types.ts @@ -262,35 +262,6 @@ export type UriDto = { [K in keyof T]: T[K] extends URI ? UriComponents : UriDto }; -/** - * Mapped-type that replaces all occurrences of URI with UriComponents and - * drops all functions. - */ -export type Dto = T extends { toJSON(): infer U } - ? U - : T extends object - ? { [k in keyof T]: Dto; } - : T; - -export function NotImplementedProxy(name: string): { new(): T } { - return class { - constructor() { - return new Proxy({}, { - get(target: any, prop: PropertyKey) { - if (target[prop]) { - return target[prop]; - } - throw new Error(`Not Implemented: ${name}->${String(prop)}`); - } - }); - } - }; -} - export function assertNever(value: never, message = 'Unreachable'): never { throw new Error(message); } - -export function isPromise(obj: unknown): obj is Promise { - return !!obj && typeof (obj as Promise).then === 'function' && typeof (obj as Promise).catch === 'function'; -} diff --git a/src/vs/base/common/worker/simpleWorker.ts b/src/vs/base/common/worker/simpleWorker.ts index 252f7f4ece8..2617e68abfc 100644 --- a/src/vs/base/common/worker/simpleWorker.ts +++ b/src/vs/base/common/worker/simpleWorker.ts @@ -104,7 +104,7 @@ class SimpleWorkerProtocol { private _workerId: number; private _lastSentReq: number; - private _pendingReplies: { [req: string]: IMessageReply; }; + private _pendingReplies: { [req: string]: IMessageReply }; private _pendingEmitters: Map>; private _pendingEvents: Map; private _handler: IMessageHandler; diff --git a/src/vs/base/node/languagePacks.js b/src/vs/base/node/languagePacks.js index 5c14fade878..f99d3808de5 100644 --- a/src/vs/base/node/languagePacks.js +++ b/src/vs/base/node/languagePacks.js @@ -46,7 +46,7 @@ * @returns {Promise} */ function rimraf(location) { - return new Promise((c, e) => fs.rmdir(location, { recursive: true }, err => (err && err.code !== 'ENOENT') ? e(err) : c())); + return new Promise((c, e) => fs.rm(location, { recursive: true, force: true, maxRetries: 3 }, err => err ? e(err) : c())); } /** diff --git a/src/vs/base/node/pfs.ts b/src/vs/base/node/pfs.ts index a04892a4731..c431b5af0c0 100644 --- a/src/vs/base/node/pfs.ts +++ b/src/vs/base/node/pfs.ts @@ -43,7 +43,7 @@ async function rimraf(path: string, mode = RimRafMode.UNLINK): Promise { throw new Error('rimraf - will refuse to recursively delete root'); } - // delete: via rmDir + // delete: via rm if (mode === RimRafMode.UNLINK) { return rimrafUnlink(path); } @@ -79,7 +79,7 @@ async function rimrafMove(path: string): Promise { } async function rimrafUnlink(path: string): Promise { - return Promises.rmdir(path, { recursive: true, maxRetries: 3 }); + return promisify(fs.rm)(path, { recursive: true, force: true, maxRetries: 3 }); } export function rimrafSync(path: string): void { @@ -87,7 +87,7 @@ export function rimrafSync(path: string): void { throw new Error('rimraf - will refuse to recursively delete root'); } - fs.rmdirSync(path, { recursive: true }); + fs.rmSync(path, { recursive: true, force: true, maxRetries: 3 }); } //#endregion @@ -532,7 +532,7 @@ async function move(source: string, target: string): Promise { } interface ICopyPayload { - readonly root: { source: string, target: string }; + readonly root: { source: string; target: string }; readonly options: { preserveSymlinks: boolean }; readonly handledSourcePaths: Set; } @@ -670,7 +670,7 @@ export const Promises = new class { // just the bytes read, so we create our own wrapper. return (fd: number, buffer: Uint8Array, offset: number, length: number, position: number | null) => { - return new Promise<{ bytesRead: number, buffer: Uint8Array }>((resolve, reject) => { + return new Promise<{ bytesRead: number; buffer: Uint8Array }>((resolve, reject) => { fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => { if (err) { return reject(err); @@ -690,7 +690,7 @@ export const Promises = new class { // just the bytes written, so we create our own wrapper. return (fd: number, buffer: Uint8Array, offset: number | undefined | null, length: number | undefined | null, position: number | undefined | null) => { - return new Promise<{ bytesWritten: number, buffer: Uint8Array }>((resolve, reject) => { + return new Promise<{ bytesWritten: number; buffer: Uint8Array }>((resolve, reject) => { fs.write(fd, buffer, offset, length, position, (err, bytesWritten, buffer) => { if (err) { return reject(err); diff --git a/src/vs/base/node/ports.ts b/src/vs/base/node/ports.ts index 9d3a8bdcfe1..288ff34c710 100644 --- a/src/vs/base/node/ports.ts +++ b/src/vs/base/node/ports.ts @@ -65,86 +65,86 @@ function doFindFreePort(startPort: number, giveUpAfter: number, stride: number, // Reference: https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main/net/base/port_util.cc#56 export const BROWSER_RESTRICTED_PORTS: any = { - 1: true, // tcpmux - 7: true, // echo - 9: true, // discard - 11: true, // systat - 13: true, // daytime - 15: true, // netstat - 17: true, // qotd - 19: true, // chargen - 20: true, // ftp data - 21: true, // ftp access - 22: true, // ssh - 23: true, // telnet - 25: true, // smtp - 37: true, // time - 42: true, // name - 43: true, // nicname - 53: true, // domain - 69: true, // tftp - 77: true, // priv-rjs - 79: true, // finger - 87: true, // ttylink - 95: true, // supdup - 101: true, // hostriame - 102: true, // iso-tsap - 103: true, // gppitnp - 104: true, // acr-nema - 109: true, // pop2 - 110: true, // pop3 - 111: true, // sunrpc - 113: true, // auth - 115: true, // sftp - 117: true, // uucp-path - 119: true, // nntp - 123: true, // NTP - 135: true, // loc-srv /epmap - 137: true, // netbios - 139: true, // netbios - 143: true, // imap2 - 161: true, // snmp - 179: true, // BGP - 389: true, // ldap - 427: true, // SLP (Also used by Apple Filing Protocol) - 465: true, // smtp+ssl - 512: true, // print / exec - 513: true, // login - 514: true, // shell - 515: true, // printer - 526: true, // tempo - 530: true, // courier - 531: true, // chat - 532: true, // netnews - 540: true, // uucp - 548: true, // AFP (Apple Filing Protocol) - 554: true, // rtsp - 556: true, // remotefs - 563: true, // nntp+ssl - 587: true, // smtp (rfc6409) - 601: true, // syslog-conn (rfc3195) - 636: true, // ldap+ssl - 989: true, // ftps-data - 990: true, // ftps - 993: true, // ldap+ssl - 995: true, // pop3+ssl - 1719: true, // h323gatestat - 1720: true, // h323hostcall - 1723: true, // pptp - 2049: true, // nfs - 3659: true, // apple-sasl / PasswordServer - 4045: true, // lockd - 5060: true, // sip - 5061: true, // sips - 6000: true, // X11 - 6566: true, // sane-port - 6665: true, // Alternate IRC [Apple addition] - 6666: true, // Alternate IRC [Apple addition] - 6667: true, // Standard IRC [Apple addition] - 6668: true, // Alternate IRC [Apple addition] - 6669: true, // Alternate IRC [Apple addition] - 6697: true, // IRC + TLS - 10080: true // Amanda + 1: true, // tcpmux + 7: true, // echo + 9: true, // discard + 11: true, // systat + 13: true, // daytime + 15: true, // netstat + 17: true, // qotd + 19: true, // chargen + 20: true, // ftp data + 21: true, // ftp access + 22: true, // ssh + 23: true, // telnet + 25: true, // smtp + 37: true, // time + 42: true, // name + 43: true, // nicname + 53: true, // domain + 69: true, // tftp + 77: true, // priv-rjs + 79: true, // finger + 87: true, // ttylink + 95: true, // supdup + 101: true, // hostriame + 102: true, // iso-tsap + 103: true, // gppitnp + 104: true, // acr-nema + 109: true, // pop2 + 110: true, // pop3 + 111: true, // sunrpc + 113: true, // auth + 115: true, // sftp + 117: true, // uucp-path + 119: true, // nntp + 123: true, // NTP + 135: true, // loc-srv /epmap + 137: true, // netbios + 139: true, // netbios + 143: true, // imap2 + 161: true, // snmp + 179: true, // BGP + 389: true, // ldap + 427: true, // SLP (Also used by Apple Filing Protocol) + 465: true, // smtp+ssl + 512: true, // print / exec + 513: true, // login + 514: true, // shell + 515: true, // printer + 526: true, // tempo + 530: true, // courier + 531: true, // chat + 532: true, // netnews + 540: true, // uucp + 548: true, // AFP (Apple Filing Protocol) + 554: true, // rtsp + 556: true, // remotefs + 563: true, // nntp+ssl + 587: true, // smtp (rfc6409) + 601: true, // syslog-conn (rfc3195) + 636: true, // ldap+ssl + 989: true, // ftps-data + 990: true, // ftps + 993: true, // ldap+ssl + 995: true, // pop3+ssl + 1719: true, // h323gatestat + 1720: true, // h323hostcall + 1723: true, // pptp + 2049: true, // nfs + 3659: true, // apple-sasl / PasswordServer + 4045: true, // lockd + 5060: true, // sip + 5061: true, // sips + 6000: true, // X11 + 6566: true, // sane-port + 6665: true, // Alternate IRC [Apple addition] + 6666: true, // Alternate IRC [Apple addition] + 6667: true, // Standard IRC [Apple addition] + 6668: true, // Alternate IRC [Apple addition] + 6669: true, // Alternate IRC [Apple addition] + 6697: true, // IRC + TLS + 10080: true // Amanda }; /** diff --git a/src/vs/base/node/processes.ts b/src/vs/base/node/processes.ts index b37b12e1c2f..4085e82397c 100644 --- a/src/vs/base/node/processes.ts +++ b/src/vs/base/node/processes.ts @@ -50,7 +50,7 @@ function terminateProcess(process: cp.ChildProcess, cwd?: string): Promise { killProcess.once('error', (err) => { resolve({ success: false, error: err }); @@ -70,7 +70,7 @@ function terminateProcess(process: cp.ChildProcess, cwd?: string): Promise { - cp.execFile(cmd, [process.pid.toString()], { encoding: 'utf8', shell: true } as cp.ExecFileOptions, (err, stdout, stderr) => { + cp.execFile(cmd, [process.pid!.toString()], { encoding: 'utf8', shell: true } as cp.ExecFileOptions, (err, stdout, stderr) => { if (err) { resolve({ success: false, error: err }); } else { @@ -322,7 +322,7 @@ export abstract class AbstractProcess { public get pid(): Promise { if (this.childProcessPromise) { - return this.childProcessPromise.then(childProcess => childProcess.pid, err => -1); + return this.childProcessPromise.then(childProcess => childProcess.pid!, err => -1); } else { return new Promise((resolve) => { this.pidResolve = resolve; diff --git a/src/vs/base/parts/ipc/common/ipc.net.ts b/src/vs/base/parts/ipc/common/ipc.net.ts index c62b08b0f64..e4fb1c634fb 100644 --- a/src/vs/base/parts/ipc/common/ipc.net.ts +++ b/src/vs/base/parts/ipc/common/ipc.net.ts @@ -108,7 +108,7 @@ export interface NodeSocketCloseEvent { /** * Underlying error. */ - readonly error: Error | undefined + readonly error: Error | undefined; } export interface WebSocketCloseEvent { @@ -1123,7 +1123,7 @@ export class PersistentProtocol implements IMessagePassingProtocol { // ? 'renderer' // : (process.argv.includes('--type=extensionHost') // ? 'extensionHost' -// : (process.argv.some(item => item.includes('server/main')) +// : (process.argv.some(item => item.includes('server-main')) // ? 'server' // : 'unknown' // ) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 4d6b5e2df0e..d900128623e 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -10,7 +10,7 @@ import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cance import { memoize } from 'vs/base/common/decorators'; import * as errors from 'vs/base/common/errors'; import { Emitter, Event, EventMultiplexer, Relay } from 'vs/base/common/event'; -import { combinedDisposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, DisposableStore, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { revive } from 'vs/base/common/marshalling'; import * as strings from 'vs/base/common/strings'; import { isFunction, isUndefinedOrNull } from 'vs/base/common/types'; @@ -56,10 +56,10 @@ function requestTypeToStr(type: RequestType): string { } } -type IRawPromiseRequest = { type: RequestType.Promise; id: number; channelName: string; name: string; arg: any; }; -type IRawPromiseCancelRequest = { type: RequestType.PromiseCancel, id: number }; -type IRawEventListenRequest = { type: RequestType.EventListen; id: number; channelName: string; name: string; arg: any; }; -type IRawEventDisposeRequest = { type: RequestType.EventDispose, id: number }; +type IRawPromiseRequest = { type: RequestType.Promise; id: number; channelName: string; name: string; arg: any }; +type IRawPromiseCancelRequest = { type: RequestType.PromiseCancel; id: number }; +type IRawEventListenRequest = { type: RequestType.EventListen; id: number; channelName: string; name: string; arg: any }; +type IRawEventDisposeRequest = { type: RequestType.EventDispose; id: number }; type IRawRequest = IRawPromiseRequest | IRawPromiseCancelRequest | IRawEventListenRequest | IRawEventDisposeRequest; export const enum ResponseType { @@ -86,7 +86,7 @@ function responseTypeToStr(type: ResponseType): string { type IRawInitializeResponse = { type: ResponseType.Initialize }; type IRawPromiseSuccessResponse = { type: ResponseType.PromiseSuccess; id: number; data: any }; -type IRawPromiseErrorResponse = { type: ResponseType.PromiseError; id: number; data: { message: string, name: string, stack: string[] | undefined } }; +type IRawPromiseErrorResponse = { type: ResponseType.PromiseError; id: number; data: { message: string; name: string; stack: string[] | undefined } }; type IRawPromiseErrorObjResponse = { type: ResponseType.PromiseErrorObj; id: number; data: any }; type IRawEventFireResponse = { type: ResponseType.EventFire; id: number; data: any }; type IRawResponse = IRawInitializeResponse | IRawPromiseSuccessResponse | IRawPromiseErrorResponse | IRawPromiseErrorObjResponse | IRawEventFireResponse; @@ -312,9 +312,7 @@ export class ChannelServer implements IChannelServer implements IChannelServer implements IChannelServer implements IChannelServer d.dispose()); + dispose(this.activeRequests.values()); this.activeRequests.clear(); } } @@ -743,7 +731,7 @@ export class ChannelClient implements IChannelClient, IDisposable { this.protocolListener.dispose(); this.protocolListener = null; } - this.activeRequests.forEach(p => p.dispose()); + dispose(this.activeRequests.values()); this.activeRequests.clear(); } } diff --git a/src/vs/base/parts/ipc/electron-main/ipc.electron.ts b/src/vs/base/parts/ipc/electron-main/ipc.electron.ts index 8a7a2cbbe1d..431c44bf3d1 100644 --- a/src/vs/base/parts/ipc/electron-main/ipc.electron.ts +++ b/src/vs/base/parts/ipc/electron-main/ipc.electron.ts @@ -11,7 +11,7 @@ import { ClientConnectionEvent, IPCServer } from 'vs/base/parts/ipc/common/ipc'; import { Protocol as ElectronProtocol } from 'vs/base/parts/ipc/common/ipc.electron'; interface IIPCEvent { - event: { sender: WebContents; }; + event: { sender: WebContents }; message: Buffer | null; } diff --git a/src/vs/base/parts/ipc/electron-main/ipc.mp.ts b/src/vs/base/parts/ipc/electron-main/ipc.mp.ts index 5d9e1d49f03..3384832669b 100644 --- a/src/vs/base/parts/ipc/electron-main/ipc.mp.ts +++ b/src/vs/base/parts/ipc/electron-main/ipc.mp.ts @@ -50,7 +50,7 @@ export async function connect(window: BrowserWindow): Promise { // Wait until the window has returned the `MessagePort` // We need to filter by the `nonce` to ensure we listen // to the right response. - const onMessageChannelResult = Event.fromNodeEventEmitter<{ nonce: string, port: MessagePortMain }>(ipcMain, 'vscode:createMessageChannelResult', (e: IpcMainEvent, nonce: string) => ({ nonce, port: e.ports[0] })); + const onMessageChannelResult = Event.fromNodeEventEmitter<{ nonce: string; port: MessagePortMain }>(ipcMain, 'vscode:createMessageChannelResult', (e: IpcMainEvent, nonce: string) => ({ nonce, port: e.ports[0] })); const { port } = await Event.toPromise(Event.once(Event.filter(onMessageChannelResult, e => e.nonce === nonce))); return port; diff --git a/src/vs/base/parts/ipc/node/ipc.cp.ts b/src/vs/base/parts/ipc/node/ipc.cp.ts index 4929f85c003..127d0082d11 100644 --- a/src/vs/base/parts/ipc/node/ipc.cp.ts +++ b/src/vs/base/parts/ipc/node/ipc.cp.ts @@ -90,7 +90,7 @@ export class Client implements IChannelClient, IDisposable { private _client: IPCClient | null; private channels = new Map(); - private readonly _onDidProcessExit = new Emitter<{ code: number, signal: string }>(); + private readonly _onDidProcessExit = new Emitter<{ code: number; signal: string }>(); readonly onDidProcessExit = this._onDidProcessExit.event; constructor(private modulePath: string, private options: IIPCOptions) { diff --git a/src/vs/base/parts/ipc/node/ipc.net.ts b/src/vs/base/parts/ipc/node/ipc.net.ts index af596a0fed6..fb7e757bdca 100644 --- a/src/vs/base/parts/ipc/node/ipc.net.ts +++ b/src/vs/base/parts/ipc/node/ipc.net.ts @@ -175,7 +175,7 @@ const enum ReadState { } interface ISocketTracer { - traceSocketEvent(type: SocketDiagnosticsEventType, data?: VSBuffer | Uint8Array | ArrayBuffer | ArrayBufferView | any): void + traceSocketEvent(type: SocketDiagnosticsEventType, data?: VSBuffer | Uint8Array | ArrayBuffer | ArrayBufferView | any): void; } /** @@ -438,7 +438,7 @@ class WebSocketFlowManager extends Disposable { private readonly _zlibInflateStream: ZlibInflateStream | null; private readonly _zlibDeflateStream: ZlibDeflateStream | null; private readonly _writeQueue: VSBuffer[] = []; - private readonly _readQueue: { data: VSBuffer, isCompressed: boolean, isLastFrameOfMessage: boolean }[] = []; + private readonly _readQueue: { data: VSBuffer; isCompressed: boolean; isLastFrameOfMessage: boolean }[] = []; private readonly _onDidFinishProcessingWriteQueue = this._register(new Emitter()); public readonly onDidFinishProcessingWriteQueue = this._onDidFinishProcessingWriteQueue.event; @@ -795,7 +795,7 @@ export function serve(hook: any): Promise { }); } -export function connect(options: { host: string, port: number }, clientId: string): Promise; +export function connect(options: { host: string; port: number }, clientId: string): Promise; export function connect(port: number, clientId: string): Promise; export function connect(namedPipe: string, clientId: string): Promise; export function connect(hook: any, clientId: string): Promise { diff --git a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts index 2f3f3774cba..ce1a1d8bc69 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts @@ -16,7 +16,6 @@ import { createRandomIPCHandle, createStaticIPCHandle, NodeSocket, WebSocketNode import { flakySuite } from 'vs/base/test/common/testUtils'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; -import product from 'vs/platform/product/common/product'; class MessageStream extends Disposable { @@ -545,7 +544,7 @@ flakySuite('IPC, create handle', () => { }); test('createStaticIPCHandle', async () => { - return testIPCHandle(createStaticIPCHandle(tmpdir(), 'test', product.version)); + return testIPCHandle(createStaticIPCHandle(tmpdir(), 'test', '1.64.0')); }); function testIPCHandle(handle: string): Promise { diff --git a/src/vs/base/parts/ipc/test/node/testService.ts b/src/vs/base/parts/ipc/test/node/testService.ts index 675e5a5f619..ac7c42b703e 100644 --- a/src/vs/base/parts/ipc/test/node/testService.ts +++ b/src/vs/base/parts/ipc/test/node/testService.ts @@ -14,7 +14,7 @@ export interface IMarcoPoloEvent { export interface ITestService { onMarco: Event; marco(): Promise; - pong(ping: string): Promise<{ incoming: string, outgoing: string }>; + pong(ping: string): Promise<{ incoming: string; outgoing: string }>; cancelMe(): Promise; } @@ -28,7 +28,7 @@ export class TestService implements ITestService { return Promise.resolve('polo'); } - pong(ping: string): Promise<{ incoming: string, outgoing: string }> { + pong(ping: string): Promise<{ incoming: string; outgoing: string }> { return Promise.resolve({ incoming: ping, outgoing: 'pong' }); } @@ -69,7 +69,7 @@ export class TestServiceClient implements ITestService { return this.channel.call('marco'); } - pong(ping: string): Promise<{ incoming: string, outgoing: string }> { + pong(ping: string): Promise<{ incoming: string; outgoing: string }> { return this.channel.call('pong', ping); } diff --git a/src/vs/base/parts/quickinput/browser/quickInput.ts b/src/vs/base/parts/quickinput/browser/quickInput.ts index eae31130244..a75b519665a 100644 --- a/src/vs/base/parts/quickinput/browser/quickInput.ts +++ b/src/vs/base/parts/quickinput/browser/quickInput.ts @@ -59,7 +59,7 @@ export interface IQuickInputStyles { button: IButtonStyles; progressBar: IProgressBarStyles; keybindingLabel: IKeybindingLabelStyles; - list: IListStyles & { pickerGroupBorder?: Color; pickerGroupForeground?: Color; }; + list: IListStyles & { pickerGroupBorder?: Color; pickerGroupForeground?: Color }; } export interface IQuickInputWidgetStyles { diff --git a/src/vs/base/parts/quickinput/browser/quickInputUtils.ts b/src/vs/base/parts/quickinput/browser/quickInputUtils.ts index eb0279b85d1..11f24b92683 100644 --- a/src/vs/base/parts/quickinput/browser/quickInputUtils.ts +++ b/src/vs/base/parts/quickinput/browser/quickInputUtils.ts @@ -11,7 +11,7 @@ import 'vs/css!./media/quickInput'; const iconPathToClass: Record = {}; const iconClassGenerator = new IdGenerator('quick-input-button-icon-'); -export function getIconClass(iconPath: { dark: URI; light?: URI; } | undefined): string | undefined { +export function getIconClass(iconPath: { dark: URI; light?: URI } | undefined): string | undefined { if (!iconPath) { return undefined; } diff --git a/src/vs/base/parts/quickinput/common/quickInput.ts b/src/vs/base/parts/quickinput/common/quickInput.ts index 337a07a08eb..23e42343991 100644 --- a/src/vs/base/parts/quickinput/common/quickInput.ts +++ b/src/vs/base/parts/quickinput/common/quickInput.ts @@ -156,7 +156,7 @@ export interface IInputOptions { /** * an optional function that is used to validate user input. */ - validateInput?: (input: string) => Promise; + validateInput?: (input: string) => Promise; } export enum QuickInputHideReason { @@ -353,7 +353,7 @@ export interface IInputBox extends IQuickInput { export interface IQuickInputButton { /** iconPath or iconClass required */ - iconPath?: { dark: URI; light?: URI; }; + iconPath?: { dark: URI; light?: URI }; /** iconPath or iconClass required */ iconClass?: string; tooltip?: string; @@ -382,7 +382,7 @@ export type IQuickPickItemWithResource = IQuickPickItem & { resource?: URI }; export class QuickPickItemScorerAccessor implements IItemAccessor { - constructor(private options?: { skipDescription?: boolean, skipPath?: boolean }) { } + constructor(private options?: { skipDescription?: boolean; skipPath?: boolean }) { } getItemLabel(entry: IQuickPickItemWithResource): string { return entry.label; diff --git a/src/vs/base/test/parts/quickinput/browser/quickinput.test.ts b/src/vs/base/parts/quickinput/test/browser/quickinput.test.ts similarity index 96% rename from src/vs/base/test/parts/quickinput/browser/quickinput.test.ts rename to src/vs/base/parts/quickinput/test/browser/quickinput.test.ts index 559e4e517d9..05d5511424c 100644 --- a/src/vs/base/test/parts/quickinput/browser/quickinput.test.ts +++ b/src/vs/base/parts/quickinput/test/browser/quickinput.test.ts @@ -5,10 +5,9 @@ import * as assert from 'assert'; import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { List } from 'vs/base/browser/ui/list/listWidget'; +import { IListOptions, List } from 'vs/base/browser/ui/list/listWidget'; import { QuickInputController } from 'vs/base/parts/quickinput/browser/quickInput'; import { IQuickPick, IQuickPickItem } from 'vs/base/parts/quickinput/common/quickInput'; -import { IWorkbenchListOptions } from 'vs/platform/list/browser/listService'; // Simple promisify of setTimeout function wait(delayMS: number) { @@ -41,7 +40,7 @@ suite('QuickInput', () => { container: HTMLElement, delegate: IListVirtualDelegate, renderers: IListRenderer[], - options: IWorkbenchListOptions, + options: IListOptions, ) => new List(user, container, delegate, renderers, options), styles: { button: {}, diff --git a/src/vs/base/parts/request/browser/request.ts b/src/vs/base/parts/request/browser/request.ts index e0b97c6dc51..3a076f5d3fd 100644 --- a/src/vs/base/parts/request/browser/request.ts +++ b/src/vs/base/parts/request/browser/request.ts @@ -6,9 +6,13 @@ import { bufferToStream, VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { canceled } from 'vs/base/common/errors'; -import { IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request'; +import { IRequestContext, IRequestOptions, OfflineError } from 'vs/base/parts/request/common/request'; export function request(options: IRequestOptions, token: CancellationToken): Promise { + if (!navigator.onLine) { + throw new OfflineError(); + } + if (options.proxyAuthorization) { options.headers = { ...(options.headers || {}), diff --git a/src/vs/base/parts/request/common/request.ts b/src/vs/base/parts/request/common/request.ts index b8f75d72cf6..5fb56f8fad8 100644 --- a/src/vs/base/parts/request/common/request.ts +++ b/src/vs/base/parts/request/common/request.ts @@ -5,6 +5,25 @@ import { VSBufferReadableStream } from 'vs/base/common/buffer'; +const offlineName = 'Offline'; + +/** + * Checks if the given error is offline error + */ +export function isOfflineError(error: any): boolean { + if (error instanceof OfflineError) { + return true; + } + return error instanceof Error && error.name === offlineName && error.message === offlineName; +} + +export class OfflineError extends Error { + constructor() { + super(offlineName); + this.name = this.message; + } +} + export interface IHeaders { [header: string]: string; } diff --git a/src/vs/base/parts/sandbox/common/electronTypes.ts b/src/vs/base/parts/sandbox/common/electronTypes.ts index 01622e6bbab..d2d75da87ce 100644 --- a/src/vs/base/parts/sandbox/common/electronTypes.ts +++ b/src/vs/base/parts/sandbox/common/electronTypes.ts @@ -7,11 +7,10 @@ // ####################################################################### // ### ### // ### electron.d.ts types we need in a common layer for reuse ### -// ### (copied from Electron 11.x) ### +// ### (copied from Electron 16.x) ### // ### ### // ####################################################################### - export interface MessageBoxOptions { /** * Content of the message box. @@ -34,6 +33,13 @@ export interface MessageBoxOptions { * the message box opens. */ defaultId?: number; + /** + * Pass an instance of AbortSignal to optionally close the message box, the message + * box will behave as if it was cancelled by the user. On macOS, `signal` does not + * work with message boxes that do not have a parent window, since those message + * boxes run synchronously due to platform limitations. + */ + signal?: AbortSignal; /** * Title of the message box, some platforms will not show it. */ @@ -50,7 +56,12 @@ export interface MessageBoxOptions { * Initial checked state of the checkbox. `false` by default. */ checkboxChecked?: boolean; - // icon?: NativeImage; + /** + * Custom width of the text in the message box. + * + * @platform darwin + */ + textWidth?: number; /** * The index of the button to be used to cancel the dialog, via the `Esc` key. By * default this is assigned to the first button with "cancel" or "no" as the label. @@ -88,21 +99,10 @@ export interface MessageBoxReturnValue { checkboxChecked: boolean; } -export interface OpenDevToolsOptions { - /** - * Opens the devtools with specified dock state, can be `right`, `bottom`, - * `undocked`, `detach`. Defaults to last used dock state. In `undocked` mode it's - * possible to dock back. In `detach` mode it's not. - */ - mode: ('right' | 'bottom' | 'undocked' | 'detach'); - /** - * Whether to bring the opened devtools window to the foreground. The default is - * `true`. - */ - activate?: boolean; -} - export interface SaveDialogOptions { + /** + * The dialog title. Cannot be displayed on some _Linux_ desktop environments. + */ title?: string; /** * Absolute directory path, absolute file path, or file name to use by default. @@ -143,6 +143,25 @@ export interface SaveDialogOptions { securityScopedBookmarks?: boolean; } +export interface SaveDialogReturnValue { + /** + * whether or not the dialog was canceled. + */ + canceled: boolean; + /** + * If the dialog is canceled, this will be `undefined`. + */ + filePath?: string; + /** + * Base64 encoded string which contains the security scoped bookmark data for the + * saved file. `securityScopedBookmarks` must be enabled for this to be present. + * (For return values, see table here.) + * + * @platform darwin,mas + */ + bookmark?: string; +} + export interface OpenDialogOptions { title?: string; defaultPath?: string; @@ -191,25 +210,6 @@ export interface OpenDialogReturnValue { bookmarks?: string[]; } -export interface SaveDialogReturnValue { - /** - * whether or not the dialog was canceled. - */ - canceled: boolean; - /** - * If the dialog is canceled, this will be `undefined`. - */ - filePath?: string; - /** - * Base64 encoded string which contains the security scoped bookmark data for the - * saved file. `securityScopedBookmarks` must be enabled for this to be present. - * (For return values, see table here.) - * - * @platform darwin,mas - */ - bookmark?: string; -} - export interface FileFilter { // Docs: https://electronjs.org/docs/api/structures/file-filter @@ -218,6 +218,20 @@ export interface FileFilter { name: string; } +export interface OpenDevToolsOptions { + /** + * Opens the devtools with specified dock state, can be `right`, `bottom`, + * `undocked`, `detach`. Defaults to last used dock state. In `undocked` mode it's + * possible to dock back. In `detach` mode it's not. + */ + mode: ('right' | 'bottom' | 'undocked' | 'detach'); + /** + * Whether to bring the opened devtools window to the foreground. The default is + * `true`. + */ + activate?: boolean; +} + export interface InputEvent { // Docs: https://electronjs.org/docs/api/structures/input-event diff --git a/src/vs/base/parts/sandbox/electron-sandbox/electronTypes.ts b/src/vs/base/parts/sandbox/electron-sandbox/electronTypes.ts index 2b6e32fce34..58589dbec1d 100644 --- a/src/vs/base/parts/sandbox/electron-sandbox/electronTypes.ts +++ b/src/vs/base/parts/sandbox/electron-sandbox/electronTypes.ts @@ -7,7 +7,7 @@ // ####################################################################### // ### ### // ### electron.d.ts types we expose from electron-sandbox ### -// ### (copied from Electron 11.x) ### +// ### (copied from Electron 16.x) ### // ### ### // ####################################################################### @@ -161,62 +161,6 @@ export interface ProcessMemoryInfo { shared: number; } -export interface CrashReporterStartOptions { - /** - * URL that crash reports will be sent to as POST. - */ - submitURL: string; - /** - * Defaults to `app.name`. - */ - productName?: string; - /** - * Deprecated alias for `{ globalExtra: { _companyName: ... } }`. - * - * @deprecated - */ - companyName?: string; - /** - * Whether crash reports should be sent to the server. If false, crash reports will - * be collected and stored in the crashes directory, but not uploaded. Default is - * `true`. - */ - uploadToServer?: boolean; - /** - * If true, crashes generated in the main process will not be forwarded to the - * system crash handler. Default is `false`. - */ - ignoreSystemCrashHandler?: boolean; - /** - * If true, limit the number of crashes uploaded to 1/hour. Default is `false`. - * - * @platform darwin,win32 - */ - rateLimit?: boolean; - /** - * If true, crash reports will be compressed and uploaded with `Content-Encoding: - * gzip`. Default is `true`. - */ - compress?: boolean; - /** - * Extra string key/value annotations that will be sent along with crash reports - * that are generated in the main process. Only string values are supported. - * Crashes generated in child processes will not contain these extra parameters to - * crash reports generated from child processes, call `addExtraParameter` from the - * child process. - */ - extra?: Record; - /** - * Extra string key/value annotations that will be sent along with any crash - * reports generated in any process. These annotations cannot be changed once the - * crash reporter has been started. If a key is present in both the global extra - * parameters and the process-specific extra parameters, then the global one will - * take precedence. By default, `productName` and the app version are included, as - * well as the Electron version. - */ - globalExtra?: Record; -} - /** * Additional information around a `app.on('login')` event. */ diff --git a/src/vs/base/parts/storage/node/storage.ts b/src/vs/base/parts/storage/node/storage.ts index 44132926c9b..e8bfec83a24 100644 --- a/src/vs/base/parts/storage/node/storage.ts +++ b/src/vs/base/parts/storage/node/storage.ts @@ -360,7 +360,7 @@ export class SQLiteStorageDatabase implements IStorageDatabase { }); } - private all(connection: IDatabaseConnection, sql: string): Promise<{ key: string, value: string }[]> { + private all(connection: IDatabaseConnection, sql: string): Promise<{ key: string; value: string }[]> { return new Promise((resolve, reject) => { connection.db.all(sql, (error, rows) => { if (error) { diff --git a/src/vs/base/test/browser/markdownRenderer.test.ts b/src/vs/base/test/browser/markdownRenderer.test.ts index a1aaa76f99d..38e2326753f 100644 --- a/src/vs/base/test/browser/markdownRenderer.test.ts +++ b/src/vs/base/test/browser/markdownRenderer.test.ts @@ -205,7 +205,7 @@ suite('MarkdownRenderer', () => { const uri = URI.parse(anchor.dataset['href']!); - const data = <{ script: string, documentUri: URI }>parse(decodeURIComponent(uri.query)); + const data = <{ script: string; documentUri: URI }>parse(decodeURIComponent(uri.query)); assert.ok(data); assert.strictEqual(data.script, 'echo'); assert.ok(data.documentUri.toString().startsWith('file:///c%3A/')); diff --git a/src/vs/base/test/browser/ui/grid/util.ts b/src/vs/base/test/browser/ui/grid/util.ts index 4be8157a6d6..3a47b51eeda 100644 --- a/src/vs/base/test/browser/ui/grid/util.ts +++ b/src/vs/base/test/browser/ui/grid/util.ts @@ -10,7 +10,7 @@ import { Emitter, Event } from 'vs/base/common/event'; export class TestView implements IView { - private readonly _onDidChange = new Emitter<{ width: number; height: number; } | undefined>(); + private readonly _onDidChange = new Emitter<{ width: number; height: number } | undefined>(); readonly onDidChange = this._onDidChange.event; get minimumWidth(): number { return this._minimumWidth; } @@ -39,8 +39,8 @@ export class TestView implements IView { get size(): [number, number] { return [this.width, this.height]; } - private readonly _onDidLayout = new Emitter<{ width: number; height: number; }>(); - readonly onDidLayout: Event<{ width: number; height: number; }> = this._onDidLayout.event; + private readonly _onDidLayout = new Emitter<{ width: number; height: number }>(); + readonly onDidLayout: Event<{ width: number; height: number }> = this._onDidLayout.event; private readonly _onDidFocus = new Emitter(); readonly onDidFocus: Event = this._onDidFocus.event; diff --git a/src/vs/base/test/browser/ui/tree/dataTree.test.ts b/src/vs/base/test/browser/ui/tree/dataTree.test.ts index 1210bf7021a..bc6ed5f3106 100644 --- a/src/vs/base/test/browser/ui/tree/dataTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/dataTree.test.ts @@ -58,7 +58,7 @@ suite('DataTree', function () { }; const identityProvider = new class implements IIdentityProvider { - getId(element: E): { toString(): string; } { + getId(element: E): { toString(): string } { return `${element.value}`; } }; diff --git a/src/vs/base/test/browser/ui/tree/objectTree.test.ts b/src/vs/base/test/browser/ui/tree/objectTree.test.ts index e6aabe98bb9..f758b089e46 100644 --- a/src/vs/base/test/browser/ui/tree/objectTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/objectTree.test.ts @@ -202,7 +202,7 @@ suite('ObjectTree', function () { }; const identityProvider = new class implements IIdentityProvider { - getId(element: number): { toString(): string; } { + getId(element: number): { toString(): string } { return `${element % 100}`; } }; diff --git a/src/vs/base/test/common/event.test.ts b/src/vs/base/test/common/event.test.ts index 3dbfe4292c3..a00f757f817 100644 --- a/src/vs/base/test/common/event.test.ts +++ b/src/vs/base/test/common/event.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { timeout } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { errorHandler, setUnexpectedErrorHandler } from 'vs/base/common/errors'; -import { AsyncEmitter, DebounceEmitter, Emitter, Event, EventBufferer, EventMultiplexer, IWaitUntil, MicrotaskEmitter, PauseableEmitter, Relay } from 'vs/base/common/event'; +import { AsyncEmitter, DebounceEmitter, Emitter, Event, EventBufferer, EventMultiplexer, IWaitUntil, MicrotaskEmitter, PauseableEmitter, Relay, SafeDisposable } from 'vs/base/common/event'; import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; namespace Samples { @@ -314,6 +314,31 @@ suite('Event', function () { // assert that all events are delivered in order assert.deepStrictEqual(listener2Events, ['e1', 'e2']); }); + + test('Cannot read property \'_actual\' of undefined #142204', function () { + const e = new Emitter(); + const dispo = e.event(() => { }); + dispo.dispose.call(undefined); // assert that disposable can be called with this + }); + + test('SafeDisposable, dispose', function () { + let disposed = 0; + const actual = toDisposable(() => disposed += 1); + const d = new SafeDisposable(); + d.set(actual); + d.dispose(); + assert.strictEqual(disposed, 1); + }); + + test('SafeDisposable, unset', function () { + let disposed = 0; + const actual = toDisposable(() => disposed += 1); + const d = new SafeDisposable(); + d.set(actual); + d.unset(); + d.dispose(); + assert.strictEqual(disposed, 0); + }); }); suite('AsyncEmitter', function () { diff --git a/src/vs/base/test/common/filters.perf.data.js b/src/vs/base/test/common/filters.perf.data.js index 84f0e39df25..f8feebcfa9f 100644 --- a/src/vs/base/test/common/filters.perf.data.js +++ b/src/vs/base/test/common/filters.perf.data.js @@ -3,5 +3,5 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ define(function() { return { data: -["AI_ClearCaptureImportanceBonus","AI_ClearImportance","AI_CreateObjective","AI_DebugAttackEncounterPositionScoringEnable","AI_DebugAttackEncounterPositionScoringIsEnabled","AI_DebugLuaEnable","AI_DebugLuaIsEnabled","AI_DebugRatingEnable","AI_DebugRatingIsEnabled","AI_DebugRenderAllTaskChildrenEnable","AI_DebugRenderAllTaskChildrenIsEnabled","AI_DebugSkirmishCaptureEnable","AI_DebugSkirmishCaptureIsEnabled","AI_DebugSkirmishCombatTargetEnable","AI_DebugSkirmishCombatTargetIsEnabled","AI_DebugSkirmishObjectiveEnable","AI_DebugSkirmishObjectiveIsEnabled","AI_DisableAllEconomyOverrides","AI_Enable","AI_EnableAll","AI_EnableEconomyOverride","AI_GetDifficulty","AI_GetPersonality","AI_GetPersonalityLuaFileName","AI_IsAIPlayer","AI_IsEnabled","AI_LockEntity","AI_LockSquad","AI_LockSquads","AI_RestoreDefaultPersonalitySettings","AI_SetCaptureImportanceBonus","AI_SetDifficulty","AI_SetImportance","AI_SetPersonality","AI_UnlockAll","AI_UnlockEntity","AI_UnlockSquad","AI_UnlockSquads","AI_UpdateStatics","AIAbilityObjective_AbilityGuidance_SetAbilityPBG","AIObjective_Cancel","AIObjective_CombatGuidance_EnableCombatGarrison","AIObjective_CombatGuidance_EnableRetaliateAttacks","AIObjective_CombatGuidance_SetRetaliateAttackTargetAreaRadius","AIObjective_DefenseGuidance_AddFacingPosition","AIObjective_DefenseGuidance_EnableIdleGarrison","AIObjective_DefenseGuidance_ResetFacingPositions","AIObjective_EngagementGuidance_EnableAggressiveEngagementMove","AIObjective_EngagementGuidance_SetAllowReturnToPreviousStages","AIObjective_EngagementGuidance_SetCoordinatedSetup","AIObjective_EngagementGuidance_SetMaxEngagementTime","AIObjective_EngagementGuidance_SetMaxIdleTime","AIObjective_FallbackGuidance_EnableRetreatOnPinned","AIObjective_FallbackGuidance_EnableRetreatOnSuppression","AIObjective_FallbackGuidance_SetEntitiesRemainingThreshold","AIObjective_FallbackGuidance_SetFallbackCapacityPercentage","AIObjective_FallbackGuidance_SetFallbackCombatRatingPercentage","AIObjective_FallbackGuidance_SetFallbackSquadHealthPercentage","AIObjective_FallbackGuidance_SetFallbackVehicleHealthPercentage","AIObjective_FallbackGuidance_SetGlobalFallbackPercentage","AIObjective_FallbackGuidance_SetGlobalFallbackRetreat","AIObjective_FallbackGuidance_SetRetreatCapacityPercentage","AIObjective_FallbackGuidance_SetRetreatCombatRatingPercentage","AIObjective_FallbackGuidance_SetRetreatHealthPercentage","AIObjective_FallbackGuidance_SetTargetPosition","AIObjective_IsValid","AIObjective_MoveGuidance_EnableAggressiveMove","AIObjective_MoveGuidance_ResetPathingLengthFactor","AIObjective_MoveGuidance_ResetSafePathingWeight","AIObjective_MoveGuidance_SetPathingLengthFactor","AIObjective_MoveGuidance_SetSafePathingWeight","AIObjective_MoveGuidance_SetSquadCoherenceRadius","AIObjective_Notify_ClearCallbacks","AIObjective_Notify_SetPlayerEventObjectiveID","AIObjective_ResourceGuidance_ClearSquads","AIObjective_ResourceGuidance_SquadGroup","AIObjective_SetName","AIObjective_TacticFilter_DisableAbility","AIObjective_TacticFilter_DisableAbilityForSquadGroup","AIObjective_TacticFilter_EnableCloseGround","AIObjective_TacticFilter_Reset","AIObjective_TacticFilter_ResetAbilityGuidance","AIObjective_TacticFilter_ResetPriority","AIObjective_TacticFilter_ResetTacticGuidance","AIObjective_TacticFilter_ResetTargetGuidance","AIObjective_TacticFilter_SetAbilityGuidance","AIObjective_TacticFilter_SetDefaultAbilityGuidance","AIObjective_TacticFilter_SetDefaultTacticGuidance","AIObjective_TacticFilter_SetDefaultTargetGuidance","AIObjective_TacticFilter_SetPriority","AIObjective_TacticFilter_SetPriorityForSquadGroup","AIObjective_TacticFilter_SetTacticGuidance","AIObjective_TacticFilter_SetTargetPolicy","AIObjective_TargetGuidance_SetTargetArea","AIObjective_TargetGuidance_SetTargetEntity","AIObjective_TargetGuidance_SetTargetLeash","AIObjective_TargetGuidance_SetTargetPathByName","AIObjective_TargetGuidance_SetTargetPathWander","AIObjective_TargetGuidance_SetTargetPosition","AIObjective_TargetGuidance_SetTargetSquad","BeginnerHint_AddOpportunity","BeginnerHint_RemoveAllOpportunities","BeginnerHint_RemoveOpportunity","BP_GetAbilityBlueprint","BP_GetCamouflageStanceBlueprint","BP_GetCriticalBlueprint","BP_GetEntityBlueprint","BP_GetID","BP_GetMoveTypeBlueprint","BP_GetName","BP_GetPropertyBagGroupCount","BP_GetPropertyBagGroupPathName","BP_GetSlotItemBlueprint","BP_GetSquadBlueprint","BP_GetUpgradeBlueprint","BP_GetWeaponBlueprint","EBP_Exists","SBP_Exists","Camera_CyclePositions","Camera_Follow","Camera_MoveTo","Camera_MoveToIfClose","Camera_SetDefault","Cmd_AbandonTeamWeapon","Cmd_Ability","Cmd_AttachSquads","Cmd_Attack","Cmd_AttackMove","Cmd_AttackMoveThenCapture","Cmd_CaptureTeamWeapon","Cmd_Construct","Cmd_CriticalHit","Cmd_DetonateDemolitions","Cmd_EjectOccupants","Cmd_Garrison","Cmd_InstantReinforceUnit","Cmd_InstantReinforceUnitPos","Cmd_InstantSetupTeamWeapon","Cmd_InstantUpgrade","Cmd_Move","Cmd_MoveAwayFromPos","Cmd_MoveToAndDespawn","Cmd_MoveToClosestMarker","Cmd_MoveToThenCapture","Cmd_RecrewVehicle","Cmd_ReinforceUnit","Cmd_ReinforceUnitPos","Cmd_Retreat","Cmd_RevertOccupiedBuilding","Cmd_SetDemolitions","Cmd_SquadCamouflageStance","Cmd_SquadPath","Cmd_SquadPatrolMarker","Cmd_StaggeredRetreat","Cmd_Stop","Cmd_Surrender","Cmd_UngarrisonSquad","Cmd_Upgrade","Command_Entity","Command_EntityAbility","Command_EntityBuildSquad","Command_EntityEntity","Command_EntityExt","Command_EntityPos","Command_EntityPosAbility","Command_EntityPosDirAbility","Command_EntityPosSquad","Command_EntitySquad","Command_EntityTargetEntityAbility","Command_EntityTargetSquadAbility","Command_EntityUpgrade","Command_Player","Command_PlayerAbility","Command_PlayerEntity","Command_PlayerEntityCriticalHit","Command_PlayerExt","Command_PlayerPos","Command_PlayerPosAbility","Command_PlayerPosDirAbility","Command_PlayerPosExt","Command_PlayerSquadConstructBuilding","Command_PlayerSquadConstructFence","Command_PlayerSquadConstructField","Command_PlayerSquadCriticalHit","Command_PlayerUpgrade","Command_Squad","Command_SquadAbility","Command_SquadAttackMovePos","Command_SquadDoCustomPlan","Command_SquadDoCustomPlanTarget","Command_SquadEntity","Command_SquadEntityAbility","Command_SquadEntityAttack","Command_SquadEntityBool","Command_SquadEntityExt","Command_SquadEntityLoad","Command_SquadExt","Command_SquadMovePos","Command_SquadMovePosFacing","Command_SquadPos","Command_SquadPosAbility","Command_SquadPosExt","Command_SquadPositionAttack","Command_SquadSquad","Command_SquadSquadAbility","Command_SquadSquadAttack","Command_SquadSquadExt","Command_SquadSquadLoad","Command_SquadUpgrade","AutoCinematic","AutoReinforce_AddSGroup","AutoReinforce_RemoveAll","AutoReinforce_RemoveSGroup","AutoRetreat_AddSGroup","AutoRetreat_RemoveAll","AutoRetreat_RemoveSGroup","BridgeTerritory_Add","Ceasefire_AddSGroup","Ceasefire_RemoveSGroup","FireTargettingArtillery","Game_DefaultGameRestore","Game_GetGameRestoreCallbackExists","Game_RemoveGameRestoreCallback","Game_SetGameRestoreCallback","Resources_Disable","Resources_Enable","ShootTheSky_AddSyncWeapon","ShootTheSky_RemoveAll","ShootTheSky_RemoveSyncWeapon","SmokeEntrance_Do","Table_Contains","Table_Copy","Table_GetRandomItem","TeamWeapon_AddGroup","TeamWeapon_RemoveDirections","TeamWeapon_RemoveGroup","EGroup_Add","EGroup_AddEGroup","EGroup_CanSeeEGroup","EGroup_CanSeeSGroup","EGroup_Clear","EGroup_Compare","EGroup_ContainsBlueprints","EGroup_ContainsEGroup","EGroup_ContainsEntity","EGroup_Count","EGroup_CountAlive","EGroup_CountDeSpawned","EGroup_CountSpawned","EGroup_Create","EGroup_CreateIfNotFound","EGroup_CreateKickerMessage","EGroup_DeSpawn","EGroup_Destroy","EGroup_DestroyAllEntities","EGroup_Duplicate","EGroup_EnableMinimapIndicator","EGroup_EnableUIDecorator","EGroup_Exists","EGroup_Filter","EGroup_FilterUnderConstruction","EGroup_ForEach","EGroup_ForEachAllOrAny","EGroup_ForEachAllOrAnyEx","EGroup_ForEachEx","EGroup_FromName","EGroup_GetAvgHealth","EGroup_GetDeSpawnedEntityAt","EGroup_GetInvulnerable","EGroup_GetLastAttacker","EGroup_GetName","EGroup_GetOffsetPosition","EGroup_GetPosition","EGroup_GetRandomSpawnedEntity","EGroup_GetSequence","EGroup_GetSpawnedEntityAt","EGroup_GetSpawnedEntityFilter","EGroup_GetSpread","EGroup_GetSquadsHeld","EGroup_HasUpgrade","EGroup_Hide","EGroup_InstantCaptureStrategicPoint","EGroup_InstantRevertOccupiedBuilding","EGroup_Intersection","EGroup_IsBurning","EGroup_IsCapturedByPlayer","EGroup_IsCapturedByTeam","EGroup_IsDoingAttack","EGroup_IsEmpty","EGroup_IsHoldingAny","EGroup_IsInCover","EGroup_IsMoving","EGroup_IsOnScreen","EGroup_IsProducingSquads","EGroup_IsSpawned","EGroup_IsUnderAttack","EGroup_IsUnderAttackByPlayer","EGroup_IsUnderAttackFromDirection","EGroup_IsUsingAbility","EGroup_Kill","EGroup_NotifyOnPlayerDemolition","EGroup_Remove","EGroup_RemoveDemolitions","EGroup_RemoveGroup","EGroup_RemoveUpgrade","EGroup_ReSpawn","EGroup_SetAnimatorAction","EGroup_SetAnimatorEvent","EGroup_SetAnimatorState","EGroup_SetAnimatorVariable","EGroup_SetAutoTargetting","EGroup_SetAvgHealth","EGroup_SetCrushable","EGroup_SetDemolitions","EGroup_SetHealthMinCap","EGroup_SetInvulnerable","EGroup_SetPlayerOwner","EGroup_SetRallyPoint","EGroup_SetRecrewable","EGroup_SetSelectable","EGroup_SetSharedProductionQueue","EGroup_SetStrategicPointNeutral","EGroup_SetWorldOwned","EGroup_Single","SGroup_HasEntityUpgrade","Ai\\:GetEncountersBySGroup","Ai\\:GetEncountersBySquad","AI_DisableAllEncounters","AI_EnableAllEncounters","AI_GetActiveEncounters","AI_GetNumEncounters","AI_IsMatchingDifficulty","AI_OverrideDifficulty","AI_RemoveAllEncounters","AI_SetDebugLevel","AI_SetStaggeredSpawnDelay","AI_ToggleDebugData","AI_ToggleDebugPrint","AIAbilityGoal_AdjustDefaultGoalData","AIAbilityGoal_SetDefaultGoalData","AIAbilityGoal_SetModifyGoalData","AIAbilityGoal_SetOverrideGoalData","AIAttackGoal_AdjustDefaultGoalData","AIAttackGoal_SetDefaultGoalData","AIAttackGoal_SetModifyGoalData","AIAttackGoal_SetOverrideGoalData","AIBaseGoal_AdjustDefaultGoalData","AIBaseGoal_SetDefaultGoalData","AIBaseGoal_SetModifyGoalData","AIBaseGoal_SetOverrideGoalData","AIDefendGoal_AdjustDefaultGoalData","AIDefendGoal_SetDefaultGoalData","AIDefendGoal_SetModifyGoalData","AIDefendGoal_SetOverrideGoalData","AIMoveGoal_AdjustDefaultGoalData","AIMoveGoal_SetDefaultGoalData","AIMoveGoal_SetModifyGoalData","AIMoveGoal_SetOverrideGoalData","Encounter\\:AddSgroup","Encounter\\:ClearGoal","Encounter\\:ConvertSgroup","Encounter\\:Create","Encounter\\:CreateAbility","Encounter\\:CreateAttack","Encounter\\:CreateBasic","Encounter\\:CreateDefend","Encounter\\:CreateMove","Encounter\\:CreatePatrol","Encounter\\:Disable","Encounter\\:Enable","Encounter\\:GetGoalData","Encounter\\:GetSgroup","Encounter\\:RemoveOnDeath","Encounter\\:RestartGoal","Encounter\\:SetGoal","Encounter\\:SetGoalOnSuccess","Encounter\\:SetOnDeath","Encounter\\:Spawn","Encounter\\:UpdateGoal","MergeClone","Entity_ApplyCritical","Entity_BuildingPanelInfo","Entity_CanAttackNow","Entity_CancelProductionQueueItem","Entity_CanLoadSquad","Entity_CanLoadSquadAndAttackCurrentTarget","Entity_CanSeeEntity","Entity_CanSeeSquad","Entity_ClearPostureSuggestion","Entity_ClearTagDebug","Entity_CompleteUpgrade","Entity_Create","Entity_CreateENV","Entity_DeSpawn","Entity_Destroy","Entity_DisableBuildingDeath","Entity_DoBuildingDamageRay","Entity_EnableAttention","Entity_EnableProductionQueue","Entity_EnableStrategicPoint","Entity_ForceConstruct","Entity_FromWorldID","Entity_GetActiveCommand","Entity_GetBlueprint","Entity_GetBuildingProgress","Entity_GetCoverValue","Entity_GetGameID","Entity_GetHeading","Entity_GetHealth","Entity_GetHealthMax","Entity_GetHealthPercentage","Entity_GetInvulnerable","Entity_GetInvulnerableMinCap","Entity_GetInvulnerableToCritical","Entity_GetLastAttacker","Entity_GetLastAttackers","Entity_GetMaxCaptureCrewSize","Entity_GetOffsetPosition","Entity_GetPlayerOwner","Entity_GetPosition","Entity_GetProductionQueueItem","Entity_GetProductionQueueItemType","Entity_GetProductionQueueSize","Entity_GetResourceType","Entity_GetSightInnerHeight","Entity_GetSightInnerRadius","Entity_GetSightOuterHeight","Entity_GetSightOuterRadius","Entity_GetSquad","Entity_GetSquadsHeld","Entity_GetTotalPanelCount","Entity_GetUndestroyedPanelCount","Entity_GetWeaponBlueprint","Entity_GetWeaponHardpointCount","Entity_HasAnyCritical","Entity_HasCritical","Entity_HasProductionQueue","Entity_HasUpgrade","Entity_InstantCaptureStrategicPoint","Entity_InstantRevertOccupiedBuilding","Entity_IsAlive","Entity_IsAttacking","Entity_IsBuilding","Entity_IsBurning","Entity_IsCamouflaged","Entity_IsCapturableBuilding","Entity_IsCasualty","Entity_IsCuttable","Entity_IsDemolitionReady","Entity_IsEBPBuilding","Entity_IsEBPObjCover","Entity_IsHardpointActive","Entity_IsHoldingAny","Entity_IsInCover","Entity_IsMoving","Entity_IsOfType","Entity_IsPartOfSquad","Entity_IsPlane","Entity_IsSlotItem","Entity_IsSoldier","Entity_IsSpawned","Entity_IsStartingPosition","Entity_IsStrategicPoint","Entity_IsStrategicPointCapturedBy","Entity_IsSyncWeapon","Entity_IsUnderAttack","Entity_IsUnderAttackByPlayer","Entity_IsUnderAttackFromDirection","Entity_IsValid","Entity_IsVaultable","Entity_IsVehicle","Entity_IsVictoryPoint","Entity_Kill","Entity_NotifyOnPlayerDemolition","Entity_RemoveBoobyTraps","Entity_RemoveCritical","Entity_RemoveDemolitions","Entity_RemoveUpgrade","Entity_SetAnimatorAction","Entity_SetAnimatorActionParameter","Entity_SetAnimatorEvent","Entity_SetAnimatorState","Entity_SetAnimatorVariable","Entity_SetBuildingVisualFireState","Entity_SetCrushable","Entity_SetCrushMode","Entity_SetDemolitions","Entity_SetEnableCasualty","Entity_SetHeading","Entity_SetHealth","Entity_SetInvulnerable","Entity_SetInvulnerableMinCap","Entity_SetInvulnerableToCritical","Entity_SetOnFire","Entity_SetPlayerOwner","Entity_SetPosition","Entity_SetProjectileCanExplode","Entity_SetRecrewable","Entity_SetSharedProductionQueue","Entity_SetStrategicPointNeutral","Entity_SetWorldOwned","Entity_SimHide","Entity_Spawn","Entity_StopAbility","Entity_SuggestPosture","Entity_SupportsDemolition","Entity_TagDebug","Entity_VisHide","Misc_DoWeaponHitEffectOnPosition","Misc_GetTerrainHeight","Misc_ToggleEntities","ModMisc_MakeCasualtyAction","ModMisc_MakeWreckAction","ModMisc_OOCAction","UI_EnableEntityDecorator","UI_EnableEntityMinimapIndicator","UI_EnableEntitySelectionVisuals","UI_EnableSquadDecorator","UI_EnableSquadMinimapIndicator","UI_GetAbilityIconName","Event_CreateAND","Event_CreateOR","Event_ElementOnScreen","Event_EncounterIsDead","Event_Exists","Event_GroupBurning","Event_GroupIsDead","Event_GroupIsNotPinned","Event_GroupIsNotSuppressed","Event_GroupIsPinned","Event_GroupIsSuppressed","Event_GroupLeftAlive","Event_IsDoingAttack","Event_IsEngaged","Event_IsHoldingAny","Event_IsInHold","Event_IsSelected","Event_IsUnderAttack","Event_NarrativeEventsNotRunning","Event_NarrativeEventsRunning","Event_OnHealth","Event_PlayerBuildingCount","Event_PlayerCanNotSeeElement","Event_PlayerCanSeeElement","Event_PlayerDoesntOwnTerritory","Event_PlayerOwnsElement","Event_PlayerOwnsTerritory","Event_PlayerResourceLevel","Event_PlayerSquadCount","Event_Proximity","Event_Remove","Event_RemoveAll","Event_TeamBuildingCount","Event_TeamCanNotSeeElement","Event_TeamCanSeeElement","Event_TeamDoesntOwnTerritory","Event_TeamOwnsElement","Event_TeamOwnsTerritory","Event_TeamResourceLevel","Event_TeamSquadCount","Event_Timer","Event_ToggleDebug","Event_View","EventHandler_AssignEncounterGoal","EventHandler_ObjectiveComplete","EventHandler_ObjectiveStart","EventHandler_RemoveHint","EventHandler_RemoveMinimapBlip","EventHandler_RemoveObjectiveUI","EventHandler_Retreat","EventHandler_StaggeredRetreat","EventHandler_StartIntel","EventHandler_StartNislet","EventHandler_StopFlashing","FOW_PlayerExploreAll","FOW_PlayerRevealAll","FOW_PlayerRevealArea","FOW_PlayerUnExploreAll","FOW_PlayerUnRevealAll","FOW_PlayerUnRevealArea","FOW_RevealAll","FOW_RevealArea","FOW_RevealEGroup","FOW_RevealEGroupOnly","FOW_RevealEntity","FOW_RevealMarker","FOW_RevealSGroup","FOW_RevealSGroupOnly","FOW_RevealSquad","FOW_RevealTerritory","FOW_UnRevealAll","FOW_UnRevealArea","FOW_UnRevealMarker","FOW_UnRevealTerritory","EGroup_CreateTable","EGroup_GetWBTable","Marker_GetNonSequentialTable","Marker_GetTable","SGroup_CreateTable","SGroup_GetWBTable","Marker_DoesNumberAttributeExist","Marker_DoesStringAttributeExist","Marker_Exists","Marker_FromName","Marker_GetDirection","Marker_GetName","Marker_GetNumberAttribute","Marker_GetPosition","Marker_GetProximityRadius","Marker_GetProximityType","Marker_GetSequence","Marker_GetStringAttribute","Marker_GetType","Marker_InProximity","Modifier_IsEnabledOnEGroup","Modifier_Remove","Modifier_RemoveAllFromEGroup","Modifier_RemoveAllFromSGroup","Modify_AbilityDelayTime","Modify_AbilityDurationTime","Modify_AbilityManpowerCost","Modify_AbilityMaxCastRange","Modify_AbilityMinCastRange","Modify_AbilityMunitionsCost","Modify_AbilityRechargeTime","Modify_Armor","Modify_CaptureTime","Modify_DisableHold","Modify_Enable_ParadropReinforcements","Modify_EntityBuildTime","Modify_EntityCost","Modify_PlayerExperienceReceived","Modify_PlayerProductionRate","Modify_PlayerResourceCap","Modify_PlayerResourceGift","Modify_PlayerResourceRate","Modify_PlayerSightRadius","Modify_ProductionRate","Modify_ProjectileDelayTime","Modify_ReceivedAccuracy","Modify_ReceivedDamage","Modify_ReceivedSuppression","Modify_SetUpgradeCost","Modify_SightRadius","Modify_SquadAvailability","Modify_SquadCaptureRate","Modify_SquadTypeSightRadius","Modify_TargetPriority","Modify_TeamWeapon","Modify_TerritoryRadius","Modify_UnitSpeed","Modify_UnitVeterancyValue","Modify_UpgradeBuildTime","Modify_Upkeep","Modify_VehicleRepairRate","Modify_VehicleRotationSpeed","Modify_VehicleTurretRotationSpeed","Modify_Vulnerability","Modify_WeaponAccuracy","Modify_WeaponBurstLength","Modify_WeaponBurstRateOfFire","Modify_WeaponCooldown","Modify_WeaponDamage","Modify_WeaponEnabled","Modify_WeaponPenetration","Modify_WeaponRange","Modify_WeaponReload","Modify_WeaponScatter","Modify_WeaponSuppression","MP_BlizzardInit","Objective_AddPing","Objective_AddUIElements","Objective_AreAllPrimaryObjectivesComplete","Objective_Complete","Objective_Fail","Objective_GetCounter","Objective_GetTimerSeconds","Objective_IncreaseCounter","Objective_IsComplete","Objective_IsCounterSet","Objective_IsFailed","Objective_IsStarted","Objective_IsTimerSet","Objective_IsVisible","Objective_PauseTimer","Objective_Register","Objective_RemovePing","Objective_RemoveUIElements","Objective_ResumeTimer","Objective_SetAlwaysShowDetails","Objective_SetCounter","Objective_Show","Objective_Start","Objective_StartTimer","Objective_StopCounter","Objective_StopTimer","Objective_TogglePings","Objective_UpdateText","Cmd_StopSquadsOnly","OpGameSetup","OpNPC_AddSupportGroup","OpNPC_AddSyncWpnGroup","OpNPC_AddTeamWpnGroup","OpNPC_IsGroupActive","OpNPC_Name","OpNPC_RemoveGroup","OpNPC_RetreatGroup","OpNPC_SetGroupActive","OpPlayer_Action","OpUtil_AddModifier","OpUtil_AddResourcesToTeam","OpUtil_AssignSquadSameTypeControlGroup","OpUtil_AssignSquadUnusedControlGroup","OpUtil_ClearPlayZone","OpUtil_EgroupIsCapturedByTeam","OpUtil_EnemyEGroupArrowManager","OpUtil_FindNearestCapturePoint","OpUtil_InvulnerableAdd","OpUtil_InvulnerableRemove","OpUtil_LogSyncWpn","OpUtil_ReturnEnemyNPC","OpUtil_ReturnHumanPlayer","OpUtil_ReturnNPCPlayer","OpUtil_ReturnRace","OpUtil_ReturnTeam","OpUtil_SetPlayZone","OpUtil_TeamOwnsEntity","OpVP_AddPenaltyGroup","OpVP_Name","OpVP_RegisterCaptureablePoints","OpVP_RegisterPointDefense","OpVP_RemoveGroup","UI_PopUpMessage","Util_ProductionRestriction","Util_TutorialIntel","Player_AddAbility","Player_AddAbilityLockoutZone","Player_AddResource","Player_AddSquadsToSGroup","Player_AddUnspentCommandPoints","Player_AreSquadsNearMarker","Player_CanCastAbilityOnEntity","Player_CanCastAbilityOnPlayer","Player_CanCastAbilityOnPosition","Player_CanCastAbilityOnSquad","Player_CanSeeEGroup","Player_CanSeeEntity","Player_CanSeePosition","Player_CanSeeSGroup","Player_CanSeeSquad","Player_ClearArea","Player_ClearAvailabilities","Player_ClearPopCapOverride","Player_CompleteUpgrade","Player_DoParadrop","Player_FindFirstEnemyPlayer","Player_FromId","Player_GetAIType","Player_GetAll","Player_GetAllEntitiesNearMarker","Player_GetAllSquadsNearMarker","Player_GetBuildingID","Player_GetBuildingsCount","Player_GetBuildingsCountExcept","Player_GetBuildingsCountOnly","Player_GetCurrentPopulation","Player_GetDisplayName","Player_GetEntities","Player_GetEntitiesFromType","Player_GetEntityConcentration","Player_GetEntityCount","Player_GetEntityName","Player_GetID","Player_GetMaxPopulation","Player_GetNumStrategicPoints","Player_GetNumVictoryPoints","Player_GetPopulationPercentage","Player_GetRace","Player_GetRaceName","Player_GetRelationship","Player_GetResource","Player_GetResourceRate","Player_GetSquadConcentration","Player_GetSquadCount","Player_GetSquads","Player_GetStartingPosition","Player_GetStrategicPointCaptureProgress","Player_GetTeam","Player_GetUnitCount","Player_GetUpgradeCost","Player_HasAbility","Player_HasBuilding","Player_HasBuildingsExcept","Player_HasBuildingUnderConstruction","Player_HasCapturingSquadNearStrategicPoint","Player_HasLost","Player_HasMapEntryPosition","Player_HasUpgrade","Player_IsAlive","Player_IsAllied","Player_IsHuman","Player_NumUpgradeComplete","Player_OwnsEGroup","Player_OwnsEntity","Player_OwnsSGroup","Player_OwnsSquad","Player_RemoveAbilityLockoutZone","Player_RemoveUpgrade","Player_ResetResource","Player_RestrictAddOnList","Player_RestrictBuildingList","Player_RestrictResearchList","Player_SetAbilityAvailability","Player_SetAllCommandAvailabilityInternal","Player_SetCommandAvailability","Player_SetConstructionMenuAvailability","Player_SetDefaultSquadMoodMode","Player_SetEntityProductionAvailability","Player_SetHeatGainRate","Player_SetHeatLossRate","Player_SetMaxCapPopulation","Player_SetMaxPopulation","Player_SetPopCapOverride","Player_SetResource","Player_SetSquadProductionAvailability","Player_SetUpgradeAvailability","Player_SetUpgradeCost","Player_SpawnGlider","Player_StopAbility","Player_StopEarningActionPoints","Player_Triangulate","Actor_Clear","Actor_PlaySpeech","Actor_PlaySpeechWithoutPortrait","Actor_SetFromSGroup","Actor_SetFromSquad","Prox_AreEntitiesNearMarker","Prox_ArePlayerMembersNearMarker","Prox_ArePlayersNearMarker","Prox_AreSquadMembersNearMarker","Prox_AreSquadsNearMarker","Prox_AreTeamsNearMarker","Prox_EGroupEGroup","Prox_EGroupSGroup","Prox_EntitiesInProximityOfEntities","Prox_GetRandomPosition","Prox_MarkerEGroup","Prox_MarkerSGroup","Prox_PlayerEntitiesInProximityOfEntities","Prox_PlayerEntitiesInProximityOfPlayerSquads","Prox_PlayerEntitiesInProximityOfSquads","Prox_PlayerSquadsInProximityOfEntities","Prox_PlayerSquadsInProximityOfPlayerEntities","Prox_PlayerSquadsInProximityOfPlayerSquads","Prox_PlayerSquadsInProximityOfSquads","Prox_SGroupSGroup","Prox_SquadsInProximityOfEntities","Prox_SquadsInProximityOfSquads","Rule_Add","Rule_AddDelayedInterval","Rule_AddDelayedIntervalEx","Rule_AddEGroupEvent","Rule_AddEntityEvent","Rule_AddGlobalEvent","Rule_AddInterval","Rule_AddIntervalEx","Rule_AddOneShot","Rule_AddPlayerEvent","Rule_AddSGroupEvent","Rule_AddSquadEvent","Rule_ChangeInterval","Rule_Exists","Rule_Remove","Rule_RemoveAll","Rule_RemoveEGroupEvent","Rule_RemoveEntityEvent","Rule_RemoveGlobalEvent","Rule_RemoveIfExist","Rule_RemoveMe","Rule_RemovePlayerEvent","Rule_RemoveSGroupEvent","Rule_RemoveSquadEvent","Setup_Player","Cmd_StopSquadsExcept","Misc_IsEGroupOnScreen","Misc_IsSGroupOnScreen","SGroup_Add","SGroup_AddAbility","SGroup_AddGroup","SGroup_AddGroups","SGroup_AddLeaders","SGroup_AddSlotItemToDropOnDeath","SGroup_CanCastAbilityOnEntity","SGroup_CanCastAbilityOnPosition","SGroup_CanCastAbilityOnSquad","SGroup_CanInstantReinforceNow","SGroup_CanSeeSGroup","SGroup_Clear","SGroup_ClearPostureSuggestion","SGroup_Compare","SGroup_CompleteEntityUpgrade","SGroup_ContainsBlueprints","SGroup_ContainsSGroup","SGroup_ContainsSquad","SGroup_Count","SGroup_CountDeSpawned","SGroup_CountSpawned","SGroup_Create","SGroup_CreateIfNotFound","SGroup_CreateKickerMessage","SGroup_DeSpawn","SGroup_Destroy","SGroup_DestroyAllInMarker","SGroup_DestroyAllSquads","SGroup_DisableCombatPlans","SGroup_Duplicate","SGroup_EnableAttention","SGroup_EnableMinimapIndicator","SGroup_EnableSurprise","SGroup_EnableUIDecorator","SGroup_Exists","SGroup_FaceEachOther","SGroup_FaceMarker","SGroup_Filter","SGroup_FilterCount","SGroup_FilterThreat","SGroup_ForEach","SGroup_ForEachAllOrAny","SGroup_ForEachAllOrAnyEx","SGroup_ForEachEx","SGroup_FromName","SGroup_GetAvgHealth","SGroup_GetAvgLoadout","SGroup_GetDeSpawnedSquadAt","SGroup_GetGarrisonedBuildingEntity","SGroup_GetHoldEGroup","SGroup_GetHoldSGroup","SGroup_GetInvulnerable","SGroup_GetLastAttacker","SGroup_GetLoadedVehicleSquad","SGroup_GetName","SGroup_GetNumSlotItem","SGroup_GetOffsetPosition","SGroup_GetPosition","SGroup_GetRandomSpawnedSquad","SGroup_GetSequence","SGroup_GetSpawnedSquadAt","SGroup_GetSpread","SGroup_GetSquadsHeld","SGroup_GetSuppression","SGroup_GetVeterancyExperience","SGroup_GetVeterancyRank","SGroup_HasCritical","SGroup_HasLeader","SGroup_HasSquadBlueprint","SGroup_HasTeamWeapon","SGroup_HasUpgrade","SGroup_Hide","SGroup_IncreaseVeterancyExperience","SGroup_IncreaseVeterancyRank","SGroup_Intersection","SGroup_IsAlive","SGroup_IsAttackMoving","SGroup_IsCamouflaged","SGroup_IsCapturing","SGroup_IsConstructingBuilding","SGroup_IsDoingAbility","SGroup_IsDoingAttack","SGroup_IsDugIn","SGroup_IsEmpty","SGroup_IsFemale","SGroup_IsHoldingAny","SGroup_IsIdle","SGroup_IsInCover","SGroup_IsInfiltrated","SGroup_IsInHoldEntity","SGroup_IsInHoldSquad","SGroup_IsMoving","SGroup_IsOnScreen","SGroup_IsPinned","SGroup_IsReinforcing","SGroup_IsRetreating","SGroup_IsSettingDemolitions","SGroup_IsSuppressed","SGroup_IsUnderAttack","SGroup_IsUnderAttackByPlayer","SGroup_IsUnderAttackFromDirection","SGroup_IsUpgrading","SGroup_IsUsingAbility","SGroup_Kill","SGroup_Remove","SGroup_RemoveGroup","SGroup_RemoveUpgrade","SGroup_ReSpawn","SGroup_RestoreCombatPlans","SGroup_RewardActionPoints","SGroup_SetAnimatorState","SGroup_SetAutoTargetting","SGroup_SetAvgHealth","SGroup_SetAvgMorale","SGroup_SetCrushable","SGroup_SetInvulnerable","SGroup_SetInvulnerableToCritical","SGroup_SetMoodMode","SGroup_SetMoveType","SGroup_SetPlayerOwner","SGroup_SetRecrewable","SGroup_SetSelectable","SGroup_SetSharedProductionQueue","SGroup_SetSuppression","SGroup_SetTeamWeaponCapturable","SGroup_SetVeterancyDisplayVisibility","SGroup_SetWorldOwned","SGroup_Single","SGroup_SnapFaceEachOther","SGroup_SuggestPosture","SGroup_TotalMembersCount","SGroup_WarpToMarker","SGroup_WarpToPos","Util_Grab","SGroup_FacePosition","SGroup_SnapFacePosition","Squad_AddAbility","Squad_AddSlotItemToDropOnDeath","Squad_CanCaptureStrategicPoint","Squad_CanCaptureTeamWeapon","Squad_CanCastAbilityOnEGroup","Squad_CanCastAbilityOnEntity","Squad_CanCastAbilityOnPosition","Squad_CanCastAbilityOnSGroup","Squad_CanCastAbilityOnSquad","Squad_CancelProductionQueueItem","Squad_CanHold","Squad_CanInstantReinforceNow","Squad_CanLoadSquad","Squad_CanPickupSlotItem","Squad_CanRecrew","Squad_CanSeeEntity","Squad_CanSeeSquad","Squad_ClearPostureSuggestion","Squad_CompleteUpgrade","Squad_Count","Squad_CreateAndSpawnToward","Squad_DeSpawn","Squad_Destroy","Squad_EnableProductionQueue","Squad_EnableSurprise","Squad_EntityAt","Squad_FacePosition","Squad_FaceSquad","Squad_FindCover","Squad_FindCoverCompareCurrent","Squad_FromWorldID","Squad_GetActiveCommand","Squad_GetAttackPlan","Squad_GetAttackTargets","Squad_GetBlueprint","Squad_GetDestination","Squad_GetGameID","Squad_GetHeading","Squad_GetHealth","Squad_GetHealthMax","Squad_GetHealthPercentage","Squad_GetHoldEntity","Squad_GetHoldSquad","Squad_GetInvulnerable","Squad_GetInvulnerableEntityCount","Squad_GetInvulnerableMinCap","Squad_GetLastAttacker","Squad_GetLastAttackers","Squad_GetLastEntityAttacker","Squad_GetMax","Squad_GetNumSlotItem","Squad_GetOffsetPosition","Squad_GetPinnedPlan","Squad_GetPlayerOwner","Squad_GetPosition","Squad_GetPositionDeSpawned","Squad_GetProductionQueueItem","Squad_GetProductionQueueItemType","Squad_GetProductionQueueSize","Squad_GetReactionPlan","Squad_GetRetaliationPlan","Squad_GetSlotItemAt","Squad_GetSlotItemCount","Squad_GetSlotItemsTable","Squad_GetSquadsHeld","Squad_GetSuppression","Squad_GetVeterancyExperience","Squad_GetVeterancyRank","Squad_GiveSlotItem","Squad_GiveSlotItemsFromTable","Squad_HasActiveCommand","Squad_HasAnyCritical","Squad_HasCritical","Squad_HasDestination","Squad_HasProductionQueue","Squad_HasSlotItem","Squad_HasTeamWeapon","Squad_HasUpgrade","Squad_IncreaseVeterancyExperience","Squad_IncreaseVeterancyRank","Squad_InstantSetupTeamWeapon","Squad_IsAttacking","Squad_IsCamouflaged","Squad_IsDoingAbility","Squad_IsFemale","Squad_IsHoldingAny","Squad_IsInCover","Squad_IsInHoldEntity","Squad_IsInHoldSquad","Squad_IsMoving","Squad_IsPinned","Squad_IsReinforcing","Squad_IsRetreating","Squad_IsSuppressed","Squad_IsUnderAttack","Squad_IsUnderAttackByPlayer","Squad_IsUnderAttackFromDirection","Squad_IsUpgrading","Squad_IsUpgradingAny","Squad_IsValid","Squad_Kill","Squad_RemoveAbility","Squad_RemoveUpgrade","Squad_RewardActionPoints","Squad_SetAnimatorState","Squad_SetAttackPlan","Squad_SetHealth","Squad_SetInvulnerable","Squad_SetInvulnerableEntityCount","Squad_SetInvulnerableMinCap","Squad_SetInvulnerableToCritical","Squad_SetMoodMode","Squad_SetMoveType","Squad_SetPinnedPlan","Squad_SetPlayerOwner","Squad_SetPosition","Squad_SetReactionPlan","Squad_SetRecrewable","Squad_SetRetaliationPlan","Squad_SetSharedProductionQueue","Squad_SetSuppression","Squad_SetVeterancyDisplayVisibility","Squad_SetWorldOwned","Squad_Spawn","Squad_SpawnToward","Squad_Split","Squad_StopAbility","Squad_SuggestPosture","Squad_WarpToPos","Stats_BuildingsLost","Stats_InfantryLost","Stats_KillsTotal","Stats_PlayerAt","Stats_PlayerCount","Stats_ResGathered","Stats_ResSpent","Stats_SoldiersKilled","Stats_StructuresKilled","Stats_TeamTally","Stats_TotalDuration","Stats_TotalSquadsLost","Stats_UnitSoldierKills","Stats_UnitStructureKills","Stats_UnitTotalKills","Stats_UnitVehicleKills","Stats_VehiclesKilled","Stats_VehiclesLost","Stinger_AddEvent","Stinger_AddFunction","Stinger_Remove","Team_AddResource","Team_AddSquadsToSGroup","Team_AreSquadsNearMarker","Team_CanSee","Team_ClearArea","Team_DefineAllies","Team_DefineEnemies","Team_FindByRace","Team_ForEachAllOrAny","Team_GetAll","Team_GetAllEntitiesNearMarker","Team_GetAllSquadsNearMarker","Team_GetBuildingID","Team_GetBuildingsCount","Team_GetBuildingsCountExcept","Team_GetBuildingsCountOnly","Team_GetEnemyTeam","Team_GetEntitiesFromType","Team_HasBuilding","Team_HasBuildingsExcept","Team_HasBuildingUnderConstruction","Team_IsAlive","Team_OwnsEGroup","Team_OwnsEntity","Team_OwnsSGroup","Team_OwnsSquad","Team_RestrictAddOnList","Team_RestrictBuildingList","Team_RestrictResearchList","Team_SetAbilityAvailability","Team_SetCommandAvailability","Team_SetConstructionMenuAvailability","Team_SetEntityProductionAvailability","Team_SetMaxCapPopulation","Team_SetMaxPopulation","Team_SetSquadProductionAvailability","Team_SetTechTreeByYear","Team_SetUpgradeAvailability","Team_SetUpgradeCost","ToW_DefenseCreateWave","ToW_SetStandardResources","ToW_SetUpBattleObjectives","ToW_SetUpTechTreeByYear","Timer_Add","Timer_Advance","Timer_Display","Timer_DisplayOnScreen","Timer_End","Timer_Exists","Timer_GetElapsed","Timer_GetMinutesAndSeconds","Timer_GetRemaining","Timer_IsPaused","Timer_Pause","Timer_Resume","Timer_Start","EventCue_Create","FOW_Enable","Game_SubTextFade","HintMouseover_Add","HintMouseover_Remove","HintPoint_Add","HintPoint_Remove","HintPoint_SetDisplayOffset","HintPoint_SetVisible","Misc_IsEGroupSelected","Misc_IsSGroupSelected","ThreatArrow_Add","ThreatArrow_CreateGroup","ThreatArrow_DestroyAllGroups","ThreatArrow_DestroyGroup","ThreatArrow_Remove","UI_AddHintAndFlashAbility","UI_CreateEventCue","UI_CreateMinimapBlip","UI_CreateSGroupKickerMessage","UI_DeleteMinimapBlip","UI_HighlightSGroup","UI_SetAllowLoadAndSave","UI_SetSGroupSpecialLevel","WinWarning_PublishLoseReminder","WinWarning_SetMaxTickers","WinWarning_SetTickers","WinWarning_ShowLoseWarning","Clone","Event_IsAnyRunning","Game_EndSP","Game_FadeToBlack","Import_Once","Loc_FormatText","Sound_PlayOnSquad","Team_GetEntityConcentration","Team_GetSquadConcentration","Util_AddMouseoverSquadToSGroup","Util_ApplyModifier","Util_AutoAmbient","Util_AutoIntel","Util_AutoNISlet","Util_Autosave","Util_ClearWrecksFromMarker","Util_DespawnAll","Util_DifVar","Util_ElementCanSee","Util_EntityLimit","Util_FallBackToGarrisonBuilding","Util_FindHiddenSpawn","Util_ForceRetreatAll","Util_GarrisonNearbyBuilding","Util_GarrisonNearbyVehicle","Util_GetClosestMarker","Util_GetEntitiesByBP","Util_GetHealth","Util_GetMouseoverSGroup","Util_GetPosition","Util_GetPositionAwayFromPlayer","Util_GetPositionFromAtoB","Util_GetRandomPosition","Util_GetSquadsByBP","Util_GetTrailingNumber","Util_HasPosition","Util_HidePlayerForNIS","Util_IsSequenceSkipped","Util_Kill","Util_LogSyncWpn","Util_MarkerFX","Util_MissionTitle","Util_MuteAmbientSound","Util_NewHUDFeatureEvent","Util_PlayMovie","Util_PlayMusic","Util_PrintObject","Util_ReinforceEvent","Util_ReloadScript","Util_RestoreMusic","Util_SetPlayerCanSkipSequence","Util_SetPlayerUnableToSkipSequence","Util_SortPositionsByClosest","Util_StartAmbient","Util_StartIntel","Util_StartNislet","Util_StartQuickIntel","Util_TableContains","Util_ToggleAllowIntelEvents","Util_TriggerEvent","Util_UnitCounts","World_KillAllNeutralEntitesNearMarker","Anim_PlayEntityAnim","bug","Camera_AutoRotate","Camera_ClampToMarker","Camera_FocusOnPosition","Camera_FollowEntity","Camera_FollowSelection","Camera_FollowSquad","Camera_GetCurrentTargetPos","Camera_GetDeclination","Camera_GetOrbit","Camera_GetTargetPos","Camera_GetTuningValue","Camera_GetZoomDist","Camera_IsInputEnabled","Camera_Reload","Camera_ResetFocus","Camera_ResetToDefault","Camera_SetDeclination","Camera_SetInputEnabled","Camera_SetOrbit","Camera_SetSlideTargetRate","Camera_SetTuningValue","Camera_SetZoomDist","Camera_StopAutoRotating","Camera_Unclamp","EGroup_CallEntityFunction","EGroup_CallEntityFunctionAllOrAny","fatal","Game_EnableInput","Game_EndSubTextFade","Game_EndTextTitleFade","Game_GetLocalPlayer","Game_GetMode","Game_GetSPDifficulty","Game_HasLocalPlayer","Game_IsLetterboxed","Game_IsPerformanceTest","Game_IsRTM","Game_Letterbox","Game_LoadAtmosphere","Game_LockRandom","Game_ProfileDumpFrames","Game_QuitApp","Game_ScreenFade","Game_SetLocalPlayer","Game_SetMode","Game_ShowPauseMenu","Game_SkipAllEvents","Game_SkipEvent","Game_StartMuted","Game_TextTitleFade","Game_TriggerLightning","Game_UnlockInputOnLetterBox","Game_UnLockRandom","Ghost_DisableSpotting","Ghost_EnableSpotting","HintPoint_AddToEGroup","HintPoint_AddToEntity","HintPoint_AddToPosition","HintPoint_AddToSGroup","HintPoint_AddToSquad","HintPoint_ClearFacing","HintPoint_RemoveAll","HintPoint_SetDisplayOffsetInternal","HintPoint_SetFacingEntity","HintPoint_SetFacingPosition","HintPoint_SetFacingSquad","HintPoint_SetVisibleInternal","inv_dump","IsOfType","IsSecuringStructure","IsStructure","License_CanPlayRace","LOC","Loc_ConvertNumber","Loc_Empty","Loc_FormatTime","Misc_AbortToFE","Misc_AddRestrictCommandsMarker","Misc_AIControlLocalPlayer","Misc_AreDefaultCommandsEnabled","Misc_DetectKeyboardInput","Misc_DetectMouseInput","Misc_DoWeaponHitEffectOnEntity","Misc_EnablePerformanceTest","Misc_GetCommandLineString","Misc_GetControlGroupContents","Misc_GetEntityControlGroup","Misc_GetHiddenPositionOnPath","Misc_GetMouseOnTerrain","Misc_GetMouseOverEntity","Misc_GetSelectedEntities","Misc_GetSelectedSquads","Misc_GetSquadControlGroup","Misc_IsCommandLineOptionSet","Misc_IsDevMode","Misc_IsEntityOnScreen","Misc_IsEntitySelected","Misc_IsMouseOverEntity","Misc_IsPosOnScreen","Misc_IsSelectionInputEnabled","Misc_IsSquadOnScreen","Misc_IsSquadSelected","Misc_RemoveCommandRestriction","Misc_RestrictCommandsToMarker","Misc_Screenshot","Misc_ScreenshotExt","Misc_SelectEntity","Misc_SelectSquad","Misc_SetDefaultCommandsEnabled","Misc_SetDesignerSplatsVisibility","Misc_SetEntityControlGroup","Misc_SetEntitySelectable","Misc_SetSelectionInputEnabled","Misc_SetSquadControlGroup","Misc_SetSquadSelectable","Mission_Complete","Mission_Fail","Mission_GetSecondaryObjective","Mission_StartBonusObjective","Mission_Win","Modifier_ApplyToEntity","Modifier_ApplyToPlayer","Modifier_ApplyToSquad","Modifier_Create","Modifier_Destroy","Modifier_IsEnabled","nis_setintransitiontime","nis_setouttransitionnis","nis_setouttransitiontime","Obj_Create","Obj_Delete","Obj_DeleteAll","Obj_GetState","Obj_GetVisible","Obj_HideProgress","Obj_SetDescription","Obj_SetIcon","Obj_SetObjectiveFunction","Obj_SetProgressBlinking","Obj_SetState","Obj_SetTitle","Obj_SetVisible","Obj_ShowProgress","Obj_ShowProgress2","Obj_ShowProgressTimer","OpBounty_AddRewardGroup","OpBounty_AddRewardTable","Order227_Init","PrintOnScreen","PrintOnScreen_Add","PrintOnScreen_Remove","PrintOnScreen_RemoveFromScreen","ResourceAmount_Add","ResourceAmount_ClampToZero","ResourceAmount_Has","ResourceAmount_Mult","ResourceAmount_Subtract","ResourceAmount_Sum","ResourceAmount_Zero","Scar_Autosave","Scar_CompleteIntelBulletinTask","Scar_DebugConsoleExecute","Scar_PlayNIS","Scar_PlayNIS2","Scar_ReloadAIScripts","Setup_GetVictoryPointTickerOption","Setup_SetPlayerName","Setup_SetPlayerRace","Setup_SetPlayerTeam","SGroup_CallEntityFunction","SGroup_CallSquadFunction","SGroup_CallSquadFunctionAllOrAny","SitRep_PlayMovie","SitRep_PlaySpeech","SitRep_StopMovie","Sound_ContainerDebug","Sound_DisableSpeechEvent","Sound_IsPlaying","Sound_PerfTest_Play2D","Sound_Play2D","Sound_Play3D","Sound_PlayMusic","Sound_PlayStreamed","Sound_PreCacheSinglePlayerSpeech","Sound_PreCacheSound","Sound_PreCacheSoundFolder","Sound_SetGlobalControlSource","Sound_SetMusicCombatValue","Sound_SetVolume","Sound_SetVolumeDefault","Sound_SetVolumeInv","Sound_StartRecording","Sound_Stop","Sound_StopAll","Sound_StopMusic","Sound_StopRecording","Speech_SetGlobalStealthRead","statgraph","statgraph_channel","statgraph_channel_get_enabled","statgraph_channel_set_enabled","statgraph_clear","statgraph_list","statgraph_pause","Subtitle_EndAllSpeech","Subtitle_EndCurrentSpeech","Subtitle_PlaySpeech","Subtitle_UnstickCurrentSpeech","SyncWeapon_CanAttackNow","SyncWeapon_Exists","SyncWeapon_GetEntity","SyncWeapon_GetFromEGroup","SyncWeapon_GetFromSGroup","SyncWeapon_GetPosition","SyncWeapon_IsAttacking","SyncWeapon_IsOwnedByPlayer","SyncWeapon_SetAutoTargetting","Taskbar_IsVisible","Taskbar_SetVisibility","TaskCountActivePBG","TaskCountPBG","UI_AutosaveMessageHide","UI_AutosaveMessageShow","UI_ClearEventCues","UI_ClearModalAbilityPhaseCallback","UI_ClearNISEndCallback","UI_CoverPreviewHide","UI_CoverPreviewShow","UI_CreateColouredEntityKickerMessage","UI_CreateColouredPositionKickerMessage","UI_CreateColouredSquadKickerMessage","UI_CreateEntityKickerMessage","UI_CreatePositionKickerMessage","UI_CreateSquadKickerMessage","UI_EnableGameEventCueType","UI_EnableResourceTypeKicker","UI_EnableUIEventCueType","UI_FlashAbilityButton","UI_FlashConstructionButton","UI_FlashConstructionMenu","UI_FlashEntity","UI_FlashEntityCommandButton","UI_FlashEventCue","UI_FlashObjectiveCounter","UI_FlashObjectiveIcon","UI_FlashProductionBuildingButton","UI_FlashProductionButton","UI_FlashSquadCommandButton","UI_GetDecoratorsEnabled","UI_HideTacticalMap","UI_HighlightSquad","UI_IsTacticalMapShown","UI_MessageBoxHide","UI_MessageBoxSetButton","UI_MessageBoxSetText","UI_NewHUDFeature","UI_OutOfBoundsLinesHide","UI_OutOfBoundsLinesShow","UI_RestrictBuildingPlacement","UI_ScreenFade","UI_SetAbilityCardVisibility","UI_SetAlliedBandBoxSelection","UI_SetCPMeterVisibility","UI_SetDecoratorsEnabled","UI_SetForceShowSubtitles","UI_SetModalAbilityPhaseCallback","UI_SetNISEndCallback","UI_SetSoviet227Blinking","UI_SetSoviet227Visibility","UI_ShowTacticalMap","UI_StopFlashing","UI_SystemMessageHide","UI_SystemMessageShow","UI_TerritoryHide","UI_TerritoryShow","UI_TitleDestroy","UI_ToggleDecorators","UI_UnrestrictBuildingPlacement","UIWarning_Show","Util_AddProxCheck","Util_ClearProxChecks","Util_CreateEntities","Util_CreateSquads","Util_GetDistance","Util_GetOffsetPosition","Util_GetPlayerOwner","Util_GetRelationship","Util_GetRelativeOffset","Util_MonitorTerritory","Util_RemoveProxCheck","Util_RemoveProxCheckByID","Util_ScarPos","Util_SetPlayerOwner","Util_SpawnDemoCharge","Util_StartNIS","VIS_OccCullToggleOBB","Marker_CleanUpTheDead","Weather_SetType","World_AddPilferLockArea","World_CleanUpTheDead","World_ClearCasualties","World_DamageIce","World_DestroyWallsNearMarker","World_DistanceEGroupToPoint","World_DistancePointToPoint","World_DistanceSGroupToPoint","World_DistanceSquaredPointToPoint","World_EnableReplacementObjectForEmptyPlayers","World_EnableSharedLineOfSight","World_EndSP","World_GetClosest","World_GetCurrentInteractionStage","World_GetEntitiesNearMarker","World_GetEntitiesNearPoint","World_GetEntitiesWithinTerritorySector","World_GetEntity","World_GetFurthest","World_GetGameTime","World_GetHeightAt","World_GetHiddenPositionOnPath","World_GetLength","World_GetNearestInteractablePoint","World_GetNeutralEntitiesNearMarker","World_GetNeutralEntitiesNearPoint","World_GetNeutralEntitiesWithinTerritorySector","World_GetNumEntities","World_GetNumEntitiesNearPoint","World_GetNumStrategicPoints","World_GetNumVictoryPoints","World_GetOffsetPosition","World_GetPlayerAt","World_GetPlayerCount","World_GetPlayerIndex","World_GetPossibleSquadsBlueprint","World_GetPossibleSquadsCount","World_GetRaceIndex","World_GetRand","World_GetSpawnablePosition","World_GetSquadsNearMarker","World_GetSquadsNearPoint","World_GetSquadsWithinTerritorySector","World_GetStrategyPoints","World_GetTeamTerritoryGaps","World_GetTeamVictoryTicker","World_GetTerritorySectorID","World_GetTerritorySectorPosition","World_GetWidth","World_IncreaseInteractionStage","World_IsGameOver","World_IsInSupply","World_IsPointInPlayerTerritory","World_IsTerritorySectorOwnedByPlayer","World_IsWinterMap","World_OwnsEGroup","World_OwnsEntity","World_OwnsSGroup","World_OwnsSquad","World_PointPointProx","World_Pos","World_RemoveAllResourcePoints","World_RemovePilferLockArea","World_SetDesignerSupply","World_SetGameOver","World_SetIceHealingRate","World_SetPlayerCustomSkin","World_SetPlayerLose","World_SetPlayerWin","World_SetSnowHealingRate","World_SetTeamWin","World_SpawnDemolitionCharge","World_TeamTerritoryPointsConnected","Scar_AddInit","scartype","scartype_tostring","import","UI_GetViewportWidth","UI_GetViewportHeight","UI_ButtonAdd","UI_ButtonSetCallback","UI_ButtonSetEnabled","UI_ButtonSetIcon","UI_ButtonSetTag","UI_ButtonSetText","UI_LabelAdd","UI_LabelSetText","UI_IconAdd","UI_IconSetIcon","UI_PanelAdd","UI_StatusIndicatorAdd","UI_StatusIndicatorSetValue","UI_ControlSetColour","UI_ControlSetPosition","UI_ControlSetRect","UI_ControlRemove","UI_ControlClear","BS_NearBase","BS_Defend","BS_Secure","BS_Mines","BS_OuterBase","CPT_VictoryPoint","CPT_MunitionPoint","CPT_NullPoint","CPT_TacticalPoint","CPT_INVALID","CPT_FuelPoint","COMBAT_Default","COMBAT_Defend","COMBAT_Attack","MPT_VictoryPoint","MPT_NullPoint","MPT_NONE","MPT_MunitionPoint","MPT_COUNT","MPT_SupportStructure","MPT_Defence","MPT_Spawner","MPT_HQ","MPT_TacticalPoint","MPT_FuelPoint","MTARGET_Attack","MTARGET_Defend","AI_ProductionQueue","AI_CapturePoint","AI_Squad","AITacticTargetPreference_HighDamage","AITacticTargetPreference_LowHealth","AITacticTargetPreference_None","AITacticTargetPreference_Support","AITacticTargetPreference_Near","AITacticTargetPreference_NearAndBest","AITacticTargetPreference_Best","TACTIC_CapturePoint","TACTIC_Ability","TACTIC_Pickup","TACTIC_ForceAttack","TACTIC_Hold","TACTIC_MinRange","TACTIC_CaptureTeamWeapon","TACTIC_WarmUp","TACTIC_ProvideReinforcementPoint","TACTIC_RushAtTarget","TACTIC_Recrew","TACTIC_Vehicle","TACTIC_Avoid","TACTIC_Cover","TACTIC_FinishHealing","TASK_Leader","TASK_Production","TASK_Ability","TASK_PlayerAbility","TASK_Combat","TASK_Construction","TASK_Capture","TASK_ImmobileCombat","AII_LocalHumanTakeover","AII_RemoteAITakeover","AII_None","AII_RemoteHumanTakeover","AII_Normal","ITEM_REMOVED","ITEM_DEFAULT","ITEM_UNLOCKED","ITEM_LOCKED","BT_AttackHere","BT_SectorArtillery","BT_ObjectivePrimary","BT_Reveal","BT_Combat","BT_General","BT_CaptureHere","BT_DefendHere","BT_ObjectiveSecondary","BT_RallyPoint","BFS_Smoking","BFS_Burning","BFS_NotOnFire","TV_DeclinationEnabled","TV_DistMaxDead","TV_DistRateMouse","TV_NISletDistMin","TV_SlideOrbitRate","TV_PanScaleKeyboardDefZ","TV_PanScaleMouseDefZ","TV_SlideDeclThreshold","TV_PanStartSpeedScalar","TV_EntityMinViewAngle","TV_SlideTargetBase","TV_NearPlaneShifter","TV_DistMin","TV_PanScaleScreenDefZ","TV_NISletDistGroundMin","TV_DeclBelow","TV_SlideTargetThreshold","TV_DeclAbove","TV_DistScale","TV_NISletDistMax","TV_PanMaxSpeedScalar","TV_NISletDeclAbove","TV_NISletDistMinGround","TV_ZoomLocked","TV_CameraMode","TV_DefaultAngle","TV_PanScaleKeyboardMinZ","TV_PanScaleMouseMinZ","TV_DeclBelowClose","TV_TrackElastic","TV_DistExpWheel","TV_DistExpMouse","TV_DistMinGround","TV_DistGroundTargetHeight","TV_ClipFar","TV_DistGroundMin","TV_DistMinDead","TV_DistMax","TV_SlideDeclBase","TV_SlideOrbitThreshold","TV_SlideOrbitBase","TV_SlideDistThreshold","TV_SlideDistBase","TV_SlideTargetRate","TV_ClipNear","TV_PanScaleScreenMinZ","TV_DistRateWheelZoomIn","TV_SlideDistRate","TV_DistRateWheelZoomOut","TV_TrackBoundScale","TV_DefaultDeclination","TV_PanAccelerate","TV_DeclRateMouse","TV_DistExp","TV_DefaultHeight","TV_SlideDeclRate","TV_RotationEnabled","TV_OrbitRateMouse","TV_FieldOfView","TV_NISletDeclBelow","CANPRODUCE_PrerequisitesProducer","CANPRODUCE_Error","CANPRODUCE_ProductionQueueFull","CANPRODUCE_ProductionItemFull","CANPRODUCE_OutOfReinforceRadius","CANPRODUCE_Ok","CANPRODUCE_Disabled","CANPRODUCE_OutOfTerritory","CANPRODUCE_UpgradeItemFull","CANPRODUCE_PopulationCapFull","CANPRODUCE_NoResources","CANPRODUCE_PrerequisitesItem","CANPRODUCE_NoItem","CT_Medic","CT_Vehicle","CT_Personnel","CHECK_BOTH","CHECK_OFFCAMERA","CHECK_IN_FOW","CT_VehicleOpticsDamaged","CT_VehicleExhaustDamaged","CT_VehicleKillCommander","CT_VehicleDriverInjured","CT_VehicleEngineYellow","CT_VehicleBack","CT_VehicleLeft","CT_VehicleRight","CT_VehicleGunnerInjured","CT_VehicleEngineGreen","CT_VehicleCrewShocked","CT_VehicleFront","CT_VehicleEngineBurning","CT_VehicleEngineRed","CT_VehicleSecondaryWeapon","CT_VehicleLoseTreadsOrWheels","CT_VehicleOutOfControl","CT_VehiclePrimaryWeapon","Crush_Heavy","Crush_Off","Crush_Light","Crush_Medium","DB_Button3","DB_Button1","DB_Close","DB_Button2","CMD_InstantBuildSquad","CMD_InstantDeath","CMD_AttackStop","CMD_BuildStructure","CMD_Face","CMD_CancelProduction","CMD_RescueCasualty","CMD_SetHoldHeading","CMD_DefuseMine","CMD_AttackMove","CMD_Fidget","CMD_Stop","CMD_PlaceCharge","CMD_Paradrop","CMD_Destroy","CMD_Load","CMD_Ability","CMD_Move","CMD_InstantUpgrade","CMD_UnloadSquads","CMD_Casualty","CMD_BuildSquad","CMD_Halt","CMD_Attack","CMD_Capture","CMD_AttackForced","CMD_Death","CMD_Unload","CMD_Evacuate","CMD_BuildEntity","CMD_Vault","CMD_AttackFromHold","CMD_RallyPoint","CMD_DefaultAction","CMD_Upgrade","CMD_ChooseResource","CMD_Projectile","STATEID_Capture","STATEID_Idle","STATEID_Evacuate","STATEID_StructureBuilding","STATEID_RepairEngineer","STATEID_Move","STATEID_Dead","STATEID_DefuseMine","GE_ProjectileFired","GE_AIPlayer_Migrated","GE_EntityKilled","GE_TerritoryEntered","GE_ConstructionComplete","GE_NonGlobalCamoDetected","GE_SquadPinned","GE_BuildItemComplete","GE_PlayerKilled","GE_EntityCommandIssued","GE_StrategicPointChanged","GE_PlayerDonation","GE_AbilityExecuted","GE_PlayerDropped","GE_PlayerBeingAttacked","GE_UpgradeComplete","GE_PlayerSkipNIS","GE_AIPlayer_ObjectiveNotification","GE_ResourceDepleted","GE_CustomUIEvent","GE_SquadKilled","GE_PlayerSurrendered","GE_SquadCommandIssued","GE_EntityParadropComplete","GE_PlayerCheat","GE_InfoPointActivated","GE_SpawnActionComplete","GE_PlayerCommandIssued","GE_PlayerHostMigrated","GE_SquadParadropComplete","GE_PlayerPhaseUp","HPAT_Hint","HPAT_MovementLooping","HPAT_Bonus","HPAT_Vaulting","HPAT_Detonation","HPAT_CoverRed","HPAT_CoverYellow","HPAT_Artillery","HPAT_FormationSetup","HPAT_Movement","HPAT_Critical","HPAT_Objective","HPAT_AttackLooping","HPAT_DeepSnow","HPAT_CoverGreen","HPAT_Attack","HPAT_RallyPoint","HUDF_None","HUDF_AbilityCard","HUDF_Upgrades","HUDF_CommandCard","HUDF_MiniMap","LOOP_NORMAL","LOOP_TOGGLE_DIRECTION","LOOP_NONE","MAP_Confirmed","MAP_Placing","MAP_Facing","MAT_Entity","MAT_Player","MAT_Weapon","MAT_Upgrade","MAT_EntityType","MAT_Ability","MAT_Squad","MAT_WeaponType","MAT_SquadType","MUT_Multiplication","MUT_MultiplyAdd","MUT_Addition","MUT_Enable","PBG_Weapon","PBG_MoveType","PBG_SlotItem","PBG_UITacticalMap","PBG_HitMaterial","PBG_PassType","PBG_Race","PBG_UISelection","PBG_Critical","PBG_CamouflageStance","PBG_Material","PBG_Tuning","PBG_Ability","PBG_Upgrade","PBG_Posture","PBG_UITerritory","MM_ForceTense","MM_ForceCalm","MM_Auto","FN_OnShow","FN_OnCounterDisplay","FN_OnActivate","FN_LuaTableQuery","FN_OnSelect","OS_Complete","OS_Incomplete","OS_Off","OS_Failed","OT_Secondary","OT_Primary","OT_Ally","OT_Neutral","OT_Player","OT_Enemy","PCMD_MunitionDonation","PCMD_SlotItemRemove","PCMD_CriticalHit","PCMD_CheatBuildTime","PCMD_Ability","PCMD_SetCommander","PCMD_CheatRevealAll","PCMD_ManpowerDonation","PCMD_UpgradeRemove","PCMD_ConstructField","PCMD_CancelProduction","PCMD_CheatKillSelf","PCMD_Upgrade","PCMD_ConstructFence","PCMD_FuelDonation","PCMD_DetonateCharges","PCMD_CheatResources","PCMD_AIPlayer","PCMD_AIPlayer_ObjectiveNotification","PCMD_ConstructStructure","PCMD_InstantUpgrade","PITEM_SquadUpgrade","PITEM_SquadReinforce","PITEM_Spawn","PITEM_Upgrade","PT_Rectangle","PT_Circle","R_NEUTRAL","R_ENEMY","R_UNDEFINED","R_ALLY","RT_SovietOrder227","RT_Command","RT_SovietProgression","RT_Popcap","RT_Manpower","RT_Munition","RT_Fuel","RT_Action","RUIITEM_Population","RUIITEM_ResourceBar","RUIITEM_Munitions","RUIITEM_Manpower","RUIITEM_Fuel","ST_MARKER","ST_PBG","ST_SCARPOS","ST_AIPLAYER","ST_TABLE","ST_EGROUP","ST_AISTATSMILITARYPOINT","ST_AISQUAD","ST_ENTITY","ST_NUMBER","ST_FUNCTION","ST_SQUAD","ST_PLAYER","ST_BOOLEAN","ST_NIL","ST_CONSTPLAYER","ST_UNKNOWN","ST_SGROUP","ST_STRING","ST_AICAPTUREPOINT","PBG_TurnPlan","PBG_EntityProperties","PBG_SquadFormation","PBG_SquadProperties","PBG_Formation","DEBUG_SELECTOR","DEBUG_COMBATZONES","SCMD_Attack","SCMD_Upgrade","SCMD_StationaryAttack","SCMD_SlotItemRemove","SCMD_Pilfer","SCMD_SetMoveType","SCMD_Ability","SCMD_Move","SCMD_BuildStructure","SCMD_InstantLoad","SCMD_Merge","SCMD_UnloadSquads","SCMD_Retreat","SCMD_DefaultAction","SCMD_RescueCasualty","SCMD_Stop","SCMD_SetCamouflageStance","SCMD_AttackMove","SCMD_RevertFieldSupport","SCMD_CancelProduction","SCMD_Capture","SCMD_Surprise","SCMD_ReinforceUnit","SCMD_CaptureTeamWeapon","SCMD_Patrol","SCMD_Face","SCMD_Recrew","SCMD_DoPlan","SCMD_DefuseCharge","SCMD_PickUpSlotItem","SCMD_BuildSquad","SCMD_InstantReinforceUnit","SCMD_Load","SCMD_InstantSetupTeamWeapon","SCMD_RallyPoint","SCMD_AbandonTeamWeapon","SCMD_Unload","SCMD_DefuseMine","SCMD_Destroy","SCMD_PlaceCharge","SCMD_InstantUpgrade","SQUADSTATEID_Capture","SQUADSTATEID_CaptureTeamWeapon","SQUADSTATEID_Move","SQUADSTATEID_Retreat","SQUADSTATEID_Plan","SQUADSTATEID_AttackMove","SQUADSTATEID_Load","SQUADSTATEID_Defuse","SQUADSTATEID_DefuseMine","SQUADSTATEID_Stop","SQUADSTATEID_Patrol","SQUADSTATEID_Ability","SQUADSTATEID_CombatStance","SQUADSTATEID_RevertFieldSupport","SQUADSTATEID_Unload","SQUADSTATEID_HoldUnload","SQUADSTATEID_PickUpSlotItem","SQUADSTATEID_Construction","SQUADSTATEID_Idle","SQUADSTATEID_WeaponTransition","SQUADSTATEID_Recrew","SQUADSTATEID_PlaceCharges","SQUADSTATEID_Combat","UIE_UpgradeComplete","UIE_PlayerPingOfShameLocal","UIE_EnemyReveal","UIE_InfoPointActivated","UIE_AITakeOver","UIE_VehicleComplete","UIE_AllyAttacked","UIE_CommanderAbilityUnlocked","UIE_CommandersUnlocked","UIE_CommandPointGained","UIE_SquadFreezing","UIE_SquadCold","UIE_CasualtySquadSpawned","UIE_SquadVeterancy","UIE_VehicleReplaced","UIE_InfantryReplaced","UIE_Sniped","UIE_BoobyTrap","UIE_MineDetected","UIE_AbilityExectued","UIE_StrategicPointCaptured","UIE_StrategicPointReverting","UIE_EnemyTerritoryEntered","UIE_TerritoryEntered","UIE_PlayerSurrendered","UIE_PlayerAttacked","UIE_VehicleAttacked","UIE_PlayerKilled","UIE_PlayerKicked","UIE_PlayerLagComplaint","UIE_PlayerPingOfShame","UIE_PlayerDropped","UIE_ConstructionComplete","UIE_StrategicPointSecured","UIE_ResourceDepleted","UIE_SquadPinned","UIE_InfantryAttacked","UIE_InfantryComplete","UIE_PlayerCheated","UIE_PhaseUp","UIE_HostMigrated","UIE_Default","UI_Cinematic","UI_Fullscreen","UI_Normal","UOT_Player","UOT_Self","UOT_None","BIS_Icon","BIS_IconState","LAH_Justify","LAH_Left","LAH_Center","LAH_Right","LAV_None","LAV_Top","LAV_Center","LAV_Bottom","assert","collectgarbage","dofile","error","getmetatable","ipairs","load","loadfile","next","pairs","pcall","print","rawequal","rawget","rawlen","rawset","select","setmetatable","tonumber","tostring","type","xpcall","string.byte","string.char","string.dump","string.find","and","break","do","else","elseif","end","false","for","function","if","in","local","nil","not","or","repeat","return","then","true","until","while","math.huge","math.maxinteger","math.mininteger","math.pi","EBP.WRECKED_VEHICLES.FRONT_HULL01","EBP.WRECKED_VEHICLES.FROZEN_PANZER_IV","EBP.WRECKED_VEHICLES.FROZEN_STUG_III","EBP.WRECKED_VEHICLES.HORSA_COCKPIT","EBP.WRECKED_VEHICLES.HORSA_FRONT_HULL","EBP.WRECKED_VEHICLES.HORSA_LEFT_WING","EBP.WRECKED_VEHICLES.HORSA_LEFT_WING_TIP","EBP.WRECKED_VEHICLES.HORSA_MID_HULL","EBP.WRECKED_VEHICLES.HORSA_REAR_HULL","EBP.WRECKED_VEHICLES.HORSA_RIGHT_WING","EBP.WRECKED_VEHICLES.HORSA_RIGHT_WING_TIP","EBP.WRECKED_VEHICLES.HORSA_TAIL","EBP.WRECKED_VEHICLES.LEFT_WING","EBP.WRECKED_VEHICLES.MAP_OBJECT_M4SHERMAN_105MM","EBP.WRECKED_VEHICLES.MAP_OBJECT_M4SHERMAN_76MM","EBP.WRECKED_VEHICLES.MAP_OBJECT_M4SHERMAN_DOZER","EBP.WRECKED_VEHICLES.MAP_OBJECT_OPELBLITZ","EBP.WRECKED_VEHICLES.MAP_OBJECT_PAK38","EBP.WRECKED_VEHICLES.MAP_OBJECT_PANZERIV","EBP.WRECKED_VEHICLES.MAP_OBJECT_STUGIII_LONG","EBP.WRECKED_VEHICLES.MAP_OBJECT_STUGIII_SHORT","EBP.WRECKED_VEHICLES.PROPELLER","EBP.WRECKED_VEHICLES.RIGHT_WING","EBP.WRECKED_VEHICLES.STUKA_BODY","EBP.WRECKED_VEHICLES.STUKA_DEBRIS","EBP.WRECKED_VEHICLES.STUKA_TAIL","EBP.WRECKED_VEHICLES.STUKA_WING_LEFT","EBP.WRECKED_VEHICLES.STUKA_WING_RIGHT","EBP.WRECKED_VEHICLES.TAIL","EBP.WRECKED_VEHICLES.TAIL_SECTION_01","EBP.WRECKED_VEHICLES.WRECKED_50MM_PAK38_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_PUMA_MP","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_222","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_222_MP","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_234","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_234_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_234_PUMA_MP","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_17_POUNDER","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_45MM","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_75MM_PAK","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_B4_200MM","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_M1_57MM","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_ML20","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_PAK43","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_ZIS3","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING01","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING01_SELF_DESTRUCT","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING02","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING02_SELF_DESTRUCT","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING03","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING03_SELF_DESTRUCT","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_AEC","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_AEC_ARMOURED_CAR_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_ATGUN_6_POUNDER","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_BOFORS","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CENTAUR","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_AVRE","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_AVRE_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_CROCODILE","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_CROCODILE_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_COMET","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_COMET_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CROMWELL","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CROMWELL_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_GLIDER_HQ_MP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_GLIDER_MP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_SEXTON","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_SHERMAN_FIREFLY","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_SHERMAN_FIREFLY_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_UNIVERSAL_CARRIER","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_VALENTINE_COMMAND","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_VALENTINE_COMMAND_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRUMMBAR_02","EBP.WRECKED_VEHICLES.WRECKED_BRUMMBAR_STURMPANZER_IV_SDKFZ_166","EBP.WRECKED_VEHICLES.WRECKED_EARLY_WAR_TANK_01","EBP.WRECKED_VEHICLES.WRECKED_ELEFANT_SDKFZ_184","EBP.WRECKED_VEHICLES.WRECKED_FN63_4RM","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_250","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_250_MORTAR","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251_17_FLAK","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251_INFRARED","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251_MP","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251_WALKING_STUKA","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SWS","EBP.WRECKED_VEHICLES.WRECKED_HETZER","EBP.WRECKED_VEHICLES.WRECKED_HETZER_BREWUP","EBP.WRECKED_VEHICLES.WRECKED_HOWITZER_105MM_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_IG18_SUPPORT_GUN","EBP.WRECKED_VEHICLES.WRECKED_IS_2_HEAVY_TANK","EBP.WRECKED_VEHICLES.WRECKED_ISU_152_SPG","EBP.WRECKED_VEHICLES.WRECKED_JAGDPANZER_IV","EBP.WRECKED_VEHICLES.WRECKED_JAGDPANZER_IV_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_JAGDTIGER_TD","EBP.WRECKED_VEHICLES.WRECKED_JAGDTIGER_TD_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_KATYUSHA_BM_13N","EBP.WRECKED_VEHICLES.WRECKED_KATYUSHA_BM_13N_MP","EBP.WRECKED_VEHICLES.WRECKED_KING_TIGER","EBP.WRECKED_VEHICLES.WRECKED_KING_TIGER_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_KUBELWAGEN","EBP.WRECKED_VEHICLES.WRECKED_KV_1","EBP.WRECKED_VEHICLES.WRECKED_KV_1_MP","EBP.WRECKED_VEHICLES.WRECKED_KV_2","EBP.WRECKED_VEHICLES.WRECKED_KV_8","EBP.WRECKED_VEHICLES.WRECKED_LAND_MATTRESS","EBP.WRECKED_VEHICLES.WRECKED_M10","EBP.WRECKED_VEHICLES.WRECKED_M10_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M15A1_AA_HALFTRACK","EBP.WRECKED_VEHICLES.WRECKED_M15A1_AA_HALFTRACK_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_M20_UTILITY_CAR","EBP.WRECKED_VEHICLES.WRECKED_M21_MORTAR_HALFTRACK","EBP.WRECKED_VEHICLES.WRECKED_M26_PERSHING","EBP.WRECKED_VEHICLES.WRECKED_M3_HALFTRACK","EBP.WRECKED_VEHICLES.WRECKED_M36","EBP.WRECKED_VEHICLES.WRECKED_M36_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M3A1_SCOUT_CAR","EBP.WRECKED_VEHICLES.WRECKED_M3A1_SCOUT_CAR_MP","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_BULLDOZER","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_BULLDOZER_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_EASY_EIGHT","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_EASY_EIGHT_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_M5_HALFTRACK","EBP.WRECKED_VEHICLES.WRECKED_M5_HALFTRACK_MP","EBP.WRECKED_VEHICLES.WRECKED_M5A1_STUART","EBP.WRECKED_VEHICLES.WRECKED_M8_ARMORED_CAR","EBP.WRECKED_VEHICLES.WRECKED_M8_HMC","EBP.WRECKED_VEHICLES.WRECKED_OPEL_BLITZ_TRUCK","EBP.WRECKED_VEHICLES.WRECKED_OSTWIND_FLAK_PANZER","EBP.WRECKED_VEHICLES.WRECKED_PACK_HOWITZER","EBP.WRECKED_VEHICLES.WRECKED_PANTHER_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_PANTHER_SDKFZ_171","EBP.WRECKED_VEHICLES.WRECKED_PANTHER_SDKFZ_171_BREWUP","EBP.WRECKED_VEHICLES.WRECKED_PANZER_II_LUCHS","EBP.WRECKED_VEHICLES.WRECKED_PANZER_II_LUCHS_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_PANZER_III","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_FROZEN","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161_COMMAND","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161_GAMEPLAY","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161_WEST_GERMAN","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161_WEST_GERMAN_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_PANZERIV_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_PANZERWERFER_SDKFZ_4_1","EBP.WRECKED_VEHICLES.WRECKED_PRIEST","EBP.WRECKED_VEHICLES.WRECKED_RAKETENWERFER","EBP.WRECKED_VEHICLES.WRECKED_SOVIET_76MM_SHERMAN","EBP.WRECKED_VEHICLES.WRECKED_STUG_III_E_SDKFZ_141_1","EBP.WRECKED_VEHICLES.WRECKED_STUG_III_FROZEN","EBP.WRECKED_VEHICLES.WRECKED_STUG_III_G_SDKFZ_141_1","EBP.WRECKED_VEHICLES.WRECKED_STUG_III_G_SDKFZ_141_1_GAMEPLAY","EBP.WRECKED_VEHICLES.WRECKED_STURMTIGER","EBP.WRECKED_VEHICLES.WRECKED_SU_76M","EBP.WRECKED_VEHICLES.WRECKED_SU_85","EBP.WRECKED_VEHICLES.WRECKED_T_34_76","EBP.WRECKED_VEHICLES.WRECKED_T_34_76_02","EBP.WRECKED_VEHICLES.WRECKED_T_34_76_MP","EBP.WRECKED_VEHICLES.WRECKED_T_34_85_RED_BANNER","EBP.WRECKED_VEHICLES.WRECKED_T_34_85_RED_BANNER_MP","EBP.WRECKED_VEHICLES.WRECKED_T_34_85_RED_BANNER_TOW","EBP.WRECKED_VEHICLES.WRECKED_T34_CALLIOPE","EBP.WRECKED_VEHICLES.WRECKED_T70","EBP.WRECKED_VEHICLES.WRECKED_T70_MP","EBP.WRECKED_VEHICLES.WRECKED_TIGER_SDKFZ_181","EBP.WRECKED_VEHICLES.WRECKED_TIGER_SDKFZ_181_SINGLEPLAYER_MISSION","EBP.WRECKED_VEHICLES.WRECKED_WC51","EBP.WRECKED_VEHICLES.WRECKED_WC54_AMBULANCE","EBP.AEF.AEF_AIRDROPPED_MINE_CONTACT_MP","EBP.AEF.AEF_AIRDROPPED_MINE_MP","EBP.AEF.AEF_ALLIEDSUPPLY_STACK_L_01_MP","EBP.AEF.AEF_ATTACK_PLANE","EBP.AEF.AEF_BARBED_WIRE_FENCE_MP","EBP.AEF.AEF_BARRACKS","EBP.AEF.AEF_BASE_STAMPER","EBP.AEF.AEF_GARRISON","EBP.AEF.AEF_MG_NEST","EBP.AEF.AEF_MG_NEST_AEF_BASE","EBP.AEF.AEF_MG_NEST_PERIMETER_MP","EBP.AEF.AEF_MINE_MP","EBP.AEF.AEF_MINE_RIFLEMEN_MP","EBP.AEF.AEF_SANDBAG_DIRTWALL_01","EBP.AEF.AEF_SANDBAG_FENCE","EBP.AEF.AEF_SANDBAGS","EBP.AEF.AEF_SANDBAGWALL","EBP.AEF.AEF_SANDBAGWALL_COVER_SPECIALIZATION","EBP.AEF.AEF_STORAGEBUNKER","EBP.AEF.AEF_SUPPLYTENT","EBP.AEF.AEF_TANK_TRAP_IMPASSABLE_MP","EBP.AEF.AEF_TANK_TRAP_MP","EBP.AEF.AEF_WEAPON_RACK_BAZOOKA_MP","EBP.AEF.AEF_WEAPON_RACK_BROWNING_AUTOMATIC_RIFLE_MP","EBP.AEF.AEF_WEAPON_RACK_DEFAULT_MP","EBP.AEF.AEF_WEAPON_RACK_M1919_LMG","EBP.AEF.AEF_WEAPON_RACK_M1C_GARAND","EBP.AEF.AEF_WEAPON_RACK_M9_BAZOOKA_MP","EBP.AEF.AIRBORNE_BEACON_MP","EBP.AEF.ARMOR_COMMAND_MP","EBP.AEF.ARMOR_COMMAND_SP","EBP.AEF.ARMOR_COMMAND_WRECK_MP","EBP.AEF.ARMORED_RIFLE_COMMAND_MP","EBP.AEF.ARMORED_RIFLE_COMMAND_SP","EBP.AEF.ARMORED_RIFLE_COMMAND_WRECK_MP","EBP.AEF.ASSAULT_ENGINEER_MP","EBP.AEF.ASSAULT_ENGINEER_VEHICLE_CREW_MP","EBP.AEF.AT_TEAM_WEAPON_CREW_MP","EBP.AEF.CAPTAIN_MP","EBP.AEF.CAPTAIN_UNLOCK_MP","EBP.AEF.COMPANY_WEAPONS_POOL_MP","EBP.AEF.COMPANY_WEAPONS_POOL_SP","EBP.AEF.COMPANY_WEAPONS_POOL_WRECK_MP","EBP.AEF.DODGE_WC51_50CAL_MP","EBP.AEF.DODGE_WC51_50CAL_PARADROP","EBP.AEF.DODGE_WC51_AMBULANCE_MP","EBP.AEF.DODGE_WC51_MP","EBP.AEF.DODGE_WC51_MP_PATHFINDERS","EBP.AEF.FIGHTING_POSITION_MP","EBP.AEF.FIGHTING_POSITION_RIFLEMEN_MP","EBP.AEF.HMG_TEAM_WEAPON_CREW_MP","EBP.AEF.HOWITZER_TEAM_WEAPON_CREW_MP","EBP.AEF.INVISI_HEAL_STATION_MP","EBP.AEF.INVISI_REPAIR_STATION_MP","EBP.AEF.JACKSON","EBP.AEF.LIEUTENANT_MP","EBP.AEF.LIEUTENANT_UNLOCK_MP","EBP.AEF.M1_57MM_ANTITANK_GUN_MP","EBP.AEF.M1_75MM_PACK_HOWITZER_MP","EBP.AEF.M1_81MM_MORTAR_MP","EBP.AEF.M10_TANK_DESTROYER_MP","EBP.AEF.M15A1_AA_HALFTRACK_MP","EBP.AEF.M1919A4_30CAL_MACHINE_GUN_MP","EBP.AEF.M1919A4_TEAM_WEAPON_CREW_MP","EBP.AEF.M2_60MM_MORTAR_MP","EBP.AEF.M20_M6_AT_MINE_MP","EBP.AEF.M20_UTILITY_CAR_MP","EBP.AEF.M21_MORTAR_HALFTRACK_MP","EBP.AEF.M26_PERSHING_MP","EBP.AEF.M2HB_50CAL_MACHINE_GUN_MP","EBP.AEF.M3_HALFTRACK_ASSAULT_MP","EBP.AEF.M3_HALFTRACK_MP","EBP.AEF.M36_TANK_DESTROYER_MP","EBP.AEF.M4A3_76MM_SHERMAN_MP","EBP.AEF.M4A3_SHERMAN_BULLDOZER_MP","EBP.AEF.M4A3_SHERMAN_DEMO_BURNOUT","EBP.AEF.M4A3_SHERMAN_MP","EBP.AEF.M4A3E8_SHERMAN_EASY_8_MP","EBP.AEF.M5_HALFTRACK_USF_MP","EBP.AEF.M5A1_STUART_MP","EBP.AEF.M7B1_PRIEST_MP","EBP.AEF.M8_GREYHOUND_MP","EBP.AEF.M8A1_HMC_MP","EBP.AEF.MAJOR_MP","EBP.AEF.MAJOR_RETREAT_POINT_MP","EBP.AEF.MAJOR_UNLOCK_MP","EBP.AEF.MORTAR_TEAM_WEAPON_CREW_MP","EBP.AEF.OBSERVATION_POST_FUEL_AEF_MP","EBP.AEF.OBSERVATION_POST_MUNITION_AEF_MP","EBP.AEF.P47_RECON","EBP.AEF.P47_RECON_PLANE_SWEEP","EBP.AEF.P47_RECON_TRACKING","EBP.AEF.P47_ROCKETS","EBP.AEF.P47_STRAFE","EBP.AEF.PARATROOPER_MP","EBP.AEF.PARATROOPERS_COMBAT_GROUP_PLANE","EBP.AEF.PARATROOPERS_PLANE","EBP.AEF.PARATROOPERS_PLANE_ATGUN","EBP.AEF.PARATROOPERS_PLANE_HMG","EBP.AEF.PARATROOPERS_PLANE_MINES","EBP.AEF.PARATROOPERS_PLANE_PARAS","EBP.AEF.PATHFINDER_IR_MP","EBP.AEF.PATHFINDER_RECON_MP","EBP.AEF.PM_AEF_AIR_SUPPORT_RECON","EBP.AEF.PM_AEF_AIR_SUPPORT_ROCKET","EBP.AEF.PM_AEF_AIR_SUPPORT_ROCKET_ELITE","EBP.AEF.PM_AEF_AIR_SUPPORT_STRAFE","EBP.AEF.PM_AEF_AIR_SUPPORT_STRAFE_ELITE","EBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_PLANE_PARAS","EBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_PLANE_STRAFE","EBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_SPAWNER","EBP.AEF.PM_AEF_AIRBORNE_SUPPLY_DROP_PLANE","EBP.AEF.PM_AEF_FIGHTING_POSITION_TEAMWEAPONS","EBP.AEF.PM_AEF_PINPOINT_ARTY_MARKER_MP","EBP.AEF.PM_AEF_PINPOINT_ARTY_THREE_MARKER_MP","EBP.AEF.PM_ARMOR_COMMAND_BAZOOKA_RACK","EBP.AEF.PM_ARMOR_COMMAND_LMG_RACK","EBP.AEF.PM_ATTACHED_MEDIC","EBP.AEF.PM_ATTACHED_SEARGENT","EBP.AEF.PM_P47_FLYBY","EBP.AEF.PM_P47_MG_STRAFE","EBP.AEF.PM_P47_ROCKET_STRAFE","EBP.AEF.RANGER_COMMANDER_MP","EBP.AEF.RANGER_MP","EBP.AEF.REAR_ECHELON_RADIOMAN_MP","EBP.AEF.REAR_ECHELON_RESERVE_TROOP_MP","EBP.AEF.REAR_ECHELON_TROOP_CAPT_MP","EBP.AEF.REAR_ECHELON_TROOP_MP","EBP.AEF.REPLACEMENT_ARMOR_COMMAND_MP","EBP.AEF.REPLACEMENT_ARMORED_RIFLE_COMMAND_MP","EBP.AEF.REPLACEMENT_COMPANY_WEAPONS_POOL_MP","EBP.AEF.RIFLE_COMMAND_MP","EBP.AEF.RIFLE_COMMAND_SP","EBP.AEF.RIFLE_COMMAND_WRECK_MP","EBP.AEF.RIFLEMAN_SOLDIER_CAPTAIN_MP","EBP.AEF.RIFLEMAN_SOLDIER_GROUP_MP","EBP.AEF.RIFLEMAN_SOLDIER_LIEUTENANT_MP","EBP.AEF.RIFLEMAN_SOLDIER_MP","EBP.AEF.SHERMAN_BARRIER_DEFORM_MP","EBP.AEF.SHERMAN_BARRIER_DIRT_MP","EBP.AEF.SHERMAN_BARRIER_MUD_MP","EBP.AEF.SHERMAN_BARRIER_RUBBLE_MP","EBP.AEF.SHERMAN_BARRIER_SNOW_MP","EBP.AEF.T34_CALLIOPE_MP","EBP.AEF.TEMP_ACTIVE_STRUCTURE_SEARCHLIGHT","EBP.AEF.USF_MEDIC_MP","EBP.AEF.VEHICLE_CREW_BAZOOKA_MP","EBP.AEF.VEHICLE_CREW_TROOP_MP","EBP.AEF.VEHICLE_CREW_TROOP_REPAIR_STATION_MP","SBP.AEF.AEF_AIR_SUPPORT_RECON","SBP.AEF.AEF_AIR_SUPPORT_ROCKET","SBP.AEF.AEF_AIR_SUPPORT_ROCKET_ELITE","SBP.AEF.AEF_AIR_SUPPORT_STRAFE","SBP.AEF.AEF_AIR_SUPPORT_STRAFE_ELITE","SBP.AEF.AEF_ATTACK_PLANE_SQUAD","SBP.AEF.AEF_HALFTRACK_SQUAD_MP","SBP.AEF.ASSAULT_ENGINEER_SQUAD_5_MAN_MP","SBP.AEF.ASSAULT_ENGINEER_SQUAD_MP","SBP.AEF.CAPTAIN_SQUAD_MP","SBP.AEF.DODGE_WC51_50CAL_SQUAD_MP","SBP.AEF.DODGE_WC51_AMBULANCE_SQUAD_MP","SBP.AEF.DODGE_WC51_PATHFINDER_SQUAD_MP","SBP.AEF.DODGE_WC51_SQUAD_MP","SBP.AEF.JACKSON_SQUAD","SBP.AEF.LIEUTENANT_SQUAD_MP","SBP.AEF.M1_57MM_AT_GUN_SQUAD_BOB","SBP.AEF.M1_57MM_AT_GUN_SQUAD_MP","SBP.AEF.M1_75MM_PACK_HOWITZER_SQUAD_MP","SBP.AEF.M1_81MM_MORTAR_SQUAD_MP","SBP.AEF.M10_TANK_DESTROYER_SQUAD_MP","SBP.AEF.M15A1_AA_HALFTRACK_SQUAD_MP","SBP.AEF.M1919A4_HMG_SQUAD_MP","SBP.AEF.M2_60MM_MORTAR_CORE_SQUAD_MP","SBP.AEF.M2_60MM_MORTAR_SQUAD_MP","SBP.AEF.M2_60MM_MORTAR_SQUAD_MP_CLONE","SBP.AEF.M20_ASSAULT_ENGY_ANTITANK_SQUAD_MP","SBP.AEF.M20_UTILITY_CAR_SQUAD_MP","SBP.AEF.M21_MORTAR_HALFTRACK_SQUAD_MP","SBP.AEF.M26_PERSHING_MP","SBP.AEF.M2HB_50CAL_HMG_SQUAD_MP","SBP.AEF.M3_HALFTRACK_SQUAD_ASSAULT_MP","SBP.AEF.M3_HALFTRACK_SQUAD_MP","SBP.AEF.M36_TANK_DESTROYER_SQUAD_MP","SBP.AEF.M4A3_76MM_SHERMAN_BULLDOZER_SQUAD_MP","SBP.AEF.M4A3_76MM_SHERMAN_SQUAD_MP","SBP.AEF.M4A3_SHERMAN_SQUAD_DEMO_BURNOUT","SBP.AEF.M4A3_SHERMAN_SQUAD_MP","SBP.AEF.M4A3E8_SHERMAN_EASY_8_SQUAD_MP","SBP.AEF.M5A1_STUART_SQUAD_MP","SBP.AEF.M7B1_PRIEST_SQUAD_MP","SBP.AEF.M8_GREYHOUND_SQUAD_MP","SBP.AEF.M8A1_HMC_SQUAD_MP","SBP.AEF.MAJOR_SQUAD_MP","SBP.AEF.P47_FLYBY","SBP.AEF.P47_MG_STRAFE","SBP.AEF.P47_RECON","SBP.AEF.P47_RECON_PLANE_SWEEP","SBP.AEF.P47_RECON_TRACKING","SBP.AEF.P47_ROCKETS","SBP.AEF.P47_ROCKETS_STRAFE","SBP.AEF.P47_STRAFES","SBP.AEF.PARATROOPER_COMBAT_GROUP_SQUAD_MP","SBP.AEF.PARATROOPER_SQUAD_MP","SBP.AEF.PARATROOPER_SQUAD_SUPPORT_MP","SBP.AEF.PARATROOPERS_COMBAT_GROUP_PLANE","SBP.AEF.PARATROOPERS_PLANE","SBP.AEF.PARATROOPERS_PLANE_ATGUN","SBP.AEF.PARATROOPERS_PLANE_HMG","SBP.AEF.PARATROOPERS_PLANE_MINES","SBP.AEF.PARATROOPERS_PLANE_PARAS","SBP.AEF.PATHFINDER_SQUAD_MP","SBP.AEF.PATHFINDER_SQUAD_RECON_MP","SBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_PLANE_PARAS","SBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_PLANE_STRAFE","SBP.AEF.PM_AEF_AIRBORNE_SUPPLY_DROP_PLANE","SBP.AEF.PM_M3_HALFTRACK_SQUAD_OMCG","SBP.AEF.PM_RIFLEMEN_SQUAD_OMCG","SBP.AEF.RANGER_SQUAD_COMMANDER_MP","SBP.AEF.RANGER_SQUAD_MP","SBP.AEF.REAR_ECHELON_SQUAD_MP","SBP.AEF.RIFLEMEN_SQUAD_MP","SBP.AEF.RIFLEMEN_SQUAD_VETERAN_MP","SBP.AEF.T34_CALLIOPE_SQUAD_MP","SBP.AEF.USF_MEDIC_SQUAD_MP","SBP.AEF.VEHICLE_CREW_BAZOOKA_SQUAD_MP","SBP.AEF.VEHICLE_CREW_SQUAD_MP","ABILITY.AEF.ACTIVATE_REPAIR_STATION_MP","ABILITY.AEF.AEF_BARBED_WIRE_CUTTING_ABILITY_ASSUALT_ENGINEERS_MP","ABILITY.AEF.AEF_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.AEF.AEF_BARBED_WIRE_CUTTING_ABILITY_NO_REQUIREMENT_MP","ABILITY.AEF.AEF_HQ_ENGINEER_CALL_IN","ABILITY.AEF.AEF_REPAIR_ABILITY_REAR_ECHELON_MP","ABILITY.AEF.AEF_REPAIR_ABILITY_VEHICLE_CREW_MP","ABILITY.AEF.AEF_REPAIR_CRITICAL_MP","ABILITY.AEF.AIR_DROP_COMBAT_GROUP","ABILITY.AEF.AMBULANCE_HEAL_AREA","ABILITY.AEF.ARTILLERY_155MM","ABILITY.AEF.ARTILLERY_SMOKE_BARRAGE","ABILITY.AEF.ASSAULT_ENGINEER_DISPATCH","ABILITY.AEF.BAR_SUPPRESSION_ABILITY","ABILITY.AEF.BAZOOKA_DEPLOY_MP","ABILITY.AEF.BEACON_DISABLE","ABILITY.AEF.CALLIOPE_ROCKET_BARRAGE_MP","ABILITY.AEF.CAPTAIN_SUPERVISE","ABILITY.AEF.CMD_PARATROOPERS_FROM_PATHFINDERS","ABILITY.AEF.COMBAT_ENGINEER_TIMED_DEMO_MP","ABILITY.AEF.COMBINED_ARMS","ABILITY.AEF.DODGE_WC51_DISPATCH","ABILITY.AEF.ELITE_RIFLEMEN","ABILITY.AEF.ELITE_VEHICLE_CREWS","ABILITY.AEF.FATALITY_P47_ROCKET_ATTACK","ABILITY.AEF.FATALITY_PARATROOPERS_PARADROP","ABILITY.AEF.FATALITY_SMOKE_FLARES","ABILITY.AEF.FATALITY_WHITE_PHOSPHOROUS_BARRAGE","ABILITY.AEF.FLANKING_SPEED","ABILITY.AEF.FORWARD_OBSERVERS_ALWAYS_ON","ABILITY.AEF.FORWARD_OBSERVERS_UNLOCK_2","ABILITY.AEF.GREYHOUND_RECON_DISPATCH","ABILITY.AEF.LIEUTENANT_CAPTAIN_ON_ME_AURA_MP","ABILITY.AEF.M1_81MM_MORTAR_TEAM_MORTAR_BARRAGE_MP","ABILITY.AEF.M1_81MM_MORTAR_TEAM_SMOKE_BARRAGE_MP","ABILITY.AEF.M1_81MM_MORTAR_WHITE_PHOSPHOROUS_BARRAGE_ABILITY_MP","ABILITY.AEF.M1_ATGUN_PIERCING_ABILITY","ABILITY.AEF.M1_ATGUN_TAKE_AIM_ABILITY","ABILITY.AEF.M10_APCPC_SHELLS","ABILITY.AEF.M10_APCPC_SHELLS_VET","ABILITY.AEF.M10_DEPLOY","ABILITY.AEF.M15A1_AA_MODE_MP","ABILITY.AEF.M2_60MM_MORTAR_TEAM_MORTAR_BARRAGE_MP","ABILITY.AEF.M2_60MM_MORTAR_TEAM_SMOKE_BARRAGE_MP","ABILITY.AEF.M20_MARK_VEHICLE","ABILITY.AEF.M20_SMOKE","ABILITY.AEF.M21_HEAVY_HE_SHORT_DELAY_MORTAR_BARRAGE_MP","ABILITY.AEF.M21_MORTAR_BARRAGE_MP","ABILITY.AEF.M21_MORTAR_BARRAGE_VICTOR_TARGET_MP","ABILITY.AEF.M21_MORTAR_HALFTRACK_DISPATCH","ABILITY.AEF.M21_MORTAR_WHITE_PHOSPHOROUS_BARRAGE_MP","ABILITY.AEF.M23_SMOKE_STREAM_RIFLE_GRENADE_MP","ABILITY.AEF.M23_SMOKE_STREAM_RIFLE_GRENADE_VET_MP","ABILITY.AEF.M26_PERSHING_DISPATCH","ABILITY.AEF.M2HB_50CAL_AP_ROUNDS_MP","ABILITY.AEF.M2HB_HMG_SPRINT_MP","ABILITY.AEF.M3_HALFTRACK_GROUP","ABILITY.AEF.M3_HALFTRACK_SPEED_BOOST_MP","ABILITY.AEF.M36_M8_CONCEALING_SMOKE_VET","ABILITY.AEF.M5_QUAD_HALFTRACK_DISPATCH","ABILITY.AEF.M5_STUART_DAMAGE_ENGINE","ABILITY.AEF.M5_STUART_SHELL_SHOCK","ABILITY.AEF.M7B1_PRIEST_105MM_BARRAGE_ABILITY_MP","ABILITY.AEF.M7B1_PRIEST_105MM_BARRAGE_ABILITY_VICTOR_TARGET_MP","ABILITY.AEF.M7B1_PRIEST_105MM_SMOKE_BARRAGE_ABILITY_MP","ABILITY.AEF.M8_CANISTER_SHOT","ABILITY.AEF.M8_LAY_HEAVY_MINE","ABILITY.AEF.M8A1_HMC_75MM_BARRAGE_ABILITY_MP","ABILITY.AEF.M8A1_HMC_75MM_BARRAGE_ABILITY_VICTOR_TARGET_MP","ABILITY.AEF.M8A1_HMC_SMOKE_BARRAGE_MP","ABILITY.AEF.MAJOR_ARTILLERY","ABILITY.AEF.MAJOR_ARTILLERY_FAKE","ABILITY.AEF.MAJOR_QUICK_RECON_RUN","ABILITY.AEF.MAJOR_QUICK_RECON_RUN_IMPROVED","ABILITY.AEF.MEDIC_AUTO_HEAL","ABILITY.AEF.MK2_FRAGMENTATION_GRENADE_MP","ABILITY.AEF.OFF_MAP_SMOKE_ARTILLERY","ABILITY.AEF.OFFICER_RETREAT_POINT_MP","ABILITY.AEF.OFFICER_STOP_RETREAT_MP","ABILITY.AEF.OUT_OF_FUEL_SP","ABILITY.AEF.P47_RECON_MP","ABILITY.AEF.P47_ROCKET_ATTACK","ABILITY.AEF.PACK_HOWITZER_75MM_BARRAGE_ABILITY_HEAT_MP","ABILITY.AEF.PACK_HOWITZER_75MM_BARRAGE_ABILITY_MP","ABILITY.AEF.PACK_HOWITZER_75MM_BARRAGE_ABILITY_VET3_MP","ABILITY.AEF.PACK_HOWITZER_75MM_BARRAGE_ABILITY_VICTOR_TARGET_MP","ABILITY.AEF.PACK_HOWITZER_WHITE_PHOSPHOROUS_BARRAGE_ABILITY_MP","ABILITY.AEF.PARADROP_MACHINE_GUN","ABILITY.AEF.PARADROPS_ANTI_TANK_GUN","ABILITY.AEF.PARATROOPER_ASSAULT_MOVE_TEST_MP","ABILITY.AEF.PARATROOPER_MK2_FRAGMENTATION_GRENADE_MP","ABILITY.AEF.PARATROOPER_SUPPRESSING_FIRE_ABILITY_MP","ABILITY.AEF.PARATROOPER_TIMED_DEMO_MP","ABILITY.AEF.PARATROOPERS_PARADROP","ABILITY.AEF.PATHFINDER_ARTILLERY_UNLOCK","ABILITY.AEF.PATHFINDER_IN_COVER_STATIONARY_CAMOUFLAGE_IMPROVED_MP","ABILITY.AEF.PATHFINDER_IN_COVER_STATIONARY_CAMOUFLAGE_MP","ABILITY.AEF.PATHFINDER_PLANT_BEACON","ABILITY.AEF.PATHFINDERS_DISPATCH","ABILITY.AEF.PATHFINDERS_RECON_DISPATCH","ABILITY.AEF.PERSHING_HVAP_PIERCING_SHOT_ABILITY","ABILITY.AEF.PRIEST_ARTILLERY_BARRAGE_CREEPING_MP","ABILITY.AEF.PRIEST_DISPATCH","ABILITY.AEF.RANGER_BUNDLED_GRENADE_MP","ABILITY.AEF.RANGER_LIMITED_DEMO_MP","ABILITY.AEF.RANGER_MK2_FRAGMENTATION_GRENADE_MP","ABILITY.AEF.RANGER_SPRINT_MP","ABILITY.AEF.RANGERS_DISPATCH","ABILITY.AEF.REAR_ECHELON_VOLLEY_FIRE_ABILITY_MP","ABILITY.AEF.RECON_SWEEP","ABILITY.AEF.REFUEL_TANK_SP","ABILITY.AEF.RIFLEMAN_AT_RIFLE_GRENADE_VET","ABILITY.AEF.RIFLEMAN_FIRE_UP","ABILITY.AEF.RIFLEMAN_FIRE_UP_MP","ABILITY.AEF.RIFLEMEN_30_CALIBER_LMG","ABILITY.AEF.RIFLEMEN_DEFENSIVE","ABILITY.AEF.RIFLEMEN_DEFENSIVE_BUILDINGS","ABILITY.AEF.RIFLEMEN_FIRE_FLARES_ABILITY_MP","ABILITY.AEF.RIFLEMEN_FLAMETHROWERS","ABILITY.AEF.RIFLEMEN_FLARES","ABILITY.AEF.SHERMAN_AMMO_SWITCH_AP_SHELL_MP","ABILITY.AEF.SHERMAN_AMMO_SWITCH_HE_SHELL_MP","ABILITY.AEF.SHERMAN_BULLDOZER_CONSTRUCT_BARRIER_MP","ABILITY.AEF.SHERMAN_BULLDOZER_DESTROY_BARRIER_MP","ABILITY.AEF.SHERMAN_BULLDOZER_DISPATCH","ABILITY.AEF.SHERMAN_CALLIOPE_DISPATCH","ABILITY.AEF.SHERMAN_EASY8_DISPATCH","ABILITY.AEF.SIEGE_240MM_BARRAGE","ABILITY.AEF.SMOKE_SHERMAN_MORTAR_BARRAGE_BULLDOZER_MP","ABILITY.AEF.SMOKE_SHERMAN_MORTAR_BARRAGE_MP","ABILITY.AEF.SP_240MM_OFF_MAP_BARRAGE","ABILITY.AEF.SP_QUICK_RECON_RUN","ABILITY.AEF.SUPPORT_ARTILLERY","ABILITY.AEF.SUPPORT_ARTILLERY_DECOY","ABILITY.AEF.TANK_RIDERS_AUTO_UNLOAD_MP","ABILITY.AEF.TIME_ON_TARGET_ARTILLERY","ABILITY.AEF.USF_HOLD_FIRE_MP","ABILITY.AEF.USF_HOLD_FIRE_PACK_HOWITZER_MP","ABILITY.AEF.USF_MEDIC_HEAL_MP","ABILITY.AEF.USF_SHERMAN_BULLDOZER_HOLD_FIRE_MP","ABILITY.AEF.USF_STRAFING_RUN","ABILITY.AEF.USF_VEHICLE_HOLD_FIRE_MP","ABILITY.AEF.VEHICLE_CREW_AUTO_REPAIR","ABILITY.AEF.VEHICLE_DECREW_GENERIC_MP","ABILITY.AEF.VEHICLE_DECREW_M20_CREW_MP","ABILITY.AEF.VEHICLE_DECREW_MEDICS_MP","ABILITY.AEF.VEHICLE_DECREW_VEHICLE_CREW_MP","ABILITY.AEF.WC51_SPEED_BOOST_MP","ABILITY.AEF.WITHDRAW_AND_REFIT","UPG.AEF.ABILITY_LOCK_OUT_CAPTAIN_ABILITIES","UPG.AEF.ABILITY_LOCK_OUT_LIEUTENANT_ABILITIES","UPG.AEF.ABILITY_LOCK_OUT_PARATROOPERS_LANDED","UPG.AEF.ABILITY_REFUEL_LOCKOUT","UPG.AEF.ABILITY_TRANSFER_ORDERS_LOCK_OUT","UPG.AEF.ARTILLERY_155MM","UPG.AEF.ARTILLERY_155MM_BLIND","UPG.AEF.ARTILLERY_WHITE_PHOSPHOROUS","UPG.AEF.ASSAULT_ENGINEER_DISPATCH","UPG.AEF.ASSAULT_ENGINEER_FLAMETHROWER","UPG.AEF.BAR_UPGRADE_MP","UPG.AEF.BAZOOKA_UPGRADE_MP","UPG.AEF.CAPTAIN_BAZOOKA_UPGRADE_MP","UPG.AEF.CAPTAIN_DISPATCHED_UPGRADE_MP","UPG.AEF.COMBINED_ARMS_MP","UPG.AEF.DODGE_WC51_DISPATCH","UPG.AEF.ELITE_RIFLEMEN","UPG.AEF.ELITE_VEHICLE_CREWS","UPG.AEF.FIGHTING_POSITION_MG_ADDITION_MP","UPG.AEF.FIRE_UP_RIFLEMEN","UPG.AEF.FORWARD_OBSERVERS_UNLOCK","UPG.AEF.GREYHOUND_RECON_DISPATCH","UPG.AEF.LIEUTENANT_DISPATCHED_UPGRADE_MP","UPG.AEF.M10_DEPLOY","UPG.AEF.M20_SIDE_SKIRTS_MP","UPG.AEF.M21_MORTAR_HALFTRACK_DISPATCH","UPG.AEF.M26_PERSHING_DISPATCH","UPG.AEF.M3_HALFTRACK_GROUP","UPG.AEF.M3_REPAIR_STATION_MP","UPG.AEF.M5_HALFTRACK_DISPATCH","UPG.AEF.M8_GREYHOUND_SIDE_SKIRTS_MP","UPG.AEF.M8_TOP_GUNNER_MP","UPG.AEF.MAJOR_DISPATCHED_UPGRADE_MP","UPG.AEF.MEDIC_AUTO_HEAL_REFRESH","UPG.AEF.MINESWEEPER_UPGRADE_MP","UPG.AEF.NO_OFFICER_SPAWN_MP","UPG.AEF.OFF_SMOKE_BARRAGE","UPG.AEF.P47_RECON","UPG.AEF.P47_ROCKET_ATTACK","UPG.AEF.PARADROP_ANTI_TANK_GUN","UPG.AEF.PARADROP_MACHINE_GUN","UPG.AEF.PARADROPPED_SUPPORT_DROP","UPG.AEF.PARATROOPER_M1919A6_LMG_MP","UPG.AEF.PARATROOPER_THOMPSON_SUB_MACHINE_GUN_UPGRADE_MP","UPG.AEF.PARATROOPERS","UPG.AEF.PATHFINDERS","UPG.AEF.PATHFINDERS_RECON","UPG.AEF.PRIEST_DISPATCH","UPG.AEF.RANGER_DISPATCH","UPG.AEF.RANGER_THOMPSON_SUB_MACHINE_GUN_UPGRADE_MP","UPG.AEF.REAR_ECHELON_HACK_WITHDRAWING","UPG.AEF.RECON_SWEEP","UPG.AEF.RIFLE_COMMAND_GRENADE_MP","UPG.AEF.RIFLEMEN_30_CALIBER_LMG","UPG.AEF.RIFLEMEN_DEFENSIVE_BUILDINGS","UPG.AEF.RIFLEMEN_FLAMETHROWER","UPG.AEF.RIFLEMEN_FLAMETHROWER_UNLOCK","UPG.AEF.RIFLEMEN_FLARES","UPG.AEF.SHERMAN_BULLDOZER_DISPATCH","UPG.AEF.SHERMAN_EASY8_DISPATCH","UPG.AEF.SHERMAN_HE_ROUNDS","UPG.AEF.SHERMAN_TOP_GUNNER_MP","UPG.AEF.SIEGE_240MM_ARTILLERY","UPG.AEF.SMOKE_BARRAGE","UPG.AEF.T34_SHERMAN_CALLIOPE_DISPATCH","UPG.AEF.TECH_TREE_V1","UPG.AEF.TEMP_SPAWN_BASE_STAMP_MP","UPG.AEF.TIME_ON_TARGET_ARTILLERY","UPG.AEF.TOP_GUNNER_UPGRADED","UPG.AEF.USF_M5_HALFTRACK_72K_AA_GUN_PACKAGE_MP","UPG.AEF.USF_STRAFING_RUN","UPG.AEF.VEHICLE_CREW_THOMPSON_SUB_MACHINE_GUN_UPGRADE_MP","UPG.AEF.WEAPON_RACK_UPGRADE_MP","UPG.AEF.WITHDRAW_AND_REFIT","EBP.BRITISH.AEC_ARMOURED_CAR_MP","EBP.BRITISH.AIR_SUPPORT_OFFICER_MP","EBP.BRITISH.AVRE_VEHICLE_CREW_MP","EBP.BRITISH.BRIT_17_POUNDER_GUN_MP","EBP.BRITISH.BRIT_17_POUNDER_PIT_COMMANDER_MP","EBP.BRITISH.BRIT_17_POUNDER_PIT_MP","EBP.BRITISH.BRIT_25_POUNDER_HOWITZER_MP","EBP.BRITISH.BRIT_25_POUNDER_HOWITZER_TEMP_MP","EBP.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT","EBP.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT_COMMANDER_MP","EBP.BRITISH.BRIT_6_POUNDER_AT_GUN_MP","EBP.BRITISH.BRIT_BARBED_WIRE_FENCE_MP","EBP.BRITISH.BRIT_BOFORS_40MM_AUTOCANNON_COMMANDER_MP","EBP.BRITISH.BRIT_BOFORS_40MM_AUTOCANNON_MP","EBP.BRITISH.BRIT_EMPLACEMENT_SMALL","EBP.BRITISH.BRIT_FORWARD_HQ_COMMANDER_MP","EBP.BRITISH.BRIT_FORWARD_HQ_MP","EBP.BRITISH.BRIT_FWD_HQ_WEAPON_RACK_BREN_LMG_MP","EBP.BRITISH.BRIT_FWD_HQ_WEAPON_RACK_PIAT_LAUNCHER_MP","EBP.BRITISH.BRIT_LAND_MATTRESS_LAUNCHER_MP","EBP.BRITISH.BRIT_MEDIC_EXTRA_ENTITY_MP","EBP.BRITISH.BRIT_MEDIC_WITH_PISTOL_MP","EBP.BRITISH.BRIT_MINE_COMMANDER_MP","EBP.BRITISH.BRIT_MINE_MP","EBP.BRITISH.BRIT_RETREAT_POINT_MP","EBP.BRITISH.BRIT_SANDBAG_FENCE","EBP.BRITISH.BRIT_WEAPON_RACK_BREN_LMG_MP","EBP.BRITISH.BRIT_WEAPON_RACK_PIAT_LAUNCHER_MP","EBP.BRITISH.BRITISH_25LB_HOWITZER_GUN_CREW_MP","EBP.BRITISH.BRITISH_6LB_AT_GUN_CREW_MP","EBP.BRITISH.BRITISH_BASE_STAMPER","EBP.BRITISH.BRITISH_BUILDING_1_MP","EBP.BRITISH.BRITISH_BUILDING_1_UNBUILT_MP","EBP.BRITISH.BRITISH_BUILDING_1_WRECK_MP","EBP.BRITISH.BRITISH_BUILDING_2_MP","EBP.BRITISH.BRITISH_BUILDING_2_UNBUILT_MP","EBP.BRITISH.BRITISH_BUILDING_2_WRECK_MP","EBP.BRITISH.BRITISH_BUNKER_STARTING_POSITION_MP","EBP.BRITISH.BRITISH_HMG_PLANE","EBP.BRITISH.BRITISH_HMG_TEAM_CREW_MP","EBP.BRITISH.BRITISH_HQ_SANDBAGS_01_MP","EBP.BRITISH.BRITISH_HQ_TRUCK_MP","EBP.BRITISH.BRITISH_HQ_TRUCK_WRECK_MP","EBP.BRITISH.BRITISH_LAND_MATTRESS_TEAM_CREW_MP","EBP.BRITISH.BRITISH_MACHINE_GUN_MP","EBP.BRITISH.BRITISH_MORTAR_TEAM_CREW_MP","EBP.BRITISH.BRITISH_RADIO_BEACON","EBP.BRITISH.BRITISH_SANDBAG_FENCE_MP","EBP.BRITISH.CENTAUR_AA_MK2_MP","EBP.BRITISH.CHURCHILL_AVRE_MP","EBP.BRITISH.CHURCHILL_CROCODILE_MP","EBP.BRITISH.CHURCHILL_DEFAULT_MP","EBP.BRITISH.COMET_MP","EBP.BRITISH.COMMANDO_AIR_LANDING_MP","EBP.BRITISH.COMMANDO_MP","EBP.BRITISH.COMMANDO_PIAT_MP","EBP.BRITISH.CROMWELL_MK4_75MM_MP","EBP.BRITISH.FIELD_HOSPITAL_MEDIC_MP","EBP.BRITISH.FORWARD_OBSERVATION_OFFICER_MP","EBP.BRITISH.GLIDER_COMMANDOS_ONLY","EBP.BRITISH.GLIDER_HEADQUARTERS","EBP.BRITISH.HQ_FIELD_ARTILLERY_MP","EBP.BRITISH.INVISIBLE_FLAME_MORTAR_ICON","EBP.BRITISH.M3_HALFTRACK_RESUPPLY_MP","EBP.BRITISH.PARATROOPERS_PLANE_ATGUN_MATT_TEST_MP","EBP.BRITISH.PARATROOPERS_PLANE_VICKERS_MATT_TEST_MP","EBP.BRITISH.RECON_HAWKER_TYPHOON_ASSAULT_MP","EBP.BRITISH.RECON_HAWKER_TYPHOON_MP","EBP.BRITISH.REPAIR_SAPPER_MP","EBP.BRITISH.ROCKET_HAWKER_TYPHOON_MP","EBP.BRITISH.SAPPER_MP","EBP.BRITISH.SAPPER_RECOVERY_MP","EBP.BRITISH.SEXTON_SPG_MP","EBP.BRITISH.SHERMAN_FIREFLY_M4A2_MP","EBP.BRITISH.SLIT_TRENCH_MP","EBP.BRITISH.SNIPER_BRITISH_MP","EBP.BRITISH.SPITFIRE_RECON_PLANE","EBP.BRITISH.STRAFE_HAWKER_TYPHOON_MP","EBP.BRITISH.TOMMY_MP","EBP.BRITISH.TOMMY_RECON_MP","EBP.BRITISH.UNIVERSAL_CARRIER_MP","EBP.BRITISH.UNIVERSAL_CARRIER_RESUPPLY_MP","EBP.BRITISH.VALENTINE_MORTAR","EBP.BRITISH.VALENTINE_OBSERVATION_MP","EBP.BRITISH.VEHICLE_CREW_MP","SBP.BRITISH.AEC_ARMOURED_CAR_SQUAD_MP","SBP.BRITISH.AIR_SUPPORT_OFFICER_SQUAD_MP","SBP.BRITISH.AVRE_VEHICLE_CREW_SQUAD_MP","SBP.BRITISH.BRIT_17_POUNDER_AT_GUN_SQUAD_COMMANDER_MP","SBP.BRITISH.BRIT_17_POUNDER_AT_GUN_SQUAD_MP","SBP.BRITISH.BRIT_25_POUNDER_HOWITZER_SQUAD_MP","SBP.BRITISH.BRIT_25_POUNDER_HOWITZER_SQUAD_TEMP_MP","SBP.BRITISH.BRIT_3_INCH_MORTAR_TEAM_COMMANDER_MP","SBP.BRITISH.BRIT_3_INCH_MORTAR_TEAM_MP","SBP.BRITISH.BRIT_6_POUNDER_AT_GUN_SQUAD_MP","SBP.BRITISH.BRIT_BOFORS_40MM_AUTOCANNON_SQUAD_COMMANDER_MP","SBP.BRITISH.BRIT_BOFORS_40MM_AUTOCANNON_SQUAD_MP","SBP.BRITISH.BRIT_BREN_LMG_WEAPON_RACK_UI_FAKE_MP","SBP.BRITISH.BRIT_FORWARD_HQ_MP","SBP.BRITISH.BRIT_LAND_MATTRESS_LAUNCHER_SQUAD_MP","SBP.BRITISH.BRIT_MEDIC_SQUAD_MP","SBP.BRITISH.BRIT_PIAT_LAUNCHER_WEAPON_RACK_UI_FAKE_MP","SBP.BRITISH.BRITISH_CARGO_PLANE","SBP.BRITISH.BRITISH_HMG_PLANE","SBP.BRITISH.BRITISH_MACHINE_GUN_SQUAD_MP","SBP.BRITISH.CENTAUR_AA_MK2_SQUAD_MP","SBP.BRITISH.CHURCHILL_AVRE_SQUAD_MP","SBP.BRITISH.CHURCHILL_CROCODILE_MP","SBP.BRITISH.CHURCHILL_DEFAULT_SQUAD_MP","SBP.BRITISH.COMET_TANK_SQUAD_MP","SBP.BRITISH.COMMANDO_SQUAD_MP","SBP.BRITISH.COMMANDO_SQUAD_PIAT_MP","SBP.BRITISH.CROMWELL_MK4_75MM_SQUAD_MP","SBP.BRITISH.FORWARD_HQ_MP","SBP.BRITISH.FORWARD_OBSERVATION_SQUAD_MP","SBP.BRITISH.GLIDER_COMMANDOS_ONLY_MP","SBP.BRITISH.GLIDER_HEADQUARTERS_MP","SBP.BRITISH.INFILTRATION_COMMANDO_SQUAD_MP","SBP.BRITISH.M3_HALFTRACK_SQUAD__RESUPPLY_MP","SBP.BRITISH.PARATROOPERS_PLANE_ATGUN_BRITISH_MATT_TEST_MP","SBP.BRITISH.PARATROOPERS_PLANE_VICKERS_BRITISH_MATT_TEST_MP","SBP.BRITISH.RECON_HAWKER_TYPHOON_ASSAULT_MP","SBP.BRITISH.RECON_HAWKER_TYPHOON_MP","SBP.BRITISH.ROCKET_HAWKER_TYPHOON_MP","SBP.BRITISH.SAPPER_SQUAD_DEMOLITION_MP","SBP.BRITISH.SAPPER_SQUAD_MP","SBP.BRITISH.SAPPER_SQUAD_RECOVERY_MP","SBP.BRITISH.SEXTON_SPG_SQUAD_MP","SBP.BRITISH.SHERMAN_FIREFLY_SQUAD_MP","SBP.BRITISH.SNIPER_BRITISH_SQUAD_MP","SBP.BRITISH.SPITFIRE_RECON_PLANE","SBP.BRITISH.STRAFE_HAWKER_TYPHOON_MP","SBP.BRITISH.TOMMY_SQUAD_FLAME_MP","SBP.BRITISH.TOMMY_SQUAD_MP","SBP.BRITISH.TOMMY_SQUAD_RECON_MP","SBP.BRITISH.TOMMY_SQUAD_TANK_HUNTER_MP","SBP.BRITISH.UNIVERSAL_CARRIER_RESUPPLY","SBP.BRITISH.UNIVERSAL_CARRIER_SQUAD_MP","SBP.BRITISH.VALENTINE_MORTAR","SBP.BRITISH.VALENTINE_OBSERVATION_MP","SBP.BRITISH.VEHICLE_CREW_STANDARD_SQUAD_MP","ABILITY.BRITISH.ADVANCED_ASSEMBLY","ABILITY.BRITISH.ADVANCED_COVER_COMBAT","ABILITY.BRITISH.AEC_DEFENSIVE_SMOKE","ABILITY.BRITISH.AEC_TREAD_SHOTS_MP","ABILITY.BRITISH.ALLIED_STRATEGIC_BOMBING","ABILITY.BRITISH.ARTILLERY_COVER","ABILITY.BRITISH.ASSAULT","ABILITY.BRITISH.ASSAULT_GRENADES","ABILITY.BRITISH.AT_GUN_AIRDROP","ABILITY.BRITISH.AVRE_CREW_DEMOLITION_CHARGE_MP","ABILITY.BRITISH.AVRE_CREW_SHRAPNELL_GRENADE_MP","ABILITY.BRITISH.AVRE_SPIGOT_MORTAR_ATTACK_MP","ABILITY.BRITISH.AVRE_SPIGOT_MORTAR_ATTACK_VET_3_MP","ABILITY.BRITISH.AVRE_SPIGOT_MORTAR_RELOAD_MP","ABILITY.BRITISH.AVRE_VEHICLE_DECREW_VEHICLE_CREW_MP","ABILITY.BRITISH.BOFORS_SUPPRESSIVE_BARRAGE_ABILITY_MP","ABILITY.BRITISH.BOFORS_SUPPRESSIVE_BARRAGE_ABILITY_VICTOR_TARGET_MP","ABILITY.BRITISH.BREAKTHROUGH_OPERATION","ABILITY.BRITISH.BRIT_17_POUNDER_FACING_ORDER_MP","ABILITY.BRITISH.BRIT_17_POUNDER_FLARES_ABILITY_MP","ABILITY.BRITISH.BRIT_17_POUNDER_PIERCING_SHELL_ABILITY_MP","ABILITY.BRITISH.BRIT_17_POUNDER_PIERCING_SHELL_ABILITY_VICTOR_TARGET_MP","ABILITY.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT_BARRAGE_MP","ABILITY.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT_BARRAGE_VICTOR_TARGET_MP","ABILITY.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT_SMOKE_BARRAGE_MP","ABILITY.BRITISH.BRIT_6_POUNDER_CRITICAL_SHOT_MP","ABILITY.BRITISH.BRIT_6_POUNDER_RAPID_MANEUVER_MP","ABILITY.BRITISH.BRIT_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.BRITISH.BRIT_BASE_BRACED_STATIC_MP","ABILITY.BRITISH.BRIT_BASE_BUILDING_BRACED_OFF_MP","ABILITY.BRITISH.BRIT_BASE_BUILDING_BRACED_ON_MP","ABILITY.BRITISH.BRIT_EMPLACEMENT_BRACED_MP","ABILITY.BRITISH.BRIT_HQ_ENGINEER_CALL_IN","ABILITY.BRITISH.BRIT_MEDIC_HEAL_MP","ABILITY.BRITISH.BRIT_MEDIC_SQUAD_AUTO_HEAL","ABILITY.BRITISH.BRIT_MEDIC_TOMMY_TIMED_AREA_HEAL_MP","ABILITY.BRITISH.BRIT_MORTAR_EMPLACEMENT_HOLD_FIRE","ABILITY.BRITISH.BRIT_RADAR_SWEEP","ABILITY.BRITISH.BRIT_REPAIR_ABILITY_SAPPERS_MP","ABILITY.BRITISH.BRIT_REPAIR_ABILITY_TOMMYS_MP","ABILITY.BRITISH.BRIT_REPAIR_EWS_ABILITY_SAPPERS_MP","ABILITY.BRITISH.BRIT_SNIPER_DELAYED_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.BRITISH.BRIT_TUNE_UP","ABILITY.BRITISH.BRIT_VEHICLE_HOLD_FIRE_MP","ABILITY.BRITISH.BRITISH_HOLD_THE_LINE","ABILITY.BRITISH.BRITISH_MORTAR_HOLD_FIRE_MP","ABILITY.BRITISH.CENTAUR_20MM_BARRAGE_MP","ABILITY.BRITISH.CENTAUR_AA_MODE_MP","ABILITY.BRITISH.CENTAUR_WEAPON_BURST_MP","ABILITY.BRITISH.CENTAUR_WEAPON_BURST_TEST_MP","ABILITY.BRITISH.CHURCHILL_AVRE","ABILITY.BRITISH.CHURCHILL_CREW_GRENADE_TARGETED","ABILITY.BRITISH.CHURCHILL_CROC_FLAME_BURST_MP","ABILITY.BRITISH.CHURCHILL_CROCODILE","ABILITY.BRITISH.CHURCHILL_INF_SUPPORT_SMOKE","ABILITY.BRITISH.COMET_CREW_GRENADE_TARGETED","ABILITY.BRITISH.COMET_SMOKE_SHELL_SHOT_MP","ABILITY.BRITISH.COMET_SMOKE_SHELL_SHOT_WP_MP","ABILITY.BRITISH.COMMAND_HQ","ABILITY.BRITISH.COMMAND_HQ_HE_ARTILLERY","ABILITY.BRITISH.COMMAND_HQ_RECON_PLANE","ABILITY.BRITISH.COMMAND_HQ_SMOKE_ARTILLERY","ABILITY.BRITISH.COMMAND_HQ_STRAFE_PLANE","ABILITY.BRITISH.COMMAND_VEHICLE","ABILITY.BRITISH.COMMAND_VEHICLE_PLANE","ABILITY.BRITISH.COMMANDO_ASSASSINATE_MP","ABILITY.BRITISH.COMMANDO_DEMO_MP","ABILITY.BRITISH.COMMANDO_INFILTRATION_CAMOUFLAGE_MP","ABILITY.BRITISH.COUNTER_BATTERY","ABILITY.BRITISH.COUNTER_BATTERYS","ABILITY.BRITISH.COVER_SMOKE_GRENADES","ABILITY.BRITISH.CREW_REPAIR","ABILITY.BRITISH.CREW_REPAIR_OPERATION","ABILITY.BRITISH.CROMWELL_SMOKE_SHELL_SHOT_MP","ABILITY.BRITISH.DEFENSIVE_OPERATIONS","ABILITY.BRITISH.DESTROY_COVER_MP","ABILITY.BRITISH.DIRECT_BARRAGE","ABILITY.BRITISH.EARLY_WARNING","ABILITY.BRITISH.ENGINEER_COVER_COMBAT_BONUS","ABILITY.BRITISH.FATALITY_BURN_THEM_OUT","ABILITY.BRITISH.FATALITY_MIGHT_OF_THE_AIR_FORCES","ABILITY.BRITISH.FATALITY_ZEROING_STRIKE","ABILITY.BRITISH.FIELD_RECOVERY","ABILITY.BRITISH.FIRE_SUPPORT_TEAM","ABILITY.BRITISH.FIREFLY_TULIP_ROCKET_BARRAGE_MP","ABILITY.BRITISH.FIREFLY_TULIP_ROCKET_BARRAGE_SKILL_SHOT_MP","ABILITY.BRITISH.FORTIFY_OUR_POSITION","ABILITY.BRITISH.FORWARD_HQ_RETREAT_POINT_GLIDER_MP","ABILITY.BRITISH.FORWARD_HQ_RETREAT_POINT_MP","ABILITY.BRITISH.GLIDER_COMMANDOS_ONLY","ABILITY.BRITISH.GLIDER_HEADQUARTERS","ABILITY.BRITISH.GLIDER_RETREAT_POINT_MP","ABILITY.BRITISH.HOWITZER_COUNTER_BARRAGE_ATTACK_COMMANDER_MP","ABILITY.BRITISH.HOWITZER_COUNTER_BARRAGE_COMMANDER_MP","ABILITY.BRITISH.HQ_BUILD_ANVIL_1_MP","ABILITY.BRITISH.HQ_BUILD_ANVIL_2_MP","ABILITY.BRITISH.IMPROVED_FORTIFCATIONS","ABILITY.BRITISH.INFANTRY_RECON_TACTICS","ABILITY.BRITISH.INFANTRY_SMOKE_GRENADE_RESPOSITION","ABILITY.BRITISH.INFILTRATION_COMMANDOS","ABILITY.BRITISH.LAND_MATTRESS","ABILITY.BRITISH.LAND_MATTRESS_25LB_ROCKET","ABILITY.BRITISH.LAND_MATTRESS_60LB_ROCKET","ABILITY.BRITISH.LAND_MATTRESS_BARRAGE","ABILITY.BRITISH.LAND_MATTRESS_BARRAGE_SMOKE","ABILITY.BRITISH.LAND_MATTRESS_BARRAGE_VICTOR_TARGET_MP","ABILITY.BRITISH.LAND_MATTRESS_FIRE_ALL","ABILITY.BRITISH.LAND_MATTRESS_LOAD_ROCKETS_MP","ABILITY.BRITISH.LAND_MATTRESS_PHOSPHORUS_ROCKET","ABILITY.BRITISH.MEDIC_AUTO_HEAL_MP","ABILITY.BRITISH.MORTAR_ARTILLERY","ABILITY.BRITISH.MORTAR_FIRE_ARTILLERY","ABILITY.BRITISH.MORTAR_PIT_COUNTER_BATTERY_MP","ABILITY.BRITISH.OBSERVATION_MODE","ABILITY.BRITISH.OBSERVATION_VALENTINE","ABILITY.BRITISH.OFFICER_ARTILLERY","ABILITY.BRITISH.OFFICER_ARTILLERY_SEXTON_VICTOR_TARGET_AIRBURST_BARRAGE_MP","ABILITY.BRITISH.OFFICER_ARTILLERY_SEXTON_VICTOR_TARGET_CONCENTRATION_BARRAGE_MP","ABILITY.BRITISH.OFFICER_CHARGE_MP","ABILITY.BRITISH.OFFICER_RECON_SWEEP","ABILITY.BRITISH.PASSIVE_17_POUNDER_EMPLACEMENT_MP","ABILITY.BRITISH.PASSIVE_BOFORS_EMPLACEMENT_MP","ABILITY.BRITISH.PASSIVE_MORTAR_EMPLACEMENT_MP","ABILITY.BRITISH.PEPPER_POT","ABILITY.BRITISH.PERCISION_BARRAGE","ABILITY.BRITISH.PIAT_DEPLOY_MP","ABILITY.BRITISH.QF_25_PDR_FLARE_BARRAGE_ABILITY_MP","ABILITY.BRITISH.QF_25LB_ANTITANK_ABILITY_BASE_MP","ABILITY.BRITISH.QF_25LB_ANTITANK_ABILITY_MP","ABILITY.BRITISH.QF_25LB_BARRAGE_ABILITY_BASE_MP","ABILITY.BRITISH.QF_25LB_BARRAGE_ABILITY_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_BASE_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_BASE_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_FWD_HQ_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_OFFICER_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_SNIPER_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_VALENTINE_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_SMOKE_SCREEN_BASE_MATT_TEST_VICTOR_TARGET_MP","ABILITY.BRITISH.QF_25LB_CREEPING_SMOKE_BARRAGE_ABILITY_BASE_MP","ABILITY.BRITISH.QF_25LB_CREEPING_SMOKE_BARRAGE_ABILITY_MP","ABILITY.BRITISH.QF_25LB_DIRECT_BARRAGE_BASE_MP","ABILITY.BRITISH.QF_25LB_OVERWATCH_BASE_MP","ABILITY.BRITISH.QF_25LB_RAPID_RESPONSE_BARRAGE_BASE_MP","ABILITY.BRITISH.QF_25LB_RAPID_RESPONSE_BARRAGE_MP","ABILITY.BRITISH.QF_25LB_SMOKE_SCREEN_BASE_MP","ABILITY.BRITISH.RAPID_ADVANCE","ABILITY.BRITISH.RAPID_RESPONSE_ARTILLERY","ABILITY.BRITISH.RECON_SECTION_SPRINT_MP","ABILITY.BRITISH.REINFORCE_THE_FRONT","ABILITY.BRITISH.REINFORCED_STRUCTURES","ABILITY.BRITISH.SAPPER_ANVIL_BOOBY_TRAP","ABILITY.BRITISH.SAPPER_FLAMETHROWERS","ABILITY.BRITISH.SAPPER_GAMMON_BOMB_MEDIUM_MP","ABILITY.BRITISH.SAPPER_SALVAGE_WRECK","ABILITY.BRITISH.SEXTON_ARTILLERY_BARRAGE_CREEPING_VICTOR_TARGET_MP","ABILITY.BRITISH.SEXTON_DISPATCH_BRITISH","ABILITY.BRITISH.SEXTON_SPG_25_CONCENTRATION_BARRAGE_MP","ABILITY.BRITISH.SEXTON_SPG_25_PDR_ARTILLERY_CREEPING_BARRAGE_MP","ABILITY.BRITISH.SEXTON_SPG_25_PDR_BARRAGE_ABILITY_MP","ABILITY.BRITISH.SEXTON_SPG_25_PDR_SUPERCHARGE_AIRBURST_BARRAGE_ABILITY_MP","ABILITY.BRITISH.SEXTON_SPG_25_PDR_SUPERCHARGE_BARRAGE_ABILITY_MP","ABILITY.BRITISH.SMOKE_ASSAULT","ABILITY.BRITISH.SNIPER_BOYS_ANTI_TANK_CRITICAL_SHOT_MP","ABILITY.BRITISH.STAND_FAST","ABILITY.BRITISH.STRAFING_RUN","ABILITY.BRITISH.SUPER_OVERWATCH_TEST","ABILITY.BRITISH.TANK_HUNTER","ABILITY.BRITISH.TOMMY_COVER_COMBAT_BONUS","ABILITY.BRITISH.TOMMY_GAMMON_BOMB_HEAVY_MP","ABILITY.BRITISH.TOMMY_GAMMON_BOMB_MEDIUM_MP","ABILITY.BRITISH.TOMMY_HEAT_GRENADE_MP","ABILITY.BRITISH.TOMMY_MILLS_BOMB_MP","ABILITY.BRITISH.TOMMY_OFFICER_ARTILLERY","ABILITY.BRITISH.TOMMY_STAND_YOUR_GROUND","ABILITY.BRITISH.TUNE_UP_BONUS_MP","ABILITY.BRITISH.UEC_SELF_REPAIR","ABILITY.BRITISH.UEC_SELF_REPAIR_IMPROVED","ABILITY.BRITISH.UNIVERSAL_CARRIER_DROP_LMG","ABILITY.BRITISH.UNIVERSAL_CARRIER_DROP_PIAT","ABILITY.BRITISH.UNIVERSAL_CARRIER_VICKERS_SUPPRESSION_MP","ABILITY.BRITISH.VALENTINE_ARTILLERY_SEXTON_VICTOR_TARGET_CONCENTRATION_BARRAGE_MP","ABILITY.BRITISH.VALENTINE_SMOKE_BARRAGE_MP","ABILITY.BRITISH.VICKERS_AIRDROP","ABILITY.BRITISH.VICKERS_HMG_VET_1_BONUS","UPG.BRITISH.ABILITY_LOCK_OUT_17_POUNDER_ABILITY_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_AVRE_NOT_RELOADED","UPG.BRITISH.ABILITY_LOCK_OUT_AVRE_RELOADING","UPG.BRITISH.ABILITY_LOCK_OUT_BASE_ARTILLERY_COUNTER_BARRAGE_ABILITY_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_BASE_ARTILLERY_OVERWATCH_ABILITY_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_BOFORS_EMPLACEMENT_AA_MODE_ENABLED","UPG.BRITISH.ABILITY_LOCK_OUT_BOFORS_EMPLACEMENT_BARRAGE_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_GLIDER_CUSTOM_LOADOUT_LAUNCH_AVAILABLE","UPG.BRITISH.ABILITY_LOCK_OUT_GLIDER_HARD_LANDED","UPG.BRITISH.ABILITY_LOCK_OUT_GLIDER_NOT_STOPPED","UPG.BRITISH.ABILITY_LOCK_OUT_MORTAR_EMPLACEMENT_BARRAGE_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_MORTAR_EMPLACEMENT_SLOT_1_DEFAULT_LOADED","UPG.BRITISH.ABILITY_LOCK_OUT_MORTAR_EMPLACEMENT_SLOT_1_SPECIAL_1_LOADED","UPG.BRITISH.ABILITY_LOCK_OUT_MORTAR_EMPLACEMENT_SLOT_1_SPECIAL_2_LOADED","UPG.BRITISH.ADVANCED_ASSEMBLY","UPG.BRITISH.ADVANCED_ASSEMBLY_RESEARCH","UPG.BRITISH.ADVANCED_COVER","UPG.BRITISH.AEC_HE_ROUNDS_MP","UPG.BRITISH.AEC_HE_ROUNDS_UNLOCK_MP","UPG.BRITISH.AEC_RAPID_FIRE_MP","UPG.BRITISH.AEC_TARGET_OPTICS_MP","UPG.BRITISH.AEC_TARGET_TURRET_MP","UPG.BRITISH.AEC_TREAD_FIRST_SHOT_MP","UPG.BRITISH.AEC_TREAD_SECOND_SHOT_MP","UPG.BRITISH.ARTY_PIT_LOCKOUT_UPGRADE","UPG.BRITISH.ASSAULT","UPG.BRITISH.ASSAULT_ACTIVE","UPG.BRITISH.AVRE_MORTAR_RELOAD","UPG.BRITISH.BASE_BUILDING_BRACED_MP","UPG.BRITISH.BOYS_AT_RIFLE","UPG.BRITISH.BREN_LMG_UNLOCK_MP","UPG.BRITISH.BRITISH_TANK_COMMANDER","UPG.BRITISH.CAN_TUNE_UP_MP","UPG.BRITISH.COMMAND_HQ","UPG.BRITISH.COMMAND_VEHICLE","UPG.BRITISH.COMMAND_VEHICLE_ACTIVE","UPG.BRITISH.COMMAND_VEHICLE_ACTIVE_PLAYER","UPG.BRITISH.COMMANDO_RETREAT_SMOKE_DELAY","UPG.BRITISH.COMPANY_ANVIL_BUILDING_MP","UPG.BRITISH.COMPANY_ANVIL_MP","UPG.BRITISH.COMPANY_ANVIL_POINT_SIGHT_MP","UPG.BRITISH.COMPANY_HAMMER_BUILDING_MP","UPG.BRITISH.COMPANY_HAMMER_MP","UPG.BRITISH.COUNTER_BATTERY","UPG.BRITISH.COUNTER_BATTERY_MP","UPG.BRITISH.DEFENSIVE_OPERATIONS","UPG.BRITISH.EMPLACEMENT_DEACTIVATE_BRACE_DELAY","UPG.BRITISH.FIREFLY_TULIP_RELOAD","UPG.BRITISH.FIREFLY_TULIP_ROCKET","UPG.BRITISH.FLAMETHROWERS","UPG.BRITISH.FWD_HQ_RETREAT_MP","UPG.BRITISH.IMPROVED_FORTIFCATION","UPG.BRITISH.IMPROVED_FORTIFCATION_ASSSEMBLY_SQUAD","UPG.BRITISH.IMPROVED_FORTIFCATION_SQUAD","UPG.BRITISH.INFILTRATION_COMMANDOS","UPG.BRITISH.LAND_MATTRESS_FIRING","UPG.BRITISH.LAND_MATTRESS_LOADED_ROCKET","UPG.BRITISH.LAND_MATTRESS_LOADING_25LB_ROCKET","UPG.BRITISH.LAND_MATTRESS_LOADING_60LB_ROCKET","UPG.BRITISH.LAND_MATTRESS_LOADING_PHOS_ROCKET","UPG.BRITISH.PIAT","UPG.BRITISH.PIAT_UNLOCK_MP","UPG.BRITISH.PLATOON_AEC_RESEARCH_BUILDING_MP","UPG.BRITISH.PLATOON_AEC_RESEARCH_MP","UPG.BRITISH.PLATOON_BOFORS_RESEARCH_BUILDING_MP","UPG.BRITISH.PLATOON_BOFORS_RESEARCH_MP","UPG.BRITISH.PRECISION_BARRAGE","UPG.BRITISH.QF_25LB_COORDINATED_FIRE_MP","UPG.BRITISH.QF_25LB_COUNTER_BATTERY_MP","UPG.BRITISH.QF_25LB_FIRE_SUPPORT_BASE_MP","UPG.BRITISH.QF_25LB_FIRE_SUPPORT_MP","UPG.BRITISH.QF_25LB_HE_SHELL_MP","UPG.BRITISH.QF_25LB_RAPID_RESPONSE_DELAY_MP","UPG.BRITISH.QF_25LB_RAPID_RESPONSE_MP","UPG.BRITISH.QF_25LB_SHELL_TOGGLE_ABILITY_DELAY_MP","UPG.BRITISH.QF_25LB_TACTICAL_SUPPORT_BASE_MP","UPG.BRITISH.QF_25LB_TACTICAL_SUPPORT_MP","UPG.BRITISH.QF_25LB_TARGET_ACQUISITION_MP","UPG.BRITISH.REINFORCED_STRUCTURE","UPG.BRITISH.SAPPER_FLAMETHROWER","UPG.BRITISH.SAPPERS_HEAVY_SQUAD_MP","UPG.BRITISH.SAPPERS_MINESWEEPER_UPGRADE_MP","UPG.BRITISH.SNIPER_BOYS_AT_RIFLE","UPG.BRITISH.TANK_HUNTER_ACTIVE","UPG.BRITISH.TECH_STRUCTURE_1_CONSTRUCT_MP","UPG.BRITISH.TECH_STRUCTURE_1_MP","UPG.BRITISH.TECH_STRUCTURE_2_CONSTRUCT_MP","UPG.BRITISH.TECH_STRUCTURE_2_MP","UPG.BRITISH.TOMMY_BOYS_AT_RIFLES","UPG.BRITISH.TOMMY_INCREASED_SQUAD_SIZE_MP","UPG.BRITISH.TOMMY_MEDICAL_SUPPLIES","UPG.BRITISH.TOMMY_MILLS_BOMB_MP","UPG.BRITISH.TOMMY_PYROTECHNICS_SUPPLIES","UPG.BRITISH.UNIVERSAL_CARRIER_VICKERS_K_PACKAGE_UPGRADE_MP","UPG.BRITISH.UNIVERSAL_CARRIER_WASP_PACKAGE_UPGRADE_MP","UPG.BRITISH.VALENTINE_OBSERVATION_MODE_MP","UPG.BRITISH.WEAPON_RACK_UNLOCK_MP","EBP.GERMAN.ANTITANK_88MM_PAK43_SANDBAGS","EBP.GERMAN.ARMORED_CAR_SDKFZ_222","EBP.GERMAN.ARMORED_CAR_SDKFZ_222_MP","EBP.GERMAN.ASSAULT_GRENADIERS_LEADER_MP","EBP.GERMAN.ASSAULT_GRENADIERS_MP","EBP.GERMAN.ASSAULT_OFFICER","EBP.GERMAN.ASSAULT_OFFICER_GRENADIERS_BODYGUARD_MP","EBP.GERMAN.ASSAULT_OFFICER_MP","EBP.GERMAN.ATGUN_CREW","EBP.GERMAN.ATGUN_CREW_MP","EBP.GERMAN.ATGUN88_CREW","EBP.GERMAN.ATGUN88_CREW_MP","EBP.GERMAN.AXIS_BUNKER_STARTING_POSITION","EBP.GERMAN.AXIS_BUNKER_STARTING_POSITION_MP","EBP.GERMAN.BEREICH_FESTUNG","EBP.GERMAN.BEREICH_FESTUNG_MP","EBP.GERMAN.BRUMMBAR_STURMPANZER_IV_SDKFZ_166","EBP.GERMAN.BRUMMBAR_STURMPANZER_IV_SDKFZ_166_MP","EBP.GERMAN.BUNKER","EBP.GERMAN.BUNKER_MP","EBP.GERMAN.BUNKER_OF_DEATH_MP","EBP.GERMAN.CARGO_PLANE","EBP.GERMAN.CARGO_PLANE_1","EBP.GERMAN.CARGO_PLANE_FUEL","EBP.GERMAN.CARGO_PLANE_MUNITIONS","EBP.GERMAN.DOLCH_AKTIONEN","EBP.GERMAN.DOLCH_AKTIONEN_MP","EBP.GERMAN.ELEFANT_SDKFZ_184","EBP.GERMAN.ELEFANT_SDKFZ_184_MP","EBP.GERMAN.FUEL_POST_GERMAN","EBP.GERMAN.FUEL_POST_GERMAN_MP","EBP.GERMAN.GERMAN_BASE_STAMPER","EBP.GERMAN.GERMAN_HQ","EBP.GERMAN.GERMAN_HQ_MP","EBP.GERMAN.GERMAN_HQ_WRECK","EBP.GERMAN.GERMAN_HQ_WRECK_MP","EBP.GERMAN.GERMAN_MEDIC","EBP.GERMAN.GERMAN_MEDIC_MP","EBP.GERMAN.GERMAN_MINE","EBP.GERMAN.GERMAN_MINE_MP","EBP.GERMAN.GERMAN_SANDBAG_FENCE","EBP.GERMAN.GRANATEWERFER_34_81MM_MORTAR","EBP.GERMAN.GRANATEWERFER_34_81MM_MORTAR_MP","EBP.GERMAN.GRENADIERS","EBP.GERMAN.GRENADIERS_MP","EBP.GERMAN.GRENADIERS_SP","EBP.GERMAN.HACK_INVISI_PIONEER_MP","EBP.GERMAN.HALFTRACK_RIEGEL_43_MINE_MP","EBP.GERMAN.HALFTRACK_SDKFZ_251","EBP.GERMAN.HALFTRACK_SDKFZ_251_MP","EBP.GERMAN.HINTERE_PANZERWERK","EBP.GERMAN.HINTERE_PANZERWERK_MP","EBP.GERMAN.HINTERE_PANZERWERK_VORONEZH","EBP.GERMAN.HOWITZER_105MM_DUMMY","EBP.GERMAN.HOWITZER_105MM_LE_FH18","EBP.GERMAN.HOWITZER_105MM_LE_FH18_MP","EBP.GERMAN.HOWITZER_CREW","EBP.GERMAN.HOWITZER_CREW_MP","EBP.GERMAN.HULLDOWN_SANDBAG_WALL","EBP.GERMAN.HULLDOWN_SANDBAG_WALL_MP","EBP.GERMAN.INVISIBLE_RETREAT_POINT","EBP.GERMAN.LUFTWAFFE_OFFICER_TOW","EBP.GERMAN.M01_STUKA_DOGFIGHT","EBP.GERMAN.M01_STUKA_GROUND_ATTACK_FAST","EBP.GERMAN.MECHANIZED_250_HALFTRACK_GRENADIER_MP","EBP.GERMAN.MECHANIZED_250_HALFTRACK_MP","EBP.GERMAN.MG42_CREW","EBP.GERMAN.MG42_CREW_MP","EBP.GERMAN.MG42_CREW_SINGLE","EBP.GERMAN.MG42_HMG","EBP.GERMAN.MG42_HMG_ATTACK_GROUND","EBP.GERMAN.MG42_HMG_MP","EBP.GERMAN.MINE_FIELD","EBP.GERMAN.MINE_FIELD_BORDER","EBP.GERMAN.MINE_FIELD_BORDER_MP","EBP.GERMAN.MINE_FIELD_MINE","EBP.GERMAN.MINE_FIELD_MINE_M03","EBP.GERMAN.MINE_FIELD_MINE_MP","EBP.GERMAN.MINE_FIELD_MINE_TOW","EBP.GERMAN.MINE_FIELD_MP","EBP.GERMAN.MORTAR_CREW","EBP.GERMAN.MORTAR_CREW_MP","EBP.GERMAN.MORTAR_LIGHT_HALFTRACK_250_7","EBP.GERMAN.MORTAR_LIGHT_HALFTRACK_250_7_MP","EBP.GERMAN.MUNITION_POST_GERMAN","EBP.GERMAN.MUNITION_POST_GERMAN_MP","EBP.GERMAN.OFFICER","EBP.GERMAN.OFFICER_MP","EBP.GERMAN.OFFICER_TOW_OCCUPATION","EBP.GERMAN.OPEL_BLITZ_SUPPLY_TRUCK_MP","EBP.GERMAN.OPEL_BLITZ_TRUCK","EBP.GERMAN.OSTRUPPEN_SOLDIER","EBP.GERMAN.OSTRUPPEN_SOLDIER_MP","EBP.GERMAN.OSTWIND_FLAK_PANZER","EBP.GERMAN.OSTWIND_FLAK_PANZER_MP","EBP.GERMAN.PAK40_75MM_AT_GUN","EBP.GERMAN.PAK40_75MM_AT_GUN_MP","EBP.GERMAN.PAK43_88MM_AT_GUN","EBP.GERMAN.PAK43_88MM_AT_GUN_MP","EBP.GERMAN.PANTHER_SDKFZ_171","EBP.GERMAN.PANTHER_SDKFZ_171_MP","EBP.GERMAN.PANZER_GRENADIERS","EBP.GERMAN.PANZER_GRENADIERS_MP","EBP.GERMAN.PANZER_III_MP","EBP.GERMAN.PANZER_IV_COMMANDER_SDKFZ_161","EBP.GERMAN.PANZER_IV_COMMANDER_SDKFZ_161_MP","EBP.GERMAN.PANZER_IV_SDKFZ_161","EBP.GERMAN.PANZER_IV_SDKFZ_161_MP","EBP.GERMAN.PANZER_IV_SDKFZ_161_TUTORIAL","EBP.GERMAN.PANZER_IV_SDKFZ_AUSF1","EBP.GERMAN.PANZER_IV_SDKFZ_AUSF1_MP","EBP.GERMAN.PANZER_MG","EBP.GERMAN.PANZERWERFER_SDKFZ_4_1","EBP.GERMAN.PANZERWERFER_SDKFZ_4_1_MP","EBP.GERMAN.PARADROP_SNIPER_SOLDIER_MP","EBP.GERMAN.PIONEER","EBP.GERMAN.PIONEER_MP","EBP.GERMAN.PUMA_EAST_GERMAN","EBP.GERMAN.REPAIR_PIONEER","EBP.GERMAN.REPAIR_PIONEER_MP","EBP.GERMAN.RIEGEL_43_MINE","EBP.GERMAN.RIEGEL_43_MINE_MP","EBP.GERMAN.SCHWERES_KRIEGSWERK","EBP.GERMAN.SCHWERES_KRIEGSWERK_MP","EBP.GERMAN.SDKFZ_221_LIGHT_AT_HALFTRACK","EBP.GERMAN.SLIT_TRENCH_GERMAN","EBP.GERMAN.SLIT_TRENCH_GERMAN_MP","EBP.GERMAN.SNIPER_COVER","EBP.GERMAN.SNIPER_DIGIN_COVER_MP","EBP.GERMAN.SNIPER_SOLDIER","EBP.GERMAN.SNIPER_SOLDIER_MP","EBP.GERMAN.STORMTROOPERS_MP","EBP.GERMAN.STUG_III_E_SDKFZ_141_1","EBP.GERMAN.STUG_III_E_SDKFZ_141_1_COMMANDER_MP","EBP.GERMAN.STUG_III_E_SDKFZ_141_1_MP","EBP.GERMAN.STUG_III_G_SDKFZ_141_1","EBP.GERMAN.STUG_III_G_SDKFZ_141_1_MP","EBP.GERMAN.STUKA_AIR_RECON","EBP.GERMAN.STUKA_AIR_RECON_MP","EBP.GERMAN.STUKA_BOMBING_DIVE","EBP.GERMAN.STUKA_BOMBING_DIVE_MP","EBP.GERMAN.STUKA_BOMBING_RUN_SP","EBP.GERMAN.STUKA_FRAGEMENTATION_BOMB","EBP.GERMAN.STUKA_FRAGEMENTATION_BOMB_MP","EBP.GERMAN.STUKA_GROUND_ATTACK","EBP.GERMAN.STUKA_GROUND_ATTACK_LONG","EBP.GERMAN.STUKA_GROUND_ATTACK_M09","EBP.GERMAN.STUKA_GROUND_ATTACK_MP","EBP.GERMAN.STUKA_GROUND_ATTACK_WEST_AIRBORNE_ASSAULT","EBP.GERMAN.STUKA_INCENDIARY_BOMB","EBP.GERMAN.STUKA_INCENDIARY_BOMB_VICTORY","EBP.GERMAN.STUKA_JU87_ANTI_TANK","EBP.GERMAN.STUKA_JU87_ANTI_TANK_M06","EBP.GERMAN.STUKA_JU87_ANTI_TANK_MP","EBP.GERMAN.STUKA_JU87_ANTI_TANK_SUPERIORITY","EBP.GERMAN.STUKA_SMOKE_BOMB","EBP.GERMAN.STUKA_SMOKE_BOMB_MP","EBP.GERMAN.SUPPLY_TRUCK_METAL_M_01","EBP.GERMAN.SUPPLY_TRUCK_METAL_M_02","EBP.GERMAN.SUPPLY_TRUCK_MUNITIONS_CASE_AX_01","EBP.GERMAN.SUPPLY_TRUCK_MUNITIONS_CASE_AX_03","EBP.GERMAN.SUPPLY_TRUCK_SANDBAG_PILE_02","EBP.GERMAN.TACTICAL_BOMBER","EBP.GERMAN.TACTICAL_BOMBER_ACCURATE","EBP.GERMAN.TANK_TRAP","EBP.GERMAN.TELLER_MINE_MP","EBP.GERMAN.TIER1_MARKER","EBP.GERMAN.TIER2_MARKER","EBP.GERMAN.TIER3_MARKER","EBP.GERMAN.TIER4_MARKER","EBP.GERMAN.TIGER_ACE_SDKFZ_181_MP","EBP.GERMAN.TIGER_SDKFZ_181","EBP.GERMAN.TIGER_SDKFZ_181_MP","EBP.GERMAN.TIGER_SDKFZ_181_SINGLEPLAYER_MISSION","EBP.GERMAN.TIGER_SDKFZ_181_TOW","EBP.GERMAN.URBAN_ASSAULT_PANZER_GRENADIERS_MP","SBP.GERMAN.ASSAULT_GRENADIER_SQUAD_MP","SBP.GERMAN.ASSAULT_OFFICER_SQUAD","SBP.GERMAN.ASSAULT_OFFICER_SQUAD_MP","SBP.GERMAN.BRUMMBAR_SQUAD","SBP.GERMAN.BRUMMBAR_SQUAD_MP","SBP.GERMAN.CARGO_PLANE","SBP.GERMAN.CARGO_PLANE_FUEL","SBP.GERMAN.CARGO_PLANE_MUNITIONS","SBP.GERMAN.COMMAND_OFFICER_SQUAD_TOW","SBP.GERMAN.CONVOY_PIONEER_SQUAD","SBP.GERMAN.ELEFANT_TANK_DESTROYER_SQUAD","SBP.GERMAN.ELEFANT_TANK_DESTROYER_SQUAD_MP","SBP.GERMAN.GRENADIER_SQUAD","SBP.GERMAN.GRENADIER_SQUAD_M14","SBP.GERMAN.GRENADIER_SQUAD_MG42LMG_MP","SBP.GERMAN.GRENADIER_SQUAD_MP","SBP.GERMAN.GRENADIER_SQUAD_SP","SBP.GERMAN.HACK_INVISI_PIONEER_SQUAD_MP","SBP.GERMAN.HOWITZER_105MM_DUMMY_SQUAD","SBP.GERMAN.HOWITZER_105MM_LE_FH18_ARTILLERY","SBP.GERMAN.HOWITZER_105MM_LE_FH18_ARTILLERY_MP","SBP.GERMAN.LUFTWAFFE_OFFICER_SQUAD_TOW","SBP.GERMAN.M01_MG42_HEAVY_MACHINE_GUN_SQUAD_SINGLE","SBP.GERMAN.M01_STUKA_DOGFIGHT","SBP.GERMAN.M01_STUKA_GROUND_ATTACK_SQUAD_FAST","SBP.GERMAN.MECHANIZED_250_HALFTRACK_GRENADIERS_MP","SBP.GERMAN.MECHANIZED_250_HALFTRACK_MP","SBP.GERMAN.MECHANIZED_250_HALFTRACK_TOW","SBP.GERMAN.MG42_HEAVY_MACHINE_GUN_SQUAD","SBP.GERMAN.MG42_HEAVY_MACHINE_GUN_SQUAD_MP","SBP.GERMAN.MORTAR_250_HALFTRACK_SQUAD","SBP.GERMAN.MORTAR_250_HALFTRACK_SQUAD_MP","SBP.GERMAN.MORTAR_TEAM_81MM","SBP.GERMAN.MORTAR_TEAM_81MM_MP","SBP.GERMAN.OFFICER_SQUAD","SBP.GERMAN.OFFICER_SQUAD_MP","SBP.GERMAN.OPEL_BLITZ_SQUAD","SBP.GERMAN.OPEL_BLITZ_SUPPLY_SQUAD","SBP.GERMAN.OSTRUPPEN_SQUAD","SBP.GERMAN.OSTRUPPEN_SQUAD_M14","SBP.GERMAN.OSTRUPPEN_SQUAD_MP","SBP.GERMAN.OSTRUPPEN_SQUAD_RESERVES_MP","SBP.GERMAN.OSTWIND_SQUAD","SBP.GERMAN.OSTWIND_SQUAD_MP","SBP.GERMAN.PAK40_75MM_AT_GUN_SQUAD","SBP.GERMAN.PAK40_75MM_AT_GUN_SQUAD_MP","SBP.GERMAN.PAK43_88MM_AT_GUN_SQUAD","SBP.GERMAN.PAK43_88MM_AT_GUN_SQUAD_MP","SBP.GERMAN.PANTHER_SQUAD","SBP.GERMAN.PANTHER_SQUAD_MP","SBP.GERMAN.PANZER_GRENADIER_SQUAD","SBP.GERMAN.PANZER_GRENADIER_SQUAD_M14","SBP.GERMAN.PANZER_GRENADIER_SQUAD_MP","SBP.GERMAN.PANZER_IV_COMMAND_SQUAD","SBP.GERMAN.PANZER_IV_COMMAND_SQUAD_MP","SBP.GERMAN.PANZER_IV_SQUAD","SBP.GERMAN.PANZER_IV_SQUAD_MP","SBP.GERMAN.PANZER_IV_SQUAD_TUTORIAL","SBP.GERMAN.PANZER_IV_STUBBY_SQUAD","SBP.GERMAN.PANZER_IV_STUBBY_SQUAD_MP","SBP.GERMAN.PANZER_MG_SQUAD","SBP.GERMAN.PANZERWERFER_SQUAD","SBP.GERMAN.PANZERWERFER_SQUAD_MP","SBP.GERMAN.PARTISAN_SQUAD_M13","SBP.GERMAN.PIONEER_SQUAD","SBP.GERMAN.PIONEER_SQUAD_MP","SBP.GERMAN.PIONEER_SQUAD_TOW","SBP.GERMAN.PUMA_EAST_GERMAN_MP","SBP.GERMAN.SCOUTCAR_SDKFZ222","SBP.GERMAN.SCOUTCAR_SDKFZ222_MP","SBP.GERMAN.SDKFZ_221_LIGHT_AT_HALFTRACK","SBP.GERMAN.SDKFZ_251_HALFTRACK_SQUAD","SBP.GERMAN.SDKFZ_251_HALFTRACK_SQUAD_MP","SBP.GERMAN.SNIPER_SQUAD","SBP.GERMAN.SNIPER_SQUAD_MP","SBP.GERMAN.STORMTROOPER_SQUAD_MP","SBP.GERMAN.STUG_III_E_COMMANDER_SQUAD_MP","SBP.GERMAN.STUG_III_E_SQUAD","SBP.GERMAN.STUG_III_E_SQUAD_MP","SBP.GERMAN.STUG_III_SQUAD","SBP.GERMAN.STUG_III_SQUAD_MP","SBP.GERMAN.STUKA_AIR_CAP_SQUAD","SBP.GERMAN.STUKA_AIR_CAP_SQUAD_MP","SBP.GERMAN.STUKA_GROUND_ANTI_TANK_SQUAD","SBP.GERMAN.STUKA_GROUND_ANTI_TANK_SQUAD_M06","SBP.GERMAN.STUKA_GROUND_ANTI_TANK_SQUAD_MP","SBP.GERMAN.STUKA_GROUND_ANTI_TANK_SQUAD_SUPERIORITY","SBP.GERMAN.STUKA_GROUND_ATTACK_SQUAD","SBP.GERMAN.STUKA_GROUND_ATTACK_SQUAD_LONG","SBP.GERMAN.STUKA_GROUND_ATTACK_SQUAD_M09","SBP.GERMAN.STUKA_GROUND_ATTACK_SQUAD_MP","SBP.GERMAN.STUKA_GROUND_ATTACK_WEST_GERMANS_SQUAD","SBP.GERMAN.STUKA_GROUND_FRAGMENTATION_SQUAD","SBP.GERMAN.STUKA_GROUND_FRAGMENTATION_SQUAD_MP","SBP.GERMAN.STUKA_INCENDIARY_BOMB_SQUAD","SBP.GERMAN.STUKA_INCENDIARY_BOMB_VICTORY_SQUAD","SBP.GERMAN.STUKA_SMOKE_SQUAD","SBP.GERMAN.STUKA_SMOKE_SQUAD_MP","SBP.GERMAN.TACTICAL_BOMBERS","SBP.GERMAN.TACTICAL_BOMBERS_ACCURATE","SBP.GERMAN.TIGER_ACE_SQUAD_MP","SBP.GERMAN.TIGER_SQUAD","SBP.GERMAN.TIGER_SQUAD_MP","SBP.GERMAN.TIGER_SQUAD_SP_A2_M02","SBP.GERMAN.TIGER_SQUAD_TOW","SBP.GERMAN.URBAN_ASSAULT_PANZER_GRENADIER_SQUAD_MP","ABILITY.GERMAN.AIR_DROPPED_MEDICAL_SUPPLIES","ABILITY.GERMAN.AIR_DROPPED_MUNITIONS","ABILITY.GERMAN.AMBUSH_CAMO_HOLD_FIRE_MP","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_AT","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_MORTAR","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_PIO","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_UNLOCK","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_UPGRADE","ABILITY.GERMAN.ARMOR_COMMANDER","ABILITY.GERMAN.ASSAULT_FIELD_OFFICER","ABILITY.GERMAN.ASSAULT_GRENADIER_GRENADE","ABILITY.GERMAN.ASSAULT_GRENADIER_SPRINT_MP","ABILITY.GERMAN.ASSAULT_GRENADIERS","ABILITY.GERMAN.ASSAULT_OFFICER_INSPIRATION","ABILITY.GERMAN.ASSAULT_OFFICER_INSPIRATION_VET3","ABILITY.GERMAN.ASSAULT_OFFICER_VICTOR_TARGET","ABILITY.GERMAN.AXIS_SNIPER_DELAYED_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.GERMAN.BLINDING_GRENADE","ABILITY.GERMAN.BLINDING_GRENADES_UNLOCK","ABILITY.GERMAN.BREAKTHROUGH","ABILITY.GERMAN.BRUMMBAR_BUNKER_BUSTER_MP","ABILITY.GERMAN.BRUMMBAR_CRITICAL_SHOTS_MP","ABILITY.GERMAN.BRUMMBAR_HOLD_FIRE_MP","ABILITY.GERMAN.CAMOUFLAGE_NETS","ABILITY.GERMAN.CAMOUFLAGE_NETS_UNLOCK","ABILITY.GERMAN.COMMAND_PANTHER_MARK_TARGET","ABILITY.GERMAN.CONVERT_TANK_WRECK","ABILITY.GERMAN.CONVERT_TANK_WRECK_UNLOCK","ABILITY.GERMAN.COUNTERATTACK_TACTICS","ABILITY.GERMAN.CRUSH_THE_POCKET","ABILITY.GERMAN.DEFENSIVE_FORTIFICATIONS","ABILITY.GERMAN.ELEFANT_CRITICAL_SHOTS_MP","ABILITY.GERMAN.ELEFANT_UNLOCK","ABILITY.GERMAN.ELEPHANT_CONE_LOS_TOGGLE_ABILITY","ABILITY.GERMAN.ELEPHANT_CONE_LOS_TOGGLE_ABILITY_MP","ABILITY.GERMAN.FAST_MARCH","ABILITY.GERMAN.FATALITY_PANZERWERFER_BARRAGE","ABILITY.GERMAN.FATALITY_SMOKE_BARRAGE","ABILITY.GERMAN.FATALITY_STUKA_INCENDIARY_AIRSTRIKE","ABILITY.GERMAN.FATALITY_STUKA_SMOKE_STRAFE_AIRSTRIKE","ABILITY.GERMAN.FORWARD_REPAIR_STATION","ABILITY.GERMAN.GERMAN_HQ_PIONEER_CALL_IN","ABILITY.GERMAN.GERMAN_HULLDOWN_ABILITY","ABILITY.GERMAN.GERMAN_HULLDOWN_DISABLE","ABILITY.GERMAN.GERMAN_MORTAR_HOLD_FIRE","ABILITY.GERMAN.GERMAN_MORTAR_HOLD_FIRE_MP","ABILITY.GERMAN.GERMAN_SALVAGE_ABILITY","ABILITY.GERMAN.GERMAN_SALVAGE_ABILITY_CONVOY","ABILITY.GERMAN.GERMAN_SALVAGE_ABILITY_MP","ABILITY.GERMAN.GERMAN_WARNING_SMOKE","ABILITY.GERMAN.GOLIATH_IN_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.GERMAN.GOLIATH_SELF_DESTRUCT_MP","ABILITY.GERMAN.GRENADIER_ANTITANK_RIFLE_GRENADE_ABILITY","ABILITY.GERMAN.GRENADIER_ANTITANK_RIFLE_GRENADE_ABILITY_MP","ABILITY.GERMAN.GRENADIER_PANZERFAUST","ABILITY.GERMAN.GRENADIER_PANZERFAUST_MP","ABILITY.GERMAN.GRENADIER_RIFLE_GRENADE_ABILITY","ABILITY.GERMAN.GRENADIER_RIFLE_GRENADE_ABILITY_MP","ABILITY.GERMAN.GRENADIER_RIFLE_GRENADE_ABILITY_TUTORIAL","ABILITY.GERMAN.HALFTRACK_INCENDIARY_MORTAR_BARRAGE","ABILITY.GERMAN.HALFTRACK_INCENDIARY_MORTAR_BARRAGE_MP","ABILITY.GERMAN.HALFTRACK_MORTAR_BARRAGE","ABILITY.GERMAN.HALFTRACK_MORTAR_BARRAGE_MP","ABILITY.GERMAN.HALFTRACK_MORTAR_VICTORTARGET_BARRAGE_MP","ABILITY.GERMAN.HALFTRACK_SMOKE_BARRAGE","ABILITY.GERMAN.HALFTRACK_SMOKE_BARRAGE_MP","ABILITY.GERMAN.HEAVY_AT_MINE_UNLOCK","ABILITY.GERMAN.HOWITZER_105MM_BARRAGE_ABILITY","ABILITY.GERMAN.HOWITZER_105MM_BARRAGE_ABILITY_MP","ABILITY.GERMAN.HOWITZER_105MM_BARRAGE_VET3_ABILITY_MP","ABILITY.GERMAN.HOWITZER_105MM_EMPLACEMENT_UNLOCK","ABILITY.GERMAN.HOWITZER_105MM_VICTORTARGET_BARRAGE_ABILITY_MP","ABILITY.GERMAN.HOWITZER_COUNTER_BARRAGE_ATTACK_MP","ABILITY.GERMAN.HOWITZER_COUNTER_BARRAGE_MP","ABILITY.GERMAN.HOWITZER_DEFAULT_REFACE_ACTION","ABILITY.GERMAN.HULL_DOWN_UNLOCK","ABILITY.GERMAN.INFANTRY_MEDKITS","ABILITY.GERMAN.INFANTRY_MEDKITS_MP","ABILITY.GERMAN.JAEGER_INFANTRY_UNLOCK","ABILITY.GERMAN.JAEGER_INTERROGATION","ABILITY.GERMAN.LAY_HEAVY_AT_MINE","ABILITY.GERMAN.LIGHT_SUPPORT_ARTILLERY","ABILITY.GERMAN.MECHANIZED_ASSAULT_GROUP","ABILITY.GERMAN.MECHANIZED_GRENADIER_GROUP","ABILITY.GERMAN.MG42_CAMO_HOLD_FIRE_MP","ABILITY.GERMAN.MG42_PHOSPHORUS_ROUNDS","ABILITY.GERMAN.MG42_PHOSPHORUS_ROUNDS_MP","ABILITY.GERMAN.MORTAR_COUNTER_BARRAGE_ATTACK_MP","ABILITY.GERMAN.MORTAR_COUNTER_BARRAGE_MP","ABILITY.GERMAN.MORTAR_COUNTER_BARRAGE_WEAPON_MP","ABILITY.GERMAN.MORTAR_HALFTRACK","ABILITY.GERMAN.MORTAR_INCENDIARY_BARRAGE","ABILITY.GERMAN.MORTAR_TEAM_INCENDIARY_BARRAGE_MP","ABILITY.GERMAN.MORTAR_TEAM_MORTAR_BARRAGE","ABILITY.GERMAN.MORTAR_TEAM_MORTAR_BARRAGE_MP","ABILITY.GERMAN.MORTAR_TEAM_MORTAR_VICTORTARGET_BARRAGE_MP","ABILITY.GERMAN.MORTAR_TEAM_SMOKE_BARRAGE","ABILITY.GERMAN.MORTAR_TEAM_SMOKE_BARRAGE_MP","ABILITY.GERMAN.MUNITIONS_BLITZ","ABILITY.GERMAN.OFFICER_SMOKE_ARTILLERY","ABILITY.GERMAN.OPEL_SUPPLY_TERRITORY_CHECK","ABILITY.GERMAN.OSTRUPPEN","ABILITY.GERMAN.OSTRUPPEN_COVER_BONUS","ABILITY.GERMAN.OSTRUPPEN_RESERVES","ABILITY.GERMAN.PAK_43_EMPLACEMENT_UNLOCK","ABILITY.GERMAN.PAK40_CRITICAL_SHOTS_MP","ABILITY.GERMAN.PAK40_TARGET_WEAK_POINT_MP","ABILITY.GERMAN.PAK43_CRITICAL_SHOTS_MP","ABILITY.GERMAN.PAK43_TARGET_WEAK_POINT_MP","ABILITY.GERMAN.PANTHER_TIGER_BLITZKRIEG_MP","ABILITY.GERMAN.PANZER_COMMANDER_AURA_MP","ABILITY.GERMAN.PANZER_DEFENSIVE_SMOKE","ABILITY.GERMAN.PANZER_GRENADIER_BUNDLED_CAMPAIGN","ABILITY.GERMAN.PANZER_GRENADIER_BUNDLED_GRENADE","ABILITY.GERMAN.PANZER_GRENADIER_BUNDLED_GRENADE_MP","ABILITY.GERMAN.PANZER_GRENADIER_BUNDLED_TUTORIAL","ABILITY.GERMAN.PANZER_PANTHER_TIGER_DEFENSIVE_SMOKE_TOW","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_BLITZKRIEG","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_BLITZKRIEG_MP","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_BLITZKRIEG_TOW","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_FLARES_ABILITY","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_REPAIR_TOW","ABILITY.GERMAN.PANZER_TACTICIAN_UNLOCK","ABILITY.GERMAN.PANZERWERFER_COUNTER_BARRAGE_ATTACK_MP","ABILITY.GERMAN.PANZERWERFER_COUNTER_BARRAGE_MP","ABILITY.GERMAN.PANZERWERFER_ROCKET_BARRAGE","ABILITY.GERMAN.PANZERWERFER_ROCKET_BARRAGE_MP","ABILITY.GERMAN.PANZERWERFER_ROCKET_VICTORTARGET_BARRAGE_MP","ABILITY.GERMAN.PIONEER_BARBED_WIRE_CUTTING_ABILITY","ABILITY.GERMAN.PIONEER_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.GERMAN.PIONEER_FLAMETHROWER","ABILITY.GERMAN.PUMA_CRITICAL_SHOTS_MP","ABILITY.GERMAN.PUMA_DISPATCH","ABILITY.GERMAN.RAILWAY_GUN_ARTILLERY","ABILITY.GERMAN.REDISTRIBUTE_RESOURCES","ABILITY.GERMAN.RELIEF_INFANTRY","ABILITY.GERMAN.REMOVE_AMBUSH_CAMOUFLAGE","ABILITY.GERMAN.RESOURCE_REQUISITION","ABILITY.GERMAN.RETREAT_TO_FORWARD_HQ","ABILITY.GERMAN.SCOUT_CAR_HALFTRACK_INFANTRY_AWARENESS","ABILITY.GERMAN.SCOUT_CAR_HALFTRACK_INFANTRY_AWARENESS_MP","ABILITY.GERMAN.SDKFZ_221_LIGHT_AT_HALFTRACK","ABILITY.GERMAN.SECTOR_ARTILLERY","ABILITY.GERMAN.SNIPER_INCENDIARY_ROUND_MP","ABILITY.GERMAN.SPRINT","ABILITY.GERMAN.STATIONARY_LOS_UNLOCK","ABILITY.GERMAN.STORMTROOPER_ASSAULT_AMBUSH_MP","ABILITY.GERMAN.STORMTROOPER_SPRINT_MP","ABILITY.GERMAN.STORMTROOPER_TANK_DETECTION_MP","ABILITY.GERMAN.STORMTROOPERS","ABILITY.GERMAN.STRATEGIC_BOMBING","ABILITY.GERMAN.STUG_CRITICAL_SHOTS_MP","ABILITY.GERMAN.STUG_ELEFANT_PAK40_PAK43_BRUMMBAR_CRITICAL_SHOTS","ABILITY.GERMAN.STUG_ELEFANT_PAK40_PAK43_BRUMMBAR_CRITICAL_SHOTS_MP","ABILITY.GERMAN.STUG_III_E","ABILITY.GERMAN.STUKA_AERIAL_SUPERIORITY_CLOSE_AIR_SUPPORT","ABILITY.GERMAN.STUKA_AERIAL_SUPERIORITY_RECON","ABILITY.GERMAN.STUKA_AERIAL_SUPERIORITY_STRAFING_RUN","ABILITY.GERMAN.STUKA_AIR_RECON","ABILITY.GERMAN.STUKA_BOMBING_RUN_SP","ABILITY.GERMAN.STUKA_BOMBING_STRIKE","ABILITY.GERMAN.STUKA_BOMBING_STRIKE_TOW","ABILITY.GERMAN.STUKA_CLOSE_AIR_M06","ABILITY.GERMAN.STUKA_CLOSE_AIR_M06_MP","ABILITY.GERMAN.STUKA_CLOSE_AIR_SUPPORT","ABILITY.GERMAN.STUKA_FRAGMENTATION_BOMB","ABILITY.GERMAN.STUKA_INCENDIARY_BOMBS","ABILITY.GERMAN.STUKA_SMOKE_BOMB","ABILITY.GERMAN.STUKA_STRAFING_RUN","ABILITY.GERMAN.SUPPLY_BREAK","ABILITY.GERMAN.SUPPLY_TRUCK","ABILITY.GERMAN.SUPPLY_TRUCK_LOCKDOWN","ABILITY.GERMAN.SUPPORT_TEAM_AMBUSH_CAMOUFLAGE","ABILITY.GERMAN.TANK_AWARENESS_UNLOCK","ABILITY.GERMAN.TANK_DETECTION_ABILITY_CONVOY","ABILITY.GERMAN.TIGER_ACE_CRITICAL_SHOTS_MP","ABILITY.GERMAN.TIGER_TANK","ABILITY.GERMAN.TIGER_TANK_ACE","ABILITY.GERMAN.TRENCH_UNLOCK","ABILITY.GERMAN.TROOP_TRAINING","ABILITY.GERMAN.URBAN_ASSAULT_GRENADIERS","ABILITY.GERMAN.URBAN_ASSAULT_SATCHEL_CHARGE_THROW_ABILITY_MP","ABILITY.GERMAN.URBAN_ASSAULT_SMOKE_GRENADE","ABILITY.GERMAN.URBAN_ASSAULT_SMOKE_GRENADE_2","ABILITY.GERMAN.WEHR_VEHICLE_HOLD_FIRE_MP","UPG.GERMAN.AERIAL_SUPERIORITY_RECON_PLANE","UPG.GERMAN.AERIAL_SUPERIORITY_STUKA_CLOSE_AIR_SUPPORT","UPG.GERMAN.AERIAL_SUPERIORITY_STUKA_STRAFE","UPG.GERMAN.AIR_DROP_MEDICAL_SUPPLIES","UPG.GERMAN.AIR_DROP_RESOURCES","UPG.GERMAN.AMBUSH_CAMOU_PACKAGE","UPG.GERMAN.AMBUSH_CAMOUFLAGE","UPG.GERMAN.ARMOR_COMMANDER","UPG.GERMAN.ASSAULT_ARCHETYPE","UPG.GERMAN.ASSAULT_FIELD_OFFICER","UPG.GERMAN.ASSAULT_GRENADIERS","UPG.GERMAN.BATTLE_PHASE_2","UPG.GERMAN.BATTLE_PHASE_2_MP","UPG.GERMAN.BATTLE_PHASE_3","UPG.GERMAN.BATTLE_PHASE_3_MP","UPG.GERMAN.BATTLE_PHASE_4","UPG.GERMAN.BATTLE_PHASE_4_MP","UPG.GERMAN.BLINDING_GRENADES","UPG.GERMAN.BREAKTHROUGH","UPG.GERMAN.BRUMMBAR_TOP_GUNNER","UPG.GERMAN.BRUMMBAR_TOP_GUNNER_MP","UPG.GERMAN.BUNKER_COMMAND","UPG.GERMAN.BUNKER_COMMAND_MP","UPG.GERMAN.BUNKER_MEDIC_STATION","UPG.GERMAN.BUNKER_MEDIC_STATION_MP","UPG.GERMAN.BUNKER_MG42_ADDITION","UPG.GERMAN.BUNKER_MG42_ADDITION_MP","UPG.GERMAN.CAMOUFLAGE_NET_ACTIVATED","UPG.GERMAN.CAMOUFLAGE_NETS","UPG.GERMAN.CAN_CAMOUFLAGE","UPG.GERMAN.COUNTERATTACK_TACTICS","UPG.GERMAN.CRUSH_THE_POCKET","UPG.GERMAN.DEFENSIVE_FORTIFICATIONS","UPG.GERMAN.ELEFANT_UNLOCK","UPG.GERMAN.FAST_MARCH","UPG.GERMAN.FESTUNG_ARCHETYPE","UPG.GERMAN.FORWARD_REPAIR_STATION","UPG.GERMAN.GRENADIER_MG42_LMG","UPG.GERMAN.GRENADIER_MG42_LMG_MP","UPG.GERMAN.HEAVY_AT_MINE","UPG.GERMAN.HOWITZER_105MM_EMPLACEMENT","UPG.GERMAN.HOWITZER_COUNTER_BARRAGE_COOLDOWN_MP","UPG.GERMAN.HULL_DOWN","UPG.GERMAN.HULLDOWN_ACTIVATED","UPG.GERMAN.HULLDOWN_CONSTRUCTING","UPG.GERMAN.JAEGER_ARCHETYPE","UPG.GERMAN.JAEGER_LIGHT_INFANTRY","UPG.GERMAN.LIGHT_ARTILLERY_SUPPORT","UPG.GERMAN.LIGHT_INFANTRY_PACKAGE","UPG.GERMAN.LIGHT_INFANTRY_PANZERGREN_PACKAGE","UPG.GERMAN.MECHANIZED_GRENADIER_GROUP","UPG.GERMAN.MECHANIZED_GROUP","UPG.GERMAN.MG42_HOLDFIRE_CAMOUFLAGE_NET_ACTIVATED","UPG.GERMAN.MORTAR_COUNTER_BARRAGE_COOLDOWN_MP","UPG.GERMAN.MORTAR_COUNTER_BARRAGE_MP","UPG.GERMAN.MORTAR_HALFTRACK","UPG.GERMAN.MORTAR_HALFTRACK_250_UPGRADE","UPG.GERMAN.MORTAR_HALFTRACK_COUNTER_BARRAGE_COOLDOWN_MP","UPG.GERMAN.MORTAR_INCENDIARY_BARRAGE","UPG.GERMAN.MUNITION_BLITZ","UPG.GERMAN.OSTRUPPEN","UPG.GERMAN.OSTRUPPEN_RESERVES","UPG.GERMAN.PAK_43_EMPLACEMENT","UPG.GERMAN.PANTHER_TOP_GUNNER","UPG.GERMAN.PANTHER_TOP_GUNNER_MP","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_1_SCHREK_MP","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_MP","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_SECOND","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_SECOND_MP","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_THIRD_MP","UPG.GERMAN.PANZER_TACTICIAN","UPG.GERMAN.PANZER_TOP_GUNNER","UPG.GERMAN.PANZER_TOP_GUNNER_MP","UPG.GERMAN.PANZERBUSCHE_39","UPG.GERMAN.PANZERBUSCHE_39_MP","UPG.GERMAN.PANZERWERFER_COUNTER_BARRAGE_COOLDOWN_MP","UPG.GERMAN.PIONEER_FLAMETHROWER","UPG.GERMAN.PIONEER_FLAMETHROWER_MP","UPG.GERMAN.PIONEER_MINESWEEPER","UPG.GERMAN.PIONEER_MINESWEEPER_MP","UPG.GERMAN.PUMA_DISPATCH","UPG.GERMAN.RAILWAY_ARTILLERY_SUPPORT","UPG.GERMAN.RECON_PLANE","UPG.GERMAN.REDISTRIBUTE_RESOURCES","UPG.GERMAN.RELIEF_INFANTRY","UPG.GERMAN.SDKFZ_222_20MM_GUN","UPG.GERMAN.SDKFZ_222_20MM_GUN_MP","UPG.GERMAN.SDKFZ_251_HALFTRACK_FLAMMPANZERWAGEN_UPGRADE","UPG.GERMAN.SDKFZ_251_HALFTRACK_FLAMMPANZERWAGEN_UPGRADE_MP","UPG.GERMAN.SDKFZ_251_HALFTRACK_MOBILE_MEDIC_STATION_UPGRADE","UPG.GERMAN.SECTOR_ARTILLERY","UPG.GERMAN.SPRINT","UPG.GERMAN.STATIONARY_LOS_GAIN","UPG.GERMAN.STORMTROOPER_ANTITANK_PACKAGE_MP","UPG.GERMAN.STORMTROOPER_ASSAULT_PACKAGE_MP","UPG.GERMAN.STORMTROOPER_PANZERSCHRECK_MP","UPG.GERMAN.STORMTROOPERS","UPG.GERMAN.STRATEGIC_BOMBING","UPG.GERMAN.STUG_III_E_UNLOCK","UPG.GERMAN.STUG_SHORT_BARREL","UPG.GERMAN.STUG_TOP_GUNNER","UPG.GERMAN.STUG_TOP_GUNNER_MP","UPG.GERMAN.STUKA_BOMBING_RUN_UPGRADE","UPG.GERMAN.STUKA_CLOSE_AIR_SUPPORT","UPG.GERMAN.STUKA_FLAME_STRIKE","UPG.GERMAN.STUKA_FRAGMENTATION_BOMB","UPG.GERMAN.STUKA_SMOKE_BOMB","UPG.GERMAN.STUKA_STRAFE","UPG.GERMAN.SUPPLY_BREAK","UPG.GERMAN.SUPPLY_TRUCK_ACTIVE","UPG.GERMAN.SUPPLY_TRUCK_EXIT","UPG.GERMAN.SUPPLY_TRUCK_FILL_STATE","UPG.GERMAN.SUPPLY_TRUCK_FULL","UPG.GERMAN.SUPPLY_TRUCK_LOCKDOWN","UPG.GERMAN.TANK_AWARENESS","UPG.GERMAN.TIGER_TANK","UPG.GERMAN.TIGER_TANK_ACE","UPG.GERMAN.TIGER_TANK_ACE_CALLIN_RESTRICTION","UPG.GERMAN.TIGER_TOP_GUNNER","UPG.GERMAN.TIGER_TOP_GUNNER_MP","UPG.GERMAN.TIGER_TOP_GUNNER_TOW","UPG.GERMAN.TOW_1941_GERMAN","UPG.GERMAN.TRENCH","UPG.GERMAN.TROOP_TRAINING","UPG.GERMAN.URBAN_ASSAULT_ARMOR_UPGRADE","UPG.GERMAN.URBAN_ASSAULT_PANZER_GRENADIERS","UPG.GERMAN.URBAN_ASSAULT_PANZER_GRENADIERS_FLAMETHROWER_MP","UPG.GERMAN.VEHICLES_OPTICS","UPG.GERMAN.XP1_GERMAN_DEMO_UPGRADE","EBP.PROXY.PROXY_MEDIC_MP","EBP.PROXY.PROXY_RIFLEMAN_SOLDIER_A","EBP.PROXY.PROXY_RIFLEMAN_SOLDIER_B","EBP.PROXY.PROXY_RIFLEMAN_SOLDIER_C","EBP.PROXY.PROXY_SNIPER_RECON_MP","SBP.PROXY.PROXY_HMG_SQUAD_MP","SBP.PROXY.PROXY_MECH_SQUAD_MP","SBP.PROXY.PROXY_RIFLEMEN_SQUAD_MP","SBP.PROXY.PROXY_SNIPER_SQUAD_MP","EBP.SOVIET._CIVILIAN_FEMALE","EBP.SOVIET._CIVILIAN_FEMALE_MP","EBP.SOVIET._CIVILIAN_MALE","EBP.SOVIET._CIVILIAN_MALE_MP","EBP.SOVIET.ANTI_PERSONNEL_MINES","EBP.SOVIET.ARTILLERY_203MM_B4","EBP.SOVIET.ATGUN53K_CREW","EBP.SOVIET.ATGUN53K_CREW_MP","EBP.SOVIET.ATGUNZIS_CREW","EBP.SOVIET.ATGUNZIS_CREW_MP","EBP.SOVIET.BARBED_WIRE_FENCE","EBP.SOVIET.BARBED_WIRE_FENCE_MP","EBP.SOVIET.BARBED_WIRE_FIELD","EBP.SOVIET.BARBED_WIRE_FIELD_MP","EBP.SOVIET.BARRACKS","EBP.SOVIET.BARRACKS_MP","EBP.SOVIET.BASE_CONSCRIPT_SOLDIER","EBP.SOVIET.BASE_CONSCRIPT_SOLDIER_MP","EBP.SOVIET.BOAT_01_ENTITY","EBP.SOVIET.CARGO_PLANE_SOVIET","EBP.SOVIET.COMBAT_ENGINEER","EBP.SOVIET.COMBAT_ENGINEER_MP","EBP.SOVIET.COMMISSAR","EBP.SOVIET.COMMISSAR_227","EBP.SOVIET.COMMISSAR_MP","EBP.SOVIET.COMMISSAR_OF_DEATH_227_MP","EBP.SOVIET.CONSCRIPT_SOLDIER","EBP.SOVIET.CONSCRIPT_SOLDIER_CONSCRIPT_BODYGUARD_MP","EBP.SOVIET.CONSCRIPT_SOLDIER_MP","EBP.SOVIET.DHSK_38_MACHINE_GUN","EBP.SOVIET.DHSK_38_MACHINE_GUN_MP","EBP.SOVIET.DSHK_WEAPON_CREW","EBP.SOVIET.DSHK_WEAPON_CREW_MP","EBP.SOVIET.FLARE_FIRE_MP","EBP.SOVIET.FLARE_MINE","EBP.SOVIET.FLARE_MINE_MP","EBP.SOVIET.FORWARD_HQ","EBP.SOVIET.GUARD_TROOPS","EBP.SOVIET.GUARD_TROOPS_ASSAULT_MP","EBP.SOVIET.GUARD_TROOPS_MP","EBP.SOVIET.HM_120_38_MORTAR","EBP.SOVIET.HM_120_38_MORTAR_MP","EBP.SOVIET.HOWITZER_CREW_SOVIET","EBP.SOVIET.HOWITZER_CREW_SOVIET_MP","EBP.SOVIET.HOWITZER_CREW203__SOVIET_MP","EBP.SOVIET.HQ","EBP.SOVIET.HQ_INVISIBLE_SP","EBP.SOVIET.HQ_MP","EBP.SOVIET.HQ_NO_WRECK","EBP.SOVIET.HQ_WRECK","EBP.SOVIET.HQ_WRECK_M06","EBP.SOVIET.HQ_WRECK_MP","EBP.SOVIET.IL_2_STURMOVIK","EBP.SOVIET.IL_2_STURMOVIK_ADVANCED_MP","EBP.SOVIET.IL_2_STURMOVIK_ANTI_TANK_BOMB_MP","EBP.SOVIET.IL_2_STURMOVIK_MARK_VEHICLE_MP","EBP.SOVIET.IL_2_STURMOVIK_MP","EBP.SOVIET.IL_2_STURMOVIK_RECON","EBP.SOVIET.IL_2_STURMOVIK_RECON_MP","EBP.SOVIET.IL_2_STURMOVIK_ROCKET","EBP.SOVIET.IL_2_STURMOVIK_ROCKET_MP","EBP.SOVIET.IL_2_STURMOVIK_ROCKET_SP","EBP.SOVIET.IL_2_STURMOVIK_VICTORY_MP","EBP.SOVIET.IS_2_HEAVY_TANK","EBP.SOVIET.IS_2_HEAVY_TANK_MP","EBP.SOVIET.ISAKOVICH_A01_COMMANDER","EBP.SOVIET.ISAKOVICH_M06","EBP.SOVIET.ISU_152_SPG","EBP.SOVIET.ISU_152_SPG_MP","EBP.SOVIET.KATYUSHA_BM_13N","EBP.SOVIET.KATYUSHA_BM_13N_MP","EBP.SOVIET.KV_1","EBP.SOVIET.KV_1_COMMANDER_MP","EBP.SOVIET.KV_1_MP","EBP.SOVIET.KV_2","EBP.SOVIET.KV_2_MP","EBP.SOVIET.KV_2_TOW","EBP.SOVIET.KV_8","EBP.SOVIET.KV_8_MP","EBP.SOVIET.LIGHT_ANTI_VEHICLE_MINES","EBP.SOVIET.M01_BASE_CONSCRIPT_SOLDIER","EBP.SOVIET.M01_BASE_CONSCRIPT_SOLDIER_DURABLE","EBP.SOVIET.M01_CONSCRIPT_SOLDIER","EBP.SOVIET.M01_CONSCRIPT_SOLDIER_DOCK","EBP.SOVIET.M01_CONSCRIPT_SOLDIER_HARMLESS","EBP.SOVIET.M01_CONSCRIPT_SOLDIER_HARMLESS_DURABLE","EBP.SOVIET.M01_IL_2_STURMOVIK_ROCKET","EBP.SOVIET.M01_IL2_DOGFIGHT","EBP.SOVIET.M01_MEDIC","EBP.SOVIET.M08_T_34_76_SMALLPATH","EBP.SOVIET.M08_TANK_BUSTER_CONSCRIPT","EBP.SOVIET.M11_ANIA_SNIPER","EBP.SOVIET.M11_ISAKOVICH_RECON","EBP.SOVIET.M11_PARTISAN_TROOP_KAR98K","EBP.SOVIET.M11_PARTISAN_TROOP_NAGANT","EBP.SOVIET.M11_PARTISAN_TROOP_NOWEAPON","EBP.SOVIET.M11_SNIPER","EBP.SOVIET.M11_SNIPER_RECON","EBP.SOVIET.M1910_MAXIM_HEAVY_MACHINE_GUN","EBP.SOVIET.M1910_MAXIM_HEAVY_MACHINE_GUN_MP","EBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY","EBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY_COMMANDER_MP","EBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY_MP","EBP.SOVIET.M1937_152MM_ML_20_ARTILLERY","EBP.SOVIET.M1937_152MM_ML_20_ARTILLERY_MP","EBP.SOVIET.M1937_53_K_45MM_AT_GUN","EBP.SOVIET.M1937_53_K_45MM_AT_GUN_MP","EBP.SOVIET.M1942_76MM_DIVISIONAL_GUN_ZIS_3","EBP.SOVIET.M1942_76MM_DIVISIONAL_GUN_ZIS_3_MP","EBP.SOVIET.M3A1_SCOUT_CAR","EBP.SOVIET.M3A1_SCOUT_CAR_MP","EBP.SOVIET.M5_HALFTRACK","EBP.SOVIET.M5_HALFTRACK_ASSAULT_MP","EBP.SOVIET.M5_HALFTRACK_MP","EBP.SOVIET.MACHINE_GUN_NEST","EBP.SOVIET.MACHINE_GUN_NEST_MP","EBP.SOVIET.MAXIM_WEAPON_CREW","EBP.SOVIET.MAXIM_WEAPON_CREW_MP","EBP.SOVIET.MEDIC","EBP.SOVIET.MEDIC_MP","EBP.SOVIET.MORTAR_120MM_WEAPON_CREW_MP","EBP.SOVIET.MORTAR_WEAPON_CREW","EBP.SOVIET.MORTAR_WEAPON_CREW_MP","EBP.SOVIET.MOTORPOOL","EBP.SOVIET.MOTORPOOL_MP","EBP.SOVIET.OBSERVATION_POST_FUEL","EBP.SOVIET.OBSERVATION_POST_FUEL_MP","EBP.SOVIET.OBSERVATION_POST_MUNITION","EBP.SOVIET.OBSERVATION_POST_MUNITION_MP","EBP.SOVIET.PARTISAN_SNIPER","EBP.SOVIET.PARTISAN_TROOP_KAR98K","EBP.SOVIET.PARTISAN_TROOP_KAR98K_2","EBP.SOVIET.PARTISAN_TROOP_KAR98K_2_MP","EBP.SOVIET.PARTISAN_TROOP_KAR98K_MP","EBP.SOVIET.PARTISAN_TROOP_KAR98K_TOW_BD","EBP.SOVIET.PARTISAN_TROOP_KAR98K_TOW_MP","EBP.SOVIET.PARTISAN_TROOP_NAGANT","EBP.SOVIET.PARTISAN_TROOP_NAGANT_MP","EBP.SOVIET.PARTISAN_TROOP_NAGANT_TOW_MP","EBP.SOVIET.PARTISAN_TROOPS_ANTITANK","EBP.SOVIET.PARTISAN_TROOPS_LMG","EBP.SOVIET.PARTISAN_TROOPS_RIFLE","EBP.SOVIET.PARTISAN_TROOPS_SMG","EBP.SOVIET.PENAL_BATTALION_TROOPS","EBP.SOVIET.PENAL_BATTALION_TROOPS_MP","EBP.SOVIET.PM41_82MM_MORTAR","EBP.SOVIET.PM41_82MM_MORTAR_MP","EBP.SOVIET.REFUGEE_FEMALE","EBP.SOVIET.REFUGEE_FEMALE_MP","EBP.SOVIET.REFUGEE_MALE","EBP.SOVIET.REFUGEE_MALE_MP","EBP.SOVIET.REPAIR_ENGINEER","EBP.SOVIET.REPAIR_ENGINEER_MP","EBP.SOVIET.REPAIR_STATION_MP","EBP.SOVIET.SAND_BAG_SOVIET","EBP.SOVIET.SAND_BAG_SOVIET_MP","EBP.SOVIET.SAND_BAG_SOVIET_TUTORIAL","EBP.SOVIET.SHERMAN_SOVIET","EBP.SOVIET.SHOCK_TROOPS","EBP.SOVIET.SHOCK_TROOPS_MP","EBP.SOVIET.SNIPER","EBP.SOVIET.SNIPER_ATK_TARGET","EBP.SOVIET.SNIPER_MP","EBP.SOVIET.SNIPER_RECON","EBP.SOVIET.SNIPER_RECON_MP","EBP.SOVIET.SOVIET_ALLIED_CARGO_PLANE","EBP.SOVIET.SOVIET_BASE_STAMPER","EBP.SOVIET.SOVIET_MINE","EBP.SOVIET.SOVIET_MINE_M08","EBP.SOVIET.SOVIET_MINE_MP","EBP.SOVIET.SOVIET_MINE_SP","EBP.SOVIET.SOVIET_MINE_TOW","EBP.SOVIET.SOVIET_OFFICER","EBP.SOVIET.SOVIET_OFFICER_MP","EBP.SOVIET.STEAM_TRAIN","EBP.SOVIET.SU_76M","EBP.SOVIET.SU_76M_MP","EBP.SOVIET.SU_85","EBP.SOVIET.SU_85_MP","EBP.SOVIET.T_34_76","EBP.SOVIET.T_34_76_MP","EBP.SOVIET.T_34_85","EBP.SOVIET.T_34_85_MP","EBP.SOVIET.T_70M","EBP.SOVIET.T_70M_MP","EBP.SOVIET.TANK_DEPOT","EBP.SOVIET.TANK_DEPOT_MP","EBP.SOVIET.TANKTRAP","EBP.SOVIET.TOW_COLD_WEAETHER_GUARD_TROOPS","EBP.SOVIET.US6_TRUCK","EBP.SOVIET.US6_TRUCK_MP","EBP.SOVIET.WEAPON_SUPPORT_CENTER","EBP.SOVIET.WEAPON_SUPPORT_CENTER_MP","EBP.SOVIET.WIRE_FIELD","EBP.SOVIET.WIRE_FIELD_MP","EBP.SOVIET.ZIS_6_TRANSPORT","EBP.SOVIET.ZIS_6_TRANSPORT_MP","SBP.SOVIET.BASE_CONSCRIPT_SQUAD","SBP.SOVIET.BASE_CONSCRIPT_SQUAD_MP","SBP.SOVIET.BOAT_01","SBP.SOVIET.CARGO_PLANE_SOVIET","SBP.SOVIET.COMBAT_ENGINEER_SQUAD","SBP.SOVIET.COMBAT_ENGINEER_SQUAD_MP","SBP.SOVIET.COMMISSAR_227","SBP.SOVIET.COMMISSAR_SQUAD_BATTLE","SBP.SOVIET.COMMISSAR_SQUAD_MP","SBP.SOVIET.COMMISSAR_SQUAD_TOW","SBP.SOVIET.CONSCRIPT_SQUAD","SBP.SOVIET.CONSCRIPT_SQUAD_MP","SBP.SOVIET.CONSCRIPT_SQUAD_TUTORIAL","SBP.SOVIET.DSHK_38_HMG_SQUAD","SBP.SOVIET.DSHK_38_HMG_SQUAD_MP","SBP.SOVIET.GUARDS_TROOPS","SBP.SOVIET.GUARDS_TROOPS_ASSAULT_MP","SBP.SOVIET.GUARDS_TROOPS_M08","SBP.SOVIET.GUARDS_TROOPS_MP","SBP.SOVIET.HM_120_38_MORTAR_SQUAD","SBP.SOVIET.HM_120_38_MORTAR_SQUAD_MP","SBP.SOVIET.IL_2_STUMOVIK_SQUAD","SBP.SOVIET.IL_2_STUMOVIK_SQUAD_ADVANCED_MP","SBP.SOVIET.IL_2_STUMOVIK_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_ANTI_TANK_BOMB_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_MARK_VEHICLE_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_RECON_SQUAD","SBP.SOVIET.IL_2_STURMOVIK_RECON_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_RECON_SQUAD_SP","SBP.SOVIET.IL_2_STURMOVIK_ROCKET_SP_SQUAD","SBP.SOVIET.IL_2_STURMOVIK_ROCKET_SP_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_ROCKET_SQUAD","SBP.SOVIET.IL_2_STURMOVIK_ROCKET_SQUAD_MP","SBP.SOVIET.IS_2","SBP.SOVIET.IS_2_MP","SBP.SOVIET.IS_2_TOW","SBP.SOVIET.ISU_152","SBP.SOVIET.ISU_152_MP","SBP.SOVIET.KATYUSHA_BM_13N_SQUAD","SBP.SOVIET.KATYUSHA_BM_13N_SQUAD_MP","SBP.SOVIET.KV_1","SBP.SOVIET.KV_1_COMMANDER_MP","SBP.SOVIET.KV_1_MP","SBP.SOVIET.KV_1_SP","SBP.SOVIET.KV_2","SBP.SOVIET.KV_2_MP","SBP.SOVIET.KV_2_TOW","SBP.SOVIET.KV_2_TOW_BATTLE","SBP.SOVIET.KV_8","SBP.SOVIET.KV_8_MP","SBP.SOVIET.M01_CONSCRIPT_SQUAD_DOCKS","SBP.SOVIET.M01_CONSCRIPT_SQUAD_HARMLESS","SBP.SOVIET.M01_CONSCRIPT_SQUAD_HARMLESS_DURABLE","SBP.SOVIET.M01_CONSCRIPT_SQUAD_WOUNDED","SBP.SOVIET.M01_IL_2_STURMOVIK_ROCKET_SQUAD","SBP.SOVIET.M01_IL2_DOGFIGHT","SBP.SOVIET.M01_MEDIC","SBP.SOVIET.M02_COMBAT_ENGINEER_SQUAD","SBP.SOVIET.M02_REFUGEE_SQUAD","SBP.SOVIET.M08_COMBAT_ENGINEER_SQUAD","SBP.SOVIET.M08_T_34_76_SQUAD_SMALLPATH","SBP.SOVIET.M08_TANK_BUSTER_CONSCRIPT_SQUAD","SBP.SOVIET.M11_ANIA_SNIPER_SQUAD","SBP.SOVIET.M11_ISAKOVICH_SQUAD","SBP.SOVIET.M11_PARTISAN_SQUAD_KAR98K_RIFLE","SBP.SOVIET.M11_PARTISAN_SQUAD_NAGANT_RIFLE","SBP.SOVIET.M11_PARTISAN_SQUAD_NOWEAPON","SBP.SOVIET.M11_SNIPER_TEAM","SBP.SOVIET.M1910_MAXIM_HEAVY_MACHINE_GUN_SQUAD","SBP.SOVIET.M1910_MAXIM_HEAVY_MACHINE_GUN_SQUAD_MP","SBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY","SBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY_COMMANDER_MP","SBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY_MP","SBP.SOVIET.M1937_152MM_ML_20_ARTILLERY","SBP.SOVIET.M1937_152MM_ML_20_ARTILLERY_MP","SBP.SOVIET.M1937_53_K_45MM_AT_GUN_SQUAD","SBP.SOVIET.M1937_53_K_45MM_AT_GUN_SQUAD_MP","SBP.SOVIET.M1942_ZIS_3_76MM_AT_GUN_SQUAD","SBP.SOVIET.M1942_ZIS_3_76MM_AT_GUN_SQUAD_MP","SBP.SOVIET.M3A1_SCOUT_CAR_SQUAD","SBP.SOVIET.M3A1_SCOUT_CAR_SQUAD_MP","SBP.SOVIET.M5_HALFTRACK__ASSAULT_SQUAD_MP","SBP.SOVIET.M5_HALFTRACK_SQUAD","SBP.SOVIET.M5_HALFTRACK_SQUAD_MP","SBP.SOVIET.PARTISAN_SQUAD_GRANATEWERFER_34_81MM_MORTAR","SBP.SOVIET.PARTISAN_SQUAD_GRANATEWERFER_34_81MM_MORTAR_MP","SBP.SOVIET.PARTISAN_SQUAD_KAR98K_RIFLE","SBP.SOVIET.PARTISAN_SQUAD_KAR98K_RIFLE_MP","SBP.SOVIET.PARTISAN_SQUAD_MAXIM_HMG","SBP.SOVIET.PARTISAN_SQUAD_MAXIM_HMG_MP","SBP.SOVIET.PARTISAN_SQUAD_MG42_HMG","SBP.SOVIET.PARTISAN_SQUAD_MG42_HMG_MP","SBP.SOVIET.PARTISAN_SQUAD_NAGANT_RIFLE","SBP.SOVIET.PARTISAN_SQUAD_NAGANT_RIFLE_MP","SBP.SOVIET.PARTISAN_SQUAD_PM_82_41_MORTAR","SBP.SOVIET.PARTISAN_SQUAD_PM_82_41_MORTAR_MP","SBP.SOVIET.PARTISANS_LMG_MP","SBP.SOVIET.PARTISANS_PANZERSCHRECK_MP","SBP.SOVIET.PARTISANS_PTRS_MP","SBP.SOVIET.PARTISANS_RIFLE_MP","SBP.SOVIET.PARTISANS_SMG_MP","SBP.SOVIET.PENAL_BATTALION","SBP.SOVIET.PENAL_BATTALION_MP","SBP.SOVIET.PM_82_41_MORTAR_SQUAD","SBP.SOVIET.PM_82_41_MORTAR_SQUAD_MP","SBP.SOVIET.SHOCK_TROOPS","SBP.SOVIET.SHOCK_TROOPS_M11","SBP.SOVIET.SHOCK_TROOPS_MP","SBP.SOVIET.SNIPER_TEAM","SBP.SOVIET.SNIPER_TEAM_MALE","SBP.SOVIET.SNIPER_TEAM_MP","SBP.SOVIET.SOVIET_76MM_SHERMAN_MP","SBP.SOVIET.SOVIET_ALLIED_CARGO_PLANE","SBP.SOVIET.SOVIET_OFFICER_SQUAD","SBP.SOVIET.SOVIET_OFFICER_SQUAD_MP","SBP.SOVIET.STEAM_TRAIN","SBP.SOVIET.SU_76M","SBP.SOVIET.SU_76M_MP","SBP.SOVIET.SU_76M_TOW","SBP.SOVIET.SU_85","SBP.SOVIET.SU_85_MP","SBP.SOVIET.T_34_76_SQUAD","SBP.SOVIET.T_34_76_SQUAD_MP","SBP.SOVIET.T_34_85_ADVANCED_SQUAD_MP","SBP.SOVIET.T_34_85_SQUAD","SBP.SOVIET.T_34_85_SQUAD_MP","SBP.SOVIET.T_70M","SBP.SOVIET.T_70M_MP","SBP.SOVIET.TOW_BRIDGE_PARTISAN_SQUAD_AT","SBP.SOVIET.TOW_BRIDGE_PARTISAN_SQUAD_BASE","SBP.SOVIET.TOW_BRIDGE_PARTISAN_SQUAD_MAXIM","SBP.SOVIET.TOW_BRIDGE_PARTISAN_SQUAD_MORTAR","SBP.SOVIET.TOW_COLD_WEATHER_GUARDS_TROOPS","SBP.SOVIET.TOW_PARTISAN_SQUAD_KAR98K_RIFLE_MP","SBP.SOVIET.TOW_PARTISAN_SQUAD_LMG_SQUAD","SBP.SOVIET.TOW_PARTISAN_SQUAD_MAXIM_HMG_MP","SBP.SOVIET.US6_TRUCK_SQUAD","SBP.SOVIET.ZIS_6_TRANSPORT_TRUCK","SBP.SOVIET.ZIS_6_TRANSPORT_TRUCK_MP","ABILITY.SOVIET.ALLIED_AIR_SUPPLIES","ABILITY.SOVIET.ANTI_PERSONNEL_MINES","ABILITY.SOVIET.ANTI_TANK_GRENADE","ABILITY.SOVIET.ANTI_TANK_GRENADE_ASSAULT","ABILITY.SOVIET.ANTI_TANK_GRENADE_MP","ABILITY.SOVIET.ANTI_TANK_GRENADE_NO_REQUIREMENTS_MP","ABILITY.SOVIET.AT_76MM_HE_BARRAGE_ABILITY","ABILITY.SOVIET.AT_76MM_HE_BARRAGE_ABILITY_MP","ABILITY.SOVIET.AT_GUN_AMBUSH_TACTICS","ABILITY.SOVIET.B4_203MM_BARRAGE","ABILITY.SOVIET.B4_203MM_BARRAGE_COMMANDER_MP","ABILITY.SOVIET.B4_203MM_BARRAGE_COMMANDER_PRECISE_MP","ABILITY.SOVIET.B4_203MM_BARRAGE_COMMANDER_VET3_MP","ABILITY.SOVIET.B4_203MM_BARRAGE_COMMANDER_VICTORTARGET_MP","ABILITY.SOVIET.B4_203MM_BARRAGE_MP","ABILITY.SOVIET.B4_203MM_DIRECT_FIRE","ABILITY.SOVIET.B4_203MM_HOWITZER","ABILITY.SOVIET.BASE_CONSCRIPT_DISPATCH","ABILITY.SOVIET.BASE_CONSCRIPT_DISPATCH_MP","ABILITY.SOVIET.BOMBARDMENT_FX","ABILITY.SOVIET.BOOBY_TRAP","ABILITY.SOVIET.BUTTON_VEHICLE","ABILITY.SOVIET.BUTTON_VEHICLE_MP","ABILITY.SOVIET.BUTTON_VEHICLE_TOW","ABILITY.SOVIET.CAMPAIGN_SHOCK_FIRE_SUPERIORITY","ABILITY.SOVIET.CMD_120MM_MORTAR_CREW","ABILITY.SOVIET.CMD_ADVANCED_T34_85_MEDIUM_TANK","ABILITY.SOVIET.CMD_AT_GUN_AMBUSH_TACTICS_MP","ABILITY.SOVIET.CMD_CONSCRIPT_ASSAULT_PACKAGE","ABILITY.SOVIET.CMD_CONSCRIPT_EVASIVE_TACTICS","ABILITY.SOVIET.CMD_CONSCRIPT_REPAIR_KIT","ABILITY.SOVIET.CMD_GUARD_TROOPS","ABILITY.SOVIET.CMD_IS2_HEAVY_TANK","ABILITY.SOVIET.CMD_ISU_152","ABILITY.SOVIET.CMD_KATYUSHA","ABILITY.SOVIET.CMD_KV_1_UNLOCK","ABILITY.SOVIET.CMD_KV_8_UNLOCK_MP","ABILITY.SOVIET.CMD_ML_20","ABILITY.SOVIET.CMD_PENAL_BATTALION","ABILITY.SOVIET.CMD_RADIO_INTERCEPT","ABILITY.SOVIET.CMD_SHOCK_TROOPS","ABILITY.SOVIET.CMD_SOVIET_INDUSTRY","ABILITY.SOVIET.CMD_T34_85_MEDIUM_TANK","ABILITY.SOVIET.CMD_VEHICLE_CREW_REPAIR_TRAINING","ABILITY.SOVIET.COMMISSAR_SQUAD_MP","ABILITY.SOVIET.CONE_LOS_TOGGLE_ABILITY","ABILITY.SOVIET.CONE_LOS_TOGGLE_ABILITY_MP","ABILITY.SOVIET.CONSCRIPT_ANTI_TANK_GRENADE_ASSAULT_MP","ABILITY.SOVIET.CONSCRIPT_DISPATCH_MP","ABILITY.SOVIET.CONSCRIPT_EVASIVE_TACTICS","ABILITY.SOVIET.CONSCRIPT_EVASIVE_TACTICS_MP","ABILITY.SOVIET.CONSCRIPT_MOLOTOV_COCKTAIL","ABILITY.SOVIET.CONSCRIPT_MOLOTOV_COCKTAIL_MP","ABILITY.SOVIET.CONSCRIPT_OORAH","ABILITY.SOVIET.CONSCRIPT_OORAH_MP","ABILITY.SOVIET.CONSCRIPT_PTRS_UPGRADE","ABILITY.SOVIET.DSHK_ARMOR_PIERCING","ABILITY.SOVIET.DSHK_MP","ABILITY.SOVIET.ENGINEER_SALVAGE_WRECK","ABILITY.SOVIET.FATALITY_FEAR_PROPAGANDA_ARTILLERY","ABILITY.SOVIET.FATALITY_INCENDIARY_ARTILLERY","ABILITY.SOVIET.FATALITY_KATYUSHA_ROCKETS","ABILITY.SOVIET.FEAR_PROPAGANDA_ARTILLERY","ABILITY.SOVIET.FIELDCRAFT_TRIP_FLARE","ABILITY.SOVIET.FIELDCRAFT_TRIP_FLARE_MP","ABILITY.SOVIET.FIRE_ARTILLERY","ABILITY.SOVIET.FOR_MOTHER_RUSSIA_ABILITY","ABILITY.SOVIET.FORWARD_HQ","ABILITY.SOVIET.FRONTOVIKI_CONSCRIPT_DISPATCH","ABILITY.SOVIET.GUARDS_THROW_DEFENSIVE_GRENADE","ABILITY.SOVIET.GUARDS_THROW_DEFENSIVE_GRENADE_MP","ABILITY.SOVIET.HOLD_THE_LINE","ABILITY.SOVIET.IL_2_ANTI_TANK_BOMB_STRIKE","ABILITY.SOVIET.IL_2_ATTACK_STRAFE","ABILITY.SOVIET.IL_2_BOMBING_RUN_SP","ABILITY.SOVIET.IL_2_PRECISION_BOMB_STRIKE","ABILITY.SOVIET.IL_2_RECON","ABILITY.SOVIET.IL_2_RECON_SINGLEPASS_SP","ABILITY.SOVIET.IL_2_RECON_SP","ABILITY.SOVIET.IL_2_STURMOVIK_ATTACK","ABILITY.SOVIET.IL_2_STURMOVIK_ATTACK_ADVANCED","ABILITY.SOVIET.IL_2_SUPPORT","ABILITY.SOVIET.IL_2_SUPPORT_PRECISION_SP","ABILITY.SOVIET.IL_2_SUPPORT_SP","ABILITY.SOVIET.IS2_DISPATCH_SP","ABILITY.SOVIET.IS2_TANK_DEFENSIVE_WEAPON_MP","ABILITY.SOVIET.ISU_152_DISPATCH_SP","ABILITY.SOVIET.ISU_152_PIERCING_SHOT_ABILITY","ABILITY.SOVIET.ISU_152_PIERCING_SHOT_ABILITY_MP","ABILITY.SOVIET.ISU152_AMMO_SWITCH_AP_SHELL_MP","ABILITY.SOVIET.ISU152_AMMO_SWITCH_HE_SHELL_MP","ABILITY.SOVIET.ISU152_CONCRETE_PIERCING_ROUND_MP","ABILITY.SOVIET.KATUSHYA_CREEPING_BARRAGE_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_BARRAGE","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_BARRAGE_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_BARRAGE_VET3_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_BARRAGE_VICTORTARGET_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_CREEPING_BARRAGE_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_PRECISION_BARRAGE","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_PRECISION_BARRAGE_MP","ABILITY.SOVIET.KV_2","ABILITY.SOVIET.KV_2_SEIGE_MODE","ABILITY.SOVIET.KV_8_FLAME_45MM_TOGGLE_MP","ABILITY.SOVIET.LIGHT_ANTI_VEHICLE_MINES","ABILITY.SOVIET.M_42_AT_GUN","ABILITY.SOVIET.M11_PARTISANS_DISPATCH_KARK98K","ABILITY.SOVIET.M11_PARTISANS_DISPATCH_NAGANT","ABILITY.SOVIET.M11_SNIPER_DISPATCH02","ABILITY.SOVIET.M11_SNIPER_DISPATCH02_MP","ABILITY.SOVIET.M11_SNIPER_HOLD_FIRE","ABILITY.SOVIET.M3A1_M5_MOVING_ACCURACY_MP","ABILITY.SOVIET.M5_HALFTRACK_ASSAULT","ABILITY.SOVIET.M5_M3A1_OVERDRIVE","ABILITY.SOVIET.M5_M3A1_OVERDRIVE_MP","ABILITY.SOVIET.MANPOWER_BLITZ","ABILITY.SOVIET.MARK_VEHICLE","ABILITY.SOVIET.MAXIM_HMG_DISPATCH_SP","ABILITY.SOVIET.MERGE_ABILITY","ABILITY.SOVIET.MERGE_ABILITY_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_SLOW","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_SLOW_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_VET_1_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_VET3_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_VICTORTARGET_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_PRECISON_ABILITY_MP","ABILITY.SOVIET.MORTAR_EXPLOSION_FX","ABILITY.SOVIET.MORTAR_EXPLOSION_FX_ICE","ABILITY.SOVIET.MORTAR_FIRE_FLARES_ABILITY_MP","ABILITY.SOVIET.MORTAR_PRECISION_BARRAGE_120MM_VET","ABILITY.SOVIET.MORTAR_PRECISION_BARRAGE_120MM_VET_MP","ABILITY.SOVIET.MORTAR_PRECISION_BARRAGE_82MM","ABILITY.SOVIET.MORTAR_PRECISION_BARRAGE_82MM_MP","ABILITY.SOVIET.NO_RETREAT_NO_SURRENDER","ABILITY.SOVIET.PARTISAN_DISPATCH","ABILITY.SOVIET.PARTISAN_DISPATCH_TOW","ABILITY.SOVIET.PARTISAN_MOLOTOV_COCKTAIL_MP","ABILITY.SOVIET.PARTISANS_COMMANDER_ANTI_INFANTRY","ABILITY.SOVIET.PARTISANS_COMMANDER_ANTI_VEHICLE","ABILITY.SOVIET.PENAL_OORAH_MP","ABILITY.SOVIET.PENAL_TROOP_DISPATCH_SINGLE_SP","ABILITY.SOVIET.PENAL_TROOP_DISPATCH_SP","ABILITY.SOVIET.RAPID_CONSCRIPTION","ABILITY.SOVIET.REPAIR_STATION","ABILITY.SOVIET.RG_42_ANTI_PERSONNEL_GRENADE","ABILITY.SOVIET.RG_42_ANTI_PERSONNEL_GRENADE_MP","ABILITY.SOVIET.RGD_1_SMOKE_GRENADE","ABILITY.SOVIET.RGD_1_SMOKE_GRENADE_MP","ABILITY.SOVIET.RGD_33_PARTISAN_GRENADE_MP","ABILITY.SOVIET.SALVAGE_KITS","ABILITY.SOVIET.SATCHEL_CHARGE_THROW_ABILITY_MP","ABILITY.SOVIET.SCORCHED_EARTH_POLICY","ABILITY.SOVIET.SCORCHED_EARTH_POLICY_MP","ABILITY.SOVIET.SHERMAN_SOVIET_DISPATCH","ABILITY.SOVIET.SHERMAN76MM_AMMO_SWITCH_AP_SHELL_MP","ABILITY.SOVIET.SHERMAN76MM_AMMO_SWITCH_HE_SHELL_MP","ABILITY.SOVIET.SHOCK_TROOP_DISPATCH_SP","ABILITY.SOVIET.SHOCK_TROOP_SMOKE_GRENADES","ABILITY.SOVIET.SMOKE_120MM_MORTAR_BARRAGE","ABILITY.SOVIET.SMOKE_120MM_MORTAR_BARRAGE_MP","ABILITY.SOVIET.SMOKE_SYNC_MORTAR_BARRAGE","ABILITY.SOVIET.SMOKE_SYNC_MORTAR_BARRAGE_MP","ABILITY.SOVIET.SNIPER_DELAYED_COVER_AUTO_CAMOUFLAGE","ABILITY.SOVIET.SNIPER_DELAYED_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.SOVIET.SNIPER_FIRE_FLARES_ABILITY","ABILITY.SOVIET.SNIPER_FIRE_FLARES_ABILITY_MP","ABILITY.SOVIET.SNIPER_HMG_SPRINT","ABILITY.SOVIET.SNIPER_HMG_SPRINT_MP","ABILITY.SOVIET.SNIPER_HOLD_FIRE","ABILITY.SOVIET.SNIPER_HOLD_FIRE_MP","ABILITY.SOVIET.SNIPER_IN_COVER_AUTO_CAMOUFLAGE","ABILITY.SOVIET.SNIPER_IN_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.SOVIET.SNIPER_SUPPRESSION_FIRE_ABILITY","ABILITY.SOVIET.SNIPER_SUPPRESSION_FIRE_ABILITY_MP","ABILITY.SOVIET.SOV_VEHICLE_HOLD_FIRE_MP","ABILITY.SOVIET.SOVIET_BARBED_WIRE_CUTTING_ABILITY","ABILITY.SOVIET.SOVIET_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.SOVIET.SOVIET_CAMO_HOLD_FIRE_MP","ABILITY.SOVIET.SOVIET_CONSCRIPT_REPAIR_ABILITY","ABILITY.SOVIET.SOVIET_CONSCRIPT_REPAIR_ABILITY_MP","ABILITY.SOVIET.SOVIET_HQ_ENGINEER_CALL_IN","ABILITY.SOVIET.SOVIET_INDUSTRY","ABILITY.SOVIET.SOVIET_REPAIR_ABILITY","ABILITY.SOVIET.SOVIET_REPAIR_ABILITY_MP","ABILITY.SOVIET.SOVIET_WAR_MACHINE_SP","ABILITY.SOVIET.SPY_NETWORK","ABILITY.SOVIET.SU_76_BARRAGE_ABILITY","ABILITY.SOVIET.SU_76_BARRAGE_ABILITY_MP","ABILITY.SOVIET.SU76_SU85_ZIS3_53K_ISU152_INFANTRY_TRACKING","ABILITY.SOVIET.SU76_SU85_ZIS3_53K_ISU152_INFANTRY_TRACKING_MP","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_120MM","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_120MM_MP","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_120MM_VICTORTARGET_MP","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_MP","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_VICTORTARGET_MP","ABILITY.SOVIET.T_34_RAMMING_ABILITY","ABILITY.SOVIET.T_34_RAMMING_ABILITY_MP","ABILITY.SOVIET.T70_CREW_REPAIR_ABILITY","ABILITY.SOVIET.T70_CREW_REPAIR_ABILITY_MP","ABILITY.SOVIET.TANK_DETECTION_ABILITY","ABILITY.SOVIET.TANK_TRAPS","ABILITY.SOVIET.TANK_VET_POINT_CAPTURE_ABILITY","ABILITY.SOVIET.TANK_VET_POINT_CAPTURE_ABILITY_MP","ABILITY.SOVIET.TO_THE_LAST_MAN_MP","ABILITY.SOVIET.VEHICLE_CREW_REPAIR_ABILITY","ABILITY.SOVIET.VEHICLE_CREW_REPAIR_ABILITY_MP","ABILITY.SOVIET.VEHICLE_CREW_REPAIR_TOGGLE_MP","ABILITY.SOVIET.VEHICLE_RECON_TOGGLE","ABILITY.SOVIET.VEHICLE_RECON_TOGGLE_MP","ABILITY.SOVIET.VEHICLE_RECON_TOGGLE_VET2_MP","UPG.SOVIET.ABILITY_LOCK_OUT_CONSCRIPT","UPG.SOVIET.ABILITY_LOCK_OUT_CONSCRIPT_MP","UPG.SOVIET.ALLIED_AIR_SUPPLIES","UPG.SOVIET.ANTI_PERSONNEL_MINES","UPG.SOVIET.ANTI_TANK_GUN_AMBUSH_TACTICS","UPG.SOVIET.BASE_CONSCRIPT_AT_GRENADE_UNLOCK","UPG.SOVIET.BASE_CONSCRIPT_AT_GRENADE_UNLOCK_MP","UPG.SOVIET.BASE_CONSCRIPT_MOLOTOV_UNLOCK","UPG.SOVIET.BASE_CONSCRIPT_MOLOTOV_UNLOCK_MP","UPG.SOVIET.BASE_CONSCRIPT_OORAH_UNLOCK","UPG.SOVIET.BASE_CONSCRIPT_OORAH_UNLOCK_MP","UPG.SOVIET.BASE_CONSCRIPT_REPAIR_UNLOCK_MP","UPG.SOVIET.BASE_CONSCRIPT_RIFLE_UNLOCK_MP","UPG.SOVIET.BOOBY_TRAP","UPG.SOVIET.CAMOUFLAGE_NET_ACTIVATED_SOVIET","UPG.SOVIET.COMMANDER_T34_85_MP","UPG.SOVIET.COMMISSAR_SQUAD","UPG.SOVIET.CONSCRIPT_ASSAULT_PACKAGE","UPG.SOVIET.CONSCRIPT_ASSAULT_PACKAGE_INGAME","UPG.SOVIET.CONSCRIPT_AT_GRENADE_ASSAULT","UPG.SOVIET.CONSCRIPT_DP_28_LMG_PACKAGE","UPG.SOVIET.CONSCRIPT_EVASIVE_TACTICS","UPG.SOVIET.CONSCRIPT_MOBILIZE_UNLOCK","UPG.SOVIET.CONSCRIPT_PTRS","UPG.SOVIET.CONSCRIPT_PTRS_PACKAGE","UPG.SOVIET.CONSCRIPT_REPAIR_KIT","UPG.SOVIET.DEMO_IL_2_STRAFING_RUN","UPG.SOVIET.DSHK_MACHINEGUN","UPG.SOVIET.ENGINEER_FLAMETHROWER","UPG.SOVIET.ENGINEER_FLAMETHROWER_MP","UPG.SOVIET.ENGINEER_MINESWEEPER","UPG.SOVIET.ENGINEER_MINESWEEPER_MP","UPG.SOVIET.ENGINEER_SALVAGE_KIT","UPG.SOVIET.ENGINEER_SALVAGE_KITS_UNLOCK","UPG.SOVIET.EVASIVE_TACTICS_IS_ON","UPG.SOVIET.FEAR_PROPAGANDA","UPG.SOVIET.FIRE_ARTILLERY","UPG.SOVIET.FOR_MOTHER_RUSSIA","UPG.SOVIET.FORWARD_HQ","UPG.SOVIET.FORWARD_HQ_AURA","UPG.SOVIET.GUARD_ARCHETYPE","UPG.SOVIET.GUARD_DP_28_LMG_PACKAGE","UPG.SOVIET.GUARD_DP_28_LMG_PACKAGE_MP","UPG.SOVIET.GUARD_TROOPS","UPG.SOVIET.HM120_MORTAR_UNLOCK","UPG.SOVIET.HOLD_FIRE_SOVIET_CAMMO","UPG.SOVIET.HOLD_THE_LINE","UPG.SOVIET.HOWTIZER_203MM","UPG.SOVIET.HQ_ANTI_TANK_GRENADE","UPG.SOVIET.HQ_ANTI_TANK_GRENADE_MP","UPG.SOVIET.HQ_CONSCRIPT_REPAIR_KIT","UPG.SOVIET.HQ_HEALING_AURA","UPG.SOVIET.HQ_HEALING_AURA_M13","UPG.SOVIET.HQ_HEALING_AURA_MP","UPG.SOVIET.HQ_MOLOTOV_GRENADE_MP","UPG.SOVIET.IL_2_ANTI_TANK_BOMB","UPG.SOVIET.IL_2_BOMB_STRIKE","UPG.SOVIET.IL_2_RECON","UPG.SOVIET.IL_2_STURMOVIK_ATTACK","UPG.SOVIET.IL_2_STURMOVIK_ATTACK_ADVANCED","UPG.SOVIET.IL_2_SUPPORT","UPG.SOVIET.IS_2_SUPPORT","UPG.SOVIET.IS2_TOP_GUNNER","UPG.SOVIET.IS2_TOP_GUNNER_MP","UPG.SOVIET.ISAKOVICH_A01","UPG.SOVIET.ISU152_HE_ROUNDS","UPG.SOVIET.ISU152_TOP_GUNNER","UPG.SOVIET.ISU152_TOP_GUNNER_MP","UPG.SOVIET.ISU152_UNLOCK","UPG.SOVIET.KATYUSHA_UNLOCK","UPG.SOVIET.KV_1_UNLOCK_DEMO","UPG.SOVIET.KV_8_UNLOCK","UPG.SOVIET.KV1_UNLOCK","UPG.SOVIET.KV2_UNLOCK","UPG.SOVIET.LIGHT_ANTI_VEHICLE_MINES","UPG.SOVIET.M_42_AT_GUN","UPG.SOVIET.M3_HALFTRACK_ASSAULT","UPG.SOVIET.M5_HALFTRACK_72K_AA_GUN_PACKAGE","UPG.SOVIET.M5_HALFTRACK_72K_AA_GUN_PACKAGE_MP","UPG.SOVIET.MANPOWER_BLITZ","UPG.SOVIET.MARK_VEHICLE","UPG.SOVIET.ML_20_HOWITZER_UNLOCK","UPG.SOVIET.NKVD_ARCHETYPE","UPG.SOVIET.ORDER_227_DISABLE","UPG.SOVIET.ORDER_227_LOCKDOWN","UPG.SOVIET.ORDER227","UPG.SOVIET.PARTISAN_COMMANDER_ANTIVEHICLE_TROOPS","UPG.SOVIET.PARTISAN_COMMANDER_TROOPS","UPG.SOVIET.PARTISAN_HEALTH_UPGRADE","UPG.SOVIET.PARTISAN_HEALTH_UPGRADE_TANK_HUNTER","UPG.SOVIET.PARTISAN_TROOPS","UPG.SOVIET.PARTISAN_TROOPS_TOW","UPG.SOVIET.PENAL_BATTALION","UPG.SOVIET.PENAL_BATTALION_FLAMETHROWER_PACKAGE","UPG.SOVIET.PENAL_BATTALION_FLAMETHROWER_PACKAGE_MP","UPG.SOVIET.PPSH_41_SUB_MACHINE_GUN_UPGRADE","UPG.SOVIET.PPSH_41_SUB_MACHINE_GUN_UPGRADE_MP","UPG.SOVIET.PTRS_41_AT_RIFLE_PACKAGE_GUARD_TROOP","UPG.SOVIET.PTRS_41_AT_RIFLE_PACKAGE_GUARD_TROOP_ASSAULT_MP","UPG.SOVIET.PTRS_41_AT_RIFLE_PACKAGE_GUARD_TROOP_BETTER_BALANCED","UPG.SOVIET.PTRS_41_AT_RIFLE_PACKAGE_GUARD_TROOP_MP","UPG.SOVIET.RADIO_INTERCEPT","UPG.SOVIET.RAPID_CONSCRIPTION","UPG.SOVIET.REPAIR_BUNKER","UPG.SOVIET.SCORCHED_EARTH_POLICY","UPG.SOVIET.SCORCHED_EARTH_POLICY_MP","UPG.SOVIET.SHERMAN_SOVIET_DISPATCH","UPG.SOVIET.SHERMAN_SOVIET_TOP_GUNNER","UPG.SOVIET.SHOCK_ARCHETYPE","UPG.SOVIET.SHOCK_TROOPS","UPG.SOVIET.SHOCK_TROOPS_SP","UPG.SOVIET.SOVIET_GRENADES_LONG_TIMER","UPG.SOVIET.SOVIET_INDUSTRY","UPG.SOVIET.SPY_NETWORK","UPG.SOVIET.T34_85_ADVANCED_UNLOCK","UPG.SOVIET.T34_85_UNLOCK","UPG.SOVIET.TANK_DETECTION","UPG.SOVIET.TANK_RAID_ENABLED","UPG.SOVIET.TANK_TRAPS","UPG.SOVIET.TOW_1941_SOVIET","UPG.SOVIET.VEHICLE_SELF_REPAIR_TRAINING","EBP.WEST_GERMAN.ANTI_TANK_GUN_CREW_MP","EBP.WEST_GERMAN.ARMORED_CAR_SDKFZ_223","EBP.WEST_GERMAN.ARTY_CREW_MP","EBP.WEST_GERMAN.ASSAULT_PIONEER_MP","EBP.WEST_GERMAN.ASSAULT_PIONEERS_HEAVY_MINE_MP","EBP.WEST_GERMAN.BASE_FLAK_GUN_MP","EBP.WEST_GERMAN.BASE_FLAK_SANDBAGS","EBP.WEST_GERMAN.BUNKER_WESTGERMAN_MP","EBP.WEST_GERMAN.FALLSCHIRMJAGER_MP","EBP.WEST_GERMAN.FIELD_OFFICER_MP","EBP.WEST_GERMAN.FLAK_EMPLACEMENT","EBP.WEST_GERMAN.FLAK_EMPLACEMENT_BASE","EBP.WEST_GERMAN.FLAK_EMPLACEMENT_CREW","EBP.WEST_GERMAN.FLAK_EMPLACEMENT_CREW_BASE","EBP.WEST_GERMAN.GOLIATH_MP","EBP.WEST_GERMAN.GRANATWERFER_34_81MM_MORTAR_WG_MP","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_17_FLAK_MP","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_20_IR_SEARCHLIGHT_MP","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_20_IR_SEARCHLIGHT_SP","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_MP_2","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_WURFRAHMEN_40_MP","EBP.WEST_GERMAN.HEAVY_ARMOR_SUPPORT_MP","EBP.WEST_GERMAN.HEAVY_ARMOR_SUPPORT_PREPLACED","EBP.WEST_GERMAN.HETZER_MP","EBP.WEST_GERMAN.HMG_CREW_MP","EBP.WEST_GERMAN.HOWITZER_105MM_LE_FH18_MINICHALLENGE","EBP.WEST_GERMAN.HOWITZER_105MM_LONG_RANGE","EBP.WEST_GERMAN.INFANTRY_SUPPORT_MP","EBP.WEST_GERMAN.INFANTRY_SUPPORT_PREPLACED","EBP.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_RECON","EBP.WEST_GERMAN.JAGDPANZER_IV_SDKFZ_162_MP","EBP.WEST_GERMAN.JAGDTIGER_SDKFZ_186_MP","EBP.WEST_GERMAN.JU52_PARATROOPER_PLANE","EBP.WEST_GERMAN.JU52_PLANE","EBP.WEST_GERMAN.KING_TIGER_SDKFZ_182_MP","EBP.WEST_GERMAN.KUBELWAGEN_TYPE_82_MP","EBP.WEST_GERMAN.LE_IG_18_INF_SUPPORT_GUN_MP","EBP.WEST_GERMAN.LIGHT_ARMOR_SUPPORT_MP","EBP.WEST_GERMAN.LIGHT_ARMOR_SUPPORT_PREPLACED","EBP.WEST_GERMAN.MED_SUPPLY_STASH","EBP.WEST_GERMAN.MG34_HMG_CREW","EBP.WEST_GERMAN.MG34_HMG_MP","EBP.WEST_GERMAN.MG42_HMG_WG_MP","EBP.WEST_GERMAN.MINE_FIELD_WESTGERMAN_MP","EBP.WEST_GERMAN.MORTAR_TEAM_CREW_MP","EBP.WEST_GERMAN.OBERSOLDATEN_MP","EBP.WEST_GERMAN.OKW_HOWITZER_105MM_LE_FH18_MP","EBP.WEST_GERMAN.OKW_HOWITZER_CREW_MP","EBP.WEST_GERMAN.OSTWIND_FLAK_PANZER_WEST_GERMAN_MP","EBP.WEST_GERMAN.PAK40_75MM_AT_GUN_WG_MP","EBP.WEST_GERMAN.PAK43_88MM_AT_GUN_WESTGERMAN_MP","EBP.WEST_GERMAN.PANTHER_SDKFZ_171_AUSF_G_MP","EBP.WEST_GERMAN.PANTHER_SDKFZ_171_COMMANDER_MP","EBP.WEST_GERMAN.PANZER_II_LUCHS_SDKFZ_123_MP","EBP.WEST_GERMAN.PANZER_IV_SDKFZ_AUSF_J_MP","EBP.WEST_GERMAN.PANZERFUSILIER_MP","EBP.WEST_GERMAN.PUMA_SDKFZ_234_MP","EBP.WEST_GERMAN.RAKETENWERFER43_88MM_PUPPCHEN_ANTITANK_GUN_MP","EBP.WEST_GERMAN.REINFORCED_BARBED_WIRE_FENCE_MP","EBP.WEST_GERMAN.REINFORCED_BARBED_WIRE_TANK_TRAP_MP","EBP.WEST_GERMAN.SCHU_MINE_42_MP","EBP.WEST_GERMAN.SIPHON_STRUCTURE","EBP.WEST_GERMAN.STURMTIGER_606_38CM_RW_61_MP","EBP.WEST_GERMAN.SWS_HALFTRACK_MP","EBP.WEST_GERMAN.SWS_HALFTRACK_SP","EBP.WEST_GERMAN.TERROR_OFFICER_GUARD_MP","EBP.WEST_GERMAN.TERROR_OFFICER_MP","EBP.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY","EBP.WEST_GERMAN.VOLKSGRENADIER_MP","EBP.WEST_GERMAN.WEST_GERMAN_BASE_STAMPER","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_BARREL","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_CRATES_01","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_CRATES_02","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_GENERATOR","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_SANDBAG_01","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_SANDBAG_02","EBP.WEST_GERMAN.WEST_GERMAN_HQ_MP","EBP.WEST_GERMAN.WEST_GERMAN_HQ_WRECK_MP","EBP.WEST_GERMAN.WEST_GERMAN_INVISI_REPAIR_STATION_MP","EBP.WEST_GERMAN.WG_BARBED_WIRE_FENCE_MP","EBP.WEST_GERMAN.WG_SANDBAG_FENCE_MP","SBP.WEST_GERMAN.ARMORED_CAR_SDKFZ_234_SQUAD_MP","SBP.WEST_GERMAN.ASSAULT_PIONEER_SQUAD_MP","SBP.WEST_GERMAN.COMMAND_KING_TIGER_SQUAD_MP","SBP.WEST_GERMAN.FALLSCHIRMJAGER_SQUAD_MP","SBP.WEST_GERMAN.FIELD_OFFICER_SQUAD_MP","SBP.WEST_GERMAN.FLAK_EMPLACEMENT","SBP.WEST_GERMAN.FLAK_EMPLACEMENT_BASE","SBP.WEST_GERMAN.GOLIATH_MP","SBP.WEST_GERMAN.GRW34_81MM_MORTAR_SQUAD_MP","SBP.WEST_GERMAN.HETZER_SQUAD_MP","SBP.WEST_GERMAN.HOWITZER_105MM_LE_FH18_ARTILLERY_MINICHALLENGE","SBP.WEST_GERMAN.HOWITZER_105MM_LONG_RANGE","SBP.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_RECON_SQUAD_MP","SBP.WEST_GERMAN.JAGDPANZER_TANK_DESTROYER_SQUAD_MP","SBP.WEST_GERMAN.JAGDTIGER_TD_SQUAD_MP","SBP.WEST_GERMAN.JU52_PARATROOPER_PLANE","SBP.WEST_GERMAN.JU52_PLANE","SBP.WEST_GERMAN.KING_TIGER_SQUAD_MP","SBP.WEST_GERMAN.KUBELWAGEN_SQUAD_MP","SBP.WEST_GERMAN.LE_IG_18_INF_SUPPORT_GUN_SQUAD_MP","SBP.WEST_GERMAN.MG34_HEAVY_MACHINE_GUN_SQUAD_MP","SBP.WEST_GERMAN.MG42_HEAVY_MACHINE_GUN_SQUAD_WG_MP","SBP.WEST_GERMAN.MORTAR_250_HALFTRACK_SQUAD_WESTGERMAN_MP","SBP.WEST_GERMAN.OBERSOLDATEN_SQUAD_MP","SBP.WEST_GERMAN.OKW_HOWITZER_105MM_LE_FH18_ARTILLERY_MP","SBP.WEST_GERMAN.OSTWIND_SQUAD_WESTGERMAN_MP","SBP.WEST_GERMAN.PAK40_75MM_AT_GUN_SQUAD_WG_MP","SBP.WEST_GERMAN.PAK43_88MM_AT_GUN_SQUAD_WESTGERMAN_MP","SBP.WEST_GERMAN.PANTHER_AUSF_G_SQUAD_MP","SBP.WEST_GERMAN.PANTHER_COMMANDER_SQUAD_MP","SBP.WEST_GERMAN.PANZER_II_LUCHS_SQUAD_MP","SBP.WEST_GERMAN.PANZER_IV_AUSF_J_BATTLE_GROUP_MP","SBP.WEST_GERMAN.PANZERFUSILIER_SQUAD_MP","SBP.WEST_GERMAN.RAKETENWERFER43_88MM_PUPPCHEN_ANTITANK_GUN_SQUAD_MP","SBP.WEST_GERMAN.SCOUTCAR_223_SQUAD","SBP.WEST_GERMAN.SDKFZ_251_17_FLAK_HALFTRACK_SQUAD_MP","SBP.WEST_GERMAN.SDKFZ_251_20_IR_SEARCHLIGHT_HALFTRACK_SQUAD_MP","SBP.WEST_GERMAN.SDKFZ_251_20_IR_SEARCHLIGHT_HALFTRACK_SQUAD_SP","SBP.WEST_GERMAN.SDKFZ_251_HALFTRACK_SQUAD_MP_2","SBP.WEST_GERMAN.SDKFZ_251_WURFRAHMEN_40_HALFTRACK_SQUAD_MP","SBP.WEST_GERMAN.STURMTIGER_SQUAD_MP","SBP.WEST_GERMAN.SWS_HALFTRACK_SQUAD_MP","SBP.WEST_GERMAN.SWS_HALFTRACK_SQUAD_SP","SBP.WEST_GERMAN.TERROR_OFFICER_SQUAD_MP","SBP.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY","SBP.WEST_GERMAN.VOLKSGRENADIER_SQUAD_MP","ABILITY.WEST_GERMAN.ADVANCED_SIPHON","ABILITY.WEST_GERMAN.AIRBORNE_ASSAULT","ABILITY.WEST_GERMAN.ARMOR_BLITZ_MP","ABILITY.WEST_GERMAN.ASSAULT_ARTILLERY","ABILITY.WEST_GERMAN.ASSAULT_MOVE_MP","ABILITY.WEST_GERMAN.ASSAULT_PIONEER_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.WEST_GERMAN.ASSAULT_PIONEER_DROP_MEDPACK_ABILITY_MP","ABILITY.WEST_GERMAN.BARRAGE_ABILITY_MC","ABILITY.WEST_GERMAN.BASE_BUILDING_RETREAT_POINT_MP","ABILITY.WEST_GERMAN.BLENDKORPER_2H_WAFFEN_ELITE","ABILITY.WEST_GERMAN.BREAKTHROUGH_2","ABILITY.WEST_GERMAN.BREAKTHROUGH_TACTICS","ABILITY.WEST_GERMAN.BUILDING_SELF_DESTRUCT","ABILITY.WEST_GERMAN.BUILDING_SWITCH_FUEL","ABILITY.WEST_GERMAN.BUILDING_SWITCH_MUNITIONS","ABILITY.WEST_GERMAN.COMBAT_BLITZ_MP","ABILITY.WEST_GERMAN.COMMAND_MARK_VEHICLE","ABILITY.WEST_GERMAN.COMMAND_PANTHER","ABILITY.WEST_GERMAN.COMMAND_ROYAL_TIGER_DISPATCH","ABILITY.WEST_GERMAN.CONSTRUCT_ARMORED_INFANTRY_COMMAND","ABILITY.WEST_GERMAN.CONSTRUCT_INFANTRY_BARRACKS","ABILITY.WEST_GERMAN.CONSTRUCT_TANK_COMMAND","ABILITY.WEST_GERMAN.COORDINATED_BARRAGE","ABILITY.WEST_GERMAN.DEFENSIVE_MOVE_MP","ABILITY.WEST_GERMAN.EARLY_WARNING_FLARES","ABILITY.WEST_GERMAN.FALLSCHIRMJAEGER","ABILITY.WEST_GERMAN.FALLSCHIRMJAEGER_GREANDE","ABILITY.WEST_GERMAN.FALLSCHIRMJAEGER_PANZERFAUST","ABILITY.WEST_GERMAN.FALLSCHRIMJAEGER_CAMO","ABILITY.WEST_GERMAN.FATALITY_FLARE_ARTILLERY","ABILITY.WEST_GERMAN.FATALITY_STUKA_FRAGMENTATION_AIRSTRIKE","ABILITY.WEST_GERMAN.FATALITY_STURMTIGER_SATURATION","ABILITY.WEST_GERMAN.FATALITY_WALKING_STUKA_BARRAGE","ABILITY.WEST_GERMAN.FIELD_DEFENSES","ABILITY.WEST_GERMAN.FLAK_EMPLACEMENT_SELF_REPAIR","ABILITY.WEST_GERMAN.FLAK_HALFTRACK_CONCEALING_SMOKE_MP","ABILITY.WEST_GERMAN.FLAME_HALTRACK_DISPATCH","ABILITY.WEST_GERMAN.FLARE_ARTILLERY","ABILITY.WEST_GERMAN.FLARE_TRAP_CAPTURE_POINT","ABILITY.WEST_GERMAN.FOR_THE_FATHERLAND","ABILITY.WEST_GERMAN.FORTIFY_POSITION_MP","ABILITY.WEST_GERMAN.FORWARD_RECIEVERS","ABILITY.WEST_GERMAN.GOLIATH_DISPATCH","ABILITY.WEST_GERMAN.GRW34_MORTAR_COUNTER_BARRAGE_ATTACK_MP","ABILITY.WEST_GERMAN.GRW34_MORTAR_COUNTER_BARRAGE_WEAPON_WG_MP","ABILITY.WEST_GERMAN.GRW34_MORTAR_TEAM_MORTAR_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.GRW34_MORTAR_TEAM_MORTAR_VICTORTARGET_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.GRW34_MORTAR_TEAM_SMOKE_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.HEAT_SHELLS_ABILITY_MP","ABILITY.WEST_GERMAN.HEAT_SHELLS_UNLOCK","ABILITY.WEST_GERMAN.HEAVY_FORTIFICATIONS","ABILITY.WEST_GERMAN.HETZER_DISPATCH","ABILITY.WEST_GERMAN.HOWITZER_105MM_EMPLACEMENT_UNLOCK_OKW","ABILITY.WEST_GERMAN.HOWITZER_105MM_LONG_RANGE_BARRAGE","ABILITY.WEST_GERMAN.HOWITZER_105MM_OFFMAP_BARRAGE","ABILITY.WEST_GERMAN.HOWITZER_TOGGLE_FIRE_PM","ABILITY.WEST_GERMAN.INFILTRATION_TACTICS_GRENADE","ABILITY.WEST_GERMAN.INFILTRATION_TACTICS_UNLOCK","ABILITY.WEST_GERMAN.INFRARED_STG44","ABILITY.WEST_GERMAN.JAEGER_BOOBY_TRAP","ABILITY.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_CAMO","ABILITY.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_RECON_DISPATCH","ABILITY.WEST_GERMAN.JAGDTIGER","ABILITY.WEST_GERMAN.JAGDTIGER_128MM_SUPPORTING_FIRE","ABILITY.WEST_GERMAN.JAGDTIGER_PIERCING_SHELL_ABILITY_MP","ABILITY.WEST_GERMAN.KING_TIGER_COMMAND_MODE_MP","ABILITY.WEST_GERMAN.KING_TIGER_DISPATCH","ABILITY.WEST_GERMAN.KUBELWAGEN_DETECTION_MP","ABILITY.WEST_GERMAN.KUBELWAGEN_HOLD_FIRE_MP","ABILITY.WEST_GERMAN.KUBELWAGEN_IN_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.WEST_GERMAN.LE_IG_18_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.LE_IG_18_BARRAGE_WG_VET_MP","ABILITY.WEST_GERMAN.LE_IG_18_HOLLOW_CHARGE_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.LE_IG_18_HOLLOW_CHARGE_BARRAGE_WG_VET_MP","ABILITY.WEST_GERMAN.MG34_DISPATCH","ABILITY.WEST_GERMAN.MG34_PHOSPHORUS_ROUNDS_MP","ABILITY.WEST_GERMAN.MINESWEEPER_DEPLOY_MP","ABILITY.WEST_GERMAN.MINESWEEPER_PUT_AWAY_MP","ABILITY.WEST_GERMAN.MORTAR_HALFTRACK_WEST_GERMAN","ABILITY.WEST_GERMAN.OFFMAP_NEBEL_BARRAGE_MP","ABILITY.WEST_GERMAN.OKW_HOLD_FIRE_MP","ABILITY.WEST_GERMAN.OKW_RATKEN_VEHICLE_HOLD_FIRE_MP","ABILITY.WEST_GERMAN.OKW_SECTOR_ASSAULT","ABILITY.WEST_GERMAN.OKW_STUKA_AERIAL_SUPERIORITY_RECON","ABILITY.WEST_GERMAN.OKW_VEHICLE_HOLD_FIRE_MP","ABILITY.WEST_GERMAN.OSTWIND_DISPATCH","ABILITY.WEST_GERMAN.PAK40_CRITICAL_SHOTS_WG_MP","ABILITY.WEST_GERMAN.PANZER_IV_GROUP_DISPATCH","ABILITY.WEST_GERMAN.PANZERFUSILIER_AT_RIFLE_GRENADE","ABILITY.WEST_GERMAN.PANZERFUSILIER_GRENADE","ABILITY.WEST_GERMAN.PANZERFUSILIERS_DISPATCH","ABILITY.WEST_GERMAN.PANZERFUSILIERS_FLARE","ABILITY.WEST_GERMAN.PIONEER_STUN_GRENADE_MP","ABILITY.WEST_GERMAN.PIONEER_VOLKS_SALVAGE","ABILITY.WEST_GERMAN.PIONEER_VOLKS_THROUGH_SALVAGE","ABILITY.WEST_GERMAN.PUMA_AIMED_SHOT_MP","ABILITY.WEST_GERMAN.PUMA_SMOKE_SCREEN","ABILITY.WEST_GERMAN.PYRO_VOLKS","ABILITY.WEST_GERMAN.RADIO_SILENCE","ABILITY.WEST_GERMAN.RAKETEN_IN_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.WEST_GERMAN.RAKTEN_CAMOUFLAGE_MP","ABILITY.WEST_GERMAN.RECON_STANCE_MP","ABILITY.WEST_GERMAN.RECOUP_LOSSES","ABILITY.WEST_GERMAN.REFUEL_TANK_WG_SP","ABILITY.WEST_GERMAN.ROCKET_BARRAGE","ABILITY.WEST_GERMAN.SDKFZ_251_17_FLAK_HALFTRACK_DEPLOY_DEFENS","ABILITY.WEST_GERMAN.SDKFZ_251_17_FLAK_HALFTRACK_DEPLOY_WEAPON","ABILITY.WEST_GERMAN.SDKFZ_251_17_FLAK_HALFTRACK_DEPLOY_WEAPON_VET","ABILITY.WEST_GERMAN.SIGNAL_FLAGS","ABILITY.WEST_GERMAN.SIPHON_INCREASE_RESOURCES_ADVANCED_MP","ABILITY.WEST_GERMAN.SIPHON_INCREASE_RESOURCES_MP","ABILITY.WEST_GERMAN.SPEARHEAD_MP","ABILITY.WEST_GERMAN.STALKER_STATE_MP","ABILITY.WEST_GERMAN.STURMTIGER_380MM_ROCKET_ATTACK","ABILITY.WEST_GERMAN.STURMTIGER_380MM_ROCKET_RELOAD","ABILITY.WEST_GERMAN.STURMTIGER_DISPATCH","ABILITY.WEST_GERMAN.STURMTIGER_NAHVW_CLOSE_RANGE_GRENADE_TARGETED","ABILITY.WEST_GERMAN.SUPPORT_TRUCK_GAIN_RESOURCECS","ABILITY.WEST_GERMAN.SUPPORT_TRUCK_TARGET_SETUP","ABILITY.WEST_GERMAN.SUPPORT_TRUCK_TARGET_UNSETUP","ABILITY.WEST_GERMAN.SUPPRESSIVE_FIRE_MP","ABILITY.WEST_GERMAN.SWS_HALFTRACK_DISPATCH","ABILITY.WEST_GERMAN.SWS_HALFTRACK_FORWARD_RECEIVERS","ABILITY.WEST_GERMAN.SWS_HALFTRACK_INTERVAL_DISPATCH","ABILITY.WEST_GERMAN.TANK_COMMANDER_UNLOCK","ABILITY.WEST_GERMAN.TANK_THROW_DEFENSIVE_GRENADE_MP","ABILITY.WEST_GERMAN.TANK_THROW_DEFENSIVE_GRENADE_UNLOCK_MP","ABILITY.WEST_GERMAN.TERROR_OFFICER","ABILITY.WEST_GERMAN.TERROR_OFFICER_FORCE_RETREAT","ABILITY.WEST_GERMAN.TERROR_OFFICER_MARK_TARGET","ABILITY.WEST_GERMAN.THROUGH_SALVAGE","ABILITY.WEST_GERMAN.TIGER_PROWL_JAGDPANZER_MP","ABILITY.WEST_GERMAN.TIGER_PROWL_MP","ABILITY.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY","ABILITY.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY_THROW_ABILITY_MP","ABILITY.WEST_GERMAN.VALIANT_ASSAULT","ABILITY.WEST_GERMAN.VEHICLE_CRITICAL_REPAIR_UNLOCK","ABILITY.WEST_GERMAN.VEHICLE_EMERGENCY_REPAIR_ABILITY_MP","ABILITY.WEST_GERMAN.VEHICLE_EMERGENCY_REPAIR_ABILITY_SWS_MP","ABILITY.WEST_GERMAN.VOLKS_PANZERFAUST_MP","ABILITY.WEST_GERMAN.VOLKSGRENADIER_FIRE_GRENADE_MP","ABILITY.WEST_GERMAN.VOLKSGRENADIER_GRENADE_MP","ABILITY.WEST_GERMAN.VOLKSGRENADIER_PANZERFAUST_MP","ABILITY.WEST_GERMAN.VOLKSGRENADIER_PANZERFAUST_VET_4_MP","ABILITY.WEST_GERMAN.WAFFEN_BOOBY_TRAP_CAPTURE_POINT","ABILITY.WEST_GERMAN.WAFFEN_ELITE_BUNDLED_ASSAULT_GRENADE","ABILITY.WEST_GERMAN.WALKING_STUKA_ROCKET_BARRAGE_CREEPING_MP","ABILITY.WEST_GERMAN.WALKING_STUKA_ROCKET_BARRAGE_CREEPING_NAPALM_MP","ABILITY.WEST_GERMAN.WEST_GERMAN_REPAIR_ABILITY_MP","ABILITY.WEST_GERMAN.WG_HQ_PIONEER_CALL_IN","ABILITY.WEST_GERMAN.ZEROING_ARTILLERY","UPG.WEST_GERMAN.ABILITY_LOCK_OUT_STURMTIGER_NOT_RELOADED","UPG.WEST_GERMAN.ABILITY_LOCK_OUT_STURMTIGER_RELOADING","UPG.WEST_GERMAN.ABILITY_LOCK_OUT_SWS_TRUCK","UPG.WEST_GERMAN.ADVANCED_SIPHON","UPG.WEST_GERMAN.AERIAL_SUPERIORITY_STUKA_RECON_PLANE","UPG.WEST_GERMAN.AIRBORNE_ASSAULT","UPG.WEST_GERMAN.ASSAULT_ARTILLERY","UPG.WEST_GERMAN.ASSAULT_PIONEER_COMBAT_UPGRADE","UPG.WEST_GERMAN.ASSAULT_PIONEER_PANZERSCHRECK_UPGRADE","UPG.WEST_GERMAN.ASSAULT_PIONEER_REPAIR_UPGRADE","UPG.WEST_GERMAN.BREAKTHROUGH_2","UPG.WEST_GERMAN.BREAKTHROUGH_TACTICS","UPG.WEST_GERMAN.BUILDING_1","UPG.WEST_GERMAN.BUILDING_2","UPG.WEST_GERMAN.BUILDING_3","UPG.WEST_GERMAN.COMMAND_PANTHER","UPG.WEST_GERMAN.COMMAND_ROYAL_TIGER_DISPATCH","UPG.WEST_GERMAN.CONSTRUCT_BASE_BUILDING_UPGRADE","UPG.WEST_GERMAN.FALLSCHRIMJAGER_DISPATCH","UPG.WEST_GERMAN.FIELD_DEFENSES","UPG.WEST_GERMAN.FIRST_SWS_HALFTRACK_LOCKOUT","UPG.WEST_GERMAN.FLAK_GUN_UNLOCK_UPGRADE","UPG.WEST_GERMAN.FLAK_PANZER_DEFENSIVES","UPG.WEST_GERMAN.FLAK_PANZER_IS_SETUP","UPG.WEST_GERMAN.FLAME_HALFTRACK_DISPATCH","UPG.WEST_GERMAN.FLAMMPANZER_38T_HETZER","UPG.WEST_GERMAN.FLARE_ARTILLERY","UPG.WEST_GERMAN.FOR_THE_FATHER_LAND","UPG.WEST_GERMAN.FORWARD_RECIEVERS","UPG.WEST_GERMAN.GOLIATH_REMOTE_CONTROLLED_BOMB","UPG.WEST_GERMAN.HEALING_POINT_UNLOCK_UPGRADE","UPG.WEST_GERMAN.HEAT_SHELLS","UPG.WEST_GERMAN.HEAVY_FORTIFICATIONS","UPG.WEST_GERMAN.HOWITZER_105MM_EMPLACEMENT_OKW","UPG.WEST_GERMAN.HOWITZER_105MM_OFFMAP_BARRAGE","UPG.WEST_GERMAN.INFILTRATION_TACTICS","UPG.WEST_GERMAN.INFRARED_STG44","UPG.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_RECON_DISPATCH","UPG.WEST_GERMAN.JAGDTIGER","UPG.WEST_GERMAN.JAGDTIGER_ABILITY_AP_LOCK_OUT","UPG.WEST_GERMAN.JAGDTIGER_ABILITY_BARRAGE_LOCK_OUT","UPG.WEST_GERMAN.JAGDTIGER_ENGINE_IMPROVEMENTS_I_MP","UPG.WEST_GERMAN.KING_TIGER_TOP_GUNNER_MP","UPG.WEST_GERMAN.MEDIC_HEALING_MP","UPG.WEST_GERMAN.MEDICAL_SUPPLIES_0_USES_REMAINING","UPG.WEST_GERMAN.MEDICAL_SUPPLIES_1_USE_REMAINING","UPG.WEST_GERMAN.MEDICAL_SUPPLIES_2_USES_REMAINING","UPG.WEST_GERMAN.MG34_DISPATCH","UPG.WEST_GERMAN.OKW_SECTOR_ASSAULT","UPG.WEST_GERMAN.OSTWIND_DISPATCH","UPG.WEST_GERMAN.PANZER_IV_GROUP_DISPATCH","UPG.WEST_GERMAN.PANZER_IV_SIDE_SKIRTS_MP","UPG.WEST_GERMAN.PANZERFUSILER_DISPATCH","UPG.WEST_GERMAN.PANZERFUSILIER_G43","UPG.WEST_GERMAN.PANZERSCHRECK_UNLOCKED","UPG.WEST_GERMAN.PYRO_VOLKS","UPG.WEST_GERMAN.RADIO_SILENCE","UPG.WEST_GERMAN.RECOUP_ACTIVE","UPG.WEST_GERMAN.RECOUP_LOSS","UPG.WEST_GERMAN.REPAIR_ENGINEERS_MP","UPG.WEST_GERMAN.REPAIR_POINT_UNLOCK_UPGRADE","UPG.WEST_GERMAN.RESOURCE_POINT_SIPHON","UPG.WEST_GERMAN.RETREAT_POINT_UNLOCK_UPGRADE","UPG.WEST_GERMAN.ROCKET_BARRAGE","UPG.WEST_GERMAN.SDKFZ_251_HALFTRACK_FLAMMPANZERWAGEN_UPGRADE_MP_2","UPG.WEST_GERMAN.SIGNAL_FLAGS","UPG.WEST_GERMAN.SIPHON_LOCK_OUT","UPG.WEST_GERMAN.STURMTIGER_DISPATCH","UPG.WEST_GERMAN.SWS_INTERVAL_UNLOCK","UPG.WEST_GERMAN.SWS_STARTING_DISPATCH_UNLOCK","UPG.WEST_GERMAN.TANK_COMMANDER","UPG.WEST_GERMAN.TANK_COMMANDER_UNLOCK","UPG.WEST_GERMAN.TANK_GRENADE","UPG.WEST_GERMAN.TERROR_OFFICER","UPG.WEST_GERMAN.THROUGH_SALVAGE","UPG.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY","UPG.WEST_GERMAN.VALIANT_ASSAULT","UPG.WEST_GERMAN.VEHICLE_CRITICAL_REPAIR","UPG.WEST_GERMAN.VOLKS_FLAMETHROWER_MP","UPG.WEST_GERMAN.VOLKS_STG44_UPGRADE","UPG.WEST_GERMAN.WAFFEN_INFRARED_STG44","UPG.WEST_GERMAN.WAFFEN_MG34_LMG_MP","UPG.WEST_GERMAN.WARNING_FLARES","UPG.WEST_GERMAN.WG_HETZER_TOP_GUNNER_MP","UPG.WEST_GERMAN.WG_PANTHER_TOP_GUNNER_MP","UPG.WEST_GERMAN.ZEROING_ARTILLERY","ABILITY.GLOBAL.ARMY_ITEM_GLOBAL_COVER_TRAINING","ABILITY.GLOBAL.ARMY_ITEM_SOVIET_NOT_GONNA_DIE_LIKE_THIS","ABILITY.GLOBAL.AT_76MM_SINGLE_SHOT_ACCURATE","ABILITY.GLOBAL.BLIZZARD_EFFECT","ABILITY.GLOBAL.BLIZZARD_EFFECT_DEEP_SNOW_CAMO","ABILITY.GLOBAL.BLIZZARD_EFFECT_MORTARS","ABILITY.GLOBAL.BLIZZARD_EFFECT_VEHICLE","ABILITY.GLOBAL.BLIZZARD_HOWITZER","ABILITY.GLOBAL.BONUS_0","ABILITY.GLOBAL.BONUS_1","ABILITY.GLOBAL.BONUS_2","ABILITY.GLOBAL.BONUS_2B","ABILITY.GLOBAL.BONUS_3","ABILITY.GLOBAL.BONUS_3B","ABILITY.GLOBAL.BONUS_3C","ABILITY.GLOBAL.BONUS_BACK","ABILITY.GLOBAL.BREAKTHROUGH_TOW","ABILITY.GLOBAL.CAMOUFLAGE_CONSTRUCTION","ABILITY.GLOBAL.CAMOUFLAGE_CONSTRUCTION_ANIA","ABILITY.GLOBAL.CAMPAIGN_STUKA_STRAFE_LONG","ABILITY.GLOBAL.CAPTURE_SPEED","ABILITY.GLOBAL.COMMISSAR_SHOT_227","ABILITY.GLOBAL.COMMISSAR_SHOT_227_ENEMY","ABILITY.GLOBAL.COMMISSAR_SQUAD_TOW","ABILITY.GLOBAL.CONVOY_BUILDBARRICADE","ABILITY.GLOBAL.COVER_ANIMATION_TEST","ABILITY.GLOBAL.DIG_OUT_OF_MUD","ABILITY.GLOBAL.DISPATCH_BRIDGE_PARTISAN","ABILITY.GLOBAL.DISPATCH_BRIDGE_PARTISAN_AT","ABILITY.GLOBAL.DISPATCH_BRIDGE_PARTISAN_HMG","ABILITY.GLOBAL.DISPATCH_BRIDGE_PARTISAN_MORTAR","ABILITY.GLOBAL.DROP_WEAPONS","ABILITY.GLOBAL.FATALITY_BULLSEYE","ABILITY.GLOBAL.FATALITY_COORDINATED_MORTAR_BOMBARDMENT","ABILITY.GLOBAL.FATALITY_DEFAULT","ABILITY.GLOBAL.FATALITY_HOWITZER_105MM_BARRAGE","ABILITY.GLOBAL.FATALITY_HOWITZER_240MM","ABILITY.GLOBAL.FATALITY_LIGHT_SUPPORT_ARTILLERY","ABILITY.GLOBAL.FATALITY_PROTOTYPE","ABILITY.GLOBAL.FATALITY_RAILWAY_GUN_ARTILLERY","ABILITY.GLOBAL.FATALITY_TIME_ON_TARGET_ARTILLERY","ABILITY.GLOBAL.FIRE_DOT","ABILITY.GLOBAL.FLAME_THROWER_ABILITY","ABILITY.GLOBAL.FORWARD_REPAIR_STATION_TOW","ABILITY.GLOBAL.FROZEN_ICON_TEST","ABILITY.GLOBAL.GARRISONED_SQUAD_FACING","ABILITY.GLOBAL.GARRISONED_SQUAD_FACING_UNSET","ABILITY.GLOBAL.HEAL_IN_COVER","ABILITY.GLOBAL.HOWITZER_105MM_BARRAGE_SHORT","ABILITY.GLOBAL.HOWITZER_105MM_BARRAGE_SHORT_PRECISE","ABILITY.GLOBAL.HOWITZER_105MM_DUMMY","ABILITY.GLOBAL.IL_2_ATTACK_STRAFE_HMG","ABILITY.GLOBAL.IL_2_PRECISION_BOMB_STRIKE_TOW","ABILITY.GLOBAL.KV_2_TOW","ABILITY.GLOBAL.LIGHT_ARTILLERY_M10","ABILITY.GLOBAL.M01_IL2_DOGFIGHT_PASS","ABILITY.GLOBAL.M01_IL2_PRECISION_BOMB_STRIKE","ABILITY.GLOBAL.M01_MEDIC_HEAL","ABILITY.GLOBAL.M01_MEDIC_HEAL_CONSTANT","ABILITY.GLOBAL.M01_MORTAR_SINGLE_PRECISE_HARMLESS","ABILITY.GLOBAL.M01_SPRINT_OUT_OF_COMBAT","ABILITY.GLOBAL.M01_STUKA_BOMBING_STRIKE","ABILITY.GLOBAL.M01_STUKA_DOGFIGHT_PASS","ABILITY.GLOBAL.M01_STUKA_STRAFE_FAST","ABILITY.GLOBAL.M01_WOUNDED","ABILITY.GLOBAL.M11_LIGHT_FIRE","ABILITY.GLOBAL.M12_HOWITZER_BARRAGE","ABILITY.GLOBAL.M14_GUARD_TROOP_DISPATCH","ABILITY.GLOBAL.M14_OFF_MAP_SMOKE_BARRAGE","ABILITY.GLOBAL.M24_ANTI_TANK_BUNDLED_GRENADE","ABILITY.GLOBAL.MECHANIZED_ASSAULT_GROUP_TOW","ABILITY.GLOBAL.MOLTKE_DET_PACK","ABILITY.GLOBAL.MUDDY_POINT","ABILITY.GLOBAL.NO_RETREAT_NO_SURRENDER_TOW","ABILITY.GLOBAL.OFF_MAP_ARTILLERY","ABILITY.GLOBAL.OFF_MAP_ARTILLERY_PERCISE","ABILITY.GLOBAL.OFF_MAP_ARTILLERY_PERCISE_FAST","ABILITY.GLOBAL.OFF_MAP_ARTILLERY_PERCISE_SEP","ABILITY.GLOBAL.OFF_MAP_ARTY_SINGLE_SHOT_INSTANT","ABILITY.GLOBAL.OFFICER_AIR_RECON","ABILITY.GLOBAL.OFFICER_CLOSE_AIR_SUPPORT","ABILITY.GLOBAL.OFFICER_FRAGMENTATION_BOMB","ABILITY.GLOBAL.PARTISAN_REPAIR_ABILITY","ABILITY.GLOBAL.PARTISAN_SPRINT","ABILITY.GLOBAL.PREVENT_SUPPRESSION","ABILITY.GLOBAL.PRODUCTION_SPEED","ABILITY.GLOBAL.RADIO_TOWER_REVEAL","ABILITY.GLOBAL.RAILWAY_GUN_ARTILLERY_SINGLE","ABILITY.GLOBAL.READY_UP","ABILITY.GLOBAL.REV_OUT_OF_MUD","ABILITY.GLOBAL.SHOCK_TROOP_FULL_AUTO","ABILITY.GLOBAL.SP_DROP_WEAPONS","ABILITY.GLOBAL.SP_OFF_MAP_ARTY_HARMLESS","ABILITY.GLOBAL.SP_OFF_MAP_ARTY_REAL","ABILITY.GLOBAL.SP_SINGLE_SHOT_MORTAR","ABILITY.GLOBAL.SP_SINGLE_SHOT_MORTAR_M01","ABILITY.GLOBAL.SP_SPRINT","ABILITY.GLOBAL.SP_SPRINT_TOGGLEABLE","ABILITY.GLOBAL.SPY_NETWORK_TOW","ABILITY.GLOBAL.STUKA_BOMBING_STRIKE_W_SMOKE","ABILITY.GLOBAL.STUKA_FAKE_BOMBING_STRIKE","ABILITY.GLOBAL.STUKA_FAKE_STRAFE","ABILITY.GLOBAL.STUKA_STRAFE","ABILITY.GLOBAL.STUKA_STRAFE_M02","ABILITY.GLOBAL.STUKA_STRAFE_M09","ABILITY.GLOBAL.TANK_BUSTER_CONSCRIPT_DISPATCH","ABILITY.GLOBAL.TOW_AIRFIELD_DISPATCH_KV1","ABILITY.GLOBAL.TOW_AIRFIELD_DISPATCH_KV2","ABILITY.GLOBAL.TOW_AIRFIELD_DISPATCH_KV8","ABILITY.GLOBAL.TOW_AIRFIELD_DISPATCH_T34","ABILITY.GLOBAL.TOW_AIRFIELD_STUKA_BOMBING_RUN","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_IS2","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_KAT","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_KV1","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_SU76","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_T34","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_T70","ABILITY.GLOBAL.TRANSFER_ORDERS","ABILITY.GLOBAL.TROOP_TRAINING_TOW","ABILITY.GLOBAL.TUNSTEN_SHELLS_TOW","ABILITY.GLOBAL.WARMING_ANIMATION_TEST","ABILITY.GLOBAL.WE_SURRENDER","SLOT_ITEM.AEC_TARGET_OPTICS_SLOT_ITEM_MP","SLOT_ITEM.AEC_TARGET_TURRET_SLOT_ITEM_MP","SLOT_ITEM.AEC_TREAD_SHOT_MP","SLOT_ITEM.AEF_CALLIOPE_DUMMY_SLOT_ITEM","SLOT_ITEM.AEF_SHERMAN_DUMMY_SLOT_ITEM","SLOT_ITEM.AEF_VEHICLE_ENTERS_INFANTRY_BUFF_APPLIED","SLOT_ITEM.AEF_WHITE_PHOSPHOROUS_MORTAR_UI_ITEM","SLOT_ITEM.AEF_WHITE_PHOSPHOROUS_SHELLS_UI_ITEM","SLOT_ITEM.AEF_WRENCH_ICON_SLOT_ITEM","SLOT_ITEM.AMBUSH_CAMO_PORTRAIT_ICON_ITEM","SLOT_ITEM.AMBUSH_CAMO_SLOT_ITEM","SLOT_ITEM.AMBUSH_CAMO_VISUAL_ITEM","SLOT_ITEM.ARMOR_BLITZ_ITEM","SLOT_ITEM.ASSAULT_ENGINEER_FLAMETHROWER","SLOT_ITEM.ASSAULT_MOVE_ITEM","SLOT_ITEM.AT_76MM_HE_ROUND_ITEM","SLOT_ITEM.AT_76MM_HE_ROUND_ITEM_MP","SLOT_ITEM.AVRE_CREW_SHRAPNEL_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.AVRE_RELOAD_ACTIVE","SLOT_ITEM.AVRE_SPIGOT_MORTAR_MP","SLOT_ITEM.AVRE_SPIGOT_MORTAR_VET_3_MP","SLOT_ITEM.AXIS_ASSAULT_GRENADIER_GRENADE","SLOT_ITEM.AXIS_BLINDING_GRENADE","SLOT_ITEM.AXIS_BLINDING_GRENADE_MP","SLOT_ITEM.AXIS_PANZER_GRENADIER_GRENADE","SLOT_ITEM.AXIS_PANZER_GRENADIER_GRENADE_MP","SLOT_ITEM.AXIS_PG_GRENADE_CAMPAIGN","SLOT_ITEM.AXIS_PG_GRENADE_CAMPAIGN_MP","SLOT_ITEM.AXIS_PG_GRENADE_TUTORIAL","SLOT_ITEM.BAZOOKA_MP","SLOT_ITEM.BLENDKORPER_2H_SMOKE_GRENADE_ITEM_MP","SLOT_ITEM.BOFOR_40MM_AA_MODE_ACTIVATED_MAIN_GUN","SLOT_ITEM.BOFORS_HOLD_FULL","SLOT_ITEM.BOFORS_SUPPRESSIVE_BARRAGE_ROUND_ITEM_MP","SLOT_ITEM.BOFORS_SUPPRESSIVE_BARRAGE_ROUND_ITEM_VICTOR_TARGET_MP","SLOT_ITEM.BOOT_STOMP","SLOT_ITEM.BOYS_ANTI_TANK_RIFLE_MP","SLOT_ITEM.BOYS_ANTI_TANK_RIFLE_SNIPER_MP","SLOT_ITEM.BOYS_SNIPER_RIFLE_ITEM_MP","SLOT_ITEM.BREN_LMG_ICON_DUMMY","SLOT_ITEM.BRIT_17_POUNDER_FLARE_MP","SLOT_ITEM.BRIT_17_POUNDER_HOLD_FULL","SLOT_ITEM.BRIT_17_POUNDER_PIERCING_SHOT_MP","SLOT_ITEM.BRIT_COMMAND_VEHICLE_ITEM","SLOT_ITEM.BRIT_CROC_DUMMY_SLOT_ITEM","SLOT_ITEM.BRIT_EMPLACEMENT_BRACED","SLOT_ITEM.BRIT_EMPLACEMENT_HOLD_FIRE","SLOT_ITEM.BRIT_FIREFLY_TULIP_SLOT_ITEM","SLOT_ITEM.BRIT_HOLD_THE_LINE","SLOT_ITEM.BRIT_MORTAR_PIT_HOLD_FULL","SLOT_ITEM.BRIT_REINFORCE_THE_FRONT","SLOT_ITEM.BRIT_SNIPER_BOYS_ANTI_TANK_CRITICAL_SHOT_MP","SLOT_ITEM.BRIT_UNIT_LOCK_OUT_SLOT_ITEM","SLOT_ITEM.BRUMMBAR_CRITICAL_SHOT_MP","SLOT_ITEM.CAPTAIN_GARRISON_ITEM","SLOT_ITEM.CAPTURE_INTEL_SLOTITEM","SLOT_ITEM.CARRIER_SUPPRESS_ACTIVE","SLOT_ITEM.CAVALRY_AT_SATCHEL_ITEM","SLOT_ITEM.CENTUAR_AA_MODE_ACTIVATED_MAIN_GUN","SLOT_ITEM.CHURUCHILL_SUPPORT_NEGATE","SLOT_ITEM.COMET_SMOKE_SHELL_SHOT_MP","SLOT_ITEM.COMET_SMOKE_SHELL_WP_SHOT_MP","SLOT_ITEM.COMMAND_PANTHER_AURA","SLOT_ITEM.COMMANDO_BREN_LMG_MP","SLOT_ITEM.COMMANDO_DE_LISLE_CARBINE_MP","SLOT_ITEM.COMMANDO_DE_LISLE_CARBINE_SLOT_MP","SLOT_ITEM.COMMANDO_N69_GRENADE_MP","SLOT_ITEM.COMMANDO_THOMPSON_MP","SLOT_ITEM.COMMANDO_THOMPSON_SLOT_MP","SLOT_ITEM.COMMISSAR_SHOT_227","SLOT_ITEM.COMMISSAR_SHOT_227_ENEMY","SLOT_ITEM.CONSCRIPT_MOLOTOV","SLOT_ITEM.CONSCRIPT_MOLOTOV_MP","SLOT_ITEM.COVER_SMOKE_GRENADE_ITEM","SLOT_ITEM.DEF_MOVE_ITEM","SLOT_ITEM.DOUBLE_SWEEP","SLOT_ITEM.DP_28_LIGHT_MACHINE_GUN_PACKAGE","SLOT_ITEM.DP_28_LIGHT_MACHINE_GUN_PACKAGE_MOVING_MP","SLOT_ITEM.DP_28_LIGHT_MACHINE_GUN_PACKAGE_MOVING_NO_PRONE_MP","SLOT_ITEM.DP_28_LIGHT_MACHINE_GUN_PACKAGE_MP","SLOT_ITEM.DSHK38_TURRET_MOUNTED_IS2","SLOT_ITEM.DSHK38_TURRET_MOUNTED_IS2_MP","SLOT_ITEM.DSHK38_TURRET_MOUNTED_ISU152","SLOT_ITEM.DSHK38_TURRET_MOUNTED_ISU152_MP","SLOT_ITEM.DUMMY_FORTIFIED__SLOT_ITEM","SLOT_ITEM.DUMMY_SLOT_ITEM","SLOT_ITEM.DUMMY_SLOT_ITEM_QUAD","SLOT_ITEM.ELEFANT_CRITICAL_SHOT_MP","SLOT_ITEM.ENGINEER_SALVAGE_KIT_DUMMY","SLOT_ITEM.FLAK_HALFTRACK_ICON_ITEM","SLOT_ITEM.FLAMETHROWER_ROKS3_ACCESSORY","SLOT_ITEM.FLAMETHROWER_ROKS3_FAKE","SLOT_ITEM.FLAMETHROWER_ROKS3_ITEM","SLOT_ITEM.FLAMETHROWER_ROKS3_ITEM_MP","SLOT_ITEM.FOR_THE_FATHERLAND_ACTIVE","SLOT_ITEM.FRWD_HQ_SMOKE_MARKER_GRENADE_MP","SLOT_ITEM.FWD_HQ_EMPLACEMENT_SUPPORT","SLOT_ITEM.G43_SNIPER_INCENDIARY_SLOT_ITEM_MP","SLOT_ITEM.GENERIC_MG34_LMG_MP","SLOT_ITEM.GRENADIER_MG42_LMG","SLOT_ITEM.GRENADIER_MG42_LMG_MOVING_MP","SLOT_ITEM.GRENADIER_MG42_LMG_MOVING_NO_PRONE_MP","SLOT_ITEM.GRENADIER_MG42_LMG_MP","SLOT_ITEM.GRENADIER_PANZERFAUST","SLOT_ITEM.GRENADIER_PANZERFAUST_MP","SLOT_ITEM.GROUND_ATTACK_SNIPER_RIFLE_ITEM","SLOT_ITEM.GUARD_TROOP_ASSAULT_PACKAGE","SLOT_ITEM.HALFTRACK_FLAMETHROWER_LEFT","SLOT_ITEM.HALFTRACK_FLAMETHROWER_LEFT_MP","SLOT_ITEM.HALFTRACK_FLAMETHROWER_RIGHT","SLOT_ITEM.HALFTRACK_FLAMETHROWER_RIGHT_MP","SLOT_ITEM.HETZER_FLAMETHROWER_ITEM_MP","SLOT_ITEM.HULLDOWN_SLOT_ITEM","SLOT_ITEM.INFRARED_SQUAD_SETUP","SLOT_ITEM.ISU_PIERCING_SHOT_ROUND_ITEM","SLOT_ITEM.ISU_PIERCING_SHOT_ROUND_ITEM_MP","SLOT_ITEM.JAEGER_G43_RIFLE_ITEM","SLOT_ITEM.JAEGER_G43_RIFLE_ITEM_MP","SLOT_ITEM.JAEGER_LIGHT_RECON_G43","SLOT_ITEM.JAEGER_PANZERGREN_G43_RIFLE_ITEM_MP","SLOT_ITEM.KAR_98K_ANTITANK_RIFLE_GRENADE_SLOT_ITEM","SLOT_ITEM.KAR_98K_ANTITANK_RIFLE_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.KAR_98K_RIFLE_GRENADE_SLOT_ITEM","SLOT_ITEM.KAR_98K_RIFLE_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.KAR_98K_RIFLE_GRENADE_SLOT_ITEM_TUTORIAL","SLOT_ITEM.KV_8_45MM_GUN_ITEM","SLOT_ITEM.KV_8_ATO_41_FLAMETHROWER_ITEM_MP","SLOT_ITEM.KWK_20MM_222_ARMORED_CAR_MP","SLOT_ITEM.LAND_MATTRESS_25LB_ROCKET","SLOT_ITEM.LAND_MATTRESS_60LB_ROCKET","SLOT_ITEM.LAND_MATTRESS_EMPTY","SLOT_ITEM.LAND_MATTRESS_PHOSPHORUS_ROCKET","SLOT_ITEM.LAND_MATTRESS_ROCKET_MARKER","SLOT_ITEM.LEE_ENFIELD_RIFLE_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.LIEUTENANT_GARRISON_ITEM","SLOT_ITEM.LIGHT_AT_MINE_RECENTLY_HIT_HEAVY_VEHICLE","SLOT_ITEM.LIGHT_AT_MINE_RECENTLY_HIT_LIGHT_VEHICLE","SLOT_ITEM.M01_CONSCRIPT_MOSIN_NAGANT","SLOT_ITEM.M15A1_AA_MODE_ACTIVATED","SLOT_ITEM.M15A1_AA_MODE_ACTIVATED_LEFT","SLOT_ITEM.M15A1_AA_MODE_ACTIVATED_MAIN_GUN","SLOT_ITEM.M17_RIFLE_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.M1919A6_LMG_ICON_DUMMY","SLOT_ITEM.M1C_GARAND","SLOT_ITEM.M1C_PATHFINDER_GARAND","SLOT_ITEM.M23_SMOKE_STREAM_GRENADE_ANTI_TANK_ITEM_MP","SLOT_ITEM.M23_SMOKE_STREAM_GRENADE_ITEM_MP","SLOT_ITEM.M24_ANTI_TANK_GRENADIER_GRENADE","SLOT_ITEM.M2HB_50CAL_SHERMAN","SLOT_ITEM.M2HB_TURRET_MOUNTED_M8_MP","SLOT_ITEM.M2HB_TURRET_MOUNTED_SHERMAN_MP","SLOT_ITEM.M5_STUART_DAMAGE_ENGINE_SHOT_SLOT_ITEM_MP","SLOT_ITEM.M5_STUART_SHELL_SHOCK_SHOT_SLOT_ITEM_MP","SLOT_ITEM.M8_CANISTER_SHOT_SLOT_ITEM_MP","SLOT_ITEM.M8_GREYHOUND_RECON_ACTIVATED","SLOT_ITEM.MAJOR_GARRISON_ITEM","SLOT_ITEM.MG34_PINTLE_HETZER","SLOT_ITEM.MG42_TURRET_MOUNTED_BRUMMBAR","SLOT_ITEM.MG42_TURRET_MOUNTED_BRUMMBAR_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_KING_TIGER_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_PANTHER","SLOT_ITEM.MG42_TURRET_MOUNTED_PANTHER_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_PANTHER_WG_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_PZIV","SLOT_ITEM.MG42_TURRET_MOUNTED_PZIV_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_STUGIV","SLOT_ITEM.MG42_TURRET_MOUNTED_STUGIV_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_TIGER","SLOT_ITEM.MG42_TURRET_MOUNTED_TIGER_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_TIGER_TOW","SLOT_ITEM.MINESWEEPER","SLOT_ITEM.MORTAR_FLARE_MP","SLOT_ITEM.MOSIN_NAGANT_SNIPER_RIFLE_ITEM","SLOT_ITEM.MOSIN_NAGANT_SNIPER_RIFLE_ITEM_MP","SLOT_ITEM.OBERSOLDATEN_MG34_LMG_MOVING_MP","SLOT_ITEM.OBERSOLDATEN_MG34_LMG_MOVING_NO_PRONE_MP","SLOT_ITEM.OBERSOLDATEN_MP44_INFARED","SLOT_ITEM.OPEL_SUPPLY_SLOT_ITEM","SLOT_ITEM.PAK40_CRITICAL_SHOT_MP","SLOT_ITEM.PAK43_CRITICAL_SHOT_MP","SLOT_ITEM.PANZER_GRENADIER_MP44_ITEM","SLOT_ITEM.PANZER_GRENADIER_MP44_ITEM_MP","SLOT_ITEM.PANZERBUSCHE_39","SLOT_ITEM.PANZERBUSCHE_39_MP","SLOT_ITEM.PANZERFUISILIER_FLARE_MP","SLOT_ITEM.PANZERFUSILIER_AT_RIFLE_GRENADE","SLOT_ITEM.PANZERFUSILIER_G43","SLOT_ITEM.PANZERFUSILIER_GRENADE","SLOT_ITEM.PANZERSHRECK","SLOT_ITEM.PANZERSHRECK_AT_WEAPON_ITEM","SLOT_ITEM.PANZERSHRECK_DESTROY_ENGINE","SLOT_ITEM.PANZERSHRECK_MP","SLOT_ITEM.PANZERSHRECK_SLOT1","SLOT_ITEM.PANZERSHRECK_SLOT1_MP","SLOT_ITEM.PANZERSHRECK_SLOT2","SLOT_ITEM.PANZERSHRECK_SLOT2_MP","SLOT_ITEM.PARADROP_REINFORCE_ITEM","SLOT_ITEM.PARATROOPER_M1919A6_LMG_MOVING_NO_PRONE_MP","SLOT_ITEM.PARATROOPER_M1919A6_LMG_MP","SLOT_ITEM.PARATROOPER_MK2_GRENADE_MP","SLOT_ITEM.PARATROOPER_THOMPSON_DUMMY","SLOT_ITEM.PARATROOPER_THOMPSON_MP","SLOT_ITEM.PARTISAN_DP_28_LIGHT_MACHINE_GUN_PACKAGE_MP","SLOT_ITEM.PARTISAN_MG42_LMG_MP","SLOT_ITEM.PATHFINDERS_SNIPER_ITEM","SLOT_ITEM.PENAL_TROOP_SATCHEL_CHARGE_ITEM_MP","SLOT_ITEM.PERSHING_HVAP_PIERCING_ITEM_MP","SLOT_ITEM.PIAT_SPIGOT_MORTAR_MP","SLOT_ITEM.PIONEER_FLAMETHROWER","SLOT_ITEM.PIONEER_FLAMETHROWER_ABILITY","SLOT_ITEM.PIONEER_FLAMETHROWER_ABILITY_MP","SLOT_ITEM.PIONEER_FLAMETHROWER_MP","SLOT_ITEM.PIONEER_STUN_GRENADE_MP","SLOT_ITEM.PM_AEF_OFFENSIVE_PUNCH_ITEM","SLOT_ITEM.PPSH41_ASSAULT_PACKAGE","SLOT_ITEM.PPSH41_ASSAULT_PACKAGE_DUMMY_ITEM_MP","SLOT_ITEM.PPSH41_ASSAULT_PACKAGE_MP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_CONSCRIPT_MP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_GUARD_TROOP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_GUARD_TROOP_ASSAULT_MP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_GUARD_TROOP_MP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_PARTISAN_TROOP_MP","SLOT_ITEM.PUMA_AIMED_SHOT_MP","SLOT_ITEM.PUMA_CRITICAL_SHOT_MP","SLOT_ITEM.RANGER_PANZERSHRECK_MP","SLOT_ITEM.REAR_ECHELON_RIFLE_GRENADE_ACTIVATED","SLOT_ITEM.REAR_ECHELON_RIFLE_VOLLEY_FIRE","SLOT_ITEM.RECOUP_ACTIVE","SLOT_ITEM.RGD_1_SMOKE_GRENADE_ITEM","SLOT_ITEM.RGD_1_SMOKE_GRENADE_ITEM_MP","SLOT_ITEM.RGD_33_SLEEVED_GRENADE_ITEM","SLOT_ITEM.RGD_33_SLEEVED_GRENADE_ITEM_LONGTIMER","SLOT_ITEM.RGD_33_SLEEVED_GRENADE_ITEM_MP","SLOT_ITEM.RIFLEMAN_AT_RIFLE_GRENADE","SLOT_ITEM.RIFLEMEN_30_CAL","SLOT_ITEM.RIFLEMEN_FLARE","SLOT_ITEM.RIFLEMEN_M1918_BAR_MP","SLOT_ITEM.RIFLEMEN_MK2_GRENADE_MP","SLOT_ITEM.RIFLEMEN_TRAINING_DUMMY_CARBINE","SLOT_ITEM.RIFLEMEN_TRAINING_SATCHEL_ITEM","SLOT_ITEM.ROKS_2_FLAMETHROWER_ITEM","SLOT_ITEM.ROKS_2_FLAMETHROWER_ITEM_MP","SLOT_ITEM.RPG_40_ANTI_TANK_GRENADE_MP","SLOT_ITEM.RPG_43_ANTI_TANK_GRENADE","SLOT_ITEM.RPG_43_ANTI_TANK_GRENADE_MP","SLOT_ITEM.SAPPER_BREN_LIGHT_MACHINE_GUN_MP","SLOT_ITEM.SAPPER_STUN_GRENADE_MP","SLOT_ITEM.SAPPER_VICKERS_K_LIGHT_MACHINE_GUN_MP","SLOT_ITEM.SATCHEL_CHARGE_ITEM_MP","SLOT_ITEM.SELF_REPAIR_DUMMY_SLOT_ITEM","SLOT_ITEM.SHERMAN_BATTLE_GROUP_ITEM_MP","SLOT_ITEM.SHOCK_TROOP_RG_42_GRENADE","SLOT_ITEM.SHOCK_TROOP_RG_42_GRENADE_MP","SLOT_ITEM.SIPHON_ACTIVE","SLOT_ITEM.SNIPER_FLARE_MP","SLOT_ITEM.SNIPER_RIFLE_ITEM","SLOT_ITEM.SNIPER_RIFLE_ITEM_MP","SLOT_ITEM.SNIPER_SMOKE_MARKER_GRENADE_MP","SLOT_ITEM.SNIPER_SUPPRESSIVE_VOLLEY_MP","SLOT_ITEM.SOVIET_FLAG","SLOT_ITEM.SPEARHEAD_ITEM","SLOT_ITEM.STALK_ITEM","SLOT_ITEM.STORMTROOPER_MP44_MP","SLOT_ITEM.STUG_CRITICAL_SHOT_MP","SLOT_ITEM.STUG_ELEFANT_PAK40_PAK43_BRUMMBAR_CRITICAL_SHOT","SLOT_ITEM.STUG_ELEFANT_PAK40_PAK43_BRUMMBAR_CRITICAL_SHOT_MP","SLOT_ITEM.STURMTIGER_RELOAD_ACTIVE","SLOT_ITEM.SU76M_HE_ROUND_ITEM","SLOT_ITEM.SU76M_HE_ROUND_ITEM_MP","SLOT_ITEM.SUPPORT_SQUAD_SETUP","SLOT_ITEM.SUPPRESS_FIRE_ITEM","SLOT_ITEM.SWS_LOCKDOWN_SETUP","SLOT_ITEM.TANK_HUNTER_SHOCK_BAZOOKA_VET","SLOT_ITEM.TIGER_ACE_CRITICAL_SHOT_MP","SLOT_ITEM.TIGER_FLARE_TOW","SLOT_ITEM.TOMMY_BREN_LIGHT_MACHINE_GUN_MP","SLOT_ITEM.TOMMY_FLAMETHROWER","SLOT_ITEM.TOMMY_GAMMON_BOMB_HEAVY","SLOT_ITEM.TOMMY_GAMMON_BOMB_MEDIUM","SLOT_ITEM.TOMMY_HEAT_GRENADE","SLOT_ITEM.TOMMY_MILLS_BOMB","SLOT_ITEM.TOMMY_MILLS_BOMB_ASSAULT","SLOT_ITEM.TOMMY_OFFICER_SMOKE_MARKER_GRENADE_MP","SLOT_ITEM.TOMMY_SCOPED_RIFLE_ITEM_MP","SLOT_ITEM.TOMMY_STEN_SMG","SLOT_ITEM.TROOP_SUPPORT_DUMMY_MEDIC","SLOT_ITEM.UNIVERSAL_CARRIER_VICKERS_K_PACKAGE_MP","SLOT_ITEM.UNIVERSAL_CARRIER_VICKERS_MMG_SUPPRESSIVE_MP","SLOT_ITEM.URBAN_ASSAULT_FLAMETHROWER_MP","SLOT_ITEM.URBAN_ASSAULT_SATCHEL_CHARGE_ITEM_MP","SLOT_ITEM.VALENTINE_SMOKE_MARKER_GRENADE_MP","SLOT_ITEM.VICKERS_K_LIGHT_MACHINE_GUN_MP","SLOT_ITEM.VOLKSGRENADIER_FIRE_GRENADE_MP","SLOT_ITEM.VOLKSGRENADIER_GRENADE_MP","SLOT_ITEM.VOLKSGRENADIER_MP44_ITEM_MP","SLOT_ITEM.VOLKSGRENADIER_PANZERFAUST_MP","SLOT_ITEM.VOLKSGRENADIER_PANZERFAUST_VET_4_MP","SLOT_ITEM.WAFFEN_BUNDLED_ASSAULT_GRENADE","SLOT_ITEM.WEST_GERMAN_MINESWEEPER","SLOT_ITEM.WG_BLENDKORPER_SMOKE_UI_ITEM","SLOT_ITEM.WG_PANZER_IV_ARMORED_SKIRTS","CRIT._NO_CRITICAL","CRIT._NO_CRITICAL_MINE","CRIT._NO_CRITICAL_REAR","CRIT._SP_ANIA_EXPLOSIVE","CRIT._SP_ANIA_KILLED","CRIT.ASSAULT_MODIFIERS","CRIT.ATTACK_PLAN_MODIFIERS","CRIT.AXIS_ASSAULT_MODIFIERS","CRIT.BRIDGE_DEMOLITION_MAKE_WRECK","CRIT.BRIDGE_MAKE_WRECK","CRIT.BUILDING_ABANDON","CRIT.BUILDING_BRACED","CRIT.BUILDING_DESTROY","CRIT.BUILDING_DESTROY_CONSTRUCTION","CRIT.BUILDING_DESTROY_SUPPLY_CENTER","CRIT.BUILDING_FIRE_DAMAGE_DOT","CRIT.BUILDING_FIRE_DAMAGE_PANEL","CRIT.BUILDING_PANEL_DAMAGE_CRITICAL","CRIT.BUILDING_RED_BUILD_TIME_INCREASE","CRIT.BUILDING_STRONG_CRITICAL","CRIT.BUILDING_WEAK_CRITICAL","CRIT.BUILDING_YELLOW_BUILD_TIME_INCREASE","CRIT.BULLET_HIT_CRITICAL","CRIT.BURN","CRIT.BURN_DEATH","CRIT.BURN_DEATH_OUT_OF_CONTROL","CRIT.BURN_WORLD_OBJECT","CRIT.BURN_WORLD_OBJECT_DEATH","CRIT.CAMOUFLAGE_MINE","CRIT.CHURCHILL_TANK_SHOCK_MODIFIERS","CRIT.DETONATE_BANGALORE","CRIT.DETONATE_DEMOLITION_CHARGE","CRIT.DETONATE_MINE","CRIT.EMPLACEMENT_EMPTY","CRIT.EMPLACEMENT_FLAME_CRITICAL","CRIT.EMPLACEMENT_KILL_LOADER","CRIT.EXPLOSIVE_DESTROY","CRIT.GOLIATH_DESTROY","CRIT.HEROIC_CHARGE_FATIGUE","CRIT.MAKE_CASUALTY","CRIT.SOLDIER_BLIND","CRIT.SOLDIER_EXECUTED","CRIT.SOLDIER_EXPLOSIVE_ROUND","CRIT.SOLDIER_FLAMETHROWER_EXPLODE","CRIT.SOLDIER_FORCE_RETREAT","CRIT.SOLDIER_FROZEN","CRIT.SOLDIER_KILLED","CRIT.SOLDIER_KILLED_DEATH_INTENSITY_100","CRIT.SOLDIER_KILLED_DEATH_INTENSITY_30","CRIT.SOLDIER_KILLED_DEATH_INTENSITY_60","CRIT.SOLDIER_KILLED_HMG_DEATH","CRIT.SOLDIER_PIN","CRIT.SOLDIER_SLOW","CRIT.SOLDIER_SNIPED","CRIT.SOLDIER_SNIPED_IN_HALFTRACK","CRIT.SOLDIER_SNIPED_MAKE_CASUALTY","CRIT.SOLDIER_SNIPED_STILL_ALIVE","CRIT.SOLDIER_STUN","CRIT.SOLDIER_SUPPRESS","CRIT.SQUAD_ITEM_DAMAGED","CRIT.STUNNED_CANNOT_SHOOT_10_SECONDS","CRIT.STUNNED_CANNOT_SHOOT_MOVE_10_SECONDS","CRIT.SUPPLY_DROP_BLOW_UP","CRIT.TANK_TRAP_DESTROY","CRIT.TEAM_WEAPON_DISABLING_SHOT","CRIT.VEHICLE_ABANDON","CRIT.VEHICLE_ABANDON_STURMTIGER","CRIT.VEHICLE_AEC_TEMP_ENGINE_DAMAGE","CRIT.VEHICLE_AEC_TEMP_IMMOBILITY","CRIT.VEHICLE_BLIND","CRIT.VEHICLE_CREW_DAZED_JAGDTIGER","CRIT.VEHICLE_CREW_SHOCKED","CRIT.VEHICLE_CREW_STUNNED","CRIT.VEHICLE_CREW_STUNNED_2","CRIT.VEHICLE_DAMAGE_ENGINE","CRIT.VEHICLE_DAMAGE_ENGINE_INCREMENTAL","CRIT.VEHICLE_DAMAGE_ENGINE_REAR","CRIT.VEHICLE_DAMAGE_ENGINE_REAR_RAMMING","CRIT.VEHICLE_DAMAGE_ENGINE_SNARE","CRIT.VEHICLE_DECREW","CRIT.VEHICLE_DESTROY","CRIT.VEHICLE_DESTROY_BREW_UP","CRIT.VEHICLE_DESTROY_ENGINE","CRIT.VEHICLE_DESTROY_ENGINE_REAR","CRIT.VEHICLE_DESTROY_MAINGUN","CRIT.VEHICLE_DESTROY_MAINGUN_RAMMING","CRIT.VEHICLE_DESTROY_QUAD_50","CRIT.VEHICLE_DESTROY_SEARCHLIGHT_IR_HALFTRACK","CRIT.VEHICLE_DESTROY_WEAPON_TEAM","CRIT.VEHICLE_DRIVER_INJURED","CRIT.VEHICLE_ENGINE_BURNING","CRIT.VEHICLE_EXHAUST_DAMAGED","CRIT.VEHICLE_GUNNER_INJURED","CRIT.VEHICLE_KILL_BRIT_TANK_COMMANDER","CRIT.VEHICLE_KILL_COMMANDER","CRIT.VEHICLE_KILL_DRIVER_RUSSIAN","CRIT.VEHICLE_KILL_GUNNER_RUSSIAN","CRIT.VEHICLE_KILL_RELOADER_RUSSIAN","CRIT.VEHICLE_KILL_TOP_GUNNER_HARDPOINT_1","CRIT.VEHICLE_KILL_TOP_GUNNER_HARDPOINT_2","CRIT.VEHICLE_KILL_TOP_GUNNER_HARDPOINT_4","CRIT.VEHICLE_LIGHT_DAMAGE_ENGINE","CRIT.VEHICLE_LIGHT_DAMAGE_ENGINE_REAR","CRIT.VEHICLE_LIGHT_DESTROY_ENGINE","CRIT.VEHICLE_LIGHT_DESTROY_ENGINE_REAR","CRIT.VEHICLE_LOADER_INJURED","CRIT.VEHICLE_LOSE_TREADS_OR_WHEELS","CRIT.VEHICLE_MAKE_WRECK","CRIT.VEHICLE_OPTICS_DAMAGED","CRIT.VEHICLE_OPTICS_DAMAGED_TEMP","CRIT.VEHICLE_OUT_OF_CONTROL_FAST","CRIT.VEHICLE_OUT_OF_CONTROL_SLOW","CRIT.VEHICLE_OUT_OF_FUEL_GERMAN_SP","CRIT.VEHICLE_SHELL_SHOCKED","CRIT.VEHICLE_SNIPER_SLOW","CRIT.VEHICLE_STUCK_IN_MUD","CRIT.VEHICLE_TANK_GRAB_ABANDON_SP","CRIT.VEHICLE_TEMP_IMMOBILITY","CRIT.VEHICLE_TURRET_DISABLED_TEMP","CRIT.VEHICLE_UNIVERSAL_CARRIER_FLAMETHROWER_EXPLODE","CRIT.VEHICLE_VISION","CRIT.VEHICLE_VISON_BLOCK_DAMAGED","CRIT.VEHICLE_WEAPON_DISABLED_TEMP","CRIT.WORLD_DESTROY_BARRIER","CRIT.WORLD_OBJECT_DESTROY","CRIT.WORLD_OWNED_VEHICLE_ABANDON","BridgeReplace_OnInit","SkinPreviewCapture_Init","SkinPreviewCapture_SpawnVehicles","SkinPreviewCapture_UIInit","SkinPreviewCapture_CycleAndCaptureScreenshots","SkinPreviewCapture_Begin","SkinPreviewCapture_BeginCountdown","SkinPreviewCapture_ExitCountdown","SkinPreviewCapture_Exit","SkinPreviewCapture_StartCountdown","Map_PreInit","SkinPreviewCapture_Configure","AOH_PreInit","AV_PreInit","AV_Init","AV_UpdateObjectiveTimer","AV_UIInit","AV_End","CCM_ActionSpawnUKFSpawner","CCM_ActionSpawnUKFMiscSpawner","Squad_ToClipboardData","Squad_FromClipboardData","Entity_FromClipboardData","Entity_ToDataParameters","Entity_GetHealthPointsString","Squad_ToDataParameters","Squad_GetHealthPointsString","Player_ToDataParameters","Player_GetSetting","Player_SetSetting","Player_GetSettings","LocalPlayer_GetSettings","Data_GetHealthModifiedString","Data_GetOwnerChangedString","CCM_EventCueClickManger","CCM_EventMessage","CCM_EventKickerMessage","CCM_EventKickerMessageEval","CCM_EventKickerHealthMessageEval","CCM_ErrorMessage","Item_GetEnemyPlayer","CCM_SpawnQueueTick","CCM_SpawnQueueInit","CCM_SpawnQueueAdd","CCM_DummyMessage","CCM_PlayerCommandIssued","CCM_SquadCommandIssued","CCM_EntityCommandIssued","CCM_CustomUIEvent","Variable_FromG","Ternary","CCM_PlayerCommandIssued2","CCM_ConfigInit","__subMenu_SetUpdateRate","__subMenu_SpawnUnits","__subMenu_ManipulateSquadMembers","__panel_SelectionHealth","TestFormAdd","TestFormRender","Test_SlotItemRemoveSpam","Test_SlotItemRemoveSpam_Tick","CCM_HealthMonitor_Tick","CCM_HealthMonitor_HandleHealthMessage","CCM_HealthMonitor_RegisterNewItem","CCM_HealthMonitorInit","CCM_SuppressionMonitor_Tick","CCM_SuppressionMonitor_HandleMessage","CCM_SuppressionhMonitor_RegisterNewItem","CCM_SuppressionMonitorInit","CCM_Init","CCM_UIInit","CCM_BroadcastMessageReceived","CCM_Broadcast","CCM_ShowCrosshair","CCM_HideCrosshair","CCM_DisableUI","CCM_EnableUI","CCM_KillSelection","CCM_DeleteSelection","CCM_KillSquad","CCM_DeleteSquad","CCM_KillEntity","CCM_DeleteEntity","CCM_EnableFOW","CCM_DisableFOW","CCM_EnableAI","CCM_DisableAI","CCM_SetAIDifficulty","CCM_SetSelectionHealth","CCM_AddSelectionHealthPercentage","CCM_AddSelectionHealthPoints","CCM_SetSelectionInvulnerability","CCM_SetSelectionOwner","CCM_AddResource","CCM_ResetResource","CCM_AddPopulationCap","CCM_SetInstantProductionEnabled","CCM_SetInstantConstructionEnabled","CCM_SetInstantAbilityRechargeEnabled","CCM_SpawnSquad","CCM_SpawnEntity","CCM_SpawnSlotItem","CCM_IncreaseSelectionXP","CCM_IncreaseSelectionVeterancyLevel","CCM_InstantReinforceSelection","CCM_SplitSelection","CCM_RemoveSelectionCriticals","CCM_RemoveSquadCritical","CCM_RemoveEntityCritical","CCM_ApplyCriticalToSelection","CCM_SetSquadAutoTargetting","CCM_RemoveSquadUpgrade","CCM_RemoveEntityUpgrade","CCM_RemoveSquadSlotItem","CCM_SetSelectionFacing","CCM_TeleportSelection","CCM_KillEverything","CCM_DeleteEverything","CCM_RotateEntity","CCM_SetHealthMonitorEnabled","CCM_SetSuppressionMonitorEnabled","CCM_SelectedTeamWeaponGarrisonFacePosition","CCM_CancelTeamWeaponGarrisonFacingOrder","CCM_AddSelectionSuppression","CCM_SetAllAIPlayersEnabled","CCM_ResetSelectionVeterancy","CCM_SetResourceIncomeEnabled","CCM_SetHealthMonitorUpdateRate","CCM_SetSuppressionMonitorUpdateRate","CCM_UnlockCommanderAbility","CCM_ClearCommanderAbilities","CCM_ModifySquadMovementSpeed","CCM_SetSelectionOwnerToEnemy","CCM_SquadToEntity","CCM_SetEntityAnimatorState","CCM_SetSquadAnimatorState","CCM_SetSelectionAnimatorState","CCM_SetSelectionSkinType","CCM_DropSelectionWeapons","CCM_CaptureAllTerritorySectors","CCM_NeutralizeAllTerritorySectors","CCM_SquadToSkinPreviewEntity","Enhanced_Init","Enhanced_SystemInit","Enhanced_BroadcastMessageReceived","Enhanced_UITick","Enhanced_SetButtonsEnabled","Enhanced_ResetButtonIcons","Enhanced_SetButtonsVisible","Enhanced_PreInit","Enhanced_UIInit","Dude","MyMap_OnInit","MyMap_BonusUnitKilled","prnt","toCharArray","export","include","getBlueprintIfItExists","getBlueprintName","instanceOf","parent","Loc_Create","broadcastMessage","delayedStart","Map_PlayerBonusUnitKilled","MyFunction","Map_OnInit","Gardeners_PreInit","AutoAbandonManager","AutoAbandon_Add","AutoAbandon_Remove","AutoDeleteManager","AutoDelete_Add","AutoDelete_Remove","AutoRetreatManager","AutoRetreat_Add","AutoRetreat_Remove","Parameters_ToStringData","Parameters_FromStringData","Player_FromStringData","Squad_FromStringData","Entity_FromStringData","Broadcast","Camera_MoveToCallback","Camera_MoveToCallback_Tick","CameraPosition","Class","Color","Margin","Padding","Player","Control","Button_CreateConfig","Button_GetIcon","Button","FormControl_Init","FormControl_Refresh","Form","Icon","Label","NumericUpDown_CreateIconConfig","NumericUpDownScroll_Tick","NumericUpDown_RegisterAutoScroll","NumericUpDown_UnregisterAutoScroll","NumericUpDown","MenuControl_Init","Menu_AutoRefresh","Menu_AutoCheckEnabledScan","Menu_AutoCheckCheckedScan","CloseMenus","Menu","Menu_CreateBorderImage","Panel_GetMultipartBackground","Panel","PanelColumn","PanelColumnCollection","Class_GetUniqueID","Class_CreateInstance","Construct","CompanyCommander_Create","ControlSystem_Init","Button_FromTag","ButtonCallbackHandler","Control_GetName","Control_GetX","Control_GetY","Control_GetPath","Control_GetText","Control_GetTag","BPData_GetExtensions","Loc_Get","EBP_HasExtension","EBPData_HasExtension","EBP_GetScreenName","EBP_GetIcon","EBPData_GetUIExt","EBPData_GetScreenName","EBPData_GetIcon","SBP_GetScreenName","SBP_GetIcon","SBPData_GetRaceUIExt","SBPData_GetScreenName","SBPData_GetIcon","Crit_GetScreenName","CritData_GetUIExt","CritData_GetScreenName","CritData_GetIcon","UPG_GetScreenName","UPGData_GetScreenName","SlotItem_GetScreenName","SlotItemData_GetScreenName","EGroup_ToTable","EGroup_IsAlive","EGroup_IsCapturedByTeam2","LocalImport","ImportSystem","ImportDataTables","Library_Load","Lib_EnableMessages","Lib_SetMessagesEnabled","Lib_SetupMod","Mod_GetIcon","Mod_GetAbilityBlueprint","Mod_GetSquadBlueprint","Mod_GetEntityBlueprint","Mod_GetUpgradeBlueprint","Msg_Pos","Msg_3D","Lib_GameOver","Debug_SetMessagesEnabled","TryCatch","Library_Setup","Entity_Validate","Entity_AddHealthPercentage","Entity_AddHealthPoints","Entity_GetOwnerString","Entity_GetBPName","Entity_GetCriticals","Entity_RemoveCriticals","Entity_IsTeamWeapon","Entity_IsValidSafe","Entity_GetUpgrades","Entity_Rotate","Entity_GetTypes","Entity_IsOfType2","Entity_HasUpgrades","EBP_GetTypes","EBP_IsOfType","Entity_Decrew","Entity_PrepareForScreenshot","Entity_SetSkinSeason","Entity_GetBlueprintName","Entity_HasModifierExt","Percentage_Normalize","Round","scientific","Player_GetIndex","Player_SetResourcesEnabled","Player_ResetResources","Player_GetAllSquads","Player_DestroyAllSquads","Player_GetDisplayRaceName","Player_GetDisplayRaceNameLong","Player_GetNameWithFaction","AIDifficulty_Tostring","Player_IsAI","Player_ForEachSquad","Pos_NormalizeHeight","Rule_AddIntervalAndRun","Rule_AddIfNotExists","Rule_AddIntervalIfNotExists","Rule_ChangeIntervalIfExists","Rule_AddDelayed","Rule_AddDelayedIfNotExists","Modify_SetSquadtAutoTargetting","Modify_SetEntityAutoTargetting","Modify_SetEntityAutoTargettingAllHardpoints","Modify_SetSquadAutoTargettingAllHardpoints","Modify_SetSGroupAutoTargettingAllHardpoints","Modify_SetEGroupAutoTargettingAllHardpoints","Modify_SquadTypeEnableCapturing","Selection_UnselectAll","Selection_IsOneEntity","Selection_IsOneSquad","Selection_IsOneSquadOrOneEntity","Selection_IsOneOrMoreSquads","Selection_IsOneOrMoreEntities","Selection_IsSquadsOrEntities","Selection_IsSquadOrEntity","Selection_GetSquad","Selection_GetEntity","Selection_GetSquads","Selection_GetEntities","Misc_SomethingIsSelected","Selection_ForEachSquad","Selection_ForEachEntity","Selection_IsNotInvulnerable","Selection_IsNotNeutralSquadOrEntity","Selection_CountInvulnerables","Selection_IsInvulnerable","SelectionMonitor_Init","SelectionMonitor","SelectionMonitor_GetID","SelectionMonitor_AddSquad","SelectionMonitor_AddEntity","SelectionMonitor_RemoveSquad","SelectionMonitor_RemoveEntity","SelectionMonitor_RemoveItemListener","SelectionMonitor_RemoveSquadLister","SelectionSystem_RemoveEntityLister","SGroup_ToTable","SGroup_SetPosition","SGroup_CountEntities","SGroup_IsAlive2","Squad_CountSpawned","Squad_IsPlane","Squad_SetSelectable","Squad_GetLastAttackerSquad","Squad_IsSelected","Squad_AddHealthPercentage","Squad_AddHealthPoints","Squad_Abandon","Squad_GetOwnerString","Squad_GetBPName","Squad_GetCriticals","Squad_RemoveCriticals","Squad_IsValidSafe","Squad_SetAutoTargetting","__RegisterSquadAutoTargettingModifier","__UnRegisterSquadAutoTargettingModifier","__RegisterEntityAutoTargettingModifier","__UnRegisterEntityAutoTargettingModifier","Squad_SetAllAutoTargetting","Squad_GetAutoTargetting","Squad_GetAllAutoTargetting","Squad_GetUpgrades","Squad_HasUpgrades","Squad_RemoveSlotItem","Squad_RemoveUpgradeFully","Squad_ForEachHeldSquad","Squad_DestroyHeldSquads","Squad_KillHeldSquads","Squad_ModifyVehicleSpeed","Squad_ModifyVehicleRotationSpeed","Squad_ModifyTurretHorizontalSpeed","Squad_ModifyMovementSpeed","Squad_GetTypes","Squad_IsOfType","SBP_GetTypes","SBP_IsOfType","Squad_GetEntityTable","Squad_ToEntities","Squad_ToEntity","Squad_AddMainGunHorizontalRotation","Squad_SetMainGunHorizontalRotation","Squad_Decrew","Squad_SetSkinSeason","Squad_RemoveSlotItems","Squad_GetEntityStateString","Squad_RemoveUpgradeIfPresent","Squad_RemoveUpgradesIfPResent","String_Match","String_Replace","String_AddGenetive","String_Split","Number_TrailingZeroes","Outpost","Outpost_Init","OutpostManager_Register","OutpostManager_Tick","OutpostPatrol","OutpostCaptureTrigger","OutpostPatrolAlarmedSquads_Register","OutpostPatrolAlarmedSquads_Tick","OutpostPatrolManager_Register","OutpostPatrolManager_Tick","OutpostRadioPost","OutpostRadioPostManager_Register","OutpostRadioPostManager_Tick","Table_AddTable","Table_GetSmallest","Table_GetLargest","Table_RemoveValue","Table_IsEmpty","Table_GetRandomBlueprint","Table_Remove","Table_ToIndexableList","Table_Count","Table_Compare","RangeTable_GetRandomValue","OutpostReinforcementsManager_Register","OutpostReinforcementsManager_Tick","Team_GetRandomPlayer","Team_GetRandomPlayers","Time_TicksToSeconds","Time_SecondsToTicks","Time_MinutesToTicks","UI_EnableSelectionVisuals","UI_EnableSquadSelectionVisuals","SelectionVisual_Tick","SelectionVisual_RegisterEntity","UI_ScalePoint","Util_DelaySeconds","Util_DelayMinutes","Util_DelayRandom","Util_DelayRandomSeconds","Util_GetRandomPosExtended","Util_GetRandomHeadingPos","UIFrame_Destroy","Misc_Tester","Util_DistanceFromLine","Util_DistancePointToTeamShortest","HintPoints_Remove","MapIcon_CreateAndFacePosition","toboolean","ResourceType_ToString","ResourceType_FromString","ResourceType_ToDisplayString","Selection_GetPlayer","Objective_UpdateTitle","Objective_StartLocally","Util_CallFunctionsWithParameters","World_ForEachEntity","World_DivideTerritoryBetweenTeams","World_GetWidthRange","World_GetLengthRange","World_RegisterPlayers","World_GetEverythingNearPoint","World_GetAll","World_GetAllSquads","World_ForEeachSquad","World_OneOrMoreAIPlayerIsEnabled","World_OneOrMoreAIPlayerIsDisabled","World_CleanUpTheDeadAll","World_GetAllTerritoryPointEntities","Villagers_PreInit","WarDrive_Init","_getPlayerMineEBP","_spawnMines","WarDrive_GetPlayerReconAbility","WarDrive_ReconSweepBetweenTeams","WarDrive_GetNextEffectDelay","WarDrive_PickRandomEffect","WarDrive_SplitTimeUnits","WarDrive_FormatTime","WarDrive_Monitor","Team_HasTerritoryPoint","WarDrive_EntityKilled","WarDrive_SquadKilled","TestEffect","WarDrive_EnableEffect","WarDrive_RemoveModifiers","WarDrive_GetIcon","WarDrive_RegisterModifier","Modify_SquadBuildTime","Modify_SquadReinforceTime","Modify_EntityCaptureTime","WarDrive_ObjectiveInit","WarDrive_ObjectiveAfterInt","WarDrive_Pager","WarDrive_AbilityExecuted","WarDrive_GetAbilityBlueprint","WarDrive_PreInit","CCM_AddInfiniteResourcesPopcap","CCM_ActionKillSelection","CCM_ActionDeleteSelection","CCM_ActionTeleportSelection","CCM_ActionIncreaseSelectionVeterancy","CCM_ActionIncreaseSelectionHealth","CCM_ActionDecreaseSelectionHealth","CCM_ModifySelectionHealth","CCM_ActionAbandonSelected","CCM_ActionRemoveCriticals","CCM_ActionDropSlotItems","CCM_ActionInstantReinforce","CCM_ActionAddPreciseManpower","CCM_ActionAddPreciseFuel","CCM_ActionAddPreciseMunition","_CCM_SpawnSpawnerSquad","CCM_ActionSpawnSovietSpawner","CCM_ActionSpawnAEFSpawner","CCM_ActionSpawnGermanSpawner","CCM_ActionSpawnWestGermanSpawner","CCM_ActionAddFullHealth","CCM_ActionKillOneEntity","CCM_ActionDeleteOneEntity","CCM_ActionSpawnGermanMiscSpawner","CCM_ActionSpawnSovietMiscSpawner","CCM_ActionSpawnWestGermanMiscSpawner","CCM_ActionSpawnAEFMiscSpawner","CCM_DataInit","CCM_CopySelection","CCM_PasteSelection","Clipboard_Clear","CCM_PreInit","CCM_SystemInit","CCM_PlayerResetAbilities","Player_GetSettingsKey","CCM_PlayerAbilityCompleteListener","CCM_PlayerAbilityListener","CCM_RegisterPlayerAction","Squad_GetSpawnerRaceIndex","Squad_GetSpawnerTable","Squad_GetSpawnAbilityPrefix","CCM_SquadAbilityListener","CCM_CountSpawnTableItems","_CCM_InitSpawnerSquad","CCM_AutoHideAbilities","Entity_CreateAndSpawnTowardTeamWeapon","Entity_GetUpgradeTable","Entity_ApplyCriticalHit","Entity_GetText","Entity_Abandon","EntityBP_IsBuilding","Util_Destroy","Util_GetBPName","Misc_CheckForParentSquad","Squad_GetTableKey","Entity_GetTableKey","Util_GetTablekey","Util_SetInvulnerable","Player_GetIDSafe","Table_ForEach","CCM_Msg","CCM_ClearMSG","CCM_GetAbilityBleprint","CCM_GetSquadBlueprint","CCM_GetEntityBlueprint","CCM_GetUpgradeBlueprint","CCM_GetIcon","CCM_EventCue","Misc_AddSpawnedItemToSystem","Util_AddHealth","Misc_DoPercentageSum","Util_SetPosition","Util_GetGameID","Util_DecodeGameID","Misc_SpawnSlotItemOnGround","Squad_ModifySpeed","Squad_GetHealthTable","Squad_ApplyHealthTable","Squad_GetPlayerOwnerSafe","Squad_GetHeadingTable","Squad_ApplyHeadingTable","Squad_GetUpgradesTable","Squad_GetText","Squad_GetCriticalsTable","Squad_ApplyCriticalHitTable","Squad_ModifyDamage","Squad_DropSlotItems","Squad_RemoveUpgrades","Squad_RemoveCritical","Squad_HasCritical","Squad_GetEntityPositionList","Squad_ApplyEntityPositionList","Squad_SetHealthPercentage","Squad_IsVehicle","CCM_ToggleInstantProduction","CCM_ToggleFOW","CCM_ToggleGlobalAI","CCM_ToggleSelectionInvulnerability","CCM_ToggleSelectionOwner","CCM_ToggleDisableWeapons","CCM_ToggleEngineOrPostureState","CCM_ToggleHealthMonitor","CCM_GetSquadKey","CCM_GetEntityKey","CCM_HealthMonitor","_CCM_HealthMonitor_HandleHealth","_CCM_HealthMonitor_KickerMessage","CTF_PreInit","CTFSystem_Init","CTF_GetRandomFlagSpawnPosition","CTF_FreeFlagSpawnPosition","CTFSystem_InitDelayed","CTF_StartCore","CTF_GetWinScoreLimit","CTF_FlagScoreMonitor","CTF_BlinkFlagCarriers","CTF_FlagRespawnMonitor","CTF_FlagStateMonitor","CTF_EnableResources","CTF_UpdateObjectiveUI","CTF_FixFlagColor","CTF_FixFlagColorDelayed","CTF_StopAlarm","CTF_FlagCarrierAbilityExecuted","CTF_DropFlagRequestManager","CTF_PreventFlagCarrierReCrewAndVehicleGarrisoning","CTF_FlagCaptured","CTF_FlagDropped","CTF_FlagScored","CTF_GetOpposingTeam","CTF_TeamFlagScore","CTF_ObjctiveInit","CTF_AddObjectiveUI","Entity_IsReCrewable","Squad_AddFlagCarrierEffects","Squad_RemoveFlagCarrierEffects","Squad_SetCaptureEnabled","Squad_EnableFlagCarrierUI","Squad_EnableCantHoldUI","Squad_ModifyInfantrySpeed","Squad_MonitorDeath","Squad_DisableFlagCarrierUI","isset","Squad_FlagCarrierDeath","Squad_DropFlag","Squad_CarriesFlag","Squad_IsRegisteredFlagCarrier","Squad_RegisterFlagCarrier","Squad_UnRegisterFlagCarrier","Squad_GetSlotItemTable","Player_EnableMoveFlagHereUI","Player_UnlockRetreat","Player_IsHoldingAnyFlags","SGroup_IsCarryingFlag","UI_LocalKickerMessage","UI_GlobalKickerMessage","CTF_Msg","ClearCTF_Msg","Listener","Table_Shuffle","Ability_GetUniqueKey","Player_AddPopulation","Player_ExecuteLocally","Player_GetEnemyPlayer","Player_SetResourceIncomeNumber","Team_GetFirstPlayer","Team_GetEntitiesNearPoint","Team_GetSquadsNearPoint","Team_GetPlayerCount","Team_ExecuteLocally","SGroup_CreateTemp","EGroup_CreateTemp","EGroup_GetClosest","EGroup_AddGroup","EGroup_FilterByUnitType","Entity_GetGarrisonedSquads","Entity_AutoAlign","Entity_CreateAndSpawnToward","Entity_CreateAndSpawnTowardDelayed","Entity_CreateAndSpawnTowardDelayedRandom","Entity_GetName","Entity_GetTempEGroup","Entity_GetOwnerSafe","Entity_Replace","Entity_IsSelected","Entity_HasProductionQueueItem","Entity_IsValidEntity","Squad_GetUniqueKey","Squad_GetName","Squad_IsIdle","Squad_IsConcstructing","Squad_IsHeadingToPosition","Squad_ForEachEntity","UI_FlashSquad","Util_Repeat","Util_Delay","Util_IsPositionInPolygon","Util_GetDirectionalOffset","Util_GetDirectionalOffsetPosition","Util_GetRandomPos","Util_GetAngleTowardsPos","Util_CopyPosition","Util_CreateUIFrame","Util_Tester","Misc_UnSelectAll","Util_DefaultValue","World_ForEachEntitiesByBlueprint","World_GetEntitiesOfType","Pos_AddHeight","Pos_GetString","dr_text3dpos","Heading_Rotate","Squad_InfraRedReveal","WinCondition_PreInit","WinCondition_MonitorVictoryPoints","Team_GetTitle","Team_GetOpposingTeam","OKWNoCache_PreInit","PK_SystemInit","PK_ScanPlayers","PK_PlayerAbilityListener","Player_RemoveTankDispatchAbilities","Squad_GetTempSGroup","Player_GetMapEntryPositionClosest","Util_SortPositionsByClosestImproved","Pos_GetXYZString","PK_Msg","PK_ClearMSG","PK_GetAbilityBleprint","PK_GetUpgradeBleprint","PK_GetSquadBleprint","PK_EventCue","Player_GetRaceIndex","PK_PreInit","RotateThings","TC_PreInit","TC_Init","TC_TogglePlayerCategory","System_PlayerAbilityComplete","System_PlayerAbilityExecuted","TC_UpdatePlayerCircle","TC_UpdatePlayerArrow","TC_GeneralManager","TC_GetAbilityBlueprint","TC_GetMineIcon","TC_GetMineIconScale","TC_MineIsAllowedToMark","TC_MineIsPartOfSMineField","TC_GetMineMarkerColor","TC_GetIcon","TC_MineMarkerManager","TC_BlibMinePlanted","System_EntityConstructionCompleted","System_EntityKilled","Player_IsLocalPlayer","Player_GetUniqueKey","Player_GetName","Players_ForEach","Players_ForEachInTeam","Entity_GetPlayerOwnerSafe","Entity_GetUniqueKey","Entity_CheckForParentSquad","EntityList_ContainsValidEntities","EGroup_GetEntityIds","Util_GlobalMessage","Util_CreateLocString","Util_GetBlueprint","Util_GetUnitOwner","Game_GetLocalPlayerID","World_OwnsUnit","World_GetEntitiesByBlueprint","World_ForEachEntities","Msg","TC_DataInit_Ebps","TC_DataInit","WinCondition_GameOver","WinCondition_Check","WinCondition_Init","$","AAGUID","ANGLE_instanced_arrays","AbstractWorker","AbstractWorkerEventMap","Account","ActiveXObject","AesCbcParams","AesCfbParams","AesCmacParams","AesCtrParams","AesDerivedKeyParams","AesGcmParams","AesKeyAlgorithm","AesKeyGenParams","Algorithm","AlgorithmIdentifier","AnalyserNode","AnimationEvent","AnimationEventInit","ApplicationCache","ApplicationCacheEventMap","Array","ArrayBuffer","ArrayBufferConstructor","ArrayBufferView","ArrayConstructor","ArrayLike","AssertionOptions","AssignedNodesOptions","Attr","Audio","AudioBuffer","AudioBufferSourceNode","AudioBufferSourceNodeEventMap","AudioContext","AudioContextBase","AudioContextEventMap","AudioDestinationNode","AudioListener","AudioNode","AudioParam","AudioProcessingEvent","AudioTrack","AudioTrackList","AudioTrackListEventMap","BarProp","BaseJQueryEventObject","BeforeUnloadEvent","BiquadFilterNode","Blob","BlobPropertyBag","Body","BodyInit","Boolean","BooleanConstructor","Buffer","BufferEncoding","BufferSource","ByteString","CDATASection","CSS","CSSConditionRule","CSSFontFaceRule","CSSGroupingRule","CSSImportRule","CSSKeyframeRule","CSSKeyframesRule","CSSMediaRule","CSSNamespaceRule","CSSPageRule","CSSRule","CSSRuleList","CSSStyleDeclaration","CSSStyleRule","CSSStyleSheet","CSSSupportsRule","Cache","CacheQueryOptions","CacheStorage","Canvas2DContextAttributes","CanvasGradient","CanvasPathMethods","CanvasPattern","CanvasRenderingContext2D","ChannelMergerNode","ChannelSplitterNode","CharacterData","ChildNode","ClassDecorator","ClientData","ClientRect","ClientRectList","ClipboardEvent","ClipboardEventInit","CloseEvent","CloseEventInit","Comment","CompositionEvent","CompositionEventInit","ConcatParams","ConfirmSiteSpecificExceptionsInformation","Console","ConstrainBoolean","ConstrainBooleanParameters","ConstrainDOMString","ConstrainDOMStringParameters","ConstrainDouble","ConstrainDoubleRange","ConstrainLong","ConstrainLongRange","ConstrainVideoFacingModeParameters","ConvolverNode","Coordinates","Crypto","CryptoKey","CryptoKeyPair","CryptoOperationData","CustomElementRegistry","CustomEvent","CustomEventInit","DOMError","DOMException","DOMImplementation","DOML2DeprecatedColorProperty","DOML2DeprecatedSizeProperty","DOMParser","DOMRectInit","DOMSettableTokenList","DOMStringList","DOMStringMap","DOMTokenList","DataCue","DataTransfer","DataTransferItem","DataTransferItemList","DataView","DataViewConstructor","Date","DateConstructor","DecodeErrorCallback","DecodeSuccessCallback","DeferredPermissionRequest","DelayNode","DeviceAcceleration","DeviceAccelerationDict","DeviceLightEvent","DeviceLightEventInit","DeviceMotionEvent","DeviceMotionEventInit","DeviceOrientationEvent","DeviceOrientationEventInit","DeviceRotationRate","DeviceRotationRateDict","DhImportKeyParams","DhKeyAlgorithm","DhKeyDeriveParams","DhKeyGenParams","Document","DocumentEvent","DocumentEventMap","DocumentFragment","DocumentOrShadowRoot","DocumentType","DoubleRange","DragEvent","DynamicsCompressorNode","EXT_frag_depth","EXT_texture_filter_anisotropic","EcKeyAlgorithm","EcKeyGenParams","EcKeyImportParams","EcdhKeyDeriveParams","EcdsaParams","Element","ElementDefinitionOptions","ElementEventMap","ElementListTagNameMap","ElementTagNameMap","ElementTraversal","Enumerator","EnumeratorConstructor","ErrnoException","Error","ErrorConstructor","ErrorEvent","ErrorEventHandler","ErrorEventInit","EvalError","EvalErrorConstructor","Event","EventEmitter","EventInit","EventListener","EventListenerObject","EventListenerOrEventListenerObject","EventModifierInit","EventTarget","ExceptionInformation","ExtensionScriptApis","External","FFF","FGHJK","File","FileList","FilePropertyBag","FileReader","Float32Array","Float32ArrayConstructor","Float64Array","Float64ArrayConstructor","FocusEvent","FocusEventInit","FocusNavigationEvent","FocusNavigationEventInit","FocusNavigationOrigin","Foo","Foos","ForEachCallback","FormData","FrameRequestCallback","Function","FunctionConstructor","FunctionStringCallback","GLbitfield","GLboolean","GLbyte","GLclampf","GLenum","GLfloat","GLint","GLintptr","GLshort","GLsizei","GLsizeiptr","GLubyte","GLuint","GLushort","GainNode","Gamepad","GamepadButton","GamepadEvent","GamepadEventInit","GeneratorFunction","GeneratorFunctionConstructor","Geolocation","GetNotificationOptions","GetSVGDocument","GlobalEventHandlers","GlobalEventHandlersEventMap","GlobalFetch","HTMLAllCollection","HTMLAnchorElement","HTMLAppletElement","HTMLAreaElement","HTMLAreasCollection","HTMLAudioElement","HTMLBRElement","HTMLBaseElement","HTMLBaseFontElement","HTMLBodyElement","HTMLBodyElementEventMap","HTMLButtonElement","HTMLCanvasElement","HTMLCollection","HTMLCollectionBase","HTMLCollectionOf","HTMLDListElement","HTMLDataElement","HTMLDataListElement","HTMLDirectoryElement","HTMLDivElement","HTMLDocument","HTMLElement","HTMLElementEventMap","HTMLElementTagNameMap","HTMLEmbedElement","HTMLFieldSetElement","HTMLFontElement","HTMLFormControlsCollection","HTMLFormElement","HTMLFrameElement","HTMLFrameElementEventMap","HTMLFrameSetElement","HTMLFrameSetElementEventMap","HTMLHRElement","HTMLHeadElement","HTMLHeadingElement","HTMLHtmlElement","HTMLIFrameElement","HTMLIFrameElementEventMap","HTMLImageElement","HTMLInputElement","HTMLLIElement","HTMLLabelElement","HTMLLegendElement","HTMLLinkElement","HTMLMapElement","HTMLMarqueeElement","HTMLMarqueeElementEventMap","HTMLMediaElement","HTMLMediaElementEventMap","HTMLMenuElement","HTMLMetaElement","HTMLMeterElement","HTMLModElement","HTMLOListElement","HTMLObjectElement","HTMLOptGroupElement","HTMLOptionElement","HTMLOptionsCollection","HTMLOutputElement","HTMLParagraphElement","HTMLParamElement","HTMLPictureElement","HTMLPreElement","HTMLProgressElement","HTMLQuoteElement","HTMLScriptElement","HTMLSelectElement","HTMLSlotElement","HTMLSourceElement","HTMLSpanElement","HTMLStyleElement","HTMLTableAlignment","HTMLTableCaptionElement","HTMLTableCellElement","HTMLTableColElement","HTMLTableDataCellElement","HTMLTableElement","HTMLTableHeaderCellElement","HTMLTableRowElement","HTMLTableSectionElement","HTMLTemplateElement","HTMLTextAreaElement","HTMLTimeElement","HTMLTitleElement","HTMLTrackElement","HTMLUListElement","HTMLUnknownElement","HTMLVideoElement","HTMLVideoElementEventMap","HashChangeEvent","HashChangeEventInit","Headers","HeadersInit","History","HkdfCtrParams","HmacImportParams","HmacKeyAlgorithm","HmacKeyGenParams","I","IArguments","IDBArrayKey","IDBCursor","IDBCursorWithValue","IDBDatabase","IDBDatabaseEventMap","IDBEnvironment","IDBFactory","IDBIndex","IDBIndexParameters","IDBKeyPath","IDBKeyRange","IDBObjectStore","IDBObjectStoreParameters","IDBOpenDBRequest","IDBOpenDBRequestEventMap","IDBRequest","IDBRequestEventMap","IDBTransaction","IDBTransactionEventMap","IDBValidKey","IDBVersionChangeEvent","IFoos","IIRFilterNode","ITextWriter","Image","ImageData","Infinity","Int16Array","Int16ArrayConstructor","Int32Array","Int32ArrayConstructor","Int8Array","Int8ArrayConstructor","IntersectionObserver","IntersectionObserverCallback","IntersectionObserverEntry","IntersectionObserverEntryInit","IntersectionObserverInit","Intl","Iterable","IterableIterator","Iterator","IteratorResult","JQuery","JQueryAjaxSettings","JQueryAnimationOptions","JQueryCallback","JQueryCoordinates","JQueryDeferred","JQueryEventConstructor","JQueryEventObject","JQueryGenericPromise","JQueryInputEventObject","JQueryKeyEventObject","JQueryMouseEventObject","JQueryParam","JQueryPromise","JQueryPromiseCallback","JQueryPromiseOperator","JQuerySerializeArrayElement","JQueryStatic","JQuerySupport","JQueryXHR","JSON","JSX","JsonWebKey","KeyAlgorithm","KeyFormat","KeyType","KeyUsage","KeyboardEvent","KeyboardEventInit","LinkStyle","ListeningStateChangedEvent","Location","LongRange","LongRunningScriptDetectedEvent","MSAccountInfo","MSApp","MSAppAsyncOperation","MSAppAsyncOperationEventMap","MSAssertion","MSAudioLocalClientEvent","MSAudioRecvPayload","MSAudioRecvSignal","MSAudioSendPayload","MSAudioSendSignal","MSBaseReader","MSBaseReaderEventMap","MSBlobBuilder","MSConnectivity","MSCredentialFilter","MSCredentialParameters","MSCredentialSpec","MSCredentials","MSDelay","MSDescription","MSExecAtPriorityFunctionCallback","MSFIDOCredentialAssertion","MSFIDOCredentialParameters","MSFIDOSignature","MSFIDOSignatureAssertion","MSFileSaver","MSGesture","MSGestureEvent","MSGraphicsTrust","MSHTMLWebViewElement","MSIPAddressInfo","MSIceWarningFlags","MSInboundPayload","MSInputMethodContext","MSInputMethodContextEventMap","MSJitter","MSLaunchUriCallback","MSLocalClientEvent","MSLocalClientEventBase","MSManipulationEvent","MSMediaKeyError","MSMediaKeyMessageEvent","MSMediaKeyNeededEvent","MSMediaKeySession","MSMediaKeys","MSNavigatorDoNotTrack","MSNetwork","MSNetworkConnectivityInfo","MSNetworkInterfaceType","MSOutboundNetwork","MSOutboundPayload","MSPacketLoss","MSPayloadBase","MSPointerEvent","MSPortRange","MSRangeCollection","MSRelayAddress","MSSignatureParameters","MSSiteModeEvent","MSStream","MSStreamReader","MSTransportDiagnosticsStats","MSUnsafeFunctionCallback","MSUtilization","MSVideoPayload","MSVideoRecvPayload","MSVideoResolutionDistribution","MSVideoSendPayload","MSWebViewAsyncOperation","MSWebViewAsyncOperationEventMap","MSWebViewSettings","Map","MapConstructor","Math","MediaDeviceInfo","MediaDevices","MediaDevicesEventMap","MediaElementAudioSourceNode","MediaEncryptedEvent","MediaEncryptedEventInit","MediaError","MediaKeyMessageEvent","MediaKeyMessageEventInit","MediaKeySession","MediaKeyStatusMap","MediaKeySystemAccess","MediaKeySystemConfiguration","MediaKeySystemMediaCapability","MediaKeys","MediaList","MediaQueryList","MediaQueryListListener","MediaSource","MediaStream","MediaStreamAudioSourceNode","MediaStreamConstraints","MediaStreamError","MediaStreamErrorEvent","MediaStreamErrorEventInit","MediaStreamEvent","MediaStreamEventInit","MediaStreamEventMap","MediaStreamTrack","MediaStreamTrackEvent","MediaStreamTrackEventInit","MediaStreamTrackEventMap","MediaTrackCapabilities","MediaTrackConstraintSet","MediaTrackConstraints","MediaTrackSettings","MediaTrackSupportedConstraints","MessageChannel","MessageEvent","MessageEventInit","MessagePort","MessagePortEventMap","MethodDecorator","MimeType","MimeTypeArray","Model123","Model456","MouseEvent","MouseEventInit","MouseWheelEvent","MsZoomToOptions","MutationCallback","MutationEvent","MutationObserver","MutationObserverInit","MutationRecord","NaN","NamedNodeMap","NavigationCompletedEvent","NavigationEvent","NavigationEventWithReferrer","Navigator","NavigatorBeacon","NavigatorConcurrentHardware","NavigatorContentUtils","NavigatorGeolocation","NavigatorID","NavigatorOnLine","NavigatorStorageUtils","NavigatorUserMedia","NavigatorUserMediaErrorCallback","NavigatorUserMediaSuccessCallback","Node","NodeBuffer","NodeFilter","NodeIterator","NodeJS","NodeList","NodeListOf","NodeModule","NodeProcess","NodeRequire","NodeRequireFunction","NodeSelector","Notification","NotificationEventMap","NotificationOptions","NotificationPermissionCallback","Number","NumberConstructor","OES_element_index_uint","OES_standard_derivatives","OES_texture_float","OES_texture_float_linear","OES_texture_half_float","OES_texture_half_float_linear","Object","ObjectConstructor","ObjectURLOptions","OfflineAudioCompletionEvent","OfflineAudioContext","OfflineAudioContextEventMap","Option","OscillatorNode","OscillatorNodeEventMap","OverflowEvent","PageTransitionEvent","PannerNode","ParameterDecorator","ParentNode","Partial","Path2D","PaymentAddress","PaymentCurrencyAmount","PaymentDetails","PaymentDetailsModifier","PaymentItem","PaymentMethodData","PaymentOptions","PaymentRequest","PaymentRequestEventMap","PaymentRequestUpdateEvent","PaymentRequestUpdateEventInit","PaymentResponse","PaymentShippingOption","Pbkdf2Params","PerfWidgetExternal","Performance","PerformanceEntry","PerformanceMark","PerformanceMeasure","PerformanceNavigation","PerformanceNavigationTiming","PerformanceResourceTiming","PerformanceTiming","PeriodicWave","PeriodicWaveConstraints","PermissionRequest","PermissionRequestedEvent","Pick","Plugin","PluginArray","PointerEvent","PointerEventInit","PopStateEvent","PopStateEventInit","Position","PositionCallback","PositionError","PositionErrorCallback","PositionOptions","ProcessingInstruction","ProgressEvent","ProgressEventInit","Promise","PromiseConstructor","PromiseConstructorLike","PromiseLike","PromiseRejectionEvent","PromiseRejectionEventInit","PropertyDecorator","PropertyDescriptor","PropertyDescriptorMap","PropertyKey","Proxy","ProxyConstructor","ProxyHandler","PushManager","PushSubscription","PushSubscriptionOptions","PushSubscriptionOptionsInit","RTCConfiguration","RTCDTMFToneChangeEvent","RTCDTMFToneChangeEventInit","RTCDtlsFingerprint","RTCDtlsParameters","RTCDtlsTransport","RTCDtlsTransportEventMap","RTCDtlsTransportStateChangedEvent","RTCDtmfSender","RTCDtmfSenderEventMap","RTCIceCandidate","RTCIceCandidateAttributes","RTCIceCandidateComplete","RTCIceCandidateDictionary","RTCIceCandidateInit","RTCIceCandidatePair","RTCIceCandidatePairChangedEvent","RTCIceCandidatePairStats","RTCIceGatherCandidate","RTCIceGatherOptions","RTCIceGatherer","RTCIceGathererEvent","RTCIceGathererEventMap","RTCIceParameters","RTCIceServer","RTCIceTransport","RTCIceTransportEventMap","RTCIceTransportStateChangedEvent","RTCInboundRTPStreamStats","RTCMediaStreamTrackStats","RTCOfferOptions","RTCOutboundRTPStreamStats","RTCPeerConnection","RTCPeerConnectionErrorCallback","RTCPeerConnectionEventMap","RTCPeerConnectionIceEvent","RTCPeerConnectionIceEventInit","RTCRTPStreamStats","RTCRtcpFeedback","RTCRtcpParameters","RTCRtpCapabilities","RTCRtpCodecCapability","RTCRtpCodecParameters","RTCRtpContributingSource","RTCRtpEncodingParameters","RTCRtpFecParameters","RTCRtpHeaderExtension","RTCRtpHeaderExtensionParameters","RTCRtpParameters","RTCRtpReceiver","RTCRtpReceiverEventMap","RTCRtpRtxParameters","RTCRtpSender","RTCRtpSenderEventMap","RTCRtpUnhandled","RTCSessionDescription","RTCSessionDescriptionCallback","RTCSessionDescriptionInit","RTCSrtpKeyParam","RTCSrtpSdesParameters","RTCSrtpSdesTransport","RTCSrtpSdesTransportEventMap","RTCSsrcConflictEvent","RTCSsrcRange","RTCStats","RTCStatsCallback","RTCStatsProvider","RTCStatsReport","RTCTransport","RTCTransportStats","RandomSource","Range","RangeError","RangeErrorConstructor","React","ReadableStream","ReadableStreamReader","Readonly","ReadonlyArray","ReadonlyMap","ReadonlySet","Record","ReferenceError","ReferenceErrorConstructor","Reflect","RegExp","RegExpConstructor","RegExpExecArray","RegExpMatchArray","RegistrationOptions","Request","RequestInfo","RequestInit","Response","ResponseInit","RsaHashedImportParams","RsaHashedKeyAlgorithm","RsaHashedKeyGenParams","RsaKeyAlgorithm","RsaKeyGenParams","RsaOaepParams","RsaOtherPrimesInfo","RsaPssParams","SVGAElement","SVGAngle","SVGAnimatedAngle","SVGAnimatedBoolean","SVGAnimatedEnumeration","SVGAnimatedInteger","SVGAnimatedLength","SVGAnimatedLengthList","SVGAnimatedNumber","SVGAnimatedNumberList","SVGAnimatedPoints","SVGAnimatedPreserveAspectRatio","SVGAnimatedRect","SVGAnimatedString","SVGAnimatedTransformList","SVGCircleElement","SVGClipPathElement","SVGComponentTransferFunctionElement","SVGDefsElement","SVGDescElement","SVGElement","SVGElementEventMap","SVGElementInstance","SVGElementInstanceList","SVGEllipseElement","SVGFEBlendElement","SVGFEColorMatrixElement","SVGFEComponentTransferElement","SVGFECompositeElement","SVGFEConvolveMatrixElement","SVGFEDiffuseLightingElement","SVGFEDisplacementMapElement","SVGFEDistantLightElement","SVGFEFloodElement","SVGFEFuncAElement","SVGFEFuncBElement","SVGFEFuncGElement","SVGFEFuncRElement","SVGFEGaussianBlurElement","SVGFEImageElement","SVGFEMergeElement","SVGFEMergeNodeElement","SVGFEMorphologyElement","SVGFEOffsetElement","SVGFEPointLightElement","SVGFESpecularLightingElement","SVGFESpotLightElement","SVGFETileElement","SVGFETurbulenceElement","SVGFilterElement","SVGFilterPrimitiveStandardAttributes","SVGFitToViewBox","SVGForeignObjectElement","SVGGElement","SVGGradientElement","SVGGraphicsElement","SVGImageElement","SVGLength","SVGLengthList","SVGLineElement","SVGLinearGradientElement","SVGMarkerElement","SVGMaskElement","SVGMatrix","SVGMetadataElement","SVGNumber","SVGNumberList","SVGPathElement","SVGPathSeg","SVGPathSegArcAbs","SVGPathSegArcRel","SVGPathSegClosePath","SVGPathSegCurvetoCubicAbs","SVGPathSegCurvetoCubicRel","SVGPathSegCurvetoCubicSmoothAbs","SVGPathSegCurvetoCubicSmoothRel","SVGPathSegCurvetoQuadraticAbs","SVGPathSegCurvetoQuadraticRel","SVGPathSegCurvetoQuadraticSmoothAbs","SVGPathSegCurvetoQuadraticSmoothRel","SVGPathSegLinetoAbs","SVGPathSegLinetoHorizontalAbs","SVGPathSegLinetoHorizontalRel","SVGPathSegLinetoRel","SVGPathSegLinetoVerticalAbs","SVGPathSegLinetoVerticalRel","SVGPathSegList","SVGPathSegMovetoAbs","SVGPathSegMovetoRel","SVGPatternElement","SVGPoint","SVGPointList","SVGPolygonElement","SVGPolylineElement","SVGPreserveAspectRatio","SVGRadialGradientElement","SVGRect","SVGRectElement","SVGSVGElement","SVGSVGElementEventMap","SVGScriptElement","SVGStopElement","SVGStringList","SVGStyleElement","SVGSwitchElement","SVGSymbolElement","SVGTSpanElement","SVGTests","SVGTextContentElement","SVGTextElement","SVGTextPathElement","SVGTextPositioningElement","SVGTitleElement","SVGTransform","SVGTransformList","SVGURIReference","SVGUnitTypes","SVGUseElement","SVGViewElement","SVGZoomAndPan","SVGZoomEvent","ScopedCredential","ScopedCredentialDescriptor","ScopedCredentialInfo","ScopedCredentialOptions","ScopedCredentialParameters","Screen","ScreenEventMap","ScriptNotifyEvent","ScriptProcessorNode","ScriptProcessorNodeEventMap","ScrollBehavior","ScrollIntoViewOptions","ScrollLogicalPosition","ScrollOptions","ScrollRestoration","ScrollToOptions","Selection","ServiceWorker","ServiceWorkerContainer","ServiceWorkerContainerEventMap","ServiceWorkerEventMap","ServiceWorkerMessageEvent","ServiceWorkerMessageEventInit","ServiceWorkerRegistration","ServiceWorkerRegistrationEventMap","Set","SetConstructor","ShadowRoot","ShadowRootInit","SlowBuffer","SourceBuffer","SourceBufferList","SpeechSynthesis","SpeechSynthesisEvent","SpeechSynthesisEventInit","SpeechSynthesisEventMap","SpeechSynthesisUtterance","SpeechSynthesisUtteranceEventMap","SpeechSynthesisVoice","StereoPannerNode","Storage","StorageEvent","StorageEventInit","StoreExceptionsInformation","StoreSiteSpecificExceptionsInformation","String","StringConstructor","StyleMedia","StyleSheet","StyleSheetList","StyleSheetPageList","SubtleCrypto","Symbol","SymbolConstructor","SyncManager","SyntaxError","SyntaxErrorConstructor","TemplateStringsArray","Text","TextEvent","TextMetrics","TextStreamBase","TextStreamReader","TextStreamWriter","TextTrack","TextTrackCue","TextTrackCueEventMap","TextTrackCueList","TextTrackEventMap","TextTrackList","TextTrackListEventMap","Thenable","TimeRanges","Touch","TouchEvent","TouchList","TrackEvent","TrackEventInit","TransitionEvent","TransitionEventInit","TreeWalker","TypeError","TypeErrorConstructor","TypedPropertyDescriptor","UIEvent","UIEventInit","URIError","URIErrorConstructor","URL","URLSearchParams","USVString","Uint16Array","Uint16ArrayConstructor","Uint32Array","Uint32ArrayConstructor","Uint8Array","Uint8ArrayConstructor","Uint8ClampedArray","Uint8ClampedArrayConstructor","UnviewableContentIdentifiedEvent","VBArray","VBArrayConstructor","ValidityState","VarDate","VideoPlaybackQuality","VideoTrack","VideoTrackList","VideoTrackListEventMap","VoidFunction","WEBGL_compressed_texture_s3tc","WEBGL_debug_renderer_info","WEBGL_depth_texture","WScript","WaveShaperNode","WeakMap","WeakMapConstructor","WeakSet","WeakSetConstructor","WebAuthentication","WebAuthnAssertion","WebAuthnExtensions","WebGLActiveInfo","WebGLBuffer","WebGLContextAttributes","WebGLContextEvent","WebGLContextEventInit","WebGLFramebuffer","WebGLObject","WebGLProgram","WebGLRenderbuffer","WebGLRenderingContext","WebGLShader","WebGLShaderPrecisionFormat","WebGLTexture","WebGLUniformLocation","WebKitCSSMatrix","WebKitDirectoryEntry","WebKitDirectoryReader","WebKitEntriesCallback","WebKitEntry","WebKitErrorCallback","WebKitFileCallback","WebKitFileEntry","WebKitFileSystem","WebKitPoint","WebSocket","WebSocketEventMap","WheelEvent","WheelEventInit","Window","WindowBase64","WindowConsole","WindowEventMap","WindowLocalStorage","WindowSessionStorage","WindowTimers","WindowTimersExtension","Worker","WorkerEventMap","WritableStream","XMLDocument","XMLHttpRequest","XMLHttpRequestEventMap","XMLHttpRequestEventTarget","XMLHttpRequestEventTargetEventMap","XMLHttpRequestUpload","XMLSerializer","XPathEvaluator","XPathExpression","XPathNSResolver","XPathResult","XSLTProcessor","_","__dirname","__filename","a","abstract","addEventListener","alert","any","applicationCache","as","async","atob","await","b","blur","boolean","break","btoa","caches","cancelAnimationFrame","captureEvents","case","catch","class","clearImmediate","clearInterval","clearTimeout","clientInformation","close","closed","confirm","console","const","constructor","continue","count","crypto","customElements","dddd","debugger","declare","decodeURI","decodeURIComponent","default","defaultStatus","delete","departFocus","devicePixelRatio","dispatchEvent","do","doIt","doNotTrack","doUpdateSnippet","document","element","else","encodeURI","encodeURIComponent","enum","eval","event","export","exports","extends","external","false","fetch","finally","findSnippetById","focus","foo","foon","fooo","for","frameElement","frames","from","function","fuzzy_match","fuzzy_match_simple","get","getComputedStyle","getMatchedCSSRules","getSelection","global","global","history","if","implements","import","importScripts","in","indexedDB","innerHeight","innerWidth","instanceof","interface","is","isFinite","isNaN","isSecureContext","jQuery","keyof","length","let","localStorage","location","locationbar","matchMedia","menubar","module","module","more","moveBy","moveTo","msContentScript","msCredentials","msWriteProfilerMark","name","namespace","navigator","never","new","null","number","object","of","offscreenBuffering","onabort","onafterprint","onbeforeprint","onbeforeunload","onblur","oncanplay","oncanplaythrough","onchange","onclick","oncompassneedscalibration","oncontextmenu","ondblclick","ondevicelight","ondevicemotion","ondeviceorientation","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","onhashchange","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmessage","onmousedown","onmouseenter","onmouseleave","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onmsgesturechange","onmsgesturedoubletap","onmsgestureend","onmsgesturehold","onmsgesturestart","onmsgesturetap","onmsinertiastart","onmspointercancel","onmspointerdown","onmspointerenter","onmspointerleave","onmspointermove","onmspointerout","onmspointerover","onmspointerup","onoffline","ononline","onorientationchange","onpagehide","onpageshow","onpause","onplay","onplaying","onpointercancel","onpointerdown","onpointerenter","onpointerleave","onpointermove","onpointerout","onpointerover","onpointerup","onpopstate","onprogress","onratechange","onreadystatechange","onreset","onresize","onscroll","onseeked","onseeking","onselect","onstalled","onstorage","onsubmit","onsuspend","ontimeupdate","ontouchcancel","ontouchend","ontouchmove","ontouchstart","onunload","onvolumechange","onwaiting","onwheel","open","opener","orientation","outerHeight","outerWidth","package","pageXOffset","pageYOffset","parent","parseFloat","parseInt","payloadtype","performance","personalbar","postMessage","print","private","process","prompt","protected","public","readonly","releaseEvents","removeEventListener","requestAnimationFrame","require","require","resizeBy","resizeTo","return","screen","screenLeft","screenTop","screenX","screenY","scroll","scrollBy","scrollTo","scrollX","scrollY","scrollbars","self","sessionStorage","set","setImmediate","setInterval","setTimeout","speechSynthesis","static","status","statusbar","stop","string","styleMedia","super","switch","symbol","this","throw","toString","toolbar","top","true","try","type","typedoc","typeof","undefined","undefined","updateSnippet","uuid","vSomething","var","void","webkitCancelAnimationFrame","webkitConvertPointFromNodeToPage","webkitConvertPointFromPageToNode","webkitRTCPeerConnection","webkitRequestAnimationFrame","while","window","with","yield"] -}; }); \ No newline at end of file +["AI_ClearCaptureImportanceBonus","AI_ClearImportance","AI_CreateObjective","AI_DebugAttackEncounterPositionScoringEnable","AI_DebugAttackEncounterPositionScoringIsEnabled","AI_DebugLuaEnable","AI_DebugLuaIsEnabled","AI_DebugRatingEnable","AI_DebugRatingIsEnabled","AI_DebugRenderAllTaskChildrenEnable","AI_DebugRenderAllTaskChildrenIsEnabled","AI_DebugSkirmishCaptureEnable","AI_DebugSkirmishCaptureIsEnabled","AI_DebugSkirmishCombatTargetEnable","AI_DebugSkirmishCombatTargetIsEnabled","AI_DebugSkirmishObjectiveEnable","AI_DebugSkirmishObjectiveIsEnabled","AI_DisableAllEconomyOverrides","AI_Enable","AI_EnableAll","AI_EnableEconomyOverride","AI_GetDifficulty","AI_GetPersonality","AI_GetPersonalityLuaFileName","AI_IsAIPlayer","AI_IsEnabled","AI_LockEntity","AI_LockSquad","AI_LockSquads","AI_RestoreDefaultPersonalitySettings","AI_SetCaptureImportanceBonus","AI_SetDifficulty","AI_SetImportance","AI_SetPersonality","AI_UnlockAll","AI_UnlockEntity","AI_UnlockSquad","AI_UnlockSquads","AI_UpdateStatics","AIAbilityObjective_AbilityGuidance_SetAbilityPBG","AIObjective_Cancel","AIObjective_CombatGuidance_EnableCombatGarrison","AIObjective_CombatGuidance_EnableRetaliateAttacks","AIObjective_CombatGuidance_SetRetaliateAttackTargetAreaRadius","AIObjective_DefenseGuidance_AddFacingPosition","AIObjective_DefenseGuidance_EnableIdleGarrison","AIObjective_DefenseGuidance_ResetFacingPositions","AIObjective_EngagementGuidance_EnableAggressiveEngagementMove","AIObjective_EngagementGuidance_SetAllowReturnToPreviousStages","AIObjective_EngagementGuidance_SetCoordinatedSetup","AIObjective_EngagementGuidance_SetMaxEngagementTime","AIObjective_EngagementGuidance_SetMaxIdleTime","AIObjective_FallbackGuidance_EnableRetreatOnPinned","AIObjective_FallbackGuidance_EnableRetreatOnSuppression","AIObjective_FallbackGuidance_SetEntitiesRemainingThreshold","AIObjective_FallbackGuidance_SetFallbackCapacityPercentage","AIObjective_FallbackGuidance_SetFallbackCombatRatingPercentage","AIObjective_FallbackGuidance_SetFallbackSquadHealthPercentage","AIObjective_FallbackGuidance_SetFallbackVehicleHealthPercentage","AIObjective_FallbackGuidance_SetGlobalFallbackPercentage","AIObjective_FallbackGuidance_SetGlobalFallbackRetreat","AIObjective_FallbackGuidance_SetRetreatCapacityPercentage","AIObjective_FallbackGuidance_SetRetreatCombatRatingPercentage","AIObjective_FallbackGuidance_SetRetreatHealthPercentage","AIObjective_FallbackGuidance_SetTargetPosition","AIObjective_IsValid","AIObjective_MoveGuidance_EnableAggressiveMove","AIObjective_MoveGuidance_ResetPathingLengthFactor","AIObjective_MoveGuidance_ResetSafePathingWeight","AIObjective_MoveGuidance_SetPathingLengthFactor","AIObjective_MoveGuidance_SetSafePathingWeight","AIObjective_MoveGuidance_SetSquadCoherenceRadius","AIObjective_Notify_ClearCallbacks","AIObjective_Notify_SetPlayerEventObjectiveID","AIObjective_ResourceGuidance_ClearSquads","AIObjective_ResourceGuidance_SquadGroup","AIObjective_SetName","AIObjective_TacticFilter_DisableAbility","AIObjective_TacticFilter_DisableAbilityForSquadGroup","AIObjective_TacticFilter_EnableCloseGround","AIObjective_TacticFilter_Reset","AIObjective_TacticFilter_ResetAbilityGuidance","AIObjective_TacticFilter_ResetPriority","AIObjective_TacticFilter_ResetTacticGuidance","AIObjective_TacticFilter_ResetTargetGuidance","AIObjective_TacticFilter_SetAbilityGuidance","AIObjective_TacticFilter_SetDefaultAbilityGuidance","AIObjective_TacticFilter_SetDefaultTacticGuidance","AIObjective_TacticFilter_SetDefaultTargetGuidance","AIObjective_TacticFilter_SetPriority","AIObjective_TacticFilter_SetPriorityForSquadGroup","AIObjective_TacticFilter_SetTacticGuidance","AIObjective_TacticFilter_SetTargetPolicy","AIObjective_TargetGuidance_SetTargetArea","AIObjective_TargetGuidance_SetTargetEntity","AIObjective_TargetGuidance_SetTargetLeash","AIObjective_TargetGuidance_SetTargetPathByName","AIObjective_TargetGuidance_SetTargetPathWander","AIObjective_TargetGuidance_SetTargetPosition","AIObjective_TargetGuidance_SetTargetSquad","BeginnerHint_AddOpportunity","BeginnerHint_RemoveAllOpportunities","BeginnerHint_RemoveOpportunity","BP_GetAbilityBlueprint","BP_GetCamouflageStanceBlueprint","BP_GetCriticalBlueprint","BP_GetEntityBlueprint","BP_GetID","BP_GetMoveTypeBlueprint","BP_GetName","BP_GetPropertyBagGroupCount","BP_GetPropertyBagGroupPathName","BP_GetSlotItemBlueprint","BP_GetSquadBlueprint","BP_GetUpgradeBlueprint","BP_GetWeaponBlueprint","EBP_Exists","SBP_Exists","Camera_CyclePositions","Camera_Follow","Camera_MoveTo","Camera_MoveToIfClose","Camera_SetDefault","Cmd_AbandonTeamWeapon","Cmd_Ability","Cmd_AttachSquads","Cmd_Attack","Cmd_AttackMove","Cmd_AttackMoveThenCapture","Cmd_CaptureTeamWeapon","Cmd_Construct","Cmd_CriticalHit","Cmd_DetonateDemolitions","Cmd_EjectOccupants","Cmd_Garrison","Cmd_InstantReinforceUnit","Cmd_InstantReinforceUnitPos","Cmd_InstantSetupTeamWeapon","Cmd_InstantUpgrade","Cmd_Move","Cmd_MoveAwayFromPos","Cmd_MoveToAndDespawn","Cmd_MoveToClosestMarker","Cmd_MoveToThenCapture","Cmd_RecrewVehicle","Cmd_ReinforceUnit","Cmd_ReinforceUnitPos","Cmd_Retreat","Cmd_RevertOccupiedBuilding","Cmd_SetDemolitions","Cmd_SquadCamouflageStance","Cmd_SquadPath","Cmd_SquadPatrolMarker","Cmd_StaggeredRetreat","Cmd_Stop","Cmd_Surrender","Cmd_UngarrisonSquad","Cmd_Upgrade","Command_Entity","Command_EntityAbility","Command_EntityBuildSquad","Command_EntityEntity","Command_EntityExt","Command_EntityPos","Command_EntityPosAbility","Command_EntityPosDirAbility","Command_EntityPosSquad","Command_EntitySquad","Command_EntityTargetEntityAbility","Command_EntityTargetSquadAbility","Command_EntityUpgrade","Command_Player","Command_PlayerAbility","Command_PlayerEntity","Command_PlayerEntityCriticalHit","Command_PlayerExt","Command_PlayerPos","Command_PlayerPosAbility","Command_PlayerPosDirAbility","Command_PlayerPosExt","Command_PlayerSquadConstructBuilding","Command_PlayerSquadConstructFence","Command_PlayerSquadConstructField","Command_PlayerSquadCriticalHit","Command_PlayerUpgrade","Command_Squad","Command_SquadAbility","Command_SquadAttackMovePos","Command_SquadDoCustomPlan","Command_SquadDoCustomPlanTarget","Command_SquadEntity","Command_SquadEntityAbility","Command_SquadEntityAttack","Command_SquadEntityBool","Command_SquadEntityExt","Command_SquadEntityLoad","Command_SquadExt","Command_SquadMovePos","Command_SquadMovePosFacing","Command_SquadPos","Command_SquadPosAbility","Command_SquadPosExt","Command_SquadPositionAttack","Command_SquadSquad","Command_SquadSquadAbility","Command_SquadSquadAttack","Command_SquadSquadExt","Command_SquadSquadLoad","Command_SquadUpgrade","AutoCinematic","AutoReinforce_AddSGroup","AutoReinforce_RemoveAll","AutoReinforce_RemoveSGroup","AutoRetreat_AddSGroup","AutoRetreat_RemoveAll","AutoRetreat_RemoveSGroup","BridgeTerritory_Add","Ceasefire_AddSGroup","Ceasefire_RemoveSGroup","FireTargettingArtillery","Game_DefaultGameRestore","Game_GetGameRestoreCallbackExists","Game_RemoveGameRestoreCallback","Game_SetGameRestoreCallback","Resources_Disable","Resources_Enable","ShootTheSky_AddSyncWeapon","ShootTheSky_RemoveAll","ShootTheSky_RemoveSyncWeapon","SmokeEntrance_Do","Table_Contains","Table_Copy","Table_GetRandomItem","TeamWeapon_AddGroup","TeamWeapon_RemoveDirections","TeamWeapon_RemoveGroup","EGroup_Add","EGroup_AddEGroup","EGroup_CanSeeEGroup","EGroup_CanSeeSGroup","EGroup_Clear","EGroup_Compare","EGroup_ContainsBlueprints","EGroup_ContainsEGroup","EGroup_ContainsEntity","EGroup_Count","EGroup_CountAlive","EGroup_CountDeSpawned","EGroup_CountSpawned","EGroup_Create","EGroup_CreateIfNotFound","EGroup_CreateKickerMessage","EGroup_DeSpawn","EGroup_Destroy","EGroup_DestroyAllEntities","EGroup_Duplicate","EGroup_EnableMinimapIndicator","EGroup_EnableUIDecorator","EGroup_Exists","EGroup_Filter","EGroup_FilterUnderConstruction","EGroup_ForEach","EGroup_ForEachAllOrAny","EGroup_ForEachAllOrAnyEx","EGroup_ForEachEx","EGroup_FromName","EGroup_GetAvgHealth","EGroup_GetDeSpawnedEntityAt","EGroup_GetInvulnerable","EGroup_GetLastAttacker","EGroup_GetName","EGroup_GetOffsetPosition","EGroup_GetPosition","EGroup_GetRandomSpawnedEntity","EGroup_GetSequence","EGroup_GetSpawnedEntityAt","EGroup_GetSpawnedEntityFilter","EGroup_GetSpread","EGroup_GetSquadsHeld","EGroup_HasUpgrade","EGroup_Hide","EGroup_InstantCaptureStrategicPoint","EGroup_InstantRevertOccupiedBuilding","EGroup_Intersection","EGroup_IsBurning","EGroup_IsCapturedByPlayer","EGroup_IsCapturedByTeam","EGroup_IsDoingAttack","EGroup_IsEmpty","EGroup_IsHoldingAny","EGroup_IsInCover","EGroup_IsMoving","EGroup_IsOnScreen","EGroup_IsProducingSquads","EGroup_IsSpawned","EGroup_IsUnderAttack","EGroup_IsUnderAttackByPlayer","EGroup_IsUnderAttackFromDirection","EGroup_IsUsingAbility","EGroup_Kill","EGroup_NotifyOnPlayerDemolition","EGroup_Remove","EGroup_RemoveDemolitions","EGroup_RemoveGroup","EGroup_RemoveUpgrade","EGroup_ReSpawn","EGroup_SetAnimatorAction","EGroup_SetAnimatorEvent","EGroup_SetAnimatorState","EGroup_SetAnimatorVariable","EGroup_SetAutoTargetting","EGroup_SetAvgHealth","EGroup_SetCrushable","EGroup_SetDemolitions","EGroup_SetHealthMinCap","EGroup_SetInvulnerable","EGroup_SetPlayerOwner","EGroup_SetRallyPoint","EGroup_SetRecrewable","EGroup_SetSelectable","EGroup_SetSharedProductionQueue","EGroup_SetStrategicPointNeutral","EGroup_SetWorldOwned","EGroup_Single","SGroup_HasEntityUpgrade","Ai\\:GetEncountersBySGroup","Ai\\:GetEncountersBySquad","AI_DisableAllEncounters","AI_EnableAllEncounters","AI_GetActiveEncounters","AI_GetNumEncounters","AI_IsMatchingDifficulty","AI_OverrideDifficulty","AI_RemoveAllEncounters","AI_SetDebugLevel","AI_SetStaggeredSpawnDelay","AI_ToggleDebugData","AI_ToggleDebugPrint","AIAbilityGoal_AdjustDefaultGoalData","AIAbilityGoal_SetDefaultGoalData","AIAbilityGoal_SetModifyGoalData","AIAbilityGoal_SetOverrideGoalData","AIAttackGoal_AdjustDefaultGoalData","AIAttackGoal_SetDefaultGoalData","AIAttackGoal_SetModifyGoalData","AIAttackGoal_SetOverrideGoalData","AIBaseGoal_AdjustDefaultGoalData","AIBaseGoal_SetDefaultGoalData","AIBaseGoal_SetModifyGoalData","AIBaseGoal_SetOverrideGoalData","AIDefendGoal_AdjustDefaultGoalData","AIDefendGoal_SetDefaultGoalData","AIDefendGoal_SetModifyGoalData","AIDefendGoal_SetOverrideGoalData","AIMoveGoal_AdjustDefaultGoalData","AIMoveGoal_SetDefaultGoalData","AIMoveGoal_SetModifyGoalData","AIMoveGoal_SetOverrideGoalData","Encounter\\:AddSgroup","Encounter\\:ClearGoal","Encounter\\:ConvertSgroup","Encounter\\:Create","Encounter\\:CreateAbility","Encounter\\:CreateAttack","Encounter\\:CreateBasic","Encounter\\:CreateDefend","Encounter\\:CreateMove","Encounter\\:CreatePatrol","Encounter\\:Disable","Encounter\\:Enable","Encounter\\:GetGoalData","Encounter\\:GetSgroup","Encounter\\:RemoveOnDeath","Encounter\\:RestartGoal","Encounter\\:SetGoal","Encounter\\:SetGoalOnSuccess","Encounter\\:SetOnDeath","Encounter\\:Spawn","Encounter\\:UpdateGoal","MergeClone","Entity_ApplyCritical","Entity_BuildingPanelInfo","Entity_CanAttackNow","Entity_CancelProductionQueueItem","Entity_CanLoadSquad","Entity_CanLoadSquadAndAttackCurrentTarget","Entity_CanSeeEntity","Entity_CanSeeSquad","Entity_ClearPostureSuggestion","Entity_ClearTagDebug","Entity_CompleteUpgrade","Entity_Create","Entity_CreateENV","Entity_DeSpawn","Entity_Destroy","Entity_DisableBuildingDeath","Entity_DoBuildingDamageRay","Entity_EnableAttention","Entity_EnableProductionQueue","Entity_EnableStrategicPoint","Entity_ForceConstruct","Entity_FromWorldID","Entity_GetActiveCommand","Entity_GetBlueprint","Entity_GetBuildingProgress","Entity_GetCoverValue","Entity_GetGameID","Entity_GetHeading","Entity_GetHealth","Entity_GetHealthMax","Entity_GetHealthPercentage","Entity_GetInvulnerable","Entity_GetInvulnerableMinCap","Entity_GetInvulnerableToCritical","Entity_GetLastAttacker","Entity_GetLastAttackers","Entity_GetMaxCaptureCrewSize","Entity_GetOffsetPosition","Entity_GetPlayerOwner","Entity_GetPosition","Entity_GetProductionQueueItem","Entity_GetProductionQueueItemType","Entity_GetProductionQueueSize","Entity_GetResourceType","Entity_GetSightInnerHeight","Entity_GetSightInnerRadius","Entity_GetSightOuterHeight","Entity_GetSightOuterRadius","Entity_GetSquad","Entity_GetSquadsHeld","Entity_GetTotalPanelCount","Entity_GetUndestroyedPanelCount","Entity_GetWeaponBlueprint","Entity_GetWeaponHardpointCount","Entity_HasAnyCritical","Entity_HasCritical","Entity_HasProductionQueue","Entity_HasUpgrade","Entity_InstantCaptureStrategicPoint","Entity_InstantRevertOccupiedBuilding","Entity_IsAlive","Entity_IsAttacking","Entity_IsBuilding","Entity_IsBurning","Entity_IsCamouflaged","Entity_IsCapturableBuilding","Entity_IsCasualty","Entity_IsCuttable","Entity_IsDemolitionReady","Entity_IsEBPBuilding","Entity_IsEBPObjCover","Entity_IsHardpointActive","Entity_IsHoldingAny","Entity_IsInCover","Entity_IsMoving","Entity_IsOfType","Entity_IsPartOfSquad","Entity_IsPlane","Entity_IsSlotItem","Entity_IsSoldier","Entity_IsSpawned","Entity_IsStartingPosition","Entity_IsStrategicPoint","Entity_IsStrategicPointCapturedBy","Entity_IsSyncWeapon","Entity_IsUnderAttack","Entity_IsUnderAttackByPlayer","Entity_IsUnderAttackFromDirection","Entity_IsValid","Entity_IsVaultable","Entity_IsVehicle","Entity_IsVictoryPoint","Entity_Kill","Entity_NotifyOnPlayerDemolition","Entity_RemoveBoobyTraps","Entity_RemoveCritical","Entity_RemoveDemolitions","Entity_RemoveUpgrade","Entity_SetAnimatorAction","Entity_SetAnimatorActionParameter","Entity_SetAnimatorEvent","Entity_SetAnimatorState","Entity_SetAnimatorVariable","Entity_SetBuildingVisualFireState","Entity_SetCrushable","Entity_SetCrushMode","Entity_SetDemolitions","Entity_SetEnableCasualty","Entity_SetHeading","Entity_SetHealth","Entity_SetInvulnerable","Entity_SetInvulnerableMinCap","Entity_SetInvulnerableToCritical","Entity_SetOnFire","Entity_SetPlayerOwner","Entity_SetPosition","Entity_SetProjectileCanExplode","Entity_SetRecrewable","Entity_SetSharedProductionQueue","Entity_SetStrategicPointNeutral","Entity_SetWorldOwned","Entity_SimHide","Entity_Spawn","Entity_StopAbility","Entity_SuggestPosture","Entity_SupportsDemolition","Entity_TagDebug","Entity_VisHide","Misc_DoWeaponHitEffectOnPosition","Misc_GetTerrainHeight","Misc_ToggleEntities","ModMisc_MakeCasualtyAction","ModMisc_MakeWreckAction","ModMisc_OOCAction","UI_EnableEntityDecorator","UI_EnableEntityMinimapIndicator","UI_EnableEntitySelectionVisuals","UI_EnableSquadDecorator","UI_EnableSquadMinimapIndicator","UI_GetAbilityIconName","Event_CreateAND","Event_CreateOR","Event_ElementOnScreen","Event_EncounterIsDead","Event_Exists","Event_GroupBurning","Event_GroupIsDead","Event_GroupIsNotPinned","Event_GroupIsNotSuppressed","Event_GroupIsPinned","Event_GroupIsSuppressed","Event_GroupLeftAlive","Event_IsDoingAttack","Event_IsEngaged","Event_IsHoldingAny","Event_IsInHold","Event_IsSelected","Event_IsUnderAttack","Event_NarrativeEventsNotRunning","Event_NarrativeEventsRunning","Event_OnHealth","Event_PlayerBuildingCount","Event_PlayerCanNotSeeElement","Event_PlayerCanSeeElement","Event_PlayerDoesntOwnTerritory","Event_PlayerOwnsElement","Event_PlayerOwnsTerritory","Event_PlayerResourceLevel","Event_PlayerSquadCount","Event_Proximity","Event_Remove","Event_RemoveAll","Event_TeamBuildingCount","Event_TeamCanNotSeeElement","Event_TeamCanSeeElement","Event_TeamDoesntOwnTerritory","Event_TeamOwnsElement","Event_TeamOwnsTerritory","Event_TeamResourceLevel","Event_TeamSquadCount","Event_Timer","Event_ToggleDebug","Event_View","EventHandler_AssignEncounterGoal","EventHandler_ObjectiveComplete","EventHandler_ObjectiveStart","EventHandler_RemoveHint","EventHandler_RemoveMinimapBlip","EventHandler_RemoveObjectiveUI","EventHandler_Retreat","EventHandler_StaggeredRetreat","EventHandler_StartIntel","EventHandler_StartNislet","EventHandler_StopFlashing","FOW_PlayerExploreAll","FOW_PlayerRevealAll","FOW_PlayerRevealArea","FOW_PlayerUnExploreAll","FOW_PlayerUnRevealAll","FOW_PlayerUnRevealArea","FOW_RevealAll","FOW_RevealArea","FOW_RevealEGroup","FOW_RevealEGroupOnly","FOW_RevealEntity","FOW_RevealMarker","FOW_RevealSGroup","FOW_RevealSGroupOnly","FOW_RevealSquad","FOW_RevealTerritory","FOW_UnRevealAll","FOW_UnRevealArea","FOW_UnRevealMarker","FOW_UnRevealTerritory","EGroup_CreateTable","EGroup_GetWBTable","Marker_GetNonSequentialTable","Marker_GetTable","SGroup_CreateTable","SGroup_GetWBTable","Marker_DoesNumberAttributeExist","Marker_DoesStringAttributeExist","Marker_Exists","Marker_FromName","Marker_GetDirection","Marker_GetName","Marker_GetNumberAttribute","Marker_GetPosition","Marker_GetProximityRadius","Marker_GetProximityType","Marker_GetSequence","Marker_GetStringAttribute","Marker_GetType","Marker_InProximity","Modifier_IsEnabledOnEGroup","Modifier_Remove","Modifier_RemoveAllFromEGroup","Modifier_RemoveAllFromSGroup","Modify_AbilityDelayTime","Modify_AbilityDurationTime","Modify_AbilityManpowerCost","Modify_AbilityMaxCastRange","Modify_AbilityMinCastRange","Modify_AbilityMunitionsCost","Modify_AbilityRechargeTime","Modify_Armor","Modify_CaptureTime","Modify_DisableHold","Modify_Enable_ParadropReinforcements","Modify_EntityBuildTime","Modify_EntityCost","Modify_PlayerExperienceReceived","Modify_PlayerProductionRate","Modify_PlayerResourceCap","Modify_PlayerResourceGift","Modify_PlayerResourceRate","Modify_PlayerSightRadius","Modify_ProductionRate","Modify_ProjectileDelayTime","Modify_ReceivedAccuracy","Modify_ReceivedDamage","Modify_ReceivedSuppression","Modify_SetUpgradeCost","Modify_SightRadius","Modify_SquadAvailability","Modify_SquadCaptureRate","Modify_SquadTypeSightRadius","Modify_TargetPriority","Modify_TeamWeapon","Modify_TerritoryRadius","Modify_UnitSpeed","Modify_UnitVeterancyValue","Modify_UpgradeBuildTime","Modify_Upkeep","Modify_VehicleRepairRate","Modify_VehicleRotationSpeed","Modify_VehicleTurretRotationSpeed","Modify_Vulnerability","Modify_WeaponAccuracy","Modify_WeaponBurstLength","Modify_WeaponBurstRateOfFire","Modify_WeaponCooldown","Modify_WeaponDamage","Modify_WeaponEnabled","Modify_WeaponPenetration","Modify_WeaponRange","Modify_WeaponReload","Modify_WeaponScatter","Modify_WeaponSuppression","MP_BlizzardInit","Objective_AddPing","Objective_AddUIElements","Objective_AreAllPrimaryObjectivesComplete","Objective_Complete","Objective_Fail","Objective_GetCounter","Objective_GetTimerSeconds","Objective_IncreaseCounter","Objective_IsComplete","Objective_IsCounterSet","Objective_IsFailed","Objective_IsStarted","Objective_IsTimerSet","Objective_IsVisible","Objective_PauseTimer","Objective_Register","Objective_RemovePing","Objective_RemoveUIElements","Objective_ResumeTimer","Objective_SetAlwaysShowDetails","Objective_SetCounter","Objective_Show","Objective_Start","Objective_StartTimer","Objective_StopCounter","Objective_StopTimer","Objective_TogglePings","Objective_UpdateText","Cmd_StopSquadsOnly","OpGameSetup","OpNPC_AddSupportGroup","OpNPC_AddSyncWpnGroup","OpNPC_AddTeamWpnGroup","OpNPC_IsGroupActive","OpNPC_Name","OpNPC_RemoveGroup","OpNPC_RetreatGroup","OpNPC_SetGroupActive","OpPlayer_Action","OpUtil_AddModifier","OpUtil_AddResourcesToTeam","OpUtil_AssignSquadSameTypeControlGroup","OpUtil_AssignSquadUnusedControlGroup","OpUtil_ClearPlayZone","OpUtil_EgroupIsCapturedByTeam","OpUtil_EnemyEGroupArrowManager","OpUtil_FindNearestCapturePoint","OpUtil_InvulnerableAdd","OpUtil_InvulnerableRemove","OpUtil_LogSyncWpn","OpUtil_ReturnEnemyNPC","OpUtil_ReturnHumanPlayer","OpUtil_ReturnNPCPlayer","OpUtil_ReturnRace","OpUtil_ReturnTeam","OpUtil_SetPlayZone","OpUtil_TeamOwnsEntity","OpVP_AddPenaltyGroup","OpVP_Name","OpVP_RegisterCaptureablePoints","OpVP_RegisterPointDefense","OpVP_RemoveGroup","UI_PopUpMessage","Util_ProductionRestriction","Util_TutorialIntel","Player_AddAbility","Player_AddAbilityLockoutZone","Player_AddResource","Player_AddSquadsToSGroup","Player_AddUnspentCommandPoints","Player_AreSquadsNearMarker","Player_CanCastAbilityOnEntity","Player_CanCastAbilityOnPlayer","Player_CanCastAbilityOnPosition","Player_CanCastAbilityOnSquad","Player_CanSeeEGroup","Player_CanSeeEntity","Player_CanSeePosition","Player_CanSeeSGroup","Player_CanSeeSquad","Player_ClearArea","Player_ClearAvailabilities","Player_ClearPopCapOverride","Player_CompleteUpgrade","Player_DoParadrop","Player_FindFirstEnemyPlayer","Player_FromId","Player_GetAIType","Player_GetAll","Player_GetAllEntitiesNearMarker","Player_GetAllSquadsNearMarker","Player_GetBuildingID","Player_GetBuildingsCount","Player_GetBuildingsCountExcept","Player_GetBuildingsCountOnly","Player_GetCurrentPopulation","Player_GetDisplayName","Player_GetEntities","Player_GetEntitiesFromType","Player_GetEntityConcentration","Player_GetEntityCount","Player_GetEntityName","Player_GetID","Player_GetMaxPopulation","Player_GetNumStrategicPoints","Player_GetNumVictoryPoints","Player_GetPopulationPercentage","Player_GetRace","Player_GetRaceName","Player_GetRelationship","Player_GetResource","Player_GetResourceRate","Player_GetSquadConcentration","Player_GetSquadCount","Player_GetSquads","Player_GetStartingPosition","Player_GetStrategicPointCaptureProgress","Player_GetTeam","Player_GetUnitCount","Player_GetUpgradeCost","Player_HasAbility","Player_HasBuilding","Player_HasBuildingsExcept","Player_HasBuildingUnderConstruction","Player_HasCapturingSquadNearStrategicPoint","Player_HasLost","Player_HasMapEntryPosition","Player_HasUpgrade","Player_IsAlive","Player_IsAllied","Player_IsHuman","Player_NumUpgradeComplete","Player_OwnsEGroup","Player_OwnsEntity","Player_OwnsSGroup","Player_OwnsSquad","Player_RemoveAbilityLockoutZone","Player_RemoveUpgrade","Player_ResetResource","Player_RestrictAddOnList","Player_RestrictBuildingList","Player_RestrictResearchList","Player_SetAbilityAvailability","Player_SetAllCommandAvailabilityInternal","Player_SetCommandAvailability","Player_SetConstructionMenuAvailability","Player_SetDefaultSquadMoodMode","Player_SetEntityProductionAvailability","Player_SetHeatGainRate","Player_SetHeatLossRate","Player_SetMaxCapPopulation","Player_SetMaxPopulation","Player_SetPopCapOverride","Player_SetResource","Player_SetSquadProductionAvailability","Player_SetUpgradeAvailability","Player_SetUpgradeCost","Player_SpawnGlider","Player_StopAbility","Player_StopEarningActionPoints","Player_Triangulate","Actor_Clear","Actor_PlaySpeech","Actor_PlaySpeechWithoutPortrait","Actor_SetFromSGroup","Actor_SetFromSquad","Prox_AreEntitiesNearMarker","Prox_ArePlayerMembersNearMarker","Prox_ArePlayersNearMarker","Prox_AreSquadMembersNearMarker","Prox_AreSquadsNearMarker","Prox_AreTeamsNearMarker","Prox_EGroupEGroup","Prox_EGroupSGroup","Prox_EntitiesInProximityOfEntities","Prox_GetRandomPosition","Prox_MarkerEGroup","Prox_MarkerSGroup","Prox_PlayerEntitiesInProximityOfEntities","Prox_PlayerEntitiesInProximityOfPlayerSquads","Prox_PlayerEntitiesInProximityOfSquads","Prox_PlayerSquadsInProximityOfEntities","Prox_PlayerSquadsInProximityOfPlayerEntities","Prox_PlayerSquadsInProximityOfPlayerSquads","Prox_PlayerSquadsInProximityOfSquads","Prox_SGroupSGroup","Prox_SquadsInProximityOfEntities","Prox_SquadsInProximityOfSquads","Rule_Add","Rule_AddDelayedInterval","Rule_AddDelayedIntervalEx","Rule_AddEGroupEvent","Rule_AddEntityEvent","Rule_AddGlobalEvent","Rule_AddInterval","Rule_AddIntervalEx","Rule_AddOneShot","Rule_AddPlayerEvent","Rule_AddSGroupEvent","Rule_AddSquadEvent","Rule_ChangeInterval","Rule_Exists","Rule_Remove","Rule_RemoveAll","Rule_RemoveEGroupEvent","Rule_RemoveEntityEvent","Rule_RemoveGlobalEvent","Rule_RemoveIfExist","Rule_RemoveMe","Rule_RemovePlayerEvent","Rule_RemoveSGroupEvent","Rule_RemoveSquadEvent","Setup_Player","Cmd_StopSquadsExcept","Misc_IsEGroupOnScreen","Misc_IsSGroupOnScreen","SGroup_Add","SGroup_AddAbility","SGroup_AddGroup","SGroup_AddGroups","SGroup_AddLeaders","SGroup_AddSlotItemToDropOnDeath","SGroup_CanCastAbilityOnEntity","SGroup_CanCastAbilityOnPosition","SGroup_CanCastAbilityOnSquad","SGroup_CanInstantReinforceNow","SGroup_CanSeeSGroup","SGroup_Clear","SGroup_ClearPostureSuggestion","SGroup_Compare","SGroup_CompleteEntityUpgrade","SGroup_ContainsBlueprints","SGroup_ContainsSGroup","SGroup_ContainsSquad","SGroup_Count","SGroup_CountDeSpawned","SGroup_CountSpawned","SGroup_Create","SGroup_CreateIfNotFound","SGroup_CreateKickerMessage","SGroup_DeSpawn","SGroup_Destroy","SGroup_DestroyAllInMarker","SGroup_DestroyAllSquads","SGroup_DisableCombatPlans","SGroup_Duplicate","SGroup_EnableAttention","SGroup_EnableMinimapIndicator","SGroup_EnableSurprise","SGroup_EnableUIDecorator","SGroup_Exists","SGroup_FaceEachOther","SGroup_FaceMarker","SGroup_Filter","SGroup_FilterCount","SGroup_FilterThreat","SGroup_ForEach","SGroup_ForEachAllOrAny","SGroup_ForEachAllOrAnyEx","SGroup_ForEachEx","SGroup_FromName","SGroup_GetAvgHealth","SGroup_GetAvgLoadout","SGroup_GetDeSpawnedSquadAt","SGroup_GetGarrisonedBuildingEntity","SGroup_GetHoldEGroup","SGroup_GetHoldSGroup","SGroup_GetInvulnerable","SGroup_GetLastAttacker","SGroup_GetLoadedVehicleSquad","SGroup_GetName","SGroup_GetNumSlotItem","SGroup_GetOffsetPosition","SGroup_GetPosition","SGroup_GetRandomSpawnedSquad","SGroup_GetSequence","SGroup_GetSpawnedSquadAt","SGroup_GetSpread","SGroup_GetSquadsHeld","SGroup_GetSuppression","SGroup_GetVeterancyExperience","SGroup_GetVeterancyRank","SGroup_HasCritical","SGroup_HasLeader","SGroup_HasSquadBlueprint","SGroup_HasTeamWeapon","SGroup_HasUpgrade","SGroup_Hide","SGroup_IncreaseVeterancyExperience","SGroup_IncreaseVeterancyRank","SGroup_Intersection","SGroup_IsAlive","SGroup_IsAttackMoving","SGroup_IsCamouflaged","SGroup_IsCapturing","SGroup_IsConstructingBuilding","SGroup_IsDoingAbility","SGroup_IsDoingAttack","SGroup_IsDugIn","SGroup_IsEmpty","SGroup_IsFemale","SGroup_IsHoldingAny","SGroup_IsIdle","SGroup_IsInCover","SGroup_IsInfiltrated","SGroup_IsInHoldEntity","SGroup_IsInHoldSquad","SGroup_IsMoving","SGroup_IsOnScreen","SGroup_IsPinned","SGroup_IsReinforcing","SGroup_IsRetreating","SGroup_IsSettingDemolitions","SGroup_IsSuppressed","SGroup_IsUnderAttack","SGroup_IsUnderAttackByPlayer","SGroup_IsUnderAttackFromDirection","SGroup_IsUpgrading","SGroup_IsUsingAbility","SGroup_Kill","SGroup_Remove","SGroup_RemoveGroup","SGroup_RemoveUpgrade","SGroup_ReSpawn","SGroup_RestoreCombatPlans","SGroup_RewardActionPoints","SGroup_SetAnimatorState","SGroup_SetAutoTargetting","SGroup_SetAvgHealth","SGroup_SetAvgMorale","SGroup_SetCrushable","SGroup_SetInvulnerable","SGroup_SetInvulnerableToCritical","SGroup_SetMoodMode","SGroup_SetMoveType","SGroup_SetPlayerOwner","SGroup_SetRecrewable","SGroup_SetSelectable","SGroup_SetSharedProductionQueue","SGroup_SetSuppression","SGroup_SetTeamWeaponCapturable","SGroup_SetVeterancyDisplayVisibility","SGroup_SetWorldOwned","SGroup_Single","SGroup_SnapFaceEachOther","SGroup_SuggestPosture","SGroup_TotalMembersCount","SGroup_WarpToMarker","SGroup_WarpToPos","Util_Grab","SGroup_FacePosition","SGroup_SnapFacePosition","Squad_AddAbility","Squad_AddSlotItemToDropOnDeath","Squad_CanCaptureStrategicPoint","Squad_CanCaptureTeamWeapon","Squad_CanCastAbilityOnEGroup","Squad_CanCastAbilityOnEntity","Squad_CanCastAbilityOnPosition","Squad_CanCastAbilityOnSGroup","Squad_CanCastAbilityOnSquad","Squad_CancelProductionQueueItem","Squad_CanHold","Squad_CanInstantReinforceNow","Squad_CanLoadSquad","Squad_CanPickupSlotItem","Squad_CanRecrew","Squad_CanSeeEntity","Squad_CanSeeSquad","Squad_ClearPostureSuggestion","Squad_CompleteUpgrade","Squad_Count","Squad_CreateAndSpawnToward","Squad_DeSpawn","Squad_Destroy","Squad_EnableProductionQueue","Squad_EnableSurprise","Squad_EntityAt","Squad_FacePosition","Squad_FaceSquad","Squad_FindCover","Squad_FindCoverCompareCurrent","Squad_FromWorldID","Squad_GetActiveCommand","Squad_GetAttackPlan","Squad_GetAttackTargets","Squad_GetBlueprint","Squad_GetDestination","Squad_GetGameID","Squad_GetHeading","Squad_GetHealth","Squad_GetHealthMax","Squad_GetHealthPercentage","Squad_GetHoldEntity","Squad_GetHoldSquad","Squad_GetInvulnerable","Squad_GetInvulnerableEntityCount","Squad_GetInvulnerableMinCap","Squad_GetLastAttacker","Squad_GetLastAttackers","Squad_GetLastEntityAttacker","Squad_GetMax","Squad_GetNumSlotItem","Squad_GetOffsetPosition","Squad_GetPinnedPlan","Squad_GetPlayerOwner","Squad_GetPosition","Squad_GetPositionDeSpawned","Squad_GetProductionQueueItem","Squad_GetProductionQueueItemType","Squad_GetProductionQueueSize","Squad_GetReactionPlan","Squad_GetRetaliationPlan","Squad_GetSlotItemAt","Squad_GetSlotItemCount","Squad_GetSlotItemsTable","Squad_GetSquadsHeld","Squad_GetSuppression","Squad_GetVeterancyExperience","Squad_GetVeterancyRank","Squad_GiveSlotItem","Squad_GiveSlotItemsFromTable","Squad_HasActiveCommand","Squad_HasAnyCritical","Squad_HasCritical","Squad_HasDestination","Squad_HasProductionQueue","Squad_HasSlotItem","Squad_HasTeamWeapon","Squad_HasUpgrade","Squad_IncreaseVeterancyExperience","Squad_IncreaseVeterancyRank","Squad_InstantSetupTeamWeapon","Squad_IsAttacking","Squad_IsCamouflaged","Squad_IsDoingAbility","Squad_IsFemale","Squad_IsHoldingAny","Squad_IsInCover","Squad_IsInHoldEntity","Squad_IsInHoldSquad","Squad_IsMoving","Squad_IsPinned","Squad_IsReinforcing","Squad_IsRetreating","Squad_IsSuppressed","Squad_IsUnderAttack","Squad_IsUnderAttackByPlayer","Squad_IsUnderAttackFromDirection","Squad_IsUpgrading","Squad_IsUpgradingAny","Squad_IsValid","Squad_Kill","Squad_RemoveAbility","Squad_RemoveUpgrade","Squad_RewardActionPoints","Squad_SetAnimatorState","Squad_SetAttackPlan","Squad_SetHealth","Squad_SetInvulnerable","Squad_SetInvulnerableEntityCount","Squad_SetInvulnerableMinCap","Squad_SetInvulnerableToCritical","Squad_SetMoodMode","Squad_SetMoveType","Squad_SetPinnedPlan","Squad_SetPlayerOwner","Squad_SetPosition","Squad_SetReactionPlan","Squad_SetRecrewable","Squad_SetRetaliationPlan","Squad_SetSharedProductionQueue","Squad_SetSuppression","Squad_SetVeterancyDisplayVisibility","Squad_SetWorldOwned","Squad_Spawn","Squad_SpawnToward","Squad_Split","Squad_StopAbility","Squad_SuggestPosture","Squad_WarpToPos","Stats_BuildingsLost","Stats_InfantryLost","Stats_KillsTotal","Stats_PlayerAt","Stats_PlayerCount","Stats_ResGathered","Stats_ResSpent","Stats_SoldiersKilled","Stats_StructuresKilled","Stats_TeamTally","Stats_TotalDuration","Stats_TotalSquadsLost","Stats_UnitSoldierKills","Stats_UnitStructureKills","Stats_UnitTotalKills","Stats_UnitVehicleKills","Stats_VehiclesKilled","Stats_VehiclesLost","Stinger_AddEvent","Stinger_AddFunction","Stinger_Remove","Team_AddResource","Team_AddSquadsToSGroup","Team_AreSquadsNearMarker","Team_CanSee","Team_ClearArea","Team_DefineAllies","Team_DefineEnemies","Team_FindByRace","Team_ForEachAllOrAny","Team_GetAll","Team_GetAllEntitiesNearMarker","Team_GetAllSquadsNearMarker","Team_GetBuildingID","Team_GetBuildingsCount","Team_GetBuildingsCountExcept","Team_GetBuildingsCountOnly","Team_GetEnemyTeam","Team_GetEntitiesFromType","Team_HasBuilding","Team_HasBuildingsExcept","Team_HasBuildingUnderConstruction","Team_IsAlive","Team_OwnsEGroup","Team_OwnsEntity","Team_OwnsSGroup","Team_OwnsSquad","Team_RestrictAddOnList","Team_RestrictBuildingList","Team_RestrictResearchList","Team_SetAbilityAvailability","Team_SetCommandAvailability","Team_SetConstructionMenuAvailability","Team_SetEntityProductionAvailability","Team_SetMaxCapPopulation","Team_SetMaxPopulation","Team_SetSquadProductionAvailability","Team_SetTechTreeByYear","Team_SetUpgradeAvailability","Team_SetUpgradeCost","ToW_DefenseCreateWave","ToW_SetStandardResources","ToW_SetUpBattleObjectives","ToW_SetUpTechTreeByYear","Timer_Add","Timer_Advance","Timer_Display","Timer_DisplayOnScreen","Timer_End","Timer_Exists","Timer_GetElapsed","Timer_GetMinutesAndSeconds","Timer_GetRemaining","Timer_IsPaused","Timer_Pause","Timer_Resume","Timer_Start","EventCue_Create","FOW_Enable","Game_SubTextFade","HintMouseover_Add","HintMouseover_Remove","HintPoint_Add","HintPoint_Remove","HintPoint_SetDisplayOffset","HintPoint_SetVisible","Misc_IsEGroupSelected","Misc_IsSGroupSelected","ThreatArrow_Add","ThreatArrow_CreateGroup","ThreatArrow_DestroyAllGroups","ThreatArrow_DestroyGroup","ThreatArrow_Remove","UI_AddHintAndFlashAbility","UI_CreateEventCue","UI_CreateMinimapBlip","UI_CreateSGroupKickerMessage","UI_DeleteMinimapBlip","UI_HighlightSGroup","UI_SetAllowLoadAndSave","UI_SetSGroupSpecialLevel","WinWarning_PublishLoseReminder","WinWarning_SetMaxTickers","WinWarning_SetTickers","WinWarning_ShowLoseWarning","Clone","Event_IsAnyRunning","Game_EndSP","Game_FadeToBlack","Import_Once","Loc_FormatText","Sound_PlayOnSquad","Team_GetEntityConcentration","Team_GetSquadConcentration","Util_AddMouseoverSquadToSGroup","Util_ApplyModifier","Util_AutoAmbient","Util_AutoIntel","Util_AutoNISlet","Util_Autosave","Util_ClearWrecksFromMarker","Util_DespawnAll","Util_DifVar","Util_ElementCanSee","Util_EntityLimit","Util_FallBackToGarrisonBuilding","Util_FindHiddenSpawn","Util_ForceRetreatAll","Util_GarrisonNearbyBuilding","Util_GarrisonNearbyVehicle","Util_GetClosestMarker","Util_GetEntitiesByBP","Util_GetHealth","Util_GetMouseoverSGroup","Util_GetPosition","Util_GetPositionAwayFromPlayer","Util_GetPositionFromAtoB","Util_GetRandomPosition","Util_GetSquadsByBP","Util_GetTrailingNumber","Util_HasPosition","Util_HidePlayerForNIS","Util_IsSequenceSkipped","Util_Kill","Util_LogSyncWpn","Util_MarkerFX","Util_MissionTitle","Util_MuteAmbientSound","Util_NewHUDFeatureEvent","Util_PlayMovie","Util_PlayMusic","Util_PrintObject","Util_ReinforceEvent","Util_ReloadScript","Util_RestoreMusic","Util_SetPlayerCanSkipSequence","Util_SetPlayerUnableToSkipSequence","Util_SortPositionsByClosest","Util_StartAmbient","Util_StartIntel","Util_StartNislet","Util_StartQuickIntel","Util_TableContains","Util_ToggleAllowIntelEvents","Util_TriggerEvent","Util_UnitCounts","World_KillAllNeutralEntitesNearMarker","Anim_PlayEntityAnim","bug","Camera_AutoRotate","Camera_ClampToMarker","Camera_FocusOnPosition","Camera_FollowEntity","Camera_FollowSelection","Camera_FollowSquad","Camera_GetCurrentTargetPos","Camera_GetDeclination","Camera_GetOrbit","Camera_GetTargetPos","Camera_GetTuningValue","Camera_GetZoomDist","Camera_IsInputEnabled","Camera_Reload","Camera_ResetFocus","Camera_ResetToDefault","Camera_SetDeclination","Camera_SetInputEnabled","Camera_SetOrbit","Camera_SetSlideTargetRate","Camera_SetTuningValue","Camera_SetZoomDist","Camera_StopAutoRotating","Camera_Unclamp","EGroup_CallEntityFunction","EGroup_CallEntityFunctionAllOrAny","fatal","Game_EnableInput","Game_EndSubTextFade","Game_EndTextTitleFade","Game_GetLocalPlayer","Game_GetMode","Game_GetSPDifficulty","Game_HasLocalPlayer","Game_IsLetterboxed","Game_IsPerformanceTest","Game_IsRTM","Game_Letterbox","Game_LoadAtmosphere","Game_LockRandom","Game_ProfileDumpFrames","Game_QuitApp","Game_ScreenFade","Game_SetLocalPlayer","Game_SetMode","Game_ShowPauseMenu","Game_SkipAllEvents","Game_SkipEvent","Game_StartMuted","Game_TextTitleFade","Game_TriggerLightning","Game_UnlockInputOnLetterBox","Game_UnLockRandom","Ghost_DisableSpotting","Ghost_EnableSpotting","HintPoint_AddToEGroup","HintPoint_AddToEntity","HintPoint_AddToPosition","HintPoint_AddToSGroup","HintPoint_AddToSquad","HintPoint_ClearFacing","HintPoint_RemoveAll","HintPoint_SetDisplayOffsetInternal","HintPoint_SetFacingEntity","HintPoint_SetFacingPosition","HintPoint_SetFacingSquad","HintPoint_SetVisibleInternal","inv_dump","IsOfType","IsSecuringStructure","IsStructure","License_CanPlayRace","LOC","Loc_ConvertNumber","Loc_Empty","Loc_FormatTime","Misc_AbortToFE","Misc_AddRestrictCommandsMarker","Misc_AIControlLocalPlayer","Misc_AreDefaultCommandsEnabled","Misc_DetectKeyboardInput","Misc_DetectMouseInput","Misc_DoWeaponHitEffectOnEntity","Misc_EnablePerformanceTest","Misc_GetCommandLineString","Misc_GetControlGroupContents","Misc_GetEntityControlGroup","Misc_GetHiddenPositionOnPath","Misc_GetMouseOnTerrain","Misc_GetMouseOverEntity","Misc_GetSelectedEntities","Misc_GetSelectedSquads","Misc_GetSquadControlGroup","Misc_IsCommandLineOptionSet","Misc_IsDevMode","Misc_IsEntityOnScreen","Misc_IsEntitySelected","Misc_IsMouseOverEntity","Misc_IsPosOnScreen","Misc_IsSelectionInputEnabled","Misc_IsSquadOnScreen","Misc_IsSquadSelected","Misc_RemoveCommandRestriction","Misc_RestrictCommandsToMarker","Misc_Screenshot","Misc_ScreenshotExt","Misc_SelectEntity","Misc_SelectSquad","Misc_SetDefaultCommandsEnabled","Misc_SetDesignerSplatsVisibility","Misc_SetEntityControlGroup","Misc_SetEntitySelectable","Misc_SetSelectionInputEnabled","Misc_SetSquadControlGroup","Misc_SetSquadSelectable","Mission_Complete","Mission_Fail","Mission_GetSecondaryObjective","Mission_StartBonusObjective","Mission_Win","Modifier_ApplyToEntity","Modifier_ApplyToPlayer","Modifier_ApplyToSquad","Modifier_Create","Modifier_Destroy","Modifier_IsEnabled","nis_setintransitiontime","nis_setouttransitionnis","nis_setouttransitiontime","Obj_Create","Obj_Delete","Obj_DeleteAll","Obj_GetState","Obj_GetVisible","Obj_HideProgress","Obj_SetDescription","Obj_SetIcon","Obj_SetObjectiveFunction","Obj_SetProgressBlinking","Obj_SetState","Obj_SetTitle","Obj_SetVisible","Obj_ShowProgress","Obj_ShowProgress2","Obj_ShowProgressTimer","OpBounty_AddRewardGroup","OpBounty_AddRewardTable","Order227_Init","PrintOnScreen","PrintOnScreen_Add","PrintOnScreen_Remove","PrintOnScreen_RemoveFromScreen","ResourceAmount_Add","ResourceAmount_ClampToZero","ResourceAmount_Has","ResourceAmount_Mult","ResourceAmount_Subtract","ResourceAmount_Sum","ResourceAmount_Zero","Scar_Autosave","Scar_CompleteIntelBulletinTask","Scar_DebugConsoleExecute","Scar_PlayNIS","Scar_PlayNIS2","Scar_ReloadAIScripts","Setup_GetVictoryPointTickerOption","Setup_SetPlayerName","Setup_SetPlayerRace","Setup_SetPlayerTeam","SGroup_CallEntityFunction","SGroup_CallSquadFunction","SGroup_CallSquadFunctionAllOrAny","SitRep_PlayMovie","SitRep_PlaySpeech","SitRep_StopMovie","Sound_ContainerDebug","Sound_DisableSpeechEvent","Sound_IsPlaying","Sound_PerfTest_Play2D","Sound_Play2D","Sound_Play3D","Sound_PlayMusic","Sound_PlayStreamed","Sound_PreCacheSinglePlayerSpeech","Sound_PreCacheSound","Sound_PreCacheSoundFolder","Sound_SetGlobalControlSource","Sound_SetMusicCombatValue","Sound_SetVolume","Sound_SetVolumeDefault","Sound_SetVolumeInv","Sound_StartRecording","Sound_Stop","Sound_StopAll","Sound_StopMusic","Sound_StopRecording","Speech_SetGlobalStealthRead","statgraph","statgraph_channel","statgraph_channel_get_enabled","statgraph_channel_set_enabled","statgraph_clear","statgraph_list","statgraph_pause","Subtitle_EndAllSpeech","Subtitle_EndCurrentSpeech","Subtitle_PlaySpeech","Subtitle_UnstickCurrentSpeech","SyncWeapon_CanAttackNow","SyncWeapon_Exists","SyncWeapon_GetEntity","SyncWeapon_GetFromEGroup","SyncWeapon_GetFromSGroup","SyncWeapon_GetPosition","SyncWeapon_IsAttacking","SyncWeapon_IsOwnedByPlayer","SyncWeapon_SetAutoTargetting","Taskbar_IsVisible","Taskbar_SetVisibility","TaskCountActivePBG","TaskCountPBG","UI_AutosaveMessageHide","UI_AutosaveMessageShow","UI_ClearEventCues","UI_ClearModalAbilityPhaseCallback","UI_ClearNISEndCallback","UI_CoverPreviewHide","UI_CoverPreviewShow","UI_CreateColouredEntityKickerMessage","UI_CreateColouredPositionKickerMessage","UI_CreateColouredSquadKickerMessage","UI_CreateEntityKickerMessage","UI_CreatePositionKickerMessage","UI_CreateSquadKickerMessage","UI_EnableGameEventCueType","UI_EnableResourceTypeKicker","UI_EnableUIEventCueType","UI_FlashAbilityButton","UI_FlashConstructionButton","UI_FlashConstructionMenu","UI_FlashEntity","UI_FlashEntityCommandButton","UI_FlashEventCue","UI_FlashObjectiveCounter","UI_FlashObjectiveIcon","UI_FlashProductionBuildingButton","UI_FlashProductionButton","UI_FlashSquadCommandButton","UI_GetDecoratorsEnabled","UI_HideTacticalMap","UI_HighlightSquad","UI_IsTacticalMapShown","UI_MessageBoxHide","UI_MessageBoxSetButton","UI_MessageBoxSetText","UI_NewHUDFeature","UI_OutOfBoundsLinesHide","UI_OutOfBoundsLinesShow","UI_RestrictBuildingPlacement","UI_ScreenFade","UI_SetAbilityCardVisibility","UI_SetAlliedBandBoxSelection","UI_SetCPMeterVisibility","UI_SetDecoratorsEnabled","UI_SetForceShowSubtitles","UI_SetModalAbilityPhaseCallback","UI_SetNISEndCallback","UI_SetSoviet227Blinking","UI_SetSoviet227Visibility","UI_ShowTacticalMap","UI_StopFlashing","UI_SystemMessageHide","UI_SystemMessageShow","UI_TerritoryHide","UI_TerritoryShow","UI_TitleDestroy","UI_ToggleDecorators","UI_UnrestrictBuildingPlacement","UIWarning_Show","Util_AddProxCheck","Util_ClearProxChecks","Util_CreateEntities","Util_CreateSquads","Util_GetDistance","Util_GetOffsetPosition","Util_GetPlayerOwner","Util_GetRelationship","Util_GetRelativeOffset","Util_MonitorTerritory","Util_RemoveProxCheck","Util_RemoveProxCheckByID","Util_ScarPos","Util_SetPlayerOwner","Util_SpawnDemoCharge","Util_StartNIS","VIS_OccCullToggleOBB","Marker_CleanUpTheDead","Weather_SetType","World_AddPilferLockArea","World_CleanUpTheDead","World_ClearCasualties","World_DamageIce","World_DestroyWallsNearMarker","World_DistanceEGroupToPoint","World_DistancePointToPoint","World_DistanceSGroupToPoint","World_DistanceSquaredPointToPoint","World_EnableReplacementObjectForEmptyPlayers","World_EnableSharedLineOfSight","World_EndSP","World_GetClosest","World_GetCurrentInteractionStage","World_GetEntitiesNearMarker","World_GetEntitiesNearPoint","World_GetEntitiesWithinTerritorySector","World_GetEntity","World_GetFurthest","World_GetGameTime","World_GetHeightAt","World_GetHiddenPositionOnPath","World_GetLength","World_GetNearestInteractablePoint","World_GetNeutralEntitiesNearMarker","World_GetNeutralEntitiesNearPoint","World_GetNeutralEntitiesWithinTerritorySector","World_GetNumEntities","World_GetNumEntitiesNearPoint","World_GetNumStrategicPoints","World_GetNumVictoryPoints","World_GetOffsetPosition","World_GetPlayerAt","World_GetPlayerCount","World_GetPlayerIndex","World_GetPossibleSquadsBlueprint","World_GetPossibleSquadsCount","World_GetRaceIndex","World_GetRand","World_GetSpawnablePosition","World_GetSquadsNearMarker","World_GetSquadsNearPoint","World_GetSquadsWithinTerritorySector","World_GetStrategyPoints","World_GetTeamTerritoryGaps","World_GetTeamVictoryTicker","World_GetTerritorySectorID","World_GetTerritorySectorPosition","World_GetWidth","World_IncreaseInteractionStage","World_IsGameOver","World_IsInSupply","World_IsPointInPlayerTerritory","World_IsTerritorySectorOwnedByPlayer","World_IsWinterMap","World_OwnsEGroup","World_OwnsEntity","World_OwnsSGroup","World_OwnsSquad","World_PointPointProx","World_Pos","World_RemoveAllResourcePoints","World_RemovePilferLockArea","World_SetDesignerSupply","World_SetGameOver","World_SetIceHealingRate","World_SetPlayerCustomSkin","World_SetPlayerLose","World_SetPlayerWin","World_SetSnowHealingRate","World_SetTeamWin","World_SpawnDemolitionCharge","World_TeamTerritoryPointsConnected","Scar_AddInit","scartype","scartype_tostring","import","UI_GetViewportWidth","UI_GetViewportHeight","UI_ButtonAdd","UI_ButtonSetCallback","UI_ButtonSetEnabled","UI_ButtonSetIcon","UI_ButtonSetTag","UI_ButtonSetText","UI_LabelAdd","UI_LabelSetText","UI_IconAdd","UI_IconSetIcon","UI_PanelAdd","UI_StatusIndicatorAdd","UI_StatusIndicatorSetValue","UI_ControlSetColour","UI_ControlSetPosition","UI_ControlSetRect","UI_ControlRemove","UI_ControlClear","BS_NearBase","BS_Defend","BS_Secure","BS_Mines","BS_OuterBase","CPT_VictoryPoint","CPT_MunitionPoint","CPT_NullPoint","CPT_TacticalPoint","CPT_INVALID","CPT_FuelPoint","COMBAT_Default","COMBAT_Defend","COMBAT_Attack","MPT_VictoryPoint","MPT_NullPoint","MPT_NONE","MPT_MunitionPoint","MPT_COUNT","MPT_SupportStructure","MPT_Defence","MPT_Spawner","MPT_HQ","MPT_TacticalPoint","MPT_FuelPoint","MTARGET_Attack","MTARGET_Defend","AI_ProductionQueue","AI_CapturePoint","AI_Squad","AITacticTargetPreference_HighDamage","AITacticTargetPreference_LowHealth","AITacticTargetPreference_None","AITacticTargetPreference_Support","AITacticTargetPreference_Near","AITacticTargetPreference_NearAndBest","AITacticTargetPreference_Best","TACTIC_CapturePoint","TACTIC_Ability","TACTIC_Pickup","TACTIC_ForceAttack","TACTIC_Hold","TACTIC_MinRange","TACTIC_CaptureTeamWeapon","TACTIC_WarmUp","TACTIC_ProvideReinforcementPoint","TACTIC_RushAtTarget","TACTIC_Recrew","TACTIC_Vehicle","TACTIC_Avoid","TACTIC_Cover","TACTIC_FinishHealing","TASK_Leader","TASK_Production","TASK_Ability","TASK_PlayerAbility","TASK_Combat","TASK_Construction","TASK_Capture","TASK_ImmobileCombat","AII_LocalHumanTakeover","AII_RemoteAITakeover","AII_None","AII_RemoteHumanTakeover","AII_Normal","ITEM_REMOVED","ITEM_DEFAULT","ITEM_UNLOCKED","ITEM_LOCKED","BT_AttackHere","BT_SectorArtillery","BT_ObjectivePrimary","BT_Reveal","BT_Combat","BT_General","BT_CaptureHere","BT_DefendHere","BT_ObjectiveSecondary","BT_RallyPoint","BFS_Smoking","BFS_Burning","BFS_NotOnFire","TV_DeclinationEnabled","TV_DistMaxDead","TV_DistRateMouse","TV_NISletDistMin","TV_SlideOrbitRate","TV_PanScaleKeyboardDefZ","TV_PanScaleMouseDefZ","TV_SlideDeclThreshold","TV_PanStartSpeedScalar","TV_EntityMinViewAngle","TV_SlideTargetBase","TV_NearPlaneShifter","TV_DistMin","TV_PanScaleScreenDefZ","TV_NISletDistGroundMin","TV_DeclBelow","TV_SlideTargetThreshold","TV_DeclAbove","TV_DistScale","TV_NISletDistMax","TV_PanMaxSpeedScalar","TV_NISletDeclAbove","TV_NISletDistMinGround","TV_ZoomLocked","TV_CameraMode","TV_DefaultAngle","TV_PanScaleKeyboardMinZ","TV_PanScaleMouseMinZ","TV_DeclBelowClose","TV_TrackElastic","TV_DistExpWheel","TV_DistExpMouse","TV_DistMinGround","TV_DistGroundTargetHeight","TV_ClipFar","TV_DistGroundMin","TV_DistMinDead","TV_DistMax","TV_SlideDeclBase","TV_SlideOrbitThreshold","TV_SlideOrbitBase","TV_SlideDistThreshold","TV_SlideDistBase","TV_SlideTargetRate","TV_ClipNear","TV_PanScaleScreenMinZ","TV_DistRateWheelZoomIn","TV_SlideDistRate","TV_DistRateWheelZoomOut","TV_TrackBoundScale","TV_DefaultDeclination","TV_PanAccelerate","TV_DeclRateMouse","TV_DistExp","TV_DefaultHeight","TV_SlideDeclRate","TV_RotationEnabled","TV_OrbitRateMouse","TV_FieldOfView","TV_NISletDeclBelow","CANPRODUCE_PrerequisitesProducer","CANPRODUCE_Error","CANPRODUCE_ProductionQueueFull","CANPRODUCE_ProductionItemFull","CANPRODUCE_OutOfReinforceRadius","CANPRODUCE_Ok","CANPRODUCE_Disabled","CANPRODUCE_OutOfTerritory","CANPRODUCE_UpgradeItemFull","CANPRODUCE_PopulationCapFull","CANPRODUCE_NoResources","CANPRODUCE_PrerequisitesItem","CANPRODUCE_NoItem","CT_Medic","CT_Vehicle","CT_Personnel","CHECK_BOTH","CHECK_OFFCAMERA","CHECK_IN_FOW","CT_VehicleOpticsDamaged","CT_VehicleExhaustDamaged","CT_VehicleKillCommander","CT_VehicleDriverInjured","CT_VehicleEngineYellow","CT_VehicleBack","CT_VehicleLeft","CT_VehicleRight","CT_VehicleGunnerInjured","CT_VehicleEngineGreen","CT_VehicleCrewShocked","CT_VehicleFront","CT_VehicleEngineBurning","CT_VehicleEngineRed","CT_VehicleSecondaryWeapon","CT_VehicleLoseTreadsOrWheels","CT_VehicleOutOfControl","CT_VehiclePrimaryWeapon","Crush_Heavy","Crush_Off","Crush_Light","Crush_Medium","DB_Button3","DB_Button1","DB_Close","DB_Button2","CMD_InstantBuildSquad","CMD_InstantDeath","CMD_AttackStop","CMD_BuildStructure","CMD_Face","CMD_CancelProduction","CMD_RescueCasualty","CMD_SetHoldHeading","CMD_DefuseMine","CMD_AttackMove","CMD_Fidget","CMD_Stop","CMD_PlaceCharge","CMD_Paradrop","CMD_Destroy","CMD_Load","CMD_Ability","CMD_Move","CMD_InstantUpgrade","CMD_UnloadSquads","CMD_Casualty","CMD_BuildSquad","CMD_Halt","CMD_Attack","CMD_Capture","CMD_AttackForced","CMD_Death","CMD_Unload","CMD_Evacuate","CMD_BuildEntity","CMD_Vault","CMD_AttackFromHold","CMD_RallyPoint","CMD_DefaultAction","CMD_Upgrade","CMD_ChooseResource","CMD_Projectile","STATEID_Capture","STATEID_Idle","STATEID_Evacuate","STATEID_StructureBuilding","STATEID_RepairEngineer","STATEID_Move","STATEID_Dead","STATEID_DefuseMine","GE_ProjectileFired","GE_AIPlayer_Migrated","GE_EntityKilled","GE_TerritoryEntered","GE_ConstructionComplete","GE_NonGlobalCamoDetected","GE_SquadPinned","GE_BuildItemComplete","GE_PlayerKilled","GE_EntityCommandIssued","GE_StrategicPointChanged","GE_PlayerDonation","GE_AbilityExecuted","GE_PlayerDropped","GE_PlayerBeingAttacked","GE_UpgradeComplete","GE_PlayerSkipNIS","GE_AIPlayer_ObjectiveNotification","GE_ResourceDepleted","GE_CustomUIEvent","GE_SquadKilled","GE_PlayerSurrendered","GE_SquadCommandIssued","GE_EntityParadropComplete","GE_PlayerCheat","GE_InfoPointActivated","GE_SpawnActionComplete","GE_PlayerCommandIssued","GE_PlayerHostMigrated","GE_SquadParadropComplete","GE_PlayerPhaseUp","HPAT_Hint","HPAT_MovementLooping","HPAT_Bonus","HPAT_Vaulting","HPAT_Detonation","HPAT_CoverRed","HPAT_CoverYellow","HPAT_Artillery","HPAT_FormationSetup","HPAT_Movement","HPAT_Critical","HPAT_Objective","HPAT_AttackLooping","HPAT_DeepSnow","HPAT_CoverGreen","HPAT_Attack","HPAT_RallyPoint","HUDF_None","HUDF_AbilityCard","HUDF_Upgrades","HUDF_CommandCard","HUDF_MiniMap","LOOP_NORMAL","LOOP_TOGGLE_DIRECTION","LOOP_NONE","MAP_Confirmed","MAP_Placing","MAP_Facing","MAT_Entity","MAT_Player","MAT_Weapon","MAT_Upgrade","MAT_EntityType","MAT_Ability","MAT_Squad","MAT_WeaponType","MAT_SquadType","MUT_Multiplication","MUT_MultiplyAdd","MUT_Addition","MUT_Enable","PBG_Weapon","PBG_MoveType","PBG_SlotItem","PBG_UITacticalMap","PBG_HitMaterial","PBG_PassType","PBG_Race","PBG_UISelection","PBG_Critical","PBG_CamouflageStance","PBG_Material","PBG_Tuning","PBG_Ability","PBG_Upgrade","PBG_Posture","PBG_UITerritory","MM_ForceTense","MM_ForceCalm","MM_Auto","FN_OnShow","FN_OnCounterDisplay","FN_OnActivate","FN_LuaTableQuery","FN_OnSelect","OS_Complete","OS_Incomplete","OS_Off","OS_Failed","OT_Secondary","OT_Primary","OT_Ally","OT_Neutral","OT_Player","OT_Enemy","PCMD_MunitionDonation","PCMD_SlotItemRemove","PCMD_CriticalHit","PCMD_CheatBuildTime","PCMD_Ability","PCMD_SetCommander","PCMD_CheatRevealAll","PCMD_ManpowerDonation","PCMD_UpgradeRemove","PCMD_ConstructField","PCMD_CancelProduction","PCMD_CheatKillSelf","PCMD_Upgrade","PCMD_ConstructFence","PCMD_FuelDonation","PCMD_DetonateCharges","PCMD_CheatResources","PCMD_AIPlayer","PCMD_AIPlayer_ObjectiveNotification","PCMD_ConstructStructure","PCMD_InstantUpgrade","PITEM_SquadUpgrade","PITEM_SquadReinforce","PITEM_Spawn","PITEM_Upgrade","PT_Rectangle","PT_Circle","R_NEUTRAL","R_ENEMY","R_UNDEFINED","R_ALLY","RT_SovietOrder227","RT_Command","RT_SovietProgression","RT_Popcap","RT_Manpower","RT_Munition","RT_Fuel","RT_Action","RUIITEM_Population","RUIITEM_ResourceBar","RUIITEM_Munitions","RUIITEM_Manpower","RUIITEM_Fuel","ST_MARKER","ST_PBG","ST_SCARPOS","ST_AIPLAYER","ST_TABLE","ST_EGROUP","ST_AISTATSMILITARYPOINT","ST_AISQUAD","ST_ENTITY","ST_NUMBER","ST_FUNCTION","ST_SQUAD","ST_PLAYER","ST_BOOLEAN","ST_NIL","ST_CONSTPLAYER","ST_UNKNOWN","ST_SGROUP","ST_STRING","ST_AICAPTUREPOINT","PBG_TurnPlan","PBG_EntityProperties","PBG_SquadFormation","PBG_SquadProperties","PBG_Formation","DEBUG_SELECTOR","DEBUG_COMBATZONES","SCMD_Attack","SCMD_Upgrade","SCMD_StationaryAttack","SCMD_SlotItemRemove","SCMD_Pilfer","SCMD_SetMoveType","SCMD_Ability","SCMD_Move","SCMD_BuildStructure","SCMD_InstantLoad","SCMD_Merge","SCMD_UnloadSquads","SCMD_Retreat","SCMD_DefaultAction","SCMD_RescueCasualty","SCMD_Stop","SCMD_SetCamouflageStance","SCMD_AttackMove","SCMD_RevertFieldSupport","SCMD_CancelProduction","SCMD_Capture","SCMD_Surprise","SCMD_ReinforceUnit","SCMD_CaptureTeamWeapon","SCMD_Patrol","SCMD_Face","SCMD_Recrew","SCMD_DoPlan","SCMD_DefuseCharge","SCMD_PickUpSlotItem","SCMD_BuildSquad","SCMD_InstantReinforceUnit","SCMD_Load","SCMD_InstantSetupTeamWeapon","SCMD_RallyPoint","SCMD_AbandonTeamWeapon","SCMD_Unload","SCMD_DefuseMine","SCMD_Destroy","SCMD_PlaceCharge","SCMD_InstantUpgrade","SQUADSTATEID_Capture","SQUADSTATEID_CaptureTeamWeapon","SQUADSTATEID_Move","SQUADSTATEID_Retreat","SQUADSTATEID_Plan","SQUADSTATEID_AttackMove","SQUADSTATEID_Load","SQUADSTATEID_Defuse","SQUADSTATEID_DefuseMine","SQUADSTATEID_Stop","SQUADSTATEID_Patrol","SQUADSTATEID_Ability","SQUADSTATEID_CombatStance","SQUADSTATEID_RevertFieldSupport","SQUADSTATEID_Unload","SQUADSTATEID_HoldUnload","SQUADSTATEID_PickUpSlotItem","SQUADSTATEID_Construction","SQUADSTATEID_Idle","SQUADSTATEID_WeaponTransition","SQUADSTATEID_Recrew","SQUADSTATEID_PlaceCharges","SQUADSTATEID_Combat","UIE_UpgradeComplete","UIE_PlayerPingOfShameLocal","UIE_EnemyReveal","UIE_InfoPointActivated","UIE_AITakeOver","UIE_VehicleComplete","UIE_AllyAttacked","UIE_CommanderAbilityUnlocked","UIE_CommandersUnlocked","UIE_CommandPointGained","UIE_SquadFreezing","UIE_SquadCold","UIE_CasualtySquadSpawned","UIE_SquadVeterancy","UIE_VehicleReplaced","UIE_InfantryReplaced","UIE_Sniped","UIE_BoobyTrap","UIE_MineDetected","UIE_AbilityExectued","UIE_StrategicPointCaptured","UIE_StrategicPointReverting","UIE_EnemyTerritoryEntered","UIE_TerritoryEntered","UIE_PlayerSurrendered","UIE_PlayerAttacked","UIE_VehicleAttacked","UIE_PlayerKilled","UIE_PlayerKicked","UIE_PlayerLagComplaint","UIE_PlayerPingOfShame","UIE_PlayerDropped","UIE_ConstructionComplete","UIE_StrategicPointSecured","UIE_ResourceDepleted","UIE_SquadPinned","UIE_InfantryAttacked","UIE_InfantryComplete","UIE_PlayerCheated","UIE_PhaseUp","UIE_HostMigrated","UIE_Default","UI_Cinematic","UI_Fullscreen","UI_Normal","UOT_Player","UOT_Self","UOT_None","BIS_Icon","BIS_IconState","LAH_Justify","LAH_Left","LAH_Center","LAH_Right","LAV_None","LAV_Top","LAV_Center","LAV_Bottom","assert","collectgarbage","dofile","error","getmetatable","ipairs","load","loadfile","next","pairs","pcall","print","rawequal","rawget","rawlen","rawset","select","setmetatable","tonumber","tostring","type","xpcall","string.byte","string.char","string.dump","string.find","and","break","do","else","elseif","end","false","for","function","if","in","local","nil","not","or","repeat","return","then","true","until","while","math.huge","math.maxinteger","math.mininteger","math.pi","EBP.WRECKED_VEHICLES.FRONT_HULL01","EBP.WRECKED_VEHICLES.FROZEN_PANZER_IV","EBP.WRECKED_VEHICLES.FROZEN_STUG_III","EBP.WRECKED_VEHICLES.HORSA_COCKPIT","EBP.WRECKED_VEHICLES.HORSA_FRONT_HULL","EBP.WRECKED_VEHICLES.HORSA_LEFT_WING","EBP.WRECKED_VEHICLES.HORSA_LEFT_WING_TIP","EBP.WRECKED_VEHICLES.HORSA_MID_HULL","EBP.WRECKED_VEHICLES.HORSA_REAR_HULL","EBP.WRECKED_VEHICLES.HORSA_RIGHT_WING","EBP.WRECKED_VEHICLES.HORSA_RIGHT_WING_TIP","EBP.WRECKED_VEHICLES.HORSA_TAIL","EBP.WRECKED_VEHICLES.LEFT_WING","EBP.WRECKED_VEHICLES.MAP_OBJECT_M4SHERMAN_105MM","EBP.WRECKED_VEHICLES.MAP_OBJECT_M4SHERMAN_76MM","EBP.WRECKED_VEHICLES.MAP_OBJECT_M4SHERMAN_DOZER","EBP.WRECKED_VEHICLES.MAP_OBJECT_OPELBLITZ","EBP.WRECKED_VEHICLES.MAP_OBJECT_PAK38","EBP.WRECKED_VEHICLES.MAP_OBJECT_PANZERIV","EBP.WRECKED_VEHICLES.MAP_OBJECT_STUGIII_LONG","EBP.WRECKED_VEHICLES.MAP_OBJECT_STUGIII_SHORT","EBP.WRECKED_VEHICLES.PROPELLER","EBP.WRECKED_VEHICLES.RIGHT_WING","EBP.WRECKED_VEHICLES.STUKA_BODY","EBP.WRECKED_VEHICLES.STUKA_DEBRIS","EBP.WRECKED_VEHICLES.STUKA_TAIL","EBP.WRECKED_VEHICLES.STUKA_WING_LEFT","EBP.WRECKED_VEHICLES.STUKA_WING_RIGHT","EBP.WRECKED_VEHICLES.TAIL","EBP.WRECKED_VEHICLES.TAIL_SECTION_01","EBP.WRECKED_VEHICLES.WRECKED_50MM_PAK38_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_PUMA_MP","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_222","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_222_MP","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_234","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_234_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_ARMORED_CAR_SDKFZ_234_PUMA_MP","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_17_POUNDER","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_45MM","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_75MM_PAK","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_B4_200MM","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_M1_57MM","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_ML20","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_PAK43","EBP.WRECKED_VEHICLES.WRECKED_ATGUN_ZIS3","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING01","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING01_SELF_DESTRUCT","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING02","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING02_SELF_DESTRUCT","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING03","EBP.WRECKED_VEHICLES.WRECKED_BASE_BUILDING03_SELF_DESTRUCT","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_AEC","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_AEC_ARMOURED_CAR_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_ATGUN_6_POUNDER","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_BOFORS","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CENTAUR","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_AVRE","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_AVRE_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_CROCODILE","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CHURCHILL_CROCODILE_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_COMET","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_COMET_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CROMWELL","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_CROMWELL_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_GLIDER_HQ_MP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_GLIDER_MP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_SEXTON","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_SHERMAN_FIREFLY","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_SHERMAN_FIREFLY_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_UNIVERSAL_CARRIER","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_VALENTINE_COMMAND","EBP.WRECKED_VEHICLES.WRECKED_BRITISH_VALENTINE_COMMAND_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_BRUMMBAR_02","EBP.WRECKED_VEHICLES.WRECKED_BRUMMBAR_STURMPANZER_IV_SDKFZ_166","EBP.WRECKED_VEHICLES.WRECKED_EARLY_WAR_TANK_01","EBP.WRECKED_VEHICLES.WRECKED_ELEFANT_SDKFZ_184","EBP.WRECKED_VEHICLES.WRECKED_FN63_4RM","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_250","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_250_MORTAR","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251_17_FLAK","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251_INFRARED","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251_MP","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SDKFZ_251_WALKING_STUKA","EBP.WRECKED_VEHICLES.WRECKED_HALFTRACK_SWS","EBP.WRECKED_VEHICLES.WRECKED_HETZER","EBP.WRECKED_VEHICLES.WRECKED_HETZER_BREWUP","EBP.WRECKED_VEHICLES.WRECKED_HOWITZER_105MM_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_IG18_SUPPORT_GUN","EBP.WRECKED_VEHICLES.WRECKED_IS_2_HEAVY_TANK","EBP.WRECKED_VEHICLES.WRECKED_ISU_152_SPG","EBP.WRECKED_VEHICLES.WRECKED_JAGDPANZER_IV","EBP.WRECKED_VEHICLES.WRECKED_JAGDPANZER_IV_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_JAGDTIGER_TD","EBP.WRECKED_VEHICLES.WRECKED_JAGDTIGER_TD_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_KATYUSHA_BM_13N","EBP.WRECKED_VEHICLES.WRECKED_KATYUSHA_BM_13N_MP","EBP.WRECKED_VEHICLES.WRECKED_KING_TIGER","EBP.WRECKED_VEHICLES.WRECKED_KING_TIGER_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_KUBELWAGEN","EBP.WRECKED_VEHICLES.WRECKED_KV_1","EBP.WRECKED_VEHICLES.WRECKED_KV_1_MP","EBP.WRECKED_VEHICLES.WRECKED_KV_2","EBP.WRECKED_VEHICLES.WRECKED_KV_8","EBP.WRECKED_VEHICLES.WRECKED_LAND_MATTRESS","EBP.WRECKED_VEHICLES.WRECKED_M10","EBP.WRECKED_VEHICLES.WRECKED_M10_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M15A1_AA_HALFTRACK","EBP.WRECKED_VEHICLES.WRECKED_M15A1_AA_HALFTRACK_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_M20_UTILITY_CAR","EBP.WRECKED_VEHICLES.WRECKED_M21_MORTAR_HALFTRACK","EBP.WRECKED_VEHICLES.WRECKED_M26_PERSHING","EBP.WRECKED_VEHICLES.WRECKED_M3_HALFTRACK","EBP.WRECKED_VEHICLES.WRECKED_M36","EBP.WRECKED_VEHICLES.WRECKED_M36_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M3A1_SCOUT_CAR","EBP.WRECKED_VEHICLES.WRECKED_M3A1_SCOUT_CAR_MP","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_BULLDOZER","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_BULLDOZER_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_EASY_EIGHT","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_EASY_EIGHT_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_M4A3_SHERMAN_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_M5_HALFTRACK","EBP.WRECKED_VEHICLES.WRECKED_M5_HALFTRACK_MP","EBP.WRECKED_VEHICLES.WRECKED_M5A1_STUART","EBP.WRECKED_VEHICLES.WRECKED_M8_ARMORED_CAR","EBP.WRECKED_VEHICLES.WRECKED_M8_HMC","EBP.WRECKED_VEHICLES.WRECKED_OPEL_BLITZ_TRUCK","EBP.WRECKED_VEHICLES.WRECKED_OSTWIND_FLAK_PANZER","EBP.WRECKED_VEHICLES.WRECKED_PACK_HOWITZER","EBP.WRECKED_VEHICLES.WRECKED_PANTHER_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_PANTHER_SDKFZ_171","EBP.WRECKED_VEHICLES.WRECKED_PANTHER_SDKFZ_171_BREWUP","EBP.WRECKED_VEHICLES.WRECKED_PANZER_II_LUCHS","EBP.WRECKED_VEHICLES.WRECKED_PANZER_II_LUCHS_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_PANZER_III","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_FROZEN","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161_COMMAND","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161_GAMEPLAY","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161_WEST_GERMAN","EBP.WRECKED_VEHICLES.WRECKED_PANZER_IV_SDKFZ_161_WEST_GERMAN_BREW_UP","EBP.WRECKED_VEHICLES.WRECKED_PANZERIV_MAP_OBJECT","EBP.WRECKED_VEHICLES.WRECKED_PANZERWERFER_SDKFZ_4_1","EBP.WRECKED_VEHICLES.WRECKED_PRIEST","EBP.WRECKED_VEHICLES.WRECKED_RAKETENWERFER","EBP.WRECKED_VEHICLES.WRECKED_SOVIET_76MM_SHERMAN","EBP.WRECKED_VEHICLES.WRECKED_STUG_III_E_SDKFZ_141_1","EBP.WRECKED_VEHICLES.WRECKED_STUG_III_FROZEN","EBP.WRECKED_VEHICLES.WRECKED_STUG_III_G_SDKFZ_141_1","EBP.WRECKED_VEHICLES.WRECKED_STUG_III_G_SDKFZ_141_1_GAMEPLAY","EBP.WRECKED_VEHICLES.WRECKED_STURMTIGER","EBP.WRECKED_VEHICLES.WRECKED_SU_76M","EBP.WRECKED_VEHICLES.WRECKED_SU_85","EBP.WRECKED_VEHICLES.WRECKED_T_34_76","EBP.WRECKED_VEHICLES.WRECKED_T_34_76_02","EBP.WRECKED_VEHICLES.WRECKED_T_34_76_MP","EBP.WRECKED_VEHICLES.WRECKED_T_34_85_RED_BANNER","EBP.WRECKED_VEHICLES.WRECKED_T_34_85_RED_BANNER_MP","EBP.WRECKED_VEHICLES.WRECKED_T_34_85_RED_BANNER_TOW","EBP.WRECKED_VEHICLES.WRECKED_T34_CALLIOPE","EBP.WRECKED_VEHICLES.WRECKED_T70","EBP.WRECKED_VEHICLES.WRECKED_T70_MP","EBP.WRECKED_VEHICLES.WRECKED_TIGER_SDKFZ_181","EBP.WRECKED_VEHICLES.WRECKED_TIGER_SDKFZ_181_SINGLEPLAYER_MISSION","EBP.WRECKED_VEHICLES.WRECKED_WC51","EBP.WRECKED_VEHICLES.WRECKED_WC54_AMBULANCE","EBP.AEF.AEF_AIRDROPPED_MINE_CONTACT_MP","EBP.AEF.AEF_AIRDROPPED_MINE_MP","EBP.AEF.AEF_ALLIEDSUPPLY_STACK_L_01_MP","EBP.AEF.AEF_ATTACK_PLANE","EBP.AEF.AEF_BARBED_WIRE_FENCE_MP","EBP.AEF.AEF_BARRACKS","EBP.AEF.AEF_BASE_STAMPER","EBP.AEF.AEF_GARRISON","EBP.AEF.AEF_MG_NEST","EBP.AEF.AEF_MG_NEST_AEF_BASE","EBP.AEF.AEF_MG_NEST_PERIMETER_MP","EBP.AEF.AEF_MINE_MP","EBP.AEF.AEF_MINE_RIFLEMEN_MP","EBP.AEF.AEF_SANDBAG_DIRTWALL_01","EBP.AEF.AEF_SANDBAG_FENCE","EBP.AEF.AEF_SANDBAGS","EBP.AEF.AEF_SANDBAGWALL","EBP.AEF.AEF_SANDBAGWALL_COVER_SPECIALIZATION","EBP.AEF.AEF_STORAGEBUNKER","EBP.AEF.AEF_SUPPLYTENT","EBP.AEF.AEF_TANK_TRAP_IMPASSABLE_MP","EBP.AEF.AEF_TANK_TRAP_MP","EBP.AEF.AEF_WEAPON_RACK_BAZOOKA_MP","EBP.AEF.AEF_WEAPON_RACK_BROWNING_AUTOMATIC_RIFLE_MP","EBP.AEF.AEF_WEAPON_RACK_DEFAULT_MP","EBP.AEF.AEF_WEAPON_RACK_M1919_LMG","EBP.AEF.AEF_WEAPON_RACK_M1C_GARAND","EBP.AEF.AEF_WEAPON_RACK_M9_BAZOOKA_MP","EBP.AEF.AIRBORNE_BEACON_MP","EBP.AEF.ARMOR_COMMAND_MP","EBP.AEF.ARMOR_COMMAND_SP","EBP.AEF.ARMOR_COMMAND_WRECK_MP","EBP.AEF.ARMORED_RIFLE_COMMAND_MP","EBP.AEF.ARMORED_RIFLE_COMMAND_SP","EBP.AEF.ARMORED_RIFLE_COMMAND_WRECK_MP","EBP.AEF.ASSAULT_ENGINEER_MP","EBP.AEF.ASSAULT_ENGINEER_VEHICLE_CREW_MP","EBP.AEF.AT_TEAM_WEAPON_CREW_MP","EBP.AEF.CAPTAIN_MP","EBP.AEF.CAPTAIN_UNLOCK_MP","EBP.AEF.COMPANY_WEAPONS_POOL_MP","EBP.AEF.COMPANY_WEAPONS_POOL_SP","EBP.AEF.COMPANY_WEAPONS_POOL_WRECK_MP","EBP.AEF.DODGE_WC51_50CAL_MP","EBP.AEF.DODGE_WC51_50CAL_PARADROP","EBP.AEF.DODGE_WC51_AMBULANCE_MP","EBP.AEF.DODGE_WC51_MP","EBP.AEF.DODGE_WC51_MP_PATHFINDERS","EBP.AEF.FIGHTING_POSITION_MP","EBP.AEF.FIGHTING_POSITION_RIFLEMEN_MP","EBP.AEF.HMG_TEAM_WEAPON_CREW_MP","EBP.AEF.HOWITZER_TEAM_WEAPON_CREW_MP","EBP.AEF.INVISI_HEAL_STATION_MP","EBP.AEF.INVISI_REPAIR_STATION_MP","EBP.AEF.JACKSON","EBP.AEF.LIEUTENANT_MP","EBP.AEF.LIEUTENANT_UNLOCK_MP","EBP.AEF.M1_57MM_ANTITANK_GUN_MP","EBP.AEF.M1_75MM_PACK_HOWITZER_MP","EBP.AEF.M1_81MM_MORTAR_MP","EBP.AEF.M10_TANK_DESTROYER_MP","EBP.AEF.M15A1_AA_HALFTRACK_MP","EBP.AEF.M1919A4_30CAL_MACHINE_GUN_MP","EBP.AEF.M1919A4_TEAM_WEAPON_CREW_MP","EBP.AEF.M2_60MM_MORTAR_MP","EBP.AEF.M20_M6_AT_MINE_MP","EBP.AEF.M20_UTILITY_CAR_MP","EBP.AEF.M21_MORTAR_HALFTRACK_MP","EBP.AEF.M26_PERSHING_MP","EBP.AEF.M2HB_50CAL_MACHINE_GUN_MP","EBP.AEF.M3_HALFTRACK_ASSAULT_MP","EBP.AEF.M3_HALFTRACK_MP","EBP.AEF.M36_TANK_DESTROYER_MP","EBP.AEF.M4A3_76MM_SHERMAN_MP","EBP.AEF.M4A3_SHERMAN_BULLDOZER_MP","EBP.AEF.M4A3_SHERMAN_DEMO_BURNOUT","EBP.AEF.M4A3_SHERMAN_MP","EBP.AEF.M4A3E8_SHERMAN_EASY_8_MP","EBP.AEF.M5_HALFTRACK_USF_MP","EBP.AEF.M5A1_STUART_MP","EBP.AEF.M7B1_PRIEST_MP","EBP.AEF.M8_GREYHOUND_MP","EBP.AEF.M8A1_HMC_MP","EBP.AEF.MAJOR_MP","EBP.AEF.MAJOR_RETREAT_POINT_MP","EBP.AEF.MAJOR_UNLOCK_MP","EBP.AEF.MORTAR_TEAM_WEAPON_CREW_MP","EBP.AEF.OBSERVATION_POST_FUEL_AEF_MP","EBP.AEF.OBSERVATION_POST_MUNITION_AEF_MP","EBP.AEF.P47_RECON","EBP.AEF.P47_RECON_PLANE_SWEEP","EBP.AEF.P47_RECON_TRACKING","EBP.AEF.P47_ROCKETS","EBP.AEF.P47_STRAFE","EBP.AEF.PARATROOPER_MP","EBP.AEF.PARATROOPERS_COMBAT_GROUP_PLANE","EBP.AEF.PARATROOPERS_PLANE","EBP.AEF.PARATROOPERS_PLANE_ATGUN","EBP.AEF.PARATROOPERS_PLANE_HMG","EBP.AEF.PARATROOPERS_PLANE_MINES","EBP.AEF.PARATROOPERS_PLANE_PARAS","EBP.AEF.PATHFINDER_IR_MP","EBP.AEF.PATHFINDER_RECON_MP","EBP.AEF.PM_AEF_AIR_SUPPORT_RECON","EBP.AEF.PM_AEF_AIR_SUPPORT_ROCKET","EBP.AEF.PM_AEF_AIR_SUPPORT_ROCKET_ELITE","EBP.AEF.PM_AEF_AIR_SUPPORT_STRAFE","EBP.AEF.PM_AEF_AIR_SUPPORT_STRAFE_ELITE","EBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_PLANE_PARAS","EBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_PLANE_STRAFE","EBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_SPAWNER","EBP.AEF.PM_AEF_AIRBORNE_SUPPLY_DROP_PLANE","EBP.AEF.PM_AEF_FIGHTING_POSITION_TEAMWEAPONS","EBP.AEF.PM_AEF_PINPOINT_ARTY_MARKER_MP","EBP.AEF.PM_AEF_PINPOINT_ARTY_THREE_MARKER_MP","EBP.AEF.PM_ARMOR_COMMAND_BAZOOKA_RACK","EBP.AEF.PM_ARMOR_COMMAND_LMG_RACK","EBP.AEF.PM_ATTACHED_MEDIC","EBP.AEF.PM_ATTACHED_SEARGENT","EBP.AEF.PM_P47_FLYBY","EBP.AEF.PM_P47_MG_STRAFE","EBP.AEF.PM_P47_ROCKET_STRAFE","EBP.AEF.RANGER_COMMANDER_MP","EBP.AEF.RANGER_MP","EBP.AEF.REAR_ECHELON_RADIOMAN_MP","EBP.AEF.REAR_ECHELON_RESERVE_TROOP_MP","EBP.AEF.REAR_ECHELON_TROOP_CAPT_MP","EBP.AEF.REAR_ECHELON_TROOP_MP","EBP.AEF.REPLACEMENT_ARMOR_COMMAND_MP","EBP.AEF.REPLACEMENT_ARMORED_RIFLE_COMMAND_MP","EBP.AEF.REPLACEMENT_COMPANY_WEAPONS_POOL_MP","EBP.AEF.RIFLE_COMMAND_MP","EBP.AEF.RIFLE_COMMAND_SP","EBP.AEF.RIFLE_COMMAND_WRECK_MP","EBP.AEF.RIFLEMAN_SOLDIER_CAPTAIN_MP","EBP.AEF.RIFLEMAN_SOLDIER_GROUP_MP","EBP.AEF.RIFLEMAN_SOLDIER_LIEUTENANT_MP","EBP.AEF.RIFLEMAN_SOLDIER_MP","EBP.AEF.SHERMAN_BARRIER_DEFORM_MP","EBP.AEF.SHERMAN_BARRIER_DIRT_MP","EBP.AEF.SHERMAN_BARRIER_MUD_MP","EBP.AEF.SHERMAN_BARRIER_RUBBLE_MP","EBP.AEF.SHERMAN_BARRIER_SNOW_MP","EBP.AEF.T34_CALLIOPE_MP","EBP.AEF.TEMP_ACTIVE_STRUCTURE_SEARCHLIGHT","EBP.AEF.USF_MEDIC_MP","EBP.AEF.VEHICLE_CREW_BAZOOKA_MP","EBP.AEF.VEHICLE_CREW_TROOP_MP","EBP.AEF.VEHICLE_CREW_TROOP_REPAIR_STATION_MP","SBP.AEF.AEF_AIR_SUPPORT_RECON","SBP.AEF.AEF_AIR_SUPPORT_ROCKET","SBP.AEF.AEF_AIR_SUPPORT_ROCKET_ELITE","SBP.AEF.AEF_AIR_SUPPORT_STRAFE","SBP.AEF.AEF_AIR_SUPPORT_STRAFE_ELITE","SBP.AEF.AEF_ATTACK_PLANE_SQUAD","SBP.AEF.AEF_HALFTRACK_SQUAD_MP","SBP.AEF.ASSAULT_ENGINEER_SQUAD_5_MAN_MP","SBP.AEF.ASSAULT_ENGINEER_SQUAD_MP","SBP.AEF.CAPTAIN_SQUAD_MP","SBP.AEF.DODGE_WC51_50CAL_SQUAD_MP","SBP.AEF.DODGE_WC51_AMBULANCE_SQUAD_MP","SBP.AEF.DODGE_WC51_PATHFINDER_SQUAD_MP","SBP.AEF.DODGE_WC51_SQUAD_MP","SBP.AEF.JACKSON_SQUAD","SBP.AEF.LIEUTENANT_SQUAD_MP","SBP.AEF.M1_57MM_AT_GUN_SQUAD_BOB","SBP.AEF.M1_57MM_AT_GUN_SQUAD_MP","SBP.AEF.M1_75MM_PACK_HOWITZER_SQUAD_MP","SBP.AEF.M1_81MM_MORTAR_SQUAD_MP","SBP.AEF.M10_TANK_DESTROYER_SQUAD_MP","SBP.AEF.M15A1_AA_HALFTRACK_SQUAD_MP","SBP.AEF.M1919A4_HMG_SQUAD_MP","SBP.AEF.M2_60MM_MORTAR_CORE_SQUAD_MP","SBP.AEF.M2_60MM_MORTAR_SQUAD_MP","SBP.AEF.M2_60MM_MORTAR_SQUAD_MP_CLONE","SBP.AEF.M20_ASSAULT_ENGY_ANTITANK_SQUAD_MP","SBP.AEF.M20_UTILITY_CAR_SQUAD_MP","SBP.AEF.M21_MORTAR_HALFTRACK_SQUAD_MP","SBP.AEF.M26_PERSHING_MP","SBP.AEF.M2HB_50CAL_HMG_SQUAD_MP","SBP.AEF.M3_HALFTRACK_SQUAD_ASSAULT_MP","SBP.AEF.M3_HALFTRACK_SQUAD_MP","SBP.AEF.M36_TANK_DESTROYER_SQUAD_MP","SBP.AEF.M4A3_76MM_SHERMAN_BULLDOZER_SQUAD_MP","SBP.AEF.M4A3_76MM_SHERMAN_SQUAD_MP","SBP.AEF.M4A3_SHERMAN_SQUAD_DEMO_BURNOUT","SBP.AEF.M4A3_SHERMAN_SQUAD_MP","SBP.AEF.M4A3E8_SHERMAN_EASY_8_SQUAD_MP","SBP.AEF.M5A1_STUART_SQUAD_MP","SBP.AEF.M7B1_PRIEST_SQUAD_MP","SBP.AEF.M8_GREYHOUND_SQUAD_MP","SBP.AEF.M8A1_HMC_SQUAD_MP","SBP.AEF.MAJOR_SQUAD_MP","SBP.AEF.P47_FLYBY","SBP.AEF.P47_MG_STRAFE","SBP.AEF.P47_RECON","SBP.AEF.P47_RECON_PLANE_SWEEP","SBP.AEF.P47_RECON_TRACKING","SBP.AEF.P47_ROCKETS","SBP.AEF.P47_ROCKETS_STRAFE","SBP.AEF.P47_STRAFES","SBP.AEF.PARATROOPER_COMBAT_GROUP_SQUAD_MP","SBP.AEF.PARATROOPER_SQUAD_MP","SBP.AEF.PARATROOPER_SQUAD_SUPPORT_MP","SBP.AEF.PARATROOPERS_COMBAT_GROUP_PLANE","SBP.AEF.PARATROOPERS_PLANE","SBP.AEF.PARATROOPERS_PLANE_ATGUN","SBP.AEF.PARATROOPERS_PLANE_HMG","SBP.AEF.PARATROOPERS_PLANE_MINES","SBP.AEF.PARATROOPERS_PLANE_PARAS","SBP.AEF.PATHFINDER_SQUAD_MP","SBP.AEF.PATHFINDER_SQUAD_RECON_MP","SBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_PLANE_PARAS","SBP.AEF.PM_AEF_AIRBORNE_PARATROOPERS_PLANE_STRAFE","SBP.AEF.PM_AEF_AIRBORNE_SUPPLY_DROP_PLANE","SBP.AEF.PM_M3_HALFTRACK_SQUAD_OMCG","SBP.AEF.PM_RIFLEMEN_SQUAD_OMCG","SBP.AEF.RANGER_SQUAD_COMMANDER_MP","SBP.AEF.RANGER_SQUAD_MP","SBP.AEF.REAR_ECHELON_SQUAD_MP","SBP.AEF.RIFLEMEN_SQUAD_MP","SBP.AEF.RIFLEMEN_SQUAD_VETERAN_MP","SBP.AEF.T34_CALLIOPE_SQUAD_MP","SBP.AEF.USF_MEDIC_SQUAD_MP","SBP.AEF.VEHICLE_CREW_BAZOOKA_SQUAD_MP","SBP.AEF.VEHICLE_CREW_SQUAD_MP","ABILITY.AEF.ACTIVATE_REPAIR_STATION_MP","ABILITY.AEF.AEF_BARBED_WIRE_CUTTING_ABILITY_ASSUALT_ENGINEERS_MP","ABILITY.AEF.AEF_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.AEF.AEF_BARBED_WIRE_CUTTING_ABILITY_NO_REQUIREMENT_MP","ABILITY.AEF.AEF_HQ_ENGINEER_CALL_IN","ABILITY.AEF.AEF_REPAIR_ABILITY_REAR_ECHELON_MP","ABILITY.AEF.AEF_REPAIR_ABILITY_VEHICLE_CREW_MP","ABILITY.AEF.AEF_REPAIR_CRITICAL_MP","ABILITY.AEF.AIR_DROP_COMBAT_GROUP","ABILITY.AEF.AMBULANCE_HEAL_AREA","ABILITY.AEF.ARTILLERY_155MM","ABILITY.AEF.ARTILLERY_SMOKE_BARRAGE","ABILITY.AEF.ASSAULT_ENGINEER_DISPATCH","ABILITY.AEF.BAR_SUPPRESSION_ABILITY","ABILITY.AEF.BAZOOKA_DEPLOY_MP","ABILITY.AEF.BEACON_DISABLE","ABILITY.AEF.CALLIOPE_ROCKET_BARRAGE_MP","ABILITY.AEF.CAPTAIN_SUPERVISE","ABILITY.AEF.CMD_PARATROOPERS_FROM_PATHFINDERS","ABILITY.AEF.COMBAT_ENGINEER_TIMED_DEMO_MP","ABILITY.AEF.COMBINED_ARMS","ABILITY.AEF.DODGE_WC51_DISPATCH","ABILITY.AEF.ELITE_RIFLEMEN","ABILITY.AEF.ELITE_VEHICLE_CREWS","ABILITY.AEF.FATALITY_P47_ROCKET_ATTACK","ABILITY.AEF.FATALITY_PARATROOPERS_PARADROP","ABILITY.AEF.FATALITY_SMOKE_FLARES","ABILITY.AEF.FATALITY_WHITE_PHOSPHOROUS_BARRAGE","ABILITY.AEF.FLANKING_SPEED","ABILITY.AEF.FORWARD_OBSERVERS_ALWAYS_ON","ABILITY.AEF.FORWARD_OBSERVERS_UNLOCK_2","ABILITY.AEF.GREYHOUND_RECON_DISPATCH","ABILITY.AEF.LIEUTENANT_CAPTAIN_ON_ME_AURA_MP","ABILITY.AEF.M1_81MM_MORTAR_TEAM_MORTAR_BARRAGE_MP","ABILITY.AEF.M1_81MM_MORTAR_TEAM_SMOKE_BARRAGE_MP","ABILITY.AEF.M1_81MM_MORTAR_WHITE_PHOSPHOROUS_BARRAGE_ABILITY_MP","ABILITY.AEF.M1_ATGUN_PIERCING_ABILITY","ABILITY.AEF.M1_ATGUN_TAKE_AIM_ABILITY","ABILITY.AEF.M10_APCPC_SHELLS","ABILITY.AEF.M10_APCPC_SHELLS_VET","ABILITY.AEF.M10_DEPLOY","ABILITY.AEF.M15A1_AA_MODE_MP","ABILITY.AEF.M2_60MM_MORTAR_TEAM_MORTAR_BARRAGE_MP","ABILITY.AEF.M2_60MM_MORTAR_TEAM_SMOKE_BARRAGE_MP","ABILITY.AEF.M20_MARK_VEHICLE","ABILITY.AEF.M20_SMOKE","ABILITY.AEF.M21_HEAVY_HE_SHORT_DELAY_MORTAR_BARRAGE_MP","ABILITY.AEF.M21_MORTAR_BARRAGE_MP","ABILITY.AEF.M21_MORTAR_BARRAGE_VICTOR_TARGET_MP","ABILITY.AEF.M21_MORTAR_HALFTRACK_DISPATCH","ABILITY.AEF.M21_MORTAR_WHITE_PHOSPHOROUS_BARRAGE_MP","ABILITY.AEF.M23_SMOKE_STREAM_RIFLE_GRENADE_MP","ABILITY.AEF.M23_SMOKE_STREAM_RIFLE_GRENADE_VET_MP","ABILITY.AEF.M26_PERSHING_DISPATCH","ABILITY.AEF.M2HB_50CAL_AP_ROUNDS_MP","ABILITY.AEF.M2HB_HMG_SPRINT_MP","ABILITY.AEF.M3_HALFTRACK_GROUP","ABILITY.AEF.M3_HALFTRACK_SPEED_BOOST_MP","ABILITY.AEF.M36_M8_CONCEALING_SMOKE_VET","ABILITY.AEF.M5_QUAD_HALFTRACK_DISPATCH","ABILITY.AEF.M5_STUART_DAMAGE_ENGINE","ABILITY.AEF.M5_STUART_SHELL_SHOCK","ABILITY.AEF.M7B1_PRIEST_105MM_BARRAGE_ABILITY_MP","ABILITY.AEF.M7B1_PRIEST_105MM_BARRAGE_ABILITY_VICTOR_TARGET_MP","ABILITY.AEF.M7B1_PRIEST_105MM_SMOKE_BARRAGE_ABILITY_MP","ABILITY.AEF.M8_CANISTER_SHOT","ABILITY.AEF.M8_LAY_HEAVY_MINE","ABILITY.AEF.M8A1_HMC_75MM_BARRAGE_ABILITY_MP","ABILITY.AEF.M8A1_HMC_75MM_BARRAGE_ABILITY_VICTOR_TARGET_MP","ABILITY.AEF.M8A1_HMC_SMOKE_BARRAGE_MP","ABILITY.AEF.MAJOR_ARTILLERY","ABILITY.AEF.MAJOR_ARTILLERY_FAKE","ABILITY.AEF.MAJOR_QUICK_RECON_RUN","ABILITY.AEF.MAJOR_QUICK_RECON_RUN_IMPROVED","ABILITY.AEF.MEDIC_AUTO_HEAL","ABILITY.AEF.MK2_FRAGMENTATION_GRENADE_MP","ABILITY.AEF.OFF_MAP_SMOKE_ARTILLERY","ABILITY.AEF.OFFICER_RETREAT_POINT_MP","ABILITY.AEF.OFFICER_STOP_RETREAT_MP","ABILITY.AEF.OUT_OF_FUEL_SP","ABILITY.AEF.P47_RECON_MP","ABILITY.AEF.P47_ROCKET_ATTACK","ABILITY.AEF.PACK_HOWITZER_75MM_BARRAGE_ABILITY_HEAT_MP","ABILITY.AEF.PACK_HOWITZER_75MM_BARRAGE_ABILITY_MP","ABILITY.AEF.PACK_HOWITZER_75MM_BARRAGE_ABILITY_VET3_MP","ABILITY.AEF.PACK_HOWITZER_75MM_BARRAGE_ABILITY_VICTOR_TARGET_MP","ABILITY.AEF.PACK_HOWITZER_WHITE_PHOSPHOROUS_BARRAGE_ABILITY_MP","ABILITY.AEF.PARADROP_MACHINE_GUN","ABILITY.AEF.PARADROPS_ANTI_TANK_GUN","ABILITY.AEF.PARATROOPER_ASSAULT_MOVE_TEST_MP","ABILITY.AEF.PARATROOPER_MK2_FRAGMENTATION_GRENADE_MP","ABILITY.AEF.PARATROOPER_SUPPRESSING_FIRE_ABILITY_MP","ABILITY.AEF.PARATROOPER_TIMED_DEMO_MP","ABILITY.AEF.PARATROOPERS_PARADROP","ABILITY.AEF.PATHFINDER_ARTILLERY_UNLOCK","ABILITY.AEF.PATHFINDER_IN_COVER_STATIONARY_CAMOUFLAGE_IMPROVED_MP","ABILITY.AEF.PATHFINDER_IN_COVER_STATIONARY_CAMOUFLAGE_MP","ABILITY.AEF.PATHFINDER_PLANT_BEACON","ABILITY.AEF.PATHFINDERS_DISPATCH","ABILITY.AEF.PATHFINDERS_RECON_DISPATCH","ABILITY.AEF.PERSHING_HVAP_PIERCING_SHOT_ABILITY","ABILITY.AEF.PRIEST_ARTILLERY_BARRAGE_CREEPING_MP","ABILITY.AEF.PRIEST_DISPATCH","ABILITY.AEF.RANGER_BUNDLED_GRENADE_MP","ABILITY.AEF.RANGER_LIMITED_DEMO_MP","ABILITY.AEF.RANGER_MK2_FRAGMENTATION_GRENADE_MP","ABILITY.AEF.RANGER_SPRINT_MP","ABILITY.AEF.RANGERS_DISPATCH","ABILITY.AEF.REAR_ECHELON_VOLLEY_FIRE_ABILITY_MP","ABILITY.AEF.RECON_SWEEP","ABILITY.AEF.REFUEL_TANK_SP","ABILITY.AEF.RIFLEMAN_AT_RIFLE_GRENADE_VET","ABILITY.AEF.RIFLEMAN_FIRE_UP","ABILITY.AEF.RIFLEMAN_FIRE_UP_MP","ABILITY.AEF.RIFLEMEN_30_CALIBER_LMG","ABILITY.AEF.RIFLEMEN_DEFENSIVE","ABILITY.AEF.RIFLEMEN_DEFENSIVE_BUILDINGS","ABILITY.AEF.RIFLEMEN_FIRE_FLARES_ABILITY_MP","ABILITY.AEF.RIFLEMEN_FLAMETHROWERS","ABILITY.AEF.RIFLEMEN_FLARES","ABILITY.AEF.SHERMAN_AMMO_SWITCH_AP_SHELL_MP","ABILITY.AEF.SHERMAN_AMMO_SWITCH_HE_SHELL_MP","ABILITY.AEF.SHERMAN_BULLDOZER_CONSTRUCT_BARRIER_MP","ABILITY.AEF.SHERMAN_BULLDOZER_DESTROY_BARRIER_MP","ABILITY.AEF.SHERMAN_BULLDOZER_DISPATCH","ABILITY.AEF.SHERMAN_CALLIOPE_DISPATCH","ABILITY.AEF.SHERMAN_EASY8_DISPATCH","ABILITY.AEF.SIEGE_240MM_BARRAGE","ABILITY.AEF.SMOKE_SHERMAN_MORTAR_BARRAGE_BULLDOZER_MP","ABILITY.AEF.SMOKE_SHERMAN_MORTAR_BARRAGE_MP","ABILITY.AEF.SP_240MM_OFF_MAP_BARRAGE","ABILITY.AEF.SP_QUICK_RECON_RUN","ABILITY.AEF.SUPPORT_ARTILLERY","ABILITY.AEF.SUPPORT_ARTILLERY_DECOY","ABILITY.AEF.TANK_RIDERS_AUTO_UNLOAD_MP","ABILITY.AEF.TIME_ON_TARGET_ARTILLERY","ABILITY.AEF.USF_HOLD_FIRE_MP","ABILITY.AEF.USF_HOLD_FIRE_PACK_HOWITZER_MP","ABILITY.AEF.USF_MEDIC_HEAL_MP","ABILITY.AEF.USF_SHERMAN_BULLDOZER_HOLD_FIRE_MP","ABILITY.AEF.USF_STRAFING_RUN","ABILITY.AEF.USF_VEHICLE_HOLD_FIRE_MP","ABILITY.AEF.VEHICLE_CREW_AUTO_REPAIR","ABILITY.AEF.VEHICLE_DECREW_GENERIC_MP","ABILITY.AEF.VEHICLE_DECREW_M20_CREW_MP","ABILITY.AEF.VEHICLE_DECREW_MEDICS_MP","ABILITY.AEF.VEHICLE_DECREW_VEHICLE_CREW_MP","ABILITY.AEF.WC51_SPEED_BOOST_MP","ABILITY.AEF.WITHDRAW_AND_REFIT","UPG.AEF.ABILITY_LOCK_OUT_CAPTAIN_ABILITIES","UPG.AEF.ABILITY_LOCK_OUT_LIEUTENANT_ABILITIES","UPG.AEF.ABILITY_LOCK_OUT_PARATROOPERS_LANDED","UPG.AEF.ABILITY_REFUEL_LOCKOUT","UPG.AEF.ABILITY_TRANSFER_ORDERS_LOCK_OUT","UPG.AEF.ARTILLERY_155MM","UPG.AEF.ARTILLERY_155MM_BLIND","UPG.AEF.ARTILLERY_WHITE_PHOSPHOROUS","UPG.AEF.ASSAULT_ENGINEER_DISPATCH","UPG.AEF.ASSAULT_ENGINEER_FLAMETHROWER","UPG.AEF.BAR_UPGRADE_MP","UPG.AEF.BAZOOKA_UPGRADE_MP","UPG.AEF.CAPTAIN_BAZOOKA_UPGRADE_MP","UPG.AEF.CAPTAIN_DISPATCHED_UPGRADE_MP","UPG.AEF.COMBINED_ARMS_MP","UPG.AEF.DODGE_WC51_DISPATCH","UPG.AEF.ELITE_RIFLEMEN","UPG.AEF.ELITE_VEHICLE_CREWS","UPG.AEF.FIGHTING_POSITION_MG_ADDITION_MP","UPG.AEF.FIRE_UP_RIFLEMEN","UPG.AEF.FORWARD_OBSERVERS_UNLOCK","UPG.AEF.GREYHOUND_RECON_DISPATCH","UPG.AEF.LIEUTENANT_DISPATCHED_UPGRADE_MP","UPG.AEF.M10_DEPLOY","UPG.AEF.M20_SIDE_SKIRTS_MP","UPG.AEF.M21_MORTAR_HALFTRACK_DISPATCH","UPG.AEF.M26_PERSHING_DISPATCH","UPG.AEF.M3_HALFTRACK_GROUP","UPG.AEF.M3_REPAIR_STATION_MP","UPG.AEF.M5_HALFTRACK_DISPATCH","UPG.AEF.M8_GREYHOUND_SIDE_SKIRTS_MP","UPG.AEF.M8_TOP_GUNNER_MP","UPG.AEF.MAJOR_DISPATCHED_UPGRADE_MP","UPG.AEF.MEDIC_AUTO_HEAL_REFRESH","UPG.AEF.MINESWEEPER_UPGRADE_MP","UPG.AEF.NO_OFFICER_SPAWN_MP","UPG.AEF.OFF_SMOKE_BARRAGE","UPG.AEF.P47_RECON","UPG.AEF.P47_ROCKET_ATTACK","UPG.AEF.PARADROP_ANTI_TANK_GUN","UPG.AEF.PARADROP_MACHINE_GUN","UPG.AEF.PARADROPPED_SUPPORT_DROP","UPG.AEF.PARATROOPER_M1919A6_LMG_MP","UPG.AEF.PARATROOPER_THOMPSON_SUB_MACHINE_GUN_UPGRADE_MP","UPG.AEF.PARATROOPERS","UPG.AEF.PATHFINDERS","UPG.AEF.PATHFINDERS_RECON","UPG.AEF.PRIEST_DISPATCH","UPG.AEF.RANGER_DISPATCH","UPG.AEF.RANGER_THOMPSON_SUB_MACHINE_GUN_UPGRADE_MP","UPG.AEF.REAR_ECHELON_HACK_WITHDRAWING","UPG.AEF.RECON_SWEEP","UPG.AEF.RIFLE_COMMAND_GRENADE_MP","UPG.AEF.RIFLEMEN_30_CALIBER_LMG","UPG.AEF.RIFLEMEN_DEFENSIVE_BUILDINGS","UPG.AEF.RIFLEMEN_FLAMETHROWER","UPG.AEF.RIFLEMEN_FLAMETHROWER_UNLOCK","UPG.AEF.RIFLEMEN_FLARES","UPG.AEF.SHERMAN_BULLDOZER_DISPATCH","UPG.AEF.SHERMAN_EASY8_DISPATCH","UPG.AEF.SHERMAN_HE_ROUNDS","UPG.AEF.SHERMAN_TOP_GUNNER_MP","UPG.AEF.SIEGE_240MM_ARTILLERY","UPG.AEF.SMOKE_BARRAGE","UPG.AEF.T34_SHERMAN_CALLIOPE_DISPATCH","UPG.AEF.TECH_TREE_V1","UPG.AEF.TEMP_SPAWN_BASE_STAMP_MP","UPG.AEF.TIME_ON_TARGET_ARTILLERY","UPG.AEF.TOP_GUNNER_UPGRADED","UPG.AEF.USF_M5_HALFTRACK_72K_AA_GUN_PACKAGE_MP","UPG.AEF.USF_STRAFING_RUN","UPG.AEF.VEHICLE_CREW_THOMPSON_SUB_MACHINE_GUN_UPGRADE_MP","UPG.AEF.WEAPON_RACK_UPGRADE_MP","UPG.AEF.WITHDRAW_AND_REFIT","EBP.BRITISH.AEC_ARMOURED_CAR_MP","EBP.BRITISH.AIR_SUPPORT_OFFICER_MP","EBP.BRITISH.AVRE_VEHICLE_CREW_MP","EBP.BRITISH.BRIT_17_POUNDER_GUN_MP","EBP.BRITISH.BRIT_17_POUNDER_PIT_COMMANDER_MP","EBP.BRITISH.BRIT_17_POUNDER_PIT_MP","EBP.BRITISH.BRIT_25_POUNDER_HOWITZER_MP","EBP.BRITISH.BRIT_25_POUNDER_HOWITZER_TEMP_MP","EBP.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT","EBP.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT_COMMANDER_MP","EBP.BRITISH.BRIT_6_POUNDER_AT_GUN_MP","EBP.BRITISH.BRIT_BARBED_WIRE_FENCE_MP","EBP.BRITISH.BRIT_BOFORS_40MM_AUTOCANNON_COMMANDER_MP","EBP.BRITISH.BRIT_BOFORS_40MM_AUTOCANNON_MP","EBP.BRITISH.BRIT_EMPLACEMENT_SMALL","EBP.BRITISH.BRIT_FORWARD_HQ_COMMANDER_MP","EBP.BRITISH.BRIT_FORWARD_HQ_MP","EBP.BRITISH.BRIT_FWD_HQ_WEAPON_RACK_BREN_LMG_MP","EBP.BRITISH.BRIT_FWD_HQ_WEAPON_RACK_PIAT_LAUNCHER_MP","EBP.BRITISH.BRIT_LAND_MATTRESS_LAUNCHER_MP","EBP.BRITISH.BRIT_MEDIC_EXTRA_ENTITY_MP","EBP.BRITISH.BRIT_MEDIC_WITH_PISTOL_MP","EBP.BRITISH.BRIT_MINE_COMMANDER_MP","EBP.BRITISH.BRIT_MINE_MP","EBP.BRITISH.BRIT_RETREAT_POINT_MP","EBP.BRITISH.BRIT_SANDBAG_FENCE","EBP.BRITISH.BRIT_WEAPON_RACK_BREN_LMG_MP","EBP.BRITISH.BRIT_WEAPON_RACK_PIAT_LAUNCHER_MP","EBP.BRITISH.BRITISH_25LB_HOWITZER_GUN_CREW_MP","EBP.BRITISH.BRITISH_6LB_AT_GUN_CREW_MP","EBP.BRITISH.BRITISH_BASE_STAMPER","EBP.BRITISH.BRITISH_BUILDING_1_MP","EBP.BRITISH.BRITISH_BUILDING_1_UNBUILT_MP","EBP.BRITISH.BRITISH_BUILDING_1_WRECK_MP","EBP.BRITISH.BRITISH_BUILDING_2_MP","EBP.BRITISH.BRITISH_BUILDING_2_UNBUILT_MP","EBP.BRITISH.BRITISH_BUILDING_2_WRECK_MP","EBP.BRITISH.BRITISH_BUNKER_STARTING_POSITION_MP","EBP.BRITISH.BRITISH_HMG_PLANE","EBP.BRITISH.BRITISH_HMG_TEAM_CREW_MP","EBP.BRITISH.BRITISH_HQ_SANDBAGS_01_MP","EBP.BRITISH.BRITISH_HQ_TRUCK_MP","EBP.BRITISH.BRITISH_HQ_TRUCK_WRECK_MP","EBP.BRITISH.BRITISH_LAND_MATTRESS_TEAM_CREW_MP","EBP.BRITISH.BRITISH_MACHINE_GUN_MP","EBP.BRITISH.BRITISH_MORTAR_TEAM_CREW_MP","EBP.BRITISH.BRITISH_RADIO_BEACON","EBP.BRITISH.BRITISH_SANDBAG_FENCE_MP","EBP.BRITISH.CENTAUR_AA_MK2_MP","EBP.BRITISH.CHURCHILL_AVRE_MP","EBP.BRITISH.CHURCHILL_CROCODILE_MP","EBP.BRITISH.CHURCHILL_DEFAULT_MP","EBP.BRITISH.COMET_MP","EBP.BRITISH.COMMANDO_AIR_LANDING_MP","EBP.BRITISH.COMMANDO_MP","EBP.BRITISH.COMMANDO_PIAT_MP","EBP.BRITISH.CROMWELL_MK4_75MM_MP","EBP.BRITISH.FIELD_HOSPITAL_MEDIC_MP","EBP.BRITISH.FORWARD_OBSERVATION_OFFICER_MP","EBP.BRITISH.GLIDER_COMMANDOS_ONLY","EBP.BRITISH.GLIDER_HEADQUARTERS","EBP.BRITISH.HQ_FIELD_ARTILLERY_MP","EBP.BRITISH.INVISIBLE_FLAME_MORTAR_ICON","EBP.BRITISH.M3_HALFTRACK_RESUPPLY_MP","EBP.BRITISH.PARATROOPERS_PLANE_ATGUN_MATT_TEST_MP","EBP.BRITISH.PARATROOPERS_PLANE_VICKERS_MATT_TEST_MP","EBP.BRITISH.RECON_HAWKER_TYPHOON_ASSAULT_MP","EBP.BRITISH.RECON_HAWKER_TYPHOON_MP","EBP.BRITISH.REPAIR_SAPPER_MP","EBP.BRITISH.ROCKET_HAWKER_TYPHOON_MP","EBP.BRITISH.SAPPER_MP","EBP.BRITISH.SAPPER_RECOVERY_MP","EBP.BRITISH.SEXTON_SPG_MP","EBP.BRITISH.SHERMAN_FIREFLY_M4A2_MP","EBP.BRITISH.SLIT_TRENCH_MP","EBP.BRITISH.SNIPER_BRITISH_MP","EBP.BRITISH.SPITFIRE_RECON_PLANE","EBP.BRITISH.STRAFE_HAWKER_TYPHOON_MP","EBP.BRITISH.TOMMY_MP","EBP.BRITISH.TOMMY_RECON_MP","EBP.BRITISH.UNIVERSAL_CARRIER_MP","EBP.BRITISH.UNIVERSAL_CARRIER_RESUPPLY_MP","EBP.BRITISH.VALENTINE_MORTAR","EBP.BRITISH.VALENTINE_OBSERVATION_MP","EBP.BRITISH.VEHICLE_CREW_MP","SBP.BRITISH.AEC_ARMOURED_CAR_SQUAD_MP","SBP.BRITISH.AIR_SUPPORT_OFFICER_SQUAD_MP","SBP.BRITISH.AVRE_VEHICLE_CREW_SQUAD_MP","SBP.BRITISH.BRIT_17_POUNDER_AT_GUN_SQUAD_COMMANDER_MP","SBP.BRITISH.BRIT_17_POUNDER_AT_GUN_SQUAD_MP","SBP.BRITISH.BRIT_25_POUNDER_HOWITZER_SQUAD_MP","SBP.BRITISH.BRIT_25_POUNDER_HOWITZER_SQUAD_TEMP_MP","SBP.BRITISH.BRIT_3_INCH_MORTAR_TEAM_COMMANDER_MP","SBP.BRITISH.BRIT_3_INCH_MORTAR_TEAM_MP","SBP.BRITISH.BRIT_6_POUNDER_AT_GUN_SQUAD_MP","SBP.BRITISH.BRIT_BOFORS_40MM_AUTOCANNON_SQUAD_COMMANDER_MP","SBP.BRITISH.BRIT_BOFORS_40MM_AUTOCANNON_SQUAD_MP","SBP.BRITISH.BRIT_BREN_LMG_WEAPON_RACK_UI_FAKE_MP","SBP.BRITISH.BRIT_FORWARD_HQ_MP","SBP.BRITISH.BRIT_LAND_MATTRESS_LAUNCHER_SQUAD_MP","SBP.BRITISH.BRIT_MEDIC_SQUAD_MP","SBP.BRITISH.BRIT_PIAT_LAUNCHER_WEAPON_RACK_UI_FAKE_MP","SBP.BRITISH.BRITISH_CARGO_PLANE","SBP.BRITISH.BRITISH_HMG_PLANE","SBP.BRITISH.BRITISH_MACHINE_GUN_SQUAD_MP","SBP.BRITISH.CENTAUR_AA_MK2_SQUAD_MP","SBP.BRITISH.CHURCHILL_AVRE_SQUAD_MP","SBP.BRITISH.CHURCHILL_CROCODILE_MP","SBP.BRITISH.CHURCHILL_DEFAULT_SQUAD_MP","SBP.BRITISH.COMET_TANK_SQUAD_MP","SBP.BRITISH.COMMANDO_SQUAD_MP","SBP.BRITISH.COMMANDO_SQUAD_PIAT_MP","SBP.BRITISH.CROMWELL_MK4_75MM_SQUAD_MP","SBP.BRITISH.FORWARD_HQ_MP","SBP.BRITISH.FORWARD_OBSERVATION_SQUAD_MP","SBP.BRITISH.GLIDER_COMMANDOS_ONLY_MP","SBP.BRITISH.GLIDER_HEADQUARTERS_MP","SBP.BRITISH.INFILTRATION_COMMANDO_SQUAD_MP","SBP.BRITISH.M3_HALFTRACK_SQUAD__RESUPPLY_MP","SBP.BRITISH.PARATROOPERS_PLANE_ATGUN_BRITISH_MATT_TEST_MP","SBP.BRITISH.PARATROOPERS_PLANE_VICKERS_BRITISH_MATT_TEST_MP","SBP.BRITISH.RECON_HAWKER_TYPHOON_ASSAULT_MP","SBP.BRITISH.RECON_HAWKER_TYPHOON_MP","SBP.BRITISH.ROCKET_HAWKER_TYPHOON_MP","SBP.BRITISH.SAPPER_SQUAD_DEMOLITION_MP","SBP.BRITISH.SAPPER_SQUAD_MP","SBP.BRITISH.SAPPER_SQUAD_RECOVERY_MP","SBP.BRITISH.SEXTON_SPG_SQUAD_MP","SBP.BRITISH.SHERMAN_FIREFLY_SQUAD_MP","SBP.BRITISH.SNIPER_BRITISH_SQUAD_MP","SBP.BRITISH.SPITFIRE_RECON_PLANE","SBP.BRITISH.STRAFE_HAWKER_TYPHOON_MP","SBP.BRITISH.TOMMY_SQUAD_FLAME_MP","SBP.BRITISH.TOMMY_SQUAD_MP","SBP.BRITISH.TOMMY_SQUAD_RECON_MP","SBP.BRITISH.TOMMY_SQUAD_TANK_HUNTER_MP","SBP.BRITISH.UNIVERSAL_CARRIER_RESUPPLY","SBP.BRITISH.UNIVERSAL_CARRIER_SQUAD_MP","SBP.BRITISH.VALENTINE_MORTAR","SBP.BRITISH.VALENTINE_OBSERVATION_MP","SBP.BRITISH.VEHICLE_CREW_STANDARD_SQUAD_MP","ABILITY.BRITISH.ADVANCED_ASSEMBLY","ABILITY.BRITISH.ADVANCED_COVER_COMBAT","ABILITY.BRITISH.AEC_DEFENSIVE_SMOKE","ABILITY.BRITISH.AEC_TREAD_SHOTS_MP","ABILITY.BRITISH.ALLIED_STRATEGIC_BOMBING","ABILITY.BRITISH.ARTILLERY_COVER","ABILITY.BRITISH.ASSAULT","ABILITY.BRITISH.ASSAULT_GRENADES","ABILITY.BRITISH.AT_GUN_AIRDROP","ABILITY.BRITISH.AVRE_CREW_DEMOLITION_CHARGE_MP","ABILITY.BRITISH.AVRE_CREW_SHRAPNELL_GRENADE_MP","ABILITY.BRITISH.AVRE_SPIGOT_MORTAR_ATTACK_MP","ABILITY.BRITISH.AVRE_SPIGOT_MORTAR_ATTACK_VET_3_MP","ABILITY.BRITISH.AVRE_SPIGOT_MORTAR_RELOAD_MP","ABILITY.BRITISH.AVRE_VEHICLE_DECREW_VEHICLE_CREW_MP","ABILITY.BRITISH.BOFORS_SUPPRESSIVE_BARRAGE_ABILITY_MP","ABILITY.BRITISH.BOFORS_SUPPRESSIVE_BARRAGE_ABILITY_VICTOR_TARGET_MP","ABILITY.BRITISH.BREAKTHROUGH_OPERATION","ABILITY.BRITISH.BRIT_17_POUNDER_FACING_ORDER_MP","ABILITY.BRITISH.BRIT_17_POUNDER_FLARES_ABILITY_MP","ABILITY.BRITISH.BRIT_17_POUNDER_PIERCING_SHELL_ABILITY_MP","ABILITY.BRITISH.BRIT_17_POUNDER_PIERCING_SHELL_ABILITY_VICTOR_TARGET_MP","ABILITY.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT_BARRAGE_MP","ABILITY.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT_BARRAGE_VICTOR_TARGET_MP","ABILITY.BRITISH.BRIT_3_INCH_MORTAR_EMPLACEMENT_SMOKE_BARRAGE_MP","ABILITY.BRITISH.BRIT_6_POUNDER_CRITICAL_SHOT_MP","ABILITY.BRITISH.BRIT_6_POUNDER_RAPID_MANEUVER_MP","ABILITY.BRITISH.BRIT_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.BRITISH.BRIT_BASE_BRACED_STATIC_MP","ABILITY.BRITISH.BRIT_BASE_BUILDING_BRACED_OFF_MP","ABILITY.BRITISH.BRIT_BASE_BUILDING_BRACED_ON_MP","ABILITY.BRITISH.BRIT_EMPLACEMENT_BRACED_MP","ABILITY.BRITISH.BRIT_HQ_ENGINEER_CALL_IN","ABILITY.BRITISH.BRIT_MEDIC_HEAL_MP","ABILITY.BRITISH.BRIT_MEDIC_SQUAD_AUTO_HEAL","ABILITY.BRITISH.BRIT_MEDIC_TOMMY_TIMED_AREA_HEAL_MP","ABILITY.BRITISH.BRIT_MORTAR_EMPLACEMENT_HOLD_FIRE","ABILITY.BRITISH.BRIT_RADAR_SWEEP","ABILITY.BRITISH.BRIT_REPAIR_ABILITY_SAPPERS_MP","ABILITY.BRITISH.BRIT_REPAIR_ABILITY_TOMMYS_MP","ABILITY.BRITISH.BRIT_REPAIR_EWS_ABILITY_SAPPERS_MP","ABILITY.BRITISH.BRIT_SNIPER_DELAYED_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.BRITISH.BRIT_TUNE_UP","ABILITY.BRITISH.BRIT_VEHICLE_HOLD_FIRE_MP","ABILITY.BRITISH.BRITISH_HOLD_THE_LINE","ABILITY.BRITISH.BRITISH_MORTAR_HOLD_FIRE_MP","ABILITY.BRITISH.CENTAUR_20MM_BARRAGE_MP","ABILITY.BRITISH.CENTAUR_AA_MODE_MP","ABILITY.BRITISH.CENTAUR_WEAPON_BURST_MP","ABILITY.BRITISH.CENTAUR_WEAPON_BURST_TEST_MP","ABILITY.BRITISH.CHURCHILL_AVRE","ABILITY.BRITISH.CHURCHILL_CREW_GRENADE_TARGETED","ABILITY.BRITISH.CHURCHILL_CROC_FLAME_BURST_MP","ABILITY.BRITISH.CHURCHILL_CROCODILE","ABILITY.BRITISH.CHURCHILL_INF_SUPPORT_SMOKE","ABILITY.BRITISH.COMET_CREW_GRENADE_TARGETED","ABILITY.BRITISH.COMET_SMOKE_SHELL_SHOT_MP","ABILITY.BRITISH.COMET_SMOKE_SHELL_SHOT_WP_MP","ABILITY.BRITISH.COMMAND_HQ","ABILITY.BRITISH.COMMAND_HQ_HE_ARTILLERY","ABILITY.BRITISH.COMMAND_HQ_RECON_PLANE","ABILITY.BRITISH.COMMAND_HQ_SMOKE_ARTILLERY","ABILITY.BRITISH.COMMAND_HQ_STRAFE_PLANE","ABILITY.BRITISH.COMMAND_VEHICLE","ABILITY.BRITISH.COMMAND_VEHICLE_PLANE","ABILITY.BRITISH.COMMANDO_ASSASSINATE_MP","ABILITY.BRITISH.COMMANDO_DEMO_MP","ABILITY.BRITISH.COMMANDO_INFILTRATION_CAMOUFLAGE_MP","ABILITY.BRITISH.COUNTER_BATTERY","ABILITY.BRITISH.COUNTER_BATTERYS","ABILITY.BRITISH.COVER_SMOKE_GRENADES","ABILITY.BRITISH.CREW_REPAIR","ABILITY.BRITISH.CREW_REPAIR_OPERATION","ABILITY.BRITISH.CROMWELL_SMOKE_SHELL_SHOT_MP","ABILITY.BRITISH.DEFENSIVE_OPERATIONS","ABILITY.BRITISH.DESTROY_COVER_MP","ABILITY.BRITISH.DIRECT_BARRAGE","ABILITY.BRITISH.EARLY_WARNING","ABILITY.BRITISH.ENGINEER_COVER_COMBAT_BONUS","ABILITY.BRITISH.FATALITY_BURN_THEM_OUT","ABILITY.BRITISH.FATALITY_MIGHT_OF_THE_AIR_FORCES","ABILITY.BRITISH.FATALITY_ZEROING_STRIKE","ABILITY.BRITISH.FIELD_RECOVERY","ABILITY.BRITISH.FIRE_SUPPORT_TEAM","ABILITY.BRITISH.FIREFLY_TULIP_ROCKET_BARRAGE_MP","ABILITY.BRITISH.FIREFLY_TULIP_ROCKET_BARRAGE_SKILL_SHOT_MP","ABILITY.BRITISH.FORTIFY_OUR_POSITION","ABILITY.BRITISH.FORWARD_HQ_RETREAT_POINT_GLIDER_MP","ABILITY.BRITISH.FORWARD_HQ_RETREAT_POINT_MP","ABILITY.BRITISH.GLIDER_COMMANDOS_ONLY","ABILITY.BRITISH.GLIDER_HEADQUARTERS","ABILITY.BRITISH.GLIDER_RETREAT_POINT_MP","ABILITY.BRITISH.HOWITZER_COUNTER_BARRAGE_ATTACK_COMMANDER_MP","ABILITY.BRITISH.HOWITZER_COUNTER_BARRAGE_COMMANDER_MP","ABILITY.BRITISH.HQ_BUILD_ANVIL_1_MP","ABILITY.BRITISH.HQ_BUILD_ANVIL_2_MP","ABILITY.BRITISH.IMPROVED_FORTIFCATIONS","ABILITY.BRITISH.INFANTRY_RECON_TACTICS","ABILITY.BRITISH.INFANTRY_SMOKE_GRENADE_RESPOSITION","ABILITY.BRITISH.INFILTRATION_COMMANDOS","ABILITY.BRITISH.LAND_MATTRESS","ABILITY.BRITISH.LAND_MATTRESS_25LB_ROCKET","ABILITY.BRITISH.LAND_MATTRESS_60LB_ROCKET","ABILITY.BRITISH.LAND_MATTRESS_BARRAGE","ABILITY.BRITISH.LAND_MATTRESS_BARRAGE_SMOKE","ABILITY.BRITISH.LAND_MATTRESS_BARRAGE_VICTOR_TARGET_MP","ABILITY.BRITISH.LAND_MATTRESS_FIRE_ALL","ABILITY.BRITISH.LAND_MATTRESS_LOAD_ROCKETS_MP","ABILITY.BRITISH.LAND_MATTRESS_PHOSPHORUS_ROCKET","ABILITY.BRITISH.MEDIC_AUTO_HEAL_MP","ABILITY.BRITISH.MORTAR_ARTILLERY","ABILITY.BRITISH.MORTAR_FIRE_ARTILLERY","ABILITY.BRITISH.MORTAR_PIT_COUNTER_BATTERY_MP","ABILITY.BRITISH.OBSERVATION_MODE","ABILITY.BRITISH.OBSERVATION_VALENTINE","ABILITY.BRITISH.OFFICER_ARTILLERY","ABILITY.BRITISH.OFFICER_ARTILLERY_SEXTON_VICTOR_TARGET_AIRBURST_BARRAGE_MP","ABILITY.BRITISH.OFFICER_ARTILLERY_SEXTON_VICTOR_TARGET_CONCENTRATION_BARRAGE_MP","ABILITY.BRITISH.OFFICER_CHARGE_MP","ABILITY.BRITISH.OFFICER_RECON_SWEEP","ABILITY.BRITISH.PASSIVE_17_POUNDER_EMPLACEMENT_MP","ABILITY.BRITISH.PASSIVE_BOFORS_EMPLACEMENT_MP","ABILITY.BRITISH.PASSIVE_MORTAR_EMPLACEMENT_MP","ABILITY.BRITISH.PEPPER_POT","ABILITY.BRITISH.PERCISION_BARRAGE","ABILITY.BRITISH.PIAT_DEPLOY_MP","ABILITY.BRITISH.QF_25_PDR_FLARE_BARRAGE_ABILITY_MP","ABILITY.BRITISH.QF_25LB_ANTITANK_ABILITY_BASE_MP","ABILITY.BRITISH.QF_25LB_ANTITANK_ABILITY_MP","ABILITY.BRITISH.QF_25LB_BARRAGE_ABILITY_BASE_MP","ABILITY.BRITISH.QF_25LB_BARRAGE_ABILITY_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_BASE_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_BASE_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_FWD_HQ_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_OFFICER_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_SNIPER_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_FIRE_ORDER_VALENTINE_MP","ABILITY.BRITISH.QF_25LB_COORDINATED_SMOKE_SCREEN_BASE_MATT_TEST_VICTOR_TARGET_MP","ABILITY.BRITISH.QF_25LB_CREEPING_SMOKE_BARRAGE_ABILITY_BASE_MP","ABILITY.BRITISH.QF_25LB_CREEPING_SMOKE_BARRAGE_ABILITY_MP","ABILITY.BRITISH.QF_25LB_DIRECT_BARRAGE_BASE_MP","ABILITY.BRITISH.QF_25LB_OVERWATCH_BASE_MP","ABILITY.BRITISH.QF_25LB_RAPID_RESPONSE_BARRAGE_BASE_MP","ABILITY.BRITISH.QF_25LB_RAPID_RESPONSE_BARRAGE_MP","ABILITY.BRITISH.QF_25LB_SMOKE_SCREEN_BASE_MP","ABILITY.BRITISH.RAPID_ADVANCE","ABILITY.BRITISH.RAPID_RESPONSE_ARTILLERY","ABILITY.BRITISH.RECON_SECTION_SPRINT_MP","ABILITY.BRITISH.REINFORCE_THE_FRONT","ABILITY.BRITISH.REINFORCED_STRUCTURES","ABILITY.BRITISH.SAPPER_ANVIL_BOOBY_TRAP","ABILITY.BRITISH.SAPPER_FLAMETHROWERS","ABILITY.BRITISH.SAPPER_GAMMON_BOMB_MEDIUM_MP","ABILITY.BRITISH.SAPPER_SALVAGE_WRECK","ABILITY.BRITISH.SEXTON_ARTILLERY_BARRAGE_CREEPING_VICTOR_TARGET_MP","ABILITY.BRITISH.SEXTON_DISPATCH_BRITISH","ABILITY.BRITISH.SEXTON_SPG_25_CONCENTRATION_BARRAGE_MP","ABILITY.BRITISH.SEXTON_SPG_25_PDR_ARTILLERY_CREEPING_BARRAGE_MP","ABILITY.BRITISH.SEXTON_SPG_25_PDR_BARRAGE_ABILITY_MP","ABILITY.BRITISH.SEXTON_SPG_25_PDR_SUPERCHARGE_AIRBURST_BARRAGE_ABILITY_MP","ABILITY.BRITISH.SEXTON_SPG_25_PDR_SUPERCHARGE_BARRAGE_ABILITY_MP","ABILITY.BRITISH.SMOKE_ASSAULT","ABILITY.BRITISH.SNIPER_BOYS_ANTI_TANK_CRITICAL_SHOT_MP","ABILITY.BRITISH.STAND_FAST","ABILITY.BRITISH.STRAFING_RUN","ABILITY.BRITISH.SUPER_OVERWATCH_TEST","ABILITY.BRITISH.TANK_HUNTER","ABILITY.BRITISH.TOMMY_COVER_COMBAT_BONUS","ABILITY.BRITISH.TOMMY_GAMMON_BOMB_HEAVY_MP","ABILITY.BRITISH.TOMMY_GAMMON_BOMB_MEDIUM_MP","ABILITY.BRITISH.TOMMY_HEAT_GRENADE_MP","ABILITY.BRITISH.TOMMY_MILLS_BOMB_MP","ABILITY.BRITISH.TOMMY_OFFICER_ARTILLERY","ABILITY.BRITISH.TOMMY_STAND_YOUR_GROUND","ABILITY.BRITISH.TUNE_UP_BONUS_MP","ABILITY.BRITISH.UEC_SELF_REPAIR","ABILITY.BRITISH.UEC_SELF_REPAIR_IMPROVED","ABILITY.BRITISH.UNIVERSAL_CARRIER_DROP_LMG","ABILITY.BRITISH.UNIVERSAL_CARRIER_DROP_PIAT","ABILITY.BRITISH.UNIVERSAL_CARRIER_VICKERS_SUPPRESSION_MP","ABILITY.BRITISH.VALENTINE_ARTILLERY_SEXTON_VICTOR_TARGET_CONCENTRATION_BARRAGE_MP","ABILITY.BRITISH.VALENTINE_SMOKE_BARRAGE_MP","ABILITY.BRITISH.VICKERS_AIRDROP","ABILITY.BRITISH.VICKERS_HMG_VET_1_BONUS","UPG.BRITISH.ABILITY_LOCK_OUT_17_POUNDER_ABILITY_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_AVRE_NOT_RELOADED","UPG.BRITISH.ABILITY_LOCK_OUT_AVRE_RELOADING","UPG.BRITISH.ABILITY_LOCK_OUT_BASE_ARTILLERY_COUNTER_BARRAGE_ABILITY_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_BASE_ARTILLERY_OVERWATCH_ABILITY_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_BOFORS_EMPLACEMENT_AA_MODE_ENABLED","UPG.BRITISH.ABILITY_LOCK_OUT_BOFORS_EMPLACEMENT_BARRAGE_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_GLIDER_CUSTOM_LOADOUT_LAUNCH_AVAILABLE","UPG.BRITISH.ABILITY_LOCK_OUT_GLIDER_HARD_LANDED","UPG.BRITISH.ABILITY_LOCK_OUT_GLIDER_NOT_STOPPED","UPG.BRITISH.ABILITY_LOCK_OUT_MORTAR_EMPLACEMENT_BARRAGE_ACTIVE","UPG.BRITISH.ABILITY_LOCK_OUT_MORTAR_EMPLACEMENT_SLOT_1_DEFAULT_LOADED","UPG.BRITISH.ABILITY_LOCK_OUT_MORTAR_EMPLACEMENT_SLOT_1_SPECIAL_1_LOADED","UPG.BRITISH.ABILITY_LOCK_OUT_MORTAR_EMPLACEMENT_SLOT_1_SPECIAL_2_LOADED","UPG.BRITISH.ADVANCED_ASSEMBLY","UPG.BRITISH.ADVANCED_ASSEMBLY_RESEARCH","UPG.BRITISH.ADVANCED_COVER","UPG.BRITISH.AEC_HE_ROUNDS_MP","UPG.BRITISH.AEC_HE_ROUNDS_UNLOCK_MP","UPG.BRITISH.AEC_RAPID_FIRE_MP","UPG.BRITISH.AEC_TARGET_OPTICS_MP","UPG.BRITISH.AEC_TARGET_TURRET_MP","UPG.BRITISH.AEC_TREAD_FIRST_SHOT_MP","UPG.BRITISH.AEC_TREAD_SECOND_SHOT_MP","UPG.BRITISH.ARTY_PIT_LOCKOUT_UPGRADE","UPG.BRITISH.ASSAULT","UPG.BRITISH.ASSAULT_ACTIVE","UPG.BRITISH.AVRE_MORTAR_RELOAD","UPG.BRITISH.BASE_BUILDING_BRACED_MP","UPG.BRITISH.BOYS_AT_RIFLE","UPG.BRITISH.BREN_LMG_UNLOCK_MP","UPG.BRITISH.BRITISH_TANK_COMMANDER","UPG.BRITISH.CAN_TUNE_UP_MP","UPG.BRITISH.COMMAND_HQ","UPG.BRITISH.COMMAND_VEHICLE","UPG.BRITISH.COMMAND_VEHICLE_ACTIVE","UPG.BRITISH.COMMAND_VEHICLE_ACTIVE_PLAYER","UPG.BRITISH.COMMANDO_RETREAT_SMOKE_DELAY","UPG.BRITISH.COMPANY_ANVIL_BUILDING_MP","UPG.BRITISH.COMPANY_ANVIL_MP","UPG.BRITISH.COMPANY_ANVIL_POINT_SIGHT_MP","UPG.BRITISH.COMPANY_HAMMER_BUILDING_MP","UPG.BRITISH.COMPANY_HAMMER_MP","UPG.BRITISH.COUNTER_BATTERY","UPG.BRITISH.COUNTER_BATTERY_MP","UPG.BRITISH.DEFENSIVE_OPERATIONS","UPG.BRITISH.EMPLACEMENT_DEACTIVATE_BRACE_DELAY","UPG.BRITISH.FIREFLY_TULIP_RELOAD","UPG.BRITISH.FIREFLY_TULIP_ROCKET","UPG.BRITISH.FLAMETHROWERS","UPG.BRITISH.FWD_HQ_RETREAT_MP","UPG.BRITISH.IMPROVED_FORTIFCATION","UPG.BRITISH.IMPROVED_FORTIFCATION_ASSSEMBLY_SQUAD","UPG.BRITISH.IMPROVED_FORTIFCATION_SQUAD","UPG.BRITISH.INFILTRATION_COMMANDOS","UPG.BRITISH.LAND_MATTRESS_FIRING","UPG.BRITISH.LAND_MATTRESS_LOADED_ROCKET","UPG.BRITISH.LAND_MATTRESS_LOADING_25LB_ROCKET","UPG.BRITISH.LAND_MATTRESS_LOADING_60LB_ROCKET","UPG.BRITISH.LAND_MATTRESS_LOADING_PHOS_ROCKET","UPG.BRITISH.PIAT","UPG.BRITISH.PIAT_UNLOCK_MP","UPG.BRITISH.PLATOON_AEC_RESEARCH_BUILDING_MP","UPG.BRITISH.PLATOON_AEC_RESEARCH_MP","UPG.BRITISH.PLATOON_BOFORS_RESEARCH_BUILDING_MP","UPG.BRITISH.PLATOON_BOFORS_RESEARCH_MP","UPG.BRITISH.PRECISION_BARRAGE","UPG.BRITISH.QF_25LB_COORDINATED_FIRE_MP","UPG.BRITISH.QF_25LB_COUNTER_BATTERY_MP","UPG.BRITISH.QF_25LB_FIRE_SUPPORT_BASE_MP","UPG.BRITISH.QF_25LB_FIRE_SUPPORT_MP","UPG.BRITISH.QF_25LB_HE_SHELL_MP","UPG.BRITISH.QF_25LB_RAPID_RESPONSE_DELAY_MP","UPG.BRITISH.QF_25LB_RAPID_RESPONSE_MP","UPG.BRITISH.QF_25LB_SHELL_TOGGLE_ABILITY_DELAY_MP","UPG.BRITISH.QF_25LB_TACTICAL_SUPPORT_BASE_MP","UPG.BRITISH.QF_25LB_TACTICAL_SUPPORT_MP","UPG.BRITISH.QF_25LB_TARGET_ACQUISITION_MP","UPG.BRITISH.REINFORCED_STRUCTURE","UPG.BRITISH.SAPPER_FLAMETHROWER","UPG.BRITISH.SAPPERS_HEAVY_SQUAD_MP","UPG.BRITISH.SAPPERS_MINESWEEPER_UPGRADE_MP","UPG.BRITISH.SNIPER_BOYS_AT_RIFLE","UPG.BRITISH.TANK_HUNTER_ACTIVE","UPG.BRITISH.TECH_STRUCTURE_1_CONSTRUCT_MP","UPG.BRITISH.TECH_STRUCTURE_1_MP","UPG.BRITISH.TECH_STRUCTURE_2_CONSTRUCT_MP","UPG.BRITISH.TECH_STRUCTURE_2_MP","UPG.BRITISH.TOMMY_BOYS_AT_RIFLES","UPG.BRITISH.TOMMY_INCREASED_SQUAD_SIZE_MP","UPG.BRITISH.TOMMY_MEDICAL_SUPPLIES","UPG.BRITISH.TOMMY_MILLS_BOMB_MP","UPG.BRITISH.TOMMY_PYROTECHNICS_SUPPLIES","UPG.BRITISH.UNIVERSAL_CARRIER_VICKERS_K_PACKAGE_UPGRADE_MP","UPG.BRITISH.UNIVERSAL_CARRIER_WASP_PACKAGE_UPGRADE_MP","UPG.BRITISH.VALENTINE_OBSERVATION_MODE_MP","UPG.BRITISH.WEAPON_RACK_UNLOCK_MP","EBP.GERMAN.ANTITANK_88MM_PAK43_SANDBAGS","EBP.GERMAN.ARMORED_CAR_SDKFZ_222","EBP.GERMAN.ARMORED_CAR_SDKFZ_222_MP","EBP.GERMAN.ASSAULT_GRENADIERS_LEADER_MP","EBP.GERMAN.ASSAULT_GRENADIERS_MP","EBP.GERMAN.ASSAULT_OFFICER","EBP.GERMAN.ASSAULT_OFFICER_GRENADIERS_BODYGUARD_MP","EBP.GERMAN.ASSAULT_OFFICER_MP","EBP.GERMAN.ATGUN_CREW","EBP.GERMAN.ATGUN_CREW_MP","EBP.GERMAN.ATGUN88_CREW","EBP.GERMAN.ATGUN88_CREW_MP","EBP.GERMAN.AXIS_BUNKER_STARTING_POSITION","EBP.GERMAN.AXIS_BUNKER_STARTING_POSITION_MP","EBP.GERMAN.BEREICH_FESTUNG","EBP.GERMAN.BEREICH_FESTUNG_MP","EBP.GERMAN.BRUMMBAR_STURMPANZER_IV_SDKFZ_166","EBP.GERMAN.BRUMMBAR_STURMPANZER_IV_SDKFZ_166_MP","EBP.GERMAN.BUNKER","EBP.GERMAN.BUNKER_MP","EBP.GERMAN.BUNKER_OF_DEATH_MP","EBP.GERMAN.CARGO_PLANE","EBP.GERMAN.CARGO_PLANE_1","EBP.GERMAN.CARGO_PLANE_FUEL","EBP.GERMAN.CARGO_PLANE_MUNITIONS","EBP.GERMAN.DOLCH_AKTIONEN","EBP.GERMAN.DOLCH_AKTIONEN_MP","EBP.GERMAN.ELEFANT_SDKFZ_184","EBP.GERMAN.ELEFANT_SDKFZ_184_MP","EBP.GERMAN.FUEL_POST_GERMAN","EBP.GERMAN.FUEL_POST_GERMAN_MP","EBP.GERMAN.GERMAN_BASE_STAMPER","EBP.GERMAN.GERMAN_HQ","EBP.GERMAN.GERMAN_HQ_MP","EBP.GERMAN.GERMAN_HQ_WRECK","EBP.GERMAN.GERMAN_HQ_WRECK_MP","EBP.GERMAN.GERMAN_MEDIC","EBP.GERMAN.GERMAN_MEDIC_MP","EBP.GERMAN.GERMAN_MINE","EBP.GERMAN.GERMAN_MINE_MP","EBP.GERMAN.GERMAN_SANDBAG_FENCE","EBP.GERMAN.GRANATEWERFER_34_81MM_MORTAR","EBP.GERMAN.GRANATEWERFER_34_81MM_MORTAR_MP","EBP.GERMAN.GRENADIERS","EBP.GERMAN.GRENADIERS_MP","EBP.GERMAN.GRENADIERS_SP","EBP.GERMAN.HACK_INVISI_PIONEER_MP","EBP.GERMAN.HALFTRACK_RIEGEL_43_MINE_MP","EBP.GERMAN.HALFTRACK_SDKFZ_251","EBP.GERMAN.HALFTRACK_SDKFZ_251_MP","EBP.GERMAN.HINTERE_PANZERWERK","EBP.GERMAN.HINTERE_PANZERWERK_MP","EBP.GERMAN.HINTERE_PANZERWERK_VORONEZH","EBP.GERMAN.HOWITZER_105MM_DUMMY","EBP.GERMAN.HOWITZER_105MM_LE_FH18","EBP.GERMAN.HOWITZER_105MM_LE_FH18_MP","EBP.GERMAN.HOWITZER_CREW","EBP.GERMAN.HOWITZER_CREW_MP","EBP.GERMAN.HULLDOWN_SANDBAG_WALL","EBP.GERMAN.HULLDOWN_SANDBAG_WALL_MP","EBP.GERMAN.INVISIBLE_RETREAT_POINT","EBP.GERMAN.LUFTWAFFE_OFFICER_TOW","EBP.GERMAN.M01_STUKA_DOGFIGHT","EBP.GERMAN.M01_STUKA_GROUND_ATTACK_FAST","EBP.GERMAN.MECHANIZED_250_HALFTRACK_GRENADIER_MP","EBP.GERMAN.MECHANIZED_250_HALFTRACK_MP","EBP.GERMAN.MG42_CREW","EBP.GERMAN.MG42_CREW_MP","EBP.GERMAN.MG42_CREW_SINGLE","EBP.GERMAN.MG42_HMG","EBP.GERMAN.MG42_HMG_ATTACK_GROUND","EBP.GERMAN.MG42_HMG_MP","EBP.GERMAN.MINE_FIELD","EBP.GERMAN.MINE_FIELD_BORDER","EBP.GERMAN.MINE_FIELD_BORDER_MP","EBP.GERMAN.MINE_FIELD_MINE","EBP.GERMAN.MINE_FIELD_MINE_M03","EBP.GERMAN.MINE_FIELD_MINE_MP","EBP.GERMAN.MINE_FIELD_MINE_TOW","EBP.GERMAN.MINE_FIELD_MP","EBP.GERMAN.MORTAR_CREW","EBP.GERMAN.MORTAR_CREW_MP","EBP.GERMAN.MORTAR_LIGHT_HALFTRACK_250_7","EBP.GERMAN.MORTAR_LIGHT_HALFTRACK_250_7_MP","EBP.GERMAN.MUNITION_POST_GERMAN","EBP.GERMAN.MUNITION_POST_GERMAN_MP","EBP.GERMAN.OFFICER","EBP.GERMAN.OFFICER_MP","EBP.GERMAN.OFFICER_TOW_OCCUPATION","EBP.GERMAN.OPEL_BLITZ_SUPPLY_TRUCK_MP","EBP.GERMAN.OPEL_BLITZ_TRUCK","EBP.GERMAN.OSTRUPPEN_SOLDIER","EBP.GERMAN.OSTRUPPEN_SOLDIER_MP","EBP.GERMAN.OSTWIND_FLAK_PANZER","EBP.GERMAN.OSTWIND_FLAK_PANZER_MP","EBP.GERMAN.PAK40_75MM_AT_GUN","EBP.GERMAN.PAK40_75MM_AT_GUN_MP","EBP.GERMAN.PAK43_88MM_AT_GUN","EBP.GERMAN.PAK43_88MM_AT_GUN_MP","EBP.GERMAN.PANTHER_SDKFZ_171","EBP.GERMAN.PANTHER_SDKFZ_171_MP","EBP.GERMAN.PANZER_GRENADIERS","EBP.GERMAN.PANZER_GRENADIERS_MP","EBP.GERMAN.PANZER_III_MP","EBP.GERMAN.PANZER_IV_COMMANDER_SDKFZ_161","EBP.GERMAN.PANZER_IV_COMMANDER_SDKFZ_161_MP","EBP.GERMAN.PANZER_IV_SDKFZ_161","EBP.GERMAN.PANZER_IV_SDKFZ_161_MP","EBP.GERMAN.PANZER_IV_SDKFZ_161_TUTORIAL","EBP.GERMAN.PANZER_IV_SDKFZ_AUSF1","EBP.GERMAN.PANZER_IV_SDKFZ_AUSF1_MP","EBP.GERMAN.PANZER_MG","EBP.GERMAN.PANZERWERFER_SDKFZ_4_1","EBP.GERMAN.PANZERWERFER_SDKFZ_4_1_MP","EBP.GERMAN.PARADROP_SNIPER_SOLDIER_MP","EBP.GERMAN.PIONEER","EBP.GERMAN.PIONEER_MP","EBP.GERMAN.PUMA_EAST_GERMAN","EBP.GERMAN.REPAIR_PIONEER","EBP.GERMAN.REPAIR_PIONEER_MP","EBP.GERMAN.RIEGEL_43_MINE","EBP.GERMAN.RIEGEL_43_MINE_MP","EBP.GERMAN.SCHWERES_KRIEGSWERK","EBP.GERMAN.SCHWERES_KRIEGSWERK_MP","EBP.GERMAN.SDKFZ_221_LIGHT_AT_HALFTRACK","EBP.GERMAN.SLIT_TRENCH_GERMAN","EBP.GERMAN.SLIT_TRENCH_GERMAN_MP","EBP.GERMAN.SNIPER_COVER","EBP.GERMAN.SNIPER_DIGIN_COVER_MP","EBP.GERMAN.SNIPER_SOLDIER","EBP.GERMAN.SNIPER_SOLDIER_MP","EBP.GERMAN.STORMTROOPERS_MP","EBP.GERMAN.STUG_III_E_SDKFZ_141_1","EBP.GERMAN.STUG_III_E_SDKFZ_141_1_COMMANDER_MP","EBP.GERMAN.STUG_III_E_SDKFZ_141_1_MP","EBP.GERMAN.STUG_III_G_SDKFZ_141_1","EBP.GERMAN.STUG_III_G_SDKFZ_141_1_MP","EBP.GERMAN.STUKA_AIR_RECON","EBP.GERMAN.STUKA_AIR_RECON_MP","EBP.GERMAN.STUKA_BOMBING_DIVE","EBP.GERMAN.STUKA_BOMBING_DIVE_MP","EBP.GERMAN.STUKA_BOMBING_RUN_SP","EBP.GERMAN.STUKA_FRAGEMENTATION_BOMB","EBP.GERMAN.STUKA_FRAGEMENTATION_BOMB_MP","EBP.GERMAN.STUKA_GROUND_ATTACK","EBP.GERMAN.STUKA_GROUND_ATTACK_LONG","EBP.GERMAN.STUKA_GROUND_ATTACK_M09","EBP.GERMAN.STUKA_GROUND_ATTACK_MP","EBP.GERMAN.STUKA_GROUND_ATTACK_WEST_AIRBORNE_ASSAULT","EBP.GERMAN.STUKA_INCENDIARY_BOMB","EBP.GERMAN.STUKA_INCENDIARY_BOMB_VICTORY","EBP.GERMAN.STUKA_JU87_ANTI_TANK","EBP.GERMAN.STUKA_JU87_ANTI_TANK_M06","EBP.GERMAN.STUKA_JU87_ANTI_TANK_MP","EBP.GERMAN.STUKA_JU87_ANTI_TANK_SUPERIORITY","EBP.GERMAN.STUKA_SMOKE_BOMB","EBP.GERMAN.STUKA_SMOKE_BOMB_MP","EBP.GERMAN.SUPPLY_TRUCK_METAL_M_01","EBP.GERMAN.SUPPLY_TRUCK_METAL_M_02","EBP.GERMAN.SUPPLY_TRUCK_MUNITIONS_CASE_AX_01","EBP.GERMAN.SUPPLY_TRUCK_MUNITIONS_CASE_AX_03","EBP.GERMAN.SUPPLY_TRUCK_SANDBAG_PILE_02","EBP.GERMAN.TACTICAL_BOMBER","EBP.GERMAN.TACTICAL_BOMBER_ACCURATE","EBP.GERMAN.TANK_TRAP","EBP.GERMAN.TELLER_MINE_MP","EBP.GERMAN.TIER1_MARKER","EBP.GERMAN.TIER2_MARKER","EBP.GERMAN.TIER3_MARKER","EBP.GERMAN.TIER4_MARKER","EBP.GERMAN.TIGER_ACE_SDKFZ_181_MP","EBP.GERMAN.TIGER_SDKFZ_181","EBP.GERMAN.TIGER_SDKFZ_181_MP","EBP.GERMAN.TIGER_SDKFZ_181_SINGLEPLAYER_MISSION","EBP.GERMAN.TIGER_SDKFZ_181_TOW","EBP.GERMAN.URBAN_ASSAULT_PANZER_GRENADIERS_MP","SBP.GERMAN.ASSAULT_GRENADIER_SQUAD_MP","SBP.GERMAN.ASSAULT_OFFICER_SQUAD","SBP.GERMAN.ASSAULT_OFFICER_SQUAD_MP","SBP.GERMAN.BRUMMBAR_SQUAD","SBP.GERMAN.BRUMMBAR_SQUAD_MP","SBP.GERMAN.CARGO_PLANE","SBP.GERMAN.CARGO_PLANE_FUEL","SBP.GERMAN.CARGO_PLANE_MUNITIONS","SBP.GERMAN.COMMAND_OFFICER_SQUAD_TOW","SBP.GERMAN.CONVOY_PIONEER_SQUAD","SBP.GERMAN.ELEFANT_TANK_DESTROYER_SQUAD","SBP.GERMAN.ELEFANT_TANK_DESTROYER_SQUAD_MP","SBP.GERMAN.GRENADIER_SQUAD","SBP.GERMAN.GRENADIER_SQUAD_M14","SBP.GERMAN.GRENADIER_SQUAD_MG42LMG_MP","SBP.GERMAN.GRENADIER_SQUAD_MP","SBP.GERMAN.GRENADIER_SQUAD_SP","SBP.GERMAN.HACK_INVISI_PIONEER_SQUAD_MP","SBP.GERMAN.HOWITZER_105MM_DUMMY_SQUAD","SBP.GERMAN.HOWITZER_105MM_LE_FH18_ARTILLERY","SBP.GERMAN.HOWITZER_105MM_LE_FH18_ARTILLERY_MP","SBP.GERMAN.LUFTWAFFE_OFFICER_SQUAD_TOW","SBP.GERMAN.M01_MG42_HEAVY_MACHINE_GUN_SQUAD_SINGLE","SBP.GERMAN.M01_STUKA_DOGFIGHT","SBP.GERMAN.M01_STUKA_GROUND_ATTACK_SQUAD_FAST","SBP.GERMAN.MECHANIZED_250_HALFTRACK_GRENADIERS_MP","SBP.GERMAN.MECHANIZED_250_HALFTRACK_MP","SBP.GERMAN.MECHANIZED_250_HALFTRACK_TOW","SBP.GERMAN.MG42_HEAVY_MACHINE_GUN_SQUAD","SBP.GERMAN.MG42_HEAVY_MACHINE_GUN_SQUAD_MP","SBP.GERMAN.MORTAR_250_HALFTRACK_SQUAD","SBP.GERMAN.MORTAR_250_HALFTRACK_SQUAD_MP","SBP.GERMAN.MORTAR_TEAM_81MM","SBP.GERMAN.MORTAR_TEAM_81MM_MP","SBP.GERMAN.OFFICER_SQUAD","SBP.GERMAN.OFFICER_SQUAD_MP","SBP.GERMAN.OPEL_BLITZ_SQUAD","SBP.GERMAN.OPEL_BLITZ_SUPPLY_SQUAD","SBP.GERMAN.OSTRUPPEN_SQUAD","SBP.GERMAN.OSTRUPPEN_SQUAD_M14","SBP.GERMAN.OSTRUPPEN_SQUAD_MP","SBP.GERMAN.OSTRUPPEN_SQUAD_RESERVES_MP","SBP.GERMAN.OSTWIND_SQUAD","SBP.GERMAN.OSTWIND_SQUAD_MP","SBP.GERMAN.PAK40_75MM_AT_GUN_SQUAD","SBP.GERMAN.PAK40_75MM_AT_GUN_SQUAD_MP","SBP.GERMAN.PAK43_88MM_AT_GUN_SQUAD","SBP.GERMAN.PAK43_88MM_AT_GUN_SQUAD_MP","SBP.GERMAN.PANTHER_SQUAD","SBP.GERMAN.PANTHER_SQUAD_MP","SBP.GERMAN.PANZER_GRENADIER_SQUAD","SBP.GERMAN.PANZER_GRENADIER_SQUAD_M14","SBP.GERMAN.PANZER_GRENADIER_SQUAD_MP","SBP.GERMAN.PANZER_IV_COMMAND_SQUAD","SBP.GERMAN.PANZER_IV_COMMAND_SQUAD_MP","SBP.GERMAN.PANZER_IV_SQUAD","SBP.GERMAN.PANZER_IV_SQUAD_MP","SBP.GERMAN.PANZER_IV_SQUAD_TUTORIAL","SBP.GERMAN.PANZER_IV_STUBBY_SQUAD","SBP.GERMAN.PANZER_IV_STUBBY_SQUAD_MP","SBP.GERMAN.PANZER_MG_SQUAD","SBP.GERMAN.PANZERWERFER_SQUAD","SBP.GERMAN.PANZERWERFER_SQUAD_MP","SBP.GERMAN.PARTISAN_SQUAD_M13","SBP.GERMAN.PIONEER_SQUAD","SBP.GERMAN.PIONEER_SQUAD_MP","SBP.GERMAN.PIONEER_SQUAD_TOW","SBP.GERMAN.PUMA_EAST_GERMAN_MP","SBP.GERMAN.SCOUTCAR_SDKFZ222","SBP.GERMAN.SCOUTCAR_SDKFZ222_MP","SBP.GERMAN.SDKFZ_221_LIGHT_AT_HALFTRACK","SBP.GERMAN.SDKFZ_251_HALFTRACK_SQUAD","SBP.GERMAN.SDKFZ_251_HALFTRACK_SQUAD_MP","SBP.GERMAN.SNIPER_SQUAD","SBP.GERMAN.SNIPER_SQUAD_MP","SBP.GERMAN.STORMTROOPER_SQUAD_MP","SBP.GERMAN.STUG_III_E_COMMANDER_SQUAD_MP","SBP.GERMAN.STUG_III_E_SQUAD","SBP.GERMAN.STUG_III_E_SQUAD_MP","SBP.GERMAN.STUG_III_SQUAD","SBP.GERMAN.STUG_III_SQUAD_MP","SBP.GERMAN.STUKA_AIR_CAP_SQUAD","SBP.GERMAN.STUKA_AIR_CAP_SQUAD_MP","SBP.GERMAN.STUKA_GROUND_ANTI_TANK_SQUAD","SBP.GERMAN.STUKA_GROUND_ANTI_TANK_SQUAD_M06","SBP.GERMAN.STUKA_GROUND_ANTI_TANK_SQUAD_MP","SBP.GERMAN.STUKA_GROUND_ANTI_TANK_SQUAD_SUPERIORITY","SBP.GERMAN.STUKA_GROUND_ATTACK_SQUAD","SBP.GERMAN.STUKA_GROUND_ATTACK_SQUAD_LONG","SBP.GERMAN.STUKA_GROUND_ATTACK_SQUAD_M09","SBP.GERMAN.STUKA_GROUND_ATTACK_SQUAD_MP","SBP.GERMAN.STUKA_GROUND_ATTACK_WEST_GERMANS_SQUAD","SBP.GERMAN.STUKA_GROUND_FRAGMENTATION_SQUAD","SBP.GERMAN.STUKA_GROUND_FRAGMENTATION_SQUAD_MP","SBP.GERMAN.STUKA_INCENDIARY_BOMB_SQUAD","SBP.GERMAN.STUKA_INCENDIARY_BOMB_VICTORY_SQUAD","SBP.GERMAN.STUKA_SMOKE_SQUAD","SBP.GERMAN.STUKA_SMOKE_SQUAD_MP","SBP.GERMAN.TACTICAL_BOMBERS","SBP.GERMAN.TACTICAL_BOMBERS_ACCURATE","SBP.GERMAN.TIGER_ACE_SQUAD_MP","SBP.GERMAN.TIGER_SQUAD","SBP.GERMAN.TIGER_SQUAD_MP","SBP.GERMAN.TIGER_SQUAD_SP_A2_M02","SBP.GERMAN.TIGER_SQUAD_TOW","SBP.GERMAN.URBAN_ASSAULT_PANZER_GRENADIER_SQUAD_MP","ABILITY.GERMAN.AIR_DROPPED_MEDICAL_SUPPLIES","ABILITY.GERMAN.AIR_DROPPED_MUNITIONS","ABILITY.GERMAN.AMBUSH_CAMO_HOLD_FIRE_MP","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_AT","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_MORTAR","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_PIO","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_UNLOCK","ABILITY.GERMAN.AMBUSH_CAMOUFLAGE_UPGRADE","ABILITY.GERMAN.ARMOR_COMMANDER","ABILITY.GERMAN.ASSAULT_FIELD_OFFICER","ABILITY.GERMAN.ASSAULT_GRENADIER_GRENADE","ABILITY.GERMAN.ASSAULT_GRENADIER_SPRINT_MP","ABILITY.GERMAN.ASSAULT_GRENADIERS","ABILITY.GERMAN.ASSAULT_OFFICER_INSPIRATION","ABILITY.GERMAN.ASSAULT_OFFICER_INSPIRATION_VET3","ABILITY.GERMAN.ASSAULT_OFFICER_VICTOR_TARGET","ABILITY.GERMAN.AXIS_SNIPER_DELAYED_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.GERMAN.BLINDING_GRENADE","ABILITY.GERMAN.BLINDING_GRENADES_UNLOCK","ABILITY.GERMAN.BREAKTHROUGH","ABILITY.GERMAN.BRUMMBAR_BUNKER_BUSTER_MP","ABILITY.GERMAN.BRUMMBAR_CRITICAL_SHOTS_MP","ABILITY.GERMAN.BRUMMBAR_HOLD_FIRE_MP","ABILITY.GERMAN.CAMOUFLAGE_NETS","ABILITY.GERMAN.CAMOUFLAGE_NETS_UNLOCK","ABILITY.GERMAN.COMMAND_PANTHER_MARK_TARGET","ABILITY.GERMAN.CONVERT_TANK_WRECK","ABILITY.GERMAN.CONVERT_TANK_WRECK_UNLOCK","ABILITY.GERMAN.COUNTERATTACK_TACTICS","ABILITY.GERMAN.CRUSH_THE_POCKET","ABILITY.GERMAN.DEFENSIVE_FORTIFICATIONS","ABILITY.GERMAN.ELEFANT_CRITICAL_SHOTS_MP","ABILITY.GERMAN.ELEFANT_UNLOCK","ABILITY.GERMAN.ELEPHANT_CONE_LOS_TOGGLE_ABILITY","ABILITY.GERMAN.ELEPHANT_CONE_LOS_TOGGLE_ABILITY_MP","ABILITY.GERMAN.FAST_MARCH","ABILITY.GERMAN.FATALITY_PANZERWERFER_BARRAGE","ABILITY.GERMAN.FATALITY_SMOKE_BARRAGE","ABILITY.GERMAN.FATALITY_STUKA_INCENDIARY_AIRSTRIKE","ABILITY.GERMAN.FATALITY_STUKA_SMOKE_STRAFE_AIRSTRIKE","ABILITY.GERMAN.FORWARD_REPAIR_STATION","ABILITY.GERMAN.GERMAN_HQ_PIONEER_CALL_IN","ABILITY.GERMAN.GERMAN_HULLDOWN_ABILITY","ABILITY.GERMAN.GERMAN_HULLDOWN_DISABLE","ABILITY.GERMAN.GERMAN_MORTAR_HOLD_FIRE","ABILITY.GERMAN.GERMAN_MORTAR_HOLD_FIRE_MP","ABILITY.GERMAN.GERMAN_SALVAGE_ABILITY","ABILITY.GERMAN.GERMAN_SALVAGE_ABILITY_CONVOY","ABILITY.GERMAN.GERMAN_SALVAGE_ABILITY_MP","ABILITY.GERMAN.GERMAN_WARNING_SMOKE","ABILITY.GERMAN.GOLIATH_IN_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.GERMAN.GOLIATH_SELF_DESTRUCT_MP","ABILITY.GERMAN.GRENADIER_ANTITANK_RIFLE_GRENADE_ABILITY","ABILITY.GERMAN.GRENADIER_ANTITANK_RIFLE_GRENADE_ABILITY_MP","ABILITY.GERMAN.GRENADIER_PANZERFAUST","ABILITY.GERMAN.GRENADIER_PANZERFAUST_MP","ABILITY.GERMAN.GRENADIER_RIFLE_GRENADE_ABILITY","ABILITY.GERMAN.GRENADIER_RIFLE_GRENADE_ABILITY_MP","ABILITY.GERMAN.GRENADIER_RIFLE_GRENADE_ABILITY_TUTORIAL","ABILITY.GERMAN.HALFTRACK_INCENDIARY_MORTAR_BARRAGE","ABILITY.GERMAN.HALFTRACK_INCENDIARY_MORTAR_BARRAGE_MP","ABILITY.GERMAN.HALFTRACK_MORTAR_BARRAGE","ABILITY.GERMAN.HALFTRACK_MORTAR_BARRAGE_MP","ABILITY.GERMAN.HALFTRACK_MORTAR_VICTORTARGET_BARRAGE_MP","ABILITY.GERMAN.HALFTRACK_SMOKE_BARRAGE","ABILITY.GERMAN.HALFTRACK_SMOKE_BARRAGE_MP","ABILITY.GERMAN.HEAVY_AT_MINE_UNLOCK","ABILITY.GERMAN.HOWITZER_105MM_BARRAGE_ABILITY","ABILITY.GERMAN.HOWITZER_105MM_BARRAGE_ABILITY_MP","ABILITY.GERMAN.HOWITZER_105MM_BARRAGE_VET3_ABILITY_MP","ABILITY.GERMAN.HOWITZER_105MM_EMPLACEMENT_UNLOCK","ABILITY.GERMAN.HOWITZER_105MM_VICTORTARGET_BARRAGE_ABILITY_MP","ABILITY.GERMAN.HOWITZER_COUNTER_BARRAGE_ATTACK_MP","ABILITY.GERMAN.HOWITZER_COUNTER_BARRAGE_MP","ABILITY.GERMAN.HOWITZER_DEFAULT_REFACE_ACTION","ABILITY.GERMAN.HULL_DOWN_UNLOCK","ABILITY.GERMAN.INFANTRY_MEDKITS","ABILITY.GERMAN.INFANTRY_MEDKITS_MP","ABILITY.GERMAN.JAEGER_INFANTRY_UNLOCK","ABILITY.GERMAN.JAEGER_INTERROGATION","ABILITY.GERMAN.LAY_HEAVY_AT_MINE","ABILITY.GERMAN.LIGHT_SUPPORT_ARTILLERY","ABILITY.GERMAN.MECHANIZED_ASSAULT_GROUP","ABILITY.GERMAN.MECHANIZED_GRENADIER_GROUP","ABILITY.GERMAN.MG42_CAMO_HOLD_FIRE_MP","ABILITY.GERMAN.MG42_PHOSPHORUS_ROUNDS","ABILITY.GERMAN.MG42_PHOSPHORUS_ROUNDS_MP","ABILITY.GERMAN.MORTAR_COUNTER_BARRAGE_ATTACK_MP","ABILITY.GERMAN.MORTAR_COUNTER_BARRAGE_MP","ABILITY.GERMAN.MORTAR_COUNTER_BARRAGE_WEAPON_MP","ABILITY.GERMAN.MORTAR_HALFTRACK","ABILITY.GERMAN.MORTAR_INCENDIARY_BARRAGE","ABILITY.GERMAN.MORTAR_TEAM_INCENDIARY_BARRAGE_MP","ABILITY.GERMAN.MORTAR_TEAM_MORTAR_BARRAGE","ABILITY.GERMAN.MORTAR_TEAM_MORTAR_BARRAGE_MP","ABILITY.GERMAN.MORTAR_TEAM_MORTAR_VICTORTARGET_BARRAGE_MP","ABILITY.GERMAN.MORTAR_TEAM_SMOKE_BARRAGE","ABILITY.GERMAN.MORTAR_TEAM_SMOKE_BARRAGE_MP","ABILITY.GERMAN.MUNITIONS_BLITZ","ABILITY.GERMAN.OFFICER_SMOKE_ARTILLERY","ABILITY.GERMAN.OPEL_SUPPLY_TERRITORY_CHECK","ABILITY.GERMAN.OSTRUPPEN","ABILITY.GERMAN.OSTRUPPEN_COVER_BONUS","ABILITY.GERMAN.OSTRUPPEN_RESERVES","ABILITY.GERMAN.PAK_43_EMPLACEMENT_UNLOCK","ABILITY.GERMAN.PAK40_CRITICAL_SHOTS_MP","ABILITY.GERMAN.PAK40_TARGET_WEAK_POINT_MP","ABILITY.GERMAN.PAK43_CRITICAL_SHOTS_MP","ABILITY.GERMAN.PAK43_TARGET_WEAK_POINT_MP","ABILITY.GERMAN.PANTHER_TIGER_BLITZKRIEG_MP","ABILITY.GERMAN.PANZER_COMMANDER_AURA_MP","ABILITY.GERMAN.PANZER_DEFENSIVE_SMOKE","ABILITY.GERMAN.PANZER_GRENADIER_BUNDLED_CAMPAIGN","ABILITY.GERMAN.PANZER_GRENADIER_BUNDLED_GRENADE","ABILITY.GERMAN.PANZER_GRENADIER_BUNDLED_GRENADE_MP","ABILITY.GERMAN.PANZER_GRENADIER_BUNDLED_TUTORIAL","ABILITY.GERMAN.PANZER_PANTHER_TIGER_DEFENSIVE_SMOKE_TOW","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_BLITZKRIEG","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_BLITZKRIEG_MP","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_BLITZKRIEG_TOW","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_FLARES_ABILITY","ABILITY.GERMAN.PANZER_PANTHER_TIGER_OSTWIND_REPAIR_TOW","ABILITY.GERMAN.PANZER_TACTICIAN_UNLOCK","ABILITY.GERMAN.PANZERWERFER_COUNTER_BARRAGE_ATTACK_MP","ABILITY.GERMAN.PANZERWERFER_COUNTER_BARRAGE_MP","ABILITY.GERMAN.PANZERWERFER_ROCKET_BARRAGE","ABILITY.GERMAN.PANZERWERFER_ROCKET_BARRAGE_MP","ABILITY.GERMAN.PANZERWERFER_ROCKET_VICTORTARGET_BARRAGE_MP","ABILITY.GERMAN.PIONEER_BARBED_WIRE_CUTTING_ABILITY","ABILITY.GERMAN.PIONEER_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.GERMAN.PIONEER_FLAMETHROWER","ABILITY.GERMAN.PUMA_CRITICAL_SHOTS_MP","ABILITY.GERMAN.PUMA_DISPATCH","ABILITY.GERMAN.RAILWAY_GUN_ARTILLERY","ABILITY.GERMAN.REDISTRIBUTE_RESOURCES","ABILITY.GERMAN.RELIEF_INFANTRY","ABILITY.GERMAN.REMOVE_AMBUSH_CAMOUFLAGE","ABILITY.GERMAN.RESOURCE_REQUISITION","ABILITY.GERMAN.RETREAT_TO_FORWARD_HQ","ABILITY.GERMAN.SCOUT_CAR_HALFTRACK_INFANTRY_AWARENESS","ABILITY.GERMAN.SCOUT_CAR_HALFTRACK_INFANTRY_AWARENESS_MP","ABILITY.GERMAN.SDKFZ_221_LIGHT_AT_HALFTRACK","ABILITY.GERMAN.SECTOR_ARTILLERY","ABILITY.GERMAN.SNIPER_INCENDIARY_ROUND_MP","ABILITY.GERMAN.SPRINT","ABILITY.GERMAN.STATIONARY_LOS_UNLOCK","ABILITY.GERMAN.STORMTROOPER_ASSAULT_AMBUSH_MP","ABILITY.GERMAN.STORMTROOPER_SPRINT_MP","ABILITY.GERMAN.STORMTROOPER_TANK_DETECTION_MP","ABILITY.GERMAN.STORMTROOPERS","ABILITY.GERMAN.STRATEGIC_BOMBING","ABILITY.GERMAN.STUG_CRITICAL_SHOTS_MP","ABILITY.GERMAN.STUG_ELEFANT_PAK40_PAK43_BRUMMBAR_CRITICAL_SHOTS","ABILITY.GERMAN.STUG_ELEFANT_PAK40_PAK43_BRUMMBAR_CRITICAL_SHOTS_MP","ABILITY.GERMAN.STUG_III_E","ABILITY.GERMAN.STUKA_AERIAL_SUPERIORITY_CLOSE_AIR_SUPPORT","ABILITY.GERMAN.STUKA_AERIAL_SUPERIORITY_RECON","ABILITY.GERMAN.STUKA_AERIAL_SUPERIORITY_STRAFING_RUN","ABILITY.GERMAN.STUKA_AIR_RECON","ABILITY.GERMAN.STUKA_BOMBING_RUN_SP","ABILITY.GERMAN.STUKA_BOMBING_STRIKE","ABILITY.GERMAN.STUKA_BOMBING_STRIKE_TOW","ABILITY.GERMAN.STUKA_CLOSE_AIR_M06","ABILITY.GERMAN.STUKA_CLOSE_AIR_M06_MP","ABILITY.GERMAN.STUKA_CLOSE_AIR_SUPPORT","ABILITY.GERMAN.STUKA_FRAGMENTATION_BOMB","ABILITY.GERMAN.STUKA_INCENDIARY_BOMBS","ABILITY.GERMAN.STUKA_SMOKE_BOMB","ABILITY.GERMAN.STUKA_STRAFING_RUN","ABILITY.GERMAN.SUPPLY_BREAK","ABILITY.GERMAN.SUPPLY_TRUCK","ABILITY.GERMAN.SUPPLY_TRUCK_LOCKDOWN","ABILITY.GERMAN.SUPPORT_TEAM_AMBUSH_CAMOUFLAGE","ABILITY.GERMAN.TANK_AWARENESS_UNLOCK","ABILITY.GERMAN.TANK_DETECTION_ABILITY_CONVOY","ABILITY.GERMAN.TIGER_ACE_CRITICAL_SHOTS_MP","ABILITY.GERMAN.TIGER_TANK","ABILITY.GERMAN.TIGER_TANK_ACE","ABILITY.GERMAN.TRENCH_UNLOCK","ABILITY.GERMAN.TROOP_TRAINING","ABILITY.GERMAN.URBAN_ASSAULT_GRENADIERS","ABILITY.GERMAN.URBAN_ASSAULT_SATCHEL_CHARGE_THROW_ABILITY_MP","ABILITY.GERMAN.URBAN_ASSAULT_SMOKE_GRENADE","ABILITY.GERMAN.URBAN_ASSAULT_SMOKE_GRENADE_2","ABILITY.GERMAN.WEHR_VEHICLE_HOLD_FIRE_MP","UPG.GERMAN.AERIAL_SUPERIORITY_RECON_PLANE","UPG.GERMAN.AERIAL_SUPERIORITY_STUKA_CLOSE_AIR_SUPPORT","UPG.GERMAN.AERIAL_SUPERIORITY_STUKA_STRAFE","UPG.GERMAN.AIR_DROP_MEDICAL_SUPPLIES","UPG.GERMAN.AIR_DROP_RESOURCES","UPG.GERMAN.AMBUSH_CAMOU_PACKAGE","UPG.GERMAN.AMBUSH_CAMOUFLAGE","UPG.GERMAN.ARMOR_COMMANDER","UPG.GERMAN.ASSAULT_ARCHETYPE","UPG.GERMAN.ASSAULT_FIELD_OFFICER","UPG.GERMAN.ASSAULT_GRENADIERS","UPG.GERMAN.BATTLE_PHASE_2","UPG.GERMAN.BATTLE_PHASE_2_MP","UPG.GERMAN.BATTLE_PHASE_3","UPG.GERMAN.BATTLE_PHASE_3_MP","UPG.GERMAN.BATTLE_PHASE_4","UPG.GERMAN.BATTLE_PHASE_4_MP","UPG.GERMAN.BLINDING_GRENADES","UPG.GERMAN.BREAKTHROUGH","UPG.GERMAN.BRUMMBAR_TOP_GUNNER","UPG.GERMAN.BRUMMBAR_TOP_GUNNER_MP","UPG.GERMAN.BUNKER_COMMAND","UPG.GERMAN.BUNKER_COMMAND_MP","UPG.GERMAN.BUNKER_MEDIC_STATION","UPG.GERMAN.BUNKER_MEDIC_STATION_MP","UPG.GERMAN.BUNKER_MG42_ADDITION","UPG.GERMAN.BUNKER_MG42_ADDITION_MP","UPG.GERMAN.CAMOUFLAGE_NET_ACTIVATED","UPG.GERMAN.CAMOUFLAGE_NETS","UPG.GERMAN.CAN_CAMOUFLAGE","UPG.GERMAN.COUNTERATTACK_TACTICS","UPG.GERMAN.CRUSH_THE_POCKET","UPG.GERMAN.DEFENSIVE_FORTIFICATIONS","UPG.GERMAN.ELEFANT_UNLOCK","UPG.GERMAN.FAST_MARCH","UPG.GERMAN.FESTUNG_ARCHETYPE","UPG.GERMAN.FORWARD_REPAIR_STATION","UPG.GERMAN.GRENADIER_MG42_LMG","UPG.GERMAN.GRENADIER_MG42_LMG_MP","UPG.GERMAN.HEAVY_AT_MINE","UPG.GERMAN.HOWITZER_105MM_EMPLACEMENT","UPG.GERMAN.HOWITZER_COUNTER_BARRAGE_COOLDOWN_MP","UPG.GERMAN.HULL_DOWN","UPG.GERMAN.HULLDOWN_ACTIVATED","UPG.GERMAN.HULLDOWN_CONSTRUCTING","UPG.GERMAN.JAEGER_ARCHETYPE","UPG.GERMAN.JAEGER_LIGHT_INFANTRY","UPG.GERMAN.LIGHT_ARTILLERY_SUPPORT","UPG.GERMAN.LIGHT_INFANTRY_PACKAGE","UPG.GERMAN.LIGHT_INFANTRY_PANZERGREN_PACKAGE","UPG.GERMAN.MECHANIZED_GRENADIER_GROUP","UPG.GERMAN.MECHANIZED_GROUP","UPG.GERMAN.MG42_HOLDFIRE_CAMOUFLAGE_NET_ACTIVATED","UPG.GERMAN.MORTAR_COUNTER_BARRAGE_COOLDOWN_MP","UPG.GERMAN.MORTAR_COUNTER_BARRAGE_MP","UPG.GERMAN.MORTAR_HALFTRACK","UPG.GERMAN.MORTAR_HALFTRACK_250_UPGRADE","UPG.GERMAN.MORTAR_HALFTRACK_COUNTER_BARRAGE_COOLDOWN_MP","UPG.GERMAN.MORTAR_INCENDIARY_BARRAGE","UPG.GERMAN.MUNITION_BLITZ","UPG.GERMAN.OSTRUPPEN","UPG.GERMAN.OSTRUPPEN_RESERVES","UPG.GERMAN.PAK_43_EMPLACEMENT","UPG.GERMAN.PANTHER_TOP_GUNNER","UPG.GERMAN.PANTHER_TOP_GUNNER_MP","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_1_SCHREK_MP","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_MP","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_SECOND","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_SECOND_MP","UPG.GERMAN.PANZER_GRENADIER_PANZERSHRECK_ATW_ITEM_THIRD_MP","UPG.GERMAN.PANZER_TACTICIAN","UPG.GERMAN.PANZER_TOP_GUNNER","UPG.GERMAN.PANZER_TOP_GUNNER_MP","UPG.GERMAN.PANZERBUSCHE_39","UPG.GERMAN.PANZERBUSCHE_39_MP","UPG.GERMAN.PANZERWERFER_COUNTER_BARRAGE_COOLDOWN_MP","UPG.GERMAN.PIONEER_FLAMETHROWER","UPG.GERMAN.PIONEER_FLAMETHROWER_MP","UPG.GERMAN.PIONEER_MINESWEEPER","UPG.GERMAN.PIONEER_MINESWEEPER_MP","UPG.GERMAN.PUMA_DISPATCH","UPG.GERMAN.RAILWAY_ARTILLERY_SUPPORT","UPG.GERMAN.RECON_PLANE","UPG.GERMAN.REDISTRIBUTE_RESOURCES","UPG.GERMAN.RELIEF_INFANTRY","UPG.GERMAN.SDKFZ_222_20MM_GUN","UPG.GERMAN.SDKFZ_222_20MM_GUN_MP","UPG.GERMAN.SDKFZ_251_HALFTRACK_FLAMMPANZERWAGEN_UPGRADE","UPG.GERMAN.SDKFZ_251_HALFTRACK_FLAMMPANZERWAGEN_UPGRADE_MP","UPG.GERMAN.SDKFZ_251_HALFTRACK_MOBILE_MEDIC_STATION_UPGRADE","UPG.GERMAN.SECTOR_ARTILLERY","UPG.GERMAN.SPRINT","UPG.GERMAN.STATIONARY_LOS_GAIN","UPG.GERMAN.STORMTROOPER_ANTITANK_PACKAGE_MP","UPG.GERMAN.STORMTROOPER_ASSAULT_PACKAGE_MP","UPG.GERMAN.STORMTROOPER_PANZERSCHRECK_MP","UPG.GERMAN.STORMTROOPERS","UPG.GERMAN.STRATEGIC_BOMBING","UPG.GERMAN.STUG_III_E_UNLOCK","UPG.GERMAN.STUG_SHORT_BARREL","UPG.GERMAN.STUG_TOP_GUNNER","UPG.GERMAN.STUG_TOP_GUNNER_MP","UPG.GERMAN.STUKA_BOMBING_RUN_UPGRADE","UPG.GERMAN.STUKA_CLOSE_AIR_SUPPORT","UPG.GERMAN.STUKA_FLAME_STRIKE","UPG.GERMAN.STUKA_FRAGMENTATION_BOMB","UPG.GERMAN.STUKA_SMOKE_BOMB","UPG.GERMAN.STUKA_STRAFE","UPG.GERMAN.SUPPLY_BREAK","UPG.GERMAN.SUPPLY_TRUCK_ACTIVE","UPG.GERMAN.SUPPLY_TRUCK_EXIT","UPG.GERMAN.SUPPLY_TRUCK_FILL_STATE","UPG.GERMAN.SUPPLY_TRUCK_FULL","UPG.GERMAN.SUPPLY_TRUCK_LOCKDOWN","UPG.GERMAN.TANK_AWARENESS","UPG.GERMAN.TIGER_TANK","UPG.GERMAN.TIGER_TANK_ACE","UPG.GERMAN.TIGER_TANK_ACE_CALLIN_RESTRICTION","UPG.GERMAN.TIGER_TOP_GUNNER","UPG.GERMAN.TIGER_TOP_GUNNER_MP","UPG.GERMAN.TIGER_TOP_GUNNER_TOW","UPG.GERMAN.TOW_1941_GERMAN","UPG.GERMAN.TRENCH","UPG.GERMAN.TROOP_TRAINING","UPG.GERMAN.URBAN_ASSAULT_ARMOR_UPGRADE","UPG.GERMAN.URBAN_ASSAULT_PANZER_GRENADIERS","UPG.GERMAN.URBAN_ASSAULT_PANZER_GRENADIERS_FLAMETHROWER_MP","UPG.GERMAN.VEHICLES_OPTICS","UPG.GERMAN.XP1_GERMAN_DEMO_UPGRADE","EBP.PROXY.PROXY_MEDIC_MP","EBP.PROXY.PROXY_RIFLEMAN_SOLDIER_A","EBP.PROXY.PROXY_RIFLEMAN_SOLDIER_B","EBP.PROXY.PROXY_RIFLEMAN_SOLDIER_C","EBP.PROXY.PROXY_SNIPER_RECON_MP","SBP.PROXY.PROXY_HMG_SQUAD_MP","SBP.PROXY.PROXY_MECH_SQUAD_MP","SBP.PROXY.PROXY_RIFLEMEN_SQUAD_MP","SBP.PROXY.PROXY_SNIPER_SQUAD_MP","EBP.SOVIET._CIVILIAN_FEMALE","EBP.SOVIET._CIVILIAN_FEMALE_MP","EBP.SOVIET._CIVILIAN_MALE","EBP.SOVIET._CIVILIAN_MALE_MP","EBP.SOVIET.ANTI_PERSONNEL_MINES","EBP.SOVIET.ARTILLERY_203MM_B4","EBP.SOVIET.ATGUN53K_CREW","EBP.SOVIET.ATGUN53K_CREW_MP","EBP.SOVIET.ATGUNZIS_CREW","EBP.SOVIET.ATGUNZIS_CREW_MP","EBP.SOVIET.BARBED_WIRE_FENCE","EBP.SOVIET.BARBED_WIRE_FENCE_MP","EBP.SOVIET.BARBED_WIRE_FIELD","EBP.SOVIET.BARBED_WIRE_FIELD_MP","EBP.SOVIET.BARRACKS","EBP.SOVIET.BARRACKS_MP","EBP.SOVIET.BASE_CONSCRIPT_SOLDIER","EBP.SOVIET.BASE_CONSCRIPT_SOLDIER_MP","EBP.SOVIET.BOAT_01_ENTITY","EBP.SOVIET.CARGO_PLANE_SOVIET","EBP.SOVIET.COMBAT_ENGINEER","EBP.SOVIET.COMBAT_ENGINEER_MP","EBP.SOVIET.COMMISSAR","EBP.SOVIET.COMMISSAR_227","EBP.SOVIET.COMMISSAR_MP","EBP.SOVIET.COMMISSAR_OF_DEATH_227_MP","EBP.SOVIET.CONSCRIPT_SOLDIER","EBP.SOVIET.CONSCRIPT_SOLDIER_CONSCRIPT_BODYGUARD_MP","EBP.SOVIET.CONSCRIPT_SOLDIER_MP","EBP.SOVIET.DHSK_38_MACHINE_GUN","EBP.SOVIET.DHSK_38_MACHINE_GUN_MP","EBP.SOVIET.DSHK_WEAPON_CREW","EBP.SOVIET.DSHK_WEAPON_CREW_MP","EBP.SOVIET.FLARE_FIRE_MP","EBP.SOVIET.FLARE_MINE","EBP.SOVIET.FLARE_MINE_MP","EBP.SOVIET.FORWARD_HQ","EBP.SOVIET.GUARD_TROOPS","EBP.SOVIET.GUARD_TROOPS_ASSAULT_MP","EBP.SOVIET.GUARD_TROOPS_MP","EBP.SOVIET.HM_120_38_MORTAR","EBP.SOVIET.HM_120_38_MORTAR_MP","EBP.SOVIET.HOWITZER_CREW_SOVIET","EBP.SOVIET.HOWITZER_CREW_SOVIET_MP","EBP.SOVIET.HOWITZER_CREW203__SOVIET_MP","EBP.SOVIET.HQ","EBP.SOVIET.HQ_INVISIBLE_SP","EBP.SOVIET.HQ_MP","EBP.SOVIET.HQ_NO_WRECK","EBP.SOVIET.HQ_WRECK","EBP.SOVIET.HQ_WRECK_M06","EBP.SOVIET.HQ_WRECK_MP","EBP.SOVIET.IL_2_STURMOVIK","EBP.SOVIET.IL_2_STURMOVIK_ADVANCED_MP","EBP.SOVIET.IL_2_STURMOVIK_ANTI_TANK_BOMB_MP","EBP.SOVIET.IL_2_STURMOVIK_MARK_VEHICLE_MP","EBP.SOVIET.IL_2_STURMOVIK_MP","EBP.SOVIET.IL_2_STURMOVIK_RECON","EBP.SOVIET.IL_2_STURMOVIK_RECON_MP","EBP.SOVIET.IL_2_STURMOVIK_ROCKET","EBP.SOVIET.IL_2_STURMOVIK_ROCKET_MP","EBP.SOVIET.IL_2_STURMOVIK_ROCKET_SP","EBP.SOVIET.IL_2_STURMOVIK_VICTORY_MP","EBP.SOVIET.IS_2_HEAVY_TANK","EBP.SOVIET.IS_2_HEAVY_TANK_MP","EBP.SOVIET.ISAKOVICH_A01_COMMANDER","EBP.SOVIET.ISAKOVICH_M06","EBP.SOVIET.ISU_152_SPG","EBP.SOVIET.ISU_152_SPG_MP","EBP.SOVIET.KATYUSHA_BM_13N","EBP.SOVIET.KATYUSHA_BM_13N_MP","EBP.SOVIET.KV_1","EBP.SOVIET.KV_1_COMMANDER_MP","EBP.SOVIET.KV_1_MP","EBP.SOVIET.KV_2","EBP.SOVIET.KV_2_MP","EBP.SOVIET.KV_2_TOW","EBP.SOVIET.KV_8","EBP.SOVIET.KV_8_MP","EBP.SOVIET.LIGHT_ANTI_VEHICLE_MINES","EBP.SOVIET.M01_BASE_CONSCRIPT_SOLDIER","EBP.SOVIET.M01_BASE_CONSCRIPT_SOLDIER_DURABLE","EBP.SOVIET.M01_CONSCRIPT_SOLDIER","EBP.SOVIET.M01_CONSCRIPT_SOLDIER_DOCK","EBP.SOVIET.M01_CONSCRIPT_SOLDIER_HARMLESS","EBP.SOVIET.M01_CONSCRIPT_SOLDIER_HARMLESS_DURABLE","EBP.SOVIET.M01_IL_2_STURMOVIK_ROCKET","EBP.SOVIET.M01_IL2_DOGFIGHT","EBP.SOVIET.M01_MEDIC","EBP.SOVIET.M08_T_34_76_SMALLPATH","EBP.SOVIET.M08_TANK_BUSTER_CONSCRIPT","EBP.SOVIET.M11_ANIA_SNIPER","EBP.SOVIET.M11_ISAKOVICH_RECON","EBP.SOVIET.M11_PARTISAN_TROOP_KAR98K","EBP.SOVIET.M11_PARTISAN_TROOP_NAGANT","EBP.SOVIET.M11_PARTISAN_TROOP_NOWEAPON","EBP.SOVIET.M11_SNIPER","EBP.SOVIET.M11_SNIPER_RECON","EBP.SOVIET.M1910_MAXIM_HEAVY_MACHINE_GUN","EBP.SOVIET.M1910_MAXIM_HEAVY_MACHINE_GUN_MP","EBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY","EBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY_COMMANDER_MP","EBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY_MP","EBP.SOVIET.M1937_152MM_ML_20_ARTILLERY","EBP.SOVIET.M1937_152MM_ML_20_ARTILLERY_MP","EBP.SOVIET.M1937_53_K_45MM_AT_GUN","EBP.SOVIET.M1937_53_K_45MM_AT_GUN_MP","EBP.SOVIET.M1942_76MM_DIVISIONAL_GUN_ZIS_3","EBP.SOVIET.M1942_76MM_DIVISIONAL_GUN_ZIS_3_MP","EBP.SOVIET.M3A1_SCOUT_CAR","EBP.SOVIET.M3A1_SCOUT_CAR_MP","EBP.SOVIET.M5_HALFTRACK","EBP.SOVIET.M5_HALFTRACK_ASSAULT_MP","EBP.SOVIET.M5_HALFTRACK_MP","EBP.SOVIET.MACHINE_GUN_NEST","EBP.SOVIET.MACHINE_GUN_NEST_MP","EBP.SOVIET.MAXIM_WEAPON_CREW","EBP.SOVIET.MAXIM_WEAPON_CREW_MP","EBP.SOVIET.MEDIC","EBP.SOVIET.MEDIC_MP","EBP.SOVIET.MORTAR_120MM_WEAPON_CREW_MP","EBP.SOVIET.MORTAR_WEAPON_CREW","EBP.SOVIET.MORTAR_WEAPON_CREW_MP","EBP.SOVIET.MOTORPOOL","EBP.SOVIET.MOTORPOOL_MP","EBP.SOVIET.OBSERVATION_POST_FUEL","EBP.SOVIET.OBSERVATION_POST_FUEL_MP","EBP.SOVIET.OBSERVATION_POST_MUNITION","EBP.SOVIET.OBSERVATION_POST_MUNITION_MP","EBP.SOVIET.PARTISAN_SNIPER","EBP.SOVIET.PARTISAN_TROOP_KAR98K","EBP.SOVIET.PARTISAN_TROOP_KAR98K_2","EBP.SOVIET.PARTISAN_TROOP_KAR98K_2_MP","EBP.SOVIET.PARTISAN_TROOP_KAR98K_MP","EBP.SOVIET.PARTISAN_TROOP_KAR98K_TOW_BD","EBP.SOVIET.PARTISAN_TROOP_KAR98K_TOW_MP","EBP.SOVIET.PARTISAN_TROOP_NAGANT","EBP.SOVIET.PARTISAN_TROOP_NAGANT_MP","EBP.SOVIET.PARTISAN_TROOP_NAGANT_TOW_MP","EBP.SOVIET.PARTISAN_TROOPS_ANTITANK","EBP.SOVIET.PARTISAN_TROOPS_LMG","EBP.SOVIET.PARTISAN_TROOPS_RIFLE","EBP.SOVIET.PARTISAN_TROOPS_SMG","EBP.SOVIET.PENAL_BATTALION_TROOPS","EBP.SOVIET.PENAL_BATTALION_TROOPS_MP","EBP.SOVIET.PM41_82MM_MORTAR","EBP.SOVIET.PM41_82MM_MORTAR_MP","EBP.SOVIET.REFUGEE_FEMALE","EBP.SOVIET.REFUGEE_FEMALE_MP","EBP.SOVIET.REFUGEE_MALE","EBP.SOVIET.REFUGEE_MALE_MP","EBP.SOVIET.REPAIR_ENGINEER","EBP.SOVIET.REPAIR_ENGINEER_MP","EBP.SOVIET.REPAIR_STATION_MP","EBP.SOVIET.SAND_BAG_SOVIET","EBP.SOVIET.SAND_BAG_SOVIET_MP","EBP.SOVIET.SAND_BAG_SOVIET_TUTORIAL","EBP.SOVIET.SHERMAN_SOVIET","EBP.SOVIET.SHOCK_TROOPS","EBP.SOVIET.SHOCK_TROOPS_MP","EBP.SOVIET.SNIPER","EBP.SOVIET.SNIPER_ATK_TARGET","EBP.SOVIET.SNIPER_MP","EBP.SOVIET.SNIPER_RECON","EBP.SOVIET.SNIPER_RECON_MP","EBP.SOVIET.SOVIET_ALLIED_CARGO_PLANE","EBP.SOVIET.SOVIET_BASE_STAMPER","EBP.SOVIET.SOVIET_MINE","EBP.SOVIET.SOVIET_MINE_M08","EBP.SOVIET.SOVIET_MINE_MP","EBP.SOVIET.SOVIET_MINE_SP","EBP.SOVIET.SOVIET_MINE_TOW","EBP.SOVIET.SOVIET_OFFICER","EBP.SOVIET.SOVIET_OFFICER_MP","EBP.SOVIET.STEAM_TRAIN","EBP.SOVIET.SU_76M","EBP.SOVIET.SU_76M_MP","EBP.SOVIET.SU_85","EBP.SOVIET.SU_85_MP","EBP.SOVIET.T_34_76","EBP.SOVIET.T_34_76_MP","EBP.SOVIET.T_34_85","EBP.SOVIET.T_34_85_MP","EBP.SOVIET.T_70M","EBP.SOVIET.T_70M_MP","EBP.SOVIET.TANK_DEPOT","EBP.SOVIET.TANK_DEPOT_MP","EBP.SOVIET.TANKTRAP","EBP.SOVIET.TOW_COLD_WEAETHER_GUARD_TROOPS","EBP.SOVIET.US6_TRUCK","EBP.SOVIET.US6_TRUCK_MP","EBP.SOVIET.WEAPON_SUPPORT_CENTER","EBP.SOVIET.WEAPON_SUPPORT_CENTER_MP","EBP.SOVIET.WIRE_FIELD","EBP.SOVIET.WIRE_FIELD_MP","EBP.SOVIET.ZIS_6_TRANSPORT","EBP.SOVIET.ZIS_6_TRANSPORT_MP","SBP.SOVIET.BASE_CONSCRIPT_SQUAD","SBP.SOVIET.BASE_CONSCRIPT_SQUAD_MP","SBP.SOVIET.BOAT_01","SBP.SOVIET.CARGO_PLANE_SOVIET","SBP.SOVIET.COMBAT_ENGINEER_SQUAD","SBP.SOVIET.COMBAT_ENGINEER_SQUAD_MP","SBP.SOVIET.COMMISSAR_227","SBP.SOVIET.COMMISSAR_SQUAD_BATTLE","SBP.SOVIET.COMMISSAR_SQUAD_MP","SBP.SOVIET.COMMISSAR_SQUAD_TOW","SBP.SOVIET.CONSCRIPT_SQUAD","SBP.SOVIET.CONSCRIPT_SQUAD_MP","SBP.SOVIET.CONSCRIPT_SQUAD_TUTORIAL","SBP.SOVIET.DSHK_38_HMG_SQUAD","SBP.SOVIET.DSHK_38_HMG_SQUAD_MP","SBP.SOVIET.GUARDS_TROOPS","SBP.SOVIET.GUARDS_TROOPS_ASSAULT_MP","SBP.SOVIET.GUARDS_TROOPS_M08","SBP.SOVIET.GUARDS_TROOPS_MP","SBP.SOVIET.HM_120_38_MORTAR_SQUAD","SBP.SOVIET.HM_120_38_MORTAR_SQUAD_MP","SBP.SOVIET.IL_2_STUMOVIK_SQUAD","SBP.SOVIET.IL_2_STUMOVIK_SQUAD_ADVANCED_MP","SBP.SOVIET.IL_2_STUMOVIK_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_ANTI_TANK_BOMB_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_MARK_VEHICLE_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_RECON_SQUAD","SBP.SOVIET.IL_2_STURMOVIK_RECON_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_RECON_SQUAD_SP","SBP.SOVIET.IL_2_STURMOVIK_ROCKET_SP_SQUAD","SBP.SOVIET.IL_2_STURMOVIK_ROCKET_SP_SQUAD_MP","SBP.SOVIET.IL_2_STURMOVIK_ROCKET_SQUAD","SBP.SOVIET.IL_2_STURMOVIK_ROCKET_SQUAD_MP","SBP.SOVIET.IS_2","SBP.SOVIET.IS_2_MP","SBP.SOVIET.IS_2_TOW","SBP.SOVIET.ISU_152","SBP.SOVIET.ISU_152_MP","SBP.SOVIET.KATYUSHA_BM_13N_SQUAD","SBP.SOVIET.KATYUSHA_BM_13N_SQUAD_MP","SBP.SOVIET.KV_1","SBP.SOVIET.KV_1_COMMANDER_MP","SBP.SOVIET.KV_1_MP","SBP.SOVIET.KV_1_SP","SBP.SOVIET.KV_2","SBP.SOVIET.KV_2_MP","SBP.SOVIET.KV_2_TOW","SBP.SOVIET.KV_2_TOW_BATTLE","SBP.SOVIET.KV_8","SBP.SOVIET.KV_8_MP","SBP.SOVIET.M01_CONSCRIPT_SQUAD_DOCKS","SBP.SOVIET.M01_CONSCRIPT_SQUAD_HARMLESS","SBP.SOVIET.M01_CONSCRIPT_SQUAD_HARMLESS_DURABLE","SBP.SOVIET.M01_CONSCRIPT_SQUAD_WOUNDED","SBP.SOVIET.M01_IL_2_STURMOVIK_ROCKET_SQUAD","SBP.SOVIET.M01_IL2_DOGFIGHT","SBP.SOVIET.M01_MEDIC","SBP.SOVIET.M02_COMBAT_ENGINEER_SQUAD","SBP.SOVIET.M02_REFUGEE_SQUAD","SBP.SOVIET.M08_COMBAT_ENGINEER_SQUAD","SBP.SOVIET.M08_T_34_76_SQUAD_SMALLPATH","SBP.SOVIET.M08_TANK_BUSTER_CONSCRIPT_SQUAD","SBP.SOVIET.M11_ANIA_SNIPER_SQUAD","SBP.SOVIET.M11_ISAKOVICH_SQUAD","SBP.SOVIET.M11_PARTISAN_SQUAD_KAR98K_RIFLE","SBP.SOVIET.M11_PARTISAN_SQUAD_NAGANT_RIFLE","SBP.SOVIET.M11_PARTISAN_SQUAD_NOWEAPON","SBP.SOVIET.M11_SNIPER_TEAM","SBP.SOVIET.M1910_MAXIM_HEAVY_MACHINE_GUN_SQUAD","SBP.SOVIET.M1910_MAXIM_HEAVY_MACHINE_GUN_SQUAD_MP","SBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY","SBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY_COMMANDER_MP","SBP.SOVIET.M1931_203MM_B_4_HOWITZER_ARTILLERY_MP","SBP.SOVIET.M1937_152MM_ML_20_ARTILLERY","SBP.SOVIET.M1937_152MM_ML_20_ARTILLERY_MP","SBP.SOVIET.M1937_53_K_45MM_AT_GUN_SQUAD","SBP.SOVIET.M1937_53_K_45MM_AT_GUN_SQUAD_MP","SBP.SOVIET.M1942_ZIS_3_76MM_AT_GUN_SQUAD","SBP.SOVIET.M1942_ZIS_3_76MM_AT_GUN_SQUAD_MP","SBP.SOVIET.M3A1_SCOUT_CAR_SQUAD","SBP.SOVIET.M3A1_SCOUT_CAR_SQUAD_MP","SBP.SOVIET.M5_HALFTRACK__ASSAULT_SQUAD_MP","SBP.SOVIET.M5_HALFTRACK_SQUAD","SBP.SOVIET.M5_HALFTRACK_SQUAD_MP","SBP.SOVIET.PARTISAN_SQUAD_GRANATEWERFER_34_81MM_MORTAR","SBP.SOVIET.PARTISAN_SQUAD_GRANATEWERFER_34_81MM_MORTAR_MP","SBP.SOVIET.PARTISAN_SQUAD_KAR98K_RIFLE","SBP.SOVIET.PARTISAN_SQUAD_KAR98K_RIFLE_MP","SBP.SOVIET.PARTISAN_SQUAD_MAXIM_HMG","SBP.SOVIET.PARTISAN_SQUAD_MAXIM_HMG_MP","SBP.SOVIET.PARTISAN_SQUAD_MG42_HMG","SBP.SOVIET.PARTISAN_SQUAD_MG42_HMG_MP","SBP.SOVIET.PARTISAN_SQUAD_NAGANT_RIFLE","SBP.SOVIET.PARTISAN_SQUAD_NAGANT_RIFLE_MP","SBP.SOVIET.PARTISAN_SQUAD_PM_82_41_MORTAR","SBP.SOVIET.PARTISAN_SQUAD_PM_82_41_MORTAR_MP","SBP.SOVIET.PARTISANS_LMG_MP","SBP.SOVIET.PARTISANS_PANZERSCHRECK_MP","SBP.SOVIET.PARTISANS_PTRS_MP","SBP.SOVIET.PARTISANS_RIFLE_MP","SBP.SOVIET.PARTISANS_SMG_MP","SBP.SOVIET.PENAL_BATTALION","SBP.SOVIET.PENAL_BATTALION_MP","SBP.SOVIET.PM_82_41_MORTAR_SQUAD","SBP.SOVIET.PM_82_41_MORTAR_SQUAD_MP","SBP.SOVIET.SHOCK_TROOPS","SBP.SOVIET.SHOCK_TROOPS_M11","SBP.SOVIET.SHOCK_TROOPS_MP","SBP.SOVIET.SNIPER_TEAM","SBP.SOVIET.SNIPER_TEAM_MALE","SBP.SOVIET.SNIPER_TEAM_MP","SBP.SOVIET.SOVIET_76MM_SHERMAN_MP","SBP.SOVIET.SOVIET_ALLIED_CARGO_PLANE","SBP.SOVIET.SOVIET_OFFICER_SQUAD","SBP.SOVIET.SOVIET_OFFICER_SQUAD_MP","SBP.SOVIET.STEAM_TRAIN","SBP.SOVIET.SU_76M","SBP.SOVIET.SU_76M_MP","SBP.SOVIET.SU_76M_TOW","SBP.SOVIET.SU_85","SBP.SOVIET.SU_85_MP","SBP.SOVIET.T_34_76_SQUAD","SBP.SOVIET.T_34_76_SQUAD_MP","SBP.SOVIET.T_34_85_ADVANCED_SQUAD_MP","SBP.SOVIET.T_34_85_SQUAD","SBP.SOVIET.T_34_85_SQUAD_MP","SBP.SOVIET.T_70M","SBP.SOVIET.T_70M_MP","SBP.SOVIET.TOW_BRIDGE_PARTISAN_SQUAD_AT","SBP.SOVIET.TOW_BRIDGE_PARTISAN_SQUAD_BASE","SBP.SOVIET.TOW_BRIDGE_PARTISAN_SQUAD_MAXIM","SBP.SOVIET.TOW_BRIDGE_PARTISAN_SQUAD_MORTAR","SBP.SOVIET.TOW_COLD_WEATHER_GUARDS_TROOPS","SBP.SOVIET.TOW_PARTISAN_SQUAD_KAR98K_RIFLE_MP","SBP.SOVIET.TOW_PARTISAN_SQUAD_LMG_SQUAD","SBP.SOVIET.TOW_PARTISAN_SQUAD_MAXIM_HMG_MP","SBP.SOVIET.US6_TRUCK_SQUAD","SBP.SOVIET.ZIS_6_TRANSPORT_TRUCK","SBP.SOVIET.ZIS_6_TRANSPORT_TRUCK_MP","ABILITY.SOVIET.ALLIED_AIR_SUPPLIES","ABILITY.SOVIET.ANTI_PERSONNEL_MINES","ABILITY.SOVIET.ANTI_TANK_GRENADE","ABILITY.SOVIET.ANTI_TANK_GRENADE_ASSAULT","ABILITY.SOVIET.ANTI_TANK_GRENADE_MP","ABILITY.SOVIET.ANTI_TANK_GRENADE_NO_REQUIREMENTS_MP","ABILITY.SOVIET.AT_76MM_HE_BARRAGE_ABILITY","ABILITY.SOVIET.AT_76MM_HE_BARRAGE_ABILITY_MP","ABILITY.SOVIET.AT_GUN_AMBUSH_TACTICS","ABILITY.SOVIET.B4_203MM_BARRAGE","ABILITY.SOVIET.B4_203MM_BARRAGE_COMMANDER_MP","ABILITY.SOVIET.B4_203MM_BARRAGE_COMMANDER_PRECISE_MP","ABILITY.SOVIET.B4_203MM_BARRAGE_COMMANDER_VET3_MP","ABILITY.SOVIET.B4_203MM_BARRAGE_COMMANDER_VICTORTARGET_MP","ABILITY.SOVIET.B4_203MM_BARRAGE_MP","ABILITY.SOVIET.B4_203MM_DIRECT_FIRE","ABILITY.SOVIET.B4_203MM_HOWITZER","ABILITY.SOVIET.BASE_CONSCRIPT_DISPATCH","ABILITY.SOVIET.BASE_CONSCRIPT_DISPATCH_MP","ABILITY.SOVIET.BOMBARDMENT_FX","ABILITY.SOVIET.BOOBY_TRAP","ABILITY.SOVIET.BUTTON_VEHICLE","ABILITY.SOVIET.BUTTON_VEHICLE_MP","ABILITY.SOVIET.BUTTON_VEHICLE_TOW","ABILITY.SOVIET.CAMPAIGN_SHOCK_FIRE_SUPERIORITY","ABILITY.SOVIET.CMD_120MM_MORTAR_CREW","ABILITY.SOVIET.CMD_ADVANCED_T34_85_MEDIUM_TANK","ABILITY.SOVIET.CMD_AT_GUN_AMBUSH_TACTICS_MP","ABILITY.SOVIET.CMD_CONSCRIPT_ASSAULT_PACKAGE","ABILITY.SOVIET.CMD_CONSCRIPT_EVASIVE_TACTICS","ABILITY.SOVIET.CMD_CONSCRIPT_REPAIR_KIT","ABILITY.SOVIET.CMD_GUARD_TROOPS","ABILITY.SOVIET.CMD_IS2_HEAVY_TANK","ABILITY.SOVIET.CMD_ISU_152","ABILITY.SOVIET.CMD_KATYUSHA","ABILITY.SOVIET.CMD_KV_1_UNLOCK","ABILITY.SOVIET.CMD_KV_8_UNLOCK_MP","ABILITY.SOVIET.CMD_ML_20","ABILITY.SOVIET.CMD_PENAL_BATTALION","ABILITY.SOVIET.CMD_RADIO_INTERCEPT","ABILITY.SOVIET.CMD_SHOCK_TROOPS","ABILITY.SOVIET.CMD_SOVIET_INDUSTRY","ABILITY.SOVIET.CMD_T34_85_MEDIUM_TANK","ABILITY.SOVIET.CMD_VEHICLE_CREW_REPAIR_TRAINING","ABILITY.SOVIET.COMMISSAR_SQUAD_MP","ABILITY.SOVIET.CONE_LOS_TOGGLE_ABILITY","ABILITY.SOVIET.CONE_LOS_TOGGLE_ABILITY_MP","ABILITY.SOVIET.CONSCRIPT_ANTI_TANK_GRENADE_ASSAULT_MP","ABILITY.SOVIET.CONSCRIPT_DISPATCH_MP","ABILITY.SOVIET.CONSCRIPT_EVASIVE_TACTICS","ABILITY.SOVIET.CONSCRIPT_EVASIVE_TACTICS_MP","ABILITY.SOVIET.CONSCRIPT_MOLOTOV_COCKTAIL","ABILITY.SOVIET.CONSCRIPT_MOLOTOV_COCKTAIL_MP","ABILITY.SOVIET.CONSCRIPT_OORAH","ABILITY.SOVIET.CONSCRIPT_OORAH_MP","ABILITY.SOVIET.CONSCRIPT_PTRS_UPGRADE","ABILITY.SOVIET.DSHK_ARMOR_PIERCING","ABILITY.SOVIET.DSHK_MP","ABILITY.SOVIET.ENGINEER_SALVAGE_WRECK","ABILITY.SOVIET.FATALITY_FEAR_PROPAGANDA_ARTILLERY","ABILITY.SOVIET.FATALITY_INCENDIARY_ARTILLERY","ABILITY.SOVIET.FATALITY_KATYUSHA_ROCKETS","ABILITY.SOVIET.FEAR_PROPAGANDA_ARTILLERY","ABILITY.SOVIET.FIELDCRAFT_TRIP_FLARE","ABILITY.SOVIET.FIELDCRAFT_TRIP_FLARE_MP","ABILITY.SOVIET.FIRE_ARTILLERY","ABILITY.SOVIET.FOR_MOTHER_RUSSIA_ABILITY","ABILITY.SOVIET.FORWARD_HQ","ABILITY.SOVIET.FRONTOVIKI_CONSCRIPT_DISPATCH","ABILITY.SOVIET.GUARDS_THROW_DEFENSIVE_GRENADE","ABILITY.SOVIET.GUARDS_THROW_DEFENSIVE_GRENADE_MP","ABILITY.SOVIET.HOLD_THE_LINE","ABILITY.SOVIET.IL_2_ANTI_TANK_BOMB_STRIKE","ABILITY.SOVIET.IL_2_ATTACK_STRAFE","ABILITY.SOVIET.IL_2_BOMBING_RUN_SP","ABILITY.SOVIET.IL_2_PRECISION_BOMB_STRIKE","ABILITY.SOVIET.IL_2_RECON","ABILITY.SOVIET.IL_2_RECON_SINGLEPASS_SP","ABILITY.SOVIET.IL_2_RECON_SP","ABILITY.SOVIET.IL_2_STURMOVIK_ATTACK","ABILITY.SOVIET.IL_2_STURMOVIK_ATTACK_ADVANCED","ABILITY.SOVIET.IL_2_SUPPORT","ABILITY.SOVIET.IL_2_SUPPORT_PRECISION_SP","ABILITY.SOVIET.IL_2_SUPPORT_SP","ABILITY.SOVIET.IS2_DISPATCH_SP","ABILITY.SOVIET.IS2_TANK_DEFENSIVE_WEAPON_MP","ABILITY.SOVIET.ISU_152_DISPATCH_SP","ABILITY.SOVIET.ISU_152_PIERCING_SHOT_ABILITY","ABILITY.SOVIET.ISU_152_PIERCING_SHOT_ABILITY_MP","ABILITY.SOVIET.ISU152_AMMO_SWITCH_AP_SHELL_MP","ABILITY.SOVIET.ISU152_AMMO_SWITCH_HE_SHELL_MP","ABILITY.SOVIET.ISU152_CONCRETE_PIERCING_ROUND_MP","ABILITY.SOVIET.KATUSHYA_CREEPING_BARRAGE_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_BARRAGE","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_BARRAGE_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_BARRAGE_VET3_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_BARRAGE_VICTORTARGET_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_CREEPING_BARRAGE_MP","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_PRECISION_BARRAGE","ABILITY.SOVIET.KAYTUSHA_ROCKET_TRUCK_PRECISION_BARRAGE_MP","ABILITY.SOVIET.KV_2","ABILITY.SOVIET.KV_2_SEIGE_MODE","ABILITY.SOVIET.KV_8_FLAME_45MM_TOGGLE_MP","ABILITY.SOVIET.LIGHT_ANTI_VEHICLE_MINES","ABILITY.SOVIET.M_42_AT_GUN","ABILITY.SOVIET.M11_PARTISANS_DISPATCH_KARK98K","ABILITY.SOVIET.M11_PARTISANS_DISPATCH_NAGANT","ABILITY.SOVIET.M11_SNIPER_DISPATCH02","ABILITY.SOVIET.M11_SNIPER_DISPATCH02_MP","ABILITY.SOVIET.M11_SNIPER_HOLD_FIRE","ABILITY.SOVIET.M3A1_M5_MOVING_ACCURACY_MP","ABILITY.SOVIET.M5_HALFTRACK_ASSAULT","ABILITY.SOVIET.M5_M3A1_OVERDRIVE","ABILITY.SOVIET.M5_M3A1_OVERDRIVE_MP","ABILITY.SOVIET.MANPOWER_BLITZ","ABILITY.SOVIET.MARK_VEHICLE","ABILITY.SOVIET.MAXIM_HMG_DISPATCH_SP","ABILITY.SOVIET.MERGE_ABILITY","ABILITY.SOVIET.MERGE_ABILITY_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_SLOW","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_SLOW_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_VET_1_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_VET3_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_ABILITY_VICTORTARGET_MP","ABILITY.SOVIET.ML_20_152MM_BARRAGE_PRECISON_ABILITY_MP","ABILITY.SOVIET.MORTAR_EXPLOSION_FX","ABILITY.SOVIET.MORTAR_EXPLOSION_FX_ICE","ABILITY.SOVIET.MORTAR_FIRE_FLARES_ABILITY_MP","ABILITY.SOVIET.MORTAR_PRECISION_BARRAGE_120MM_VET","ABILITY.SOVIET.MORTAR_PRECISION_BARRAGE_120MM_VET_MP","ABILITY.SOVIET.MORTAR_PRECISION_BARRAGE_82MM","ABILITY.SOVIET.MORTAR_PRECISION_BARRAGE_82MM_MP","ABILITY.SOVIET.NO_RETREAT_NO_SURRENDER","ABILITY.SOVIET.PARTISAN_DISPATCH","ABILITY.SOVIET.PARTISAN_DISPATCH_TOW","ABILITY.SOVIET.PARTISAN_MOLOTOV_COCKTAIL_MP","ABILITY.SOVIET.PARTISANS_COMMANDER_ANTI_INFANTRY","ABILITY.SOVIET.PARTISANS_COMMANDER_ANTI_VEHICLE","ABILITY.SOVIET.PENAL_OORAH_MP","ABILITY.SOVIET.PENAL_TROOP_DISPATCH_SINGLE_SP","ABILITY.SOVIET.PENAL_TROOP_DISPATCH_SP","ABILITY.SOVIET.RAPID_CONSCRIPTION","ABILITY.SOVIET.REPAIR_STATION","ABILITY.SOVIET.RG_42_ANTI_PERSONNEL_GRENADE","ABILITY.SOVIET.RG_42_ANTI_PERSONNEL_GRENADE_MP","ABILITY.SOVIET.RGD_1_SMOKE_GRENADE","ABILITY.SOVIET.RGD_1_SMOKE_GRENADE_MP","ABILITY.SOVIET.RGD_33_PARTISAN_GRENADE_MP","ABILITY.SOVIET.SALVAGE_KITS","ABILITY.SOVIET.SATCHEL_CHARGE_THROW_ABILITY_MP","ABILITY.SOVIET.SCORCHED_EARTH_POLICY","ABILITY.SOVIET.SCORCHED_EARTH_POLICY_MP","ABILITY.SOVIET.SHERMAN_SOVIET_DISPATCH","ABILITY.SOVIET.SHERMAN76MM_AMMO_SWITCH_AP_SHELL_MP","ABILITY.SOVIET.SHERMAN76MM_AMMO_SWITCH_HE_SHELL_MP","ABILITY.SOVIET.SHOCK_TROOP_DISPATCH_SP","ABILITY.SOVIET.SHOCK_TROOP_SMOKE_GRENADES","ABILITY.SOVIET.SMOKE_120MM_MORTAR_BARRAGE","ABILITY.SOVIET.SMOKE_120MM_MORTAR_BARRAGE_MP","ABILITY.SOVIET.SMOKE_SYNC_MORTAR_BARRAGE","ABILITY.SOVIET.SMOKE_SYNC_MORTAR_BARRAGE_MP","ABILITY.SOVIET.SNIPER_DELAYED_COVER_AUTO_CAMOUFLAGE","ABILITY.SOVIET.SNIPER_DELAYED_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.SOVIET.SNIPER_FIRE_FLARES_ABILITY","ABILITY.SOVIET.SNIPER_FIRE_FLARES_ABILITY_MP","ABILITY.SOVIET.SNIPER_HMG_SPRINT","ABILITY.SOVIET.SNIPER_HMG_SPRINT_MP","ABILITY.SOVIET.SNIPER_HOLD_FIRE","ABILITY.SOVIET.SNIPER_HOLD_FIRE_MP","ABILITY.SOVIET.SNIPER_IN_COVER_AUTO_CAMOUFLAGE","ABILITY.SOVIET.SNIPER_IN_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.SOVIET.SNIPER_SUPPRESSION_FIRE_ABILITY","ABILITY.SOVIET.SNIPER_SUPPRESSION_FIRE_ABILITY_MP","ABILITY.SOVIET.SOV_VEHICLE_HOLD_FIRE_MP","ABILITY.SOVIET.SOVIET_BARBED_WIRE_CUTTING_ABILITY","ABILITY.SOVIET.SOVIET_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.SOVIET.SOVIET_CAMO_HOLD_FIRE_MP","ABILITY.SOVIET.SOVIET_CONSCRIPT_REPAIR_ABILITY","ABILITY.SOVIET.SOVIET_CONSCRIPT_REPAIR_ABILITY_MP","ABILITY.SOVIET.SOVIET_HQ_ENGINEER_CALL_IN","ABILITY.SOVIET.SOVIET_INDUSTRY","ABILITY.SOVIET.SOVIET_REPAIR_ABILITY","ABILITY.SOVIET.SOVIET_REPAIR_ABILITY_MP","ABILITY.SOVIET.SOVIET_WAR_MACHINE_SP","ABILITY.SOVIET.SPY_NETWORK","ABILITY.SOVIET.SU_76_BARRAGE_ABILITY","ABILITY.SOVIET.SU_76_BARRAGE_ABILITY_MP","ABILITY.SOVIET.SU76_SU85_ZIS3_53K_ISU152_INFANTRY_TRACKING","ABILITY.SOVIET.SU76_SU85_ZIS3_53K_ISU152_INFANTRY_TRACKING_MP","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_120MM","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_120MM_MP","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_120MM_VICTORTARGET_MP","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_MP","ABILITY.SOVIET.SYNC_MORTAR_BARRAGE_VICTORTARGET_MP","ABILITY.SOVIET.T_34_RAMMING_ABILITY","ABILITY.SOVIET.T_34_RAMMING_ABILITY_MP","ABILITY.SOVIET.T70_CREW_REPAIR_ABILITY","ABILITY.SOVIET.T70_CREW_REPAIR_ABILITY_MP","ABILITY.SOVIET.TANK_DETECTION_ABILITY","ABILITY.SOVIET.TANK_TRAPS","ABILITY.SOVIET.TANK_VET_POINT_CAPTURE_ABILITY","ABILITY.SOVIET.TANK_VET_POINT_CAPTURE_ABILITY_MP","ABILITY.SOVIET.TO_THE_LAST_MAN_MP","ABILITY.SOVIET.VEHICLE_CREW_REPAIR_ABILITY","ABILITY.SOVIET.VEHICLE_CREW_REPAIR_ABILITY_MP","ABILITY.SOVIET.VEHICLE_CREW_REPAIR_TOGGLE_MP","ABILITY.SOVIET.VEHICLE_RECON_TOGGLE","ABILITY.SOVIET.VEHICLE_RECON_TOGGLE_MP","ABILITY.SOVIET.VEHICLE_RECON_TOGGLE_VET2_MP","UPG.SOVIET.ABILITY_LOCK_OUT_CONSCRIPT","UPG.SOVIET.ABILITY_LOCK_OUT_CONSCRIPT_MP","UPG.SOVIET.ALLIED_AIR_SUPPLIES","UPG.SOVIET.ANTI_PERSONNEL_MINES","UPG.SOVIET.ANTI_TANK_GUN_AMBUSH_TACTICS","UPG.SOVIET.BASE_CONSCRIPT_AT_GRENADE_UNLOCK","UPG.SOVIET.BASE_CONSCRIPT_AT_GRENADE_UNLOCK_MP","UPG.SOVIET.BASE_CONSCRIPT_MOLOTOV_UNLOCK","UPG.SOVIET.BASE_CONSCRIPT_MOLOTOV_UNLOCK_MP","UPG.SOVIET.BASE_CONSCRIPT_OORAH_UNLOCK","UPG.SOVIET.BASE_CONSCRIPT_OORAH_UNLOCK_MP","UPG.SOVIET.BASE_CONSCRIPT_REPAIR_UNLOCK_MP","UPG.SOVIET.BASE_CONSCRIPT_RIFLE_UNLOCK_MP","UPG.SOVIET.BOOBY_TRAP","UPG.SOVIET.CAMOUFLAGE_NET_ACTIVATED_SOVIET","UPG.SOVIET.COMMANDER_T34_85_MP","UPG.SOVIET.COMMISSAR_SQUAD","UPG.SOVIET.CONSCRIPT_ASSAULT_PACKAGE","UPG.SOVIET.CONSCRIPT_ASSAULT_PACKAGE_INGAME","UPG.SOVIET.CONSCRIPT_AT_GRENADE_ASSAULT","UPG.SOVIET.CONSCRIPT_DP_28_LMG_PACKAGE","UPG.SOVIET.CONSCRIPT_EVASIVE_TACTICS","UPG.SOVIET.CONSCRIPT_MOBILIZE_UNLOCK","UPG.SOVIET.CONSCRIPT_PTRS","UPG.SOVIET.CONSCRIPT_PTRS_PACKAGE","UPG.SOVIET.CONSCRIPT_REPAIR_KIT","UPG.SOVIET.DEMO_IL_2_STRAFING_RUN","UPG.SOVIET.DSHK_MACHINEGUN","UPG.SOVIET.ENGINEER_FLAMETHROWER","UPG.SOVIET.ENGINEER_FLAMETHROWER_MP","UPG.SOVIET.ENGINEER_MINESWEEPER","UPG.SOVIET.ENGINEER_MINESWEEPER_MP","UPG.SOVIET.ENGINEER_SALVAGE_KIT","UPG.SOVIET.ENGINEER_SALVAGE_KITS_UNLOCK","UPG.SOVIET.EVASIVE_TACTICS_IS_ON","UPG.SOVIET.FEAR_PROPAGANDA","UPG.SOVIET.FIRE_ARTILLERY","UPG.SOVIET.FOR_MOTHER_RUSSIA","UPG.SOVIET.FORWARD_HQ","UPG.SOVIET.FORWARD_HQ_AURA","UPG.SOVIET.GUARD_ARCHETYPE","UPG.SOVIET.GUARD_DP_28_LMG_PACKAGE","UPG.SOVIET.GUARD_DP_28_LMG_PACKAGE_MP","UPG.SOVIET.GUARD_TROOPS","UPG.SOVIET.HM120_MORTAR_UNLOCK","UPG.SOVIET.HOLD_FIRE_SOVIET_CAMMO","UPG.SOVIET.HOLD_THE_LINE","UPG.SOVIET.HOWTIZER_203MM","UPG.SOVIET.HQ_ANTI_TANK_GRENADE","UPG.SOVIET.HQ_ANTI_TANK_GRENADE_MP","UPG.SOVIET.HQ_CONSCRIPT_REPAIR_KIT","UPG.SOVIET.HQ_HEALING_AURA","UPG.SOVIET.HQ_HEALING_AURA_M13","UPG.SOVIET.HQ_HEALING_AURA_MP","UPG.SOVIET.HQ_MOLOTOV_GRENADE_MP","UPG.SOVIET.IL_2_ANTI_TANK_BOMB","UPG.SOVIET.IL_2_BOMB_STRIKE","UPG.SOVIET.IL_2_RECON","UPG.SOVIET.IL_2_STURMOVIK_ATTACK","UPG.SOVIET.IL_2_STURMOVIK_ATTACK_ADVANCED","UPG.SOVIET.IL_2_SUPPORT","UPG.SOVIET.IS_2_SUPPORT","UPG.SOVIET.IS2_TOP_GUNNER","UPG.SOVIET.IS2_TOP_GUNNER_MP","UPG.SOVIET.ISAKOVICH_A01","UPG.SOVIET.ISU152_HE_ROUNDS","UPG.SOVIET.ISU152_TOP_GUNNER","UPG.SOVIET.ISU152_TOP_GUNNER_MP","UPG.SOVIET.ISU152_UNLOCK","UPG.SOVIET.KATYUSHA_UNLOCK","UPG.SOVIET.KV_1_UNLOCK_DEMO","UPG.SOVIET.KV_8_UNLOCK","UPG.SOVIET.KV1_UNLOCK","UPG.SOVIET.KV2_UNLOCK","UPG.SOVIET.LIGHT_ANTI_VEHICLE_MINES","UPG.SOVIET.M_42_AT_GUN","UPG.SOVIET.M3_HALFTRACK_ASSAULT","UPG.SOVIET.M5_HALFTRACK_72K_AA_GUN_PACKAGE","UPG.SOVIET.M5_HALFTRACK_72K_AA_GUN_PACKAGE_MP","UPG.SOVIET.MANPOWER_BLITZ","UPG.SOVIET.MARK_VEHICLE","UPG.SOVIET.ML_20_HOWITZER_UNLOCK","UPG.SOVIET.NKVD_ARCHETYPE","UPG.SOVIET.ORDER_227_DISABLE","UPG.SOVIET.ORDER_227_LOCKDOWN","UPG.SOVIET.ORDER227","UPG.SOVIET.PARTISAN_COMMANDER_ANTIVEHICLE_TROOPS","UPG.SOVIET.PARTISAN_COMMANDER_TROOPS","UPG.SOVIET.PARTISAN_HEALTH_UPGRADE","UPG.SOVIET.PARTISAN_HEALTH_UPGRADE_TANK_HUNTER","UPG.SOVIET.PARTISAN_TROOPS","UPG.SOVIET.PARTISAN_TROOPS_TOW","UPG.SOVIET.PENAL_BATTALION","UPG.SOVIET.PENAL_BATTALION_FLAMETHROWER_PACKAGE","UPG.SOVIET.PENAL_BATTALION_FLAMETHROWER_PACKAGE_MP","UPG.SOVIET.PPSH_41_SUB_MACHINE_GUN_UPGRADE","UPG.SOVIET.PPSH_41_SUB_MACHINE_GUN_UPGRADE_MP","UPG.SOVIET.PTRS_41_AT_RIFLE_PACKAGE_GUARD_TROOP","UPG.SOVIET.PTRS_41_AT_RIFLE_PACKAGE_GUARD_TROOP_ASSAULT_MP","UPG.SOVIET.PTRS_41_AT_RIFLE_PACKAGE_GUARD_TROOP_BETTER_BALANCED","UPG.SOVIET.PTRS_41_AT_RIFLE_PACKAGE_GUARD_TROOP_MP","UPG.SOVIET.RADIO_INTERCEPT","UPG.SOVIET.RAPID_CONSCRIPTION","UPG.SOVIET.REPAIR_BUNKER","UPG.SOVIET.SCORCHED_EARTH_POLICY","UPG.SOVIET.SCORCHED_EARTH_POLICY_MP","UPG.SOVIET.SHERMAN_SOVIET_DISPATCH","UPG.SOVIET.SHERMAN_SOVIET_TOP_GUNNER","UPG.SOVIET.SHOCK_ARCHETYPE","UPG.SOVIET.SHOCK_TROOPS","UPG.SOVIET.SHOCK_TROOPS_SP","UPG.SOVIET.SOVIET_GRENADES_LONG_TIMER","UPG.SOVIET.SOVIET_INDUSTRY","UPG.SOVIET.SPY_NETWORK","UPG.SOVIET.T34_85_ADVANCED_UNLOCK","UPG.SOVIET.T34_85_UNLOCK","UPG.SOVIET.TANK_DETECTION","UPG.SOVIET.TANK_RAID_ENABLED","UPG.SOVIET.TANK_TRAPS","UPG.SOVIET.TOW_1941_SOVIET","UPG.SOVIET.VEHICLE_SELF_REPAIR_TRAINING","EBP.WEST_GERMAN.ANTI_TANK_GUN_CREW_MP","EBP.WEST_GERMAN.ARMORED_CAR_SDKFZ_223","EBP.WEST_GERMAN.ARTY_CREW_MP","EBP.WEST_GERMAN.ASSAULT_PIONEER_MP","EBP.WEST_GERMAN.ASSAULT_PIONEERS_HEAVY_MINE_MP","EBP.WEST_GERMAN.BASE_FLAK_GUN_MP","EBP.WEST_GERMAN.BASE_FLAK_SANDBAGS","EBP.WEST_GERMAN.BUNKER_WESTGERMAN_MP","EBP.WEST_GERMAN.FALLSCHIRMJAGER_MP","EBP.WEST_GERMAN.FIELD_OFFICER_MP","EBP.WEST_GERMAN.FLAK_EMPLACEMENT","EBP.WEST_GERMAN.FLAK_EMPLACEMENT_BASE","EBP.WEST_GERMAN.FLAK_EMPLACEMENT_CREW","EBP.WEST_GERMAN.FLAK_EMPLACEMENT_CREW_BASE","EBP.WEST_GERMAN.GOLIATH_MP","EBP.WEST_GERMAN.GRANATWERFER_34_81MM_MORTAR_WG_MP","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_17_FLAK_MP","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_20_IR_SEARCHLIGHT_MP","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_20_IR_SEARCHLIGHT_SP","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_MP_2","EBP.WEST_GERMAN.HALFTRACK_SDKFZ_251_WURFRAHMEN_40_MP","EBP.WEST_GERMAN.HEAVY_ARMOR_SUPPORT_MP","EBP.WEST_GERMAN.HEAVY_ARMOR_SUPPORT_PREPLACED","EBP.WEST_GERMAN.HETZER_MP","EBP.WEST_GERMAN.HMG_CREW_MP","EBP.WEST_GERMAN.HOWITZER_105MM_LE_FH18_MINICHALLENGE","EBP.WEST_GERMAN.HOWITZER_105MM_LONG_RANGE","EBP.WEST_GERMAN.INFANTRY_SUPPORT_MP","EBP.WEST_GERMAN.INFANTRY_SUPPORT_PREPLACED","EBP.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_RECON","EBP.WEST_GERMAN.JAGDPANZER_IV_SDKFZ_162_MP","EBP.WEST_GERMAN.JAGDTIGER_SDKFZ_186_MP","EBP.WEST_GERMAN.JU52_PARATROOPER_PLANE","EBP.WEST_GERMAN.JU52_PLANE","EBP.WEST_GERMAN.KING_TIGER_SDKFZ_182_MP","EBP.WEST_GERMAN.KUBELWAGEN_TYPE_82_MP","EBP.WEST_GERMAN.LE_IG_18_INF_SUPPORT_GUN_MP","EBP.WEST_GERMAN.LIGHT_ARMOR_SUPPORT_MP","EBP.WEST_GERMAN.LIGHT_ARMOR_SUPPORT_PREPLACED","EBP.WEST_GERMAN.MED_SUPPLY_STASH","EBP.WEST_GERMAN.MG34_HMG_CREW","EBP.WEST_GERMAN.MG34_HMG_MP","EBP.WEST_GERMAN.MG42_HMG_WG_MP","EBP.WEST_GERMAN.MINE_FIELD_WESTGERMAN_MP","EBP.WEST_GERMAN.MORTAR_TEAM_CREW_MP","EBP.WEST_GERMAN.OBERSOLDATEN_MP","EBP.WEST_GERMAN.OKW_HOWITZER_105MM_LE_FH18_MP","EBP.WEST_GERMAN.OKW_HOWITZER_CREW_MP","EBP.WEST_GERMAN.OSTWIND_FLAK_PANZER_WEST_GERMAN_MP","EBP.WEST_GERMAN.PAK40_75MM_AT_GUN_WG_MP","EBP.WEST_GERMAN.PAK43_88MM_AT_GUN_WESTGERMAN_MP","EBP.WEST_GERMAN.PANTHER_SDKFZ_171_AUSF_G_MP","EBP.WEST_GERMAN.PANTHER_SDKFZ_171_COMMANDER_MP","EBP.WEST_GERMAN.PANZER_II_LUCHS_SDKFZ_123_MP","EBP.WEST_GERMAN.PANZER_IV_SDKFZ_AUSF_J_MP","EBP.WEST_GERMAN.PANZERFUSILIER_MP","EBP.WEST_GERMAN.PUMA_SDKFZ_234_MP","EBP.WEST_GERMAN.RAKETENWERFER43_88MM_PUPPCHEN_ANTITANK_GUN_MP","EBP.WEST_GERMAN.REINFORCED_BARBED_WIRE_FENCE_MP","EBP.WEST_GERMAN.REINFORCED_BARBED_WIRE_TANK_TRAP_MP","EBP.WEST_GERMAN.SCHU_MINE_42_MP","EBP.WEST_GERMAN.SIPHON_STRUCTURE","EBP.WEST_GERMAN.STURMTIGER_606_38CM_RW_61_MP","EBP.WEST_GERMAN.SWS_HALFTRACK_MP","EBP.WEST_GERMAN.SWS_HALFTRACK_SP","EBP.WEST_GERMAN.TERROR_OFFICER_GUARD_MP","EBP.WEST_GERMAN.TERROR_OFFICER_MP","EBP.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY","EBP.WEST_GERMAN.VOLKSGRENADIER_MP","EBP.WEST_GERMAN.WEST_GERMAN_BASE_STAMPER","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_BARREL","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_CRATES_01","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_CRATES_02","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_GENERATOR","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_SANDBAG_01","EBP.WEST_GERMAN.WEST_GERMAN_COMMAND_POST_SANDBAG_02","EBP.WEST_GERMAN.WEST_GERMAN_HQ_MP","EBP.WEST_GERMAN.WEST_GERMAN_HQ_WRECK_MP","EBP.WEST_GERMAN.WEST_GERMAN_INVISI_REPAIR_STATION_MP","EBP.WEST_GERMAN.WG_BARBED_WIRE_FENCE_MP","EBP.WEST_GERMAN.WG_SANDBAG_FENCE_MP","SBP.WEST_GERMAN.ARMORED_CAR_SDKFZ_234_SQUAD_MP","SBP.WEST_GERMAN.ASSAULT_PIONEER_SQUAD_MP","SBP.WEST_GERMAN.COMMAND_KING_TIGER_SQUAD_MP","SBP.WEST_GERMAN.FALLSCHIRMJAGER_SQUAD_MP","SBP.WEST_GERMAN.FIELD_OFFICER_SQUAD_MP","SBP.WEST_GERMAN.FLAK_EMPLACEMENT","SBP.WEST_GERMAN.FLAK_EMPLACEMENT_BASE","SBP.WEST_GERMAN.GOLIATH_MP","SBP.WEST_GERMAN.GRW34_81MM_MORTAR_SQUAD_MP","SBP.WEST_GERMAN.HETZER_SQUAD_MP","SBP.WEST_GERMAN.HOWITZER_105MM_LE_FH18_ARTILLERY_MINICHALLENGE","SBP.WEST_GERMAN.HOWITZER_105MM_LONG_RANGE","SBP.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_RECON_SQUAD_MP","SBP.WEST_GERMAN.JAGDPANZER_TANK_DESTROYER_SQUAD_MP","SBP.WEST_GERMAN.JAGDTIGER_TD_SQUAD_MP","SBP.WEST_GERMAN.JU52_PARATROOPER_PLANE","SBP.WEST_GERMAN.JU52_PLANE","SBP.WEST_GERMAN.KING_TIGER_SQUAD_MP","SBP.WEST_GERMAN.KUBELWAGEN_SQUAD_MP","SBP.WEST_GERMAN.LE_IG_18_INF_SUPPORT_GUN_SQUAD_MP","SBP.WEST_GERMAN.MG34_HEAVY_MACHINE_GUN_SQUAD_MP","SBP.WEST_GERMAN.MG42_HEAVY_MACHINE_GUN_SQUAD_WG_MP","SBP.WEST_GERMAN.MORTAR_250_HALFTRACK_SQUAD_WESTGERMAN_MP","SBP.WEST_GERMAN.OBERSOLDATEN_SQUAD_MP","SBP.WEST_GERMAN.OKW_HOWITZER_105MM_LE_FH18_ARTILLERY_MP","SBP.WEST_GERMAN.OSTWIND_SQUAD_WESTGERMAN_MP","SBP.WEST_GERMAN.PAK40_75MM_AT_GUN_SQUAD_WG_MP","SBP.WEST_GERMAN.PAK43_88MM_AT_GUN_SQUAD_WESTGERMAN_MP","SBP.WEST_GERMAN.PANTHER_AUSF_G_SQUAD_MP","SBP.WEST_GERMAN.PANTHER_COMMANDER_SQUAD_MP","SBP.WEST_GERMAN.PANZER_II_LUCHS_SQUAD_MP","SBP.WEST_GERMAN.PANZER_IV_AUSF_J_BATTLE_GROUP_MP","SBP.WEST_GERMAN.PANZERFUSILIER_SQUAD_MP","SBP.WEST_GERMAN.RAKETENWERFER43_88MM_PUPPCHEN_ANTITANK_GUN_SQUAD_MP","SBP.WEST_GERMAN.SCOUTCAR_223_SQUAD","SBP.WEST_GERMAN.SDKFZ_251_17_FLAK_HALFTRACK_SQUAD_MP","SBP.WEST_GERMAN.SDKFZ_251_20_IR_SEARCHLIGHT_HALFTRACK_SQUAD_MP","SBP.WEST_GERMAN.SDKFZ_251_20_IR_SEARCHLIGHT_HALFTRACK_SQUAD_SP","SBP.WEST_GERMAN.SDKFZ_251_HALFTRACK_SQUAD_MP_2","SBP.WEST_GERMAN.SDKFZ_251_WURFRAHMEN_40_HALFTRACK_SQUAD_MP","SBP.WEST_GERMAN.STURMTIGER_SQUAD_MP","SBP.WEST_GERMAN.SWS_HALFTRACK_SQUAD_MP","SBP.WEST_GERMAN.SWS_HALFTRACK_SQUAD_SP","SBP.WEST_GERMAN.TERROR_OFFICER_SQUAD_MP","SBP.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY","SBP.WEST_GERMAN.VOLKSGRENADIER_SQUAD_MP","ABILITY.WEST_GERMAN.ADVANCED_SIPHON","ABILITY.WEST_GERMAN.AIRBORNE_ASSAULT","ABILITY.WEST_GERMAN.ARMOR_BLITZ_MP","ABILITY.WEST_GERMAN.ASSAULT_ARTILLERY","ABILITY.WEST_GERMAN.ASSAULT_MOVE_MP","ABILITY.WEST_GERMAN.ASSAULT_PIONEER_BARBED_WIRE_CUTTING_ABILITY_MP","ABILITY.WEST_GERMAN.ASSAULT_PIONEER_DROP_MEDPACK_ABILITY_MP","ABILITY.WEST_GERMAN.BARRAGE_ABILITY_MC","ABILITY.WEST_GERMAN.BASE_BUILDING_RETREAT_POINT_MP","ABILITY.WEST_GERMAN.BLENDKORPER_2H_WAFFEN_ELITE","ABILITY.WEST_GERMAN.BREAKTHROUGH_2","ABILITY.WEST_GERMAN.BREAKTHROUGH_TACTICS","ABILITY.WEST_GERMAN.BUILDING_SELF_DESTRUCT","ABILITY.WEST_GERMAN.BUILDING_SWITCH_FUEL","ABILITY.WEST_GERMAN.BUILDING_SWITCH_MUNITIONS","ABILITY.WEST_GERMAN.COMBAT_BLITZ_MP","ABILITY.WEST_GERMAN.COMMAND_MARK_VEHICLE","ABILITY.WEST_GERMAN.COMMAND_PANTHER","ABILITY.WEST_GERMAN.COMMAND_ROYAL_TIGER_DISPATCH","ABILITY.WEST_GERMAN.CONSTRUCT_ARMORED_INFANTRY_COMMAND","ABILITY.WEST_GERMAN.CONSTRUCT_INFANTRY_BARRACKS","ABILITY.WEST_GERMAN.CONSTRUCT_TANK_COMMAND","ABILITY.WEST_GERMAN.COORDINATED_BARRAGE","ABILITY.WEST_GERMAN.DEFENSIVE_MOVE_MP","ABILITY.WEST_GERMAN.EARLY_WARNING_FLARES","ABILITY.WEST_GERMAN.FALLSCHIRMJAEGER","ABILITY.WEST_GERMAN.FALLSCHIRMJAEGER_GREANDE","ABILITY.WEST_GERMAN.FALLSCHIRMJAEGER_PANZERFAUST","ABILITY.WEST_GERMAN.FALLSCHRIMJAEGER_CAMO","ABILITY.WEST_GERMAN.FATALITY_FLARE_ARTILLERY","ABILITY.WEST_GERMAN.FATALITY_STUKA_FRAGMENTATION_AIRSTRIKE","ABILITY.WEST_GERMAN.FATALITY_STURMTIGER_SATURATION","ABILITY.WEST_GERMAN.FATALITY_WALKING_STUKA_BARRAGE","ABILITY.WEST_GERMAN.FIELD_DEFENSES","ABILITY.WEST_GERMAN.FLAK_EMPLACEMENT_SELF_REPAIR","ABILITY.WEST_GERMAN.FLAK_HALFTRACK_CONCEALING_SMOKE_MP","ABILITY.WEST_GERMAN.FLAME_HALTRACK_DISPATCH","ABILITY.WEST_GERMAN.FLARE_ARTILLERY","ABILITY.WEST_GERMAN.FLARE_TRAP_CAPTURE_POINT","ABILITY.WEST_GERMAN.FOR_THE_FATHERLAND","ABILITY.WEST_GERMAN.FORTIFY_POSITION_MP","ABILITY.WEST_GERMAN.FORWARD_RECEIVERS","ABILITY.WEST_GERMAN.GOLIATH_DISPATCH","ABILITY.WEST_GERMAN.GRW34_MORTAR_COUNTER_BARRAGE_ATTACK_MP","ABILITY.WEST_GERMAN.GRW34_MORTAR_COUNTER_BARRAGE_WEAPON_WG_MP","ABILITY.WEST_GERMAN.GRW34_MORTAR_TEAM_MORTAR_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.GRW34_MORTAR_TEAM_MORTAR_VICTORTARGET_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.GRW34_MORTAR_TEAM_SMOKE_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.HEAT_SHELLS_ABILITY_MP","ABILITY.WEST_GERMAN.HEAT_SHELLS_UNLOCK","ABILITY.WEST_GERMAN.HEAVY_FORTIFICATIONS","ABILITY.WEST_GERMAN.HETZER_DISPATCH","ABILITY.WEST_GERMAN.HOWITZER_105MM_EMPLACEMENT_UNLOCK_OKW","ABILITY.WEST_GERMAN.HOWITZER_105MM_LONG_RANGE_BARRAGE","ABILITY.WEST_GERMAN.HOWITZER_105MM_OFFMAP_BARRAGE","ABILITY.WEST_GERMAN.HOWITZER_TOGGLE_FIRE_PM","ABILITY.WEST_GERMAN.INFILTRATION_TACTICS_GRENADE","ABILITY.WEST_GERMAN.INFILTRATION_TACTICS_UNLOCK","ABILITY.WEST_GERMAN.INFRARED_STG44","ABILITY.WEST_GERMAN.JAEGER_BOOBY_TRAP","ABILITY.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_CAMO","ABILITY.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_RECON_DISPATCH","ABILITY.WEST_GERMAN.JAGDTIGER","ABILITY.WEST_GERMAN.JAGDTIGER_128MM_SUPPORTING_FIRE","ABILITY.WEST_GERMAN.JAGDTIGER_PIERCING_SHELL_ABILITY_MP","ABILITY.WEST_GERMAN.KING_TIGER_COMMAND_MODE_MP","ABILITY.WEST_GERMAN.KING_TIGER_DISPATCH","ABILITY.WEST_GERMAN.KUBELWAGEN_DETECTION_MP","ABILITY.WEST_GERMAN.KUBELWAGEN_HOLD_FIRE_MP","ABILITY.WEST_GERMAN.KUBELWAGEN_IN_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.WEST_GERMAN.LE_IG_18_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.LE_IG_18_BARRAGE_WG_VET_MP","ABILITY.WEST_GERMAN.LE_IG_18_HOLLOW_CHARGE_BARRAGE_WG_MP","ABILITY.WEST_GERMAN.LE_IG_18_HOLLOW_CHARGE_BARRAGE_WG_VET_MP","ABILITY.WEST_GERMAN.MG34_DISPATCH","ABILITY.WEST_GERMAN.MG34_PHOSPHORUS_ROUNDS_MP","ABILITY.WEST_GERMAN.MINESWEEPER_DEPLOY_MP","ABILITY.WEST_GERMAN.MINESWEEPER_PUT_AWAY_MP","ABILITY.WEST_GERMAN.MORTAR_HALFTRACK_WEST_GERMAN","ABILITY.WEST_GERMAN.OFFMAP_NEBEL_BARRAGE_MP","ABILITY.WEST_GERMAN.OKW_HOLD_FIRE_MP","ABILITY.WEST_GERMAN.OKW_RATKEN_VEHICLE_HOLD_FIRE_MP","ABILITY.WEST_GERMAN.OKW_SECTOR_ASSAULT","ABILITY.WEST_GERMAN.OKW_STUKA_AERIAL_SUPERIORITY_RECON","ABILITY.WEST_GERMAN.OKW_VEHICLE_HOLD_FIRE_MP","ABILITY.WEST_GERMAN.OSTWIND_DISPATCH","ABILITY.WEST_GERMAN.PAK40_CRITICAL_SHOTS_WG_MP","ABILITY.WEST_GERMAN.PANZER_IV_GROUP_DISPATCH","ABILITY.WEST_GERMAN.PANZERFUSILIER_AT_RIFLE_GRENADE","ABILITY.WEST_GERMAN.PANZERFUSILIER_GRENADE","ABILITY.WEST_GERMAN.PANZERFUSILIERS_DISPATCH","ABILITY.WEST_GERMAN.PANZERFUSILIERS_FLARE","ABILITY.WEST_GERMAN.PIONEER_STUN_GRENADE_MP","ABILITY.WEST_GERMAN.PIONEER_VOLKS_SALVAGE","ABILITY.WEST_GERMAN.PIONEER_VOLKS_THROUGH_SALVAGE","ABILITY.WEST_GERMAN.PUMA_AIMED_SHOT_MP","ABILITY.WEST_GERMAN.PUMA_SMOKE_SCREEN","ABILITY.WEST_GERMAN.PYRO_VOLKS","ABILITY.WEST_GERMAN.RADIO_SILENCE","ABILITY.WEST_GERMAN.RAKETEN_IN_COVER_AUTO_CAMOUFLAGE_MP","ABILITY.WEST_GERMAN.RAKTEN_CAMOUFLAGE_MP","ABILITY.WEST_GERMAN.RECON_STANCE_MP","ABILITY.WEST_GERMAN.RECOUP_LOSSES","ABILITY.WEST_GERMAN.REFUEL_TANK_WG_SP","ABILITY.WEST_GERMAN.ROCKET_BARRAGE","ABILITY.WEST_GERMAN.SDKFZ_251_17_FLAK_HALFTRACK_DEPLOY_DEFENS","ABILITY.WEST_GERMAN.SDKFZ_251_17_FLAK_HALFTRACK_DEPLOY_WEAPON","ABILITY.WEST_GERMAN.SDKFZ_251_17_FLAK_HALFTRACK_DEPLOY_WEAPON_VET","ABILITY.WEST_GERMAN.SIGNAL_FLAGS","ABILITY.WEST_GERMAN.SIPHON_INCREASE_RESOURCES_ADVANCED_MP","ABILITY.WEST_GERMAN.SIPHON_INCREASE_RESOURCES_MP","ABILITY.WEST_GERMAN.SPEARHEAD_MP","ABILITY.WEST_GERMAN.STALKER_STATE_MP","ABILITY.WEST_GERMAN.STURMTIGER_380MM_ROCKET_ATTACK","ABILITY.WEST_GERMAN.STURMTIGER_380MM_ROCKET_RELOAD","ABILITY.WEST_GERMAN.STURMTIGER_DISPATCH","ABILITY.WEST_GERMAN.STURMTIGER_NAHVW_CLOSE_RANGE_GRENADE_TARGETED","ABILITY.WEST_GERMAN.SUPPORT_TRUCK_GAIN_RESOURCECS","ABILITY.WEST_GERMAN.SUPPORT_TRUCK_TARGET_SETUP","ABILITY.WEST_GERMAN.SUPPORT_TRUCK_TARGET_UNSETUP","ABILITY.WEST_GERMAN.SUPPRESSIVE_FIRE_MP","ABILITY.WEST_GERMAN.SWS_HALFTRACK_DISPATCH","ABILITY.WEST_GERMAN.SWS_HALFTRACK_FORWARD_RECEIVERS","ABILITY.WEST_GERMAN.SWS_HALFTRACK_INTERVAL_DISPATCH","ABILITY.WEST_GERMAN.TANK_COMMANDER_UNLOCK","ABILITY.WEST_GERMAN.TANK_THROW_DEFENSIVE_GRENADE_MP","ABILITY.WEST_GERMAN.TANK_THROW_DEFENSIVE_GRENADE_UNLOCK_MP","ABILITY.WEST_GERMAN.TERROR_OFFICER","ABILITY.WEST_GERMAN.TERROR_OFFICER_FORCE_RETREAT","ABILITY.WEST_GERMAN.TERROR_OFFICER_MARK_TARGET","ABILITY.WEST_GERMAN.THROUGH_SALVAGE","ABILITY.WEST_GERMAN.TIGER_PROWL_JAGDPANZER_MP","ABILITY.WEST_GERMAN.TIGER_PROWL_MP","ABILITY.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY","ABILITY.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY_THROW_ABILITY_MP","ABILITY.WEST_GERMAN.VALIANT_ASSAULT","ABILITY.WEST_GERMAN.VEHICLE_CRITICAL_REPAIR_UNLOCK","ABILITY.WEST_GERMAN.VEHICLE_EMERGENCY_REPAIR_ABILITY_MP","ABILITY.WEST_GERMAN.VEHICLE_EMERGENCY_REPAIR_ABILITY_SWS_MP","ABILITY.WEST_GERMAN.VOLKS_PANZERFAUST_MP","ABILITY.WEST_GERMAN.VOLKSGRENADIER_FIRE_GRENADE_MP","ABILITY.WEST_GERMAN.VOLKSGRENADIER_GRENADE_MP","ABILITY.WEST_GERMAN.VOLKSGRENADIER_PANZERFAUST_MP","ABILITY.WEST_GERMAN.VOLKSGRENADIER_PANZERFAUST_VET_4_MP","ABILITY.WEST_GERMAN.WAFFEN_BOOBY_TRAP_CAPTURE_POINT","ABILITY.WEST_GERMAN.WAFFEN_ELITE_BUNDLED_ASSAULT_GRENADE","ABILITY.WEST_GERMAN.WALKING_STUKA_ROCKET_BARRAGE_CREEPING_MP","ABILITY.WEST_GERMAN.WALKING_STUKA_ROCKET_BARRAGE_CREEPING_NAPALM_MP","ABILITY.WEST_GERMAN.WEST_GERMAN_REPAIR_ABILITY_MP","ABILITY.WEST_GERMAN.WG_HQ_PIONEER_CALL_IN","ABILITY.WEST_GERMAN.ZEROING_ARTILLERY","UPG.WEST_GERMAN.ABILITY_LOCK_OUT_STURMTIGER_NOT_RELOADED","UPG.WEST_GERMAN.ABILITY_LOCK_OUT_STURMTIGER_RELOADING","UPG.WEST_GERMAN.ABILITY_LOCK_OUT_SWS_TRUCK","UPG.WEST_GERMAN.ADVANCED_SIPHON","UPG.WEST_GERMAN.AERIAL_SUPERIORITY_STUKA_RECON_PLANE","UPG.WEST_GERMAN.AIRBORNE_ASSAULT","UPG.WEST_GERMAN.ASSAULT_ARTILLERY","UPG.WEST_GERMAN.ASSAULT_PIONEER_COMBAT_UPGRADE","UPG.WEST_GERMAN.ASSAULT_PIONEER_PANZERSCHRECK_UPGRADE","UPG.WEST_GERMAN.ASSAULT_PIONEER_REPAIR_UPGRADE","UPG.WEST_GERMAN.BREAKTHROUGH_2","UPG.WEST_GERMAN.BREAKTHROUGH_TACTICS","UPG.WEST_GERMAN.BUILDING_1","UPG.WEST_GERMAN.BUILDING_2","UPG.WEST_GERMAN.BUILDING_3","UPG.WEST_GERMAN.COMMAND_PANTHER","UPG.WEST_GERMAN.COMMAND_ROYAL_TIGER_DISPATCH","UPG.WEST_GERMAN.CONSTRUCT_BASE_BUILDING_UPGRADE","UPG.WEST_GERMAN.FALLSCHRIMJAGER_DISPATCH","UPG.WEST_GERMAN.FIELD_DEFENSES","UPG.WEST_GERMAN.FIRST_SWS_HALFTRACK_LOCKOUT","UPG.WEST_GERMAN.FLAK_GUN_UNLOCK_UPGRADE","UPG.WEST_GERMAN.FLAK_PANZER_DEFENSIVES","UPG.WEST_GERMAN.FLAK_PANZER_IS_SETUP","UPG.WEST_GERMAN.FLAME_HALFTRACK_DISPATCH","UPG.WEST_GERMAN.FLAMMPANZER_38T_HETZER","UPG.WEST_GERMAN.FLARE_ARTILLERY","UPG.WEST_GERMAN.FOR_THE_FATHER_LAND","UPG.WEST_GERMAN.FORWARD_RECEIVERS","UPG.WEST_GERMAN.GOLIATH_REMOTE_CONTROLLED_BOMB","UPG.WEST_GERMAN.HEALING_POINT_UNLOCK_UPGRADE","UPG.WEST_GERMAN.HEAT_SHELLS","UPG.WEST_GERMAN.HEAVY_FORTIFICATIONS","UPG.WEST_GERMAN.HOWITZER_105MM_EMPLACEMENT_OKW","UPG.WEST_GERMAN.HOWITZER_105MM_OFFMAP_BARRAGE","UPG.WEST_GERMAN.INFILTRATION_TACTICS","UPG.WEST_GERMAN.INFRARED_STG44","UPG.WEST_GERMAN.JAEGER_LIGHT_INFANTRY_RECON_DISPATCH","UPG.WEST_GERMAN.JAGDTIGER","UPG.WEST_GERMAN.JAGDTIGER_ABILITY_AP_LOCK_OUT","UPG.WEST_GERMAN.JAGDTIGER_ABILITY_BARRAGE_LOCK_OUT","UPG.WEST_GERMAN.JAGDTIGER_ENGINE_IMPROVEMENTS_I_MP","UPG.WEST_GERMAN.KING_TIGER_TOP_GUNNER_MP","UPG.WEST_GERMAN.MEDIC_HEALING_MP","UPG.WEST_GERMAN.MEDICAL_SUPPLIES_0_USES_REMAINING","UPG.WEST_GERMAN.MEDICAL_SUPPLIES_1_USE_REMAINING","UPG.WEST_GERMAN.MEDICAL_SUPPLIES_2_USES_REMAINING","UPG.WEST_GERMAN.MG34_DISPATCH","UPG.WEST_GERMAN.OKW_SECTOR_ASSAULT","UPG.WEST_GERMAN.OSTWIND_DISPATCH","UPG.WEST_GERMAN.PANZER_IV_GROUP_DISPATCH","UPG.WEST_GERMAN.PANZER_IV_SIDE_SKIRTS_MP","UPG.WEST_GERMAN.PANZERFUSILER_DISPATCH","UPG.WEST_GERMAN.PANZERFUSILIER_G43","UPG.WEST_GERMAN.PANZERSCHRECK_UNLOCKED","UPG.WEST_GERMAN.PYRO_VOLKS","UPG.WEST_GERMAN.RADIO_SILENCE","UPG.WEST_GERMAN.RECOUP_ACTIVE","UPG.WEST_GERMAN.RECOUP_LOSS","UPG.WEST_GERMAN.REPAIR_ENGINEERS_MP","UPG.WEST_GERMAN.REPAIR_POINT_UNLOCK_UPGRADE","UPG.WEST_GERMAN.RESOURCE_POINT_SIPHON","UPG.WEST_GERMAN.RETREAT_POINT_UNLOCK_UPGRADE","UPG.WEST_GERMAN.ROCKET_BARRAGE","UPG.WEST_GERMAN.SDKFZ_251_HALFTRACK_FLAMMPANZERWAGEN_UPGRADE_MP_2","UPG.WEST_GERMAN.SIGNAL_FLAGS","UPG.WEST_GERMAN.SIPHON_LOCK_OUT","UPG.WEST_GERMAN.STURMTIGER_DISPATCH","UPG.WEST_GERMAN.SWS_INTERVAL_UNLOCK","UPG.WEST_GERMAN.SWS_STARTING_DISPATCH_UNLOCK","UPG.WEST_GERMAN.TANK_COMMANDER","UPG.WEST_GERMAN.TANK_COMMANDER_UNLOCK","UPG.WEST_GERMAN.TANK_GRENADE","UPG.WEST_GERMAN.TERROR_OFFICER","UPG.WEST_GERMAN.THROUGH_SALVAGE","UPG.WEST_GERMAN.URBAN_ASSAULT_LIGHT_INFANTRY","UPG.WEST_GERMAN.VALIANT_ASSAULT","UPG.WEST_GERMAN.VEHICLE_CRITICAL_REPAIR","UPG.WEST_GERMAN.VOLKS_FLAMETHROWER_MP","UPG.WEST_GERMAN.VOLKS_STG44_UPGRADE","UPG.WEST_GERMAN.WAFFEN_INFRARED_STG44","UPG.WEST_GERMAN.WAFFEN_MG34_LMG_MP","UPG.WEST_GERMAN.WARNING_FLARES","UPG.WEST_GERMAN.WG_HETZER_TOP_GUNNER_MP","UPG.WEST_GERMAN.WG_PANTHER_TOP_GUNNER_MP","UPG.WEST_GERMAN.ZEROING_ARTILLERY","ABILITY.GLOBAL.ARMY_ITEM_GLOBAL_COVER_TRAINING","ABILITY.GLOBAL.ARMY_ITEM_SOVIET_NOT_GONNA_DIE_LIKE_THIS","ABILITY.GLOBAL.AT_76MM_SINGLE_SHOT_ACCURATE","ABILITY.GLOBAL.BLIZZARD_EFFECT","ABILITY.GLOBAL.BLIZZARD_EFFECT_DEEP_SNOW_CAMO","ABILITY.GLOBAL.BLIZZARD_EFFECT_MORTARS","ABILITY.GLOBAL.BLIZZARD_EFFECT_VEHICLE","ABILITY.GLOBAL.BLIZZARD_HOWITZER","ABILITY.GLOBAL.BONUS_0","ABILITY.GLOBAL.BONUS_1","ABILITY.GLOBAL.BONUS_2","ABILITY.GLOBAL.BONUS_2B","ABILITY.GLOBAL.BONUS_3","ABILITY.GLOBAL.BONUS_3B","ABILITY.GLOBAL.BONUS_3C","ABILITY.GLOBAL.BONUS_BACK","ABILITY.GLOBAL.BREAKTHROUGH_TOW","ABILITY.GLOBAL.CAMOUFLAGE_CONSTRUCTION","ABILITY.GLOBAL.CAMOUFLAGE_CONSTRUCTION_ANIA","ABILITY.GLOBAL.CAMPAIGN_STUKA_STRAFE_LONG","ABILITY.GLOBAL.CAPTURE_SPEED","ABILITY.GLOBAL.COMMISSAR_SHOT_227","ABILITY.GLOBAL.COMMISSAR_SHOT_227_ENEMY","ABILITY.GLOBAL.COMMISSAR_SQUAD_TOW","ABILITY.GLOBAL.CONVOY_BUILDBARRICADE","ABILITY.GLOBAL.COVER_ANIMATION_TEST","ABILITY.GLOBAL.DIG_OUT_OF_MUD","ABILITY.GLOBAL.DISPATCH_BRIDGE_PARTISAN","ABILITY.GLOBAL.DISPATCH_BRIDGE_PARTISAN_AT","ABILITY.GLOBAL.DISPATCH_BRIDGE_PARTISAN_HMG","ABILITY.GLOBAL.DISPATCH_BRIDGE_PARTISAN_MORTAR","ABILITY.GLOBAL.DROP_WEAPONS","ABILITY.GLOBAL.FATALITY_BULLSEYE","ABILITY.GLOBAL.FATALITY_COORDINATED_MORTAR_BOMBARDMENT","ABILITY.GLOBAL.FATALITY_DEFAULT","ABILITY.GLOBAL.FATALITY_HOWITZER_105MM_BARRAGE","ABILITY.GLOBAL.FATALITY_HOWITZER_240MM","ABILITY.GLOBAL.FATALITY_LIGHT_SUPPORT_ARTILLERY","ABILITY.GLOBAL.FATALITY_PROTOTYPE","ABILITY.GLOBAL.FATALITY_RAILWAY_GUN_ARTILLERY","ABILITY.GLOBAL.FATALITY_TIME_ON_TARGET_ARTILLERY","ABILITY.GLOBAL.FIRE_DOT","ABILITY.GLOBAL.FLAME_THROWER_ABILITY","ABILITY.GLOBAL.FORWARD_REPAIR_STATION_TOW","ABILITY.GLOBAL.FROZEN_ICON_TEST","ABILITY.GLOBAL.GARRISONED_SQUAD_FACING","ABILITY.GLOBAL.GARRISONED_SQUAD_FACING_UNSET","ABILITY.GLOBAL.HEAL_IN_COVER","ABILITY.GLOBAL.HOWITZER_105MM_BARRAGE_SHORT","ABILITY.GLOBAL.HOWITZER_105MM_BARRAGE_SHORT_PRECISE","ABILITY.GLOBAL.HOWITZER_105MM_DUMMY","ABILITY.GLOBAL.IL_2_ATTACK_STRAFE_HMG","ABILITY.GLOBAL.IL_2_PRECISION_BOMB_STRIKE_TOW","ABILITY.GLOBAL.KV_2_TOW","ABILITY.GLOBAL.LIGHT_ARTILLERY_M10","ABILITY.GLOBAL.M01_IL2_DOGFIGHT_PASS","ABILITY.GLOBAL.M01_IL2_PRECISION_BOMB_STRIKE","ABILITY.GLOBAL.M01_MEDIC_HEAL","ABILITY.GLOBAL.M01_MEDIC_HEAL_CONSTANT","ABILITY.GLOBAL.M01_MORTAR_SINGLE_PRECISE_HARMLESS","ABILITY.GLOBAL.M01_SPRINT_OUT_OF_COMBAT","ABILITY.GLOBAL.M01_STUKA_BOMBING_STRIKE","ABILITY.GLOBAL.M01_STUKA_DOGFIGHT_PASS","ABILITY.GLOBAL.M01_STUKA_STRAFE_FAST","ABILITY.GLOBAL.M01_WOUNDED","ABILITY.GLOBAL.M11_LIGHT_FIRE","ABILITY.GLOBAL.M12_HOWITZER_BARRAGE","ABILITY.GLOBAL.M14_GUARD_TROOP_DISPATCH","ABILITY.GLOBAL.M14_OFF_MAP_SMOKE_BARRAGE","ABILITY.GLOBAL.M24_ANTI_TANK_BUNDLED_GRENADE","ABILITY.GLOBAL.MECHANIZED_ASSAULT_GROUP_TOW","ABILITY.GLOBAL.MOLTKE_DET_PACK","ABILITY.GLOBAL.MUDDY_POINT","ABILITY.GLOBAL.NO_RETREAT_NO_SURRENDER_TOW","ABILITY.GLOBAL.OFF_MAP_ARTILLERY","ABILITY.GLOBAL.OFF_MAP_ARTILLERY_PERCISE","ABILITY.GLOBAL.OFF_MAP_ARTILLERY_PERCISE_FAST","ABILITY.GLOBAL.OFF_MAP_ARTILLERY_PERCISE_SEP","ABILITY.GLOBAL.OFF_MAP_ARTY_SINGLE_SHOT_INSTANT","ABILITY.GLOBAL.OFFICER_AIR_RECON","ABILITY.GLOBAL.OFFICER_CLOSE_AIR_SUPPORT","ABILITY.GLOBAL.OFFICER_FRAGMENTATION_BOMB","ABILITY.GLOBAL.PARTISAN_REPAIR_ABILITY","ABILITY.GLOBAL.PARTISAN_SPRINT","ABILITY.GLOBAL.PREVENT_SUPPRESSION","ABILITY.GLOBAL.PRODUCTION_SPEED","ABILITY.GLOBAL.RADIO_TOWER_REVEAL","ABILITY.GLOBAL.RAILWAY_GUN_ARTILLERY_SINGLE","ABILITY.GLOBAL.READY_UP","ABILITY.GLOBAL.REV_OUT_OF_MUD","ABILITY.GLOBAL.SHOCK_TROOP_FULL_AUTO","ABILITY.GLOBAL.SP_DROP_WEAPONS","ABILITY.GLOBAL.SP_OFF_MAP_ARTY_HARMLESS","ABILITY.GLOBAL.SP_OFF_MAP_ARTY_REAL","ABILITY.GLOBAL.SP_SINGLE_SHOT_MORTAR","ABILITY.GLOBAL.SP_SINGLE_SHOT_MORTAR_M01","ABILITY.GLOBAL.SP_SPRINT","ABILITY.GLOBAL.SP_SPRINT_TOGGLEABLE","ABILITY.GLOBAL.SPY_NETWORK_TOW","ABILITY.GLOBAL.STUKA_BOMBING_STRIKE_W_SMOKE","ABILITY.GLOBAL.STUKA_FAKE_BOMBING_STRIKE","ABILITY.GLOBAL.STUKA_FAKE_STRAFE","ABILITY.GLOBAL.STUKA_STRAFE","ABILITY.GLOBAL.STUKA_STRAFE_M02","ABILITY.GLOBAL.STUKA_STRAFE_M09","ABILITY.GLOBAL.TANK_BUSTER_CONSCRIPT_DISPATCH","ABILITY.GLOBAL.TOW_AIRFIELD_DISPATCH_KV1","ABILITY.GLOBAL.TOW_AIRFIELD_DISPATCH_KV2","ABILITY.GLOBAL.TOW_AIRFIELD_DISPATCH_KV8","ABILITY.GLOBAL.TOW_AIRFIELD_DISPATCH_T34","ABILITY.GLOBAL.TOW_AIRFIELD_STUKA_BOMBING_RUN","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_IS2","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_KAT","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_KV1","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_SU76","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_T34","ABILITY.GLOBAL.TOW_STALINGRAD_DISPATCH_T70","ABILITY.GLOBAL.TRANSFER_ORDERS","ABILITY.GLOBAL.TROOP_TRAINING_TOW","ABILITY.GLOBAL.TUNSTEN_SHELLS_TOW","ABILITY.GLOBAL.WARMING_ANIMATION_TEST","ABILITY.GLOBAL.WE_SURRENDER","SLOT_ITEM.AEC_TARGET_OPTICS_SLOT_ITEM_MP","SLOT_ITEM.AEC_TARGET_TURRET_SLOT_ITEM_MP","SLOT_ITEM.AEC_TREAD_SHOT_MP","SLOT_ITEM.AEF_CALLIOPE_DUMMY_SLOT_ITEM","SLOT_ITEM.AEF_SHERMAN_DUMMY_SLOT_ITEM","SLOT_ITEM.AEF_VEHICLE_ENTERS_INFANTRY_BUFF_APPLIED","SLOT_ITEM.AEF_WHITE_PHOSPHOROUS_MORTAR_UI_ITEM","SLOT_ITEM.AEF_WHITE_PHOSPHOROUS_SHELLS_UI_ITEM","SLOT_ITEM.AEF_WRENCH_ICON_SLOT_ITEM","SLOT_ITEM.AMBUSH_CAMO_PORTRAIT_ICON_ITEM","SLOT_ITEM.AMBUSH_CAMO_SLOT_ITEM","SLOT_ITEM.AMBUSH_CAMO_VISUAL_ITEM","SLOT_ITEM.ARMOR_BLITZ_ITEM","SLOT_ITEM.ASSAULT_ENGINEER_FLAMETHROWER","SLOT_ITEM.ASSAULT_MOVE_ITEM","SLOT_ITEM.AT_76MM_HE_ROUND_ITEM","SLOT_ITEM.AT_76MM_HE_ROUND_ITEM_MP","SLOT_ITEM.AVRE_CREW_SHRAPNEL_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.AVRE_RELOAD_ACTIVE","SLOT_ITEM.AVRE_SPIGOT_MORTAR_MP","SLOT_ITEM.AVRE_SPIGOT_MORTAR_VET_3_MP","SLOT_ITEM.AXIS_ASSAULT_GRENADIER_GRENADE","SLOT_ITEM.AXIS_BLINDING_GRENADE","SLOT_ITEM.AXIS_BLINDING_GRENADE_MP","SLOT_ITEM.AXIS_PANZER_GRENADIER_GRENADE","SLOT_ITEM.AXIS_PANZER_GRENADIER_GRENADE_MP","SLOT_ITEM.AXIS_PG_GRENADE_CAMPAIGN","SLOT_ITEM.AXIS_PG_GRENADE_CAMPAIGN_MP","SLOT_ITEM.AXIS_PG_GRENADE_TUTORIAL","SLOT_ITEM.BAZOOKA_MP","SLOT_ITEM.BLENDKORPER_2H_SMOKE_GRENADE_ITEM_MP","SLOT_ITEM.BOFOR_40MM_AA_MODE_ACTIVATED_MAIN_GUN","SLOT_ITEM.BOFORS_HOLD_FULL","SLOT_ITEM.BOFORS_SUPPRESSIVE_BARRAGE_ROUND_ITEM_MP","SLOT_ITEM.BOFORS_SUPPRESSIVE_BARRAGE_ROUND_ITEM_VICTOR_TARGET_MP","SLOT_ITEM.BOOT_STOMP","SLOT_ITEM.BOYS_ANTI_TANK_RIFLE_MP","SLOT_ITEM.BOYS_ANTI_TANK_RIFLE_SNIPER_MP","SLOT_ITEM.BOYS_SNIPER_RIFLE_ITEM_MP","SLOT_ITEM.BREN_LMG_ICON_DUMMY","SLOT_ITEM.BRIT_17_POUNDER_FLARE_MP","SLOT_ITEM.BRIT_17_POUNDER_HOLD_FULL","SLOT_ITEM.BRIT_17_POUNDER_PIERCING_SHOT_MP","SLOT_ITEM.BRIT_COMMAND_VEHICLE_ITEM","SLOT_ITEM.BRIT_CROC_DUMMY_SLOT_ITEM","SLOT_ITEM.BRIT_EMPLACEMENT_BRACED","SLOT_ITEM.BRIT_EMPLACEMENT_HOLD_FIRE","SLOT_ITEM.BRIT_FIREFLY_TULIP_SLOT_ITEM","SLOT_ITEM.BRIT_HOLD_THE_LINE","SLOT_ITEM.BRIT_MORTAR_PIT_HOLD_FULL","SLOT_ITEM.BRIT_REINFORCE_THE_FRONT","SLOT_ITEM.BRIT_SNIPER_BOYS_ANTI_TANK_CRITICAL_SHOT_MP","SLOT_ITEM.BRIT_UNIT_LOCK_OUT_SLOT_ITEM","SLOT_ITEM.BRUMMBAR_CRITICAL_SHOT_MP","SLOT_ITEM.CAPTAIN_GARRISON_ITEM","SLOT_ITEM.CAPTURE_INTEL_SLOTITEM","SLOT_ITEM.CARRIER_SUPPRESS_ACTIVE","SLOT_ITEM.CAVALRY_AT_SATCHEL_ITEM","SLOT_ITEM.CENTUAR_AA_MODE_ACTIVATED_MAIN_GUN","SLOT_ITEM.CHURUCHILL_SUPPORT_NEGATE","SLOT_ITEM.COMET_SMOKE_SHELL_SHOT_MP","SLOT_ITEM.COMET_SMOKE_SHELL_WP_SHOT_MP","SLOT_ITEM.COMMAND_PANTHER_AURA","SLOT_ITEM.COMMANDO_BREN_LMG_MP","SLOT_ITEM.COMMANDO_DE_LISLE_CARBINE_MP","SLOT_ITEM.COMMANDO_DE_LISLE_CARBINE_SLOT_MP","SLOT_ITEM.COMMANDO_N69_GRENADE_MP","SLOT_ITEM.COMMANDO_THOMPSON_MP","SLOT_ITEM.COMMANDO_THOMPSON_SLOT_MP","SLOT_ITEM.COMMISSAR_SHOT_227","SLOT_ITEM.COMMISSAR_SHOT_227_ENEMY","SLOT_ITEM.CONSCRIPT_MOLOTOV","SLOT_ITEM.CONSCRIPT_MOLOTOV_MP","SLOT_ITEM.COVER_SMOKE_GRENADE_ITEM","SLOT_ITEM.DEF_MOVE_ITEM","SLOT_ITEM.DOUBLE_SWEEP","SLOT_ITEM.DP_28_LIGHT_MACHINE_GUN_PACKAGE","SLOT_ITEM.DP_28_LIGHT_MACHINE_GUN_PACKAGE_MOVING_MP","SLOT_ITEM.DP_28_LIGHT_MACHINE_GUN_PACKAGE_MOVING_NO_PRONE_MP","SLOT_ITEM.DP_28_LIGHT_MACHINE_GUN_PACKAGE_MP","SLOT_ITEM.DSHK38_TURRET_MOUNTED_IS2","SLOT_ITEM.DSHK38_TURRET_MOUNTED_IS2_MP","SLOT_ITEM.DSHK38_TURRET_MOUNTED_ISU152","SLOT_ITEM.DSHK38_TURRET_MOUNTED_ISU152_MP","SLOT_ITEM.DUMMY_FORTIFIED__SLOT_ITEM","SLOT_ITEM.DUMMY_SLOT_ITEM","SLOT_ITEM.DUMMY_SLOT_ITEM_QUAD","SLOT_ITEM.ELEFANT_CRITICAL_SHOT_MP","SLOT_ITEM.ENGINEER_SALVAGE_KIT_DUMMY","SLOT_ITEM.FLAK_HALFTRACK_ICON_ITEM","SLOT_ITEM.FLAMETHROWER_ROKS3_ACCESSORY","SLOT_ITEM.FLAMETHROWER_ROKS3_FAKE","SLOT_ITEM.FLAMETHROWER_ROKS3_ITEM","SLOT_ITEM.FLAMETHROWER_ROKS3_ITEM_MP","SLOT_ITEM.FOR_THE_FATHERLAND_ACTIVE","SLOT_ITEM.FRWD_HQ_SMOKE_MARKER_GRENADE_MP","SLOT_ITEM.FWD_HQ_EMPLACEMENT_SUPPORT","SLOT_ITEM.G43_SNIPER_INCENDIARY_SLOT_ITEM_MP","SLOT_ITEM.GENERIC_MG34_LMG_MP","SLOT_ITEM.GRENADIER_MG42_LMG","SLOT_ITEM.GRENADIER_MG42_LMG_MOVING_MP","SLOT_ITEM.GRENADIER_MG42_LMG_MOVING_NO_PRONE_MP","SLOT_ITEM.GRENADIER_MG42_LMG_MP","SLOT_ITEM.GRENADIER_PANZERFAUST","SLOT_ITEM.GRENADIER_PANZERFAUST_MP","SLOT_ITEM.GROUND_ATTACK_SNIPER_RIFLE_ITEM","SLOT_ITEM.GUARD_TROOP_ASSAULT_PACKAGE","SLOT_ITEM.HALFTRACK_FLAMETHROWER_LEFT","SLOT_ITEM.HALFTRACK_FLAMETHROWER_LEFT_MP","SLOT_ITEM.HALFTRACK_FLAMETHROWER_RIGHT","SLOT_ITEM.HALFTRACK_FLAMETHROWER_RIGHT_MP","SLOT_ITEM.HETZER_FLAMETHROWER_ITEM_MP","SLOT_ITEM.HULLDOWN_SLOT_ITEM","SLOT_ITEM.INFRARED_SQUAD_SETUP","SLOT_ITEM.ISU_PIERCING_SHOT_ROUND_ITEM","SLOT_ITEM.ISU_PIERCING_SHOT_ROUND_ITEM_MP","SLOT_ITEM.JAEGER_G43_RIFLE_ITEM","SLOT_ITEM.JAEGER_G43_RIFLE_ITEM_MP","SLOT_ITEM.JAEGER_LIGHT_RECON_G43","SLOT_ITEM.JAEGER_PANZERGREN_G43_RIFLE_ITEM_MP","SLOT_ITEM.KAR_98K_ANTITANK_RIFLE_GRENADE_SLOT_ITEM","SLOT_ITEM.KAR_98K_ANTITANK_RIFLE_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.KAR_98K_RIFLE_GRENADE_SLOT_ITEM","SLOT_ITEM.KAR_98K_RIFLE_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.KAR_98K_RIFLE_GRENADE_SLOT_ITEM_TUTORIAL","SLOT_ITEM.KV_8_45MM_GUN_ITEM","SLOT_ITEM.KV_8_ATO_41_FLAMETHROWER_ITEM_MP","SLOT_ITEM.KWK_20MM_222_ARMORED_CAR_MP","SLOT_ITEM.LAND_MATTRESS_25LB_ROCKET","SLOT_ITEM.LAND_MATTRESS_60LB_ROCKET","SLOT_ITEM.LAND_MATTRESS_EMPTY","SLOT_ITEM.LAND_MATTRESS_PHOSPHORUS_ROCKET","SLOT_ITEM.LAND_MATTRESS_ROCKET_MARKER","SLOT_ITEM.LEE_ENFIELD_RIFLE_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.LIEUTENANT_GARRISON_ITEM","SLOT_ITEM.LIGHT_AT_MINE_RECENTLY_HIT_HEAVY_VEHICLE","SLOT_ITEM.LIGHT_AT_MINE_RECENTLY_HIT_LIGHT_VEHICLE","SLOT_ITEM.M01_CONSCRIPT_MOSIN_NAGANT","SLOT_ITEM.M15A1_AA_MODE_ACTIVATED","SLOT_ITEM.M15A1_AA_MODE_ACTIVATED_LEFT","SLOT_ITEM.M15A1_AA_MODE_ACTIVATED_MAIN_GUN","SLOT_ITEM.M17_RIFLE_GRENADE_SLOT_ITEM_MP","SLOT_ITEM.M1919A6_LMG_ICON_DUMMY","SLOT_ITEM.M1C_GARAND","SLOT_ITEM.M1C_PATHFINDER_GARAND","SLOT_ITEM.M23_SMOKE_STREAM_GRENADE_ANTI_TANK_ITEM_MP","SLOT_ITEM.M23_SMOKE_STREAM_GRENADE_ITEM_MP","SLOT_ITEM.M24_ANTI_TANK_GRENADIER_GRENADE","SLOT_ITEM.M2HB_50CAL_SHERMAN","SLOT_ITEM.M2HB_TURRET_MOUNTED_M8_MP","SLOT_ITEM.M2HB_TURRET_MOUNTED_SHERMAN_MP","SLOT_ITEM.M5_STUART_DAMAGE_ENGINE_SHOT_SLOT_ITEM_MP","SLOT_ITEM.M5_STUART_SHELL_SHOCK_SHOT_SLOT_ITEM_MP","SLOT_ITEM.M8_CANISTER_SHOT_SLOT_ITEM_MP","SLOT_ITEM.M8_GREYHOUND_RECON_ACTIVATED","SLOT_ITEM.MAJOR_GARRISON_ITEM","SLOT_ITEM.MG34_PINTLE_HETZER","SLOT_ITEM.MG42_TURRET_MOUNTED_BRUMMBAR","SLOT_ITEM.MG42_TURRET_MOUNTED_BRUMMBAR_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_KING_TIGER_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_PANTHER","SLOT_ITEM.MG42_TURRET_MOUNTED_PANTHER_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_PANTHER_WG_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_PZIV","SLOT_ITEM.MG42_TURRET_MOUNTED_PZIV_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_STUGIV","SLOT_ITEM.MG42_TURRET_MOUNTED_STUGIV_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_TIGER","SLOT_ITEM.MG42_TURRET_MOUNTED_TIGER_MP","SLOT_ITEM.MG42_TURRET_MOUNTED_TIGER_TOW","SLOT_ITEM.MINESWEEPER","SLOT_ITEM.MORTAR_FLARE_MP","SLOT_ITEM.MOSIN_NAGANT_SNIPER_RIFLE_ITEM","SLOT_ITEM.MOSIN_NAGANT_SNIPER_RIFLE_ITEM_MP","SLOT_ITEM.OBERSOLDATEN_MG34_LMG_MOVING_MP","SLOT_ITEM.OBERSOLDATEN_MG34_LMG_MOVING_NO_PRONE_MP","SLOT_ITEM.OBERSOLDATEN_MP44_INFARED","SLOT_ITEM.OPEL_SUPPLY_SLOT_ITEM","SLOT_ITEM.PAK40_CRITICAL_SHOT_MP","SLOT_ITEM.PAK43_CRITICAL_SHOT_MP","SLOT_ITEM.PANZER_GRENADIER_MP44_ITEM","SLOT_ITEM.PANZER_GRENADIER_MP44_ITEM_MP","SLOT_ITEM.PANZERBUSCHE_39","SLOT_ITEM.PANZERBUSCHE_39_MP","SLOT_ITEM.PANZERFUISILIER_FLARE_MP","SLOT_ITEM.PANZERFUSILIER_AT_RIFLE_GRENADE","SLOT_ITEM.PANZERFUSILIER_G43","SLOT_ITEM.PANZERFUSILIER_GRENADE","SLOT_ITEM.PANZERSHRECK","SLOT_ITEM.PANZERSHRECK_AT_WEAPON_ITEM","SLOT_ITEM.PANZERSHRECK_DESTROY_ENGINE","SLOT_ITEM.PANZERSHRECK_MP","SLOT_ITEM.PANZERSHRECK_SLOT1","SLOT_ITEM.PANZERSHRECK_SLOT1_MP","SLOT_ITEM.PANZERSHRECK_SLOT2","SLOT_ITEM.PANZERSHRECK_SLOT2_MP","SLOT_ITEM.PARADROP_REINFORCE_ITEM","SLOT_ITEM.PARATROOPER_M1919A6_LMG_MOVING_NO_PRONE_MP","SLOT_ITEM.PARATROOPER_M1919A6_LMG_MP","SLOT_ITEM.PARATROOPER_MK2_GRENADE_MP","SLOT_ITEM.PARATROOPER_THOMPSON_DUMMY","SLOT_ITEM.PARATROOPER_THOMPSON_MP","SLOT_ITEM.PARTISAN_DP_28_LIGHT_MACHINE_GUN_PACKAGE_MP","SLOT_ITEM.PARTISAN_MG42_LMG_MP","SLOT_ITEM.PATHFINDERS_SNIPER_ITEM","SLOT_ITEM.PENAL_TROOP_SATCHEL_CHARGE_ITEM_MP","SLOT_ITEM.PERSHING_HVAP_PIERCING_ITEM_MP","SLOT_ITEM.PIAT_SPIGOT_MORTAR_MP","SLOT_ITEM.PIONEER_FLAMETHROWER","SLOT_ITEM.PIONEER_FLAMETHROWER_ABILITY","SLOT_ITEM.PIONEER_FLAMETHROWER_ABILITY_MP","SLOT_ITEM.PIONEER_FLAMETHROWER_MP","SLOT_ITEM.PIONEER_STUN_GRENADE_MP","SLOT_ITEM.PM_AEF_OFFENSIVE_PUNCH_ITEM","SLOT_ITEM.PPSH41_ASSAULT_PACKAGE","SLOT_ITEM.PPSH41_ASSAULT_PACKAGE_DUMMY_ITEM_MP","SLOT_ITEM.PPSH41_ASSAULT_PACKAGE_MP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_CONSCRIPT_MP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_GUARD_TROOP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_GUARD_TROOP_ASSAULT_MP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_GUARD_TROOP_MP","SLOT_ITEM.PTRS_41_ANTI_TANK_RIFLE_PARTISAN_TROOP_MP","SLOT_ITEM.PUMA_AIMED_SHOT_MP","SLOT_ITEM.PUMA_CRITICAL_SHOT_MP","SLOT_ITEM.RANGER_PANZERSHRECK_MP","SLOT_ITEM.REAR_ECHELON_RIFLE_GRENADE_ACTIVATED","SLOT_ITEM.REAR_ECHELON_RIFLE_VOLLEY_FIRE","SLOT_ITEM.RECOUP_ACTIVE","SLOT_ITEM.RGD_1_SMOKE_GRENADE_ITEM","SLOT_ITEM.RGD_1_SMOKE_GRENADE_ITEM_MP","SLOT_ITEM.RGD_33_SLEEVED_GRENADE_ITEM","SLOT_ITEM.RGD_33_SLEEVED_GRENADE_ITEM_LONGTIMER","SLOT_ITEM.RGD_33_SLEEVED_GRENADE_ITEM_MP","SLOT_ITEM.RIFLEMAN_AT_RIFLE_GRENADE","SLOT_ITEM.RIFLEMEN_30_CAL","SLOT_ITEM.RIFLEMEN_FLARE","SLOT_ITEM.RIFLEMEN_M1918_BAR_MP","SLOT_ITEM.RIFLEMEN_MK2_GRENADE_MP","SLOT_ITEM.RIFLEMEN_TRAINING_DUMMY_CARBINE","SLOT_ITEM.RIFLEMEN_TRAINING_SATCHEL_ITEM","SLOT_ITEM.ROKS_2_FLAMETHROWER_ITEM","SLOT_ITEM.ROKS_2_FLAMETHROWER_ITEM_MP","SLOT_ITEM.RPG_40_ANTI_TANK_GRENADE_MP","SLOT_ITEM.RPG_43_ANTI_TANK_GRENADE","SLOT_ITEM.RPG_43_ANTI_TANK_GRENADE_MP","SLOT_ITEM.SAPPER_BREN_LIGHT_MACHINE_GUN_MP","SLOT_ITEM.SAPPER_STUN_GRENADE_MP","SLOT_ITEM.SAPPER_VICKERS_K_LIGHT_MACHINE_GUN_MP","SLOT_ITEM.SATCHEL_CHARGE_ITEM_MP","SLOT_ITEM.SELF_REPAIR_DUMMY_SLOT_ITEM","SLOT_ITEM.SHERMAN_BATTLE_GROUP_ITEM_MP","SLOT_ITEM.SHOCK_TROOP_RG_42_GRENADE","SLOT_ITEM.SHOCK_TROOP_RG_42_GRENADE_MP","SLOT_ITEM.SIPHON_ACTIVE","SLOT_ITEM.SNIPER_FLARE_MP","SLOT_ITEM.SNIPER_RIFLE_ITEM","SLOT_ITEM.SNIPER_RIFLE_ITEM_MP","SLOT_ITEM.SNIPER_SMOKE_MARKER_GRENADE_MP","SLOT_ITEM.SNIPER_SUPPRESSIVE_VOLLEY_MP","SLOT_ITEM.SOVIET_FLAG","SLOT_ITEM.SPEARHEAD_ITEM","SLOT_ITEM.STALK_ITEM","SLOT_ITEM.STORMTROOPER_MP44_MP","SLOT_ITEM.STUG_CRITICAL_SHOT_MP","SLOT_ITEM.STUG_ELEFANT_PAK40_PAK43_BRUMMBAR_CRITICAL_SHOT","SLOT_ITEM.STUG_ELEFANT_PAK40_PAK43_BRUMMBAR_CRITICAL_SHOT_MP","SLOT_ITEM.STURMTIGER_RELOAD_ACTIVE","SLOT_ITEM.SU76M_HE_ROUND_ITEM","SLOT_ITEM.SU76M_HE_ROUND_ITEM_MP","SLOT_ITEM.SUPPORT_SQUAD_SETUP","SLOT_ITEM.SUPPRESS_FIRE_ITEM","SLOT_ITEM.SWS_LOCKDOWN_SETUP","SLOT_ITEM.TANK_HUNTER_SHOCK_BAZOOKA_VET","SLOT_ITEM.TIGER_ACE_CRITICAL_SHOT_MP","SLOT_ITEM.TIGER_FLARE_TOW","SLOT_ITEM.TOMMY_BREN_LIGHT_MACHINE_GUN_MP","SLOT_ITEM.TOMMY_FLAMETHROWER","SLOT_ITEM.TOMMY_GAMMON_BOMB_HEAVY","SLOT_ITEM.TOMMY_GAMMON_BOMB_MEDIUM","SLOT_ITEM.TOMMY_HEAT_GRENADE","SLOT_ITEM.TOMMY_MILLS_BOMB","SLOT_ITEM.TOMMY_MILLS_BOMB_ASSAULT","SLOT_ITEM.TOMMY_OFFICER_SMOKE_MARKER_GRENADE_MP","SLOT_ITEM.TOMMY_SCOPED_RIFLE_ITEM_MP","SLOT_ITEM.TOMMY_STEN_SMG","SLOT_ITEM.TROOP_SUPPORT_DUMMY_MEDIC","SLOT_ITEM.UNIVERSAL_CARRIER_VICKERS_K_PACKAGE_MP","SLOT_ITEM.UNIVERSAL_CARRIER_VICKERS_MMG_SUPPRESSIVE_MP","SLOT_ITEM.URBAN_ASSAULT_FLAMETHROWER_MP","SLOT_ITEM.URBAN_ASSAULT_SATCHEL_CHARGE_ITEM_MP","SLOT_ITEM.VALENTINE_SMOKE_MARKER_GRENADE_MP","SLOT_ITEM.VICKERS_K_LIGHT_MACHINE_GUN_MP","SLOT_ITEM.VOLKSGRENADIER_FIRE_GRENADE_MP","SLOT_ITEM.VOLKSGRENADIER_GRENADE_MP","SLOT_ITEM.VOLKSGRENADIER_MP44_ITEM_MP","SLOT_ITEM.VOLKSGRENADIER_PANZERFAUST_MP","SLOT_ITEM.VOLKSGRENADIER_PANZERFAUST_VET_4_MP","SLOT_ITEM.WAFFEN_BUNDLED_ASSAULT_GRENADE","SLOT_ITEM.WEST_GERMAN_MINESWEEPER","SLOT_ITEM.WG_BLENDKORPER_SMOKE_UI_ITEM","SLOT_ITEM.WG_PANZER_IV_ARMORED_SKIRTS","CRIT._NO_CRITICAL","CRIT._NO_CRITICAL_MINE","CRIT._NO_CRITICAL_REAR","CRIT._SP_ANIA_EXPLOSIVE","CRIT._SP_ANIA_KILLED","CRIT.ASSAULT_MODIFIERS","CRIT.ATTACK_PLAN_MODIFIERS","CRIT.AXIS_ASSAULT_MODIFIERS","CRIT.BRIDGE_DEMOLITION_MAKE_WRECK","CRIT.BRIDGE_MAKE_WRECK","CRIT.BUILDING_ABANDON","CRIT.BUILDING_BRACED","CRIT.BUILDING_DESTROY","CRIT.BUILDING_DESTROY_CONSTRUCTION","CRIT.BUILDING_DESTROY_SUPPLY_CENTER","CRIT.BUILDING_FIRE_DAMAGE_DOT","CRIT.BUILDING_FIRE_DAMAGE_PANEL","CRIT.BUILDING_PANEL_DAMAGE_CRITICAL","CRIT.BUILDING_RED_BUILD_TIME_INCREASE","CRIT.BUILDING_STRONG_CRITICAL","CRIT.BUILDING_WEAK_CRITICAL","CRIT.BUILDING_YELLOW_BUILD_TIME_INCREASE","CRIT.BULLET_HIT_CRITICAL","CRIT.BURN","CRIT.BURN_DEATH","CRIT.BURN_DEATH_OUT_OF_CONTROL","CRIT.BURN_WORLD_OBJECT","CRIT.BURN_WORLD_OBJECT_DEATH","CRIT.CAMOUFLAGE_MINE","CRIT.CHURCHILL_TANK_SHOCK_MODIFIERS","CRIT.DETONATE_BANGALORE","CRIT.DETONATE_DEMOLITION_CHARGE","CRIT.DETONATE_MINE","CRIT.EMPLACEMENT_EMPTY","CRIT.EMPLACEMENT_FLAME_CRITICAL","CRIT.EMPLACEMENT_KILL_LOADER","CRIT.EXPLOSIVE_DESTROY","CRIT.GOLIATH_DESTROY","CRIT.HEROIC_CHARGE_FATIGUE","CRIT.MAKE_CASUALTY","CRIT.SOLDIER_BLIND","CRIT.SOLDIER_EXECUTED","CRIT.SOLDIER_EXPLOSIVE_ROUND","CRIT.SOLDIER_FLAMETHROWER_EXPLODE","CRIT.SOLDIER_FORCE_RETREAT","CRIT.SOLDIER_FROZEN","CRIT.SOLDIER_KILLED","CRIT.SOLDIER_KILLED_DEATH_INTENSITY_100","CRIT.SOLDIER_KILLED_DEATH_INTENSITY_30","CRIT.SOLDIER_KILLED_DEATH_INTENSITY_60","CRIT.SOLDIER_KILLED_HMG_DEATH","CRIT.SOLDIER_PIN","CRIT.SOLDIER_SLOW","CRIT.SOLDIER_SNIPED","CRIT.SOLDIER_SNIPED_IN_HALFTRACK","CRIT.SOLDIER_SNIPED_MAKE_CASUALTY","CRIT.SOLDIER_SNIPED_STILL_ALIVE","CRIT.SOLDIER_STUN","CRIT.SOLDIER_SUPPRESS","CRIT.SQUAD_ITEM_DAMAGED","CRIT.STUNNED_CANNOT_SHOOT_10_SECONDS","CRIT.STUNNED_CANNOT_SHOOT_MOVE_10_SECONDS","CRIT.SUPPLY_DROP_BLOW_UP","CRIT.TANK_TRAP_DESTROY","CRIT.TEAM_WEAPON_DISABLING_SHOT","CRIT.VEHICLE_ABANDON","CRIT.VEHICLE_ABANDON_STURMTIGER","CRIT.VEHICLE_AEC_TEMP_ENGINE_DAMAGE","CRIT.VEHICLE_AEC_TEMP_IMMOBILITY","CRIT.VEHICLE_BLIND","CRIT.VEHICLE_CREW_DAZED_JAGDTIGER","CRIT.VEHICLE_CREW_SHOCKED","CRIT.VEHICLE_CREW_STUNNED","CRIT.VEHICLE_CREW_STUNNED_2","CRIT.VEHICLE_DAMAGE_ENGINE","CRIT.VEHICLE_DAMAGE_ENGINE_INCREMENTAL","CRIT.VEHICLE_DAMAGE_ENGINE_REAR","CRIT.VEHICLE_DAMAGE_ENGINE_REAR_RAMMING","CRIT.VEHICLE_DAMAGE_ENGINE_SNARE","CRIT.VEHICLE_DECREW","CRIT.VEHICLE_DESTROY","CRIT.VEHICLE_DESTROY_BREW_UP","CRIT.VEHICLE_DESTROY_ENGINE","CRIT.VEHICLE_DESTROY_ENGINE_REAR","CRIT.VEHICLE_DESTROY_MAINGUN","CRIT.VEHICLE_DESTROY_MAINGUN_RAMMING","CRIT.VEHICLE_DESTROY_QUAD_50","CRIT.VEHICLE_DESTROY_SEARCHLIGHT_IR_HALFTRACK","CRIT.VEHICLE_DESTROY_WEAPON_TEAM","CRIT.VEHICLE_DRIVER_INJURED","CRIT.VEHICLE_ENGINE_BURNING","CRIT.VEHICLE_EXHAUST_DAMAGED","CRIT.VEHICLE_GUNNER_INJURED","CRIT.VEHICLE_KILL_BRIT_TANK_COMMANDER","CRIT.VEHICLE_KILL_COMMANDER","CRIT.VEHICLE_KILL_DRIVER_RUSSIAN","CRIT.VEHICLE_KILL_GUNNER_RUSSIAN","CRIT.VEHICLE_KILL_RELOADER_RUSSIAN","CRIT.VEHICLE_KILL_TOP_GUNNER_HARDPOINT_1","CRIT.VEHICLE_KILL_TOP_GUNNER_HARDPOINT_2","CRIT.VEHICLE_KILL_TOP_GUNNER_HARDPOINT_4","CRIT.VEHICLE_LIGHT_DAMAGE_ENGINE","CRIT.VEHICLE_LIGHT_DAMAGE_ENGINE_REAR","CRIT.VEHICLE_LIGHT_DESTROY_ENGINE","CRIT.VEHICLE_LIGHT_DESTROY_ENGINE_REAR","CRIT.VEHICLE_LOADER_INJURED","CRIT.VEHICLE_LOSE_TREADS_OR_WHEELS","CRIT.VEHICLE_MAKE_WRECK","CRIT.VEHICLE_OPTICS_DAMAGED","CRIT.VEHICLE_OPTICS_DAMAGED_TEMP","CRIT.VEHICLE_OUT_OF_CONTROL_FAST","CRIT.VEHICLE_OUT_OF_CONTROL_SLOW","CRIT.VEHICLE_OUT_OF_FUEL_GERMAN_SP","CRIT.VEHICLE_SHELL_SHOCKED","CRIT.VEHICLE_SNIPER_SLOW","CRIT.VEHICLE_STUCK_IN_MUD","CRIT.VEHICLE_TANK_GRAB_ABANDON_SP","CRIT.VEHICLE_TEMP_IMMOBILITY","CRIT.VEHICLE_TURRET_DISABLED_TEMP","CRIT.VEHICLE_UNIVERSAL_CARRIER_FLAMETHROWER_EXPLODE","CRIT.VEHICLE_VISION","CRIT.VEHICLE_VISON_BLOCK_DAMAGED","CRIT.VEHICLE_WEAPON_DISABLED_TEMP","CRIT.WORLD_DESTROY_BARRIER","CRIT.WORLD_OBJECT_DESTROY","CRIT.WORLD_OWNED_VEHICLE_ABANDON","BridgeReplace_OnInit","SkinPreviewCapture_Init","SkinPreviewCapture_SpawnVehicles","SkinPreviewCapture_UIInit","SkinPreviewCapture_CycleAndCaptureScreenshots","SkinPreviewCapture_Begin","SkinPreviewCapture_BeginCountdown","SkinPreviewCapture_ExitCountdown","SkinPreviewCapture_Exit","SkinPreviewCapture_StartCountdown","Map_PreInit","SkinPreviewCapture_Configure","AOH_PreInit","AV_PreInit","AV_Init","AV_UpdateObjectiveTimer","AV_UIInit","AV_End","CCM_ActionSpawnUKFSpawner","CCM_ActionSpawnUKFMiscSpawner","Squad_ToClipboardData","Squad_FromClipboardData","Entity_FromClipboardData","Entity_ToDataParameters","Entity_GetHealthPointsString","Squad_ToDataParameters","Squad_GetHealthPointsString","Player_ToDataParameters","Player_GetSetting","Player_SetSetting","Player_GetSettings","LocalPlayer_GetSettings","Data_GetHealthModifiedString","Data_GetOwnerChangedString","CCM_EventCueClickManger","CCM_EventMessage","CCM_EventKickerMessage","CCM_EventKickerMessageEval","CCM_EventKickerHealthMessageEval","CCM_ErrorMessage","Item_GetEnemyPlayer","CCM_SpawnQueueTick","CCM_SpawnQueueInit","CCM_SpawnQueueAdd","CCM_DummyMessage","CCM_PlayerCommandIssued","CCM_SquadCommandIssued","CCM_EntityCommandIssued","CCM_CustomUIEvent","Variable_FromG","Ternary","CCM_PlayerCommandIssued2","CCM_ConfigInit","__subMenu_SetUpdateRate","__subMenu_SpawnUnits","__subMenu_ManipulateSquadMembers","__panel_SelectionHealth","TestFormAdd","TestFormRender","Test_SlotItemRemoveSpam","Test_SlotItemRemoveSpam_Tick","CCM_HealthMonitor_Tick","CCM_HealthMonitor_HandleHealthMessage","CCM_HealthMonitor_RegisterNewItem","CCM_HealthMonitorInit","CCM_SuppressionMonitor_Tick","CCM_SuppressionMonitor_HandleMessage","CCM_SuppressionhMonitor_RegisterNewItem","CCM_SuppressionMonitorInit","CCM_Init","CCM_UIInit","CCM_BroadcastMessageReceived","CCM_Broadcast","CCM_ShowCrosshair","CCM_HideCrosshair","CCM_DisableUI","CCM_EnableUI","CCM_KillSelection","CCM_DeleteSelection","CCM_KillSquad","CCM_DeleteSquad","CCM_KillEntity","CCM_DeleteEntity","CCM_EnableFOW","CCM_DisableFOW","CCM_EnableAI","CCM_DisableAI","CCM_SetAIDifficulty","CCM_SetSelectionHealth","CCM_AddSelectionHealthPercentage","CCM_AddSelectionHealthPoints","CCM_SetSelectionInvulnerability","CCM_SetSelectionOwner","CCM_AddResource","CCM_ResetResource","CCM_AddPopulationCap","CCM_SetInstantProductionEnabled","CCM_SetInstantConstructionEnabled","CCM_SetInstantAbilityRechargeEnabled","CCM_SpawnSquad","CCM_SpawnEntity","CCM_SpawnSlotItem","CCM_IncreaseSelectionXP","CCM_IncreaseSelectionVeterancyLevel","CCM_InstantReinforceSelection","CCM_SplitSelection","CCM_RemoveSelectionCriticals","CCM_RemoveSquadCritical","CCM_RemoveEntityCritical","CCM_ApplyCriticalToSelection","CCM_SetSquadAutoTargetting","CCM_RemoveSquadUpgrade","CCM_RemoveEntityUpgrade","CCM_RemoveSquadSlotItem","CCM_SetSelectionFacing","CCM_TeleportSelection","CCM_KillEverything","CCM_DeleteEverything","CCM_RotateEntity","CCM_SetHealthMonitorEnabled","CCM_SetSuppressionMonitorEnabled","CCM_SelectedTeamWeaponGarrisonFacePosition","CCM_CancelTeamWeaponGarrisonFacingOrder","CCM_AddSelectionSuppression","CCM_SetAllAIPlayersEnabled","CCM_ResetSelectionVeterancy","CCM_SetResourceIncomeEnabled","CCM_SetHealthMonitorUpdateRate","CCM_SetSuppressionMonitorUpdateRate","CCM_UnlockCommanderAbility","CCM_ClearCommanderAbilities","CCM_ModifySquadMovementSpeed","CCM_SetSelectionOwnerToEnemy","CCM_SquadToEntity","CCM_SetEntityAnimatorState","CCM_SetSquadAnimatorState","CCM_SetSelectionAnimatorState","CCM_SetSelectionSkinType","CCM_DropSelectionWeapons","CCM_CaptureAllTerritorySectors","CCM_NeutralizeAllTerritorySectors","CCM_SquadToSkinPreviewEntity","Enhanced_Init","Enhanced_SystemInit","Enhanced_BroadcastMessageReceived","Enhanced_UITick","Enhanced_SetButtonsEnabled","Enhanced_ResetButtonIcons","Enhanced_SetButtonsVisible","Enhanced_PreInit","Enhanced_UIInit","Dude","MyMap_OnInit","MyMap_BonusUnitKilled","prnt","toCharArray","export","include","getBlueprintIfItExists","getBlueprintName","instanceOf","parent","Loc_Create","broadcastMessage","delayedStart","Map_PlayerBonusUnitKilled","MyFunction","Map_OnInit","Gardeners_PreInit","AutoAbandonManager","AutoAbandon_Add","AutoAbandon_Remove","AutoDeleteManager","AutoDelete_Add","AutoDelete_Remove","AutoRetreatManager","AutoRetreat_Add","AutoRetreat_Remove","Parameters_ToStringData","Parameters_FromStringData","Player_FromStringData","Squad_FromStringData","Entity_FromStringData","Broadcast","Camera_MoveToCallback","Camera_MoveToCallback_Tick","CameraPosition","Class","Color","Margin","Padding","Player","Control","Button_CreateConfig","Button_GetIcon","Button","FormControl_Init","FormControl_Refresh","Form","Icon","Label","NumericUpDown_CreateIconConfig","NumericUpDownScroll_Tick","NumericUpDown_RegisterAutoScroll","NumericUpDown_UnregisterAutoScroll","NumericUpDown","MenuControl_Init","Menu_AutoRefresh","Menu_AutoCheckEnabledScan","Menu_AutoCheckCheckedScan","CloseMenus","Menu","Menu_CreateBorderImage","Panel_GetMultipartBackground","Panel","PanelColumn","PanelColumnCollection","Class_GetUniqueID","Class_CreateInstance","Construct","CompanyCommander_Create","ControlSystem_Init","Button_FromTag","ButtonCallbackHandler","Control_GetName","Control_GetX","Control_GetY","Control_GetPath","Control_GetText","Control_GetTag","BPData_GetExtensions","Loc_Get","EBP_HasExtension","EBPData_HasExtension","EBP_GetScreenName","EBP_GetIcon","EBPData_GetUIExt","EBPData_GetScreenName","EBPData_GetIcon","SBP_GetScreenName","SBP_GetIcon","SBPData_GetRaceUIExt","SBPData_GetScreenName","SBPData_GetIcon","Crit_GetScreenName","CritData_GetUIExt","CritData_GetScreenName","CritData_GetIcon","UPG_GetScreenName","UPGData_GetScreenName","SlotItem_GetScreenName","SlotItemData_GetScreenName","EGroup_ToTable","EGroup_IsAlive","EGroup_IsCapturedByTeam2","LocalImport","ImportSystem","ImportDataTables","Library_Load","Lib_EnableMessages","Lib_SetMessagesEnabled","Lib_SetupMod","Mod_GetIcon","Mod_GetAbilityBlueprint","Mod_GetSquadBlueprint","Mod_GetEntityBlueprint","Mod_GetUpgradeBlueprint","Msg_Pos","Msg_3D","Lib_GameOver","Debug_SetMessagesEnabled","TryCatch","Library_Setup","Entity_Validate","Entity_AddHealthPercentage","Entity_AddHealthPoints","Entity_GetOwnerString","Entity_GetBPName","Entity_GetCriticals","Entity_RemoveCriticals","Entity_IsTeamWeapon","Entity_IsValidSafe","Entity_GetUpgrades","Entity_Rotate","Entity_GetTypes","Entity_IsOfType2","Entity_HasUpgrades","EBP_GetTypes","EBP_IsOfType","Entity_Decrew","Entity_PrepareForScreenshot","Entity_SetSkinSeason","Entity_GetBlueprintName","Entity_HasModifierExt","Percentage_Normalize","Round","scientific","Player_GetIndex","Player_SetResourcesEnabled","Player_ResetResources","Player_GetAllSquads","Player_DestroyAllSquads","Player_GetDisplayRaceName","Player_GetDisplayRaceNameLong","Player_GetNameWithFaction","AIDifficulty_Tostring","Player_IsAI","Player_ForEachSquad","Pos_NormalizeHeight","Rule_AddIntervalAndRun","Rule_AddIfNotExists","Rule_AddIntervalIfNotExists","Rule_ChangeIntervalIfExists","Rule_AddDelayed","Rule_AddDelayedIfNotExists","Modify_SetSquadtAutoTargetting","Modify_SetEntityAutoTargetting","Modify_SetEntityAutoTargettingAllHardpoints","Modify_SetSquadAutoTargettingAllHardpoints","Modify_SetSGroupAutoTargettingAllHardpoints","Modify_SetEGroupAutoTargettingAllHardpoints","Modify_SquadTypeEnableCapturing","Selection_UnselectAll","Selection_IsOneEntity","Selection_IsOneSquad","Selection_IsOneSquadOrOneEntity","Selection_IsOneOrMoreSquads","Selection_IsOneOrMoreEntities","Selection_IsSquadsOrEntities","Selection_IsSquadOrEntity","Selection_GetSquad","Selection_GetEntity","Selection_GetSquads","Selection_GetEntities","Misc_SomethingIsSelected","Selection_ForEachSquad","Selection_ForEachEntity","Selection_IsNotInvulnerable","Selection_IsNotNeutralSquadOrEntity","Selection_CountInvulnerables","Selection_IsInvulnerable","SelectionMonitor_Init","SelectionMonitor","SelectionMonitor_GetID","SelectionMonitor_AddSquad","SelectionMonitor_AddEntity","SelectionMonitor_RemoveSquad","SelectionMonitor_RemoveEntity","SelectionMonitor_RemoveItemListener","SelectionMonitor_RemoveSquadLister","SelectionSystem_RemoveEntityLister","SGroup_ToTable","SGroup_SetPosition","SGroup_CountEntities","SGroup_IsAlive2","Squad_CountSpawned","Squad_IsPlane","Squad_SetSelectable","Squad_GetLastAttackerSquad","Squad_IsSelected","Squad_AddHealthPercentage","Squad_AddHealthPoints","Squad_Abandon","Squad_GetOwnerString","Squad_GetBPName","Squad_GetCriticals","Squad_RemoveCriticals","Squad_IsValidSafe","Squad_SetAutoTargetting","__RegisterSquadAutoTargettingModifier","__UnRegisterSquadAutoTargettingModifier","__RegisterEntityAutoTargettingModifier","__UnRegisterEntityAutoTargettingModifier","Squad_SetAllAutoTargetting","Squad_GetAutoTargetting","Squad_GetAllAutoTargetting","Squad_GetUpgrades","Squad_HasUpgrades","Squad_RemoveSlotItem","Squad_RemoveUpgradeFully","Squad_ForEachHeldSquad","Squad_DestroyHeldSquads","Squad_KillHeldSquads","Squad_ModifyVehicleSpeed","Squad_ModifyVehicleRotationSpeed","Squad_ModifyTurretHorizontalSpeed","Squad_ModifyMovementSpeed","Squad_GetTypes","Squad_IsOfType","SBP_GetTypes","SBP_IsOfType","Squad_GetEntityTable","Squad_ToEntities","Squad_ToEntity","Squad_AddMainGunHorizontalRotation","Squad_SetMainGunHorizontalRotation","Squad_Decrew","Squad_SetSkinSeason","Squad_RemoveSlotItems","Squad_GetEntityStateString","Squad_RemoveUpgradeIfPresent","Squad_RemoveUpgradesIfPResent","String_Match","String_Replace","String_AddGenetive","String_Split","Number_TrailingZeroes","Outpost","Outpost_Init","OutpostManager_Register","OutpostManager_Tick","OutpostPatrol","OutpostCaptureTrigger","OutpostPatrolAlarmedSquads_Register","OutpostPatrolAlarmedSquads_Tick","OutpostPatrolManager_Register","OutpostPatrolManager_Tick","OutpostRadioPost","OutpostRadioPostManager_Register","OutpostRadioPostManager_Tick","Table_AddTable","Table_GetSmallest","Table_GetLargest","Table_RemoveValue","Table_IsEmpty","Table_GetRandomBlueprint","Table_Remove","Table_ToIndexableList","Table_Count","Table_Compare","RangeTable_GetRandomValue","OutpostReinforcementsManager_Register","OutpostReinforcementsManager_Tick","Team_GetRandomPlayer","Team_GetRandomPlayers","Time_TicksToSeconds","Time_SecondsToTicks","Time_MinutesToTicks","UI_EnableSelectionVisuals","UI_EnableSquadSelectionVisuals","SelectionVisual_Tick","SelectionVisual_RegisterEntity","UI_ScalePoint","Util_DelaySeconds","Util_DelayMinutes","Util_DelayRandom","Util_DelayRandomSeconds","Util_GetRandomPosExtended","Util_GetRandomHeadingPos","UIFrame_Destroy","Misc_Tester","Util_DistanceFromLine","Util_DistancePointToTeamShortest","HintPoints_Remove","MapIcon_CreateAndFacePosition","toboolean","ResourceType_ToString","ResourceType_FromString","ResourceType_ToDisplayString","Selection_GetPlayer","Objective_UpdateTitle","Objective_StartLocally","Util_CallFunctionsWithParameters","World_ForEachEntity","World_DivideTerritoryBetweenTeams","World_GetWidthRange","World_GetLengthRange","World_RegisterPlayers","World_GetEverythingNearPoint","World_GetAll","World_GetAllSquads","World_ForEeachSquad","World_OneOrMoreAIPlayerIsEnabled","World_OneOrMoreAIPlayerIsDisabled","World_CleanUpTheDeadAll","World_GetAllTerritoryPointEntities","Villagers_PreInit","WarDrive_Init","_getPlayerMineEBP","_spawnMines","WarDrive_GetPlayerReconAbility","WarDrive_ReconSweepBetweenTeams","WarDrive_GetNextEffectDelay","WarDrive_PickRandomEffect","WarDrive_SplitTimeUnits","WarDrive_FormatTime","WarDrive_Monitor","Team_HasTerritoryPoint","WarDrive_EntityKilled","WarDrive_SquadKilled","TestEffect","WarDrive_EnableEffect","WarDrive_RemoveModifiers","WarDrive_GetIcon","WarDrive_RegisterModifier","Modify_SquadBuildTime","Modify_SquadReinforceTime","Modify_EntityCaptureTime","WarDrive_ObjectiveInit","WarDrive_ObjectiveAfterInt","WarDrive_Pager","WarDrive_AbilityExecuted","WarDrive_GetAbilityBlueprint","WarDrive_PreInit","CCM_AddInfiniteResourcesPopcap","CCM_ActionKillSelection","CCM_ActionDeleteSelection","CCM_ActionTeleportSelection","CCM_ActionIncreaseSelectionVeterancy","CCM_ActionIncreaseSelectionHealth","CCM_ActionDecreaseSelectionHealth","CCM_ModifySelectionHealth","CCM_ActionAbandonSelected","CCM_ActionRemoveCriticals","CCM_ActionDropSlotItems","CCM_ActionInstantReinforce","CCM_ActionAddPreciseManpower","CCM_ActionAddPreciseFuel","CCM_ActionAddPreciseMunition","_CCM_SpawnSpawnerSquad","CCM_ActionSpawnSovietSpawner","CCM_ActionSpawnAEFSpawner","CCM_ActionSpawnGermanSpawner","CCM_ActionSpawnWestGermanSpawner","CCM_ActionAddFullHealth","CCM_ActionKillOneEntity","CCM_ActionDeleteOneEntity","CCM_ActionSpawnGermanMiscSpawner","CCM_ActionSpawnSovietMiscSpawner","CCM_ActionSpawnWestGermanMiscSpawner","CCM_ActionSpawnAEFMiscSpawner","CCM_DataInit","CCM_CopySelection","CCM_PasteSelection","Clipboard_Clear","CCM_PreInit","CCM_SystemInit","CCM_PlayerResetAbilities","Player_GetSettingsKey","CCM_PlayerAbilityCompleteListener","CCM_PlayerAbilityListener","CCM_RegisterPlayerAction","Squad_GetSpawnerRaceIndex","Squad_GetSpawnerTable","Squad_GetSpawnAbilityPrefix","CCM_SquadAbilityListener","CCM_CountSpawnTableItems","_CCM_InitSpawnerSquad","CCM_AutoHideAbilities","Entity_CreateAndSpawnTowardTeamWeapon","Entity_GetUpgradeTable","Entity_ApplyCriticalHit","Entity_GetText","Entity_Abandon","EntityBP_IsBuilding","Util_Destroy","Util_GetBPName","Misc_CheckForParentSquad","Squad_GetTableKey","Entity_GetTableKey","Util_GetTablekey","Util_SetInvulnerable","Player_GetIDSafe","Table_ForEach","CCM_Msg","CCM_ClearMSG","CCM_GetAbilityBleprint","CCM_GetSquadBlueprint","CCM_GetEntityBlueprint","CCM_GetUpgradeBlueprint","CCM_GetIcon","CCM_EventCue","Misc_AddSpawnedItemToSystem","Util_AddHealth","Misc_DoPercentageSum","Util_SetPosition","Util_GetGameID","Util_DecodeGameID","Misc_SpawnSlotItemOnGround","Squad_ModifySpeed","Squad_GetHealthTable","Squad_ApplyHealthTable","Squad_GetPlayerOwnerSafe","Squad_GetHeadingTable","Squad_ApplyHeadingTable","Squad_GetUpgradesTable","Squad_GetText","Squad_GetCriticalsTable","Squad_ApplyCriticalHitTable","Squad_ModifyDamage","Squad_DropSlotItems","Squad_RemoveUpgrades","Squad_RemoveCritical","Squad_HasCritical","Squad_GetEntityPositionList","Squad_ApplyEntityPositionList","Squad_SetHealthPercentage","Squad_IsVehicle","CCM_ToggleInstantProduction","CCM_ToggleFOW","CCM_ToggleGlobalAI","CCM_ToggleSelectionInvulnerability","CCM_ToggleSelectionOwner","CCM_ToggleDisableWeapons","CCM_ToggleEngineOrPostureState","CCM_ToggleHealthMonitor","CCM_GetSquadKey","CCM_GetEntityKey","CCM_HealthMonitor","_CCM_HealthMonitor_HandleHealth","_CCM_HealthMonitor_KickerMessage","CTF_PreInit","CTFSystem_Init","CTF_GetRandomFlagSpawnPosition","CTF_FreeFlagSpawnPosition","CTFSystem_InitDelayed","CTF_StartCore","CTF_GetWinScoreLimit","CTF_FlagScoreMonitor","CTF_BlinkFlagCarriers","CTF_FlagRespawnMonitor","CTF_FlagStateMonitor","CTF_EnableResources","CTF_UpdateObjectiveUI","CTF_FixFlagColor","CTF_FixFlagColorDelayed","CTF_StopAlarm","CTF_FlagCarrierAbilityExecuted","CTF_DropFlagRequestManager","CTF_PreventFlagCarrierReCrewAndVehicleGarrisoning","CTF_FlagCaptured","CTF_FlagDropped","CTF_FlagScored","CTF_GetOpposingTeam","CTF_TeamFlagScore","CTF_ObjctiveInit","CTF_AddObjectiveUI","Entity_IsReCrewable","Squad_AddFlagCarrierEffects","Squad_RemoveFlagCarrierEffects","Squad_SetCaptureEnabled","Squad_EnableFlagCarrierUI","Squad_EnableCantHoldUI","Squad_ModifyInfantrySpeed","Squad_MonitorDeath","Squad_DisableFlagCarrierUI","isset","Squad_FlagCarrierDeath","Squad_DropFlag","Squad_CarriesFlag","Squad_IsRegisteredFlagCarrier","Squad_RegisterFlagCarrier","Squad_UnRegisterFlagCarrier","Squad_GetSlotItemTable","Player_EnableMoveFlagHereUI","Player_UnlockRetreat","Player_IsHoldingAnyFlags","SGroup_IsCarryingFlag","UI_LocalKickerMessage","UI_GlobalKickerMessage","CTF_Msg","ClearCTF_Msg","Listener","Table_Shuffle","Ability_GetUniqueKey","Player_AddPopulation","Player_ExecuteLocally","Player_GetEnemyPlayer","Player_SetResourceIncomeNumber","Team_GetFirstPlayer","Team_GetEntitiesNearPoint","Team_GetSquadsNearPoint","Team_GetPlayerCount","Team_ExecuteLocally","SGroup_CreateTemp","EGroup_CreateTemp","EGroup_GetClosest","EGroup_AddGroup","EGroup_FilterByUnitType","Entity_GetGarrisonedSquads","Entity_AutoAlign","Entity_CreateAndSpawnToward","Entity_CreateAndSpawnTowardDelayed","Entity_CreateAndSpawnTowardDelayedRandom","Entity_GetName","Entity_GetTempEGroup","Entity_GetOwnerSafe","Entity_Replace","Entity_IsSelected","Entity_HasProductionQueueItem","Entity_IsValidEntity","Squad_GetUniqueKey","Squad_GetName","Squad_IsIdle","Squad_IsConcstructing","Squad_IsHeadingToPosition","Squad_ForEachEntity","UI_FlashSquad","Util_Repeat","Util_Delay","Util_IsPositionInPolygon","Util_GetDirectionalOffset","Util_GetDirectionalOffsetPosition","Util_GetRandomPos","Util_GetAngleTowardsPos","Util_CopyPosition","Util_CreateUIFrame","Util_Tester","Misc_UnSelectAll","Util_DefaultValue","World_ForEachEntitiesByBlueprint","World_GetEntitiesOfType","Pos_AddHeight","Pos_GetString","dr_text3dpos","Heading_Rotate","Squad_InfraRedReveal","WinCondition_PreInit","WinCondition_MonitorVictoryPoints","Team_GetTitle","Team_GetOpposingTeam","OKWNoCache_PreInit","PK_SystemInit","PK_ScanPlayers","PK_PlayerAbilityListener","Player_RemoveTankDispatchAbilities","Squad_GetTempSGroup","Player_GetMapEntryPositionClosest","Util_SortPositionsByClosestImproved","Pos_GetXYZString","PK_Msg","PK_ClearMSG","PK_GetAbilityBleprint","PK_GetUpgradeBleprint","PK_GetSquadBleprint","PK_EventCue","Player_GetRaceIndex","PK_PreInit","RotateThings","TC_PreInit","TC_Init","TC_TogglePlayerCategory","System_PlayerAbilityComplete","System_PlayerAbilityExecuted","TC_UpdatePlayerCircle","TC_UpdatePlayerArrow","TC_GeneralManager","TC_GetAbilityBlueprint","TC_GetMineIcon","TC_GetMineIconScale","TC_MineIsAllowedToMark","TC_MineIsPartOfSMineField","TC_GetMineMarkerColor","TC_GetIcon","TC_MineMarkerManager","TC_BlibMinePlanted","System_EntityConstructionCompleted","System_EntityKilled","Player_IsLocalPlayer","Player_GetUniqueKey","Player_GetName","Players_ForEach","Players_ForEachInTeam","Entity_GetPlayerOwnerSafe","Entity_GetUniqueKey","Entity_CheckForParentSquad","EntityList_ContainsValidEntities","EGroup_GetEntityIds","Util_GlobalMessage","Util_CreateLocString","Util_GetBlueprint","Util_GetUnitOwner","Game_GetLocalPlayerID","World_OwnsUnit","World_GetEntitiesByBlueprint","World_ForEachEntities","Msg","TC_DataInit_Ebps","TC_DataInit","WinCondition_GameOver","WinCondition_Check","WinCondition_Init","$","AAGUID","ANGLE_instanced_arrays","AbstractWorker","AbstractWorkerEventMap","Account","ActiveXObject","AesCbcParams","AesCfbParams","AesCmacParams","AesCtrParams","AesDerivedKeyParams","AesGcmParams","AesKeyAlgorithm","AesKeyGenParams","Algorithm","AlgorithmIdentifier","AnalyserNode","AnimationEvent","AnimationEventInit","ApplicationCache","ApplicationCacheEventMap","Array","ArrayBuffer","ArrayBufferConstructor","ArrayBufferView","ArrayConstructor","ArrayLike","AssertionOptions","AssignedNodesOptions","Attr","Audio","AudioBuffer","AudioBufferSourceNode","AudioBufferSourceNodeEventMap","AudioContext","AudioContextBase","AudioContextEventMap","AudioDestinationNode","AudioListener","AudioNode","AudioParam","AudioProcessingEvent","AudioTrack","AudioTrackList","AudioTrackListEventMap","BarProp","BaseJQueryEventObject","BeforeUnloadEvent","BiquadFilterNode","Blob","BlobPropertyBag","Body","BodyInit","Boolean","BooleanConstructor","Buffer","BufferEncoding","BufferSource","ByteString","CDATASection","CSS","CSSConditionRule","CSSFontFaceRule","CSSGroupingRule","CSSImportRule","CSSKeyframeRule","CSSKeyframesRule","CSSMediaRule","CSSNamespaceRule","CSSPageRule","CSSRule","CSSRuleList","CSSStyleDeclaration","CSSStyleRule","CSSStyleSheet","CSSSupportsRule","Cache","CacheQueryOptions","CacheStorage","Canvas2DContextAttributes","CanvasGradient","CanvasPathMethods","CanvasPattern","CanvasRenderingContext2D","ChannelMergerNode","ChannelSplitterNode","CharacterData","ChildNode","ClassDecorator","ClientData","ClientRect","ClientRectList","ClipboardEvent","ClipboardEventInit","CloseEvent","CloseEventInit","Comment","CompositionEvent","CompositionEventInit","ConcatParams","ConfirmSiteSpecificExceptionsInformation","Console","ConstrainBoolean","ConstrainBooleanParameters","ConstrainDOMString","ConstrainDOMStringParameters","ConstrainDouble","ConstrainDoubleRange","ConstrainLong","ConstrainLongRange","ConstrainVideoFacingModeParameters","ConvolverNode","Coordinates","Crypto","CryptoKey","CryptoKeyPair","CryptoOperationData","CustomElementRegistry","CustomEvent","CustomEventInit","DOMError","DOMException","DOMImplementation","DOML2DeprecatedColorProperty","DOML2DeprecatedSizeProperty","DOMParser","DOMRectInit","DOMSettableTokenList","DOMStringList","DOMStringMap","DOMTokenList","DataCue","DataTransfer","DataTransferItem","DataTransferItemList","DataView","DataViewConstructor","Date","DateConstructor","DecodeErrorCallback","DecodeSuccessCallback","DeferredPermissionRequest","DelayNode","DeviceAcceleration","DeviceAccelerationDict","DeviceLightEvent","DeviceLightEventInit","DeviceMotionEvent","DeviceMotionEventInit","DeviceOrientationEvent","DeviceOrientationEventInit","DeviceRotationRate","DeviceRotationRateDict","DhImportKeyParams","DhKeyAlgorithm","DhKeyDeriveParams","DhKeyGenParams","Document","DocumentEvent","DocumentEventMap","DocumentFragment","DocumentOrShadowRoot","DocumentType","DoubleRange","DragEvent","DynamicsCompressorNode","EXT_frag_depth","EXT_texture_filter_anisotropic","EcKeyAlgorithm","EcKeyGenParams","EcKeyImportParams","EcdhKeyDeriveParams","EcdsaParams","Element","ElementDefinitionOptions","ElementEventMap","ElementListTagNameMap","ElementTagNameMap","ElementTraversal","Enumerator","EnumeratorConstructor","ErrnoException","Error","ErrorConstructor","ErrorEvent","ErrorEventHandler","ErrorEventInit","EvalError","EvalErrorConstructor","Event","EventEmitter","EventInit","EventListener","EventListenerObject","EventListenerOrEventListenerObject","EventModifierInit","EventTarget","ExceptionInformation","ExtensionScriptApis","External","FFF","FGHJK","File","FileList","FilePropertyBag","FileReader","Float32Array","Float32ArrayConstructor","Float64Array","Float64ArrayConstructor","FocusEvent","FocusEventInit","FocusNavigationEvent","FocusNavigationEventInit","FocusNavigationOrigin","Foo","Foos","ForEachCallback","FormData","FrameRequestCallback","Function","FunctionConstructor","FunctionStringCallback","GLbitfield","GLboolean","GLbyte","GLclampf","GLenum","GLfloat","GLint","GLintptr","GLshort","GLsizei","GLsizeiptr","GLubyte","GLuint","GLushort","GainNode","Gamepad","GamepadButton","GamepadEvent","GamepadEventInit","GeneratorFunction","GeneratorFunctionConstructor","Geolocation","GetNotificationOptions","GetSVGDocument","GlobalEventHandlers","GlobalEventHandlersEventMap","GlobalFetch","HTMLAllCollection","HTMLAnchorElement","HTMLAppletElement","HTMLAreaElement","HTMLAreasCollection","HTMLAudioElement","HTMLBRElement","HTMLBaseElement","HTMLBaseFontElement","HTMLBodyElement","HTMLBodyElementEventMap","HTMLButtonElement","HTMLCanvasElement","HTMLCollection","HTMLCollectionBase","HTMLCollectionOf","HTMLDListElement","HTMLDataElement","HTMLDataListElement","HTMLDirectoryElement","HTMLDivElement","HTMLDocument","HTMLElement","HTMLElementEventMap","HTMLElementTagNameMap","HTMLEmbedElement","HTMLFieldSetElement","HTMLFontElement","HTMLFormControlsCollection","HTMLFormElement","HTMLFrameElement","HTMLFrameElementEventMap","HTMLFrameSetElement","HTMLFrameSetElementEventMap","HTMLHRElement","HTMLHeadElement","HTMLHeadingElement","HTMLHtmlElement","HTMLIFrameElement","HTMLIFrameElementEventMap","HTMLImageElement","HTMLInputElement","HTMLLIElement","HTMLLabelElement","HTMLLegendElement","HTMLLinkElement","HTMLMapElement","HTMLMarqueeElement","HTMLMarqueeElementEventMap","HTMLMediaElement","HTMLMediaElementEventMap","HTMLMenuElement","HTMLMetaElement","HTMLMeterElement","HTMLModElement","HTMLOListElement","HTMLObjectElement","HTMLOptGroupElement","HTMLOptionElement","HTMLOptionsCollection","HTMLOutputElement","HTMLParagraphElement","HTMLParamElement","HTMLPictureElement","HTMLPreElement","HTMLProgressElement","HTMLQuoteElement","HTMLScriptElement","HTMLSelectElement","HTMLSlotElement","HTMLSourceElement","HTMLSpanElement","HTMLStyleElement","HTMLTableAlignment","HTMLTableCaptionElement","HTMLTableCellElement","HTMLTableColElement","HTMLTableDataCellElement","HTMLTableElement","HTMLTableHeaderCellElement","HTMLTableRowElement","HTMLTableSectionElement","HTMLTemplateElement","HTMLTextAreaElement","HTMLTimeElement","HTMLTitleElement","HTMLTrackElement","HTMLUListElement","HTMLUnknownElement","HTMLVideoElement","HTMLVideoElementEventMap","HashChangeEvent","HashChangeEventInit","Headers","HeadersInit","History","HkdfCtrParams","HmacImportParams","HmacKeyAlgorithm","HmacKeyGenParams","I","IArguments","IDBArrayKey","IDBCursor","IDBCursorWithValue","IDBDatabase","IDBDatabaseEventMap","IDBEnvironment","IDBFactory","IDBIndex","IDBIndexParameters","IDBKeyPath","IDBKeyRange","IDBObjectStore","IDBObjectStoreParameters","IDBOpenDBRequest","IDBOpenDBRequestEventMap","IDBRequest","IDBRequestEventMap","IDBTransaction","IDBTransactionEventMap","IDBValidKey","IDBVersionChangeEvent","IFoos","IIRFilterNode","ITextWriter","Image","ImageData","Infinity","Int16Array","Int16ArrayConstructor","Int32Array","Int32ArrayConstructor","Int8Array","Int8ArrayConstructor","IntersectionObserver","IntersectionObserverCallback","IntersectionObserverEntry","IntersectionObserverEntryInit","IntersectionObserverInit","Intl","Iterable","IterableIterator","Iterator","IteratorResult","JQuery","JQueryAjaxSettings","JQueryAnimationOptions","JQueryCallback","JQueryCoordinates","JQueryDeferred","JQueryEventConstructor","JQueryEventObject","JQueryGenericPromise","JQueryInputEventObject","JQueryKeyEventObject","JQueryMouseEventObject","JQueryParam","JQueryPromise","JQueryPromiseCallback","JQueryPromiseOperator","JQuerySerializeArrayElement","JQueryStatic","JQuerySupport","JQueryXHR","JSON","JSX","JsonWebKey","KeyAlgorithm","KeyFormat","KeyType","KeyUsage","KeyboardEvent","KeyboardEventInit","LinkStyle","ListeningStateChangedEvent","Location","LongRange","LongRunningScriptDetectedEvent","MSAccountInfo","MSApp","MSAppAsyncOperation","MSAppAsyncOperationEventMap","MSAssertion","MSAudioLocalClientEvent","MSAudioRecvPayload","MSAudioRecvSignal","MSAudioSendPayload","MSAudioSendSignal","MSBaseReader","MSBaseReaderEventMap","MSBlobBuilder","MSConnectivity","MSCredentialFilter","MSCredentialParameters","MSCredentialSpec","MSCredentials","MSDelay","MSDescription","MSExecAtPriorityFunctionCallback","MSFIDOCredentialAssertion","MSFIDOCredentialParameters","MSFIDOSignature","MSFIDOSignatureAssertion","MSFileSaver","MSGesture","MSGestureEvent","MSGraphicsTrust","MSHTMLWebViewElement","MSIPAddressInfo","MSIceWarningFlags","MSInboundPayload","MSInputMethodContext","MSInputMethodContextEventMap","MSJitter","MSLaunchUriCallback","MSLocalClientEvent","MSLocalClientEventBase","MSManipulationEvent","MSMediaKeyError","MSMediaKeyMessageEvent","MSMediaKeyNeededEvent","MSMediaKeySession","MSMediaKeys","MSNavigatorDoNotTrack","MSNetwork","MSNetworkConnectivityInfo","MSNetworkInterfaceType","MSOutboundNetwork","MSOutboundPayload","MSPacketLoss","MSPayloadBase","MSPointerEvent","MSPortRange","MSRangeCollection","MSRelayAddress","MSSignatureParameters","MSSiteModeEvent","MSStream","MSStreamReader","MSTransportDiagnosticsStats","MSUnsafeFunctionCallback","MSUtilization","MSVideoPayload","MSVideoRecvPayload","MSVideoResolutionDistribution","MSVideoSendPayload","MSWebViewAsyncOperation","MSWebViewAsyncOperationEventMap","MSWebViewSettings","Map","MapConstructor","Math","MediaDeviceInfo","MediaDevices","MediaDevicesEventMap","MediaElementAudioSourceNode","MediaEncryptedEvent","MediaEncryptedEventInit","MediaError","MediaKeyMessageEvent","MediaKeyMessageEventInit","MediaKeySession","MediaKeyStatusMap","MediaKeySystemAccess","MediaKeySystemConfiguration","MediaKeySystemMediaCapability","MediaKeys","MediaList","MediaQueryList","MediaQueryListListener","MediaSource","MediaStream","MediaStreamAudioSourceNode","MediaStreamConstraints","MediaStreamError","MediaStreamErrorEvent","MediaStreamErrorEventInit","MediaStreamEvent","MediaStreamEventInit","MediaStreamEventMap","MediaStreamTrack","MediaStreamTrackEvent","MediaStreamTrackEventInit","MediaStreamTrackEventMap","MediaTrackCapabilities","MediaTrackConstraintSet","MediaTrackConstraints","MediaTrackSettings","MediaTrackSupportedConstraints","MessageChannel","MessageEvent","MessageEventInit","MessagePort","MessagePortEventMap","MethodDecorator","MimeType","MimeTypeArray","Model123","Model456","MouseEvent","MouseEventInit","MouseWheelEvent","MsZoomToOptions","MutationCallback","MutationEvent","MutationObserver","MutationObserverInit","MutationRecord","NaN","NamedNodeMap","NavigationCompletedEvent","NavigationEvent","NavigationEventWithReferrer","Navigator","NavigatorBeacon","NavigatorConcurrentHardware","NavigatorContentUtils","NavigatorGeolocation","NavigatorID","NavigatorOnLine","NavigatorStorageUtils","NavigatorUserMedia","NavigatorUserMediaErrorCallback","NavigatorUserMediaSuccessCallback","Node","NodeBuffer","NodeFilter","NodeIterator","NodeJS","NodeList","NodeListOf","NodeModule","NodeProcess","NodeRequire","NodeRequireFunction","NodeSelector","Notification","NotificationEventMap","NotificationOptions","NotificationPermissionCallback","Number","NumberConstructor","OES_element_index_uint","OES_standard_derivatives","OES_texture_float","OES_texture_float_linear","OES_texture_half_float","OES_texture_half_float_linear","Object","ObjectConstructor","ObjectURLOptions","OfflineAudioCompletionEvent","OfflineAudioContext","OfflineAudioContextEventMap","Option","OscillatorNode","OscillatorNodeEventMap","OverflowEvent","PageTransitionEvent","PannerNode","ParameterDecorator","ParentNode","Partial","Path2D","PaymentAddress","PaymentCurrencyAmount","PaymentDetails","PaymentDetailsModifier","PaymentItem","PaymentMethodData","PaymentOptions","PaymentRequest","PaymentRequestEventMap","PaymentRequestUpdateEvent","PaymentRequestUpdateEventInit","PaymentResponse","PaymentShippingOption","Pbkdf2Params","PerfWidgetExternal","Performance","PerformanceEntry","PerformanceMark","PerformanceMeasure","PerformanceNavigation","PerformanceNavigationTiming","PerformanceResourceTiming","PerformanceTiming","PeriodicWave","PeriodicWaveConstraints","PermissionRequest","PermissionRequestedEvent","Pick","Plugin","PluginArray","PointerEvent","PointerEventInit","PopStateEvent","PopStateEventInit","Position","PositionCallback","PositionError","PositionErrorCallback","PositionOptions","ProcessingInstruction","ProgressEvent","ProgressEventInit","Promise","PromiseConstructor","PromiseConstructorLike","PromiseLike","PromiseRejectionEvent","PromiseRejectionEventInit","PropertyDecorator","PropertyDescriptor","PropertyDescriptorMap","PropertyKey","Proxy","ProxyConstructor","ProxyHandler","PushManager","PushSubscription","PushSubscriptionOptions","PushSubscriptionOptionsInit","RTCConfiguration","RTCDTMFToneChangeEvent","RTCDTMFToneChangeEventInit","RTCDtlsFingerprint","RTCDtlsParameters","RTCDtlsTransport","RTCDtlsTransportEventMap","RTCDtlsTransportStateChangedEvent","RTCDtmfSender","RTCDtmfSenderEventMap","RTCIceCandidate","RTCIceCandidateAttributes","RTCIceCandidateComplete","RTCIceCandidateDictionary","RTCIceCandidateInit","RTCIceCandidatePair","RTCIceCandidatePairChangedEvent","RTCIceCandidatePairStats","RTCIceGatherCandidate","RTCIceGatherOptions","RTCIceGatherer","RTCIceGathererEvent","RTCIceGathererEventMap","RTCIceParameters","RTCIceServer","RTCIceTransport","RTCIceTransportEventMap","RTCIceTransportStateChangedEvent","RTCInboundRTPStreamStats","RTCMediaStreamTrackStats","RTCOfferOptions","RTCOutboundRTPStreamStats","RTCPeerConnection","RTCPeerConnectionErrorCallback","RTCPeerConnectionEventMap","RTCPeerConnectionIceEvent","RTCPeerConnectionIceEventInit","RTCRTPStreamStats","RTCRtcpFeedback","RTCRtcpParameters","RTCRtpCapabilities","RTCRtpCodecCapability","RTCRtpCodecParameters","RTCRtpContributingSource","RTCRtpEncodingParameters","RTCRtpFecParameters","RTCRtpHeaderExtension","RTCRtpHeaderExtensionParameters","RTCRtpParameters","RTCRtpReceiver","RTCRtpReceiverEventMap","RTCRtpRtxParameters","RTCRtpSender","RTCRtpSenderEventMap","RTCRtpUnhandled","RTCSessionDescription","RTCSessionDescriptionCallback","RTCSessionDescriptionInit","RTCSrtpKeyParam","RTCSrtpSdesParameters","RTCSrtpSdesTransport","RTCSrtpSdesTransportEventMap","RTCSsrcConflictEvent","RTCSsrcRange","RTCStats","RTCStatsCallback","RTCStatsProvider","RTCStatsReport","RTCTransport","RTCTransportStats","RandomSource","Range","RangeError","RangeErrorConstructor","React","ReadableStream","ReadableStreamReader","Readonly","ReadonlyArray","ReadonlyMap","ReadonlySet","Record","ReferenceError","ReferenceErrorConstructor","Reflect","RegExp","RegExpConstructor","RegExpExecArray","RegExpMatchArray","RegistrationOptions","Request","RequestInfo","RequestInit","Response","ResponseInit","RsaHashedImportParams","RsaHashedKeyAlgorithm","RsaHashedKeyGenParams","RsaKeyAlgorithm","RsaKeyGenParams","RsaOaepParams","RsaOtherPrimesInfo","RsaPssParams","SVGAElement","SVGAngle","SVGAnimatedAngle","SVGAnimatedBoolean","SVGAnimatedEnumeration","SVGAnimatedInteger","SVGAnimatedLength","SVGAnimatedLengthList","SVGAnimatedNumber","SVGAnimatedNumberList","SVGAnimatedPoints","SVGAnimatedPreserveAspectRatio","SVGAnimatedRect","SVGAnimatedString","SVGAnimatedTransformList","SVGCircleElement","SVGClipPathElement","SVGComponentTransferFunctionElement","SVGDefsElement","SVGDescElement","SVGElement","SVGElementEventMap","SVGElementInstance","SVGElementInstanceList","SVGEllipseElement","SVGFEBlendElement","SVGFEColorMatrixElement","SVGFEComponentTransferElement","SVGFECompositeElement","SVGFEConvolveMatrixElement","SVGFEDiffuseLightingElement","SVGFEDisplacementMapElement","SVGFEDistantLightElement","SVGFEFloodElement","SVGFEFuncAElement","SVGFEFuncBElement","SVGFEFuncGElement","SVGFEFuncRElement","SVGFEGaussianBlurElement","SVGFEImageElement","SVGFEMergeElement","SVGFEMergeNodeElement","SVGFEMorphologyElement","SVGFEOffsetElement","SVGFEPointLightElement","SVGFESpecularLightingElement","SVGFESpotLightElement","SVGFETileElement","SVGFETurbulenceElement","SVGFilterElement","SVGFilterPrimitiveStandardAttributes","SVGFitToViewBox","SVGForeignObjectElement","SVGGElement","SVGGradientElement","SVGGraphicsElement","SVGImageElement","SVGLength","SVGLengthList","SVGLineElement","SVGLinearGradientElement","SVGMarkerElement","SVGMaskElement","SVGMatrix","SVGMetadataElement","SVGNumber","SVGNumberList","SVGPathElement","SVGPathSeg","SVGPathSegArcAbs","SVGPathSegArcRel","SVGPathSegClosePath","SVGPathSegCurvetoCubicAbs","SVGPathSegCurvetoCubicRel","SVGPathSegCurvetoCubicSmoothAbs","SVGPathSegCurvetoCubicSmoothRel","SVGPathSegCurvetoQuadraticAbs","SVGPathSegCurvetoQuadraticRel","SVGPathSegCurvetoQuadraticSmoothAbs","SVGPathSegCurvetoQuadraticSmoothRel","SVGPathSegLinetoAbs","SVGPathSegLinetoHorizontalAbs","SVGPathSegLinetoHorizontalRel","SVGPathSegLinetoRel","SVGPathSegLinetoVerticalAbs","SVGPathSegLinetoVerticalRel","SVGPathSegList","SVGPathSegMovetoAbs","SVGPathSegMovetoRel","SVGPatternElement","SVGPoint","SVGPointList","SVGPolygonElement","SVGPolylineElement","SVGPreserveAspectRatio","SVGRadialGradientElement","SVGRect","SVGRectElement","SVGSVGElement","SVGSVGElementEventMap","SVGScriptElement","SVGStopElement","SVGStringList","SVGStyleElement","SVGSwitchElement","SVGSymbolElement","SVGTSpanElement","SVGTests","SVGTextContentElement","SVGTextElement","SVGTextPathElement","SVGTextPositioningElement","SVGTitleElement","SVGTransform","SVGTransformList","SVGURIReference","SVGUnitTypes","SVGUseElement","SVGViewElement","SVGZoomAndPan","SVGZoomEvent","ScopedCredential","ScopedCredentialDescriptor","ScopedCredentialInfo","ScopedCredentialOptions","ScopedCredentialParameters","Screen","ScreenEventMap","ScriptNotifyEvent","ScriptProcessorNode","ScriptProcessorNodeEventMap","ScrollBehavior","ScrollIntoViewOptions","ScrollLogicalPosition","ScrollOptions","ScrollRestoration","ScrollToOptions","Selection","ServiceWorker","ServiceWorkerContainer","ServiceWorkerContainerEventMap","ServiceWorkerEventMap","ServiceWorkerMessageEvent","ServiceWorkerMessageEventInit","ServiceWorkerRegistration","ServiceWorkerRegistrationEventMap","Set","SetConstructor","ShadowRoot","ShadowRootInit","SlowBuffer","SourceBuffer","SourceBufferList","SpeechSynthesis","SpeechSynthesisEvent","SpeechSynthesisEventInit","SpeechSynthesisEventMap","SpeechSynthesisUtterance","SpeechSynthesisUtteranceEventMap","SpeechSynthesisVoice","StereoPannerNode","Storage","StorageEvent","StorageEventInit","StoreExceptionsInformation","StoreSiteSpecificExceptionsInformation","String","StringConstructor","StyleMedia","StyleSheet","StyleSheetList","StyleSheetPageList","SubtleCrypto","Symbol","SymbolConstructor","SyncManager","SyntaxError","SyntaxErrorConstructor","TemplateStringsArray","Text","TextEvent","TextMetrics","TextStreamBase","TextStreamReader","TextStreamWriter","TextTrack","TextTrackCue","TextTrackCueEventMap","TextTrackCueList","TextTrackEventMap","TextTrackList","TextTrackListEventMap","Thenable","TimeRanges","Touch","TouchEvent","TouchList","TrackEvent","TrackEventInit","TransitionEvent","TransitionEventInit","TreeWalker","TypeError","TypeErrorConstructor","TypedPropertyDescriptor","UIEvent","UIEventInit","URIError","URIErrorConstructor","URL","URLSearchParams","USVString","Uint16Array","Uint16ArrayConstructor","Uint32Array","Uint32ArrayConstructor","Uint8Array","Uint8ArrayConstructor","Uint8ClampedArray","Uint8ClampedArrayConstructor","UnviewableContentIdentifiedEvent","VBArray","VBArrayConstructor","ValidityState","VarDate","VideoPlaybackQuality","VideoTrack","VideoTrackList","VideoTrackListEventMap","VoidFunction","WEBGL_compressed_texture_s3tc","WEBGL_debug_renderer_info","WEBGL_depth_texture","WScript","WaveShaperNode","WeakMap","WeakMapConstructor","WeakSet","WeakSetConstructor","WebAuthentication","WebAuthnAssertion","WebAuthnExtensions","WebGLActiveInfo","WebGLBuffer","WebGLContextAttributes","WebGLContextEvent","WebGLContextEventInit","WebGLFramebuffer","WebGLObject","WebGLProgram","WebGLRenderbuffer","WebGLRenderingContext","WebGLShader","WebGLShaderPrecisionFormat","WebGLTexture","WebGLUniformLocation","WebKitCSSMatrix","WebKitDirectoryEntry","WebKitDirectoryReader","WebKitEntriesCallback","WebKitEntry","WebKitErrorCallback","WebKitFileCallback","WebKitFileEntry","WebKitFileSystem","WebKitPoint","WebSocket","WebSocketEventMap","WheelEvent","WheelEventInit","Window","WindowBase64","WindowConsole","WindowEventMap","WindowLocalStorage","WindowSessionStorage","WindowTimers","WindowTimersExtension","Worker","WorkerEventMap","WritableStream","XMLDocument","XMLHttpRequest","XMLHttpRequestEventMap","XMLHttpRequestEventTarget","XMLHttpRequestEventTargetEventMap","XMLHttpRequestUpload","XMLSerializer","XPathEvaluator","XPathExpression","XPathNSResolver","XPathResult","XSLTProcessor","_","__dirname","__filename","a","abstract","addEventListener","alert","any","applicationCache","as","async","atob","await","b","blur","boolean","break","btoa","caches","cancelAnimationFrame","captureEvents","case","catch","class","clearImmediate","clearInterval","clearTimeout","clientInformation","close","closed","confirm","console","const","constructor","continue","count","crypto","customElements","dddd","debugger","declare","decodeURI","decodeURIComponent","default","defaultStatus","delete","departFocus","devicePixelRatio","dispatchEvent","do","doIt","doNotTrack","doUpdateSnippet","document","element","else","encodeURI","encodeURIComponent","enum","eval","event","export","exports","extends","external","false","fetch","finally","findSnippetById","focus","foo","foon","fooo","for","frameElement","frames","from","function","fuzzy_match","fuzzy_match_simple","get","getComputedStyle","getMatchedCSSRules","getSelection","global","global","history","if","implements","import","importScripts","in","indexedDB","innerHeight","innerWidth","instanceof","interface","is","isFinite","isNaN","isSecureContext","jQuery","keyof","length","let","localStorage","location","locationbar","matchMedia","menubar","module","module","more","moveBy","moveTo","msContentScript","msCredentials","msWriteProfilerMark","name","namespace","navigator","never","new","null","number","object","of","offscreenBuffering","onabort","onafterprint","onbeforeprint","onbeforeunload","onblur","oncanplay","oncanplaythrough","onchange","onclick","oncompassneedscalibration","oncontextmenu","ondblclick","ondevicelight","ondevicemotion","ondeviceorientation","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","onhashchange","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmessage","onmousedown","onmouseenter","onmouseleave","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onmsgesturechange","onmsgesturedoubletap","onmsgestureend","onmsgesturehold","onmsgesturestart","onmsgesturetap","onmsinertiastart","onmspointercancel","onmspointerdown","onmspointerenter","onmspointerleave","onmspointermove","onmspointerout","onmspointerover","onmspointerup","onoffline","ononline","onorientationchange","onpagehide","onpageshow","onpause","onplay","onplaying","onpointercancel","onpointerdown","onpointerenter","onpointerleave","onpointermove","onpointerout","onpointerover","onpointerup","onpopstate","onprogress","onratechange","onreadystatechange","onreset","onresize","onscroll","onseeked","onseeking","onselect","onstalled","onstorage","onsubmit","onsuspend","ontimeupdate","ontouchcancel","ontouchend","ontouchmove","ontouchstart","onunload","onvolumechange","onwaiting","onwheel","open","opener","orientation","outerHeight","outerWidth","package","pageXOffset","pageYOffset","parent","parseFloat","parseInt","payloadtype","performance","personalbar","postMessage","print","private","process","prompt","protected","public","readonly","releaseEvents","removeEventListener","requestAnimationFrame","require","require","resizeBy","resizeTo","return","screen","screenLeft","screenTop","screenX","screenY","scroll","scrollBy","scrollTo","scrollX","scrollY","scrollbars","self","sessionStorage","set","setImmediate","setInterval","setTimeout","speechSynthesis","static","status","statusbar","stop","string","styleMedia","super","switch","symbol","this","throw","toString","toolbar","top","true","try","type","typedoc","typeof","undefined","undefined","updateSnippet","uuid","vSomething","var","void","webkitCancelAnimationFrame","webkitConvertPointFromNodeToPage","webkitConvertPointFromPageToNode","webkitRTCPeerConnection","webkitRequestAnimationFrame","while","window","with","yield"] +}; }); diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index 0353e165cb2..c69d027fc96 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { anyScore, createMatches, fuzzyScore, fuzzyScoreGraceful, fuzzyScoreGracefulAggressive, FuzzyScorer, IFilter, IMatch, matchesCamelCase, matchesContiguousSubString, matchesPrefix, matchesStrictPrefix, matchesSubString, matchesWords, or } from 'vs/base/common/filters'; -function filterOk(filter: IFilter, word: string, wordToMatchAgainst: string, highlights?: { start: number; end: number; }[]) { +function filterOk(filter: IFilter, word: string, wordToMatchAgainst: string, highlights?: { start: number; end: number }[]) { let r = filter(word, wordToMatchAgainst); assert(r, `${word} didn't match ${wordToMatchAgainst}`); if (highlights) { @@ -222,7 +222,7 @@ suite('Filters', () => { filterOk(matchesWords, 'foo:bar', 'foo:bar'); }); - function assertMatches(pattern: string, word: string, decoratedWord: string | undefined, filter: FuzzyScorer, opts: { patternPos?: number, wordPos?: number, firstMatchCanBeWeak?: boolean } = {}) { + function assertMatches(pattern: string, word: string, decoratedWord: string | undefined, filter: FuzzyScorer, opts: { patternPos?: number; wordPos?: number; firstMatchCanBeWeak?: boolean } = {}) { let r = filter(pattern, pattern.toLowerCase(), opts.patternPos || 0, word, word.toLowerCase(), opts.wordPos || 0, opts.firstMatchCanBeWeak || false); assert.ok(!decoratedWord === !r); if (r) { diff --git a/src/vs/base/test/common/glob.test.ts b/src/vs/base/test/common/glob.test.ts index 0ce90068b11..6133da6b5eb 100644 --- a/src/vs/base/test/common/glob.test.ts +++ b/src/vs/base/test/common/glob.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import * as glob from 'vs/base/common/glob'; import { sep } from 'vs/base/common/path'; -import { isWindows } from 'vs/base/common/platform'; +import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; suite('Glob', () => { @@ -64,7 +64,7 @@ suite('Glob', () => { // }); function assertGlobMatch(pattern: string | glob.IRelativePattern, input: string) { - assert(glob.match(pattern, input), `${pattern} should match ${input}`); + assert(glob.match(pattern, input), `${JSON.stringify(pattern)} should match ${input}`); assert(glob.match(pattern, nativeSep(input)), `${pattern} should match ${nativeSep(input)}`); } @@ -1005,6 +1005,19 @@ suite('Glob', () => { } }); + test('relative pattern - ignores case on macOS/Windows', function () { + if (isWindows) { + let p: glob.IRelativePattern = { base: 'C:\\DNXConsoleApp\\foo', pattern: 'something/*.cs' }; + assertGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\something\\Program.cs'.toLowerCase()); + } else if (isMacintosh) { + let p: glob.IRelativePattern = { base: '/DNXConsoleApp/foo', pattern: 'something/*.cs' }; + assertGlobMatch(p, '/DNXConsoleApp/foo/something/Program.cs'.toLowerCase()); + } else if (isLinux) { + let p: glob.IRelativePattern = { base: '/DNXConsoleApp/foo', pattern: 'something/*.cs' }; + assertNoGlobMatch(p, '/DNXConsoleApp/foo/something/Program.cs'.toLowerCase()); + } + }); + test('pattern with "base" does not explode - #36081', function () { assert.ok(glob.match({ 'base': true }, 'base')); }); diff --git a/src/vs/base/test/common/iconLabels.test.ts b/src/vs/base/test/common/iconLabels.test.ts index 23f3b9c6a44..add853b0e94 100644 --- a/src/vs/base/test/common/iconLabels.test.ts +++ b/src/vs/base/test/common/iconLabels.test.ts @@ -12,7 +12,7 @@ export interface IIconFilter { (query: string, target: IParsedLabelWithIcons): IMatch[] | null; } -function filterOk(filter: IIconFilter, word: string, target: IParsedLabelWithIcons, highlights?: { start: number; end: number; }[]) { +function filterOk(filter: IIconFilter, word: string, target: IParsedLabelWithIcons, highlights?: { start: number; end: number }[]) { let r = filter(word, target); assert(r); if (highlights) { diff --git a/src/vs/base/test/common/processes.test.ts b/src/vs/base/test/common/processes.test.ts index 6ef5aa061a8..182ac3979a7 100644 --- a/src/vs/base/test/common/processes.test.ts +++ b/src/vs/base/test/common/processes.test.ts @@ -21,13 +21,15 @@ suite('Processes', () => { VSCODE_NLS_CONFIG: 'x', VSCODE_PORTABLE: 'x', VSCODE_PID: 'x', + VSCODE_SHELL_LOGIN: '1', VSCODE_CODE_CACHE_PATH: 'x', VSCODE_NEW_VAR: 'x', GDK_PIXBUF_MODULE_FILE: 'x', - GDK_PIXBUF_MODULEDIR: 'x', + GDK_PIXBUF_MODULEDIR: 'x' }; processes.sanitizeProcessEnvironment(env); assert.strictEqual(env['FOO'], 'bar'); - assert.strictEqual(Object.keys(env).length, 1); + assert.strictEqual(env['VSCODE_SHELL_LOGIN'], '1'); + assert.strictEqual(Object.keys(env).length, 2); }); }); diff --git a/src/vs/base/test/common/stripComments.test.ts b/src/vs/base/test/common/stripComments.test.ts new file mode 100644 index 00000000000..cf681790b7a --- /dev/null +++ b/src/vs/base/test/common/stripComments.test.ts @@ -0,0 +1,125 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as assert from 'assert'; + +import { stripComments } from 'vs/base/common/stripComments'; + +// We use this regular expression quite often to strip comments in JSON files. + +suite('Strip Comments', () => { + test('Line comment', () => { + const content: string = [ + "{", + " \"prop\": 10 // a comment", + "}", + ].join('\n'); + const expected = [ + "{", + " \"prop\": 10 ", + "}", + ].join('\n'); + assert.strictEqual(stripComments(content), expected); + }); + test('Line comment - EOF', () => { + const content: string = [ + "{", + "}", + "// a comment" + ].join('\n'); + const expected = [ + "{", + "}", + "" + ].join('\n'); + assert.strictEqual(stripComments(content), expected); + }); + test('Line comment - \\r\\n', () => { + const content: string = [ + "{", + " \"prop\": 10 // a comment", + "}", + ].join('\r\n'); + const expected = [ + "{", + " \"prop\": 10 ", + "}", + ].join('\r\n'); + assert.strictEqual(stripComments(content), expected); + }); + test('Line comment - EOF - \\r\\n', () => { + const content: string = [ + "{", + "}", + "// a comment" + ].join('\r\n'); + const expected = [ + "{", + "}", + "" + ].join('\r\n'); + assert.strictEqual(stripComments(content), expected); + }); + test('Block comment - single line', () => { + const content: string = [ + "{", + " /* before */\"prop\": 10/* after */", + "}", + ].join('\n'); + const expected = [ + "{", + " \"prop\": 10", + "}", + ].join('\n'); + assert.strictEqual(stripComments(content), expected); + }); + test('Block comment - multi line', () => { + const content: string = [ + "{", + " /**", + " * Some comment", + " */", + " \"prop\": 10", + "}", + ].join('\n'); + const expected = [ + "{", + " ", + " \"prop\": 10", + "}", + ].join('\n'); + assert.strictEqual(stripComments(content), expected); + }); + test('Block comment - shortest match', () => { + const content = "/* abc */ */"; + const expected = " */"; + assert.strictEqual(stripComments(content), expected); + }); + test('No strings - double quote', () => { + const content: string = [ + "{", + " \"/* */\": 10", + "}" + ].join('\n'); + const expected: string = [ + "{", + " \"/* */\": 10", + "}" + ].join('\n'); + assert.strictEqual(stripComments(content), expected); + }); + test('No strings - single quote', () => { + const content: string = [ + "{", + " '/* */': 10", + "}" + ].join('\n'); + const expected: string = [ + "{", + " '/* */': 10", + "}" + ].join('\n'); + assert.strictEqual(stripComments(content), expected); + }); +}); diff --git a/src/vs/base/test/common/timeTravelScheduler.ts b/src/vs/base/test/common/timeTravelScheduler.ts index 9c2ae28a425..9081b7c5632 100644 --- a/src/vs/base/test/common/timeTravelScheduler.ts +++ b/src/vs/base/test/common/timeTravelScheduler.ts @@ -223,7 +223,7 @@ export class AsyncSchedulerProcessor extends Disposable { } -export async function runWithFakedTimers(options: { useFakeTimers?: boolean, useSetImmediate?: boolean, maxTaskCount?: number }, fn: () => Promise): Promise { +export async function runWithFakedTimers(options: { useFakeTimers?: boolean; useSetImmediate?: boolean; maxTaskCount?: number }, fn: () => Promise): Promise { const useFakeTimers = options.useFakeTimers === undefined ? true : options.useFakeTimers; if (!useFakeTimers) { return fn(); diff --git a/src/vs/base/test/node/pfs/pfs.test.ts b/src/vs/base/test/node/pfs/pfs.test.ts index 09bc57bf432..e45782e236f 100644 --- a/src/vs/base/test/node/pfs/pfs.test.ts +++ b/src/vs/base/test/node/pfs/pfs.test.ts @@ -273,7 +273,7 @@ flakySuite('PFS', function () { const linkTarget = await Promises.readlink(targetLinkMD5JSFolderLinked); assert.strictEqual(linkTarget, targetLinkMD5JSFolder); - await Promises.rmdir(targetLinkTestFolder, { recursive: true }); + await Promises.rm(targetLinkTestFolder); } // Copy with `preserveSymlinks: false` and verify result diff --git a/src/vs/code/browser/workbench/workbench-dev.html b/src/vs/code/browser/workbench/workbench-dev.html index b30e016806c..86df5ff3666 100644 --- a/src/vs/code/browser/workbench/workbench-dev.html +++ b/src/vs/code/browser/workbench/workbench-dev.html @@ -27,7 +27,7 @@ - + diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index a09db9fa033..02288223a8b 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -24,8 +24,8 @@ - - + + @@ -53,7 +53,7 @@ - - + + diff --git a/src/vs/code/browser/workbench/workbench.ts b/src/vs/code/browser/workbench/workbench.ts index ec954fdf319..f0bb97029d5 100644 --- a/src/vs/code/browser/workbench/workbench.ts +++ b/src/vs/code/browser/workbench/workbench.ts @@ -5,6 +5,7 @@ import { isStandalone } from 'vs/base/browser/browser'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { parse } from 'vs/base/common/marshalling'; import { Emitter } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; @@ -13,7 +14,9 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { request } from 'vs/base/parts/request/browser/request'; import product from 'vs/platform/product/common/product'; import { isFolderToOpen, isWorkspaceToOpen } from 'vs/platform/windows/common/windows'; -import { create, ICredentialsProvider, IURLCallbackProvider, IWorkbenchConstructionOptions, IWorkspace, IWorkspaceProvider } from 'vs/workbench/workbench.web.api'; +import { create, ICredentialsProvider, IURLCallbackProvider, IWorkbenchConstructionOptions, IWorkspace, IWorkspaceProvider } from 'vs/workbench/workbench.web.main'; +import { posix } from 'vs/base/common/path'; +import { ltrim } from 'vs/base/common/strings'; interface ICredential { service: string; @@ -23,12 +26,12 @@ interface ICredential { class LocalStorageCredentialsProvider implements ICredentialsProvider { - static readonly CREDENTIALS_OPENED_KEY = 'credentials.provider'; + private static readonly CREDENTIALS_STORAGE_KEY = 'credentials.provider'; private readonly authService: string | undefined; constructor() { - let authSessionInfo: { readonly id: string, readonly accessToken: string, readonly providerId: string, readonly canSignOut?: boolean, readonly scopes: string[][] } | undefined; + let authSessionInfo: { readonly id: string; readonly accessToken: string; readonly providerId: string; readonly canSignOut?: boolean; readonly scopes: string[][] } | undefined; const authSessionElement = document.getElementById('vscode-workbench-auth-session'); const authSessionElementAttribute = authSessionElement ? authSessionElement.getAttribute('data-settings') : undefined; if (authSessionElementAttribute) { @@ -55,7 +58,7 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider { private get credentials(): ICredential[] { if (!this._credentials) { try { - const serializedCredentials = window.localStorage.getItem(LocalStorageCredentialsProvider.CREDENTIALS_OPENED_KEY); + const serializedCredentials = window.localStorage.getItem(LocalStorageCredentialsProvider.CREDENTIALS_STORAGE_KEY); if (serializedCredentials) { this._credentials = JSON.parse(serializedCredentials); } @@ -72,7 +75,7 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider { } private save(): void { - window.localStorage.setItem(LocalStorageCredentialsProvider.CREDENTIALS_OPENED_KEY, JSON.stringify(this.credentials)); + window.localStorage.setItem(LocalStorageCredentialsProvider.CREDENTIALS_STORAGE_KEY, JSON.stringify(this.credentials)); } async getPassword(service: string, account: string): Promise { @@ -148,7 +151,7 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider { return this.doGetPassword(service); } - async findCredentials(service: string): Promise> { + async findCredentials(service: string): Promise> { return this.credentials .filter(credential => credential.service === service) .map(({ account, password }) => ({ account, password })); @@ -165,7 +168,7 @@ class LocalStorageCredentialsProvider implements ICredentialsProvider { } async clear(): Promise { - window.localStorage.removeItem(LocalStorageCredentialsProvider.CREDENTIALS_OPENED_KEY); + window.localStorage.removeItem(LocalStorageCredentialsProvider.CREDENTIALS_STORAGE_KEY); } } @@ -279,13 +282,13 @@ class LocalStorageURLCallbackProvider extends Disposable implements IURLCallback class WorkspaceProvider implements IWorkspaceProvider { - static QUERY_PARAM_EMPTY_WINDOW = 'ew'; - static QUERY_PARAM_FOLDER = 'folder'; - static QUERY_PARAM_WORKSPACE = 'workspace'; + private static QUERY_PARAM_EMPTY_WINDOW = 'ew'; + private static QUERY_PARAM_FOLDER = 'folder'; + private static QUERY_PARAM_WORKSPACE = 'workspace'; - static QUERY_PARAM_PAYLOAD = 'payload'; + private static QUERY_PARAM_PAYLOAD = 'payload'; - static create(config: IWorkbenchConstructionOptions & { folderUri?: UriComponents, workspaceUri?: UriComponents }) { + static create(config: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents }) { let foundWorkspace = false; let workspace: IWorkspace; let payload = Object.create(null); @@ -296,13 +299,27 @@ class WorkspaceProvider implements IWorkspaceProvider { // Folder case WorkspaceProvider.QUERY_PARAM_FOLDER: - workspace = { folderUri: URI.parse(value) }; + if (config.remoteAuthority && value.startsWith(posix.sep)) { + // when connected to a remote and having a value + // that is a path (begins with a `/`), assume this + // is a vscode-remote resource as simplified URL. + workspace = { folderUri: URI.from({ scheme: Schemas.vscodeRemote, path: value, authority: config.remoteAuthority }) }; + } else { + workspace = { folderUri: URI.parse(value) }; + } foundWorkspace = true; break; // Workspace case WorkspaceProvider.QUERY_PARAM_WORKSPACE: - workspace = { workspaceUri: URI.parse(value) }; + if (config.remoteAuthority && value.startsWith(posix.sep)) { + // when connected to a remote and having a value + // that is a path (begins with a `/`), assume this + // is a vscode-remote resource as simplified URL. + workspace = { workspaceUri: URI.from({ scheme: Schemas.vscodeRemote, path: value, authority: config.remoteAuthority }) }; + } else { + workspace = { workspaceUri: URI.parse(value) }; + } foundWorkspace = true; break; @@ -315,7 +332,7 @@ class WorkspaceProvider implements IWorkspaceProvider { // Payload case WorkspaceProvider.QUERY_PARAM_PAYLOAD: try { - payload = JSON.parse(value); + payload = parse(value); // use marshalling#parse() to revive potential URIs } catch (error) { console.error(error); // possible invalid JSON } @@ -323,29 +340,30 @@ class WorkspaceProvider implements IWorkspaceProvider { } }); - // If no workspace is provided through the URL, check for config attribute from server + // If no workspace is provided through the URL, check for config + // attribute from server and fallback to last opened workspace + // from storage if (!foundWorkspace) { if (config.folderUri) { workspace = { folderUri: URI.revive(config.folderUri) }; } else if (config.workspaceUri) { workspace = { workspaceUri: URI.revive(config.workspaceUri) }; - } else { - workspace = undefined; } } - return new WorkspaceProvider(workspace, payload); + return new WorkspaceProvider(workspace, payload, config); } readonly trusted = true; private constructor( readonly workspace: IWorkspace, - readonly payload: object + readonly payload: object, + private readonly config: IWorkbenchConstructionOptions ) { } - async open(workspace: IWorkspace, options?: { reuse?: boolean, payload?: object }): Promise { + async open(workspace: IWorkspace, options?: { reuse?: boolean; payload?: object }): Promise { if (options?.reuse && !options.payload && this.isSame(this.workspace, workspace)) { return true; // return early if workspace and environment is not changing and we are reusing window } @@ -369,7 +387,7 @@ class WorkspaceProvider implements IWorkspaceProvider { return false; } - private createTargetUrl(workspace: IWorkspace, options?: { reuse?: boolean, payload?: object }): string | undefined { + private createTargetUrl(workspace: IWorkspace, options?: { reuse?: boolean; payload?: object }): string | undefined { // Empty let targetHref: string | undefined = undefined; @@ -379,12 +397,35 @@ class WorkspaceProvider implements IWorkspaceProvider { // Folder else if (isFolderToOpen(workspace)) { - targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_FOLDER}=${encodeURIComponent(workspace.folderUri.toString())}`; + let queryParamFolder: string; + if (this.config.remoteAuthority && workspace.folderUri.scheme === Schemas.vscodeRemote) { + // when connected to a remote and having a folder + // for that remote, only use the path as query + // value to form shorter, nicer URLs. + // ensure paths are absolute (begin with `/`) + // clipboard: ltrim(workspace.folderUri.path, posix.sep) + queryParamFolder = `${posix.sep}${ltrim(workspace.folderUri.path, posix.sep)}`; + } else { + queryParamFolder = encodeURIComponent(workspace.folderUri.toString(true)); + } + + targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_FOLDER}=${queryParamFolder}`; } // Workspace else if (isWorkspaceToOpen(workspace)) { - targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_WORKSPACE}=${encodeURIComponent(workspace.workspaceUri.toString())}`; + let queryParamWorkspace: string; + if (this.config.remoteAuthority && workspace.workspaceUri.scheme === Schemas.vscodeRemote) { + // when connected to a remote and having a workspace + // for that remote, only use the path as query + // value to form shorter, nicer URLs. + // ensure paths are absolute (begin with `/`) + queryParamWorkspace = `${posix.sep}${ltrim(workspace.workspaceUri.path, posix.sep)}`; + } else { + queryParamWorkspace = encodeURIComponent(workspace.workspaceUri.toString(true)); + } + + targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_WORKSPACE}=${queryParamWorkspace}`; } // Append payload if any @@ -452,7 +493,7 @@ function doCreateUri(path: string, queryValues: Map): URI { if (!configElement || !configElementAttribute) { throw new Error('Missing web configuration element'); } - const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents, workspaceUri?: UriComponents } = JSON.parse(configElementAttribute); + const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents } = JSON.parse(configElementAttribute); // Create workbench create(document.body, { @@ -462,7 +503,6 @@ function doCreateUri(path: string, queryValues: Map): URI { } : undefined, workspaceProvider: WorkspaceProvider.create(config), urlCallbackProvider: new LocalStorageURLCallbackProvider(), - // if we have a remote authority, we will use the remote side for storing secrets - credentialsProvider: config.remoteAuthority ? undefined : new LocalStorageCredentialsProvider() + credentialsProvider: config.remoteAuthority ? undefined : new LocalStorageCredentialsProvider() // with a remote, we don't use a local credentials provider }); })(); diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index a4147b57382..e7275a7112a 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -85,10 +85,10 @@ import { UserDataAutoSyncService } from 'vs/platform/userDataSync/electron-sandb import { ActiveWindowManager } from 'vs/platform/windows/node/windowTracker'; import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/node/signService'; -import { ISharedTunnelsService } from 'vs/platform/remote/common/tunnel'; -import { SharedTunnelsService } from 'vs/platform/remote/node/tunnelService'; +import { ISharedTunnelsService } from 'vs/platform/tunnel/common/tunnel'; +import { SharedTunnelsService } from 'vs/platform/tunnel/node/tunnelService'; import { ipcSharedProcessTunnelChannelName, ISharedProcessTunnelService } from 'vs/platform/remote/common/sharedProcessTunnelService'; -import { SharedProcessTunnelService } from 'vs/platform/remote/node/sharedProcessTunnelService'; +import { SharedProcessTunnelService } from 'vs/platform/tunnel/node/sharedProcessTunnelService'; import { ipcSharedProcessWorkerChannelName, ISharedProcessWorkerConfiguration, ISharedProcessWorkerService } from 'vs/platform/sharedProcess/common/sharedProcessWorkerService'; import { SharedProcessWorkerService } from 'vs/platform/sharedProcess/electron-browser/sharedProcessWorkerService'; import { AssignmentService } from 'vs/platform/assignment/common/assignmentService'; @@ -198,7 +198,7 @@ class SharedProcessMain extends Disposable { services.set(ILogService, logService); // Worker - this.sharedProcessWorkerService = new SharedProcessWorkerService(logService, productService, environmentService); + this.sharedProcessWorkerService = new SharedProcessWorkerService(logService); services.set(ISharedProcessWorkerService, this.sharedProcessWorkerService); // Files @@ -216,7 +216,6 @@ class SharedProcessMain extends Disposable { // processes, we want a single process handling these operations. this._register(new DiskFileSystemProviderClient(mainProcessService.getChannel(LOCAL_FILE_SYSTEM_CHANNEL_NAME), { pathCaseSensitive: isLinux })), Schemas.userData, - fileService, logService )); fileService.registerProvider(Schemas.userData, userDataFileSystemProvider); @@ -342,8 +341,7 @@ class SharedProcessMain extends Disposable { }, configurationService, environmentService, - logService, - telemetryService + logService ); await ptyHostService.initialize(); diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index e729948f403..9c487c3475c 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, BrowserWindow, contentTracing, dialog, ipcMain, protocol, session, Session, systemPreferences } from 'electron'; +import { app, BrowserWindow, contentTracing, dialog, ipcMain, protocol, session, Session, systemPreferences, WebFrameMain } from 'electron'; import { statSync } from 'fs'; import { hostname, release } from 'os'; import { VSBuffer } from 'vs/base/common/buffer'; @@ -31,16 +31,19 @@ import { localize } from 'vs/nls'; import { IBackupMainService } from 'vs/platform/backup/electron-main/backup'; import { BackupMainService } from 'vs/platform/backup/electron-main/backupMainService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { CredentialsMainService, ICredentialsMainService } from 'vs/platform/credentials/node/credentialsMainService'; +import { ICredentialsMainService } from 'vs/platform/credentials/common/credentials'; +import { CredentialsMainService } from 'vs/platform/credentials/node/credentialsMainService'; import { ElectronExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/electron-main/extensionHostDebugIpc'; import { IDiagnosticsService } from 'vs/platform/diagnostics/common/diagnostics'; +import { DiagnosticsMainService, IDiagnosticsMainService } from 'vs/platform/diagnostics/electron-main/diagnosticsMainService'; import { DialogMainService, IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogMainService'; import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; -import { EncryptionMainService, IEncryptionMainService } from 'vs/platform/encryption/node/encryptionMainService'; +import { IEncryptionMainService } from 'vs/platform/encryption/common/encryptionService'; +import { EncryptionMainService } from 'vs/platform/encryption/node/encryptionMainService'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import { isLaunchedFromCli } from 'vs/platform/environment/node/argvHelper'; -import { getResolvedShellEnv } from 'vs/platform/environment/node/shellEnv'; +import { getResolvedShellEnv } from 'vs/platform/terminal/node/shellEnv'; import { IExtensionUrlTrustService } from 'vs/platform/extensionManagement/common/extensionUrlTrust'; import { ExtensionUrlTrustService } from 'vs/platform/extensionManagement/node/extensionUrlTrustService'; import { IExtensionHostStarter, ipcExtensionHostStarterChannelName } from 'vs/platform/extensions/common/extensionHostStarter'; @@ -90,7 +93,8 @@ import { IWindowOpenable } from 'vs/platform/windows/common/windows'; import { ICodeWindow, IWindowsMainService, OpenContext, WindowError } from 'vs/platform/windows/electron-main/windows'; import { WindowsMainService } from 'vs/platform/windows/electron-main/windowsMainService'; import { ActiveWindowManager } from 'vs/platform/windows/node/windowTracker'; -import { hasWorkspaceFileExtension, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { hasWorkspaceFileExtension } from 'vs/platform/workspace/common/workspace'; +import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IWorkspacesHistoryMainService, WorkspacesHistoryMainService } from 'vs/platform/workspaces/electron-main/workspacesHistoryMainService'; import { WorkspacesMainService } from 'vs/platform/workspaces/electron-main/workspacesMainService'; import { IWorkspacesManagementMainService, WorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; @@ -154,10 +158,94 @@ export class CodeApplication extends Disposable { //#endregion + //#region Request filtering + + // Block all SVG requests from unsupported origins + const supportedSvgSchemes = new Set([Schemas.file, Schemas.vscodeFileResource, Schemas.vscodeRemoteResource, 'devtools']); + + // But allow them if the are made from inside an webview + const isSafeFrame = (requestFrame: WebFrameMain | undefined): boolean => { + for (let frame: WebFrameMain | null | undefined = requestFrame; frame; frame = frame.parent) { + if (frame.url.startsWith(`${Schemas.vscodeWebview}://`)) { + return true; + } + } + return false; + }; + + const isSvgRequestFromSafeContext = (details: Electron.OnBeforeRequestListenerDetails | Electron.OnHeadersReceivedListenerDetails): boolean => { + return details.resourceType === 'xhr' || isSafeFrame(details.frame); + }; + + const isAllowedVsCodeFileRequest = (details: Electron.OnBeforeRequestListenerDetails) => { + const frame = details.frame; + if (!frame || !this.windowsMainService) { + return false; + } + + // Check to see if the request comes from one of the main windows (or shared process) and not from embedded content + const windows = BrowserWindow.getAllWindows(); + for (const window of windows) { + if (frame.processId === window.webContents.mainFrame.processId) { + return true; + } + } + + return false; + }; + + session.defaultSession.webRequest.onBeforeRequest((details, callback) => { + const uri = URI.parse(details.url); + + if (uri.scheme === Schemas.vscodeFileResource) { + if (!isAllowedVsCodeFileRequest(details)) { + this.logService.error('Blocked vscode-file request', details.url); + return callback({ cancel: true }); + } + } + + // Block most svgs + if (uri.path.endsWith('.svg')) { + const isSafeResourceUrl = supportedSvgSchemes.has(uri.scheme); + if (!isSafeResourceUrl) { + return callback({ cancel: !isSvgRequestFromSafeContext(details) }); + } + } + + return callback({ cancel: false }); + }); + + // Configure SVG header content type properly + // https://github.com/microsoft/vscode/issues/97564 + session.defaultSession.webRequest.onHeadersReceived((details, callback) => { + const responseHeaders = details.responseHeaders as Record; + const contentTypes = (responseHeaders['content-type'] || responseHeaders['Content-Type']); + + if (contentTypes && Array.isArray(contentTypes)) { + const uri = URI.parse(details.url); + if (uri.path.endsWith('.svg')) { + if (supportedSvgSchemes.has(uri.scheme)) { + responseHeaders['Content-Type'] = ['image/svg+xml']; + + return callback({ cancel: false, responseHeaders }); + } + } + + // remote extension schemes have the following format + // http://127.0.0.1:/vscode-remote-resource?path= + if (!uri.path.includes(Schemas.vscodeRemoteResource) && contentTypes.some(contentType => contentType.toLowerCase().includes('image/svg'))) { + return callback({ cancel: !isSvgRequestFromSafeContext(details) }); + } + } + + return callback({ cancel: false }); + }); + + //#endregion //#region Code Cache - type SessionWithCodeCachePathSupport = typeof Session & { + type SessionWithCodeCachePathSupport = Session & { /** * Sets code cache directory. By default, the directory will be `Code Cache` under * the respective user data folder. @@ -434,7 +522,7 @@ export class CodeApplication extends Disposable { return machineId; } - private setupSharedProcess(machineId: string): { sharedProcess: SharedProcess, sharedProcessReady: Promise, sharedProcessClient: Promise } { + private setupSharedProcess(machineId: string): { sharedProcess: SharedProcess; sharedProcessReady: Promise; sharedProcessClient: Promise } { const sharedProcess = this._register(this.mainInstantiationService.createInstance(SharedProcess, machineId, this.userEnv)); const sharedProcessClient = (async () => { @@ -488,6 +576,7 @@ export class CodeApplication extends Disposable { services.set(ILaunchMainService, new SyncDescriptor(LaunchMainService)); // Diagnostics + services.set(IDiagnosticsMainService, new SyncDescriptor(DiagnosticsMainService)); services.set(IDiagnosticsService, ProxyChannel.toService(getDelayedChannel(sharedProcessReady.then(client => client.getChannel('diagnostics'))))); // Issues @@ -503,7 +592,7 @@ export class CodeApplication extends Disposable { services.set(INativeHostMainService, new SyncDescriptor(NativeHostMainService, [sharedProcess])); // Credentials - services.set(ICredentialsMainService, new SyncDescriptor(CredentialsMainService)); + services.set(ICredentialsMainService, new SyncDescriptor(CredentialsMainService, [false])); // Webview Manager services.set(IWebviewManagerService, new SyncDescriptor(WebviewMainService)); @@ -563,13 +652,17 @@ export class CodeApplication extends Disposable { private initChannels(accessor: ServicesAccessor, mainProcessElectronServer: ElectronIPCServer, sharedProcessClient: Promise): void { - // Launch: this one is explicitly registered to the node.js - // server because when a second instance starts up, that is - // the only possible connection between the first and the - // second instance. Electron IPC does not work across apps. + // Channels registered to node.js are exposed to second instances + // launching because that is the only way the second instance + // can talk to the first instance. Electron IPC does not work + // across apps until `requestSingleInstance` APIs are adopted. + const launchChannel = ProxyChannel.fromService(accessor.get(ILaunchMainService), { disableMarshalling: true }); this.mainProcessNodeIpcServer.registerChannel('launch', launchChannel); + const diagnosticsChannel = ProxyChannel.fromService(accessor.get(IDiagnosticsMainService), { disableMarshalling: true }); + this.mainProcessNodeIpcServer.registerChannel('diagnostics', diagnosticsChannel); + // Local Files const diskFileSystemProvider = this.fileService.getProvider(Schemas.file); assertType(diskFileSystemProvider instanceof DiskFileSystemProvider); @@ -679,7 +772,7 @@ export class CodeApplication extends Disposable { } catch { return undefined; } - }).filter((obj): obj is { uri: URI, url: string } => { + }).filter((obj): obj is { uri: URI; url: string } => { if (!obj) { return false; } @@ -951,11 +1044,11 @@ export class CodeApplication extends Disposable { // Telemetry type SharedProcessErrorClassification = { - type: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - reason: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - code: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - visible: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - shuttingdown: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; + type: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + reason: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + code: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + visible: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + shuttingdown: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; }; type SharedProcessErrorEvent = { type: WindowError; diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index 9fdb8fbe25d..9e56bcfa902 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -9,11 +9,11 @@ import { Event } from 'vs/base/common/event'; import { hash } from 'vs/base/common/hash'; import { Disposable } from 'vs/base/common/lifecycle'; import { generateUuid } from 'vs/base/common/uuid'; -import { IEncryptionMainService } from 'vs/platform/encryption/node/encryptionMainService'; +import { ICredentialsMainService } from 'vs/platform/credentials/common/credentials'; +import { IEncryptionMainService } from 'vs/platform/encryption/common/encryptionService'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; -import { ICredentialsMainService } from 'vs/platform/credentials/node/credentialsMainService'; interface ElectronAuthenticationResponseDetails extends AuthenticationResponseDetails { firstAuthAttempt?: boolean; // https://github.com/electron/electron/blob/84a42a050e7d45225e69df5bd2d2bf9f1037ea41/shell/browser/login_handler.cc#L70 diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 6340ed52eab..4ba46359de9 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -26,6 +26,7 @@ import { CodeApplication } from 'vs/code/electron-main/app'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'; +import { IDiagnosticsMainService } from 'vs/platform/diagnostics/electron-main/diagnosticsMainService'; import { DiagnosticsService } from 'vs/platform/diagnostics/node/diagnosticsService'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; import { EnvironmentMainService, IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; @@ -48,8 +49,8 @@ import product from 'vs/platform/product/common/product'; import { IProductService } from 'vs/platform/product/common/productService'; import { IProtocolMainService } from 'vs/platform/protocol/electron-main/protocol'; import { ProtocolMainService } from 'vs/platform/protocol/electron-main/protocolMainService'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; -import { TunnelService } from 'vs/platform/remote/node/tunnelService'; +import { ITunnelService } from 'vs/platform/tunnel/common/tunnel'; +import { TunnelService } from 'vs/platform/tunnel/node/tunnelService'; import { IRequestService } from 'vs/platform/request/common/request'; import { RequestMainService } from 'vs/platform/request/electron-main/requestMainService'; import { ISignService } from 'vs/platform/sign/common/sign'; @@ -310,14 +311,15 @@ class CodeMain { }, 10000); } - const launchService = ProxyChannel.toService(client.getChannel('launch'), { disableMarshalling: true }); + const otherInstanceLaunchMainService = ProxyChannel.toService(client.getChannel('launch'), { disableMarshalling: true }); + const otherInstanceDiagnosticsMainService = ProxyChannel.toService(client.getChannel('diagnostics'), { disableMarshalling: true }); // Process Info if (environmentMainService.args.status) { return instantiationService.invokeFunction(async () => { const diagnosticsService = new DiagnosticsService(NullTelemetryService, productService); - const mainProcessInfo = await launchService.getMainProcessInfo(); - const remoteDiagnostics = await launchService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true }); + const mainProcessInfo = await otherInstanceLaunchMainService.getMainProcessInfo(); + const remoteDiagnostics = await otherInstanceDiagnosticsMainService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true }); const diagnostics = await diagnosticsService.getDiagnostics(mainProcessInfo, remoteDiagnostics); console.log(diagnostics); @@ -327,12 +329,12 @@ class CodeMain { // Windows: allow to set foreground if (isWindows) { - await this.windowsAllowSetForegroundWindow(launchService, logService); + await this.windowsAllowSetForegroundWindow(otherInstanceLaunchMainService, logService); } // Send environment over... logService.trace('Sending env to running instance...'); - await launchService.start(environmentMainService.args, process.env as IProcessEnvironment); + await otherInstanceLaunchMainService.start(environmentMainService.args, process.env as IProcessEnvironment); // Cleanup client.dispose(); diff --git a/src/vs/code/electron-sandbox/issue/issueReporterMain.ts b/src/vs/code/electron-sandbox/issue/issueReporterMain.ts index 4fb10a1b5f3..158939c27a9 100644 --- a/src/vs/code/electron-sandbox/issue/issueReporterMain.ts +++ b/src/vs/code/electron-sandbox/issue/issueReporterMain.ts @@ -789,7 +789,7 @@ export class IssueReporter extends Disposable { return isValid; } - private async submitToGitHub(issueTitle: string, issueBody: string, gitHubDetails: { owner: string, repositoryName: string }): Promise { + private async submitToGitHub(issueTitle: string, issueBody: string, gitHubDetails: { owner: string; repositoryName: string }): Promise { const url = `https://api.github.com/repos/${gitHubDetails.owner}/${gitHubDetails.repositoryName}/issues`; const init = { method: 'POST', @@ -897,7 +897,7 @@ export class IssueReporter extends Disposable { : this.configuration.product.reportIssueUrl!; } - private parseGitHubUrl(url: string): undefined | { repositoryName: string, owner: string } { + private parseGitHubUrl(url: string): undefined | { repositoryName: string; owner: string } { // Assumes a GitHub url to a particular repo, https://github.com/repositoryName/owner. // Repository name and owner cannot contain '/' const match = /^https?:\/\/github\.com\/([^\/]*)\/([^\/]*).*/.exec(url); diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorerMain.ts b/src/vs/code/electron-sandbox/processExplorer/processExplorerMain.ts index fad45e92474..97029835679 100644 --- a/src/vs/code/electron-sandbox/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-sandbox/processExplorer/processExplorerMain.ts @@ -201,7 +201,7 @@ class ProcessRenderer implements ITreeRenderer { processCallbacks.push(async _child => { class Profiler { - static async start(name: string, filenamePrefix: string, opts: { port: number, tries?: number, target?: (targets: Target[]) => Target }) { + static async start(name: string, filenamePrefix: string, opts: { port: number; tries?: number; target?: (targets: Target[]) => Target }) { const profiler = await import('v8-inspect-profiler'); let session: ProfilingSession; @@ -401,7 +401,11 @@ export async function main(argv: string[]): Promise { const stream = outputType === 'stdout' ? process.stdout : process.stderr; const cts = new CancellationTokenSource(); - child.on('close', () => cts.dispose(true)); + child.on('close', () => { + // We must dispose the token to stop watching, + // but the watcher might still be reading data. + setTimeout(() => cts.dispose(true), 200); + }); await watchFileContents(tmpName, chunk => stream.write(chunk), () => { /* ignore */ }, cts.token); } finally { unlinkSync(tmpName); diff --git a/src/vs/code/electron-sandbox/issue/test/testReporterModel.test.ts b/src/vs/code/test/electron-sandbox/issue/testReporterModel.test.ts similarity index 100% rename from src/vs/code/electron-sandbox/issue/test/testReporterModel.test.ts rename to src/vs/code/test/electron-sandbox/issue/testReporterModel.test.ts diff --git a/src/vs/editor/browser/config/editorConfiguration.ts b/src/vs/editor/browser/config/editorConfiguration.ts index a738ab973b6..5af58c15fd4 100644 --- a/src/vs/editor/browser/config/editorConfiguration.ts +++ b/src/vs/editor/browser/config/editorConfiguration.ts @@ -13,14 +13,25 @@ import { ElementSizeObserver } from 'vs/editor/browser/config/elementSizeObserve import { FontMeasurements } from 'vs/editor/browser/config/fontMeasurements'; import { migrateOptions } from 'vs/editor/browser/config/migrateOptions'; import { TabFocus } from 'vs/editor/browser/config/tabFocus'; -import { IEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; import { ComputeOptionsMemory, ConfigurationChangedEvent, EditorOption, editorOptionsRegistry, FindComputedEditorOptionValueById, IComputedEditorOptions, IEditorOptions, IEnvironmentalOptions } from 'vs/editor/common/config/editorOptions'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import { BareFontInfo, FontInfo, IValidatedEditorOptions } from 'vs/editor/common/config/fontInfo'; -import { IDimension } from 'vs/editor/common/editorCommon'; +import { IDimension } from 'vs/editor/common/core/dimension'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; import { AccessibilitySupport, IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; +export interface IEditorConstructionOptions extends IEditorOptions { + /** + * The initial editor dimension (to avoid measuring the container). + */ + dimension?: IDimension; + /** + * Place overflow widgets inside an external DOM node. + * Defaults to an internal DOM node. + */ + overflowWidgetsDomNode?: HTMLElement; +} + export class EditorConfiguration extends Disposable implements IEditorConfiguration { private _onDidChange = this._register(new Emitter()); diff --git a/src/vs/editor/browser/config/elementSizeObserver.ts b/src/vs/editor/browser/config/elementSizeObserver.ts index c2bade80d50..3529822e209 100644 --- a/src/vs/editor/browser/config/elementSizeObserver.ts +++ b/src/vs/editor/browser/config/elementSizeObserver.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import { IDimension } from 'vs/editor/common/editorCommon'; +import { IDimension } from 'vs/editor/common/core/dimension'; import { Emitter, Event } from 'vs/base/common/event'; export class ElementSizeObserver extends Disposable { diff --git a/src/vs/editor/browser/config/fontMeasurements.ts b/src/vs/editor/browser/config/fontMeasurements.ts index 61fc14448a7..39e1737cd33 100644 --- a/src/vs/editor/browser/config/fontMeasurements.ts +++ b/src/vs/editor/browser/config/fontMeasurements.ts @@ -237,8 +237,8 @@ class FontMeasurementsImpl extends Disposable { class FontMeasurementsCache { - private readonly _keys: { [key: string]: BareFontInfo; }; - private readonly _values: { [key: string]: FontInfo; }; + private readonly _keys: { [key: string]: BareFontInfo }; + private readonly _values: { [key: string]: FontInfo }; constructor() { this._keys = Object.create(null); diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts index e2e77261a06..31f5704a3b6 100644 --- a/src/vs/editor/browser/controller/mouseHandler.ts +++ b/src/vs/editor/browser/controller/mouseHandler.ts @@ -15,10 +15,10 @@ import { ViewController } from 'vs/editor/browser/view/viewController'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; -import { HorizontalPosition } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; +import { HorizontalPosition } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; /** @@ -457,7 +457,7 @@ class MouseDownOperation extends Disposable { private _getPositionOutsideEditor(e: EditorMouseEvent): IMouseTarget | null { const editorContent = e.editorPos; - const model = this._context.model; + const model = this._context.viewModel; const viewLayout = this._context.viewLayout; const mouseColumn = this._getMouseColumn(e); diff --git a/src/vs/editor/browser/controller/mouseTarget.ts b/src/vs/editor/browser/controller/mouseTarget.ts index cf279032cb0..08edad1d7fd 100644 --- a/src/vs/editor/browser/controller/mouseTarget.ts +++ b/src/vs/editor/browser/controller/mouseTarget.ts @@ -12,14 +12,14 @@ import { IViewCursorRenderData } from 'vs/editor/browser/viewParts/viewCursors/v import { EditorLayoutInfo, EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range as EditorRange } from 'vs/editor/common/core/range'; -import { HorizontalPosition } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; -import { CursorColumns } from 'vs/editor/common/controller/cursorCommon'; +import { HorizontalPosition } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import { IViewModel } from 'vs/editor/common/viewModel'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; import * as dom from 'vs/base/browser/dom'; -import { AtomicTabMoveOperations, Direction } from 'vs/editor/common/controller/cursorAtomicMoveOperations'; +import { AtomicTabMoveOperations, Direction } from 'vs/editor/common/cursor/cursorAtomicMoveOperations'; import { PositionAffinity } from 'vs/editor/common/model'; -import { InjectedText } from 'vs/editor/common/viewModel/modelLineProjectionData'; +import { InjectedText } from 'vs/editor/common/modelLineProjectionData'; const enum HitTestResultType { Unknown, @@ -216,7 +216,7 @@ class ElementPath { export class HitTestContext { - public readonly model: IViewModel; + public readonly viewModel: IViewModel; public readonly layoutInfo: EditorLayoutInfo; public readonly viewDomNode: HTMLElement; public readonly lineHeight: number; @@ -228,7 +228,7 @@ export class HitTestContext { private readonly _viewHelper: IPointerHandlerHelper; constructor(context: ViewContext, viewHelper: IPointerHandlerHelper, lastRenderData: PointerHandlerLastRenderData) { - this.model = context.model; + this.viewModel = context.viewModel; const options = context.configuration.options; this.layoutInfo = options.get(EditorOption.layoutInfo); this.viewDomNode = viewHelper.viewDomNode; @@ -250,7 +250,7 @@ export class HitTestContext { if (viewZoneWhitespace) { const viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2; - const lineCount = context.model.getLineCount(); + const lineCount = context.viewModel.getLineCount(); let positionBefore: Position | null = null; let position: Position | null; let positionAfter: Position | null = null; @@ -261,7 +261,7 @@ export class HitTestContext { } if (viewZoneWhitespace.afterLineNumber > 0) { // There are more lines above this view zone - positionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.model.getLineMaxColumn(viewZoneWhitespace.afterLineNumber)); + positionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.viewModel.getLineMaxColumn(viewZoneWhitespace.afterLineNumber)); } if (positionAfter === null) { @@ -285,11 +285,11 @@ export class HitTestContext { return null; } - public getFullLineRangeAtCoord(mouseVerticalOffset: number): { range: EditorRange; isAfterLines: boolean; } { + public getFullLineRangeAtCoord(mouseVerticalOffset: number): { range: EditorRange; isAfterLines: boolean } { if (this._context.viewLayout.isAfterLines(mouseVerticalOffset)) { // Below the last line - const lineNumber = this._context.model.getLineCount(); - const maxLineColumn = this._context.model.getLineMaxColumn(lineNumber); + const lineNumber = this._context.viewModel.getLineCount(); + const maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber); return { range: new EditorRange(lineNumber, maxLineColumn, lineNumber, maxLineColumn), isAfterLines: true @@ -297,7 +297,7 @@ export class HitTestContext { } const lineNumber = this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset); - const maxLineColumn = this._context.model.getLineMaxColumn(lineNumber); + const maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber); return { range: new EditorRange(lineNumber, 1, lineNumber, maxLineColumn), isAfterLines: false @@ -410,9 +410,9 @@ class HitTestRequest extends BareHitTestRequest { } private _getMouseColumn(position: Position | null = null): number { - if (position && position.column < this._ctx.model.getLineMaxColumn(position.lineNumber)) { + if (position && position.column < this._ctx.viewModel.getLineMaxColumn(position.lineNumber)) { // Most likely, the line contains foreign decorations... - return CursorColumns.visibleColumnFromColumn(this._ctx.model.getLineContent(position.lineNumber), position.column, this._ctx.model.getTextModelOptions().tabSize) + 1; + return CursorColumns.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(position.lineNumber), position.column, this._ctx.viewModel.model.getOptions().tabSize) + 1; } return this.mouseColumn; } @@ -683,8 +683,8 @@ export class MouseTargetFactory { // Check if it is below any lines and any view zones if (ctx.isAfterLines(request.mouseVerticalOffset) || ctx.isInBottomPadding(request.mouseVerticalOffset)) { // This most likely indicates it happened after the last view-line - const lineCount = ctx.model.getLineCount(); - const maxLineColumn = ctx.model.getLineMaxColumn(lineCount); + const lineCount = ctx.viewModel.getLineCount(); + const maxLineColumn = ctx.viewModel.getLineMaxColumn(lineCount); return request.fulfillContentEmpty(new Position(lineCount, maxLineColumn), EMPTY_CONTENT_AFTER_LINES); } @@ -693,7 +693,7 @@ export class MouseTargetFactory { // See https://github.com/microsoft/vscode/issues/46942 if (ElementPath.isStrictChildOfViewLines(request.targetPath)) { const lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); - if (ctx.model.getLineLength(lineNumber) === 0) { + if (ctx.viewModel.getLineLength(lineNumber) === 0) { const lineWidth = ctx.getLineWidth(lineNumber); const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth); return request.fulfillContentEmpty(new Position(lineNumber, 1), detail); @@ -702,7 +702,7 @@ export class MouseTargetFactory { const lineWidth = ctx.getLineWidth(lineNumber); if (request.mouseContentHorizontalOffset >= lineWidth) { const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth); - const pos = new Position(lineNumber, ctx.model.getLineMaxColumn(lineNumber)); + const pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber)); return request.fulfillContentEmpty(pos, detail); } } @@ -723,7 +723,7 @@ export class MouseTargetFactory { private static _hitTestMinimap(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null { if (ElementPath.isChildOfMinimap(request.targetPath)) { const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); - const maxColumn = ctx.model.getLineMaxColumn(possibleLineNumber); + const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber); return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn)); } return null; @@ -735,7 +735,7 @@ export class MouseTargetFactory { const className = request.target.className; if (className && /\b(slider|scrollbar)\b/.test(className)) { const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); - const maxColumn = ctx.model.getLineMaxColumn(possibleLineNumber); + const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber); return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn)); } } @@ -748,7 +748,7 @@ export class MouseTargetFactory { // Is it a child of the scrollable element? if (ElementPath.isChildOfScrollableElement(request.targetPath)) { const possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); - const maxColumn = ctx.model.getLineMaxColumn(possibleLineNumber); + const maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber); return request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn)); } @@ -794,7 +794,7 @@ export class MouseTargetFactory { } // Let's define a, b, c and check if the offset is in between them... - interface OffsetColumn { offset: number; column: number; } + interface OffsetColumn { offset: number; column: number } const points: OffsetColumn[] = []; points.push({ offset: visibleRange.left, column: column }); @@ -804,7 +804,7 @@ export class MouseTargetFactory { points.push({ offset: visibleRange.left, column: column - 1 }); } } - const lineMaxColumn = ctx.model.getLineMaxColumn(lineNumber); + const lineMaxColumn = ctx.viewModel.getLineMaxColumn(lineNumber); if (column < lineMaxColumn) { const visibleRange = ctx.visibleRangeForPosition(lineNumber, column + 1); if (visibleRange) { @@ -911,7 +911,7 @@ export class MouseTargetFactory { * Most probably Gecko */ private static _doHitTestWithCaretPositionFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult { - const hitResult: { offsetNode: Node; offset: number; } = (document).caretPositionFromPoint(coords.clientX, coords.clientY); + const hitResult: { offsetNode: Node; offset: number } = (document).caretPositionFromPoint(coords.clientX, coords.clientY); if (hitResult.offsetNode.nodeType === hitResult.offsetNode.TEXT_NODE) { // offsetNode is expected to be the token text @@ -952,7 +952,7 @@ export class MouseTargetFactory { private static _snapToSoftTabBoundary(position: Position, viewModel: IViewModel): Position { const lineContent = viewModel.getLineContent(position.lineNumber); - const { tabSize } = viewModel.getTextModelOptions(); + const { tabSize } = viewModel.model.getOptions(); const newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, position.column - 1, tabSize, Direction.Nearest); if (newPosition !== -1) { return new Position(position.lineNumber, newPosition + 1); @@ -969,16 +969,16 @@ export class MouseTargetFactory { result = this._doHitTestWithCaretPositionFromPoint(ctx, request.pos.toClientCoordinates()); } if (result.type === HitTestResultType.Content) { - const injectedText = ctx.model.getInjectedTextAt(result.position); + const injectedText = ctx.viewModel.getInjectedTextAt(result.position); - const normalizedPosition = ctx.model.normalizePosition(result.position, PositionAffinity.None); + const normalizedPosition = ctx.viewModel.normalizePosition(result.position, PositionAffinity.None); if (injectedText || !normalizedPosition.equals(result.position)) { result = new ContentHitTestResult(normalizedPosition, result.spanNode, injectedText); } } // Snap to the nearest soft tab boundary if atomic soft tabs are enabled. if (result.type === HitTestResultType.Content && ctx.stickyTabStops) { - result = new ContentHitTestResult(this._snapToSoftTabBoundary(result.position, ctx.model), result.spanNode, result.injectedText); + result = new ContentHitTestResult(this._snapToSoftTabBoundary(result.position, ctx.viewModel), result.spanNode, result.injectedText); } return result; } @@ -1052,7 +1052,7 @@ class CharWidthReader { return CharWidthReader._INSTANCE; } - private readonly _cache: { [cacheKey: string]: number; }; + private readonly _cache: { [cacheKey: string]: number }; private readonly _canvas: HTMLCanvasElement; private constructor() { diff --git a/src/vs/editor/browser/controller/pointerHandler.ts b/src/vs/editor/browser/controller/pointerHandler.ts index 5c4df88ff3b..8f3caf09e6c 100644 --- a/src/vs/editor/browser/controller/pointerHandler.ts +++ b/src/vs/editor/browser/controller/pointerHandler.ts @@ -11,7 +11,7 @@ import { IPointerHandlerHelper, MouseHandler, createMouseMoveEventMerger } from import { IMouseTarget } from 'vs/editor/browser/editorBrowser'; import { EditorMouseEvent, EditorPointerEventFactory } from 'vs/editor/browser/editorDom'; import { ViewController } from 'vs/editor/browser/view/viewController'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; import { TextAreaSyntethicEvents } from 'vs/editor/browser/controller/textAreaInput'; @@ -83,7 +83,7 @@ export class PointerEventHandler extends MouseHandler { private onChange(e: GestureEvent): void { if (this._lastPointerType === 'touch') { - this._context.model.deltaScrollNow(-e.translationX, -e.translationY); + this._context.viewModel.viewLayout.deltaScrollNow(-e.translationX, -e.translationY); } } @@ -126,7 +126,7 @@ class TouchHandler extends MouseHandler { } private onChange(e: GestureEvent): void { - this._context.model.deltaScrollNow(-e.translationX, -e.translationY); + this._context.viewModel.viewLayout.deltaScrollNow(-e.translationX, -e.translationY); } } diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index a56cc2c7f87..3738b00337f 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -19,15 +19,15 @@ import { LineNumbersOverlay } from 'vs/editor/browser/viewParts/lineNumbers/line import { Margin } from 'vs/editor/browser/viewParts/margin/margin'; import { RenderLineNumbersType, EditorOption, IComputedEditorOptions, EditorOptions } from 'vs/editor/common/config/editorOptions'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; -import { WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/core/wordCharacterClassifier'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { EndOfLinePreference } from 'vs/editor/common/model'; -import { RenderingContext, RestrictedRenderingContext, HorizontalPosition } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { RenderingContext, RestrictedRenderingContext, HorizontalPosition } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; import { IEditorAriaOptions } from 'vs/editor/browser/editorBrowser'; import { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from 'vs/base/browser/ui/mouseCursor/mouseCursor'; @@ -58,10 +58,10 @@ class VisibleTextAreaData { prepareRender(visibleRangeProvider: IVisibleRangeProvider): void { const startModelPosition = new Position(this.modelLineNumber, this.distanceToModelLineStart + 1); - const endModelPosition = new Position(this.modelLineNumber, this._context.model.getModelLineMaxColumn(this.modelLineNumber) - this.distanceToModelLineEnd); + const endModelPosition = new Position(this.modelLineNumber, this._context.viewModel.model.getLineMaxColumn(this.modelLineNumber) - this.distanceToModelLineEnd); - this.startPosition = this._context.model.coordinatesConverter.convertModelPositionToViewPosition(startModelPosition); - this.endPosition = this._context.model.coordinatesConverter.convertModelPositionToViewPosition(endModelPosition); + this.startPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(startModelPosition); + this.endPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(endModelPosition); if (this.startPosition.lineNumber === this.endPosition.lineNumber) { this.visibleTextareaStart = visibleRangeProvider.visibleRangeForPosition(this.startPosition); @@ -161,20 +161,20 @@ export class TextAreaHandler extends ViewPart { const simpleModel: ISimpleModel = { getLineCount: (): number => { - return this._context.model.getLineCount(); + return this._context.viewModel.getLineCount(); }, getLineMaxColumn: (lineNumber: number): number => { - return this._context.model.getLineMaxColumn(lineNumber); + return this._context.viewModel.getLineMaxColumn(lineNumber); }, getValueInRange: (range: Range, eol: EndOfLinePreference): string => { - return this._context.model.getValueInRange(range, eol); + return this._context.viewModel.getValueInRange(range, eol); } }; const textAreaInputHost: ITextAreaInputHost = { getDataToCopy: (): ClipboardDataToCopy => { - const rawTextToCopy = this._context.model.getPlainTextToCopy(this._modelSelections, this._emptySelectionClipboard, platform.isWindows); - const newLineCharacter = this._context.model.getEOL(); + const rawTextToCopy = this._context.viewModel.getPlainTextToCopy(this._modelSelections, this._emptySelectionClipboard, platform.isWindows); + const newLineCharacter = this._context.viewModel.model.getEOL(); const isFromEmptySelection = (this._emptySelectionClipboard && this._modelSelections.length === 1 && this._modelSelections[0].isEmpty()); const multicursorText = (Array.isArray(rawTextToCopy) ? rawTextToCopy : null); @@ -183,7 +183,7 @@ export class TextAreaHandler extends ViewPart { let html: string | null | undefined = undefined; let mode: string | null = null; if (CopyOptions.forceCopyWithSyntaxHighlighting || (this._copyWithSyntaxHighlighting && text.length < 65536)) { - const richText = this._context.model.getRichTextToCopy(this._modelSelections, this._emptySelectionClipboard); + const richText = this._context.viewModel.getRichTextToCopy(this._modelSelections, this._emptySelectionClipboard); if (richText) { html = richText.html; mode = richText.mode; @@ -240,7 +240,7 @@ export class TextAreaHandler extends ViewPart { }, deduceModelPosition: (viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position => { - return this._context.model.deduceModelPositionRelativeToViewPosition(viewAnchorPosition, deltaOffset, lineFeedCnt); + return this._context.viewModel.deduceModelPositionRelativeToViewPosition(viewAnchorPosition, deltaOffset, lineFeedCnt); } }; @@ -340,14 +340,14 @@ export class TextAreaHandler extends ViewPart { const tabOffset2 = lineTextAfterSelection.indexOf('\t'); const desiredVisibleAfterCharCount = (tabOffset2 === -1 ? lineTextAfterSelection.length : lineTextAfterSelection.length - tabOffset2 - 1); const endModelPosition = modelSelection.getEndPosition(); - const visibleAfterCharCount = Math.min(this._context.model.getModelLineMaxColumn(endModelPosition.lineNumber) - endModelPosition.column, desiredVisibleAfterCharCount); - const distanceToModelLineEnd = this._context.model.getModelLineMaxColumn(endModelPosition.lineNumber) - endModelPosition.column - visibleAfterCharCount; + const visibleAfterCharCount = Math.min(this._context.viewModel.model.getLineMaxColumn(endModelPosition.lineNumber) - endModelPosition.column, desiredVisibleAfterCharCount); + const distanceToModelLineEnd = this._context.viewModel.model.getLineMaxColumn(endModelPosition.lineNumber) - endModelPosition.column - visibleAfterCharCount; return { distanceToModelLineEnd }; })(); // Scroll to reveal the location in the editor - this._context.model.revealRange( + this._context.viewModel.revealRange( 'keyboard', true, Range.fromPositions(this._selections[0].getStartPosition()), @@ -370,7 +370,7 @@ export class TextAreaHandler extends ViewPart { this.textArea.setClassName(`inputarea ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ime-input`); this._viewController.compositionStart(); - this._context.model.onCompositionStart(); + this._context.viewModel.onCompositionStart(); })); this._register(this._textAreaInput.onCompositionUpdate((e: ICompositionData) => { @@ -389,15 +389,15 @@ export class TextAreaHandler extends ViewPart { this.textArea.setClassName(`inputarea ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`); this._viewController.compositionEnd(); - this._context.model.onCompositionEnd(); + this._context.viewModel.onCompositionEnd(); })); this._register(this._textAreaInput.onFocus(() => { - this._context.model.setHasFocus(true); + this._context.viewModel.setHasFocus(true); })); this._register(this._textAreaInput.onBlur(() => { - this._context.model.setHasFocus(false); + this._context.viewModel.setHasFocus(false); })); } @@ -407,7 +407,7 @@ export class TextAreaHandler extends ViewPart { private _getAndroidWordAtPosition(position: Position): [string, number] { const ANDROID_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\|;:",.<>/?'; - const lineContent = this._context.model.getLineContent(position.lineNumber); + const lineContent = this._context.viewModel.getLineContent(position.lineNumber); const wordSeparators = getMapForWordSeparators(ANDROID_WORD_SEPARATORS); let goingLeft = true; @@ -447,7 +447,7 @@ export class TextAreaHandler extends ViewPart { } private _getWordBeforePosition(position: Position): string { - const lineContent = this._context.model.getLineContent(position.lineNumber); + const lineContent = this._context.viewModel.getLineContent(position.lineNumber); const wordSeparators = getMapForWordSeparators(this._context.configuration.options.get(EditorOption.wordSeparators)); let column = position.column; @@ -466,7 +466,7 @@ export class TextAreaHandler extends ViewPart { private _getCharacterBeforePosition(position: Position): string { if (position.column > 1) { - const lineContent = this._context.model.getLineContent(position.lineNumber); + const lineContent = this._context.viewModel.getLineContent(position.lineNumber); const charBefore = lineContent.charAt(position.column - 2); if (!strings.isHighSurrogate(charBefore.charCodeAt(0))) { return charBefore; @@ -651,7 +651,7 @@ export class TextAreaHandler extends ViewPart { ); // Try to render the textarea with the color/font style to match the text under it - const viewLineData = this._context.model.getViewLineData(startPosition.lineNumber); + const viewLineData = this._context.viewModel.getViewLineData(startPosition.lineNumber); const startTokenIndex = viewLineData.tokens.findTokenIndexAtOffset(startPosition.column - 1); const endTokenIndex = viewLineData.tokens.findTokenIndexAtOffset(endPosition.column - 1); let presentation: ITokenPresentation; diff --git a/src/vs/editor/browser/controller/coreCommands.ts b/src/vs/editor/browser/coreCommands.ts similarity index 98% rename from src/vs/editor/browser/controller/coreCommands.ts rename to src/vs/editor/browser/coreCommands.ts index 9ea26e3f0cd..ecc72a1a366 100644 --- a/src/vs/editor/browser/controller/coreCommands.ts +++ b/src/vs/editor/browser/coreCommands.ts @@ -11,23 +11,23 @@ import { status } from 'vs/base/browser/ui/aria/aria'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Command, EditorCommand, ICommandOptions, registerEditorCommand, MultiCommand, UndoCommand, RedoCommand, SelectAllCommand } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { ColumnSelection, IColumnSelectResult } from 'vs/editor/common/controller/cursorColumnSelection'; -import { CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from 'vs/editor/common/controller/cursorCommon'; -import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { CursorMove as CursorMove_, CursorMoveCommands } from 'vs/editor/common/controller/cursorMoveCommands'; -import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; +import { ColumnSelection, IColumnSelectResult } from 'vs/editor/common/cursor/cursorColumnSelection'; +import { CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from 'vs/editor/common/cursorCommon'; +import { DeleteOperations } from 'vs/editor/common/cursor/cursorDeleteOperations'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; +import { CursorMove as CursorMove_, CursorMoveCommands } from 'vs/editor/common/cursor/cursorMoveCommands'; +import { TypeOperations } from 'vs/editor/common/cursor/cursorTypeOperations'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Handler, ScrollType } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; +import { VerticalRevealType } from 'vs/editor/common/viewEvents'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; +import { IViewModel } from 'vs/editor/common/viewModel'; const CORE_WEIGHT = KeybindingWeight.EditorCore; @@ -332,7 +332,7 @@ export namespace CoreNavigationCommands { private readonly _minimalReveal: boolean; private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { minimalReveal: boolean; inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { minimalReveal: boolean; inSelectionMode: boolean }) { super(opts); this._minimalReveal = opts.minimalReveal; this._inSelectionMode = opts.inSelectionMode; @@ -452,7 +452,7 @@ export namespace CoreNavigationCommands { private readonly _isPaged: boolean; - constructor(opts: ICommandOptions & { isPaged: boolean; }) { + constructor(opts: ICommandOptions & { isPaged: boolean }) { super(opts); this._isPaged = opts.isPaged; } @@ -490,7 +490,7 @@ export namespace CoreNavigationCommands { private readonly _isPaged: boolean; - constructor(opts: ICommandOptions & { isPaged: boolean; }) { + constructor(opts: ICommandOptions & { isPaged: boolean }) { super(opts); this._isPaged = opts.isPaged; } @@ -907,7 +907,7 @@ export namespace CoreNavigationCommands { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } @@ -951,7 +951,7 @@ export namespace CoreNavigationCommands { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } @@ -1005,7 +1005,7 @@ export namespace CoreNavigationCommands { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } @@ -1083,7 +1083,7 @@ export namespace CoreNavigationCommands { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } @@ -1138,7 +1138,7 @@ export namespace CoreNavigationCommands { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } @@ -1182,7 +1182,7 @@ export namespace CoreNavigationCommands { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } @@ -1256,7 +1256,7 @@ export namespace CoreNavigationCommands { ); } - viewModel.setScrollTop(desiredScrollTop, ScrollType.Smooth); + viewModel.viewLayout.setScrollPosition({ scrollTop: desiredScrollTop }, ScrollType.Smooth); } private _computeDesiredScrollTop(viewModel: IViewModel, args: EditorScroll_.ParsedArguments): number { @@ -1276,7 +1276,7 @@ export namespace CoreNavigationCommands { } const viewPosition = viewModel.coordinatesConverter.convertModelPositionToViewPosition(new Position(desiredTopModelLineNumber, 1)); - return viewModel.getVerticalOffsetForLineNumber(viewPosition.lineNumber); + return viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); } let noOfLines: number; @@ -1288,7 +1288,7 @@ export namespace CoreNavigationCommands { noOfLines = args.value; } const deltaLines = (args.direction === EditorScroll_.Direction.Up ? -1 : 1) * noOfLines; - return viewModel.getScrollTop() + deltaLines * viewModel.cursorConfig.lineHeight; + return viewModel.viewLayout.getCurrentScrollTop() + deltaLines * viewModel.cursorConfig.lineHeight; } } @@ -1400,7 +1400,7 @@ export namespace CoreNavigationCommands { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } @@ -1458,7 +1458,7 @@ export namespace CoreNavigationCommands { class LineCommand extends CoreEditorCommand { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } @@ -1491,7 +1491,7 @@ export namespace CoreNavigationCommands { class LastCursorLineCommand extends CoreEditorCommand { private readonly _inSelectionMode: boolean; - constructor(opts: ICommandOptions & { inSelectionMode: boolean; }) { + constructor(opts: ICommandOptions & { inSelectionMode: boolean }) { super(opts); this._inSelectionMode = opts.inSelectionMode; } diff --git a/src/vs/editor/browser/editorBrowser.ts b/src/vs/editor/browser/editorBrowser.ts index de6eeb2007d..057fe0f25e1 100644 --- a/src/vs/editor/browser/editorBrowser.ts +++ b/src/vs/editor/browser/editorBrowser.ts @@ -7,19 +7,20 @@ import { Event } from 'vs/base/common/event'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IMouseEvent, IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { OverviewRulerPosition, ConfigurationChangedEvent, EditorLayoutInfo, IComputedEditorOptions, EditorOption, FindComputedEditorOptionValueById, IEditorOptions, IDiffEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { IIdentifiedSingleEditOperation, IModelDecoration, IModelDeltaDecoration, ITextModel, ICursorStateComputer, IWordAtPosition } from 'vs/editor/common/model'; -import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; -import { IEditorWhitespace } from 'vs/editor/common/viewLayout/linesLayout'; +import { IIdentifiedSingleEditOperation, IModelDecoration, IModelDeltaDecoration, ITextModel, ICursorStateComputer, PositionAffinity } from 'vs/editor/common/model'; +import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; +import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent } from 'vs/editor/common/textModelEvents'; +import { OverviewRulerZone } from 'vs/editor/common/viewModel/overviewZoneManager'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IDiffComputationResult } from 'vs/editor/common/services/editorWorker'; -import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; -import { InjectedText } from 'vs/editor/common/viewModel/modelLineProjectionData'; +import { IEditorWhitespace, IViewModel } from 'vs/editor/common/viewModel'; +import { InjectedText } from 'vs/editor/common/modelLineProjectionData'; +import { IDiffComputationResult, ILineChange } from 'vs/editor/common/diff/diffComputer'; +import { IDimension } from 'vs/editor/common/core/dimension'; /** * A view zone is a full horizontal rectangle that 'pushes' text down. @@ -34,8 +35,14 @@ export interface IViewZone { /** * The column after which this zone should appear. * If not set, the maxLineColumn of `afterLineNumber` will be used. + * This is relevant for wrapped lines. */ afterColumn?: number; + + /** + * If the `afterColumn` has multiple view columns, the affinity specifies which one to use. Defaults to `none`. + */ + afterColumnAffinity?: PositionAffinity; /** * Suppress mouse down events. * If set, the editor will attach a mouse down listener to the view zone and .preventDefault on it. @@ -164,7 +171,7 @@ export interface IContentWidget { * the content widget. If a dimension is returned the editor will * attempt to use it. */ - beforeRender?(): editorCommon.IDimension | null; + beforeRender?(): IDimension | null; /** * Optional function that is invoked after rendering the content * widget. Is being invoked with the selected position preference @@ -435,23 +442,11 @@ export interface IEditorAriaOptions { role?: string; } -export interface IEditorConstructionOptions extends IEditorOptions { - /** - * The initial editor dimension (to avoid measuring the container). - */ - dimension?: editorCommon.IDimension; - /** - * Place overflow widgets inside an external DOM node. - * Defaults to an internal DOM node. - */ - overflowWidgetsDomNode?: HTMLElement; -} - export interface IDiffEditorConstructionOptions extends IDiffEditorOptions { /** * The initial editor dimension (to avoid measuring the container). */ - dimension?: editorCommon.IDimension; + dimension?: IDimension; /** * Place overflow widgets inside an external DOM node. @@ -733,7 +728,7 @@ export interface ICodeEditor extends editorCommon.IEditor { * Get value of the current model attached to this editor. * @see {@link ITextModel.getValue} */ - getValue(options?: { preserveBOM: boolean; lineEnding: string; }): string; + getValue(options?: { preserveBOM: boolean; lineEnding: string }): string; /** * Set the value of the current model attached to this editor. @@ -978,7 +973,7 @@ export interface ICodeEditor extends editorCommon.IEditor { * Explanation 2: the results of this method will not change if the container of the editor gets repositioned. * Warning: the results of this method are inaccurate for positions that are outside the current editor viewport. */ - getScrolledVisiblePosition(position: IPosition): { top: number; left: number; height: number; } | null; + getScrolledVisiblePosition(position: IPosition): { top: number; left: number; height: number } | null; /** * Apply the same font settings as the editor to `target`. @@ -1045,7 +1040,7 @@ export interface IActiveCodeEditor extends ICodeEditor { * Explanation 2: the results of this method will not change if the container of the editor gets repositioned. * Warning: the results of this method are inaccurate for positions that are outside the current editor viewport. */ - getScrolledVisiblePosition(position: IPosition): { top: number; left: number; height: number; }; + getScrolledVisiblePosition(position: IPosition): { top: number; left: number; height: number }; } /** @@ -1129,7 +1124,7 @@ export interface IDiffEditor extends editorCommon.IEditor { /** * Get the computed diff information. */ - getLineChanges(): editorCommon.ILineChange[] | null; + getLineChanges(): ILineChange[] | null; /** * Get the computed diff information. diff --git a/src/vs/editor/browser/editorExtensions.ts b/src/vs/editor/browser/editorExtensions.ts index dc47e4b956e..50766a815c2 100644 --- a/src/vs/editor/browser/editorExtensions.ts +++ b/src/vs/editor/browser/editorExtensions.ts @@ -15,7 +15,7 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { MenuId, MenuRegistry, Action2 } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, IContextKeyService, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; -import { IConstructorSignature1, ServicesAccessor as InstantiationServicesAccessor, BrandedService } from 'vs/platform/instantiation/common/instantiation'; +import { ServicesAccessor as InstantiationServicesAccessor, BrandedService, IInstantiationService, IConstructorSignature } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindings, KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -27,8 +27,8 @@ import { ILogService } from 'vs/platform/log/common/log'; export type ServicesAccessor = InstantiationServicesAccessor; -export type IEditorContributionCtor = IConstructorSignature1; -export type IDiffEditorContributionCtor = IConstructorSignature1; +export type IEditorContributionCtor = IConstructorSignature; +export type IDiffEditorContributionCtor = IConstructorSignature; export interface IEditorContributionDescription { id: string; @@ -56,7 +56,7 @@ export interface ICommandMenuOptions { order: number; when?: ContextKeyExpression; title: string; - icon?: ThemeIcon + icon?: ThemeIcon; } export interface ICommandOptions { id: string; @@ -338,8 +338,8 @@ export abstract class EditorAction extends EditorCommand { protected reportTelemetry(accessor: ServicesAccessor, editor: ICodeEditor) { type EditorActionInvokedClassification = { - name: { classification: 'SystemMetaData', purpose: 'FeatureInsight', }; - id: { classification: 'SystemMetaData', purpose: 'FeatureInsight', }; + name: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + id: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type EditorActionInvokedEvent = { name: string; @@ -420,9 +420,11 @@ export abstract class EditorAction2 extends Action2 { // --- Registration of commands and actions -export function registerModelAndPositionCommand(id: string, handler: (model: ITextModel, position: Position, ...args: any[]) => any) { +export function registerModelAndPositionCommand(id: string, handler: (accessor: ServicesAccessor, model: ITextModel, position: Position, ...args: any[]) => any) { CommandsRegistry.registerCommand(id, function (accessor, ...args) { + const instaService = accessor.get(IInstantiationService); + const [resource, position] = args; assertType(URI.isUri(resource)); assertType(Position.isIPosition(position)); @@ -430,39 +432,13 @@ export function registerModelAndPositionCommand(id: string, handler: (model: ITe const model = accessor.get(IModelService).getModel(resource); if (model) { const editorPosition = Position.lift(position); - return handler(model, editorPosition, ...args.slice(2)); + return instaService.invokeFunction(handler, model, editorPosition, ...args.slice(2)); } return accessor.get(ITextModelService).createModelReference(resource).then(reference => { return new Promise((resolve, reject) => { try { - const result = handler(reference.object.textEditorModel, Position.lift(position), args.slice(2)); - resolve(result); - } catch (err) { - reject(err); - } - }).finally(() => { - reference.dispose(); - }); - }); - }); -} - -export function registerModelCommand(id: string, handler: (model: ITextModel, ...args: any[]) => any) { - CommandsRegistry.registerCommand(id, function (accessor, ...args) { - - const [resource] = args; - assertType(URI.isUri(resource)); - - const model = accessor.get(IModelService).getModel(resource); - if (model) { - return handler(model, ...args.slice(1)); - } - - return accessor.get(ITextModelService).createModelReference(resource).then(reference => { - return new Promise((resolve, reject) => { - try { - const result = handler(reference.object.textEditorModel, args.slice(1)); + const result = instaService.invokeFunction(handler, reference.object.textEditorModel, Position.lift(position), args.slice(2)); resolve(result); } catch (err) { reject(err); @@ -479,7 +455,7 @@ export function registerEditorCommand(editorCommand: T) return editorCommand; } -export function registerEditorAction(ctor: { new(): T; }): T { +export function registerEditorAction(ctor: { new(): T }): T { const action = new ctor(); EditorContributionRegistry.INSTANCE.registerEditorAction(action); return action; @@ -537,7 +513,7 @@ class EditorContributionRegistry { private readonly editorContributions: IEditorContributionDescription[]; private readonly diffEditorContributions: IDiffEditorContributionDescription[]; private readonly editorActions: EditorAction[]; - private readonly editorCommands: { [commandId: string]: EditorCommand; }; + private readonly editorCommands: { [commandId: string]: EditorCommand }; constructor() { this.editorContributions = []; diff --git a/src/vs/editor/browser/services/abstractCodeEditorService.ts b/src/vs/editor/browser/services/abstractCodeEditorService.ts index c5ab51d09e6..ccb2b7761b7 100644 --- a/src/vs/editor/browser/services/abstractCodeEditorService.ts +++ b/src/vs/editor/browser/services/abstractCodeEditorService.ts @@ -37,8 +37,8 @@ export abstract class AbstractCodeEditorService extends Disposable implements IC protected readonly _onDecorationTypeRegistered: Emitter = this._register(new Emitter()); public onDecorationTypeRegistered: Event = this._onDecorationTypeRegistered.event; - private readonly _codeEditors: { [editorId: string]: ICodeEditor; }; - private readonly _diffEditors: { [editorId: string]: IDiffEditor; }; + private readonly _codeEditors: { [editorId: string]: ICodeEditor }; + private readonly _diffEditors: { [editorId: string]: IDiffEditor }; protected _globalStyleSheet: GlobalStyleSheet | null; private readonly _decorationOptionProviders = new Map(); private readonly _editorStyleSheets = new Map(); @@ -182,7 +182,7 @@ export abstract class AbstractCodeEditorService extends Disposable implements IC return provider.resolveDecorationCSSRules(); } - private readonly _transientWatchers: { [uri: string]: ModelTransientSettingWatcher; } = {}; + private readonly _transientWatchers: { [uri: string]: ModelTransientSettingWatcher } = {}; private readonly _modelProperties = new Map>(); public setModelProperty(resource: URI, key: string, value: any): void { @@ -252,7 +252,7 @@ export abstract class AbstractCodeEditorService extends Disposable implements IC export class ModelTransientSettingWatcher { public readonly uri: string; - private readonly _values: { [key: string]: any; }; + private readonly _values: { [key: string]: any }; constructor(uri: string, model: ITextModel, owner: AbstractCodeEditorService) { this.uri = uri; @@ -522,7 +522,7 @@ export class DecorationTypeOptionsProvider implements IModelDecorationOptionsPro } -export const _CSS_MAP: { [prop: string]: string; } = { +export const _CSS_MAP: { [prop: string]: string } = { color: 'color:{0} !important;', opacity: 'opacity:{0};', backgroundColor: 'background-color:{0};', diff --git a/src/vs/editor/browser/services/editorWorkerService.ts b/src/vs/editor/browser/services/editorWorkerService.ts index 31f2a5d8894..729367dd0c0 100644 --- a/src/vs/editor/browser/services/editorWorkerService.ts +++ b/src/vs/editor/browser/services/editorWorkerService.ts @@ -10,12 +10,12 @@ import { SimpleWorkerClient, logOnceWebWorkerWarning, IWorkerClient } from 'vs/b import { DefaultWorkerFactory } from 'vs/base/browser/defaultWorkerFactory'; import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; -import { IChange } from 'vs/editor/common/editorCommon'; +import { IChange, IDiffComputationResult } from 'vs/editor/common/diff/diffComputer'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { EditorSimpleWorker } from 'vs/editor/common/services/editorSimpleWorker'; -import { IDiffComputationResult, IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; +import { IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; import { IModelService } from 'vs/editor/common/services/model'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; import { regExpFlags } from 'vs/base/common/strings'; @@ -23,8 +23,9 @@ import { isNonEmptyArray } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; import { StopWatch } from 'vs/base/common/stopwatch'; import { canceled } from 'vs/base/common/errors'; -import { UnicodeHighlighterOptions } from 'vs/editor/common/languages/unicodeTextModelHighlighter'; +import { UnicodeHighlighterOptions } from 'vs/editor/common/services/unicodeTextModelHighlighter'; import { IEditorWorkerHost } from 'vs/editor/common/services/editorWorkerHost'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; /** * Stop syncing a model to the worker if it was not needed for 1 min. @@ -59,7 +60,8 @@ export class EditorWorkerService extends Disposable implements IEditorWorkerServ @IModelService modelService: IModelService, @ITextResourceConfigurationService configurationService: ITextResourceConfigurationService, @ILogService logService: ILogService, - @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService + @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); this._modelService = modelService; @@ -67,7 +69,7 @@ export class EditorWorkerService extends Disposable implements IEditorWorkerServ this._logService = logService; // register default link-provider and default completions-provider - this._register(modes.LinkProviderRegistry.register({ language: '*', hasAccessToAllModels: true }, { + this._register(languageFeaturesService.linkProvider.register({ language: '*', hasAccessToAllModels: true }, { provideLinks: (model, token) => { if (!canSyncModel(this._modelService, model.uri)) { return Promise.resolve({ links: [] }); // File too large @@ -77,7 +79,7 @@ export class EditorWorkerService extends Disposable implements IEditorWorkerServ }); } })); - this._register(modes.CompletionProviderRegistry.register('*', new WordBasedCompletionItemProvider(this._workerManager, configurationService, this._modelService, languageConfigurationService))); + this._register(languageFeaturesService.completionProvider.register('*', new WordBasedCompletionItemProvider(this._workerManager, configurationService, this._modelService, languageConfigurationService))); } public override dispose(): void { @@ -104,7 +106,7 @@ export class EditorWorkerService extends Disposable implements IEditorWorkerServ return this._workerManager.withWorker().then(client => client.computeDirtyDiff(original, modified, ignoreTrimWhitespace)); } - public computeMoreMinimalEdits(resource: URI, edits: modes.TextEdit[] | null | undefined): Promise { + public computeMoreMinimalEdits(resource: URI, edits: languages.TextEdit[] | null | undefined): Promise { if (isNonEmptyArray(edits)) { if (!canSyncModel(this._modelService, resource)) { return Promise.resolve(edits); // File too large @@ -123,7 +125,7 @@ export class EditorWorkerService extends Disposable implements IEditorWorkerServ return (canSyncModel(this._modelService, resource)); } - public navigateValueSet(resource: URI, range: IRange, up: boolean): Promise { + public navigateValueSet(resource: URI, range: IRange, up: boolean): Promise { return this._workerManager.withWorker().then(client => client.navigateValueSet(resource, range, up)); } @@ -136,7 +138,7 @@ export class EditorWorkerService extends Disposable implements IEditorWorkerServ } } -class WordBasedCompletionItemProvider implements modes.CompletionItemProvider { +class WordBasedCompletionItemProvider implements languages.CompletionItemProvider { private readonly _workerManager: WorkerManager; private readonly _configurationService: ITextResourceConfigurationService; @@ -155,10 +157,10 @@ class WordBasedCompletionItemProvider implements modes.CompletionItemProvider { this._modelService = modelService; } - async provideCompletionItems(model: ITextModel, position: Position): Promise { + async provideCompletionItems(model: ITextModel, position: Position): Promise { type WordBasedSuggestionsConfig = { - wordBasedSuggestions?: boolean, - wordBasedSuggestionsMode?: 'currentDocument' | 'matchingDocuments' | 'allDocuments' + wordBasedSuggestions?: boolean; + wordBasedSuggestionsMode?: 'currentDocument' | 'matchingDocuments' | 'allDocuments'; }; const config = this._configurationService.getValue(model.uri, position, 'editor'); if (!config.wordBasedSuggestions) { @@ -203,9 +205,9 @@ class WordBasedCompletionItemProvider implements modes.CompletionItemProvider { return { duration: data.duration, - suggestions: data.words.map((word): modes.CompletionItem => { + suggestions: data.words.map((word): languages.CompletionItem => { return { - kind: modes.CompletionItemKind.Text, + kind: languages.CompletionItemKind.Text, label: word, insertText: word, range: { insert, replace } @@ -285,8 +287,8 @@ class EditorModelManager extends Disposable { private readonly _proxy: EditorSimpleWorker; private readonly _modelService: IModelService; - private _syncedModels: { [modelUrl: string]: IDisposable; } = Object.create(null); - private _syncedModelsLastUsedTime: { [modelUrl: string]: number; } = Object.create(null); + private _syncedModels: { [modelUrl: string]: IDisposable } = Object.create(null); + private _syncedModelsLastUsedTime: { [modelUrl: string]: number } = Object.create(null); constructor(proxy: EditorSimpleWorker, modelService: IModelService, keepIdleModels: boolean) { super(); @@ -501,19 +503,19 @@ export class EditorWorkerClient extends Disposable implements IEditorWorkerClien }); } - public computeMoreMinimalEdits(resource: URI, edits: modes.TextEdit[]): Promise { + public computeMoreMinimalEdits(resource: URI, edits: languages.TextEdit[]): Promise { return this._withSyncedResources([resource]).then(proxy => { return proxy.computeMoreMinimalEdits(resource.toString(), edits); }); } - public computeLinks(resource: URI): Promise { + public computeLinks(resource: URI): Promise { return this._withSyncedResources([resource]).then(proxy => { return proxy.computeLinks(resource.toString()); }); } - public async textualSuggest(resources: URI[], leadingWord: string | undefined, wordDefRegExp: RegExp): Promise<{ words: string[], duration: number } | null> { + public async textualSuggest(resources: URI[], leadingWord: string | undefined, wordDefRegExp: RegExp): Promise<{ words: string[]; duration: number } | null> { const proxy = await this._withSyncedResources(resources); const wordDef = wordDefRegExp.source; const wordDefFlags = regExpFlags(wordDefRegExp); @@ -533,7 +535,7 @@ export class EditorWorkerClient extends Disposable implements IEditorWorkerClien }); } - public navigateValueSet(resource: URI, range: IRange, up: boolean): Promise { + public navigateValueSet(resource: URI, range: IRange, up: boolean): Promise { return this._withSyncedResources([resource]).then(proxy => { const model = this._modelService.getModel(resource); if (!model) { diff --git a/src/vs/editor/browser/services/openerService.ts b/src/vs/editor/browser/services/openerService.ts index ffb075f20b5..ef7b5edd7d4 100644 --- a/src/vs/editor/browser/services/openerService.ts +++ b/src/vs/editor/browser/services/openerService.ts @@ -15,7 +15,7 @@ import { URI } from 'vs/base/common/uri'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { EditorOpenContext } from 'vs/platform/editor/common/editor'; -import { IExternalOpener, IExternalUriResolver, IOpener, IOpenerService, IResolvedExternalUri, IValidator, matchesScheme, matchesSomeScheme, OpenOptions, ResolveExternalUriOptions } from 'vs/platform/opener/common/opener'; +import { IExternalOpener, IExternalUriResolver, IOpener, IOpenerService, IResolvedExternalUri, IValidator, matchesScheme, matchesSomeScheme, OpenOptions, ResolveExternalUriOptions, selectionFragment } from 'vs/platform/opener/common/opener'; class CommandOpener implements IOpener { @@ -62,16 +62,8 @@ class EditorOpener implements IOpener { if (typeof target === 'string') { target = URI.parse(target); } - let selection: { startLineNumber: number; startColumn: number; } | undefined = undefined; - const match = /^L?(\d+)(?:,(\d+))?/.exec(target.fragment); - if (match) { - // support file:///some/file.js#73,84 - // support file:///some/file.js#L73 - selection = { - startLineNumber: parseInt(match[1]), - startColumn: match[2] ? parseInt(match[2]) : 1 - }; - // remove fragment + const selection = selectionFragment(target); + if (selection) { target = target.with({ fragment: '' }); } diff --git a/src/vs/editor/browser/stableEditorScroll.ts b/src/vs/editor/browser/stableEditorScroll.ts new file mode 100644 index 00000000000..9693f272917 --- /dev/null +++ b/src/vs/editor/browser/stableEditorScroll.ts @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { Position } from 'vs/editor/common/core/position'; + +export class StableEditorScrollState { + + public static capture(editor: ICodeEditor): StableEditorScrollState { + let visiblePosition: Position | null = null; + let visiblePositionScrollDelta = 0; + if (editor.getScrollTop() !== 0) { + const visibleRanges = editor.getVisibleRanges(); + if (visibleRanges.length > 0) { + visiblePosition = visibleRanges[0].getStartPosition(); + const visiblePositionScrollTop = editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); + visiblePositionScrollDelta = editor.getScrollTop() - visiblePositionScrollTop; + } + } + return new StableEditorScrollState(visiblePosition, visiblePositionScrollDelta, editor.getPosition()); + } + + constructor( + private readonly _visiblePosition: Position | null, + private readonly _visiblePositionScrollDelta: number, + private readonly _cursorPosition: Position | null + ) { + } + + public restore(editor: ICodeEditor): void { + if (this._visiblePosition) { + const visiblePositionScrollTop = editor.getTopForPosition(this._visiblePosition.lineNumber, this._visiblePosition.column); + editor.setScrollTop(visiblePositionScrollTop + this._visiblePositionScrollDelta); + } + } + + public restoreRelativeVerticalPositionOfCursor(editor: ICodeEditor): void { + const currentCursorPosition = editor.getPosition(); + + if (!this._cursorPosition || !currentCursorPosition) { + return; + } + + const offset = editor.getTopForLineNumber(currentCursorPosition.lineNumber) - editor.getTopForLineNumber(this._cursorPosition.lineNumber); + editor.setScrollTop(editor.getScrollTop() + offset); + } +} diff --git a/src/vs/editor/browser/view/view.ts b/src/vs/editor/browser/view.ts similarity index 93% rename from src/vs/editor/browser/view/view.ts rename to src/vs/editor/browser/view.ts index 4bd12c7a8c5..71fdda8a375 100644 --- a/src/vs/editor/browser/view/view.ts +++ b/src/vs/editor/browser/view.ts @@ -41,13 +41,13 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; -import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; -import { IThemeService, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; +import { IViewModel } from 'vs/editor/common/viewModel'; +import { getThemeTypeSelector, IColorTheme } from 'vs/platform/theme/common/themeService'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { PointerHandlerLastRenderData } from 'vs/editor/browser/controller/mouseTarget'; @@ -92,7 +92,7 @@ export class View extends ViewEventHandler { constructor( commandDelegate: ICommandDelegate, configuration: IEditorConfiguration, - themeService: IThemeService, + colorTheme: IColorTheme, model: IViewModel, userInputEvents: ViewUserInputEvents, overflowWidgetsDomNode: HTMLElement | undefined @@ -104,17 +104,11 @@ export class View extends ViewEventHandler { const viewController = new ViewController(configuration, model, userInputEvents, commandDelegate); // The view context is passed on to most classes (basically to reduce param. counts in ctors) - this._context = new ViewContext(configuration, themeService.getColorTheme(), model); + this._context = new ViewContext(configuration, colorTheme, model); // Ensure the view is the first event handler in order to update the layout this._context.addEventHandler(this); - this._register(themeService.onDidColorThemeChange(theme => { - this._context.theme.update(theme); - this._context.model.onDidColorThemeChange(); - this.render(true, false); - })); - this._viewParts = []; // Keyboard handler @@ -316,6 +310,7 @@ export class View extends ViewEventHandler { return false; } public override onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { + this._context.theme.update(e.theme); this.domNode.setClassName(this._getEditorClassName()); return false; } @@ -381,13 +376,13 @@ export class View extends ViewEventHandler { } const partialViewportData = this._context.viewLayout.getLinesViewportData(); - this._context.model.setViewport(partialViewportData.startLineNumber, partialViewportData.endLineNumber, partialViewportData.centeredLineNumber); + this._context.viewModel.setViewport(partialViewportData.startLineNumber, partialViewportData.endLineNumber, partialViewportData.centeredLineNumber); const viewportData = new ViewportData( this._selections, partialViewportData, this._context.viewLayout.getWhitespaceViewportData(), - this._context.model + this._context.viewModel ); if (this._contentWidgets.shouldRender()) { @@ -422,20 +417,20 @@ export class View extends ViewEventHandler { this._scrollbar.delegateVerticalScrollbarMouseDown(browserEvent); } - public restoreState(scrollPosition: { scrollLeft: number; scrollTop: number; }): void { - this._context.model.setScrollPosition({ scrollTop: scrollPosition.scrollTop }, ScrollType.Immediate); - this._context.model.tokenizeViewport(); + public restoreState(scrollPosition: { scrollLeft: number; scrollTop: number }): void { + this._context.viewModel.viewLayout.setScrollPosition({ scrollTop: scrollPosition.scrollTop }, ScrollType.Immediate); + this._context.viewModel.tokenizeViewport(); this._renderNow(); this._viewLines.updateLineWidths(); - this._context.model.setScrollPosition({ scrollLeft: scrollPosition.scrollLeft }, ScrollType.Immediate); + this._context.viewModel.viewLayout.setScrollPosition({ scrollLeft: scrollPosition.scrollLeft }, ScrollType.Immediate); } public getOffsetForColumn(modelLineNumber: number, modelColumn: number): number { - const modelPosition = this._context.model.validateModelPosition({ + const modelPosition = this._context.viewModel.model.validatePosition({ lineNumber: modelLineNumber, column: modelColumn }); - const viewPosition = this._context.model.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); + const viewPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); this._flushAccumulatedAndRenderNow(); const visibleRange = this._viewLines.visibleRangeForPosition(new Position(viewPosition.lineNumber, viewPosition.column)); if (!visibleRange) { @@ -449,7 +444,7 @@ export class View extends ViewEventHandler { if (!mouseTarget) { return null; } - return ViewUserInputEvents.convertViewToModelMouseTarget(mouseTarget, this._context.model.coordinatesConverter); + return ViewUserInputEvents.convertViewToModelMouseTarget(mouseTarget, this._context.viewModel.coordinatesConverter); } public createOverviewRuler(cssClassName: string): OverviewRuler { diff --git a/src/vs/editor/browser/view/domLineBreaksComputer.ts b/src/vs/editor/browser/view/domLineBreaksComputer.ts index 5421d81fe60..bd281d1e9cb 100644 --- a/src/vs/editor/browser/view/domLineBreaksComputer.ts +++ b/src/vs/editor/browser/view/domLineBreaksComputer.ts @@ -9,9 +9,9 @@ import { createStringBuilder, IStringBuilder } from 'vs/editor/common/core/strin import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo'; -import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; +import { LineInjectedText } from 'vs/editor/common/textModelEvents'; import { InjectedTextOptions } from 'vs/editor/common/model'; -import { ILineBreaksComputer, ILineBreaksComputerFactory, ModelLineProjectionData } from 'vs/editor/common/viewModel/modelLineProjectionData'; +import { ILineBreaksComputer, ILineBreaksComputerFactory, ModelLineProjectionData } from 'vs/editor/common/modelLineProjectionData'; const ttPolicy = window.trustedTypes?.createPolicy('domLineBreaksComputer', { createHTML: value => value }); diff --git a/src/vs/editor/browser/view/dynamicViewOverlay.ts b/src/vs/editor/browser/view/dynamicViewOverlay.ts index 0fa38d1bc80..c8de7098816 100644 --- a/src/vs/editor/browser/view/dynamicViewOverlay.ts +++ b/src/vs/editor/browser/view/dynamicViewOverlay.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; +import { RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; export abstract class DynamicViewOverlay extends ViewEventHandler { diff --git a/src/vs/editor/common/view/renderingContext.ts b/src/vs/editor/browser/view/renderingContext.ts similarity index 99% rename from src/vs/editor/common/view/renderingContext.ts rename to src/vs/editor/browser/view/renderingContext.ts index 22f0ffc9cda..bed244ba618 100644 --- a/src/vs/editor/common/view/renderingContext.ts +++ b/src/vs/editor/browser/view/renderingContext.ts @@ -6,7 +6,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import { IViewLayout, ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel'; +import { IViewLayout, ViewModelDecoration } from 'vs/editor/common/viewModel'; export interface IViewLines { linesVisibleRangesForRange(range: Range, includeNewLines: boolean): LineVisibleRanges[] | null; diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index 284810957a5..4e76d54d487 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -4,13 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { IEditorMouseEvent, IPartialEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; import { ViewUserInputEvents } from 'vs/editor/browser/view/viewUserInputEvents'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; -import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; +import { IViewModel } from 'vs/editor/common/viewModel'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import * as platform from 'vs/base/common/platform'; diff --git a/src/vs/editor/browser/view/viewLayer.ts b/src/vs/editor/browser/view/viewLayer.ts index 0a1a7ddc0c2..a44fef3d046 100644 --- a/src/vs/editor/browser/view/viewLayer.ts +++ b/src/vs/editor/browser/view/viewLayer.ts @@ -5,7 +5,7 @@ import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/stringBuilder'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; @@ -52,7 +52,7 @@ export class RenderedLinesCollection { this._rendLineNumberStart = rendLineNumberStart; } - _get(): { rendLineNumberStart: number; lines: T[]; } { + _get(): { rendLineNumberStart: number; lines: T[] } { return { rendLineNumberStart: this._rendLineNumberStart, lines: this._lines @@ -210,7 +210,7 @@ export class RenderedLinesCollection { return deletedLines; } - public onTokensChanged(ranges: { fromLineNumber: number; toLineNumber: number; }[]): boolean { + public onTokensChanged(ranges: { fromLineNumber: number; toLineNumber: number }[]): boolean { if (this.getCount() === 0) { // no lines return false; diff --git a/src/vs/editor/browser/view/viewOverlays.ts b/src/vs/editor/browser/view/viewOverlays.ts index 26838c6d229..7efe9478a51 100644 --- a/src/vs/editor/browser/view/viewOverlays.ts +++ b/src/vs/editor/browser/view/viewOverlays.ts @@ -10,9 +10,9 @@ import { IVisibleLine, IVisibleLinesHost, VisibleLinesCollection } from 'vs/edit import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { IStringBuilder } from 'vs/editor/common/core/stringBuilder'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +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 { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/browser/view/viewPart.ts b/src/vs/editor/browser/view/viewPart.ts index 2da12f053ac..14a46ce44fe 100644 --- a/src/vs/editor/browser/view/viewPart.ts +++ b/src/vs/editor/browser/view/viewPart.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { FastDomNode } from 'vs/base/browser/fastDomNode'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; +import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; export abstract class ViewPart extends ViewEventHandler { diff --git a/src/vs/editor/browser/view/viewUserInputEvents.ts b/src/vs/editor/browser/view/viewUserInputEvents.ts index 03d7e4ac35c..64df9a0859f 100644 --- a/src/vs/editor/browser/view/viewUserInputEvents.ts +++ b/src/vs/editor/browser/view/viewUserInputEvents.ts @@ -5,7 +5,7 @@ import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IEditorMouseEvent, IMouseTarget, IPartialEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; -import { ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel'; +import { ICoordinatesConverter } from 'vs/editor/common/viewModel'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; export interface EventCallback { diff --git a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts index 9212caad6c8..19481676f56 100644 --- a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts +++ b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts @@ -9,12 +9,12 @@ import { ContentWidgetPositionPreference, IContentWidget } from 'vs/editor/brows import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Constants } from 'vs/base/common/uint'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +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 { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { IDimension } from 'vs/editor/common/editorCommon'; +import { IDimension } from 'vs/editor/common/core/dimension'; class Coordinate { @@ -32,7 +32,7 @@ class Coordinate { export class ViewContentWidgets extends ViewPart { private readonly _viewDomNode: FastDomNode; - private _widgets: { [key: string]: Widget; }; + private _widgets: { [key: string]: Widget }; public domNode: FastDomNode; public overflowingContentWidgetsDomNode: FastDomNode; @@ -173,8 +173,8 @@ interface IBoxLayoutResult { } interface IRenderData { - coordinate: Coordinate, - position: ContentWidgetPositionPreference + coordinate: Coordinate; + position: ContentWidgetPositionPreference; } class Widget { @@ -257,9 +257,9 @@ class Widget { if (this._range) { // Do not trust that widgets give a valid position - const validModelRange = this._context.model.validateModelRange(this._range); - if (this._context.model.coordinatesConverter.modelPositionIsVisible(validModelRange.getStartPosition()) || this._context.model.coordinatesConverter.modelPositionIsVisible(validModelRange.getEndPosition())) { - this._viewRange = this._context.model.coordinatesConverter.convertModelRangeToViewRange(validModelRange); + const validModelRange = this._context.viewModel.model.validateRange(this._range); + if (this._context.viewModel.coordinatesConverter.modelPositionIsVisible(validModelRange.getStartPosition()) || this._context.viewModel.coordinatesConverter.modelPositionIsVisible(validModelRange.getEndPosition())) { + this._viewRange = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(validModelRange); } } } diff --git a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts index 69b168729a6..3ae95c80a00 100644 --- a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts @@ -5,17 +5,15 @@ import 'vs/css!./currentLineHighlight'; import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay'; -import { editorLineHighlight, editorLineHighlightBorder } from 'vs/editor/common/view/editorColorRegistry'; -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { editorLineHighlight, editorLineHighlightBorder } from 'vs/editor/common/core/editorColorRegistry'; +import { RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import * as arrays from 'vs/base/common/arrays'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { Selection } from 'vs/editor/common/core/selection'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -let isRenderedUsingBorder = true; - export abstract class AbstractLineHighlightOverlay extends DynamicViewOverlay { private readonly _context: ViewContext; protected _lineHeight: number; @@ -57,17 +55,14 @@ export abstract class AbstractLineHighlightOverlay extends DynamicViewOverlay { private _readFromSelections(): boolean { let hasChanged = false; - // Only render the first selection when using border - const renderSelections = isRenderedUsingBorder ? this._selections.slice(0, 1) : this._selections; - - const cursorsLineNumbers = renderSelections.map(s => s.positionLineNumber); + const cursorsLineNumbers = this._selections.map(s => s.positionLineNumber); cursorsLineNumbers.sort((a, b) => a - b); if (!arrays.equals(this._cursorLineNumbers, cursorsLineNumbers)) { this._cursorLineNumbers = cursorsLineNumbers; hasChanged = true; } - const selectionIsEmpty = renderSelections.every(s => s.isEmpty()); + const selectionIsEmpty = this._selections.every(s => s.isEmpty()); if (this._selectionIsEmpty !== selectionIsEmpty) { this._selectionIsEmpty = selectionIsEmpty; hasChanged = true; @@ -155,6 +150,21 @@ export abstract class AbstractLineHighlightOverlay extends DynamicViewOverlay { return this._renderData[lineIndex]; } + protected _shouldRenderInMargin(): boolean { + return ( + (this._renderLineHighlight === 'gutter' || this._renderLineHighlight === 'all') + && (!this._renderLineHighlightOnlyWhenFocus || this._focused) + ); + } + + protected _shouldRenderInContent(): boolean { + return ( + (this._renderLineHighlight === 'line' || this._renderLineHighlight === 'all') + && this._selectionIsEmpty + && (!this._renderLineHighlightOnlyWhenFocus || this._focused) + ); + } + protected abstract _shouldRenderThis(): boolean; protected abstract _shouldRenderOther(): boolean; protected abstract _renderOne(ctx: RenderingContext): string; @@ -167,45 +177,27 @@ export class CurrentLineHighlightOverlay extends AbstractLineHighlightOverlay { return `
`; } protected _shouldRenderThis(): boolean { - return ( - (this._renderLineHighlight === 'line' || this._renderLineHighlight === 'all') - && this._selectionIsEmpty - && (!this._renderLineHighlightOnlyWhenFocus || this._focused) - ); + return this._shouldRenderInContent(); } protected _shouldRenderOther(): boolean { - return ( - (this._renderLineHighlight === 'gutter' || this._renderLineHighlight === 'all') - && (!this._renderLineHighlightOnlyWhenFocus || this._focused) - ); + return this._shouldRenderInMargin(); } } export class CurrentLineMarginHighlightOverlay extends AbstractLineHighlightOverlay { protected _renderOne(ctx: RenderingContext): string { - const className = 'current-line' + (this._shouldRenderMargin() ? ' current-line-margin' : '') + (this._shouldRenderOther() ? ' current-line-margin-both' : ''); + const className = 'current-line' + (this._shouldRenderInMargin() ? ' current-line-margin' : '') + (this._shouldRenderOther() ? ' current-line-margin-both' : ''); return `
`; } - protected _shouldRenderMargin(): boolean { - return ( - (this._renderLineHighlight === 'gutter' || this._renderLineHighlight === 'all') - && (!this._renderLineHighlightOnlyWhenFocus || this._focused) - ); - } protected _shouldRenderThis(): boolean { return true; } protected _shouldRenderOther(): boolean { - return ( - (this._renderLineHighlight === 'line' || this._renderLineHighlight === 'all') - && this._selectionIsEmpty - && (!this._renderLineHighlightOnlyWhenFocus || this._focused) - ); + return this._shouldRenderInContent(); } } registerThemingParticipant((theme, collector) => { - isRenderedUsingBorder = false; const lineHighlight = theme.getColor(editorLineHighlight); if (lineHighlight) { collector.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${lineHighlight}; }`); @@ -214,7 +206,6 @@ registerThemingParticipant((theme, collector) => { if (!lineHighlight || lineHighlight.isTransparent() || theme.defines(editorLineHighlightBorder)) { const lineHighlightBorder = theme.getColor(editorLineHighlightBorder); if (lineHighlightBorder) { - isRenderedUsingBorder = true; collector.addRule(`.monaco-editor .view-overlays .current-line { border: 2px solid ${lineHighlightBorder}; }`); collector.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { border: 2px solid ${lineHighlightBorder}; }`); if (theme.type === 'hc') { diff --git a/src/vs/editor/browser/viewParts/decorations/decorations.ts b/src/vs/editor/browser/viewParts/decorations/decorations.ts index 7b8fad04a03..15dcf0ed0dd 100644 --- a/src/vs/editor/browser/viewParts/decorations/decorations.ts +++ b/src/vs/editor/browser/viewParts/decorations/decorations.ts @@ -6,10 +6,10 @@ import 'vs/css!./decorations'; import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay'; import { Range } from 'vs/editor/common/core/range'; -import { HorizontalRange, RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel'; +import { HorizontalRange, RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; +import { ViewModelDecoration } from 'vs/editor/common/viewModel'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; export class DecorationsOverlay extends DynamicViewOverlay { @@ -164,7 +164,7 @@ export class DecorationsOverlay extends DynamicViewOverlay { let range = d.range; if (showIfCollapsed && range.endColumn === 1 && range.endLineNumber !== range.startLineNumber) { - range = new Range(range.startLineNumber, range.startColumn, range.endLineNumber - 1, this._context.model.getLineMaxColumn(range.endLineNumber - 1)); + range = new Range(range.startLineNumber, range.startColumn, range.endLineNumber - 1, this._context.viewModel.getLineMaxColumn(range.endLineNumber - 1)); } if (prevClassName === className && prevShowIfCollapsed === showIfCollapsed && Range.areIntersectingOrTouching(prevRange!, range)) { diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index 3736489d8fc..9544bfb024e 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -10,9 +10,9 @@ import { IOverviewRulerLayoutInfo, SmoothScrollableElement } from 'vs/base/brows import { ScrollableElementChangeOptions, ScrollableElementCreationOptions } from 'vs/base/browser/ui/scrollbar/scrollableElementOptions'; import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart'; import { INewScrollPosition, ScrollType } from 'vs/editor/common/editorCommon'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +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 { EditorOption } from 'vs/editor/common/config/editorOptions'; import { scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; @@ -90,7 +90,7 @@ export class EditorScrollbar extends ViewPart { } } - this._context.model.setScrollPosition(newScrollPosition, ScrollType.Immediate); + this._context.viewModel.viewLayout.setScrollPosition(newScrollPosition, ScrollType.Immediate); }; // I've seen this happen both on the view dom node & on the lines content dom node. diff --git a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts index 21611c5549b..666bbed6bde 100644 --- a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts +++ b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts @@ -5,9 +5,9 @@ import 'vs/css!./glyphMargin'; import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay'; -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts index 5b92ec69b4e..1cc1d74fc1b 100644 --- a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts +++ b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts @@ -5,17 +5,18 @@ import 'vs/css!./indentGuides'; import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay'; -import { editorActiveIndentGuides, editorBracketHighlightingForeground1, editorBracketHighlightingForeground2, editorBracketHighlightingForeground3, editorBracketHighlightingForeground4, editorBracketHighlightingForeground5, editorBracketHighlightingForeground6, editorBracketPairGuideActiveBackground1, editorBracketPairGuideActiveBackground2, editorBracketPairGuideActiveBackground3, editorBracketPairGuideActiveBackground4, editorBracketPairGuideActiveBackground5, editorBracketPairGuideActiveBackground6, editorBracketPairGuideBackground1, editorBracketPairGuideBackground2, editorBracketPairGuideBackground3, editorBracketPairGuideBackground4, editorBracketPairGuideBackground5, editorBracketPairGuideBackground6, editorIndentGuides } from 'vs/editor/common/view/editorColorRegistry'; -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { editorActiveIndentGuides, editorBracketHighlightingForeground1, editorBracketHighlightingForeground2, editorBracketHighlightingForeground3, editorBracketHighlightingForeground4, editorBracketHighlightingForeground5, editorBracketHighlightingForeground6, editorBracketPairGuideActiveBackground1, editorBracketPairGuideActiveBackground2, editorBracketPairGuideActiveBackground3, editorBracketPairGuideActiveBackground4, editorBracketPairGuideActiveBackground5, editorBracketPairGuideActiveBackground6, editorBracketPairGuideBackground1, editorBracketPairGuideBackground2, editorBracketPairGuideBackground3, editorBracketPairGuideBackground4, editorBracketPairGuideBackground5, editorBracketPairGuideBackground6, editorIndentGuides } from 'vs/editor/common/core/editorColorRegistry'; +import { RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { EditorOption, InternalGuidesOptions } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { ArrayQueue } from 'vs/base/common/arrays'; import { Color } from 'vs/base/common/color'; import { isDefined } from 'vs/base/common/types'; -import { IndentGuide, HorizontalGuidesState, BracketPairGuidesClassNames } from 'vs/editor/common/model/guidesTextModelPart'; +import { BracketPairGuidesClassNames } from 'vs/editor/common/model/guidesTextModelPart'; +import { IndentGuide, HorizontalGuidesState } from 'vs/editor/common/textModelGuides'; export class IndentGuidesOverlay extends DynamicViewOverlay { @@ -156,7 +157,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { activeCursorPosition: Position | null ): IndentGuide[][] { const bracketGuides = this._bracketPairGuideOptions.bracketPairs !== false - ? this._context.model.getBracketGuidesInRangeByLine( + ? this._context.viewModel.getBracketGuidesInRangeByLine( visibleStartLineNumber, visibleEndLineNumber, activeCursorPosition, @@ -173,7 +174,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { : null; const indentGuides = this._bracketPairGuideOptions.indentation - ? this._context.model.getLinesIndentGuides( + ? this._context.viewModel.getLinesIndentGuides( visibleStartLineNumber, visibleEndLineNumber ) @@ -184,13 +185,13 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { let activeIndentLevel = 0; if (this._bracketPairGuideOptions.highlightActiveIndentation && activeCursorPosition) { - const activeIndentInfo = this._context.model.getActiveIndentGuide(activeCursorPosition.lineNumber, visibleStartLineNumber, visibleEndLineNumber); + const activeIndentInfo = this._context.viewModel.getActiveIndentGuide(activeCursorPosition.lineNumber, visibleStartLineNumber, visibleEndLineNumber); activeIndentStartLineNumber = activeIndentInfo.startLineNumber; activeIndentEndLineNumber = activeIndentInfo.endLineNumber; activeIndentLevel = activeIndentInfo.indent; } - const { indentSize } = this._context.model.getTextModelOptions(); + const { indentSize } = this._context.viewModel.model.getOptions(); const result: IndentGuide[][] = []; for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts index 1c3f5d416d6..3f5d8862f26 100644 --- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts @@ -8,10 +8,10 @@ import * as platform from 'vs/base/common/platform'; import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay'; import { RenderLineNumbersType, EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; -import { editorActiveLineNumber, editorLineNumbers } from 'vs/editor/common/view/editorColorRegistry'; -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { editorActiveLineNumber, editorLineNumbers } from 'vs/editor/common/core/editorColorRegistry'; +import { RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; export class LineNumbersOverlay extends DynamicViewOverlay { @@ -68,7 +68,7 @@ export class LineNumbersOverlay extends DynamicViewOverlay { } public override onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { const primaryViewPosition = e.selections[0].getPosition(); - this._lastCursorModelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(primaryViewPosition); + this._lastCursorModelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(primaryViewPosition); let shouldRender = false; if (this._activeLineNumber !== primaryViewPosition.lineNumber) { @@ -102,7 +102,7 @@ export class LineNumbersOverlay extends DynamicViewOverlay { // --- end event handlers private _getLineRenderLineNumber(viewLineNumber: number): string { - const modelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1)); + const modelPosition = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1)); if (modelPosition.column !== 1) { return ''; } @@ -144,13 +144,13 @@ export class LineNumbersOverlay extends DynamicViewOverlay { const visibleEndLineNumber = ctx.visibleRange.endLineNumber; const common = '
'; - const lineCount = this._context.model.getLineCount(); + const lineCount = this._context.viewModel.getLineCount(); const output: string[] = []; for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { const lineIndex = lineNumber - visibleStartLineNumber; if (!this._renderFinalNewline) { - if (lineNumber === lineCount && this._context.model.getLineLength(lineNumber) === 0) { + if (lineNumber === lineCount && this._context.viewModel.getLineLength(lineNumber) === 0) { // Do not render last (empty) line output[lineIndex] = ''; continue; diff --git a/src/vs/editor/browser/viewParts/lines/rangeUtil.ts b/src/vs/editor/browser/viewParts/lines/rangeUtil.ts index a8ab3726635..4b4cec61156 100644 --- a/src/vs/editor/browser/viewParts/lines/rangeUtil.ts +++ b/src/vs/editor/browser/viewParts/lines/rangeUtil.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Constants } from 'vs/base/common/uint'; -import { FloatHorizontalRange } from 'vs/editor/common/view/renderingContext'; +import { FloatHorizontalRange } from 'vs/editor/browser/view/renderingContext'; export class RangeUtil { diff --git a/src/vs/editor/browser/viewParts/lines/viewLine.ts b/src/vs/editor/browser/viewParts/lines/viewLine.ts index f03c68aa466..5caa7b7bb7e 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLine.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLine.ts @@ -10,11 +10,11 @@ import { IVisibleLine } from 'vs/editor/browser/view/viewLayer'; import { RangeUtil } from 'vs/editor/browser/viewParts/lines/rangeUtil'; import { IStringBuilder } from 'vs/editor/common/core/stringBuilder'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; -import { FloatHorizontalRange, VisibleRanges } from 'vs/editor/common/view/renderingContext'; +import { FloatHorizontalRange, VisibleRanges } from 'vs/editor/browser/view/renderingContext'; import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations'; import { CharacterMapping, ForeignElementType, RenderLineInput, renderViewLine, LineRange, DomPosition } from 'vs/editor/common/viewLayout/viewLineRenderer'; import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import { InlineDecorationType } from 'vs/editor/common/viewModel/viewModel'; +import { InlineDecorationType } from 'vs/editor/common/viewModel'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { EditorOption, EditorFontLigatures } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index 14587b1eeec..592fae0011c 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -15,11 +15,11 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ScrollType } from 'vs/editor/common/editorCommon'; -import { IViewLines, LineVisibleRanges, VisibleRanges, HorizontalPosition, HorizontalRange } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { IViewLines, LineVisibleRanges, VisibleRanges, HorizontalPosition, HorizontalRange } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import { Viewport } from 'vs/editor/common/viewModel/viewModel'; +import { Viewport } from 'vs/editor/common/viewModel'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Constants } from 'vs/base/common/uint'; import { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from 'vs/base/browser/ui/mouseCursor/mouseCursor'; @@ -289,7 +289,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, const scrollTopDelta = Math.abs(this._context.viewLayout.getCurrentScrollTop() - newScrollPosition.scrollTop); const scrollType = (scrollTopDelta <= this._lineHeight ? ScrollType.Immediate : e.scrollType); - this._context.model.setScrollPosition(newScrollPosition, scrollType); + this._context.viewModel.viewLayout.setScrollPosition(newScrollPosition, scrollType); return true; } @@ -314,7 +314,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, return this._visibleLines.onTokensChanged(e); } public override onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean { - this._context.model.setMaxLineWidth(this._maxLineWidth); + this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth); return this._visibleLines.onZonesChanged(e); } public override onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { @@ -338,12 +338,12 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, return null; } - if (lineNumber < 1 || lineNumber > this._context.model.getLineCount()) { + if (lineNumber < 1 || lineNumber > this._context.viewModel.getLineCount()) { // lineNumber is outside range return null; } - if (this._context.model.getLineMaxColumn(lineNumber) === 1) { + if (this._context.viewModel.getLineMaxColumn(lineNumber) === 1) { // Line is empty return new Position(lineNumber, 1); } @@ -356,7 +356,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, } let column = this._visibleLines.getVisibleLine(lineNumber).getColumnOfNodeOffset(lineNumber, spanNode, offset); - const minColumn = this._context.model.getLineMinColumn(lineNumber); + const minColumn = this._context.viewModel.getLineMinColumn(lineNumber); if (column < minColumn) { column = minColumn; } @@ -417,7 +417,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, let nextLineModelLineNumber: number = 0; if (includeNewLines) { - nextLineModelLineNumber = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber; + nextLineModelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber; } const rendStartLineNumber = this._visibleLines.getStartLineNumber(); @@ -429,7 +429,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, } const startColumn = lineNumber === range.startLineNumber ? range.startColumn : 1; - const endColumn = lineNumber === range.endLineNumber ? range.endColumn : this._context.model.getLineMaxColumn(lineNumber); + const endColumn = lineNumber === range.endLineNumber ? range.endColumn : this._context.viewModel.getLineMaxColumn(lineNumber); const visibleRangesForLine = this._visibleLines.getVisibleLine(lineNumber).getVisibleRangesForRange(lineNumber, startColumn, endColumn, domReadingContext); if (!visibleRangesForLine) { @@ -438,7 +438,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, if (includeNewLines && lineNumber < originalEndLineNumber) { const currentLineModelLineNumber = nextLineModelLineNumber; - nextLineModelLineNumber = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber + 1, 1)).lineNumber; + nextLineModelLineNumber = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber + 1, 1)).lineNumber; if (currentLineModelLineNumber !== nextLineModelLineNumber) { visibleRangesForLine.ranges[visibleRangesForLine.ranges.length - 1].width += this._typicalHalfwidthCharacterWidth; @@ -514,7 +514,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, localMaxLineWidth = Math.max(localMaxLineWidth, visibleLine.getWidth()); } - if (allWidthsComputed && rendStartLineNumber === 1 && rendEndLineNumber === this._context.model.getLineCount()) { + if (allWidthsComputed && rendStartLineNumber === 1 && rendEndLineNumber === this._context.viewModel.getLineCount()) { // we know the max line width for all the lines this._maxLineWidth = 0; } @@ -594,7 +594,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, this._ensureMaxLineWidth(newScrollLeft.maxHorizontalOffset); } // set `scrollLeft` - this._context.model.setScrollPosition({ + this._context.viewModel.viewLayout.setScrollPosition({ scrollLeft: newScrollLeft.scrollLeft }, horizontalRevealRequest.scrollType); } @@ -633,7 +633,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, const iLineWidth = Math.ceil(lineWidth); if (this._maxLineWidth < iLineWidth) { this._maxLineWidth = iLineWidth; - this._context.model.setMaxLineWidth(this._maxLineWidth); + this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth); } } @@ -720,7 +720,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, return newScrollTop; } - private _computeScrollLeftToReveal(horizontalRevealRequest: HorizontalRevealRequest): { scrollLeft: number; maxHorizontalOffset: number; } | null { + private _computeScrollLeftToReveal(horizontalRevealRequest: HorizontalRevealRequest): { scrollLeft: number; maxHorizontalOffset: number } | null { const viewport = this._context.viewLayout.getCurrentViewport(); const viewportStartX = viewport.left; diff --git a/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts b/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts index 041f0d736b8..60ebb2b9b6f 100644 --- a/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts +++ b/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts @@ -5,9 +5,9 @@ import 'vs/css!./linesDecorations'; import { DecorationToRender, DedupOverlay } from 'vs/editor/browser/viewParts/glyphMargin/glyphMargin'; -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/browser/viewParts/margin/margin.ts b/src/vs/editor/browser/viewParts/margin/margin.ts index 11ba874cbff..3b2bd81b6f2 100644 --- a/src/vs/editor/browser/viewParts/margin/margin.ts +++ b/src/vs/editor/browser/viewParts/margin/margin.ts @@ -5,9 +5,9 @@ import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { ViewPart } from 'vs/editor/browser/view/viewPart'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +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 { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts b/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts index 66562b95fb7..5859945fd2d 100644 --- a/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts +++ b/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts @@ -5,9 +5,9 @@ import 'vs/css!./marginDecorations'; import { DecorationToRender, DedupOverlay } from 'vs/editor/browser/viewParts/glyphMargin/glyphMargin'; -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; export class MarginViewLineDecorationsOverlay extends DedupOverlay { private readonly _context: ViewContext; diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index e256d640e68..cc758c66504 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -22,10 +22,11 @@ import { ColorId } from 'vs/editor/common/languages'; import { MinimapCharRenderer } from 'vs/editor/browser/viewParts/minimap/minimapCharRenderer'; import { Constants } from 'vs/editor/browser/viewParts/minimap/minimapCharSheet'; import { MinimapTokensColorTracker } from 'vs/editor/common/viewModel/minimapTokensColorTracker'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext, EditorTheme } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ViewLineData, ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel'; +import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/browser/view/renderingContext'; +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 { ModelDecorationMinimapOptions } from 'vs/editor/common/model/textModel'; @@ -426,7 +427,7 @@ class RenderData { && this.renderedLayout.endLineNumber === layout.endLineNumber; } - _get(): { imageData: ImageData; rendLineNumberStart: number; lines: MinimapLine[]; } { + _get(): { imageData: ImageData; rendLineNumberStart: number; lines: MinimapLine[] } { const tmp = this._renderedLines._get(); return { imageData: this._imageData, @@ -444,7 +445,7 @@ class RenderData { public onLinesInserted(insertFromLineNumber: number, insertToLineNumber: number): void { this._renderedLines.onLinesInserted(insertFromLineNumber, insertToLineNumber); } - public onTokensChanged(ranges: { fromLineNumber: number; toLineNumber: number; }[]): boolean { + public onTokensChanged(ranges: { fromLineNumber: number; toLineNumber: number }[]): boolean { return this._renderedLines.onTokensChanged(ranges); } } @@ -772,7 +773,7 @@ export class Minimap extends ViewPart implements IMinimapModel { this._minimapSelections = null; this.options = new MinimapOptions(this._context.configuration, this._context.theme, this.tokensColorTracker); - const [samplingState,] = MinimapSamplingState.compute(this.options, this._context.model.getLineCount(), null); + const [samplingState,] = MinimapSamplingState.compute(this.options, this._context.viewModel.getLineCount(), null); this._samplingState = samplingState; this._shouldCheckSampling = false; @@ -858,14 +859,13 @@ export class Minimap extends ViewPart implements IMinimapModel { return this._actual.onScrollChanged(); } public override onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { - this._context.model.invalidateMinimapColorCache(); this._actual.onThemeChanged(); this._onOptionsMaybeChanged(); return true; } public override onTokensChanged(e: viewEvents.ViewTokensChangedEvent): boolean { if (this._samplingState) { - const ranges: { fromLineNumber: number; toLineNumber: number; }[] = []; + const ranges: { fromLineNumber: number; toLineNumber: number }[] = []; for (const range of e.ranges) { const minimapLineRange = this._samplingState.modelLineRangeToMinimapLineRange(range.fromLineNumber, range.toLineNumber); if (minimapLineRange) { @@ -932,7 +932,7 @@ export class Minimap extends ViewPart implements IMinimapModel { this._minimapSelections = null; const wasSampling = Boolean(this._samplingState); - const [samplingState, events] = MinimapSamplingState.compute(this.options, this._context.model.getLineCount(), this._samplingState); + const [samplingState, events] = MinimapSamplingState.compute(this.options, this._context.viewModel.getLineCount(), this._samplingState); this._samplingState = samplingState; if (wasSampling && this._samplingState) { @@ -957,25 +957,25 @@ export class Minimap extends ViewPart implements IMinimapModel { if (this._samplingState) { return this._samplingState.minimapLines.length; } - return this._context.model.getLineCount(); + return this._context.viewModel.getLineCount(); } public getRealLineCount(): number { - return this._context.model.getLineCount(); + return this._context.viewModel.getLineCount(); } public getLineContent(lineNumber: number): string { if (this._samplingState) { - return this._context.model.getLineContent(this._samplingState.minimapLines[lineNumber - 1]); + return this._context.viewModel.getLineContent(this._samplingState.minimapLines[lineNumber - 1]); } - return this._context.model.getLineContent(lineNumber); + return this._context.viewModel.getLineContent(lineNumber); } public getLineMaxColumn(lineNumber: number): number { if (this._samplingState) { - return this._context.model.getLineMaxColumn(this._samplingState.minimapLines[lineNumber - 1]); + return this._context.viewModel.getLineMaxColumn(this._samplingState.minimapLines[lineNumber - 1]); } - return this._context.model.getLineMaxColumn(lineNumber); + return this._context.viewModel.getLineMaxColumn(lineNumber); } public getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): (ViewLineData | null)[] { @@ -983,14 +983,14 @@ export class Minimap extends ViewPart implements IMinimapModel { const result: (ViewLineData | null)[] = []; for (let lineIndex = 0, lineCount = endLineNumber - startLineNumber + 1; lineIndex < lineCount; lineIndex++) { if (needed[lineIndex]) { - result[lineIndex] = this._context.model.getViewLineData(this._samplingState.minimapLines[startLineNumber + lineIndex - 1]); + result[lineIndex] = this._context.viewModel.getViewLineData(this._samplingState.minimapLines[startLineNumber + lineIndex - 1]); } else { result[lineIndex] = null; } } return result; } - return this._context.model.getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed).data; + return this._context.viewModel.getMinimapLinesRenderingData(startLineNumber, endLineNumber, needed).data; } public getSelections(): Selection[] { @@ -1013,11 +1013,11 @@ export class Minimap extends ViewPart implements IMinimapModel { if (this._samplingState) { const modelStartLineNumber = this._samplingState.minimapLines[startLineNumber - 1]; const modelEndLineNumber = this._samplingState.minimapLines[endLineNumber - 1]; - visibleRange = new Range(modelStartLineNumber, 1, modelEndLineNumber, this._context.model.getLineMaxColumn(modelEndLineNumber)); + visibleRange = new Range(modelStartLineNumber, 1, modelEndLineNumber, this._context.viewModel.getLineMaxColumn(modelEndLineNumber)); } else { - visibleRange = new Range(startLineNumber, 1, endLineNumber, this._context.model.getLineMaxColumn(endLineNumber)); + visibleRange = new Range(startLineNumber, 1, endLineNumber, this._context.viewModel.getLineMaxColumn(endLineNumber)); } - const decorations = this._context.model.getDecorationsInViewport(visibleRange); + const decorations = this._context.viewModel.getDecorationsInViewport(visibleRange); if (this._samplingState) { const result: ViewModelDecoration[] = []; @@ -1036,14 +1036,14 @@ export class Minimap extends ViewPart implements IMinimapModel { } public getOptions(): TextModelResolvedOptions { - return this._context.model.getTextModelOptions(); + return this._context.viewModel.model.getOptions(); } public revealLineNumber(lineNumber: number): void { if (this._samplingState) { lineNumber = this._samplingState.minimapLines[lineNumber - 1]; } - this._context.model.revealRange( + this._context.viewModel.revealRange( 'mouse', false, new Range(lineNumber, 1, lineNumber, 1), @@ -1053,7 +1053,7 @@ export class Minimap extends ViewPart implements IMinimapModel { } public setScrollTop(scrollTop: number): void { - this._context.model.setScrollPosition({ + this._context.viewModel.viewLayout.setScrollPosition({ scrollTop: scrollTop }, ScrollType.Immediate); } @@ -1340,7 +1340,7 @@ class InnerMinimap extends Disposable { this._renderDecorations = true; return true; } - public onTokensChanged(ranges: { fromLineNumber: number; toLineNumber: number; }[]): boolean { + public onTokensChanged(ranges: { fromLineNumber: number; toLineNumber: number }[]): boolean { if (this._lastRenderData) { return this._lastRenderData.onTokensChanged(ranges); } @@ -1507,7 +1507,7 @@ class InnerMinimap extends Disposable { continue; } - const decorationColor = minimapOptions.getColor(this._theme); + const decorationColor = minimapOptions.getColor(this._theme.value); if (!decorationColor || decorationColor.isTransparent()) { continue; } @@ -1582,7 +1582,7 @@ class InnerMinimap extends Disposable { continue; } - const decorationColor = minimapOptions.getColor(this._theme); + const decorationColor = minimapOptions.getColor(this._theme.value); if (!decorationColor || decorationColor.isTransparent()) { continue; } diff --git a/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.ts b/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.ts index ea3881e8a8a..a8ffcdc8363 100644 --- a/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.ts +++ b/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.ts @@ -7,9 +7,9 @@ import 'vs/css!./overlayWidgets'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { IOverlayWidget, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +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 { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index 1cb55f638bf..b015d52779e 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -10,12 +10,13 @@ import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { Position } from 'vs/editor/common/core/position'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; import { TokenizationRegistry } from 'vs/editor/common/languages'; -import { editorCursorForeground, editorOverviewRulerBorder, editorOverviewRulerBackground } from 'vs/editor/common/view/editorColorRegistry'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext, EditorTheme } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { editorCursorForeground, editorOverviewRulerBorder, editorOverviewRulerBackground } from 'vs/editor/common/core/editorColorRegistry'; +import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import { EditorTheme } from 'vs/editor/common/editorTheme'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { OverviewRulerDecorationsGroup } from 'vs/editor/common/viewModel/viewModel'; +import { OverviewRulerDecorationsGroup } from 'vs/editor/common/viewModel'; class Settings { @@ -295,8 +296,6 @@ export class DecorationsOverviewRuler extends ViewPart { return true; } public override onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { - // invalidate color cache - this._context.model.invalidateOverviewRulerColorCache(); return this._updateSettings(false); } @@ -318,15 +317,17 @@ export class DecorationsOverviewRuler extends ViewPart { if (this._settings.overviewRulerLanes === 0) { // overview ruler is off this._domNode.setBackgroundColor(this._settings.backgroundColor ? this._settings.backgroundColor : ''); + this._domNode.setDisplay('none'); return; } + this._domNode.setDisplay('block'); const canvasWidth = this._settings.canvasWidth; const canvasHeight = this._settings.canvasHeight; const lineHeight = this._settings.lineHeight; const viewLayout = this._context.viewLayout; const outerHeight = this._context.viewLayout.getScrollHeight(); const heightRatio = canvasHeight / outerHeight; - const decorations = this._context.model.getAllOverviewRulerDecorations(this._context.theme); + const decorations = this._context.viewModel.getAllOverviewRulerDecorations(this._context.theme); const minDecorationHeight = (Constants.MIN_DECORATION_HEIGHT * this._settings.pixelRatio) | 0; const halfMinDecorationHeight = (minDecorationHeight / 2) | 0; diff --git a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts index d13dc67d8ac..78f3c94caae 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts @@ -6,10 +6,10 @@ import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { IOverviewRuler } from 'vs/editor/browser/editorBrowser'; import { OverviewRulerPosition, EditorOption } from 'vs/editor/common/config/editorOptions'; -import { ColorZone, OverviewRulerZone, OverviewZoneManager } from 'vs/editor/common/view/overviewZoneManager'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; +import { ColorZone, OverviewRulerZone, OverviewZoneManager } from 'vs/editor/common/viewModel/overviewZoneManager'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; export class OverviewRuler extends ViewEventHandler implements IOverviewRuler { diff --git a/src/vs/editor/browser/viewParts/rulers/rulers.ts b/src/vs/editor/browser/viewParts/rulers/rulers.ts index fef13c81a92..51f54f8066d 100644 --- a/src/vs/editor/browser/viewParts/rulers/rulers.ts +++ b/src/vs/editor/browser/viewParts/rulers/rulers.ts @@ -6,10 +6,10 @@ import 'vs/css!./rulers'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { ViewPart } from 'vs/editor/browser/view/viewPart'; -import { editorRuler } from 'vs/editor/common/view/editorColorRegistry'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { editorRuler } from 'vs/editor/common/core/editorColorRegistry'; +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 } from 'vs/platform/theme/common/themeService'; import { EditorOption, IRulerOption } from 'vs/editor/common/config/editorOptions'; @@ -64,7 +64,7 @@ export class Rulers extends ViewPart { } if (currentCount < desiredCount) { - const { tabSize } = this._context.model.getTextModelOptions(); + const { tabSize } = this._context.viewModel.model.getOptions(); const rulerWidth = tabSize; let addCount = desiredCount - currentCount; while (addCount > 0) { diff --git a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts index 5e5d5b6d566..4a530cf6b8a 100644 --- a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts +++ b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts @@ -6,9 +6,9 @@ import 'vs/css!./scrollDecoration'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { ViewPart } from 'vs/editor/browser/view/viewPart'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +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 { scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/browser/viewParts/selections/selections.ts b/src/vs/editor/browser/viewParts/selections/selections.ts index 2ecb8afc50f..4ddbbbf3824 100644 --- a/src/vs/editor/browser/viewParts/selections/selections.ts +++ b/src/vs/editor/browser/viewParts/selections/selections.ts @@ -6,9 +6,9 @@ import 'vs/css!./selections'; import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay'; import { Range } from 'vs/editor/common/core/range'; -import { HorizontalRange, LineVisibleRanges, RenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { HorizontalRange, LineVisibleRanges, RenderingContext } from 'vs/editor/browser/view/renderingContext'; +import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { editorInactiveSelection, editorSelectionBackground, editorSelectionForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts index 5d73ee671ef..5d09d9920fa 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts @@ -10,9 +10,9 @@ import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo'; import { TextEditorCursorStyle, EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +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 { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from 'vs/base/browser/ui/mouseCursor/mouseCursor'; export interface IViewCursorRenderData { @@ -123,7 +123,7 @@ export class ViewCursor { */ private _getGraphemeAwarePosition(): [Position, string] { const { lineNumber, column } = this._position; - const lineContent = this._context.model.getLineContent(lineNumber); + const lineContent = this._context.viewModel.getLineContent(lineNumber); const [startOffset, endOffset] = strings.getCharContainingOffset(lineContent, column - 1); return [new Position(lineNumber, startOffset + 1), lineContent.substring(startOffset, endOffset)]; } @@ -176,7 +176,7 @@ export class ViewCursor { let textContentClassName = ''; if (this._cursorStyle === TextEditorCursorStyle.Block) { - const lineData = this._context.model.getViewLineData(position.lineNumber); + const lineData = this._context.viewModel.getViewLineData(position.lineNumber); textContent = nextGrapheme; const tokenIndex = lineData.tokens.findTokenIndexAtOffset(position.column - 1); textContentClassName = lineData.tokens.getClassName(tokenIndex); diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts index abb3529cd56..eb290aceeea 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts @@ -10,10 +10,10 @@ import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { IViewCursorRenderData, ViewCursor } from 'vs/editor/browser/viewParts/viewCursors/viewCursor'; import { TextEditorCursorBlinkingStyle, TextEditorCursorStyle, EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; -import { editorCursorBackground, editorCursorForeground } from 'vs/editor/common/view/editorColorRegistry'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { editorCursorBackground, editorCursorForeground } from 'vs/editor/common/core/editorColorRegistry'; +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 } from 'vs/platform/theme/common/themeService'; export class ViewCursors extends ViewPart { diff --git a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts index 149ae313653..71f50e4796a 100644 --- a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts +++ b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts @@ -8,12 +8,11 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { IViewZone, IViewZoneChangeAccessor } from 'vs/editor/browser/editorBrowser'; import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { Position } from 'vs/editor/common/core/position'; -import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { ViewContext } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { IViewWhitespaceViewportData } from 'vs/editor/common/viewModel/viewModel'; +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 { IEditorWhitespace, IViewWhitespaceViewportData, IWhitespaceChangeAccessor } from 'vs/editor/common/viewModel'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { IWhitespaceChangeAccessor, IEditorWhitespace } from 'vs/editor/common/viewLayout/linesLayout'; export interface IMyViewZone { whitespaceId: string; @@ -35,7 +34,7 @@ const invalidFunc = () => { throw new Error(`Invalid change accessor`); }; export class ViewZones extends ViewPart { - private _zones: { [id: string]: IMyViewZone; }; + private _zones: { [id: string]: IMyViewZone }; private _lineHeight: number; private _contentWidth: number; private _contentLeft: number; @@ -82,7 +81,7 @@ export class ViewZones extends ViewPart { oldWhitespaces.set(whitespace.id, whitespace); } let hadAChange = false; - this._context.model.changeWhitespace((whitespaceAccessor: IWhitespaceChangeAccessor) => { + this._context.viewModel.changeWhitespace((whitespaceAccessor: IWhitespaceChangeAccessor) => { const keys = Object.keys(this._zones); for (let i = 0, len = keys.length; i < len; i++) { const id = keys[i]; @@ -158,37 +157,37 @@ export class ViewZones extends ViewPart { let zoneAfterModelPosition: Position; if (typeof zone.afterColumn !== 'undefined') { - zoneAfterModelPosition = this._context.model.validateModelPosition({ + zoneAfterModelPosition = this._context.viewModel.model.validatePosition({ lineNumber: zone.afterLineNumber, column: zone.afterColumn }); } else { - const validAfterLineNumber = this._context.model.validateModelPosition({ + const validAfterLineNumber = this._context.viewModel.model.validatePosition({ lineNumber: zone.afterLineNumber, column: 1 }).lineNumber; zoneAfterModelPosition = new Position( validAfterLineNumber, - this._context.model.getModelLineMaxColumn(validAfterLineNumber) + this._context.viewModel.model.getLineMaxColumn(validAfterLineNumber) ); } let zoneBeforeModelPosition: Position; - if (zoneAfterModelPosition.column === this._context.model.getModelLineMaxColumn(zoneAfterModelPosition.lineNumber)) { - zoneBeforeModelPosition = this._context.model.validateModelPosition({ + if (zoneAfterModelPosition.column === this._context.viewModel.model.getLineMaxColumn(zoneAfterModelPosition.lineNumber)) { + zoneBeforeModelPosition = this._context.viewModel.model.validatePosition({ lineNumber: zoneAfterModelPosition.lineNumber + 1, column: 1 }); } else { - zoneBeforeModelPosition = this._context.model.validateModelPosition({ + zoneBeforeModelPosition = this._context.viewModel.model.validatePosition({ lineNumber: zoneAfterModelPosition.lineNumber, column: zoneAfterModelPosition.column + 1 }); } - const viewPosition = this._context.model.coordinatesConverter.convertModelPositionToViewPosition(zoneAfterModelPosition); - const isVisible = this._context.model.coordinatesConverter.modelPositionIsVisible(zoneBeforeModelPosition); + const viewPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(zoneAfterModelPosition, zone.afterColumnAffinity); + const isVisible = this._context.viewModel.coordinatesConverter.modelPositionIsVisible(zoneBeforeModelPosition); return { isInHiddenArea: !isVisible, afterViewLineNumber: viewPosition.lineNumber, @@ -200,7 +199,7 @@ export class ViewZones extends ViewPart { public changeViewZones(callback: (changeAccessor: IViewZoneChangeAccessor) => any): boolean { let zonesHaveChanged = false; - this._context.model.changeWhitespace((whitespaceAccessor: IWhitespaceChangeAccessor) => { + this._context.viewModel.changeWhitespace((whitespaceAccessor: IWhitespaceChangeAccessor) => { const changeAccessor: IViewZoneChangeAccessor = { addZone: (zone: IViewZone): string => { @@ -360,7 +359,7 @@ export class ViewZones extends ViewPart { public render(ctx: RestrictedRenderingContext): void { const visibleWhitespaces = ctx.viewportData.whitespaceViewportData; - const visibleZones: { [id: string]: IViewWhitespaceViewportData; } = {}; + const visibleZones: { [id: string]: IViewWhitespaceViewportData } = {}; let hasVisibleZone = false; for (const visibleWhitespace of visibleWhitespaces) { diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 5577f6db98f..4b1cd9876a4 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -16,32 +16,31 @@ import { Emitter, Event } from 'vs/base/common/event'; import { hash } from 'vs/base/common/hash'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; -import { EditorConfiguration } from 'vs/editor/browser/config/editorConfiguration'; +import { EditorConfiguration, IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { EditorExtensionsRegistry, IEditorContributionDescription } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ICommandDelegate } from 'vs/editor/browser/view/viewController'; -import { IContentWidgetData, IOverlayWidgetData, View } from 'vs/editor/browser/view/view'; +import { IContentWidgetData, IOverlayWidgetData, View } from 'vs/editor/browser/view'; import { ViewUserInputEvents } from 'vs/editor/browser/view/viewUserInputEvents'; import { ConfigurationChangedEvent, EditorLayoutInfo, IEditorOptions, EditorOption, IComputedEditorOptions, FindComputedEditorOptionValueById, filterValidationDecorations } from 'vs/editor/common/config/editorOptions'; -import { CursorsController } from 'vs/editor/common/controller/cursor'; -import { CursorColumns } from 'vs/editor/common/controller/cursorCommon'; -import { CursorChangeReason, ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { CursorsController } from 'vs/editor/common/cursor/cursor'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; +import { CursorChangeReason, ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import { InternalEditorAction } from 'vs/editor/common/editorAction'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { EndOfLinePreference, IIdentifiedSingleEditOperation, IModelDecoration, IModelDecorationOptions, IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel, ICursorStateComputer, IWordAtPosition } from 'vs/editor/common/model'; +import { EndOfLinePreference, IIdentifiedSingleEditOperation, IModelDecoration, IModelDecorationOptions, IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel, ICursorStateComputer } from 'vs/editor/common/model'; +import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; import { ClassName } from 'vs/editor/common/model/intervalTree'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import * as modes from 'vs/editor/common/languages'; -import { editorUnnecessaryCodeBorder, editorUnnecessaryCodeOpacity } from 'vs/editor/common/view/editorColorRegistry'; +import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent } from 'vs/editor/common/textModelEvents'; +import { editorUnnecessaryCodeBorder, editorUnnecessaryCodeOpacity } from 'vs/editor/common/core/editorColorRegistry'; import { editorErrorBorder, editorErrorForeground, editorHintBorder, editorHintForeground, editorInfoBorder, editorInfoForeground, editorWarningBorder, editorWarningForeground, editorForeground, editorErrorBackground, editorInfoBackground, editorWarningBackground } from 'vs/platform/theme/common/colorRegistry'; -import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; -import { IEditorWhitespace } from 'vs/editor/common/viewLayout/linesLayout'; +import { VerticalRevealType } from 'vs/editor/common/viewEvents'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -53,12 +52,14 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { withNullAsUndefined } from 'vs/base/common/types'; import { MonospaceLineBreaksComputerFactory } from 'vs/editor/common/viewModel/monospaceLineBreaksComputer'; import { DOMLineBreaksComputerFactory } from 'vs/editor/browser/view/domLineBreaksComputer'; -import { WordOperations } from 'vs/editor/common/controller/cursorWordOperations'; -import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; -import { OutgoingViewModelEventKind } from 'vs/editor/common/viewModel/viewModelEventDispatcher'; +import { WordOperations } from 'vs/editor/common/cursor/cursorWordOperations'; +import { IEditorWhitespace, IViewModel } from 'vs/editor/common/viewModel'; +import { OutgoingViewModelEventKind } from 'vs/editor/common/viewModelEventDispatcher'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; +import { IDimension } from 'vs/editor/common/core/dimension'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; let EDITOR_ID = 0; @@ -226,8 +227,8 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE private readonly _id: number; private readonly _configuration: IEditorConfiguration; - protected _contributions: { [key: string]: editorCommon.IEditorContribution; }; - protected _actions: { [key: string]: editorCommon.IEditorAction; }; + protected _contributions: { [key: string]: editorCommon.IEditorContribution }; + protected _actions: { [key: string]: editorCommon.IEditorAction }; // --- Members logically associated to a model protected _modelData: ModelData | null; @@ -241,8 +242,8 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE private readonly _focusTracker: CodeEditorWidgetFocusTracker; - private _contentWidgets: { [key: string]: IContentWidgetData; }; - private _overlayWidgets: { [key: string]: IOverlayWidgetData; }; + private _contentWidgets: { [key: string]: IContentWidgetData }; + private _overlayWidgets: { [key: string]: IOverlayWidgetData }; /** * map from "parent" decoration type to live decoration ids. @@ -254,7 +255,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE constructor( domElement: HTMLElement, - _options: Readonly, + _options: Readonly, codeEditorWidgetOptions: ICodeEditorWidgetOptions, @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @@ -264,6 +265,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE @INotificationService notificationService: INotificationService, @IAccessibilityService accessibilityService: IAccessibilityService, @ILanguageConfigurationService private readonly languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); @@ -294,7 +296,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE this._commandService = commandService; this._themeService = themeService; this._register(new EditorContextKeysManager(this, this._contextKeyService)); - this._register(new EditorModeContext(this, this._contextKeyService)); + this._register(new EditorModeContext(this, this._contextKeyService, languageFeaturesService)); this._instantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService])); @@ -353,7 +355,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE this._codeEditorService.addCodeEditor(this); } - protected _createConfiguration(isSimpleWidget: boolean, options: Readonly, accessibilityService: IAccessibilityService): EditorConfiguration { + protected _createConfiguration(isSimpleWidget: boolean, options: Readonly, accessibilityService: IAccessibilityService): EditorConfiguration { return new EditorConfiguration(isSimpleWidget, options, this._domElement, accessibilityService); } @@ -419,7 +421,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE return WordOperations.getWordAtPosition(this._modelData.model, this._configuration.options.get(EditorOption.wordSeparators), position); } - public getValue(options: { preserveBOM: boolean; lineEnding: string; } | null = null): string { + public getValue(options: { preserveBOM: boolean; lineEnding: string } | null = null): string { if (!this._modelData) { return ''; } @@ -567,14 +569,14 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE return this._modelData.viewModel.getPosition(); } - public setPosition(position: IPosition): void { + public setPosition(position: IPosition, source: string = 'api'): void { if (!this._modelData) { return; } if (!Position.isIPosition(position)) { throw new Error('Invalid arguments'); } - this._modelData.viewModel.setSelections('api', [{ + this._modelData.viewModel.setSelections(source, [{ selectionStartLineNumber: position.lineNumber, selectionStartColumn: position.column, positionLineNumber: position.lineNumber, @@ -687,11 +689,11 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE return this._modelData.viewModel.getSelections(); } - public setSelection(range: IRange): void; - public setSelection(editorRange: Range): void; - public setSelection(selection: ISelection): void; - public setSelection(editorSelection: Selection): void; - public setSelection(something: any): void { + public setSelection(range: IRange, source?: string): void; + public setSelection(editorRange: Range, source?: string): void; + public setSelection(selection: ISelection, source?: string): void; + public setSelection(editorSelection: Selection, source?: string): void; + public setSelection(something: any, source: string = 'api'): void { const isSelection = Selection.isISelection(something); const isRange = Range.isIRange(something); @@ -700,7 +702,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE } if (isSelection) { - this._setSelectionImpl(something); + this._setSelectionImpl(something, source); } else if (isRange) { // act as if it was an IRange const selection: ISelection = { @@ -709,16 +711,16 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE positionLineNumber: something.endLineNumber, positionColumn: something.endColumn }; - this._setSelectionImpl(selection); + this._setSelectionImpl(selection, source); } } - private _setSelectionImpl(sel: ISelection): void { + private _setSelectionImpl(sel: ISelection, source: string): void { if (!this._modelData) { return; } const selection = new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn); - this._modelData.viewModel.setSelections('api', [selection]); + this._modelData.viewModel.setSelections(source, [selection]); } public revealLines(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { @@ -899,7 +901,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE if (typeof newScrollLeft !== 'number') { throw new Error('Invalid arguments'); } - this._modelData.viewModel.setScrollPosition({ + this._modelData.viewModel.viewLayout.setScrollPosition({ scrollLeft: newScrollLeft }, scrollType); } @@ -910,7 +912,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE if (typeof newScrollTop !== 'number') { throw new Error('Invalid arguments'); } - this._modelData.viewModel.setScrollPosition({ + this._modelData.viewModel.viewLayout.setScrollPosition({ scrollTop: newScrollTop }, scrollType); } @@ -918,7 +920,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE if (!this._modelData) { return; } - this._modelData.viewModel.setScrollPosition(position, scrollType); + this._modelData.viewModel.viewLayout.setScrollPosition(position, scrollType); } public saveViewState(): editorCommon.ICodeEditorViewState | null { @@ -952,7 +954,9 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE if (codeEditorState && codeEditorState.cursorState && codeEditorState.viewState) { const cursorState = codeEditorState.cursorState; if (Array.isArray(cursorState)) { - this._modelData.viewModel.restoreCursorState(cursorState); + if (cursorState.length > 0) { + this._modelData.viewModel.restoreCursorState(cursorState); + } } else { // Backwards compatibility this._modelData.viewModel.restoreCursorState([cursorState]); @@ -1346,7 +1350,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE this._modelData.view.delegateVerticalScrollbarMouseDown(browserEvent); } - public layout(dimension?: editorCommon.IDimension): void { + public layout(dimension?: IDimension): void { this._configuration.observeContainer(dimension); this.render(); } @@ -1461,7 +1465,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE return this._modelData.view.getTargetAtClientPoint(clientX, clientY); } - public getScrolledVisiblePosition(rawPosition: IPosition): { top: number; left: number; height: number; } | null { + public getScrolledVisiblePosition(rawPosition: IPosition): { top: number; left: number; height: number } | null { if (!this._modelData || !this._modelData.hasRealView) { return null; } @@ -1539,7 +1543,8 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE DOMLineBreaksComputerFactory.create(), MonospaceLineBreaksComputerFactory.create(this._configuration.options), (callback) => dom.scheduleAtNextAnimationFrame(callback), - this.languageConfigurationService + this.languageConfigurationService, + this._themeService ); listenersToRemove.push(model.onDidChangeDecorations((e) => this._onDidChangeModelDecorations.fire(e))); @@ -1703,7 +1708,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE const view = new View( commandDelegate, this._configuration, - this._themeService, + this._themeService.getColorTheme(), viewModel, viewUserInputEvents, this._overflowWidgetsDomNode @@ -1751,7 +1756,7 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE return this._codeEditorService.resolveDecorationOptions(typeKey, writable); } - public getTelemetryData(): { [key: string]: any; } | undefined { + public getTelemetryData(): { [key: string]: any } | undefined { return this._telemetryData; } @@ -1908,7 +1913,8 @@ export class EditorModeContext extends Disposable { constructor( private readonly _editor: CodeEditorWidget, - private readonly _contextKeyService: IContextKeyService + private readonly _contextKeyService: IContextKeyService, + private readonly _languageFeaturesService: ILanguageFeaturesService, ) { super(); @@ -1940,22 +1946,22 @@ export class EditorModeContext extends Disposable { this._register(_editor.onDidChangeModelLanguage(update)); // update when registries change - this._register(modes.CompletionProviderRegistry.onDidChange(update)); - this._register(modes.CodeActionProviderRegistry.onDidChange(update)); - this._register(modes.CodeLensProviderRegistry.onDidChange(update)); - this._register(modes.DefinitionProviderRegistry.onDidChange(update)); - this._register(modes.DeclarationProviderRegistry.onDidChange(update)); - this._register(modes.ImplementationProviderRegistry.onDidChange(update)); - this._register(modes.TypeDefinitionProviderRegistry.onDidChange(update)); - this._register(modes.HoverProviderRegistry.onDidChange(update)); - this._register(modes.DocumentHighlightProviderRegistry.onDidChange(update)); - this._register(modes.DocumentSymbolProviderRegistry.onDidChange(update)); - this._register(modes.ReferenceProviderRegistry.onDidChange(update)); - this._register(modes.RenameProviderRegistry.onDidChange(update)); - this._register(modes.DocumentFormattingEditProviderRegistry.onDidChange(update)); - this._register(modes.DocumentRangeFormattingEditProviderRegistry.onDidChange(update)); - this._register(modes.SignatureHelpProviderRegistry.onDidChange(update)); - this._register(modes.InlayHintsProviderRegistry.onDidChange(update)); + this._register(_languageFeaturesService.completionProvider.onDidChange(update)); + this._register(_languageFeaturesService.codeActionProvider.onDidChange(update)); + this._register(_languageFeaturesService.codeLensProvider.onDidChange(update)); + this._register(_languageFeaturesService.definitionProvider.onDidChange(update)); + this._register(_languageFeaturesService.declarationProvider.onDidChange(update)); + this._register(_languageFeaturesService.implementationProvider.onDidChange(update)); + this._register(_languageFeaturesService.typeDefinitionProvider.onDidChange(update)); + this._register(_languageFeaturesService.hoverProvider.onDidChange(update)); + this._register(_languageFeaturesService.documentHighlightProvider.onDidChange(update)); + this._register(_languageFeaturesService.documentSymbolProvider.onDidChange(update)); + this._register(_languageFeaturesService.referenceProvider.onDidChange(update)); + this._register(_languageFeaturesService.renameProvider.onDidChange(update)); + this._register(_languageFeaturesService.documentFormattingEditProvider.onDidChange(update)); + this._register(_languageFeaturesService.documentRangeFormattingEditProvider.onDidChange(update)); + this._register(_languageFeaturesService.signatureHelpProvider.onDidChange(update)); + this._register(_languageFeaturesService.inlayHintsProvider.onDidChange(update)); update(); } @@ -1994,24 +2000,24 @@ export class EditorModeContext extends Disposable { } this._contextKeyService.bufferChangeEvents(() => { this._langId.set(model.getLanguageId()); - this._hasCompletionItemProvider.set(modes.CompletionProviderRegistry.has(model)); - this._hasCodeActionsProvider.set(modes.CodeActionProviderRegistry.has(model)); - this._hasCodeLensProvider.set(modes.CodeLensProviderRegistry.has(model)); - this._hasDefinitionProvider.set(modes.DefinitionProviderRegistry.has(model)); - this._hasDeclarationProvider.set(modes.DeclarationProviderRegistry.has(model)); - this._hasImplementationProvider.set(modes.ImplementationProviderRegistry.has(model)); - this._hasTypeDefinitionProvider.set(modes.TypeDefinitionProviderRegistry.has(model)); - this._hasHoverProvider.set(modes.HoverProviderRegistry.has(model)); - this._hasDocumentHighlightProvider.set(modes.DocumentHighlightProviderRegistry.has(model)); - this._hasDocumentSymbolProvider.set(modes.DocumentSymbolProviderRegistry.has(model)); - this._hasReferenceProvider.set(modes.ReferenceProviderRegistry.has(model)); - this._hasRenameProvider.set(modes.RenameProviderRegistry.has(model)); - this._hasSignatureHelpProvider.set(modes.SignatureHelpProviderRegistry.has(model)); - this._hasInlayHintsProvider.set(modes.InlayHintsProviderRegistry.has(model)); - this._hasDocumentFormattingProvider.set(modes.DocumentFormattingEditProviderRegistry.has(model) || modes.DocumentRangeFormattingEditProviderRegistry.has(model)); - this._hasDocumentSelectionFormattingProvider.set(modes.DocumentRangeFormattingEditProviderRegistry.has(model)); - this._hasMultipleDocumentFormattingProvider.set(modes.DocumentFormattingEditProviderRegistry.all(model).length + modes.DocumentRangeFormattingEditProviderRegistry.all(model).length > 1); - this._hasMultipleDocumentSelectionFormattingProvider.set(modes.DocumentRangeFormattingEditProviderRegistry.all(model).length > 1); + this._hasCompletionItemProvider.set(this._languageFeaturesService.completionProvider.has(model)); + this._hasCodeActionsProvider.set(this._languageFeaturesService.codeActionProvider.has(model)); + this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(model)); + this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(model)); + this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(model)); + this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(model)); + this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(model)); + this._hasHoverProvider.set(this._languageFeaturesService.hoverProvider.has(model)); + this._hasDocumentHighlightProvider.set(this._languageFeaturesService.documentHighlightProvider.has(model)); + this._hasDocumentSymbolProvider.set(this._languageFeaturesService.documentSymbolProvider.has(model)); + this._hasReferenceProvider.set(this._languageFeaturesService.referenceProvider.has(model)); + this._hasRenameProvider.set(this._languageFeaturesService.renameProvider.has(model)); + this._hasSignatureHelpProvider.set(this._languageFeaturesService.signatureHelpProvider.has(model)); + this._hasInlayHintsProvider.set(this._languageFeaturesService.inlayHintsProvider.has(model)); + this._hasDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.has(model) || this._languageFeaturesService.documentRangeFormattingEditProvider.has(model)); + this._hasDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.has(model)); + this._hasMultipleDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.all(model).length + this._languageFeaturesService.documentRangeFormattingEditProvider.all(model).length > 1); + this._hasMultipleDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.all(model).length > 1); this._isInWalkThrough.set(model.uri.scheme === Schemas.walkThroughSnippet); }); } diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 8e50d73f90a..20a1cde4569 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -14,7 +14,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo'; -import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; +import { StableEditorScrollState } from 'vs/editor/browser/stableEditorScroll'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; @@ -27,12 +27,11 @@ import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/strin import * as editorCommon from 'vs/editor/common/editorCommon'; import { IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { IDiffComputationResult, IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; -import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; +import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; +import { OverviewRulerZone } from 'vs/editor/common/viewModel/overviewZoneManager'; import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations'; import { RenderLineInput, renderViewLine } from 'vs/editor/common/viewLayout/viewLineRenderer'; -import { IEditorWhitespace } from 'vs/editor/common/viewLayout/linesLayout'; -import { InlineDecoration, InlineDecorationType, IViewModel, ViewLineRenderingData } from 'vs/editor/common/viewModel/viewModel'; +import { IEditorWhitespace, InlineDecoration, InlineDecorationType, IViewModel, ViewLineRenderingData } from 'vs/editor/common/viewModel'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -49,10 +48,13 @@ import { IEditorProgressService, IProgressRunner } from 'vs/platform/progress/co import { ElementSizeObserver } from 'vs/editor/browser/config/elementSizeObserver'; import { Codicon } from 'vs/base/common/codicons'; import { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from 'vs/base/browser/ui/mouseCursor/mouseCursor'; -import { IViewLineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; -import { ILineBreaksComputer } from 'vs/editor/common/viewModel/modelLineProjectionData'; +import { ILineBreaksComputer } from 'vs/editor/common/modelLineProjectionData'; +import { IChange, IDiffComputationResult, ILineChange } from 'vs/editor/common/diff/diffComputer'; +import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; +import { IDimension } from 'vs/editor/common/core/dimension'; export interface IDiffCodeEditorWidgetOptions { originalEditor?: ICodeEditorWidgetOptions; @@ -81,7 +83,7 @@ interface IEditorsZones { class VisualEditorState { private _zones: string[]; private _inlineDiffMargins: InlineDiffMargin[]; - private _zonesMap: { [zoneId: string]: boolean; }; + private _zonesMap: { [zoneId: string]: boolean }; private _decorations: string[]; constructor( @@ -588,7 +590,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE return editor; } - protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: Readonly, editorWidgetOptions: ICodeEditorWidgetOptions): CodeEditorWidget { + protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: Readonly, editorWidgetOptions: ICodeEditorWidgetOptions): CodeEditorWidget { return instantiationService.createInstance(CodeEditorWidget, container, options, editorWidgetOptions); } @@ -645,7 +647,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE return editorCommon.EditorType.IDiffEditor; } - public getLineChanges(): editorCommon.ILineChange[] | null { + public getLineChanges(): ILineChange[] | null { if (!this._diffComputationResult) { return null; } @@ -764,8 +766,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE return this._modifiedEditor.getPosition(); } - public setPosition(position: IPosition): void { - this._modifiedEditor.setPosition(position); + public setPosition(position: IPosition, source: string = 'api'): void { + this._modifiedEditor.setPosition(position, source); } public revealLine(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { @@ -808,16 +810,16 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE return this._modifiedEditor.getSelections(); } - public setSelection(range: IRange): void; - public setSelection(editorRange: Range): void; - public setSelection(selection: ISelection): void; - public setSelection(editorSelection: Selection): void; - public setSelection(something: any): void { - this._modifiedEditor.setSelection(something); + public setSelection(range: IRange, source?: string): void; + public setSelection(editorRange: Range, source?: string): void; + public setSelection(selection: ISelection, source?: string): void; + public setSelection(editorSelection: Selection, source?: string): void; + public setSelection(something: any, source: string = 'api'): void { + this._modifiedEditor.setSelection(something, source); } - public setSelections(ranges: readonly ISelection[]): void { - this._modifiedEditor.setSelections(ranges); + public setSelections(ranges: readonly ISelection[], source: string = 'api'): void { + this._modifiedEditor.setSelections(ranges, source); } public revealLines(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { @@ -881,7 +883,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE } } - public layout(dimension?: editorCommon.IDimension): void { + public layout(dimension?: IDimension): void { this._elementSizeObserver.observe(dimension); } @@ -1072,7 +1074,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE } } - private _adjustOptionsForSubEditor(options: Readonly): editorBrowser.IEditorConstructionOptions { + private _adjustOptionsForSubEditor(options: Readonly): IEditorConstructionOptions { const clonedOptions = { ...options }; clonedOptions.inDiffEditor = true; clonedOptions.automaticLayout = false; @@ -1089,7 +1091,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE return clonedOptions; } - private _adjustOptionsForLeftHandSide(options: Readonly): editorBrowser.IEditorConstructionOptions { + private _adjustOptionsForLeftHandSide(options: Readonly): IEditorConstructionOptions { const result = this._adjustOptionsForSubEditor(options); if (!this._options.renderSideBySide) { // never wrap hidden editor @@ -1111,7 +1113,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE }; } - private _adjustOptionsForRightHandSide(options: Readonly): editorBrowser.IEditorConstructionOptions { + private _adjustOptionsForRightHandSide(options: Readonly): IEditorConstructionOptions { const result = this._adjustOptionsForSubEditor(options); if (options.modifiedAriaLabel) { result.ariaLabel = options.modifiedAriaLabel; @@ -1178,7 +1180,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE } } - private _computeOverviewViewport(): { height: number; top: number; } | null { + private _computeOverviewViewport(): { height: number; top: number } | null { const layoutInfo = this._modifiedEditor.getLayoutInfo(); if (!layoutInfo) { return null; @@ -1250,7 +1252,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._doLayout(); } - private _getLineChangeAtOrBeforeLineNumber(lineNumber: number, startLineNumberExtractor: (lineChange: editorCommon.ILineChange) => number): editorCommon.ILineChange | null { + private _getLineChangeAtOrBeforeLineNumber(lineNumber: number, startLineNumberExtractor: (lineChange: ILineChange) => number): ILineChange | null { const lineChanges = (this._diffComputationResult ? this._diffComputationResult.changes : []); if (lineChanges.length === 0 || lineNumber < startLineNumberExtractor(lineChanges[0])) { // There are no changes or `lineNumber` is before the first change @@ -1345,7 +1347,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE interface IDataSource { getWidth(): number; getHeight(): number; - getOptions(): { renderOverviewRuler: boolean; }; + getOptions(): { renderOverviewRuler: boolean }; getContainerDomNode(): HTMLElement; relayoutEditors(): void; @@ -1375,7 +1377,7 @@ abstract class DiffEditorWidgetStyle extends Disposable { return hasChanges; } - public getEditorsDiffDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalWhitespaces: IEditorWhitespace[], modifiedWhitespaces: IEditorWhitespace[]): IEditorsDiffDecorationsWithZones { + public getEditorsDiffDecorations(lineChanges: ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalWhitespaces: IEditorWhitespace[], modifiedWhitespaces: IEditorWhitespace[]): IEditorsDiffDecorationsWithZones { // Get view zones modifiedWhitespaces = modifiedWhitespaces.sort((a, b) => { return a.afterLineNumber - b.afterLineNumber; @@ -1403,9 +1405,9 @@ abstract class DiffEditorWidgetStyle extends Disposable { }; } - protected abstract _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], renderIndicators: boolean): IEditorsZones; - protected abstract _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations; - protected abstract _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations; + protected abstract _getViewZones(lineChanges: ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], renderIndicators: boolean): IEditorsZones; + protected abstract _getOriginalEditorDecorations(lineChanges: ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations; + protected abstract _getModifiedEditorDecorations(lineChanges: ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations; public abstract setEnableSplitViewResizing(enableSplitViewResizing: boolean): void; public abstract layout(): number; @@ -1448,7 +1450,7 @@ class ForeignViewZonesIterator { abstract class ViewZonesComputer { constructor( - private readonly _lineChanges: editorCommon.ILineChange[], + private readonly _lineChanges: ILineChange[], private readonly _originalForeignVZ: IEditorWhitespace[], private readonly _modifiedForeignVZ: IEditorWhitespace[], protected readonly _originalEditor: CodeEditorWidget, @@ -1477,7 +1479,7 @@ abstract class ViewZonesComputer { const originalCoordinatesConverter = this._originalEditor._getViewModel()!.coordinatesConverter; const modifiedCoordinatesConverter = this._modifiedEditor._getViewModel()!.coordinatesConverter; - const result: { original: IMyViewZone[]; modified: IMyViewZone[]; } = { + const result: { original: IMyViewZone[]; modified: IMyViewZone[] } = { original: [], modified: [] }; @@ -1706,9 +1708,9 @@ abstract class ViewZonesComputer { protected abstract _createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion(): HTMLDivElement | null; - protected abstract _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null; + protected abstract _produceOriginalFromDiff(lineChange: ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null; - protected abstract _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null; + protected abstract _produceModifiedFromDiff(lineChange: ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null; } function createDecoration(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, options: ModelDecorationOptions) { @@ -1877,14 +1879,14 @@ class DiffEditorWidgetSideBySide extends DiffEditorWidgetStyle implements IVerti return this._dataSource.getHeight(); } - protected _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[]): IEditorsZones { + protected _getViewZones(lineChanges: ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[]): IEditorsZones { const originalEditor = this._dataSource.getOriginalEditor(); const modifiedEditor = this._dataSource.getModifiedEditor(); const c = new SideBySideViewZonesComputer(lineChanges, originalForeignVZ, modifiedForeignVZ, originalEditor, modifiedEditor); return c.getViewZones(); } - protected _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations { + protected _getOriginalEditorDecorations(lineChanges: ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations { const originalEditor = this._dataSource.getOriginalEditor(); const overviewZoneColor = String(this._removeColor); @@ -1941,7 +1943,7 @@ class DiffEditorWidgetSideBySide extends DiffEditorWidgetStyle implements IVerti return result; } - protected _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations { + protected _getModifiedEditorDecorations(lineChanges: ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations { const modifiedEditor = this._dataSource.getModifiedEditor(); const overviewZoneColor = String(this._insertColor); @@ -2003,7 +2005,7 @@ class DiffEditorWidgetSideBySide extends DiffEditorWidgetStyle implements IVerti class SideBySideViewZonesComputer extends ViewZonesComputer { constructor( - lineChanges: editorCommon.ILineChange[], + lineChanges: ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: CodeEditorWidget, @@ -2016,7 +2018,7 @@ class SideBySideViewZonesComputer extends ViewZonesComputer { return null; } - protected _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null { + protected _produceOriginalFromDiff(lineChange: ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null { if (lineChangeModifiedLength > lineChangeOriginalLength) { return { afterLineNumber: Math.max(lineChange.originalStartLineNumber, lineChange.originalEndLineNumber), @@ -2027,7 +2029,7 @@ class SideBySideViewZonesComputer extends ViewZonesComputer { return null; } - protected _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null { + protected _produceModifiedFromDiff(lineChange: ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null { if (lineChangeOriginalLength > lineChangeModifiedLength) { return { afterLineNumber: Math.max(lineChange.modifiedStartLineNumber, lineChange.modifiedEndLineNumber), @@ -2060,14 +2062,14 @@ class DiffEditorWidgetInline extends DiffEditorWidgetStyle { // Nothing to do.. } - protected _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], renderIndicators: boolean): IEditorsZones { + protected _getViewZones(lineChanges: ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], renderIndicators: boolean): IEditorsZones { const originalEditor = this._dataSource.getOriginalEditor(); const modifiedEditor = this._dataSource.getModifiedEditor(); const computer = new InlineViewZonesComputer(lineChanges, originalForeignVZ, modifiedForeignVZ, originalEditor, modifiedEditor, renderIndicators); return computer.getViewZones(); } - protected _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations { + protected _getOriginalEditorDecorations(lineChanges: ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations { const overviewZoneColor = String(this._removeColor); const result: IEditorDiffDecorations = { @@ -2096,7 +2098,7 @@ class DiffEditorWidgetInline extends DiffEditorWidgetStyle { return result; } - protected _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations { + protected _getModifiedEditorDecorations(lineChanges: ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean): IEditorDiffDecorations { const modifiedEditor = this._dataSource.getModifiedEditor(); const overviewZoneColor = String(this._insertColor); @@ -2174,12 +2176,12 @@ class InlineViewZonesComputer extends ViewZonesComputer { private readonly _originalModel: ITextModel; private readonly _renderIndicators: boolean; - private readonly _pendingLineChange: editorCommon.ILineChange[]; + private readonly _pendingLineChange: ILineChange[]; private readonly _pendingViewZones: InlineModifiedViewZone[]; private readonly _lineBreaksComputer: ILineBreaksComputer; constructor( - lineChanges: editorCommon.ILineChange[], + lineChanges: ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: CodeEditorWidget, @@ -2206,7 +2208,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { return result; } - protected _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null { + protected _produceOriginalFromDiff(lineChange: ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null { const marginDomNode = document.createElement('div'); marginDomNode.className = 'inline-added-margin-view-zone'; @@ -2218,7 +2220,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { }; } - protected _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null { + protected _produceModifiedFromDiff(lineChange: ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone | null { const domNode = document.createElement('div'); domNode.className = `view-lines line-delete ${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`; @@ -2467,11 +2469,11 @@ function validateDiffWordWrap(value: 'off' | 'on' | 'inherit' | undefined, defau return validateStringSetOption<'off' | 'on' | 'inherit'>(value, defaultValue, ['off', 'on', 'inherit']); } -function isChangeOrInsert(lineChange: editorCommon.IChange): boolean { +function isChangeOrInsert(lineChange: IChange): boolean { return lineChange.modifiedEndLineNumber > 0; } -function isChangeOrDelete(lineChange: editorCommon.IChange): boolean { +function isChangeOrDelete(lineChange: IChange): boolean { return lineChange.originalEndLineNumber > 0; } diff --git a/src/vs/editor/browser/widget/diffNavigator.ts b/src/vs/editor/browser/widget/diffNavigator.ts index 119aefef555..525c143d10e 100644 --- a/src/vs/editor/browser/widget/diffNavigator.ts +++ b/src/vs/editor/browser/widget/diffNavigator.ts @@ -8,9 +8,10 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import * as objects from 'vs/base/common/objects'; import { IDiffEditor } from 'vs/editor/browser/editorBrowser'; -import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorPositionChangedEvent } from 'vs/editor/common/cursorEvents'; import { Range } from 'vs/editor/common/core/range'; -import { ILineChange, ScrollType } from 'vs/editor/common/editorCommon'; +import { ILineChange } from 'vs/editor/common/diff/diffComputer'; +import { ScrollType } from 'vs/editor/common/editorCommon'; interface IDiffRange { diff --git a/src/vs/editor/browser/widget/diffReview.ts b/src/vs/editor/browser/widget/diffReview.ts index 98c0b4b71ea..38ae5e81a32 100644 --- a/src/vs/editor/browser/widget/diffReview.ts +++ b/src/vs/editor/browser/widget/diffReview.ts @@ -18,13 +18,13 @@ import { EditorAction, ServicesAccessor, registerEditorAction } from 'vs/editor/ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget'; import { IComputedEditorOptions, EditorOption, EditorFontLigatures } from 'vs/editor/common/config/editorOptions'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { Position } from 'vs/editor/common/core/position'; -import { ILineChange, ScrollType } from 'vs/editor/common/editorCommon'; +import { ScrollType } from 'vs/editor/common/editorCommon'; import { ITextModel, TextModelResolvedOptions } from 'vs/editor/common/model'; -import { editorLineNumbers } from 'vs/editor/common/view/editorColorRegistry'; +import { editorLineNumbers } from 'vs/editor/common/core/editorColorRegistry'; import { RenderLineInput, renderViewLine2 as renderViewLine } from 'vs/editor/common/viewLayout/viewLineRenderer'; -import { ViewLineRenderingData } from 'vs/editor/common/viewModel/viewModel'; +import { ViewLineRenderingData } from 'vs/editor/common/viewModel'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; @@ -33,7 +33,8 @@ import { Constants } from 'vs/base/common/uint'; import { Codicon } from 'vs/base/common/codicons'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { ILanguageIdCodec } from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { ILineChange } from 'vs/editor/common/diff/diffComputer'; const DIFF_LINES_PADDING = 3; diff --git a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts index 447c69c5656..856c957a875 100644 --- a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts +++ b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts @@ -20,6 +20,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class EmbeddedCodeEditorWidget extends CodeEditorWidget { @@ -38,8 +39,9 @@ export class EmbeddedCodeEditorWidget extends CodeEditorWidget { @INotificationService notificationService: INotificationService, @IAccessibilityService accessibilityService: IAccessibilityService, @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { - super(domElement, { ...parentEditor.getRawOptions(), overflowWidgetsDomNode: parentEditor.getOverflowWidgetsDomNode() }, {}, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService); + super(domElement, { ...parentEditor.getRawOptions(), overflowWidgetsDomNode: parentEditor.getOverflowWidgetsDomNode() }, {}, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService); this._parentEditor = parentEditor; this._overwriteOptions = options; diff --git a/src/vs/editor/common/commands/shiftCommand.ts b/src/vs/editor/common/commands/shiftCommand.ts index 621449f4130..e9c6d2633bb 100644 --- a/src/vs/editor/common/commands/shiftCommand.ts +++ b/src/vs/editor/common/commands/shiftCommand.ts @@ -5,7 +5,7 @@ import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; -import { CursorColumns } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; import { Range } from 'vs/editor/common/core/range'; import { Selection, SelectionDirection } from 'vs/editor/common/core/selection'; import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; @@ -22,7 +22,7 @@ export interface IShiftCommandOpts { autoIndent: EditorAutoIndentStrategy; } -const repeatCache: { [str: string]: string[]; } = Object.create(null); +const repeatCache: { [str: string]: string[] } = Object.create(null); export function cachedStringRepeat(str: string, count: number): string { if (count <= 0) { return ''; diff --git a/src/vs/editor/common/commands/trimTrailingWhitespaceCommand.ts b/src/vs/editor/common/commands/trimTrailingWhitespaceCommand.ts index c6731682052..ebceaddc032 100644 --- a/src/vs/editor/common/commands/trimTrailingWhitespaceCommand.ts +++ b/src/vs/editor/common/commands/trimTrailingWhitespaceCommand.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as strings from 'vs/base/common/strings'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; -import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; export class TrimTrailingWhitespaceCommand implements ICommand { @@ -42,7 +42,7 @@ export class TrimTrailingWhitespaceCommand implements ICommand { /** * Generate commands for trimming trailing whitespace on a model and ignore lines on which cursors are sitting. */ -export function trimTrailingWhitespace(model: ITextModel, cursors: Position[]): IIdentifiedSingleEditOperation[] { +export function trimTrailingWhitespace(model: ITextModel, cursors: Position[]): ISingleEditOperation[] { // Sort cursors ascending cursors.sort((a, b) => { if (a.lineNumber === b.lineNumber) { @@ -59,7 +59,7 @@ export function trimTrailingWhitespace(model: ITextModel, cursors: Position[]): } } - const r: IIdentifiedSingleEditOperation[] = []; + const r: ISingleEditOperation[] = []; let rLen = 0; let cursorIndex = 0; const cursorLen = cursors.length; diff --git a/src/vs/editor/common/config/editorConfiguration.ts b/src/vs/editor/common/config/editorConfiguration.ts index 74859b2d519..454d81cb089 100644 --- a/src/vs/editor/common/config/editorConfiguration.ts +++ b/src/vs/editor/common/config/editorConfiguration.ts @@ -6,7 +6,7 @@ import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ConfigurationChangedEvent, IComputedEditorOptions, IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IDimension } from 'vs/editor/common/editorCommon'; +import { IDimension } from 'vs/editor/common/core/dimension'; export interface IEditorConfiguration extends IDisposable { /** diff --git a/src/vs/editor/common/config/editorConfigurationSchema.ts b/src/vs/editor/common/config/editorConfigurationSchema.ts index 9b285c156f1..288b0842dbe 100644 --- a/src/vs/editor/common/config/editorConfigurationSchema.ts +++ b/src/vs/editor/common/config/editorConfigurationSchema.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { editorOptionsRegistry, EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; +import { editorOptionsRegistry } from 'vs/editor/common/config/editorOptions'; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/core/textModelDefaults'; import * as nls from 'vs/nls'; import { ConfigurationScope, Extensions, IConfigurationNode, IConfigurationPropertySchema, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -173,7 +174,7 @@ const editorConfiguration: IConfigurationNode = { } }; -function isConfigurationPropertySchema(x: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema; }): x is IConfigurationPropertySchema { +function isConfigurationPropertySchema(x: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema }): x is IConfigurationPropertySchema { return (typeof x.type !== 'undefined' || typeof x.anyOf !== 'undefined'); } @@ -194,10 +195,10 @@ for (const editorOption of editorOptionsRegistry) { } } -let cachedEditorConfigurationKeys: { [key: string]: boolean; } | null = null; -function getEditorConfigurationKeys(): { [key: string]: boolean; } { +let cachedEditorConfigurationKeys: { [key: string]: boolean } | null = null; +function getEditorConfigurationKeys(): { [key: string]: boolean } { if (cachedEditorConfigurationKeys === null) { - cachedEditorConfigurationKeys = <{ [key: string]: boolean; }>Object.create(null); + cachedEditorConfigurationKeys = <{ [key: string]: boolean }>Object.create(null); Object.keys(editorConfiguration.properties!).forEach((prop) => { cachedEditorConfigurationKeys![prop] = true; }); diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 9ca2b58c6b1..3b9fddc2c0d 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -8,12 +8,13 @@ import * as platform from 'vs/base/common/platform'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { Constants } from 'vs/base/common/uint'; -import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; +import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/core/wordHelper'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; import { IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import * as arrays from 'vs/base/common/arrays'; import * as objects from 'vs/base/common/objects'; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/core/textModelDefaults'; //#region typed options @@ -648,8 +649,15 @@ export interface IEditorOptions { */ guides?: IGuidesOptions; + /** + * Controls the behavior of the unicode highlight feature + * (by default, ambiguous and invisible characters are highlighted). + */ unicodeHighlight?: IUnicodeHighlightOptions; + /** + * Configures bracket pair colorization (disabled by default). + */ bracketPairColorization?: IBracketPairColorizationOptions; } @@ -790,7 +798,7 @@ export interface IEditorOption { /** * @internal */ - readonly schema: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema; } | undefined; + readonly schema: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema } | undefined; /** * @internal */ @@ -823,9 +831,9 @@ abstract class BaseEditorOption implements IEditor public readonly id: K; public readonly name: string; public readonly defaultValue: V; - public readonly schema: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema; } | undefined; + public readonly schema: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema } | undefined; - constructor(id: K, name: PossibleKeyName, defaultValue: V, schema?: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema; }) { + constructor(id: K, name: PossibleKeyName, defaultValue: V, schema?: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema }) { this.id = id; this.name = name; this.defaultValue = defaultValue; @@ -2099,7 +2107,7 @@ export class EditorLayoutInfoComputer extends ComputedEditorOption; + + /** + * Unicode characters that are common in allowed locales are not being highlighted. + */ allowedLocales?: Record; } @@ -4153,7 +4185,7 @@ class EditorSuggest extends BaseEditorOption if `range` is collapsed, all markers at the position will be moved. + */ + forceMoveMarkers?: boolean; +} export class EditOperation { - public static insert(position: Position, text: string): IIdentifiedSingleEditOperation { + public static insert(position: Position, text: string): ISingleEditOperation { return { range: new Range(position.lineNumber, position.column, position.lineNumber, position.column), text: text, @@ -17,21 +36,21 @@ export class EditOperation { }; } - public static delete(range: Range): IIdentifiedSingleEditOperation { + public static delete(range: Range): ISingleEditOperation { return { range: range, text: null }; } - public static replace(range: Range, text: string | null): IIdentifiedSingleEditOperation { + public static replace(range: Range, text: string | null): ISingleEditOperation { return { range: range, text: text }; } - public static replaceMove(range: Range, text: string | null): IIdentifiedSingleEditOperation { + public static replaceMove(range: Range, text: string | null): ISingleEditOperation { return { range: range, text: text, diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/core/editorColorRegistry.ts similarity index 100% rename from src/vs/editor/common/view/editorColorRegistry.ts rename to src/vs/editor/common/core/editorColorRegistry.ts diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/eolCounter.ts b/src/vs/editor/common/core/eolCounter.ts similarity index 100% rename from src/vs/editor/common/model/pieceTreeTextBuffer/eolCounter.ts rename to src/vs/editor/common/core/eolCounter.ts diff --git a/src/vs/editor/common/core/indentation.ts b/src/vs/editor/common/core/indentation.ts new file mode 100644 index 00000000000..0134b97c376 --- /dev/null +++ b/src/vs/editor/common/core/indentation.ts @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as strings from 'vs/base/common/strings'; + +function _normalizeIndentationFromWhitespace(str: string, indentSize: number, insertSpaces: boolean): string { + let spacesCnt = 0; + for (let i = 0; i < str.length; i++) { + if (str.charAt(i) === '\t') { + spacesCnt += indentSize; + } else { + spacesCnt++; + } + } + + let result = ''; + if (!insertSpaces) { + const tabsCnt = Math.floor(spacesCnt / indentSize); + spacesCnt = spacesCnt % indentSize; + for (let i = 0; i < tabsCnt; i++) { + result += '\t'; + } + } + + for (let i = 0; i < spacesCnt; i++) { + result += ' '; + } + + return result; +} + +export function normalizeIndentation(str: string, indentSize: number, insertSpaces: boolean): string { + let firstNonWhitespaceIndex = strings.firstNonWhitespaceIndex(str); + if (firstNonWhitespaceIndex === -1) { + firstNonWhitespaceIndex = str.length; + } + return _normalizeIndentationFromWhitespace(str.substring(0, firstNonWhitespaceIndex), indentSize, insertSpaces) + str.substring(firstNonWhitespaceIndex); +} diff --git a/src/vs/editor/common/core/range.ts b/src/vs/editor/common/core/range.ts index f58491416bd..8d189959101 100644 --- a/src/vs/editor/common/core/range.ts +++ b/src/vs/editor/common/core/range.ts @@ -351,6 +351,7 @@ export class Range { */ public static lift(range: undefined | null): null; public static lift(range: IRange): Range; + public static lift(range: IRange | undefined | null): Range | null; public static lift(range: IRange | undefined | null): Range | null { if (!range) { return null; @@ -463,4 +464,8 @@ export class Range { public static spansMultipleLines(range: IRange): boolean { return range.endLineNumber > range.startLineNumber; } + + public toJSON(): IRange { + return this; + } } diff --git a/src/vs/editor/common/model/textChange.ts b/src/vs/editor/common/core/textChange.ts similarity index 100% rename from src/vs/editor/common/model/textChange.ts rename to src/vs/editor/common/core/textChange.ts diff --git a/src/vs/editor/test/common/model/benchmark/entry.ts b/src/vs/editor/common/core/textModelDefaults.ts similarity index 60% rename from src/vs/editor/test/common/model/benchmark/entry.ts rename to src/vs/editor/common/core/textModelDefaults.ts index 77ff08decb2..302901935dc 100644 --- a/src/vs/editor/test/common/model/benchmark/entry.ts +++ b/src/vs/editor/common/core/textModelDefaults.ts @@ -3,6 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/editor/test/common/model/benchmark/modelbuilder.benchmark'; -import 'vs/editor/test/common/model/benchmark/operations.benchmark'; -import 'vs/editor/test/common/model/benchmark/searchNReplace.benchmark'; \ No newline at end of file +export const EDITOR_MODEL_DEFAULTS = { + tabSize: 4, + indentSize: 4, + insertSpaces: true, + detectIndentation: true, + trimAutoWhitespace: true, + largeFileOptimizations: true, + bracketPairColorizationOptions: { enabled: false } +}; diff --git a/src/vs/editor/common/core/token.ts b/src/vs/editor/common/core/token.ts deleted file mode 100644 index 7f580dd7743..00000000000 --- a/src/vs/editor/common/core/token.ts +++ /dev/null @@ -1,54 +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 { IState } from 'vs/editor/common/languages'; - -export class Token { - _tokenBrand: void = undefined; - - public readonly offset: number; - public readonly type: string; - public readonly language: string; - - constructor(offset: number, type: string, language: string) { - this.offset = offset; - this.type = type; - this.language = language; - } - - public toString(): string { - return '(' + this.offset + ', ' + this.type + ')'; - } -} - -export class TokenizationResult { - _tokenizationResultBrand: void = undefined; - - public readonly tokens: Token[]; - public readonly endState: IState; - - constructor(tokens: Token[], endState: IState) { - this.tokens = tokens; - this.endState = endState; - } -} - -export class EncodedTokenizationResult { - _encodedTokenizationResultBrand: void = undefined; - - /** - * The tokens in binary format. Each token occupies two array indices. For token i: - * - at offset 2*i => startIndex - * - at offset 2*i + 1 => metadata - * - */ - public readonly tokens: Uint32Array; - public readonly endState: IState; - - constructor(tokens: Uint32Array, endState: IState) { - this.tokens = tokens; - this.endState = endState; - } -} diff --git a/src/vs/editor/common/controller/wordCharacterClassifier.ts b/src/vs/editor/common/core/wordCharacterClassifier.ts similarity index 94% rename from src/vs/editor/common/controller/wordCharacterClassifier.ts rename to src/vs/editor/common/core/wordCharacterClassifier.ts index 89d1c061f22..638ff3ac26a 100644 --- a/src/vs/editor/common/controller/wordCharacterClassifier.ts +++ b/src/vs/editor/common/core/wordCharacterClassifier.ts @@ -28,7 +28,7 @@ export class WordCharacterClassifier extends CharacterClassifier(computeFn: (input: string) => R): (input: string) => R { - const cache: { [key: string]: R; } = {}; // TODO@Alex unbounded cache + const cache: { [key: string]: R } = {}; // TODO@Alex unbounded cache return (input: string): R => { if (!cache.hasOwnProperty(input)) { cache[input] = computeFn(input); diff --git a/src/vs/editor/common/model/wordHelper.ts b/src/vs/editor/common/core/wordHelper.ts similarity index 93% rename from src/vs/editor/common/model/wordHelper.ts rename to src/vs/editor/common/core/wordHelper.ts index 65116140b54..9f98fe1a524 100644 --- a/src/vs/editor/common/model/wordHelper.ts +++ b/src/vs/editor/common/core/wordHelper.ts @@ -3,10 +3,26 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IWordAtPosition } from 'vs/editor/common/model'; - export const USUAL_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\|;:\'",.<>/?'; +/** + * Word inside a model. + */ +export interface IWordAtPosition { + /** + * The word. + */ + readonly word: string; + /** + * The column where the word starts. + */ + readonly startColumn: number; + /** + * The column where the word ends. + */ + readonly endColumn: number; +} + /** * Create a word definition regular expression based on default word separators. * Optionally provide allowed separators that should be included in words. diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/cursor/cursor.ts similarity index 97% rename from src/vs/editor/common/controller/cursor.ts rename to src/vs/editor/common/cursor/cursor.ts index 2d6fc9ca21a..2b1541ea1c1 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/cursor/cursor.ts @@ -5,21 +5,22 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import * as strings from 'vs/base/common/strings'; -import { CursorCollection } from 'vs/editor/common/controller/cursorCollection'; -import { CursorConfiguration, CursorContext, CursorState, EditOperationResult, EditOperationType, IColumnSelectData, PartialCursorState, ICursorSimpleModel } from 'vs/editor/common/controller/cursorCommon'; -import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { TypeOperations, TypeWithAutoClosingCommand } from 'vs/editor/common/controller/cursorTypeOperations'; +import { CursorCollection } from 'vs/editor/common/cursor/cursorCollection'; +import { CursorConfiguration, CursorState, EditOperationResult, EditOperationType, IColumnSelectData, PartialCursorState, ICursorSimpleModel } from 'vs/editor/common/cursorCommon'; +import { CursorContext } from 'vs/editor/common/cursor/cursorContext'; +import { DeleteOperations } from 'vs/editor/common/cursor/cursorDeleteOperations'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; +import { TypeOperations, TypeWithAutoClosingCommand } from 'vs/editor/common/cursor/cursorTypeOperations'; import { Position } from 'vs/editor/common/core/position'; import { Range, IRange } from 'vs/editor/common/core/range'; import { ISelection, Selection, SelectionDirection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ITextModel, TrackedRangeStickiness, IModelDeltaDecoration, ICursorStateComputer, IIdentifiedSingleEditOperation, IValidEditOperation } from 'vs/editor/common/model'; -import { RawContentChangedType, ModelRawContentChangedEvent, ModelInjectedTextChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import { VerticalRevealType, ViewCursorStateChangedEvent, ViewRevealRangeRequestEvent } from 'vs/editor/common/view/viewEvents'; +import { RawContentChangedType, ModelRawContentChangedEvent, ModelInjectedTextChangedEvent } from 'vs/editor/common/textModelEvents'; +import { VerticalRevealType, ViewCursorStateChangedEvent, ViewRevealRangeRequestEvent } from 'vs/editor/common/viewEvents'; import { dispose, Disposable } from 'vs/base/common/lifecycle'; -import { ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel'; -import { CursorStateChangedEvent, ViewModelEventsCollector } from 'vs/editor/common/viewModel/viewModelEventDispatcher'; +import { ICoordinatesConverter } from 'vs/editor/common/viewModel'; +import { CursorStateChangedEvent, ViewModelEventsCollector } from 'vs/editor/common/viewModelEventDispatcher'; export class CursorsController extends Disposable { @@ -963,7 +964,7 @@ class CommandExecutor { }; } - private static _getLoserCursorMap(operations: IIdentifiedSingleEditOperation[]): { [index: string]: boolean; } { + private static _getLoserCursorMap(operations: IIdentifiedSingleEditOperation[]): { [index: string]: boolean } { // This is destructive on the array operations = operations.slice(0); @@ -974,7 +975,7 @@ class CommandExecutor { }); // Operations can not overlap! - const loserCursorsMap: { [index: string]: boolean; } = {}; + const loserCursorsMap: { [index: string]: boolean } = {}; for (let i = 1; i < operations.length; i++) { const previousOp = operations[i - 1]; diff --git a/src/vs/editor/common/controller/cursorAtomicMoveOperations.ts b/src/vs/editor/common/cursor/cursorAtomicMoveOperations.ts similarity index 98% rename from src/vs/editor/common/controller/cursorAtomicMoveOperations.ts rename to src/vs/editor/common/cursor/cursorAtomicMoveOperations.ts index 4b3a235278f..5cd406c3f9d 100644 --- a/src/vs/editor/common/controller/cursorAtomicMoveOperations.ts +++ b/src/vs/editor/common/cursor/cursorAtomicMoveOperations.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { CharCode } from 'vs/base/common/charCode'; -import { CursorColumns } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; export const enum Direction { Left, diff --git a/src/vs/editor/common/controller/cursorCollection.ts b/src/vs/editor/common/cursor/cursorCollection.ts similarity index 97% rename from src/vs/editor/common/controller/cursorCollection.ts rename to src/vs/editor/common/cursor/cursorCollection.ts index 935390f5859..c29f268a969 100644 --- a/src/vs/editor/common/controller/cursorCollection.ts +++ b/src/vs/editor/common/cursor/cursorCollection.ts @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { compareBy, findLastMaxBy, findMinBy } from 'vs/base/common/arrays'; -import { CursorContext, CursorState, PartialCursorState } from 'vs/editor/common/controller/cursorCommon'; -import { Cursor } from 'vs/editor/common/controller/oneCursor'; +import { CursorState, PartialCursorState } from 'vs/editor/common/cursorCommon'; +import { CursorContext } from 'vs/editor/common/cursor/cursorContext'; +import { Cursor } from 'vs/editor/common/cursor/oneCursor'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/common/controller/cursorColumnSelection.ts b/src/vs/editor/common/cursor/cursorColumnSelection.ts similarity index 98% rename from src/vs/editor/common/controller/cursorColumnSelection.ts rename to src/vs/editor/common/cursor/cursorColumnSelection.ts index cdeea9cfa6a..65602ceb1fe 100644 --- a/src/vs/editor/common/controller/cursorColumnSelection.ts +++ b/src/vs/editor/common/cursor/cursorColumnSelection.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CursorConfiguration, ICursorSimpleModel, SingleCursorState, IColumnSelectData } from 'vs/editor/common/controller/cursorCommon'; +import { CursorConfiguration, ICursorSimpleModel, SingleCursorState, IColumnSelectData } from 'vs/editor/common/cursorCommon'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/editor/common/cursor/cursorContext.ts b/src/vs/editor/common/cursor/cursorContext.ts new file mode 100644 index 00000000000..19c6877bf7c --- /dev/null +++ b/src/vs/editor/common/cursor/cursorContext.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ITextModel } from 'vs/editor/common/model'; +import { ICoordinatesConverter } from 'vs/editor/common/viewModel'; +import { CursorConfiguration, ICursorSimpleModel } from 'vs/editor/common/cursorCommon'; + +export class CursorContext { + _cursorContextBrand: void = undefined; + + public readonly model: ITextModel; + public readonly viewModel: ICursorSimpleModel; + public readonly coordinatesConverter: ICoordinatesConverter; + public readonly cursorConfig: CursorConfiguration; + + constructor(model: ITextModel, viewModel: ICursorSimpleModel, coordinatesConverter: ICoordinatesConverter, cursorConfig: CursorConfiguration) { + this.model = model; + this.viewModel = viewModel; + this.coordinatesConverter = coordinatesConverter; + this.cursorConfig = cursorConfig; + } +} diff --git a/src/vs/editor/common/controller/cursorDeleteOperations.ts b/src/vs/editor/common/cursor/cursorDeleteOperations.ts similarity index 97% rename from src/vs/editor/common/controller/cursorDeleteOperations.ts rename to src/vs/editor/common/cursor/cursorDeleteOperations.ts index 198909dfd4d..13218ea71a6 100644 --- a/src/vs/editor/common/controller/cursorDeleteOperations.ts +++ b/src/vs/editor/common/cursor/cursorDeleteOperations.ts @@ -6,8 +6,9 @@ import * as strings from 'vs/base/common/strings'; import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; import { EditorAutoClosingEditStrategy, EditorAutoClosingStrategy } from 'vs/editor/common/config/editorOptions'; -import { CursorColumns, CursorConfiguration, EditOperationResult, EditOperationType, ICursorSimpleModel, isQuote } from 'vs/editor/common/controller/cursorCommon'; -import { MoveOperations } from 'vs/editor/common/controller/cursorMoveOperations'; +import { CursorConfiguration, EditOperationResult, EditOperationType, ICursorSimpleModel, isQuote } from 'vs/editor/common/cursorCommon'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; +import { MoveOperations } from 'vs/editor/common/cursor/cursorMoveOperations'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ICommand } from 'vs/editor/common/editorCommon'; diff --git a/src/vs/editor/common/controller/cursorMoveCommands.ts b/src/vs/editor/common/cursor/cursorMoveCommands.ts similarity index 99% rename from src/vs/editor/common/controller/cursorMoveCommands.ts rename to src/vs/editor/common/cursor/cursorMoveCommands.ts index ffabb13cfab..30d11cdac89 100644 --- a/src/vs/editor/common/controller/cursorMoveCommands.ts +++ b/src/vs/editor/common/cursor/cursorMoveCommands.ts @@ -4,13 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import * as types from 'vs/base/common/types'; -import { CursorState, ICursorSimpleModel, PartialCursorState, SingleCursorState } from 'vs/editor/common/controller/cursorCommon'; -import { MoveOperations } from 'vs/editor/common/controller/cursorMoveOperations'; -import { WordOperations } from 'vs/editor/common/controller/cursorWordOperations'; +import { CursorState, ICursorSimpleModel, PartialCursorState, SingleCursorState } from 'vs/editor/common/cursorCommon'; +import { MoveOperations } from 'vs/editor/common/cursor/cursorMoveOperations'; +import { WordOperations } from 'vs/editor/common/cursor/cursorWordOperations'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; -import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; +import { IViewModel } from 'vs/editor/common/viewModel'; export class CursorMoveCommands { diff --git a/src/vs/editor/common/controller/cursorMoveOperations.ts b/src/vs/editor/common/cursor/cursorMoveOperations.ts similarity index 98% rename from src/vs/editor/common/controller/cursorMoveOperations.ts rename to src/vs/editor/common/cursor/cursorMoveOperations.ts index 1683ace38ad..3e7dc921f89 100644 --- a/src/vs/editor/common/controller/cursorMoveOperations.ts +++ b/src/vs/editor/common/cursor/cursorMoveOperations.ts @@ -3,12 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CursorColumns, CursorConfiguration, ICursorSimpleModel, SingleCursorState } from 'vs/editor/common/controller/cursorCommon'; +import { CursorConfiguration, ICursorSimpleModel, SingleCursorState } from 'vs/editor/common/cursorCommon'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import * as strings from 'vs/base/common/strings'; import { Constants } from 'vs/base/common/uint'; -import { AtomicTabMoveOperations, Direction } from 'vs/editor/common/controller/cursorAtomicMoveOperations'; +import { AtomicTabMoveOperations, Direction } from 'vs/editor/common/cursor/cursorAtomicMoveOperations'; import { PositionAffinity } from 'vs/editor/common/model'; export class CursorPosition { diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/cursor/cursorTypeOperations.ts similarity index 99% rename from src/vs/editor/common/controller/cursorTypeOperations.ts rename to src/vs/editor/common/cursor/cursorTypeOperations.ts index a1e33831dd3..62ab11ebaf9 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/cursor/cursorTypeOperations.ts @@ -9,8 +9,8 @@ import * as strings from 'vs/base/common/strings'; import { ReplaceCommand, ReplaceCommandWithOffsetCursorState, ReplaceCommandWithoutChangingPosition, ReplaceCommandThatPreservesSelection } from 'vs/editor/common/commands/replaceCommand'; import { ShiftCommand } from 'vs/editor/common/commands/shiftCommand'; import { SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; -import { CursorConfiguration, EditOperationResult, EditOperationType, ICursorSimpleModel, isQuote } from 'vs/editor/common/controller/cursorCommon'; -import { WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { CursorConfiguration, EditOperationResult, EditOperationType, ICursorSimpleModel, isQuote } from 'vs/editor/common/cursorCommon'; +import { WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/core/wordCharacterClassifier'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { Position } from 'vs/editor/common/core/position'; @@ -584,7 +584,7 @@ export class TypeOperations { // In order to avoid adding checks for `chIsAlreadyTyped` in all places, we will work // with two conceptual positions, the position before `ch` and the position after `ch` // - const positions: { lineNumber: number; beforeColumn: number; afterColumn: number; }[] = selections.map((s) => { + const positions: { lineNumber: number; beforeColumn: number; afterColumn: number }[] = selections.map((s) => { const position = s.getPosition(); if (chIsAlreadyTyped) { return { lineNumber: position.lineNumber, beforeColumn: position.column - ch.length, afterColumn: position.column }; diff --git a/src/vs/editor/common/controller/cursorWordOperations.ts b/src/vs/editor/common/cursor/cursorWordOperations.ts similarity index 98% rename from src/vs/editor/common/controller/cursorWordOperations.ts rename to src/vs/editor/common/cursor/cursorWordOperations.ts index f2a1a8b90ed..ad6804c405e 100644 --- a/src/vs/editor/common/controller/cursorWordOperations.ts +++ b/src/vs/editor/common/cursor/cursorWordOperations.ts @@ -6,13 +6,14 @@ import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; import { EditorAutoClosingEditStrategy, EditorAutoClosingStrategy } from 'vs/editor/common/config/editorOptions'; -import { CursorConfiguration, ICursorSimpleModel, SingleCursorState } from 'vs/editor/common/controller/cursorCommon'; -import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; -import { WordCharacterClass, WordCharacterClassifier, getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { CursorConfiguration, ICursorSimpleModel, SingleCursorState } from 'vs/editor/common/cursorCommon'; +import { DeleteOperations } from 'vs/editor/common/cursor/cursorDeleteOperations'; +import { WordCharacterClass, WordCharacterClassifier, getMapForWordSeparators } from 'vs/editor/common/core/wordCharacterClassifier'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { ITextModel, IWordAtPosition } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; +import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; import { AutoClosingPairs } from 'vs/editor/common/languages/languageConfiguration'; interface IFindWordResult { @@ -44,7 +45,7 @@ export const enum WordNavigationType { WordStart = 0, WordStartFast = 1, WordEnd = 2, - WordAccessibility = 3 // Respect chrome defintion of a word + WordAccessibility = 3 // Respect chrome definition of a word } export interface DeleteWordContext { diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/cursor/oneCursor.ts similarity index 97% rename from src/vs/editor/common/controller/oneCursor.ts rename to src/vs/editor/common/cursor/oneCursor.ts index 8335e7abfec..25b0fcaa30b 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/cursor/oneCursor.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CursorContext, CursorState, ICursorSimpleModel, SingleCursorState } from 'vs/editor/common/controller/cursorCommon'; +import { CursorState, ICursorSimpleModel, SingleCursorState } from 'vs/editor/common/cursorCommon'; +import { CursorContext } from 'vs/editor/common/cursor/cursorContext'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/cursorCommon.ts similarity index 92% rename from src/vs/editor/common/controller/cursorCommon.ts rename to src/vs/editor/common/cursorCommon.ts index b27ccfb0358..4ea742f6ac8 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/cursorCommon.ts @@ -4,21 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import { ConfigurationChangedEvent, EditorAutoClosingEditStrategy, EditorAutoClosingStrategy, EditorAutoIndentStrategy, EditorAutoSurroundStrategy, EditorOption } from 'vs/editor/common/config/editorOptions'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import { ICommand } from 'vs/editor/common/editorCommon'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; -import { ITextModel, PositionAffinity, TextModelResolvedOptions } from 'vs/editor/common/model'; -import { TextModel } from 'vs/editor/common/model/textModel'; +import { PositionAffinity, TextModelResolvedOptions } from 'vs/editor/common/model'; import { AutoClosingPairs } from 'vs/editor/common/languages/languageConfiguration'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { createScopedLineTokens } from 'vs/editor/common/languages/supports'; import { IElectricAction } from 'vs/editor/common/languages/supports/electricCharacter'; -import { ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel'; -import { CursorColumns } from 'vs/editor/common/controller/cursorColumns'; -export { CursorColumns } from './cursorColumns'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; +import { normalizeIndentation } from 'vs/editor/common/core/indentation'; export interface IColumnSelectData { isReal: boolean; @@ -82,10 +80,10 @@ export class CursorConfiguration { public readonly autoIndent: EditorAutoIndentStrategy; public readonly autoClosingPairs: AutoClosingPairs; public readonly surroundingPairs: CharacterMap; - public readonly shouldAutoCloseBefore: { quote: (ch: string) => boolean, bracket: (ch: string) => boolean }; + public readonly shouldAutoCloseBefore: { quote: (ch: string) => boolean; bracket: (ch: string) => boolean }; private readonly _languageId: string; - private _electricChars: { [key: string]: boolean; } | null; + private _electricChars: { [key: string]: boolean } | null; public static shouldRecreate(e: ConfigurationChangedEvent): boolean { return ( @@ -180,7 +178,7 @@ export class CursorConfiguration { } public normalizeIndentation(str: string): string { - return TextModel.normalizeIndentation(str, this.indentSize, this.insertSpaces); + return normalizeIndentation(str, this.indentSize, this.insertSpaces); } private _getShouldAutoClose(languageId: string, autoCloseConfig: EditorAutoClosingStrategy): (ch: string) => boolean { @@ -249,22 +247,6 @@ export interface ICursorSimpleModel { getLineIndentColumn(lineNumber: number): number; } -export class CursorContext { - _cursorContextBrand: void = undefined; - - public readonly model: ITextModel; - public readonly viewModel: ICursorSimpleModel; - public readonly coordinatesConverter: ICoordinatesConverter; - public readonly cursorConfig: CursorConfiguration; - - constructor(model: ITextModel, viewModel: ICursorSimpleModel, coordinatesConverter: ICoordinatesConverter, cursorConfig: CursorConfiguration) { - this.model = model; - this.viewModel = viewModel; - this.coordinatesConverter = coordinatesConverter; - this.cursorConfig = cursorConfig; - } -} - export type PartialCursorState = CursorState | PartialModelCursorState | PartialViewCursorState; export class CursorState { diff --git a/src/vs/editor/common/controller/cursorEvents.ts b/src/vs/editor/common/cursorEvents.ts similarity index 100% rename from src/vs/editor/common/controller/cursorEvents.ts rename to src/vs/editor/common/cursorEvents.ts diff --git a/src/vs/editor/common/diff/diffComputer.ts b/src/vs/editor/common/diff/diffComputer.ts index e66fcbba6f6..33093dd46e6 100644 --- a/src/vs/editor/common/diff/diffComputer.ts +++ b/src/vs/editor/common/diff/diffComputer.ts @@ -5,10 +5,42 @@ import { IDiffChange, ISequence, LcsDiff, IDiffResult } from 'vs/base/common/diff/diff'; import * as strings from 'vs/base/common/strings'; -import { ICharChange, ILineChange } from 'vs/editor/common/editorCommon'; const MINIMUM_MATCHING_CHARACTER_LENGTH = 3; +export interface IDiffComputationResult { + quitEarly: boolean; + identical: boolean; + changes: ILineChange[]; +} + +/** + * A change + */ +export interface IChange { + readonly originalStartLineNumber: number; + readonly originalEndLineNumber: number; + readonly modifiedStartLineNumber: number; + readonly modifiedEndLineNumber: number; +} + +/** + * A character level change. + */ +export interface ICharChange extends IChange { + readonly originalStartColumn: number; + readonly originalEndColumn: number; + readonly modifiedStartColumn: number; + readonly modifiedEndColumn: number; +} + +/** + * A line change + */ +export interface ILineChange extends IChange { + readonly charChanges: ICharChange[] | undefined; +} + export interface IDiffComputerResult { quitEarly: boolean; changes: ILineChange[]; diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index ff079034d5a..502ad529340 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -13,6 +13,7 @@ import { IRange, Range } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import { IModelDecorationsChangeAccessor, ITextModel, OverviewRulerLane, TrackedRangeStickiness, IValidEditOperation } from 'vs/editor/common/model'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; +import { IDimension } from 'vs/editor/common/core/dimension'; /** * A builder and helper for edit operations for a command. @@ -116,36 +117,6 @@ export interface IModelChangedEvent { readonly newModelUrl: URI | null; } -export interface IDimension { - width: number; - height: number; -} - -/** - * A change - */ -export interface IChange { - readonly originalStartLineNumber: number; - readonly originalEndLineNumber: number; - readonly modifiedStartLineNumber: number; - readonly modifiedEndLineNumber: number; -} -/** - * A character level change. - */ -export interface ICharChange extends IChange { - readonly originalStartColumn: number; - readonly originalEndColumn: number; - readonly modifiedStartColumn: number; - readonly modifiedEndColumn: number; -} -/** - * A line change - */ -export interface ILineChange extends IChange { - readonly charChanges: ICharChange[] | undefined; -} - // --- view export interface IScrollEvent { @@ -323,8 +294,9 @@ export interface IEditor { /** * Set the primary position of the cursor. This will remove any secondary cursors. * @param position New primary cursor's position + * @param source Source of the call that caused the position */ - setPosition(position: IPosition): void; + setPosition(position: IPosition, source?: string): void; /** * Scroll vertically as necessary and reveal a line. @@ -381,29 +353,35 @@ export interface IEditor { /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection + * @param source Source of the call that caused the selection */ - setSelection(selection: IRange): void; + setSelection(selection: IRange, source?: string): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection + * @param source Source of the call that caused the selection */ - setSelection(selection: Range): void; + setSelection(selection: Range, source?: string): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection + * @param source Source of the call that caused the selection */ - setSelection(selection: ISelection): void; + setSelection(selection: ISelection, source?: string): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection + * @param source Source of the call that caused the selection */ - setSelection(selection: Selection): void; + setSelection(selection: Selection, source?: string): void; /** * Set the selections for all the cursors of the editor. * Cursors will be removed or added, as necessary. + * @param selections The new selection + * @param source Source of the call that caused the selection */ - setSelections(selections: readonly ISelection[]): void; + setSelections(selections: readonly ISelection[], source?: string): void; /** * Scroll vertically as necessary and reveal lines. diff --git a/src/vs/editor/common/editorTheme.ts b/src/vs/editor/common/editorTheme.ts new file mode 100644 index 00000000000..6b5944133bb --- /dev/null +++ b/src/vs/editor/common/editorTheme.ts @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IColorTheme } from 'vs/platform/theme/common/themeService'; +import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; +import { Color } from 'vs/base/common/color'; +import { ColorScheme } from 'vs/platform/theme/common/theme'; + +export class EditorTheme { + + private _theme: IColorTheme; + + public get type(): ColorScheme { + return this._theme.type; + } + + public get value(): IColorTheme { + return this._theme; + } + + constructor(theme: IColorTheme) { + this._theme = theme; + } + + public update(theme: IColorTheme): void { + this._theme = theme; + } + + public getColor(color: ColorIdentifier): Color | undefined { + return this._theme.getColor(color); + } +} diff --git a/src/vs/editor/common/languages/languageFeatureRegistry.ts b/src/vs/editor/common/languageFeatureRegistry.ts similarity index 94% rename from src/vs/editor/common/languages/languageFeatureRegistry.ts rename to src/vs/editor/common/languageFeatureRegistry.ts index 9fb906b3520..ddef76d0efa 100644 --- a/src/vs/editor/common/languages/languageFeatureRegistry.ts +++ b/src/vs/editor/common/languageFeatureRegistry.ts @@ -5,9 +5,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { ITextModel } from 'vs/editor/common/model'; -import { LanguageFilter, LanguageSelector, score } from 'vs/editor/common/languages/languageSelector'; -import { shouldSynchronizeModel } from 'vs/editor/common/services/model'; +import { ITextModel, shouldSynchronizeModel } from 'vs/editor/common/model'; +import { LanguageFilter, LanguageSelector, score } from 'vs/editor/common/languageSelector'; interface Entry { selector: LanguageSelector; @@ -123,7 +122,7 @@ export class LanguageFeatureRegistry { } } - private _lastCandidate: { uri: string; language: string; } | undefined; + private _lastCandidate: { uri: string; language: string } | undefined; private _updateScores(model: ITextModel): void { diff --git a/src/vs/editor/common/languages/languageSelector.ts b/src/vs/editor/common/languageSelector.ts similarity index 98% rename from src/vs/editor/common/languages/languageSelector.ts rename to src/vs/editor/common/languageSelector.ts index 02826877fdc..0441b2dc59e 100644 --- a/src/vs/editor/common/languages/languageSelector.ts +++ b/src/vs/editor/common/languageSelector.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IRelativePattern, match as matchGlobPattern } from 'vs/base/common/glob'; -import { URI } from 'vs/base/common/uri'; // TODO@Alex +import { URI } from 'vs/base/common/uri'; import { normalize } from 'vs/base/common/path'; export interface LanguageFilter { diff --git a/src/vs/editor/common/languages.ts b/src/vs/editor/common/languages.ts index 52c84e3e2e7..cbe50cb822f 100644 --- a/src/vs/editor/common/languages.ts +++ b/src/vs/editor/common/languages.ts @@ -12,14 +12,13 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { TokenizationResult, EncodedTokenizationResult } from 'vs/editor/common/core/token'; import * as model from 'vs/editor/common/model'; -import { LanguageFeatureRegistry } from 'vs/editor/common/languages/languageFeatureRegistry'; -import { TokenizationRegistry as TokenizationRegistryImpl } from 'vs/editor/common/languages/tokenizationRegistry'; +import { TokenizationRegistry as TokenizationRegistryImpl } from 'vs/editor/common/tokenizationRegistry'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IMarkerData } from 'vs/platform/markers/common/markers'; import { Codicon, CSSIcon } from 'vs/base/common/codicons'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; /** * Open ended enum at runtime @@ -218,6 +217,60 @@ export interface ILanguageIdCodec { decodeLanguageId(languageId: LanguageId): string; } +export class Token { + _tokenBrand: void = undefined; + + public readonly offset: number; + public readonly type: string; + public readonly language: string; + + constructor(offset: number, type: string, language: string) { + this.offset = offset; + this.type = type; + this.language = language; + } + + public toString(): string { + return '(' + this.offset + ', ' + this.type + ')'; + } +} + +/** + * @internal + */ +export class TokenizationResult { + _tokenizationResultBrand: void = undefined; + + public readonly tokens: Token[]; + public readonly endState: IState; + + constructor(tokens: Token[], endState: IState) { + this.tokens = tokens; + this.endState = endState; + } +} + +/** + * @internal + */ +export class EncodedTokenizationResult { + _encodedTokenizationResultBrand: void = undefined; + + /** + * The tokens in binary format. Each token occupies two array indices. For token i: + * - at offset 2*i => startIndex + * - at offset 2*i + 1 => metadata + * + */ + public readonly tokens: Uint32Array; + public readonly endState: IState; + + constructor(tokens: Uint32Array, endState: IState) { + this.tokens = tokens; + this.endState = endState; + } +} + /** * @internal */ @@ -311,7 +364,7 @@ export interface EvaluatableExpressionProvider { } /** - * A value-object that contains contextual information when requesting inline values from a InlineValuesProvider. + * A value-object that contains contextual information when requesting inline values from a InlineValuesProvider. * @internal */ export interface InlineValueContext { @@ -615,7 +668,7 @@ export interface CompletionItem { * selecting this completion. Edits must not overlap with the main edit * nor with themselves. */ - additionalTextEdits?: model.ISingleEditOperation[]; + additionalTextEdits?: ISingleEditOperation[]; /** * A command that should be run upon acceptance of this item. */ @@ -743,6 +796,12 @@ export interface InlineCompletion { readonly range?: IRange; readonly command?: Command; + + /** + * If set to `true`, unopened closing brackets are removed and unclosed opening brackets are closed. + * Defaults to `false`. + */ + readonly completeBracketPairs?: boolean; } export interface InlineCompletions { @@ -800,7 +859,7 @@ export interface CodeActionList extends IDisposable { */ export interface CodeActionProvider { - displayName?: string + displayName?: string; /** * Provide commands for the given document and range. @@ -817,7 +876,7 @@ export interface CodeActionProvider { */ readonly providedCodeActionKinds?: ReadonlyArray; - readonly documentation?: ReadonlyArray<{ readonly kind: string, readonly command: Command }>; + readonly documentation?: ReadonlyArray<{ readonly kind: string; readonly command: Command }>; /** * @internal @@ -1216,7 +1275,7 @@ export interface DocumentSymbolProvider { provideDocumentSymbols(model: model.ITextModel, token: CancellationToken): ProviderResult; } -export type TextEdit = { range: IRange; text: string; eol?: model.EndOfLineSequence; }; +export type TextEdit = { range: IRange; text: string; eol?: model.EndOfLineSequence }; /** * Interface used to format a model @@ -1482,7 +1541,7 @@ export interface WorkspaceEditMetadata { /** * @internal */ - iconPath?: ThemeIcon | URI | { light: URI, dark: URI }; + iconPath?: ThemeIcon | URI | { light: URI; dark: URI }; } export interface WorkspaceFileEditOptions { @@ -1527,37 +1586,6 @@ export interface RenameProvider { resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): ProviderResult; } -/** - * @internal - */ -export interface AuthenticationSession { - id: string; - accessToken: string; - account: { - label: string; - id: string; - } - scopes: ReadonlyArray; - idToken?: string; -} - -/** - * @internal - */ -export interface AuthenticationSessionsChangeEvent { - added: ReadonlyArray; - removed: ReadonlyArray; - changed: ReadonlyArray; -} - -/** - * @internal - */ -export interface AuthenticationProviderInformation { - id: string; - label: string; -} - export interface Command { id: string; title: string; @@ -1709,14 +1737,14 @@ export enum CommentMode { */ export interface Comment { readonly uniqueIdInThread: number; - readonly body: IMarkdownString; + readonly body: string | IMarkdownString; readonly userName: string; readonly userIconPath?: string; readonly contextValue?: string; readonly commentReactions?: CommentReaction[]; readonly label?: string; readonly mode?: CommentMode; - readonly detail?: Date | string; + readonly timestamp?: string; } /** @@ -1758,24 +1786,26 @@ export interface CodeLensProvider { export enum InlayHintKind { - Other = 0, Type = 1, Parameter = 2, } export interface InlayHintLabelPart { label: string; - collapsible?: boolean; - action?: Command | Location + tooltip?: string | IMarkdownString; + // collapsible?: boolean; + command?: Command; + location?: Location; } export interface InlayHint { label: string | InlayHintLabelPart[]; - tooltip?: string | IMarkdownString + tooltip?: string | IMarkdownString; + command?: Command; position: IPosition; - kind: InlayHintKind; - whitespaceBefore?: boolean; - whitespaceAfter?: boolean; + kind?: InlayHintKind; + paddingLeft?: boolean; + paddingRight?: boolean; } export interface InlayHintList { @@ -1784,6 +1814,7 @@ export interface InlayHintList { } export interface InlayHintsProvider { + displayName?: string; onDidChangeInlayHints?: Event; provideInlayHints(model: model.ITextModel, range: Range, token: CancellationToken): ProviderResult; resolveInlayHint?(hint: InlayHint, token: CancellationToken): ProviderResult; @@ -1822,143 +1853,6 @@ export interface DocumentRangeSemanticTokensProvider { provideDocumentRangeSemanticTokens(model: model.ITextModel, range: Range, token: CancellationToken): ProviderResult; } -// --- feature registries ------ - -/** - * @internal - */ -export const ReferenceProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const RenameProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const CompletionProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const InlineCompletionsProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const SignatureHelpProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const HoverProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const EvaluatableExpressionProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const InlineValuesProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const DocumentSymbolProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const DocumentHighlightProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const LinkedEditingRangeProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const DefinitionProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const DeclarationProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const ImplementationProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const TypeDefinitionProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const CodeLensProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const InlayHintsProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const CodeActionProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const DocumentFormattingEditProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const DocumentRangeFormattingEditProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const OnTypeFormattingEditProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const LinkProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const ColorProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const SelectionRangeRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const FoldingRangeProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const DocumentSemanticTokensProviderRegistry = new LanguageFeatureRegistry(); - -/** - * @internal - */ -export const DocumentRangeSemanticTokensProviderRegistry = new LanguageFeatureRegistry(); - /** * @internal */ diff --git a/src/vs/editor/common/services/language.ts b/src/vs/editor/common/languages/language.ts similarity index 100% rename from src/vs/editor/common/services/language.ts rename to src/vs/editor/common/languages/language.ts diff --git a/src/vs/editor/common/languages/languageConfigurationRegistry.ts b/src/vs/editor/common/languages/languageConfigurationRegistry.ts index ba1ea3d1367..f8ec59e1c9d 100644 --- a/src/vs/editor/common/languages/languageConfigurationRegistry.ts +++ b/src/vs/editor/common/languages/languageConfigurationRegistry.ts @@ -6,10 +6,10 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import * as strings from 'vs/base/common/strings'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import { DEFAULT_WORD_REGEXP, ensureValidWordDefinition } from 'vs/editor/common/model/wordHelper'; +import { DEFAULT_WORD_REGEXP, ensureValidWordDefinition } from 'vs/editor/common/core/wordHelper'; import { EnterAction, FoldingRules, IAutoClosingPair, IndentAction, IndentationRule, LanguageConfiguration, CompleteEnterAction, AutoClosingPairs, CharacterPair, ExplicitLanguageConfiguration } from 'vs/editor/common/languages/languageConfiguration'; import { createScopedLineTokens, ScopedLineTokens } from 'vs/editor/common/languages/supports'; import { CharacterPairSupport } from 'vs/editor/common/languages/supports/characterPair'; @@ -20,7 +20,7 @@ import { RichEditBrackets } from 'vs/editor/common/languages/supports/richEditBr import { EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; /** @@ -263,7 +263,7 @@ export class LanguageConfigurationRegistryImpl { * * This function only return the inherited indent based on above lines, it doesn't check whether current line should decrease or not. */ - public getInheritIndentForLine(autoIndent: EditorAutoIndentStrategy, model: IVirtualModel, lineNumber: number, honorIntentialIndent: boolean = true): { indentation: string; action: IndentAction | null; line?: number; } | null { + public getInheritIndentForLine(autoIndent: EditorAutoIndentStrategy, model: IVirtualModel, lineNumber: number, honorIntentialIndent: boolean = true): { indentation: string; action: IndentAction | null; line?: number } | null { if (autoIndent < EditorAutoIndentStrategy.Full) { return null; } @@ -455,7 +455,7 @@ export class LanguageConfigurationRegistryImpl { return null; } - public getIndentForEnter(autoIndent: EditorAutoIndentStrategy, model: ITextModel, range: Range, indentConverter: IIndentConverter): { beforeEnter: string, afterEnter: string } | null { + public getIndentForEnter(autoIndent: EditorAutoIndentStrategy, model: ITextModel, range: Range, indentConverter: IIndentConverter): { beforeEnter: string; afterEnter: string } | null { if (autoIndent < EditorAutoIndentStrategy.Full) { return null; } diff --git a/src/vs/editor/common/languages/modesRegistry.ts b/src/vs/editor/common/languages/modesRegistry.ts index 380574fcc0b..4af8ae52311 100644 --- a/src/vs/editor/common/languages/modesRegistry.ts +++ b/src/vs/editor/common/languages/modesRegistry.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { ILanguageExtensionPoint } from 'vs/editor/common/services/language'; +import { ILanguageExtensionPoint } from 'vs/editor/common/languages/language'; import { Registry } from 'vs/platform/registry/common/platform'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; diff --git a/src/vs/editor/common/languages/nullMode.ts b/src/vs/editor/common/languages/nullTokenize.ts similarity index 85% rename from src/vs/editor/common/languages/nullMode.ts rename to src/vs/editor/common/languages/nullTokenize.ts index c38f3621be1..ce7b605783d 100644 --- a/src/vs/editor/common/languages/nullMode.ts +++ b/src/vs/editor/common/languages/nullTokenize.ts @@ -3,8 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Token, TokenizationResult, EncodedTokenizationResult } from 'vs/editor/common/core/token'; -import { ColorId, FontStyle, IState, LanguageId, MetadataConsts, StandardTokenType } from 'vs/editor/common/languages'; +import { Token, TokenizationResult, EncodedTokenizationResult, ColorId, FontStyle, IState, LanguageId, MetadataConsts, StandardTokenType } from 'vs/editor/common/languages'; export const NullState: IState = new class implements IState { public clone(): IState { diff --git a/src/vs/editor/common/languages/supports.ts b/src/vs/editor/common/languages/supports.ts index 7d2d34e6d3b..bef3fc120a9 100644 --- a/src/vs/editor/common/languages/supports.ts +++ b/src/vs/editor/common/languages/supports.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { StandardTokenType } from 'vs/editor/common/languages'; export function createScopedLineTokens(context: LineTokens, offset: number): ScopedLineTokens { diff --git a/src/vs/editor/common/languages/supports/richEditBrackets.ts b/src/vs/editor/common/languages/supports/richEditBrackets.ts index 6de21afb7ec..8a426af8e9e 100644 --- a/src/vs/editor/common/languages/supports/richEditBrackets.ts +++ b/src/vs/editor/common/languages/supports/richEditBrackets.ts @@ -208,11 +208,11 @@ export class RichEditBrackets { /** * A map useful for decoding a regex match and finding which bracket group was matched. */ - public readonly textIsBracket: { [text: string]: RichEditBracket; }; + public readonly textIsBracket: { [text: string]: RichEditBracket }; /** * A set useful for decoding if a regex match is the open bracket of a bracket pair. */ - public readonly textIsOpenBracket: { [text: string]: boolean; }; + public readonly textIsOpenBracket: { [text: string]: boolean }; constructor(languageId: string, _brackets: readonly CharacterPair[]) { const brackets = groupFuzzyBrackets(_brackets); diff --git a/src/vs/editor/common/languages/textToHtmlTokenizer.ts b/src/vs/editor/common/languages/textToHtmlTokenizer.ts index e099535fa2c..64bf71febb1 100644 --- a/src/vs/editor/common/languages/textToHtmlTokenizer.ts +++ b/src/vs/editor/common/languages/textToHtmlTokenizer.ts @@ -5,10 +5,10 @@ import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; -import { IViewLineTokens, LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { IViewLineTokens, LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { ILanguageIdCodec, IState, ITokenizationSupport, LanguageId, TokenizationRegistry } from 'vs/editor/common/languages'; -import { NullState, nullTokenizeEncoded } from 'vs/editor/common/languages/nullMode'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { NullState, nullTokenizeEncoded } from 'vs/editor/common/languages/nullTokenize'; +import { ILanguageService } from 'vs/editor/common/languages/language'; export type IReducedTokenizationSupport = Omit; diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 56f0e1d7614..1038c5bbd95 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -7,20 +7,22 @@ import { Event } from 'vs/base/common/event'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IModelContentChange, IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, ModelInjectedTextChangedEvent, ModelRawContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import { SearchData } from 'vs/editor/common/model/textModelSearch'; +import { IModelContentChange, IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, ModelInjectedTextChangedEvent, ModelRawContentChangedEvent } from 'vs/editor/common/textModelEvents'; +import { WordCharacterClassifier } from 'vs/editor/common/core/wordCharacterClassifier'; import { FormattingOptions, StandardTokenType } from 'vs/editor/common/languages'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; -import { ContiguousMultilineTokens } from 'vs/editor/common/model/tokens/contiguousMultilineTokens'; -import { SparseMultilineTokens } from 'vs/editor/common/model/tokens/sparseMultilineTokens'; -import { TextChange } from 'vs/editor/common/model/textChange'; +import { ContiguousMultilineTokens } from 'vs/editor/common/tokens/contiguousMultilineTokens'; +import { SparseMultilineTokens } from 'vs/editor/common/tokens/sparseMultilineTokens'; +import { TextChange } from 'vs/editor/common/core/textChange'; import { equals } from 'vs/base/common/objects'; -import { IBracketPairsTextModelPart } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; -import { IGuidesTextModelPart } from 'vs/editor/common/model/guidesTextModelPart'; +import { IBracketPairsTextModelPart } from 'vs/editor/common/textModelBracketPairs'; +import { IGuidesTextModelPart } from 'vs/editor/common/textModelGuides'; +import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; /** * Vertical Lane in the overview ruler of the editor. @@ -300,24 +302,6 @@ export interface IModelDecorationsChangeAccessor { deltaDecorations(oldDecorations: string[], newDecorations: IModelDeltaDecoration[]): string[]; } -/** - * Word inside a model. - */ -export interface IWordAtPosition { - /** - * The word. - */ - readonly word: string; - /** - * The column where the word starts. - */ - readonly startColumn: number; - /** - * The column where the word ends. - */ - readonly endColumn: number; -} - /** * End of line character preference. */ @@ -379,48 +363,15 @@ export interface ISingleEditOperationIdentifier { minor: number; } -/** - * A single edit operation, that acts as a simple replace. - * i.e. Replace text at `range` with `text` in model. - */ -export interface ISingleEditOperation { - /** - * The range to replace. This can be empty to emulate a simple insert. - */ - range: IRange; - /** - * The text to replace with. This can be null to emulate a simple delete. - */ - text: string | null; - /** - * This indicates that this operation has "insert" semantics. - * i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved. - */ - forceMoveMarkers?: boolean; -} - /** * A single edit operation, that has an identifier. */ -export interface IIdentifiedSingleEditOperation { +export interface IIdentifiedSingleEditOperation extends ISingleEditOperation { /** * An identifier associated with this single edit operation. * @internal */ identifier?: ISingleEditOperationIdentifier | null; - /** - * The range to replace. This can be empty to emulate a simple insert. - */ - range: IRange; - /** - * The text to replace with. This can be null to emulate a simple delete. - */ - text: string | null; - /** - * This indicates that this operation has "insert" semantics. - * i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved. - */ - forceMoveMarkers?: boolean; /** * This indicates that this operation is inserting automatic whitespace * that can be removed on next model edit operation if `config.trimAutoWhitespace` is true. @@ -975,6 +926,11 @@ export interface ITextModel { */ getTokenTypeIfInsertingCharacter(lineNumber: number, column: number, character: string): StandardTokenType; + /** + * @internal + */ + tokenizeLineWithEdit(position: IPosition, length: number, newText: string): LineTokens | null; + /** * Get the word under or besides `position`. * @param position The position to look for a word. @@ -1305,9 +1261,6 @@ export interface ITextModel { readonly guides: IGuidesTextModelPart; } -/** - * @internal - */ export const enum PositionAffinity { /** * Prefers the left most position. @@ -1337,7 +1290,7 @@ export interface ITextBufferBuilder { * @internal */ export interface ITextBufferFactory { - create(defaultEOL: DefaultEndOfLine): { textBuffer: ITextBuffer; disposable: IDisposable; }; + create(defaultEOL: DefaultEndOfLine): { textBuffer: ITextBuffer; disposable: IDisposable }; getFirstLineText(lengthLimit: number): string; } @@ -1395,6 +1348,31 @@ export interface IReadonlyTextBuffer { findMatchesLineByLine(searchRange: Range, searchData: SearchData, captureMatches: boolean, limitResultCount: number): FindMatch[]; } +/** + * @internal + */ +export class SearchData { + + /** + * The regex to search for. Always defined. + */ + public readonly regex: RegExp; + /** + * The word separator classifier. + */ + public readonly wordSeparators: WordCharacterClassifier | null; + /** + * The simple string to search for (if possible). + */ + public readonly simpleSearch: string | null; + + constructor(regex: RegExp, wordSeparators: WordCharacterClassifier | null, simpleSearch: string | null) { + this.regex = regex; + this.wordSeparators = wordSeparators; + this.simpleSearch = simpleSearch; + } +} + /** * @internal */ @@ -1423,3 +1401,12 @@ export interface IInternalModelContentChange extends IModelContentChange { range: Range; forceMoveMarkers: boolean; } + +/** + * @internal + */ +export function shouldSynchronizeModel(model: ITextModel): boolean { + return ( + !model.isTooLargeForSyncing() && !model.isForSimpleWidget + ); +} diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.ts b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.ts index a7549ef84bd..f006301d817 100644 --- a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.ts +++ b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl.ts @@ -5,13 +5,13 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable, DisposableStore, IDisposable, IReference, MutableDisposable } from 'vs/base/common/lifecycle'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { BracketPairsTree } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree'; -import { BracketInfo, BracketPairInfo, BracketPairWithMinIndentationInfo, IBracketPairsTextModelPart, IFoundBracket } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; +import { BracketInfo, BracketPairInfo, BracketPairWithMinIndentationInfo, IBracketPairsTextModelPart, IFoundBracket } from 'vs/editor/common/textModelBracketPairs'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { ignoreBracketsInToken } from 'vs/editor/common/languages/supports'; import { RichEditBrackets, BracketsUtils, RichEditBracket } from 'vs/editor/common/languages/supports/richEditBrackets'; diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast.ts b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast.ts index 5720bfedcf6..8e684e1e78a 100644 --- a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast.ts +++ b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CursorColumns } from 'vs/editor/common/controller/cursorColumns'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; import { ITextModel } from 'vs/editor/common/model'; -import { Length, lengthAdd, lengthGetLineCount, lengthHash, lengthToObj, lengthZero } from './length'; +import { Length, lengthAdd, lengthGetLineCount, lengthToObj, lengthZero } from './length'; import { SmallImmutableSet } from './smallImmutableSet'; import { OpeningBracketId } from './tokenizer'; @@ -624,17 +624,12 @@ export class TextAstNode extends ImmutableLeafAstNode { } export class BracketAstNode extends ImmutableLeafAstNode { - private static cacheByLength = new Map(); - - public static create(length: Length): BracketAstNode { - const lengthKey = lengthHash(length); - const cached = BracketAstNode.cacheByLength.get(lengthKey); - if (cached) { - return cached; - } - - const node = new BracketAstNode(length); - BracketAstNode.cacheByLength.set(lengthKey, node); + public static create( + length: Length, + languageId: string, + bracketIds: SmallImmutableSet + ): BracketAstNode { + const node = new BracketAstNode(length, languageId, bracketIds); return node; } @@ -646,7 +641,15 @@ export class BracketAstNode extends ImmutableLeafAstNode { return SmallImmutableSet.getEmpty(); } - private constructor(length: Length) { + private constructor( + length: Length, + public readonly languageId: string, + /** + * In case of a opening bracket, this is the id of the opening bracket. + * In case of a closing bracket, this contains the ids of all opening brackets it can close. + */ + public readonly bracketIds: SmallImmutableSet + ) { super(length); } diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree.ts b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree.ts index 25c5bcd02a0..4c10cafd5e3 100644 --- a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree.ts +++ b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree.ts @@ -7,9 +7,9 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import { BracketInfo, BracketPairWithMinIndentationInfo } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; +import { BracketInfo, BracketPairWithMinIndentationInfo } from 'vs/editor/common/textModelBracketPairs'; import { BackgroundTokenizationState, TextModel } from 'vs/editor/common/model/textModel'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { ResolvedLanguageConfiguration } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { AstNode, AstNodeKind } from './ast'; import { TextEditInfo } from './beforeEditPositionMapper'; @@ -143,13 +143,7 @@ export class BracketPairsTree extends Disposable { } function collectBrackets(node: AstNode, nodeOffsetStart: Length, nodeOffsetEnd: Length, startOffset: Length, endOffset: Length, result: BracketInfo[], level: number = 0): void { - if (node.kind === AstNodeKind.Bracket) { - const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); - result.push(new BracketInfo(range, level - 1, false)); - } else if (node.kind === AstNodeKind.UnexpectedClosingBracket) { - const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); - result.push(new BracketInfo(range, level - 1, true)); - } else if (node.kind === AstNodeKind.List) { + if (node.kind === AstNodeKind.List) { for (const child of node.children) { nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length); if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) { @@ -165,7 +159,8 @@ function collectBrackets(node: AstNode, nodeOffsetStart: Length, nodeOffsetEnd: const child = node.openingBracket; nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length); if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) { - collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, result, level); + const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); + result.push(new BracketInfo(range, level - 1, !node.closingBracket)); } nodeOffsetStart = nodeOffsetEnd; } @@ -182,10 +177,17 @@ function collectBrackets(node: AstNode, nodeOffsetStart: Length, nodeOffsetEnd: const child = node.closingBracket; nodeOffsetEnd = lengthAdd(nodeOffsetStart, child.length); if (lengthLessThanEqual(nodeOffsetStart, endOffset) && lengthGreaterThanEqual(nodeOffsetEnd, startOffset)) { - collectBrackets(child, nodeOffsetStart, nodeOffsetEnd, startOffset, endOffset, result, level); + const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); + result.push(new BracketInfo(range, level - 1, false)); } nodeOffsetStart = nodeOffsetEnd; } + } else if (node.kind === AstNodeKind.UnexpectedClosingBracket) { + const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); + result.push(new BracketInfo(range, level - 1, true)); + } else if (node.kind === AstNodeKind.Bracket) { + const range = lengthsToRange(nodeOffsetStart, nodeOffsetEnd); + result.push(new BracketInfo(range, level - 1, false)); } } diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets.ts b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets.ts index c650d6f7264..bfc3e727224 100644 --- a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets.ts +++ b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets.ts @@ -17,7 +17,7 @@ export class BracketTokens { const brackets = configuration.characterPair.getColorizedBrackets(); - const closingBrackets = new Map, first: OpeningBracketId }>(); + const closingBrackets = new Map; first: OpeningBracketId }>(); const openingBrackets = new Set(); for (const [openingText, closingText] of brackets) { @@ -41,19 +41,20 @@ export class BracketTokens { TokenKind.ClosingBracket, info.first, info.openingBrackets, - BracketAstNode.create(length) + BracketAstNode.create(length, configuration.languageId, info.openingBrackets) )); } for (const openingText of openingBrackets) { const length = toLength(0, openingText.length); const openingTextId = getId(configuration.languageId, openingText); + const bracketIds = SmallImmutableSet.getEmpty().add(openingTextId, identityKeyProvider); map.set(openingText, new Token( length, TokenKind.OpeningBracket, openingTextId, - SmallImmutableSet.getEmpty().add(openingTextId, identityKeyProvider), - BracketAstNode.create(length) + bracketIds, + BracketAstNode.create(length, configuration.languageId, bracketIds) )); } @@ -94,6 +95,15 @@ export class BracketTokens { return this.map.get(value); } + findClosingTokenText(openingBracketIds: SmallImmutableSet): string | undefined { + for (const [closingText, info] of this.map) { + if (info.bracketIds.intersects(openingBracketIds)) { + return closingText; + } + } + return undefined; + } + get isEmpty(): boolean { return this.map.size === 0; } diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer.ts b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer.ts index f9641ff1302..0c572140a2d 100644 --- a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer.ts +++ b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer.ts @@ -4,13 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { NotSupportedError } from 'vs/base/common/errors'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; -import { ITextModel } from 'vs/editor/common/model'; -import { SmallImmutableSet } from './smallImmutableSet'; import { StandardTokenType, TokenMetadata } from 'vs/editor/common/languages'; +import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; import { BracketAstNode, TextAstNode } from './ast'; import { BracketTokens, LanguageAgnosticBracketTokens } from './brackets'; -import { lengthGetColumnCountIfZeroLineCount, Length, lengthAdd, lengthDiff, lengthToObj, lengthZero, toLength } from './length'; +import { Length, lengthAdd, lengthDiff, lengthGetColumnCountIfZeroLineCount, lengthToObj, lengthZero, toLength } from './length'; +import { SmallImmutableSet } from './smallImmutableSet'; export interface Tokenizer { readonly offset: Length; @@ -51,6 +50,13 @@ export class Token { ) { } } +export interface ITokenizerSource { + getValue(): string; + getLineCount(): number; + getLineLength(lineNumber: number): number; + getLineTokens(lineNumber: number): IViewLineTokens; +} + export class TextBufferTokenizer implements Tokenizer { private readonly textBufferLineCount: number; private readonly textBufferLastLineLength: number; @@ -58,7 +64,7 @@ export class TextBufferTokenizer implements Tokenizer { private readonly reader = new NonPeekableTextBufferTokenizer(this.textModel, this.bracketTokens); constructor( - private readonly textModel: ITextModel, + private readonly textModel: ITokenizerSource, private readonly bracketTokens: LanguageAgnosticBracketTokens ) { this.textBufferLineCount = textModel.getLineCount(); @@ -119,7 +125,7 @@ class NonPeekableTextBufferTokenizer { private readonly textBufferLineCount: number; private readonly textBufferLastLineLength: number; - constructor(private readonly textModel: ITextModel, private readonly bracketTokens: LanguageAgnosticBracketTokens) { + constructor(private readonly textModel: ITokenizerSource, private readonly bracketTokens: LanguageAgnosticBracketTokens) { this.textBufferLineCount = textModel.getLineCount(); this.textBufferLastLineLength = textModel.getLineLength(this.textBufferLineCount); } @@ -127,7 +133,7 @@ class NonPeekableTextBufferTokenizer { private lineIdx = 0; private line: string | null = null; private lineCharOffset = 0; - private lineTokens: LineTokens | null = null; + private lineTokens: IViewLineTokens | null = null; private lineTokenOffset = 0; public setPosition(lineIdx: number, column: number): void { diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider.ts b/src/vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider.ts index 59757e75ba2..76d5e899dfa 100644 --- a/src/vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider.ts +++ b/src/vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider.ts @@ -8,12 +8,12 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { Range } from 'vs/editor/common/core/range'; import { BracketPairColorizationOptions, IModelDecoration } from 'vs/editor/common/model'; -import { BracketInfo } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; +import { BracketInfo } from 'vs/editor/common/textModelBracketPairs'; import { DecorationProvider } from 'vs/editor/common/model/decorationProvider'; import { TextModel } from 'vs/editor/common/model/textModel'; import { editorBracketHighlightingForeground1, editorBracketHighlightingForeground2, editorBracketHighlightingForeground3, editorBracketHighlightingForeground4, editorBracketHighlightingForeground5, editorBracketHighlightingForeground6, editorBracketHighlightingUnexpectedBracketForeground -} from 'vs/editor/common/view/editorColorRegistry'; +} from 'vs/editor/common/core/editorColorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; export class ColorizedBracketPairsDecorationProvider extends Disposable implements DecorationProvider { diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/fixBrackets.ts b/src/vs/editor/common/model/bracketPairsTextModelPart/fixBrackets.ts new file mode 100644 index 00000000000..866cd711a70 --- /dev/null +++ b/src/vs/editor/common/model/bracketPairsTextModelPart/fixBrackets.ts @@ -0,0 +1,82 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { AstNode, AstNodeKind } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast'; +import { LanguageAgnosticBracketTokens } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets'; +import { Length, lengthAdd, lengthGetColumnCountIfZeroLineCount, lengthZero } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length'; +import { parseDocument } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/parser'; +import { DenseKeyProvider } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet'; +import { ITokenizerSource, TextBufferTokenizer } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer'; +import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; + +export function fixBracketsInLine(tokens: IViewLineTokens, languageConfigurationService: ILanguageConfigurationService): string { + const denseKeyProvider = new DenseKeyProvider(); + const bracketTokens = new LanguageAgnosticBracketTokens(denseKeyProvider, (languageId) => + languageConfigurationService.getLanguageConfiguration(languageId) + ); + const tokenizer = new TextBufferTokenizer( + new StaticTokenizerSource([tokens]), + bracketTokens + ); + const node = parseDocument(tokenizer, [], undefined, true); + + let str = ''; + const line = tokens.getLineContent(); + + function processNode(node: AstNode, offset: Length) { + if (node.kind === AstNodeKind.Pair) { + processNode(node.openingBracket, offset); + offset = lengthAdd(offset, node.openingBracket.length); + + if (node.child) { + processNode(node.child, offset); + offset = lengthAdd(offset, node.child.length); + } + if (node.closingBracket) { + processNode(node.closingBracket, offset); + offset = lengthAdd(offset, node.closingBracket.length); + } else { + const singleLangBracketTokens = bracketTokens.getSingleLanguageBracketTokens(node.openingBracket.languageId); + + const closingTokenText = singleLangBracketTokens.findClosingTokenText(node.openingBracket.bracketIds); + str += closingTokenText; + } + } else if (node.kind === AstNodeKind.UnexpectedClosingBracket) { + // remove the bracket + } else if (node.kind === AstNodeKind.Text || node.kind === AstNodeKind.Bracket) { + str += line.substring( + lengthGetColumnCountIfZeroLineCount(offset), + lengthGetColumnCountIfZeroLineCount(lengthAdd(offset, node.length)) + ); + } else if (node.kind === AstNodeKind.List) { + for (const child of node.children) { + processNode(child, offset); + offset = lengthAdd(offset, child.length); + } + } + } + + processNode(node, lengthZero); + + return str; +} + +class StaticTokenizerSource implements ITokenizerSource { + constructor(private readonly lines: IViewLineTokens[]) { } + + getValue(): string { + return this.lines.map(l => l.getLineContent()).join('\n'); + } + getLineCount(): number { + return this.lines.length; + } + getLineLength(lineNumber: number): number { + return this.lines[lineNumber - 1].getLineContent().length; + } + getLineTokens(lineNumber: number): IViewLineTokens { + return this.lines[lineNumber - 1]; + } +} diff --git a/src/vs/editor/common/model/editStack.ts b/src/vs/editor/common/model/editStack.ts index ecedaf5c084..bb67566ac5a 100644 --- a/src/vs/editor/common/model/editStack.ts +++ b/src/vs/editor/common/model/editStack.ts @@ -6,14 +6,15 @@ import * as nls from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Selection } from 'vs/editor/common/core/selection'; -import { EndOfLineSequence, ICursorStateComputer, IIdentifiedSingleEditOperation, IValidEditOperation, ITextModel } from 'vs/editor/common/model'; +import { EndOfLineSequence, ICursorStateComputer, IValidEditOperation, ITextModel } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; import { IUndoRedoService, IResourceUndoRedoElement, UndoRedoElementType, IWorkspaceUndoRedoElement } from 'vs/platform/undoRedo/common/undoRedo'; import { URI } from 'vs/base/common/uri'; -import { TextChange, compressConsecutiveTextChanges } from 'vs/editor/common/model/textChange'; +import { TextChange, compressConsecutiveTextChanges } from 'vs/editor/common/core/textChange'; import * as buffer from 'vs/base/common/buffer'; import { IDisposable } from 'vs/base/common/lifecycle'; import { basename } from 'vs/base/common/resources'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; function uriGetComparisonKey(resource: URI): string { return resource.toString(); @@ -423,7 +424,7 @@ export class EditStack { editStackElement.append(this._model, [], getModelEOL(this._model), this._model.getAlternativeVersionId(), null); } - public pushEditOperation(beforeCursorState: Selection[] | null, editOperations: IIdentifiedSingleEditOperation[], cursorStateComputer: ICursorStateComputer | null): Selection[] | null { + public pushEditOperation(beforeCursorState: Selection[] | null, editOperations: ISingleEditOperation[], cursorStateComputer: ICursorStateComputer | null): Selection[] | null { const editStackElement = this._getOrCreateEditStackElement(beforeCursorState); const inverseEditOperations = this._model.applyEdits(editOperations, true); const afterCursorState = EditStack._computeCursorState(cursorStateComputer, inverseEditOperations); diff --git a/src/vs/editor/common/model/guidesTextModelPart.ts b/src/vs/editor/common/model/guidesTextModelPart.ts index a3bd539a520..b30b8d4111e 100644 --- a/src/vs/editor/common/model/guidesTextModelPart.ts +++ b/src/vs/editor/common/model/guidesTextModelPart.ts @@ -5,83 +5,15 @@ import { ArrayQueue, findLast } from 'vs/base/common/arrays'; import * as strings from 'vs/base/common/strings'; -import { CursorColumns } from 'vs/editor/common/controller/cursorColumns'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { BracketPairInfo } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; +import { BracketPairInfo } from 'vs/editor/common/textModelBracketPairs'; import type { TextModel } from 'vs/editor/common/model/textModel'; import { TextModelPart } from 'vs/editor/common/model/textModelPart'; import { computeIndentLevel } from 'vs/editor/common/model/utils'; import { ILanguageConfigurationService, ResolvedLanguageConfiguration } from 'vs/editor/common/languages/languageConfigurationRegistry'; - -export interface IGuidesTextModelPart { - /** - * @internal - */ - getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo; - - /** - * @internal - */ - getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[]; - - /** - * @internal - */ - getLinesBracketGuides(startLineNumber: number, endLineNumber: number, activePosition: IPosition | null, options: BracketGuideOptions): IndentGuide[][]; -} - -/** - * @internal - */ -export interface IActiveIndentGuideInfo { - startLineNumber: number; - endLineNumber: number; - indent: number; -} - -/** - * @internal - */ -export enum HorizontalGuidesState { - Disabled, - EnabledForActive, - Enabled -} - -/** - * @internal - */ -export interface BracketGuideOptions { - includeInactive: boolean, - horizontalGuides: HorizontalGuidesState, - highlightActive: boolean, -} - -/** - * @internal - */ -export class IndentGuide { - constructor( - public readonly visibleColumn: number, - public readonly className: string, - /** - * If set, this indent guide is a horizontal guide (no vertical part). - * It starts at visibleColumn and continues until endColumn. - */ - public readonly horizontalLine: IndentGuideHorizontalLine | null, - ) { } -} - -/** - * @internal - */ -export class IndentGuideHorizontalLine { - constructor( - public readonly top: boolean, - public readonly endColumn: number, - ) { } -} +import { BracketGuideOptions, HorizontalGuidesState, IActiveIndentGuideInfo, IGuidesTextModelPart, IndentGuide, IndentGuideHorizontalLine } from 'vs/editor/common/textModelGuides'; export class GuidesTextModelPart extends TextModelPart implements IGuidesTextModelPart { constructor( diff --git a/src/vs/editor/common/model/mirrorTextModel.ts b/src/vs/editor/common/model/mirrorTextModel.ts index a6f02048da2..19356007c3a 100644 --- a/src/vs/editor/common/model/mirrorTextModel.ts +++ b/src/vs/editor/common/model/mirrorTextModel.ts @@ -7,8 +7,8 @@ import { splitLines } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { Position } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; -import { IModelContentChange } from 'vs/editor/common/model/textModelEvents'; -import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; +import { IModelContentChange } from 'vs/editor/common/textModelEvents'; +import { PrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; export interface IModelChangedEvent { /** diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts index ac6259f6fb6..cfd8e3d31a6 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts @@ -6,9 +6,9 @@ import { CharCode } from 'vs/base/common/charCode'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { FindMatch, ITextSnapshot } from 'vs/editor/common/model'; +import { FindMatch, ITextSnapshot, SearchData } from 'vs/editor/common/model'; import { NodeColor, SENTINEL, TreeNode, fixInsert, leftest, rbDelete, righttest, updateTreeMetadata } from 'vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase'; -import { SearchData, Searcher, createFindMatch, isValidMatch } from 'vs/editor/common/model/textModelSearch'; +import { Searcher, createFindMatch, isValidMatch } from 'vs/editor/common/model/textModelSearch'; // const lfRegex = new RegExp(/\r\n|\r|\n/g); export const AverageBufferSize = 65535; @@ -223,11 +223,11 @@ class PieceTreeSearchCache { return null; } - public get2(lineNumber: number): { node: TreeNode, nodeStartOffset: number, nodeStartLineNumber: number } | null { + public get2(lineNumber: number): { node: TreeNode; nodeStartOffset: number; nodeStartLineNumber: number } | null { for (let i = this._cache.length - 1; i >= 0; i--) { const nodePos = this._cache[i]; if (nodePos.nodeStartLineNumber && nodePos.nodeStartLineNumber < lineNumber && nodePos.nodeStartLineNumber + nodePos.node.piece.lineFeedCnt >= lineNumber) { - return <{ node: TreeNode, nodeStartOffset: number, nodeStartLineNumber: number }>nodePos; + return <{ node: TreeNode; nodeStartOffset: number; nodeStartLineNumber: number }>nodePos; } } return null; @@ -275,7 +275,7 @@ export class PieceTreeBase { protected _EOLNormalized!: boolean; private _lastChangeBufferPos!: BufferCursor; private _searchCache!: PieceTreeSearchCache; - private _lastVisitedLine!: { lineNumber: number; value: string; }; + private _lastVisitedLine!: { lineNumber: number; value: string }; constructor(chunks: StringBuffer[], eol: '\r\n' | '\n', eolNormalized: boolean) { this.create(chunks, eol, eolNormalized); @@ -1318,7 +1318,7 @@ export class PieceTreeBase { } // #region node operations - private getIndexOf(node: TreeNode, accumulatedValue: number): { index: number, remainder: number } { + private getIndexOf(node: TreeNode, accumulatedValue: number): { index: number; remainder: number } { const piece = node.piece; const pos = this.positionInBuffer(node, accumulatedValue); const lineCnt = pos.line - piece.start.line; diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts index eaf88b1b926..1a927ff4c57 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts @@ -7,11 +7,10 @@ import { Emitter, Event } from 'vs/base/common/event'; import * as strings from 'vs/base/common/strings'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { ApplyEditsResult, EndOfLinePreference, FindMatch, IInternalModelContentChange, ISingleEditOperationIdentifier, ITextBuffer, ITextSnapshot, ValidAnnotatedEditOperation, IValidEditOperation } from 'vs/editor/common/model'; +import { ApplyEditsResult, EndOfLinePreference, FindMatch, IInternalModelContentChange, ISingleEditOperationIdentifier, ITextBuffer, ITextSnapshot, ValidAnnotatedEditOperation, IValidEditOperation, SearchData } from 'vs/editor/common/model'; import { PieceTreeBase, StringBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase'; -import { SearchData } from 'vs/editor/common/model/textModelSearch'; -import { countEOL, StringEOL } from 'vs/editor/common/model/pieceTreeTextBuffer/eolCounter'; -import { TextChange } from 'vs/editor/common/model/textChange'; +import { countEOL, StringEOL } from 'vs/editor/common/core/eolCounter'; +import { TextChange } from 'vs/editor/common/core/textChange'; import { Disposable } from 'vs/base/common/lifecycle'; export interface IValidatedEditOperation { @@ -309,7 +308,7 @@ export class PieceTreeTextBuffer extends Disposable implements ITextBuffer { // Delta encode operations const reverseRanges = (computeUndoEdits || recordTrimAutoWhitespace ? PieceTreeTextBuffer._getInverseEditRanges(operations) : []); - const newTrimAutoWhitespaceCandidates: { lineNumber: number, oldContent: string }[] = []; + const newTrimAutoWhitespaceCandidates: { lineNumber: number; oldContent: string }[] = []; if (recordTrimAutoWhitespace) { for (let i = 0; i < operations.length; i++) { const op = operations[i]; diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts index f6ad9ed70ca..f0bdedc4507 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts @@ -39,7 +39,7 @@ export class PieceTreeTextBufferFactory implements ITextBufferFactory { return '\n'; } - public create(defaultEOL: DefaultEndOfLine): { textBuffer: ITextBuffer; disposable: IDisposable; } { + public create(defaultEOL: DefaultEndOfLine): { textBuffer: ITextBuffer; disposable: IDisposable } { const eol = this._getEOL(defaultEOL); const chunks = this._chunks; diff --git a/src/vs/editor/common/viewModel/prefixSumComputer.ts b/src/vs/editor/common/model/prefixSumComputer.ts similarity index 100% rename from src/vs/editor/common/viewModel/prefixSumComputer.ts rename to src/vs/editor/common/model/prefixSumComputer.ts diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 1d03f45decc..c7e84d94feb 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -15,38 +15,40 @@ import { listenStream } from 'vs/base/common/stream'; import * as strings from 'vs/base/common/strings'; import { Constants } from 'vs/base/common/uint'; import { URI } from 'vs/base/common/uri'; -import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import * as model from 'vs/editor/common/model'; -import { IBracketPairsTextModelPart } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; +import { IBracketPairsTextModelPart } from 'vs/editor/common/textModelBracketPairs'; import { BracketPairsTextModelPart } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl'; import { ColorizedBracketPairsDecorationProvider } from 'vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider'; import { DecorationProvider } from 'vs/editor/common/model/decorationProvider'; import { EditStack } from 'vs/editor/common/model/editStack'; -import { GuidesTextModelPart, IGuidesTextModelPart } from 'vs/editor/common/model/guidesTextModelPart'; +import { GuidesTextModelPart } from 'vs/editor/common/model/guidesTextModelPart'; +import { IGuidesTextModelPart } from 'vs/editor/common/textModelGuides'; import { guessIndentation } from 'vs/editor/common/model/indentationGuesser'; import { IntervalNode, IntervalTree, recomputeMaxEnd } from 'vs/editor/common/model/intervalTree'; import { PieceTreeTextBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer'; import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; -import { TextChange } from 'vs/editor/common/model/textChange'; -import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, InternalModelContentChangeEvent, LineInjectedText, ModelInjectedTextChangedEvent, ModelRawChange, ModelRawContentChangedEvent, ModelRawEOLChanged, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/model/textModelEvents'; -import { SearchData, SearchParams, TextModelSearch } from 'vs/editor/common/model/textModelSearch'; +import { TextChange } from 'vs/editor/common/core/textChange'; +import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent, IModelTokensChangedEvent, InternalModelContentChangeEvent, LineInjectedText, ModelInjectedTextChangedEvent, ModelRawChange, ModelRawContentChangedEvent, ModelRawEOLChanged, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/textModelEvents'; +import { SearchParams, TextModelSearch } from 'vs/editor/common/model/textModelSearch'; import { TextModelTokenization } from 'vs/editor/common/model/textModelTokens'; -import { countEOL } from 'vs/editor/common/model/pieceTreeTextBuffer/eolCounter'; -import { ContiguousMultilineTokens } from 'vs/editor/common/model/tokens/contiguousMultilineTokens'; -import { SparseMultilineTokens } from 'vs/editor/common/model/tokens/sparseMultilineTokens'; -import { ContiguousTokensStore } from 'vs/editor/common/model/tokens/contiguousTokensStore'; -import { SparseTokensStore } from 'vs/editor/common/model/tokens/sparseTokensStore'; -import { getWordAtText } from 'vs/editor/common/model/wordHelper'; +import { countEOL } from 'vs/editor/common/core/eolCounter'; +import { ContiguousMultilineTokens } from 'vs/editor/common/tokens/contiguousMultilineTokens'; +import { SparseMultilineTokens } from 'vs/editor/common/tokens/sparseMultilineTokens'; +import { ContiguousTokensStore } from 'vs/editor/common/tokens/contiguousTokensStore'; +import { SparseTokensStore } from 'vs/editor/common/tokens/sparseTokensStore'; +import { getWordAtText, IWordAtPosition } from 'vs/editor/common/core/wordHelper'; import { FormattingOptions, StandardTokenType } from 'vs/editor/common/languages'; import { ILanguageConfigurationService, ResolvedLanguageConfiguration } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { EditorTheme } from 'vs/editor/common/view/viewContext'; -import { ThemeColor } from 'vs/platform/theme/common/themeService'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { IColorTheme, ThemeColor } from 'vs/platform/theme/common/themeService'; import { IUndoRedoService, ResourceEditStackSnapshot } from 'vs/platform/undoRedo/common/undoRedo'; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/core/textModelDefaults'; +import { normalizeIndentation } from 'vs/editor/common/core/indentation'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; function createTextBufferBuilder() { return new PieceTreeTextBufferBuilder(); @@ -104,7 +106,7 @@ export function createTextBufferFactoryFromSnapshot(snapshot: model.ITextSnapsho return builder.finish(); } -export function createTextBuffer(value: string | model.ITextBufferFactory, defaultEOL: model.DefaultEndOfLine): { textBuffer: model.ITextBuffer; disposable: IDisposable; } { +export function createTextBuffer(value: string | model.ITextBufferFactory, defaultEOL: model.DefaultEndOfLine): { textBuffer: model.ITextBuffer; disposable: IDisposable } { const factory = (typeof value === 'string' ? createTextBufferFactory(value) : value); return factory.create(defaultEOL); } @@ -289,7 +291,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati */ private readonly _instanceId: string; private _lastDecorationId: number; - private _decorations: { [decorationId: string]: IntervalNode; }; + private _decorations: { [decorationId: string]: IntervalNode }; private _decorationsTree: DecorationsTrees; private readonly _decorationProvider: DecorationProvider; //#endregion @@ -694,43 +696,9 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati }); } - private static _normalizeIndentationFromWhitespace(str: string, indentSize: number, insertSpaces: boolean): string { - let spacesCnt = 0; - for (let i = 0; i < str.length; i++) { - if (str.charAt(i) === '\t') { - spacesCnt += indentSize; - } else { - spacesCnt++; - } - } - - let result = ''; - if (!insertSpaces) { - const tabsCnt = Math.floor(spacesCnt / indentSize); - spacesCnt = spacesCnt % indentSize; - for (let i = 0; i < tabsCnt; i++) { - result += '\t'; - } - } - - for (let i = 0; i < spacesCnt; i++) { - result += ' '; - } - - return result; - } - - public static normalizeIndentation(str: string, indentSize: number, insertSpaces: boolean): string { - let firstNonWhitespaceIndex = strings.firstNonWhitespaceIndex(str); - if (firstNonWhitespaceIndex === -1) { - firstNonWhitespaceIndex = str.length; - } - return TextModel._normalizeIndentationFromWhitespace(str.substring(0, firstNonWhitespaceIndex), indentSize, insertSpaces) + str.substring(firstNonWhitespaceIndex); - } - public normalizeIndentation(str: string): string { this._assertNotDisposed(); - return TextModel.normalizeIndentation(str, this._options.indentSize, this._options.insertSpaces); + return normalizeIndentation(str, this._options.indentSize, this._options.insertSpaces); } //#endregion @@ -1162,7 +1130,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati return new Range(1, 1, lineCount, this.getLineMaxColumn(lineCount)); } - private findMatchesLineByLine(searchRange: Range, searchData: SearchData, captureMatches: boolean, limitResultCount: number): model.FindMatch[] { + private findMatchesLineByLine(searchRange: Range, searchData: model.SearchData, captureMatches: boolean, limitResultCount: number): model.FindMatch[] { return this._buffer.findMatchesLineByLine(searchRange, searchData, captureMatches, limitResultCount); } @@ -1407,7 +1375,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati } _applyUndo(changes: TextChange[], eol: model.EndOfLineSequence, resultingAlternativeVersionId: number, resultingSelection: Selection[] | null): void { - const edits = changes.map((change) => { + const edits = changes.map((change) => { const rangeStart = this.getPositionAt(change.newPosition); const rangeEnd = this.getPositionAt(change.newEnd); return { @@ -1419,7 +1387,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati } _applyRedo(changes: TextChange[], eol: model.EndOfLineSequence, resultingAlternativeVersionId: number, resultingSelection: Selection[] | null): void { - const edits = changes.map((change) => { + const edits = changes.map((change) => { const rangeStart = this.getPositionAt(change.oldPosition); const rangeEnd = this.getPositionAt(change.oldEnd); return { @@ -1430,7 +1398,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati this._applyUndoRedoEdits(edits, eol, false, true, resultingAlternativeVersionId, resultingSelection); } - private _applyUndoRedoEdits(edits: model.IIdentifiedSingleEditOperation[], eol: model.EndOfLineSequence, isUndoing: boolean, isRedoing: boolean, resultingAlternativeVersionId: number, resultingSelection: Selection[] | null): void { + private _applyUndoRedoEdits(edits: ISingleEditOperation[], eol: model.EndOfLineSequence, isUndoing: boolean, isRedoing: boolean, resultingAlternativeVersionId: number, resultingSelection: Selection[] | null): void { try { this._onDidChangeDecorations.beginDeferredEmit(); this._eventEmitter.beginDeferredEmit(); @@ -1970,7 +1938,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati public setTokens(tokens: ContiguousMultilineTokens[], backgroundTokenizationCompleted: boolean = false): void { if (tokens.length !== 0) { - const ranges: { fromLineNumber: number; toLineNumber: number; }[] = []; + const ranges: { fromLineNumber: number; toLineNumber: number }[] = []; for (let i = 0, len = tokens.length; i < len; i++) { const element = tokens[i]; @@ -2028,7 +1996,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati if (this.hasCompleteSemanticTokens()) { return; } - const changedRange = this._semanticTokens.setPartial(range, tokens); + const changedRange = this.validateRange(this._semanticTokens.setPartial(range, tokens)); this._emitModelTokensChangedEvent({ tokenizationSupportChanged: false, @@ -2139,13 +2107,18 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati return this._tokenization.getTokenTypeIfInsertingCharacter(position, character); } + tokenizeLineWithEdit(position: IPosition, length: number, newText: string): LineTokens | null { + const validatedPosition = this.validatePosition(position); + return this._tokenization.tokenizeLineWithEdit(validatedPosition, length, newText); + } + private getLanguageConfiguration(languageId: string): ResolvedLanguageConfiguration { return this._languageConfigurationService.getLanguageConfiguration(languageId); } // Having tokens allows implementing additional helper methods - public getWordAtPosition(_position: IPosition): model.IWordAtPosition | null { + public getWordAtPosition(_position: IPosition): IWordAtPosition | null { this._assertNotDisposed(); const position = this.validatePosition(_position); const lineContent = this.getLineContent(position.lineNumber); @@ -2202,7 +2175,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati return [startOffset, endOffset]; } - public getWordUntilPosition(position: IPosition): model.IWordAtPosition { + public getWordUntilPosition(position: IPosition): IWordAtPosition { const wordAtPosition = this.getWordAtPosition(position); if (!wordAtPosition) { return { @@ -2425,7 +2398,7 @@ export class ModelDecorationOverviewRulerOptions extends DecorationOptions { this.position = (typeof options.position === 'number' ? options.position : model.OverviewRulerLane.Center); } - public getColor(theme: EditorTheme): string { + public getColor(theme: IColorTheme): string { if (!this._resolvedColor) { if (theme.type !== 'light' && this.darkColor) { this._resolvedColor = this._resolveColor(this.darkColor, theme); @@ -2440,7 +2413,7 @@ export class ModelDecorationOverviewRulerOptions extends DecorationOptions { this._resolvedColor = null; } - private _resolveColor(color: string | ThemeColor, theme: EditorTheme): string { + private _resolveColor(color: string | ThemeColor, theme: IColorTheme): string { if (typeof color === 'string') { return color; } @@ -2462,7 +2435,7 @@ export class ModelDecorationMinimapOptions extends DecorationOptions { this.position = options.position; } - public getColor(theme: EditorTheme): Color | undefined { + public getColor(theme: IColorTheme): Color | undefined { if (!this._resolvedColor) { if (theme.type !== 'light' && this.darkColor) { this._resolvedColor = this._resolveColor(this.darkColor, theme); @@ -2478,7 +2451,7 @@ export class ModelDecorationMinimapOptions extends DecorationOptions { this._resolvedColor = undefined; } - private _resolveColor(color: string | ThemeColor, theme: EditorTheme): Color | undefined { + private _resolveColor(color: string | ThemeColor, theme: IColorTheme): Color | undefined { if (typeof color === 'string') { return Color.fromHex(color); } diff --git a/src/vs/editor/common/model/textModelSearch.ts b/src/vs/editor/common/model/textModelSearch.ts index 4ef2e13a4c1..9cb78321821 100644 --- a/src/vs/editor/common/model/textModelSearch.ts +++ b/src/vs/editor/common/model/textModelSearch.ts @@ -5,10 +5,10 @@ import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; -import { WordCharacterClass, WordCharacterClassifier, getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { WordCharacterClass, WordCharacterClassifier, getMapForWordSeparators } from 'vs/editor/common/core/wordCharacterClassifier'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { EndOfLinePreference, FindMatch } from 'vs/editor/common/model'; +import { EndOfLinePreference, FindMatch, SearchData } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; const LIMIT_FIND_COUNT = 999; @@ -94,28 +94,6 @@ export function isMultilineRegexSource(searchString: string): boolean { return false; } -export class SearchData { - - /** - * The regex to search for. Always defined. - */ - public readonly regex: RegExp; - /** - * The word separator classifier. - */ - public readonly wordSeparators: WordCharacterClassifier | null; - /** - * The simple string to search for (if possible). - */ - public readonly simpleSearch: string | null; - - constructor(regex: RegExp, wordSeparators: WordCharacterClassifier | null, simpleSearch: string | null) { - this.regex = regex; - this.wordSeparators = wordSeparators; - this.simpleSearch = simpleSearch; - } -} - export function createFindMatch(range: Range, rawMatches: RegExpExecArray, captureMatches: boolean): FindMatch { if (!captureMatches) { return new FindMatch(range, null); diff --git a/src/vs/editor/common/model/textModelTokens.ts b/src/vs/editor/common/model/textModelTokens.ts index 61a9526b5ee..4dc9e7a3726 100644 --- a/src/vs/editor/common/model/textModelTokens.ts +++ b/src/vs/editor/common/model/textModelTokens.ts @@ -5,17 +5,16 @@ import * as arrays from 'vs/base/common/arrays'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { Position } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; -import { ILanguageIdCodec, IState, ITokenizationSupport, StandardTokenType, TokenizationRegistry } from 'vs/editor/common/languages'; -import { nullTokenizeEncoded } from 'vs/editor/common/languages/nullMode'; +import { EncodedTokenizationResult, ILanguageIdCodec, IState, ITokenizationSupport, StandardTokenType, TokenizationRegistry } from 'vs/editor/common/languages'; +import { nullTokenizeEncoded } from 'vs/editor/common/languages/nullTokenize'; import { TextModel } from 'vs/editor/common/model/textModel'; import { Disposable } from 'vs/base/common/lifecycle'; import { StopWatch } from 'vs/base/common/stopwatch'; -import { countEOL } from 'vs/editor/common/model/pieceTreeTextBuffer/eolCounter'; -import { ContiguousMultilineTokensBuilder } from 'vs/editor/common/model/tokens/contiguousMultilineTokensBuilder'; +import { countEOL } from 'vs/editor/common/core/eolCounter'; +import { ContiguousMultilineTokensBuilder } from 'vs/editor/common/tokens/contiguousMultilineTokensBuilder'; import { runWhenIdle, IdleDeadline } from 'vs/base/common/async'; import { setTimeout0 } from 'vs/base/common/platform'; @@ -23,110 +22,102 @@ const enum Constants { CHEAP_TOKENIZATION_LENGTH_LIMIT = 2048 } -export class TokenizationStateStore { - private _beginState: (IState | null)[]; - private _valid: boolean[]; - private _len: number; - private _invalidLineStartIndex: number; +/** + * An array that avoids being sparse by always + * filling up unused indices with a default value. + */ +class ContiguousGrowingArray { - constructor() { - this._beginState = []; - this._valid = []; - this._len = 0; - this._invalidLineStartIndex = 0; - } + private _store: T[] = []; - private _reset(initialState: IState | null): void { - this._beginState = []; - this._valid = []; - this._len = 0; - this._invalidLineStartIndex = 0; + constructor( + private readonly _default: T + ) { } - if (initialState) { - this._setBeginState(0, initialState); + public get(index: number): T { + if (index < this._store.length) { + return this._store[index]; } + return this._default; } - public flush(initialState: IState | null): void { - this._reset(initialState); + public set(index: number, value: T): void { + while (index >= this._store.length) { + this._store[this._store.length] = this._default; + } + this._store[index] = value; } + public delete(deleteIndex: number, deleteCount: number): void { + if (deleteCount === 0 || deleteIndex >= this._store.length) { + return; + } + this._store.splice(deleteIndex, deleteCount); + } + + public insert(insertIndex: number, insertCount: number): void { + if (insertCount === 0 || insertIndex >= this._store.length) { + return; + } + const arr: T[] = []; + for (let i = 0; i < insertCount; i++) { + arr[i] = this._default; + } + this._store = arrays.arrayInsert(this._store, insertIndex, arr); + } +} + +/** + * Stores the states at the start of each line and keeps track of which lines + * must be retokenized. Also uses state equality to quickly validate lines + * that don't need to be retokenized. + * + * For example, when typing on a line, the line gets marked as needing to be tokenized. + * Once the line is tokenized, the end state is checked for equality against the begin + * state of the next line. If the states are equal, tokenization doesn't need to run + * again over the rest of the file. If the states are not equal, the next line gets marked + * as needing to be tokenized. + */ +export class TokenizationStateStore { + + /** + * `lineBeginState[i]` contains the begin state used to tokenize line number `i + 1`. + */ + private readonly _lineBeginState = new ContiguousGrowingArray(null); + /** + * `lineNeedsTokenization[i]` describes if line number `i + 1` needs to be tokenized. + */ + private readonly _lineNeedsTokenization = new ContiguousGrowingArray(true); + /** + * `invalidLineStartIndex` indicates that line number `invalidLineStartIndex + 1` + * is the first one that needs to be retokenized. + */ + private _firstLineNeedsTokenization: number; + public get invalidLineStartIndex() { - return this._invalidLineStartIndex; + return this._firstLineNeedsTokenization; } - private _invalidateLine(lineIndex: number): void { - if (lineIndex < this._len) { - this._valid[lineIndex] = false; - } - - if (lineIndex < this._invalidLineStartIndex) { - this._invalidLineStartIndex = lineIndex; - } + constructor( + public readonly tokenizationSupport: ITokenizationSupport, + public readonly initialState: IState + ) { + this._firstLineNeedsTokenization = 0; + this._lineBeginState.set(0, this.initialState); } - private _isValid(lineIndex: number): boolean { - if (lineIndex < this._len) { - return this._valid[lineIndex]; - } - return false; + public markMustBeTokenized(lineIndex: number): void { + this._lineNeedsTokenization.set(lineIndex, true); + this._firstLineNeedsTokenization = Math.min(this._firstLineNeedsTokenization, lineIndex); } public getBeginState(lineIndex: number): IState | null { - if (lineIndex < this._len) { - return this._beginState[lineIndex]; - } - return null; - } - - private _ensureLine(lineIndex: number): void { - while (lineIndex >= this._len) { - this._beginState[this._len] = null; - this._valid[this._len] = false; - this._len++; - } - } - - private _deleteLines(start: number, deleteCount: number): void { - if (deleteCount === 0) { - return; - } - if (start + deleteCount > this._len) { - deleteCount = this._len - start; - } - this._beginState.splice(start, deleteCount); - this._valid.splice(start, deleteCount); - this._len -= deleteCount; - } - - private _insertLines(insertIndex: number, insertCount: number): void { - if (insertCount === 0) { - return; - } - const beginState: (IState | null)[] = []; - const valid: boolean[] = []; - for (let i = 0; i < insertCount; i++) { - beginState[i] = null; - valid[i] = false; - } - this._beginState = arrays.arrayInsert(this._beginState, insertIndex, beginState); - this._valid = arrays.arrayInsert(this._valid, insertIndex, valid); - this._len += insertCount; - } - - private _setValid(lineIndex: number, valid: boolean): void { - this._ensureLine(lineIndex); - this._valid[lineIndex] = valid; - } - - private _setBeginState(lineIndex: number, beginState: IState | null): void { - this._ensureLine(lineIndex); - this._beginState[lineIndex] = beginState; + return this._lineBeginState.get(lineIndex); } public setEndState(linesLength: number, lineIndex: number, endState: IState): void { - this._setValid(lineIndex, true); - this._invalidLineStartIndex = lineIndex + 1; + this._lineNeedsTokenization.set(lineIndex, false); + this._firstLineNeedsTokenization = lineIndex + 1; // Check if this was the last line if (lineIndex === linesLength - 1) { @@ -134,61 +125,34 @@ export class TokenizationStateStore { } // Check if the end state has changed - const previousEndState = this.getBeginState(lineIndex + 1); + const previousEndState = this._lineBeginState.get(lineIndex + 1); if (previousEndState === null || !endState.equals(previousEndState)) { - this._setBeginState(lineIndex + 1, endState); - this._invalidateLine(lineIndex + 1); + this._lineBeginState.set(lineIndex + 1, endState); + this.markMustBeTokenized(lineIndex + 1); return; } // Perhaps we can skip tokenizing some lines... let i = lineIndex + 1; while (i < linesLength) { - if (!this._isValid(i)) { + if (this._lineNeedsTokenization.get(i)) { break; } i++; } - this._invalidLineStartIndex = i; - } - - public setFakeTokens(lineIndex: number): void { - this._setValid(lineIndex, false); + this._firstLineNeedsTokenization = i; } //#region Editing public applyEdits(range: IRange, eolCount: number): void { - const deletingLinesCnt = range.endLineNumber - range.startLineNumber; - const insertingLinesCnt = eolCount; - const editingLinesCnt = Math.min(deletingLinesCnt, insertingLinesCnt); + this.markMustBeTokenized(range.startLineNumber - 1); - for (let j = editingLinesCnt; j >= 0; j--) { - this._invalidateLine(range.startLineNumber + j - 1); - } + this._lineBeginState.delete(range.startLineNumber, range.endLineNumber - range.startLineNumber); + this._lineNeedsTokenization.delete(range.startLineNumber, range.endLineNumber - range.startLineNumber); - this._acceptDeleteRange(range); - this._acceptInsertText(new Position(range.startLineNumber, range.startColumn), eolCount); - } - - private _acceptDeleteRange(range: IRange): void { - - const firstLineIndex = range.startLineNumber - 1; - if (firstLineIndex >= this._len) { - return; - } - - this._deleteLines(range.startLineNumber, range.endLineNumber - range.startLineNumber); - } - - private _acceptInsertText(position: Position, eolCount: number): void { - - const lineIndex = position.lineNumber - 1; - if (lineIndex >= this._len) { - return; - } - - this._insertLines(position.lineNumber, eolCount); + this._lineBeginState.insert(range.startLineNumber, eolCount); + this._lineNeedsTokenization.insert(range.startLineNumber, eolCount); } //#endregion @@ -196,9 +160,8 @@ export class TokenizationStateStore { export class TextModelTokenization extends Disposable { - private readonly _tokenizationStateStore: TokenizationStateStore; + private _tokenizationStateStore: TokenizationStateStore | null; private _isDisposed: boolean; - private _tokenizationSupport: ITokenizationSupport | null; constructor( private readonly _textModel: TextModel, @@ -206,8 +169,7 @@ export class TextModelTokenization extends Disposable { ) { super(); this._isDisposed = false; - this._tokenizationStateStore = new TokenizationStateStore(); - this._tokenizationSupport = null; + this._tokenizationStateStore = null; this._register(TokenizationRegistry.onDidChange((e) => { const languageId = this._textModel.getLanguageId(); @@ -224,10 +186,12 @@ export class TextModelTokenization extends Disposable { this._resetTokenizationState(); return; } - for (let i = 0, len = e.changes.length; i < len; i++) { - const change = e.changes[i]; - const [eolCount] = countEOL(change.text); - this._tokenizationStateStore.applyEdits(change.range, eolCount); + if (this._tokenizationStateStore) { + for (let i = 0, len = e.changes.length; i < len; i++) { + const change = e.changes[i]; + const [eolCount] = countEOL(change.text); + this._tokenizationStateStore.applyEdits(change.range, eolCount); + } } this._beginBackgroundTokenization(); @@ -252,8 +216,11 @@ export class TextModelTokenization extends Disposable { private _resetTokenizationState(): void { const [tokenizationSupport, initialState] = initializeTokenization(this._textModel); - this._tokenizationSupport = tokenizationSupport; - this._tokenizationStateStore.flush(initialState); + if (tokenizationSupport && initialState) { + this._tokenizationStateStore = new TokenizationStateStore(tokenizationSupport, initialState); + } else { + this._tokenizationStateStore = null; + } this._beginBackgroundTokenization(); } @@ -343,7 +310,7 @@ export class TextModelTokenization extends Disposable { } public getTokenTypeIfInsertingCharacter(position: Position, character: string): StandardTokenType { - if (!this._tokenizationSupport) { + if (!this._tokenizationStateStore) { return StandardTokenType.Other; } @@ -363,7 +330,7 @@ export class TextModelTokenization extends Disposable { + lineContent.substring(position.column - 1) ); - const r = safeTokenize(this._languageIdCodec, languageId, this._tokenizationSupport, text, true, lineStartState); + const r = safeTokenize(this._languageIdCodec, languageId, this._tokenizationStateStore.tokenizationSupport, text, true, lineStartState); const lineTokens = new LineTokens(r.tokens, text, this._languageIdCodec); if (lineTokens.getCount() === 0) { return StandardTokenType.Other; @@ -373,8 +340,40 @@ export class TextModelTokenization extends Disposable { return lineTokens.getStandardTokenType(tokenIndex); } + public tokenizeLineWithEdit(position: Position, length: number, newText: string): LineTokens | null { + const lineNumber = position.lineNumber; + const column = position.column; + + if (!this._tokenizationStateStore) { + return null; + } + + this.forceTokenization(lineNumber); + const lineStartState = this._tokenizationStateStore.getBeginState(lineNumber - 1); + if (!lineStartState) { + return null; + } + + const curLineContent = this._textModel.getLineContent(lineNumber); + const newLineContent = curLineContent.substring(0, column - 1) + + newText + curLineContent.substring(column - 1 + length); + + const languageId = this._textModel.getLanguageIdAtPosition(lineNumber, 0); + const result = safeTokenize( + this._languageIdCodec, + languageId, + this._tokenizationStateStore.tokenizationSupport, + newLineContent, + true, + lineStartState + ); + + const lineTokens = new LineTokens(result.tokens, newLineContent, this._languageIdCodec); + return lineTokens; + } + public isCheapToTokenize(lineNumber: number): boolean { - if (!this._tokenizationSupport) { + if (!this._tokenizationStateStore) { return true; } @@ -395,14 +394,14 @@ export class TextModelTokenization extends Disposable { } private _hasLinesToTokenize(): boolean { - if (!this._tokenizationSupport) { + if (!this._tokenizationStateStore) { return false; } return (this._tokenizationStateStore.invalidLineStartIndex < this._textModel.getLineCount()); } private _tokenizeOneInvalidLine(builder: ContiguousMultilineTokensBuilder): number { - if (!this._hasLinesToTokenize()) { + if (!this._tokenizationStateStore || !this._hasLinesToTokenize()) { return this._textModel.getLineCount() + 1; } const lineNumber = this._tokenizationStateStore.invalidLineStartIndex + 1; @@ -411,7 +410,7 @@ export class TextModelTokenization extends Disposable { } private _updateTokensUntilLine(builder: ContiguousMultilineTokensBuilder, lineNumber: number): void { - if (!this._tokenizationSupport) { + if (!this._tokenizationStateStore) { return; } const languageId = this._textModel.getLanguageId(); @@ -423,7 +422,7 @@ export class TextModelTokenization extends Disposable { const text = this._textModel.getLineContent(lineIndex + 1); const lineStartState = this._tokenizationStateStore.getBeginState(lineIndex); - const r = safeTokenize(this._languageIdCodec, languageId, this._tokenizationSupport, text, true, lineStartState!); + const r = safeTokenize(this._languageIdCodec, languageId, this._tokenizationStateStore.tokenizationSupport, text, true, lineStartState!); builder.add(lineIndex + 1, r.tokens); this._tokenizationStateStore.setEndState(linesLength, lineIndex, r.endState); lineIndex = this._tokenizationStateStore.invalidLineStartIndex - 1; // -1 because the outer loop increments it @@ -431,7 +430,7 @@ export class TextModelTokenization extends Disposable { } private _tokenizeViewport(builder: ContiguousMultilineTokensBuilder, startLineNumber: number, endLineNumber: number): void { - if (!this._tokenizationSupport) { + if (!this._tokenizationStateStore) { // nothing to do return; } @@ -468,41 +467,40 @@ export class TextModelTokenization extends Disposable { } if (!initialState) { - initialState = this._tokenizationSupport.getInitialState(); + initialState = this._tokenizationStateStore.initialState; } const languageId = this._textModel.getLanguageId(); let state = initialState; for (let i = fakeLines.length - 1; i >= 0; i--) { - const r = safeTokenize(this._languageIdCodec, languageId, this._tokenizationSupport, fakeLines[i], false, state); + const r = safeTokenize(this._languageIdCodec, languageId, this._tokenizationStateStore.tokenizationSupport, fakeLines[i], false, state); state = r.endState; } for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { const text = this._textModel.getLineContent(lineNumber); - const r = safeTokenize(this._languageIdCodec, languageId, this._tokenizationSupport, text, true, state); + const r = safeTokenize(this._languageIdCodec, languageId, this._tokenizationStateStore.tokenizationSupport, text, true, state); builder.add(lineNumber, r.tokens); - this._tokenizationStateStore.setFakeTokens(lineNumber - 1); + this._tokenizationStateStore.markMustBeTokenized(lineNumber - 1); state = r.endState; } } } -function initializeTokenization(textModel: TextModel): [ITokenizationSupport | null, IState | null] { - const languageId = textModel.getLanguageId(); - let tokenizationSupport = ( - textModel.isTooLargeForTokenization() - ? null - : TokenizationRegistry.get(languageId) - ); - let initialState: IState | null = null; - if (tokenizationSupport) { - try { - initialState = tokenizationSupport.getInitialState(); - } catch (e) { - onUnexpectedError(e); - tokenizationSupport = null; - } +function initializeTokenization(textModel: TextModel): [ITokenizationSupport, IState] | [null, null] { + if (textModel.isTooLargeForTokenization()) { + return [null, null]; + } + const tokenizationSupport = TokenizationRegistry.get(textModel.getLanguageId()); + if (!tokenizationSupport) { + return [null, null]; + } + let initialState: IState; + try { + initialState = tokenizationSupport.getInitialState(); + } catch (e) { + onUnexpectedError(e); + return [null, null]; } return [tokenizationSupport, initialState]; } diff --git a/src/vs/editor/common/viewModel/modelLineProjectionData.ts b/src/vs/editor/common/modelLineProjectionData.ts similarity index 98% rename from src/vs/editor/common/viewModel/modelLineProjectionData.ts rename to src/vs/editor/common/modelLineProjectionData.ts index 13bfd0d7e2f..3c51b88491b 100644 --- a/src/vs/editor/common/viewModel/modelLineProjectionData.ts +++ b/src/vs/editor/common/modelLineProjectionData.ts @@ -8,7 +8,7 @@ import { WrappingIndent } from 'vs/editor/common/config/editorOptions'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { Position } from 'vs/editor/common/core/position'; import { InjectedTextCursorStops, InjectedTextOptions, PositionAffinity } from 'vs/editor/common/model'; -import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; +import { LineInjectedText } from 'vs/editor/common/textModelEvents'; /** * *input*: @@ -264,7 +264,7 @@ export class ModelLineProjectionData { }; } - private getInjectedTextAtOffset(offsetInInputWithInjections: number): { injectedTextIndex: number, offsetInInputWithInjections: number, length: number } | undefined { + private getInjectedTextAtOffset(offsetInInputWithInjections: number): { injectedTextIndex: number; offsetInInputWithInjections: number; length: number } | undefined { const injectionOffsets = this.injectionOffsets; const injectionOptions = this.injectionOptions; diff --git a/src/vs/editor/common/standalone/standaloneBase.ts b/src/vs/editor/common/services/editorBaseApi.ts similarity index 97% rename from src/vs/editor/common/standalone/standaloneBase.ts rename to src/vs/editor/common/services/editorBaseApi.ts index 2239e8d0234..3a27abbaf7a 100644 --- a/src/vs/editor/common/standalone/standaloneBase.ts +++ b/src/vs/editor/common/services/editorBaseApi.ts @@ -10,7 +10,7 @@ import { URI } from 'vs/base/common/uri'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { Token } from 'vs/editor/common/core/token'; +import { Token } from 'vs/editor/common/languages'; import * as standaloneEnums from 'vs/editor/common/standalone/standaloneEnums'; export class KeyMod { diff --git a/src/vs/editor/common/services/editorSimpleWorker.ts b/src/vs/editor/common/services/editorSimpleWorker.ts index 9cdbc71ee5a..7f5f74da589 100644 --- a/src/vs/editor/common/services/editorSimpleWorker.ts +++ b/src/vs/editor/common/services/editorSimpleWorker.ts @@ -10,20 +10,19 @@ import { URI } from 'vs/base/common/uri'; import { IRequestHandler } from 'vs/base/common/worker/simpleWorker'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; -import { DiffComputer } from 'vs/editor/common/diff/diffComputer'; -import { IChange } from 'vs/editor/common/editorCommon'; -import { EndOfLineSequence, IWordAtPosition } from 'vs/editor/common/model'; +import { DiffComputer, IChange, IDiffComputationResult } from 'vs/editor/common/diff/diffComputer'; +import { EndOfLineSequence } from 'vs/editor/common/model'; import { IMirrorTextModel, IModelChangedEvent, MirrorTextModel as BaseMirrorModel } from 'vs/editor/common/model/mirrorTextModel'; -import { ensureValidWordDefinition, getWordAtText } from 'vs/editor/common/model/wordHelper'; +import { ensureValidWordDefinition, getWordAtText, IWordAtPosition } from 'vs/editor/common/core/wordHelper'; import { IInplaceReplaceSupportResult, ILink, TextEdit } from 'vs/editor/common/languages'; import { ILinkComputerTarget, computeLinks } from 'vs/editor/common/languages/linkComputer'; import { BasicInplaceReplace } from 'vs/editor/common/languages/supports/inplaceReplaceSupport'; -import { IDiffComputationResult, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; -import { createMonacoBaseAPI } from 'vs/editor/common/standalone/standaloneBase'; +import { IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; +import { createMonacoBaseAPI } from 'vs/editor/common/services/editorBaseApi'; import * as types from 'vs/base/common/types'; import { IEditorWorkerHost } from 'vs/editor/common/services/editorWorkerHost'; import { StopWatch } from 'vs/base/common/stopwatch'; -import { UnicodeTextModelHighlighter, UnicodeHighlighterOptions } from 'vs/editor/common/languages/unicodeTextModelHighlighter'; +import { UnicodeTextModelHighlighter, UnicodeHighlighterOptions } from 'vs/editor/common/services/unicodeTextModelHighlighter'; export interface IMirrorModel extends IMirrorTextModel { readonly uri: URI; @@ -328,7 +327,7 @@ export class EditorSimpleWorker implements IRequestHandler, IDisposable { _requestHandlerBrand: any; protected readonly _host: IEditorWorkerHost; - private _models: { [uri: string]: MirrorModel; }; + private _models: { [uri: string]: MirrorModel }; private readonly _foreignModuleFactory: IForeignModuleFactory | null; private _foreignModule: any; @@ -534,7 +533,7 @@ export class EditorSimpleWorker implements IRequestHandler, IDisposable { private static readonly _suggestionsLimit = 10000; - public async textualSuggest(modelUrls: string[], leadingWord: string | undefined, wordDef: string, wordDefFlags: string): Promise<{ words: string[], duration: number } | null> { + public async textualSuggest(modelUrls: string[], leadingWord: string | undefined, wordDef: string, wordDefFlags: string): Promise<{ words: string[]; duration: number } | null> { const sw = new StopWatch(true); const wordDefRegExp = new RegExp(wordDef, wordDefFlags); diff --git a/src/vs/editor/common/services/editorWorker.ts b/src/vs/editor/common/services/editorWorker.ts index 8f308ea364f..b2c50be5ae8 100644 --- a/src/vs/editor/common/services/editorWorker.ts +++ b/src/vs/editor/common/services/editorWorker.ts @@ -5,20 +5,14 @@ import { URI } from 'vs/base/common/uri'; import { IRange } from 'vs/editor/common/core/range'; -import { IChange, ILineChange } from 'vs/editor/common/editorCommon'; +import { IChange, IDiffComputationResult } from 'vs/editor/common/diff/diffComputer'; import { IInplaceReplaceSupportResult, TextEdit } from 'vs/editor/common/languages'; -import { UnicodeHighlighterOptions } from 'vs/editor/common/languages/unicodeTextModelHighlighter'; +import { UnicodeHighlighterOptions } from 'vs/editor/common/services/unicodeTextModelHighlighter'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export const ID_EDITOR_WORKER_SERVICE = 'editorWorkerService'; export const IEditorWorkerService = createDecorator(ID_EDITOR_WORKER_SERVICE); -export interface IDiffComputationResult { - quitEarly: boolean; - identical: boolean; - changes: ILineChange[]; -} - export interface IEditorWorkerService { readonly _serviceBrand: undefined; diff --git a/src/vs/editor/common/services/getIconClasses.ts b/src/vs/editor/common/services/getIconClasses.ts index 38acfb27967..57a63980ce7 100644 --- a/src/vs/editor/common/services/getIconClasses.ts +++ b/src/vs/editor/common/services/getIconClasses.ts @@ -4,13 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import { Schemas } from 'vs/base/common/network'; -import { DataUri, basenameOrAuthority } from 'vs/base/common/resources'; +import { DataUri } from 'vs/base/common/resources'; import { URI as uri } from 'vs/base/common/uri'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { FileKind } from 'vs/platform/files/common/files'; +const fileIconDirectoryRegex = /(?:\/|^)(?:([^\/]+)\/)?([^\/]+)$/; + export function getIconClasses(modelService: IModelService, languageService: ILanguageService, resource: uri | undefined, fileKind?: FileKind): string[] { // we always set these base classes even if we do not have a path @@ -23,7 +25,16 @@ export function getIconClasses(modelService: IModelService, languageService: ILa const metadata = DataUri.parseMetaData(resource); name = metadata.get(DataUri.META_DATA_LABEL); } else { - name = cssEscape(basenameOrAuthority(resource).toLowerCase()); + const match = resource.path.match(fileIconDirectoryRegex); + if (match) { + name = cssEscape(match[2].toLowerCase()); + if (match[1]) { + classes.push(`${cssEscape(match[1].toLowerCase())}-name-dir-icon`); // parent directory + } + + } else { + name = cssEscape(resource.authority.toLowerCase()); + } } // Folders @@ -37,6 +48,7 @@ export function getIconClasses(modelService: IModelService, languageService: ILa // Name & Extension(s) if (name) { classes.push(`${name}-name-file-icon`); + classes.push(`name-file-icon`); // extra segment to increase file-name score // Avoid doing an explosive combination of extensions for very long filenames // (most file systems do not allow files > 255 length) with lots of `.` characters // https://github.com/microsoft/vscode/issues/116199 diff --git a/src/vs/editor/common/services/getSemanticTokens.ts b/src/vs/editor/common/services/getSemanticTokens.ts index 09b8fc4dc2b..298da0ce0f6 100644 --- a/src/vs/editor/common/services/getSemanticTokens.ts +++ b/src/vs/editor/common/services/getSemanticTokens.ts @@ -7,13 +7,15 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { onUnexpectedExternalError } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; -import { DocumentSemanticTokensProviderRegistry, DocumentSemanticTokensProvider, SemanticTokens, SemanticTokensEdits, SemanticTokensLegend, DocumentRangeSemanticTokensProviderRegistry, DocumentRangeSemanticTokensProvider } from 'vs/editor/common/languages'; +import { DocumentSemanticTokensProvider, SemanticTokens, SemanticTokensEdits, SemanticTokensLegend, DocumentRangeSemanticTokensProvider } from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { assertType } from 'vs/base/common/types'; import { VSBuffer } from 'vs/base/common/buffer'; import { encodeSemanticTokensDto } from 'vs/editor/common/services/semanticTokensDto'; import { Range } from 'vs/editor/common/core/range'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export function isSemanticTokens(v: SemanticTokens | SemanticTokensEdits): v is SemanticTokens { return v && !!((v).data); @@ -31,17 +33,17 @@ export class DocumentSemanticTokensResult { ) { } } -export function hasDocumentSemanticTokensProvider(model: ITextModel): boolean { - return DocumentSemanticTokensProviderRegistry.has(model); +export function hasDocumentSemanticTokensProvider(registry: LanguageFeatureRegistry, model: ITextModel): boolean { + return registry.has(model); } -function getDocumentSemanticTokensProviders(model: ITextModel): DocumentSemanticTokensProvider[] { - const groups = DocumentSemanticTokensProviderRegistry.orderedGroups(model); +function getDocumentSemanticTokensProviders(registry: LanguageFeatureRegistry, model: ITextModel): DocumentSemanticTokensProvider[] { + const groups = registry.orderedGroups(model); return (groups.length > 0 ? groups[0] : []); } -export async function getDocumentSemanticTokens(model: ITextModel, lastProvider: DocumentSemanticTokensProvider | null, lastResultId: string | null, token: CancellationToken): Promise { - const providers = getDocumentSemanticTokensProviders(model); +export async function getDocumentSemanticTokens(registry: LanguageFeatureRegistry, model: ITextModel, lastProvider: DocumentSemanticTokensProvider | null, lastResultId: string | null, token: CancellationToken): Promise { + const providers = getDocumentSemanticTokensProviders(registry, model); // Get tokens from all providers at the same time. const results = await Promise.all(providers.map(async (provider) => { @@ -80,8 +82,8 @@ export async function getDocumentSemanticTokens(model: ITextModel, lastProvider: return null; } -function _getDocumentSemanticTokensProviderHighestGroup(model: ITextModel): DocumentSemanticTokensProvider[] | null { - const result = DocumentSemanticTokensProviderRegistry.orderedGroups(model); +function _getDocumentSemanticTokensProviderHighestGroup(registry: LanguageFeatureRegistry, model: ITextModel): DocumentSemanticTokensProvider[] | null { + const result = registry.orderedGroups(model); return (result.length > 0 ? result[0] : null); } @@ -92,17 +94,17 @@ class DocumentRangeSemanticTokensResult { ) { } } -export function hasDocumentRangeSemanticTokensProvider(model: ITextModel): boolean { - return DocumentRangeSemanticTokensProviderRegistry.has(model); +export function hasDocumentRangeSemanticTokensProvider(providers: LanguageFeatureRegistry, model: ITextModel): boolean { + return providers.has(model); } -function getDocumentRangeSemanticTokensProviders(model: ITextModel): DocumentRangeSemanticTokensProvider[] { - const groups = DocumentRangeSemanticTokensProviderRegistry.orderedGroups(model); +function getDocumentRangeSemanticTokensProviders(providers: LanguageFeatureRegistry, model: ITextModel): DocumentRangeSemanticTokensProvider[] { + const groups = providers.orderedGroups(model); return (groups.length > 0 ? groups[0] : []); } -export async function getDocumentRangeSemanticTokens(model: ITextModel, range: Range, token: CancellationToken): Promise { - const providers = getDocumentRangeSemanticTokensProviders(model); +export async function getDocumentRangeSemanticTokens(registry: LanguageFeatureRegistry, model: ITextModel, range: Range, token: CancellationToken): Promise { + const providers = getDocumentRangeSemanticTokensProviders(registry, model); // Get tokens from all providers at the same time. const results = await Promise.all(providers.map(async (provider) => { @@ -144,8 +146,9 @@ CommandsRegistry.registerCommand('_provideDocumentSemanticTokensLegend', async ( if (!model) { return undefined; } + const { documentSemanticTokensProvider } = accessor.get(ILanguageFeaturesService); - const providers = _getDocumentSemanticTokensProviderHighestGroup(model); + const providers = _getDocumentSemanticTokensProviderHighestGroup(documentSemanticTokensProvider, model); if (!providers) { // there is no provider => fall back to a document range semantic tokens provider return accessor.get(ICommandService).executeCommand('_provideDocumentRangeSemanticTokensLegend', uri); @@ -162,13 +165,13 @@ CommandsRegistry.registerCommand('_provideDocumentSemanticTokens', async (access if (!model) { return undefined; } - - if (!hasDocumentSemanticTokensProvider(model)) { + const { documentSemanticTokensProvider } = accessor.get(ILanguageFeaturesService); + if (!hasDocumentSemanticTokensProvider(documentSemanticTokensProvider, model)) { // there is no provider => fall back to a document range semantic tokens provider return accessor.get(ICommandService).executeCommand('_provideDocumentRangeSemanticTokens', uri, model.getFullModelRange()); } - const r = await getDocumentSemanticTokens(model, null, null, CancellationToken.None); + const r = await getDocumentSemanticTokens(documentSemanticTokensProvider, model, null, null, CancellationToken.None); if (!r) { return undefined; } @@ -198,8 +201,8 @@ CommandsRegistry.registerCommand('_provideDocumentRangeSemanticTokensLegend', as if (!model) { return undefined; } - - const providers = getDocumentRangeSemanticTokensProviders(model); + const { documentRangeSemanticTokensProvider } = accessor.get(ILanguageFeaturesService); + const providers = getDocumentRangeSemanticTokensProviders(documentRangeSemanticTokensProvider, model); if (providers.length === 0) { // no providers return undefined; @@ -218,7 +221,7 @@ CommandsRegistry.registerCommand('_provideDocumentRangeSemanticTokensLegend', as return providers[0].getLegend(); } - const result = await getDocumentRangeSemanticTokens(model, Range.lift(range), CancellationToken.None); + const result = await getDocumentRangeSemanticTokens(documentRangeSemanticTokensProvider, model, Range.lift(range), CancellationToken.None); if (!result) { return undefined; } @@ -235,8 +238,9 @@ CommandsRegistry.registerCommand('_provideDocumentRangeSemanticTokens', async (a if (!model) { return undefined; } + const { documentRangeSemanticTokensProvider } = accessor.get(ILanguageFeaturesService); - const result = await getDocumentRangeSemanticTokens(model, Range.lift(range), CancellationToken.None); + const result = await getDocumentRangeSemanticTokens(documentRangeSemanticTokensProvider, model, Range.lift(range), CancellationToken.None); if (!result || !result.tokens) { // there is no provider or it didn't return tokens return undefined; diff --git a/src/vs/editor/common/services/languageFeatureDebounce.ts b/src/vs/editor/common/services/languageFeatureDebounce.ts index e269cb79bda..a3a2b38f62f 100644 --- a/src/vs/editor/common/services/languageFeatureDebounce.ts +++ b/src/vs/editor/common/services/languageFeatureDebounce.ts @@ -6,10 +6,11 @@ import { doHash } from 'vs/base/common/hash'; import { LRUCache } from 'vs/base/common/map'; import { clamp, MovingAverage, SlidingWindowAverage } from 'vs/base/common/numbers'; -import { LanguageFeatureRegistry } from 'vs/editor/common/languages/languageFeatureRegistry'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; import { ITextModel } from 'vs/editor/common/model'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { ILogService } from 'vs/platform/log/common/log'; export const ILanguageFeatureDebounceService = createDecorator('ILanguageFeatureDebounceService'); @@ -18,7 +19,7 @@ export interface ILanguageFeatureDebounceService { readonly _serviceBrand: undefined; - for(feature: LanguageFeatureRegistry, config?: { min?: number, salt?: string }): IFeatureDebounceInformation; + for(feature: LanguageFeatureRegistry, debugName: string, config?: { min?: number; max?: number; salt?: string }): IFeatureDebounceInformation; } export interface IFeatureDebounceInformation { @@ -45,10 +46,12 @@ class FeatureDebounceInformation implements IFeatureDebounceInformation { private readonly _cache = new LRUCache(50, 0.7); constructor( + private readonly _logService: ILogService, + private readonly _name: string, private readonly _registry: LanguageFeatureRegistry, private readonly _default: number, private readonly _min: number, - private readonly _max: number = Number.MAX_SAFE_INTEGER, + private readonly _max: number, ) { } private _key(model: ITextModel): string { @@ -67,10 +70,12 @@ class FeatureDebounceInformation implements IFeatureDebounceInformation { const key = this._key(model); let avg = this._cache.get(key); if (!avg) { - avg = new SlidingWindowAverage(12); + avg = new SlidingWindowAverage(6); this._cache.set(key, avg); } - return clamp(avg.update(value), this._min, this._max); + const newValue = clamp(avg.update(value), this._min, this._max); + this._logService.trace(`[DEBOUNCE: ${this._name}] for ${model.uri.toString()} is ${newValue}ms`); + return newValue; } private _overall(): number { @@ -94,15 +99,24 @@ export class LanguageFeatureDebounceService implements ILanguageFeatureDebounceS private readonly _data = new Map(); - for(feature: LanguageFeatureRegistry, config?: { min?: number, key?: string }): IFeatureDebounceInformation { + constructor(@ILogService private readonly _logService: ILogService) { + + } + + for(feature: LanguageFeatureRegistry, name: string, config?: { min?: number; max?: number; key?: string }): IFeatureDebounceInformation { const min = config?.min ?? 50; + const max = config?.max ?? min ** 2; const extra = config?.key ?? undefined; const key = `${IdentityHash.of(feature)},${min}${extra ? ',' + extra : ''}`; let info = this._data.get(key); if (!info) { - info = new FeatureDebounceInformation(feature, + info = new FeatureDebounceInformation( + this._logService, + name, + feature, (this._overallAverage() | 0) || (min * 1.5), // default is overall default or derived from min-value - min + min, + max ); this._data.set(key, info); } diff --git a/src/vs/editor/common/services/languageFeatures.ts b/src/vs/editor/common/services/languageFeatures.ts new file mode 100644 index 00000000000..409620380b0 --- /dev/null +++ b/src/vs/editor/common/services/languageFeatures.ts @@ -0,0 +1,81 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { CodeActionProvider, CodeLensProvider, CompletionItemProvider, DeclarationProvider, DefinitionProvider, DocumentColorProvider, DocumentFormattingEditProvider, DocumentHighlightProvider, DocumentRangeFormattingEditProvider, DocumentRangeSemanticTokensProvider, DocumentSemanticTokensProvider, DocumentSymbolProvider, EvaluatableExpressionProvider, FoldingRangeProvider, HoverProvider, ImplementationProvider, InlayHintsProvider, InlineCompletionsProvider, InlineValuesProvider, LinkedEditingRangeProvider, LinkProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, SelectionRangeProvider, SignatureHelpProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const ILanguageFeaturesService = createDecorator('ILanguageFeaturesService'); + +export interface ILanguageFeaturesService { + + readonly _serviceBrand: undefined; + + // --- navigation + + readonly referenceProvider: LanguageFeatureRegistry; + + readonly definitionProvider: LanguageFeatureRegistry; + + readonly typeDefinitionProvider: LanguageFeatureRegistry; + + readonly declarationProvider: LanguageFeatureRegistry; + + readonly implementationProvider: LanguageFeatureRegistry; + + // --- code actions + + readonly codeActionProvider: LanguageFeatureRegistry; + + readonly renameProvider: LanguageFeatureRegistry; + + readonly documentFormattingEditProvider: LanguageFeatureRegistry; + + readonly documentRangeFormattingEditProvider: LanguageFeatureRegistry; + + readonly onTypeFormattingEditProvider: LanguageFeatureRegistry; + + // --- insights + + readonly documentSymbolProvider: LanguageFeatureRegistry; + + readonly inlayHintsProvider: LanguageFeatureRegistry; + + readonly colorProvider: LanguageFeatureRegistry; + + readonly codeLensProvider: LanguageFeatureRegistry; + + readonly signatureHelpProvider: LanguageFeatureRegistry; + + readonly hoverProvider: LanguageFeatureRegistry; + + readonly documentHighlightProvider: LanguageFeatureRegistry; + + // --- + + readonly documentRangeSemanticTokensProvider: LanguageFeatureRegistry; + + readonly documentSemanticTokensProvider: LanguageFeatureRegistry; + + readonly selectionRangeProvider: LanguageFeatureRegistry; + + readonly foldingRangeProvider: LanguageFeatureRegistry; + + readonly linkProvider: LanguageFeatureRegistry; + + // --- completions + + readonly inlineCompletionsProvider: LanguageFeatureRegistry; + + readonly completionProvider: LanguageFeatureRegistry; + + readonly linkedEditingRangeProvider: LanguageFeatureRegistry; + + // --- debug + + readonly inlineValuesProvider: LanguageFeatureRegistry; + + readonly evaluatableExpressionProvider: LanguageFeatureRegistry; +} diff --git a/src/vs/editor/common/services/languageFeaturesService.ts b/src/vs/editor/common/services/languageFeaturesService.ts new file mode 100644 index 00000000000..c242039d068 --- /dev/null +++ b/src/vs/editor/common/services/languageFeaturesService.ts @@ -0,0 +1,70 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { CodeActionProvider, CodeLensProvider, CompletionItemProvider, DeclarationProvider, DefinitionProvider, DocumentColorProvider, DocumentFormattingEditProvider, DocumentHighlightProvider, DocumentRangeFormattingEditProvider, DocumentRangeSemanticTokensProvider, DocumentSemanticTokensProvider, DocumentSymbolProvider, EvaluatableExpressionProvider, FoldingRangeProvider, HoverProvider, ImplementationProvider, InlayHintsProvider, InlineCompletionsProvider, InlineValuesProvider, LinkedEditingRangeProvider, LinkProvider, OnTypeFormattingEditProvider, ReferenceProvider, RenameProvider, SelectionRangeProvider, SignatureHelpProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; + +export class LanguageFeaturesService implements ILanguageFeaturesService { + + declare _serviceBrand: undefined; + + readonly referenceProvider = new LanguageFeatureRegistry(); + + readonly renameProvider = new LanguageFeatureRegistry(); + + readonly codeActionProvider = new LanguageFeatureRegistry(); + + readonly definitionProvider = new LanguageFeatureRegistry(); + + readonly typeDefinitionProvider = new LanguageFeatureRegistry(); + + readonly declarationProvider = new LanguageFeatureRegistry(); + + readonly implementationProvider = new LanguageFeatureRegistry(); + + readonly documentSymbolProvider = new LanguageFeatureRegistry(); + + readonly inlayHintsProvider = new LanguageFeatureRegistry(); + + readonly colorProvider = new LanguageFeatureRegistry(); + + readonly codeLensProvider = new LanguageFeatureRegistry(); + + readonly documentFormattingEditProvider = new LanguageFeatureRegistry(); + + readonly documentRangeFormattingEditProvider = new LanguageFeatureRegistry(); + + readonly onTypeFormattingEditProvider = new LanguageFeatureRegistry(); + + readonly signatureHelpProvider = new LanguageFeatureRegistry(); + + readonly hoverProvider = new LanguageFeatureRegistry(); + + readonly documentHighlightProvider = new LanguageFeatureRegistry(); + + readonly selectionRangeProvider = new LanguageFeatureRegistry(); + + readonly foldingRangeProvider = new LanguageFeatureRegistry(); + + readonly linkProvider = new LanguageFeatureRegistry(); + + readonly inlineCompletionsProvider = new LanguageFeatureRegistry(); + + readonly completionProvider = new LanguageFeatureRegistry(); + + readonly linkedEditingRangeProvider = new LanguageFeatureRegistry(); + + readonly inlineValuesProvider = new LanguageFeatureRegistry(); + + readonly evaluatableExpressionProvider = new LanguageFeatureRegistry(); + + readonly documentRangeSemanticTokensProvider = new LanguageFeatureRegistry(); + + readonly documentSemanticTokensProvider = new LanguageFeatureRegistry(); +} + +registerSingleton(ILanguageFeaturesService, LanguageFeaturesService, true); diff --git a/src/vs/editor/common/services/languageService.ts b/src/vs/editor/common/services/languageService.ts index 9906483bee7..1ca2505b7c2 100644 --- a/src/vs/editor/common/services/languageService.ts +++ b/src/vs/editor/common/services/languageService.ts @@ -7,7 +7,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { LanguagesRegistry } from 'vs/editor/common/services/languagesRegistry'; -import { ILanguageNameIdPair, ILanguageSelection, ILanguageService, ILanguageIcon } from 'vs/editor/common/services/language'; +import { ILanguageNameIdPair, ILanguageSelection, ILanguageService, ILanguageIcon } from 'vs/editor/common/languages/language'; import { firstOrDefault } from 'vs/base/common/arrays'; import { ILanguageIdCodec, TokenizationRegistry } from 'vs/editor/common/languages'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; diff --git a/src/vs/editor/common/services/languagesRegistry.ts b/src/vs/editor/common/services/languagesRegistry.ts index d592ffe0099..038df418860 100644 --- a/src/vs/editor/common/services/languagesRegistry.ts +++ b/src/vs/editor/common/services/languagesRegistry.ts @@ -12,7 +12,7 @@ import { clearLanguageAssociations, getMimeTypes, registerLanguageAssociation } import { URI } from 'vs/base/common/uri'; import { ILanguageIdCodec, LanguageId } from 'vs/editor/common/languages'; import { ModesRegistry, PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageExtensionPoint, ILanguageNameIdPair, ILanguageIcon } from 'vs/editor/common/services/language'; +import { ILanguageExtensionPoint, ILanguageNameIdPair, ILanguageIcon } from 'vs/editor/common/languages/language'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -74,10 +74,10 @@ export class LanguagesRegistry extends Disposable { private readonly _warnOnOverwrite: boolean; public readonly languageIdCodec: LanguageIdCodec; private _dynamicLanguages: ILanguageExtensionPoint[]; - private _languages: { [id: string]: IResolvedLanguage; }; - private _mimeTypesMap: { [mimeType: string]: string; }; - private _nameMap: { [name: string]: string; }; - private _lowercaseNameMap: { [name: string]: string; }; + private _languages: { [id: string]: IResolvedLanguage }; + private _mimeTypesMap: { [mimeType: string]: string }; + private _nameMap: { [name: string]: string }; + private _lowercaseNameMap: { [name: string]: string }; constructor(useModesRegistry = true, warnOnOverwrite = false) { super(); diff --git a/src/vs/editor/common/services/markerDecorationsService.ts b/src/vs/editor/common/services/markerDecorationsService.ts index 7b5f48a39c6..a47cd1c9b93 100644 --- a/src/vs/editor/common/services/markerDecorationsService.ts +++ b/src/vs/editor/common/services/markerDecorationsService.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { IModelDeltaDecoration, ITextModel, IModelDecorationOptions, TrackedRangeStickiness, OverviewRulerLane, IModelDecoration, MinimapPosition, IModelDecorationMinimapOptions } from 'vs/editor/common/model'; import { ClassName } from 'vs/editor/common/model/intervalTree'; import { themeColorFromId, ThemeColor } from 'vs/platform/theme/common/themeService'; -import { overviewRulerWarning, overviewRulerInfo, overviewRulerError } from 'vs/editor/common/view/editorColorRegistry'; +import { overviewRulerWarning, overviewRulerInfo, overviewRulerError } from 'vs/editor/common/core/editorColorRegistry'; import { IModelService } from 'vs/editor/common/services/model'; import { Range } from 'vs/editor/common/core/range'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markerDecorations'; diff --git a/src/vs/editor/common/services/model.ts b/src/vs/editor/common/services/model.ts index 8133aef3004..037ac0ca270 100644 --- a/src/vs/editor/common/services/model.ts +++ b/src/vs/editor/common/services/model.ts @@ -6,7 +6,7 @@ import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { ITextBufferFactory, ITextModel, ITextModelCreationOptions } from 'vs/editor/common/model'; -import { ILanguageSelection } from 'vs/editor/common/services/language'; +import { ILanguageSelection } from 'vs/editor/common/languages/language'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { DocumentSemanticTokensProvider, DocumentRangeSemanticTokensProvider } from 'vs/editor/common/languages'; import { SemanticTokensProviderStyling } from 'vs/editor/common/services/semanticTokensProviderStyling'; @@ -38,11 +38,5 @@ export interface IModelService { onModelRemoved: Event; - onModelLanguageChanged: Event<{ model: ITextModel; oldLanguageId: string; }>; -} - -export function shouldSynchronizeModel(model: ITextModel): boolean { - return ( - !model.isTooLargeForSyncing() && !model.isForSimpleWidget - ); + onModelLanguageChanged: Event<{ model: ITextModel; oldLanguageId: string }>; } diff --git a/src/vs/editor/common/services/modelService.ts b/src/vs/editor/common/services/modelService.ts index e04e2f60bd3..6af5b0c879c 100644 --- a/src/vs/editor/common/services/modelService.ts +++ b/src/vs/editor/common/services/modelService.ts @@ -8,15 +8,15 @@ import { Disposable, IDisposable, DisposableStore, dispose } from 'vs/base/commo import * as platform from 'vs/base/common/platform'; import * as errors from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; -import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; -import { DefaultEndOfLine, EndOfLinePreference, EndOfLineSequence, IIdentifiedSingleEditOperation, ITextBuffer, ITextBufferFactory, ITextModel, ITextModelCreationOptions } from 'vs/editor/common/model'; +import { DefaultEndOfLine, EndOfLinePreference, EndOfLineSequence, ITextBuffer, ITextBufferFactory, ITextModel, ITextModelCreationOptions } from 'vs/editor/common/model'; import { TextModel, createTextBuffer } from 'vs/editor/common/model/textModel'; -import { IModelLanguageChangedEvent, IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import { DocumentSemanticTokensProviderRegistry, DocumentSemanticTokensProvider, SemanticTokens, SemanticTokensEdits } from 'vs/editor/common/languages'; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/core/textModelDefaults'; +import { IModelLanguageChangedEvent, IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; +import { DocumentSemanticTokensProvider, SemanticTokens, SemanticTokensEdits } from 'vs/editor/common/languages'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageSelection, ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageSelection, ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService, DocumentTokensProvider } from 'vs/editor/common/services/model'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfiguration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -32,6 +32,10 @@ import { SemanticTokensProviderStyling, toMultilineTokens2 } from 'vs/editor/com import { getDocumentSemanticTokens, hasDocumentSemanticTokensProvider, isSemanticTokens, isSemanticTokensEdits } from 'vs/editor/common/services/getSemanticTokens'; import { equals } from 'vs/base/common/objects'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { StopWatch } from 'vs/base/common/stopwatch'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; export interface IEditorSemanticHighlightingOptions { enabled: true | false | 'configuredByTheme'; @@ -143,15 +147,15 @@ export class ModelService extends Disposable implements IModelService { private readonly _onModelRemoved: Emitter = this._register(new Emitter()); public readonly onModelRemoved: Event = this._onModelRemoved.event; - private readonly _onModelModeChanged = this._register(new Emitter<{ model: ITextModel; oldLanguageId: string; }>()); + private readonly _onModelModeChanged = this._register(new Emitter<{ model: ITextModel; oldLanguageId: string }>()); public readonly onModelLanguageChanged = this._onModelModeChanged.event; - private _modelCreationOptionsByLanguageAndResource: { [languageAndResource: string]: ITextModelCreationOptions; }; + private _modelCreationOptionsByLanguageAndResource: { [languageAndResource: string]: ITextModelCreationOptions }; /** * All the models known in the system. */ - private readonly _models: { [modelId: string]: ModelData; }; + private readonly _models: { [modelId: string]: ModelData }; private readonly _disposedModels: Map; private _disposedModelsHeapSize: number; private readonly _semanticStyling: SemanticStyling; @@ -163,7 +167,9 @@ export class ModelService extends Disposable implements IModelService { @ILogService private readonly _logService: ILogService, @IUndoRedoService private readonly _undoRedoService: IUndoRedoService, @ILanguageService private readonly _languageService: ILanguageService, - @ILanguageConfigurationService private readonly _languageConfigurationService: ILanguageConfigurationService + @ILanguageConfigurationService private readonly _languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeatureDebounceService private readonly _languageFeatureDebounceService: ILanguageFeatureDebounceService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); this._modelCreationOptionsByLanguageAndResource = Object.create(null); @@ -175,7 +181,7 @@ export class ModelService extends Disposable implements IModelService { this._register(this._configurationService.onDidChangeConfiguration(() => this._updateModelOptions())); this._updateModelOptions(); - this._register(new SemanticColoringFeature(this, this._themeService, this._configurationService, this._semanticStyling)); + this._register(new SemanticColoringFeature(this._semanticStyling, this, this._themeService, this._configurationService, this._languageFeatureDebounceService, languageFeaturesService)); } private static _readModelOptions(config: IRawConfig, isForSimpleWidget: boolean): ITextModelCreationOptions { @@ -466,7 +472,7 @@ export class ModelService extends Disposable implements IModelService { /** * Compute edits to bring `model` to the state of `textSource`. */ - public static _computeEdits(model: ITextModel, textBuffer: ITextBuffer): IIdentifiedSingleEditOperation[] { + public static _computeEdits(model: ITextModel, textBuffer: ITextBuffer): ISingleEditOperation[] { const modelLineCount = model.getLineCount(); const textBufferLineCount = textBuffer.getLineCount(); const commonPrefix = this._commonPrefix(model, modelLineCount, 1, textBuffer, textBufferLineCount, 1); @@ -652,13 +658,20 @@ class SemanticColoringFeature extends Disposable { private readonly _watchers: Record; private readonly _semanticStyling: SemanticStyling; - constructor(modelService: IModelService, themeService: IThemeService, configurationService: IConfigurationService, semanticStyling: SemanticStyling) { + constructor( + semanticStyling: SemanticStyling, + @IModelService modelService: IModelService, + @IThemeService themeService: IThemeService, + @IConfigurationService configurationService: IConfigurationService, + @ILanguageFeatureDebounceService languageFeatureDebounceService: ILanguageFeatureDebounceService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, + ) { super(); this._watchers = Object.create(null); this._semanticStyling = semanticStyling; const register = (model: ITextModel) => { - this._watchers[model.uri.toString()] = new ModelSemanticColoring(model, themeService, this._semanticStyling); + this._watchers[model.uri.toString()] = new ModelSemanticColoring(model, this._semanticStyling, themeService, languageFeatureDebounceService, languageFeaturesService); }; const deregister = (model: ITextModel, modelSemanticColoring: ModelSemanticColoring) => { modelSemanticColoring.dispose(); @@ -736,30 +749,41 @@ class SemanticTokensResponse { export class ModelSemanticColoring extends Disposable { - public static FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY = 300; + public static REQUEST_MIN_DELAY = 300; + public static REQUEST_MAX_DELAY = 2000; private _isDisposed: boolean; private readonly _model: ITextModel; private readonly _semanticStyling: SemanticStyling; + private readonly _provider: LanguageFeatureRegistry; + private readonly _debounceInformation: IFeatureDebounceInformation; private readonly _fetchDocumentSemanticTokens: RunOnceScheduler; private _currentDocumentResponse: SemanticTokensResponse | null; private _currentDocumentRequestCancellationTokenSource: CancellationTokenSource | null; private _documentProvidersChangeListeners: IDisposable[]; - constructor(model: ITextModel, themeService: IThemeService, stylingProvider: SemanticStyling) { + constructor( + model: ITextModel, + stylingProvider: SemanticStyling, + @IThemeService themeService: IThemeService, + @ILanguageFeatureDebounceService languageFeatureDebounceService: ILanguageFeatureDebounceService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, + ) { super(); this._isDisposed = false; this._model = model; this._semanticStyling = stylingProvider; - this._fetchDocumentSemanticTokens = this._register(new RunOnceScheduler(() => this._fetchDocumentSemanticTokensNow(), ModelSemanticColoring.FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY)); + this._provider = languageFeaturesService.documentSemanticTokensProvider; + this._debounceInformation = languageFeatureDebounceService.for(this._provider, 'DocumentSemanticTokens', { min: ModelSemanticColoring.REQUEST_MIN_DELAY, max: ModelSemanticColoring.REQUEST_MAX_DELAY }); + this._fetchDocumentSemanticTokens = this._register(new RunOnceScheduler(() => this._fetchDocumentSemanticTokensNow(), ModelSemanticColoring.REQUEST_MIN_DELAY)); this._currentDocumentResponse = null; this._currentDocumentRequestCancellationTokenSource = null; this._documentProvidersChangeListeners = []; this._register(this._model.onDidChangeContent(() => { if (!this._fetchDocumentSemanticTokens.isScheduled()) { - this._fetchDocumentSemanticTokens.schedule(); + this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); } })); this._register(this._model.onDidChangeLanguage(() => { @@ -775,25 +799,26 @@ export class ModelSemanticColoring extends Disposable { this._setDocumentSemanticTokens(null, null, null, []); this._fetchDocumentSemanticTokens.schedule(0); })); + const bindDocumentChangeListeners = () => { dispose(this._documentProvidersChangeListeners); this._documentProvidersChangeListeners = []; - for (const provider of DocumentSemanticTokensProviderRegistry.all(model)) { + for (const provider of this._provider.all(model)) { if (typeof provider.onDidChange === 'function') { this._documentProvidersChangeListeners.push(provider.onDidChange(() => this._fetchDocumentSemanticTokens.schedule(0))); } } }; bindDocumentChangeListeners(); - this._register(DocumentSemanticTokensProviderRegistry.onDidChange(() => { + this._register(this._provider.onDidChange(() => { bindDocumentChangeListeners(); - this._fetchDocumentSemanticTokens.schedule(); + this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); })); this._register(themeService.onDidColorThemeChange(_ => { // clear out existing tokens this._setDocumentSemanticTokens(null, null, null, []); - this._fetchDocumentSemanticTokens.schedule(); + this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); })); this._fetchDocumentSemanticTokens.schedule(0); @@ -820,7 +845,7 @@ export class ModelSemanticColoring extends Disposable { return; } - if (!hasDocumentSemanticTokensProvider(this._model)) { + if (!hasDocumentSemanticTokensProvider(this._provider, this._model)) { // there is no provider if (this._currentDocumentResponse) { // there are semantic tokens set @@ -832,7 +857,7 @@ export class ModelSemanticColoring extends Disposable { const cancellationTokenSource = new CancellationTokenSource(); const lastProvider = this._currentDocumentResponse ? this._currentDocumentResponse.provider : null; const lastResultId = this._currentDocumentResponse ? this._currentDocumentResponse.resultId || null : null; - const request = getDocumentSemanticTokens(this._model, lastProvider, lastResultId, cancellationTokenSource.token); + const request = getDocumentSemanticTokens(this._provider, this._model, lastProvider, lastResultId, cancellationTokenSource.token); this._currentDocumentRequestCancellationTokenSource = cancellationTokenSource; const pendingChanges: IModelContentChangedEvent[] = []; @@ -840,7 +865,9 @@ export class ModelSemanticColoring extends Disposable { pendingChanges.push(e); }); + const sw = new StopWatch(false); request.then((res) => { + this._debounceInformation.update(this._model, sw.elapsed()); this._currentDocumentRequestCancellationTokenSource = null; contentChangeListener.dispose(); @@ -865,7 +892,7 @@ export class ModelSemanticColoring extends Disposable { if (pendingChanges.length > 0) { // More changes occurred while the request was running if (!this._fetchDocumentSemanticTokens.isScheduled()) { - this._fetchDocumentSemanticTokens.schedule(); + this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); } } }); @@ -881,7 +908,7 @@ export class ModelSemanticColoring extends Disposable { const currentResponse = this._currentDocumentResponse; const rescheduleIfNeeded = () => { if (pendingChanges.length > 0 && !this._fetchDocumentSemanticTokens.isScheduled()) { - this._fetchDocumentSemanticTokens.schedule(); + this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); } }; diff --git a/src/vs/editor/common/services/semanticTokensDto.ts b/src/vs/editor/common/services/semanticTokensDto.ts index 82fcef57c73..652ae69b65a 100644 --- a/src/vs/editor/common/services/semanticTokensDto.ts +++ b/src/vs/editor/common/services/semanticTokensDto.ts @@ -15,7 +15,7 @@ export interface IFullSemanticTokensDto { export interface IDeltaSemanticTokensDto { id: number; type: 'delta'; - deltas: { start: number; deleteCount: number; data?: Uint32Array; }[]; + deltas: { start: number; deleteCount: number; data?: Uint32Array }[]; } export type ISemanticTokensDto = IFullSemanticTokensDto | IDeltaSemanticTokensDto; @@ -133,7 +133,7 @@ export function decodeSemanticTokensDto(_buff: VSBuffer): ISemanticTokensDto { }; } const deltaCount = src[offset++]; - const deltas: { start: number; deleteCount: number; data?: Uint32Array; }[] = []; + const deltas: { start: number; deleteCount: number; data?: Uint32Array }[] = []; for (let i = 0; i < deltaCount; i++) { const start = src[offset++]; const deleteCount = src[offset++]; diff --git a/src/vs/editor/common/services/semanticTokensProviderStyling.ts b/src/vs/editor/common/services/semanticTokensProviderStyling.ts index 6e7ade897b8..1dfa88f7c15 100644 --- a/src/vs/editor/common/services/semanticTokensProviderStyling.ts +++ b/src/vs/editor/common/services/semanticTokensProviderStyling.ts @@ -6,8 +6,8 @@ import { SemanticTokensLegend, TokenMetadata, FontStyle, MetadataConsts, SemanticTokens } from 'vs/editor/common/languages'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; -import { SparseMultilineTokens } from 'vs/editor/common/model/tokens/sparseMultilineTokens'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { SparseMultilineTokens } from 'vs/editor/common/tokens/sparseMultilineTokens'; +import { ILanguageService } from 'vs/editor/common/languages/language'; export const enum SemanticTokensProviderStylingConstants { NO_STYLING = 0b01111111111111111111111111111111 diff --git a/src/vs/editor/common/services/textResourceConfigurationService.ts b/src/vs/editor/common/services/textResourceConfigurationService.ts index 6d1c05ad0a7..41008567552 100644 --- a/src/vs/editor/common/services/textResourceConfigurationService.ts +++ b/src/vs/editor/common/services/textResourceConfigurationService.ts @@ -7,7 +7,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IPosition, Position } from 'vs/editor/common/core/position'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { ITextResourceConfigurationService, ITextResourceConfigurationChangeEvent } from 'vs/editor/common/services/textResourceConfiguration'; import { IConfigurationService, ConfigurationTarget, IConfigurationValue, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/editor/common/languages/unicodeTextModelHighlighter.ts b/src/vs/editor/common/services/unicodeTextModelHighlighter.ts similarity index 99% rename from src/vs/editor/common/languages/unicodeTextModelHighlighter.ts rename to src/vs/editor/common/services/unicodeTextModelHighlighter.ts index 379d2d1e15b..d4c28d4dd18 100644 --- a/src/vs/editor/common/languages/unicodeTextModelHighlighter.ts +++ b/src/vs/editor/common/services/unicodeTextModelHighlighter.ts @@ -139,7 +139,7 @@ export type UnicodeHighlighterReason = { } | { kind: UnicodeHighlighterReasonKind.Invisible; } | { - kind: UnicodeHighlighterReasonKind.NonBasicAscii + kind: UnicodeHighlighterReasonKind.NonBasicAscii; }; class CodePointHighlighter { diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index d6a09a46a65..01d9217545a 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -366,7 +366,6 @@ export enum InjectedTextCursorStops { } export enum InlayHintKind { - Other = 0, Type = 1, Parameter = 2 } @@ -692,6 +691,21 @@ export enum OverviewRulerLane { Full = 7 } +export enum PositionAffinity { + /** + * Prefers the left most position. + */ + Left = 0, + /** + * Prefers the right most position. + */ + Right = 1, + /** + * No preference. + */ + None = 2 +} + export enum RenderLineNumbersType { Off = 0, On = 1, diff --git a/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairs.ts b/src/vs/editor/common/textModelBracketPairs.ts similarity index 100% rename from src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairs.ts rename to src/vs/editor/common/textModelBracketPairs.ts diff --git a/src/vs/editor/common/model/textModelEvents.ts b/src/vs/editor/common/textModelEvents.ts similarity index 100% rename from src/vs/editor/common/model/textModelEvents.ts rename to src/vs/editor/common/textModelEvents.ts diff --git a/src/vs/editor/common/textModelGuides.ts b/src/vs/editor/common/textModelGuides.ts new file mode 100644 index 00000000000..5d36491e391 --- /dev/null +++ b/src/vs/editor/common/textModelGuides.ts @@ -0,0 +1,60 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IPosition } from 'vs/editor/common/core/position'; + +export interface IGuidesTextModelPart { + /** + * @internal + */ + getActiveIndentGuide(lineNumber: number, minLineNumber: number, maxLineNumber: number): IActiveIndentGuideInfo; + + /** + * @internal + */ + getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[]; + + /** + * @internal + */ + getLinesBracketGuides(startLineNumber: number, endLineNumber: number, activePosition: IPosition | null, options: BracketGuideOptions): IndentGuide[][]; +} + +export interface IActiveIndentGuideInfo { + startLineNumber: number; + endLineNumber: number; + indent: number; +} + +export enum HorizontalGuidesState { + Disabled, + EnabledForActive, + Enabled +} + +export interface BracketGuideOptions { + includeInactive: boolean; + horizontalGuides: HorizontalGuidesState; + highlightActive: boolean; +} + +export class IndentGuide { + constructor( + public readonly visibleColumn: number, + public readonly className: string, + /** + * If set, this indent guide is a horizontal guide (no vertical part). + * It starts at visibleColumn and continues until endColumn. + */ + public readonly horizontalLine: IndentGuideHorizontalLine | null, + ) { } +} + +export class IndentGuideHorizontalLine { + constructor( + public readonly top: boolean, + public readonly endColumn: number, + ) { } +} diff --git a/src/vs/editor/common/languages/tokenizationRegistry.ts b/src/vs/editor/common/tokenizationRegistry.ts similarity index 100% rename from src/vs/editor/common/languages/tokenizationRegistry.ts rename to src/vs/editor/common/tokenizationRegistry.ts diff --git a/src/vs/editor/common/model/tokens/contiguousMultilineTokens.ts b/src/vs/editor/common/tokens/contiguousMultilineTokens.ts similarity index 97% rename from src/vs/editor/common/model/tokens/contiguousMultilineTokens.ts rename to src/vs/editor/common/tokens/contiguousMultilineTokens.ts index b54299359df..a8860866aef 100644 --- a/src/vs/editor/common/model/tokens/contiguousMultilineTokens.ts +++ b/src/vs/editor/common/tokens/contiguousMultilineTokens.ts @@ -7,8 +7,8 @@ import * as arrays from 'vs/base/common/arrays'; import { readUInt32BE, writeUInt32BE } from 'vs/base/common/buffer'; import { Position } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; -import { countEOL } from 'vs/editor/common/model/pieceTreeTextBuffer/eolCounter'; -import { ContiguousTokensEditing } from 'vs/editor/common/model/tokens/contiguousTokensEditing'; +import { countEOL } from 'vs/editor/common/core/eolCounter'; +import { ContiguousTokensEditing } from 'vs/editor/common/tokens/contiguousTokensEditing'; /** * Represents contiguous tokens over a contiguous range of lines. diff --git a/src/vs/editor/common/model/tokens/contiguousMultilineTokensBuilder.ts b/src/vs/editor/common/tokens/contiguousMultilineTokensBuilder.ts similarity index 95% rename from src/vs/editor/common/model/tokens/contiguousMultilineTokensBuilder.ts rename to src/vs/editor/common/tokens/contiguousMultilineTokensBuilder.ts index 809c98afedf..0c46da70b0a 100644 --- a/src/vs/editor/common/model/tokens/contiguousMultilineTokensBuilder.ts +++ b/src/vs/editor/common/tokens/contiguousMultilineTokensBuilder.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { readUInt32BE, writeUInt32BE } from 'vs/base/common/buffer'; -import { ContiguousMultilineTokens } from 'vs/editor/common/model/tokens/contiguousMultilineTokens'; +import { ContiguousMultilineTokens } from 'vs/editor/common/tokens/contiguousMultilineTokens'; export class ContiguousMultilineTokensBuilder { diff --git a/src/vs/editor/common/model/tokens/contiguousTokensEditing.ts b/src/vs/editor/common/tokens/contiguousTokensEditing.ts similarity index 98% rename from src/vs/editor/common/model/tokens/contiguousTokensEditing.ts rename to src/vs/editor/common/tokens/contiguousTokensEditing.ts index cd91aa5f678..1ccb5b5ba72 100644 --- a/src/vs/editor/common/model/tokens/contiguousTokensEditing.ts +++ b/src/vs/editor/common/tokens/contiguousTokensEditing.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; export const EMPTY_LINE_TOKENS = (new Uint32Array(0)).buffer; diff --git a/src/vs/editor/common/model/tokens/contiguousTokensStore.ts b/src/vs/editor/common/tokens/contiguousTokensStore.ts similarity index 98% rename from src/vs/editor/common/model/tokens/contiguousTokensStore.ts rename to src/vs/editor/common/tokens/contiguousTokensStore.ts index ee746d0f7a9..86f13cfeb5c 100644 --- a/src/vs/editor/common/model/tokens/contiguousTokensStore.ts +++ b/src/vs/editor/common/tokens/contiguousTokensStore.ts @@ -6,8 +6,8 @@ import * as arrays from 'vs/base/common/arrays'; import { Position } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; -import { ContiguousTokensEditing, EMPTY_LINE_TOKENS, toUint32Array } from 'vs/editor/common/model/tokens/contiguousTokensEditing'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { ContiguousTokensEditing, EMPTY_LINE_TOKENS, toUint32Array } from 'vs/editor/common/tokens/contiguousTokensEditing'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { ColorId, FontStyle, ILanguageIdCodec, LanguageId, MetadataConsts, StandardTokenType, TokenMetadata } from 'vs/editor/common/languages'; /** diff --git a/src/vs/editor/common/model/tokens/lineTokens.ts b/src/vs/editor/common/tokens/lineTokens.ts similarity index 95% rename from src/vs/editor/common/model/tokens/lineTokens.ts rename to src/vs/editor/common/tokens/lineTokens.ts index 8d55228bbe3..b950acf4768 100644 --- a/src/vs/editor/common/model/tokens/lineTokens.ts +++ b/src/vs/editor/common/tokens/lineTokens.ts @@ -15,6 +15,8 @@ export interface IViewLineTokens { getPresentation(tokenIndex: number): ITokenPresentation; findTokenIndexAtOffset(offset: number): number; getLineContent(): string; + getMetadata(tokenIndex: number): number; + getLanguageId(tokenIndex: number): string; } export class LineTokens implements IViewLineTokens { @@ -182,7 +184,7 @@ export class LineTokens implements IViewLineTokens { * @pure * @param insertTokens Must be sorted by offset. */ - public withInserted(insertTokens: { offset: number, text: string, tokenMetadata: number }[]): LineTokens { + public withInserted(insertTokens: { offset: number; text: string; tokenMetadata: number }[]): LineTokens { if (insertTokens.length === 0) { return this; } @@ -253,6 +255,14 @@ class SliceLineTokens implements IViewLineTokens { } } + public getMetadata(tokenIndex: number): number { + return this._source.getMetadata(this._firstTokenIndex + tokenIndex); + } + + public getLanguageId(tokenIndex: number): string { + return this._source.getLanguageId(this._firstTokenIndex + tokenIndex); + } + public getLineContent(): string { return this._source.getLineContent().substring(this._startOffset, this._endOffset); } diff --git a/src/vs/editor/common/model/tokens/sparseMultilineTokens.ts b/src/vs/editor/common/tokens/sparseMultilineTokens.ts similarity index 99% rename from src/vs/editor/common/model/tokens/sparseMultilineTokens.ts rename to src/vs/editor/common/tokens/sparseMultilineTokens.ts index 8468a05c26c..2747890b5c3 100644 --- a/src/vs/editor/common/model/tokens/sparseMultilineTokens.ts +++ b/src/vs/editor/common/tokens/sparseMultilineTokens.ts @@ -6,7 +6,7 @@ import { CharCode } from 'vs/base/common/charCode'; import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; -import { countEOL } from 'vs/editor/common/model/pieceTreeTextBuffer/eolCounter'; +import { countEOL } from 'vs/editor/common/core/eolCounter'; /** * Represents sparse tokens over a contiguous range of lines. diff --git a/src/vs/editor/common/model/tokens/sparseTokensStore.ts b/src/vs/editor/common/tokens/sparseTokensStore.ts similarity index 97% rename from src/vs/editor/common/model/tokens/sparseTokensStore.ts rename to src/vs/editor/common/tokens/sparseTokensStore.ts index 53e27f5e671..578bf2eecfa 100644 --- a/src/vs/editor/common/model/tokens/sparseTokensStore.ts +++ b/src/vs/editor/common/tokens/sparseTokensStore.ts @@ -5,8 +5,8 @@ import * as arrays from 'vs/base/common/arrays'; import { IRange, Range } from 'vs/editor/common/core/range'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; -import { SparseMultilineTokens } from 'vs/editor/common/model/tokens/sparseMultilineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; +import { SparseMultilineTokens } from 'vs/editor/common/tokens/sparseMultilineTokens'; import { ILanguageIdCodec, MetadataConsts } from 'vs/editor/common/languages'; /** @@ -51,7 +51,7 @@ export class SparseTokensStore { range = _range.plusRange(_firstRange).plusRange(_lastRange); } - let insertPosition: { index: number; } | null = null; + let insertPosition: { index: number } | null = null; for (let i = 0, len = this._pieces.length; i < len; i++) { const piece = this._pieces[i]; if (piece.endLineNumber < range.startLineNumber) { diff --git a/src/vs/editor/common/viewModel/viewEventHandler.ts b/src/vs/editor/common/viewEventHandler.ts similarity index 98% rename from src/vs/editor/common/viewModel/viewEventHandler.ts rename to src/vs/editor/common/viewEventHandler.ts index ce58837d964..a80b59c50ea 100644 --- a/src/vs/editor/common/viewModel/viewEventHandler.ts +++ b/src/vs/editor/common/viewEventHandler.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import * as viewEvents from 'vs/editor/common/viewEvents'; export class ViewEventHandler extends Disposable { diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/viewEvents.ts similarity index 98% rename from src/vs/editor/common/view/viewEvents.ts rename to src/vs/editor/common/viewEvents.ts index fd0a12625b9..a4ed90c3992 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/viewEvents.ts @@ -8,7 +8,8 @@ import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ScrollType } from 'vs/editor/common/editorCommon'; -import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelDecorationsChangedEvent } from 'vs/editor/common/textModelEvents'; +import { IColorTheme } from 'vs/platform/theme/common/themeService'; export const enum ViewEventType { ViewCompositionStart, @@ -256,6 +257,10 @@ export class ViewScrollChangedEvent { export class ViewThemeChangedEvent { public readonly type = ViewEventType.ViewThemeChanged; + + constructor( + public readonly theme: IColorTheme + ) { } } export class ViewTokensChangedEvent { @@ -273,7 +278,7 @@ export class ViewTokensChangedEvent { readonly toLineNumber: number; }[]; - constructor(ranges: { fromLineNumber: number; toLineNumber: number; }[]) { + constructor(ranges: { fromLineNumber: number; toLineNumber: number }[]) { this.ranges = ranges; } } diff --git a/src/vs/editor/common/viewLayout/lineDecorations.ts b/src/vs/editor/common/viewLayout/lineDecorations.ts index eb5c869bc29..36519fa2875 100644 --- a/src/vs/editor/common/viewLayout/lineDecorations.ts +++ b/src/vs/editor/common/viewLayout/lineDecorations.ts @@ -5,7 +5,7 @@ import * as strings from 'vs/base/common/strings'; import { Constants } from 'vs/base/common/uint'; -import { InlineDecoration, InlineDecorationType } from 'vs/editor/common/viewModel/viewModel'; +import { InlineDecoration, InlineDecorationType } from 'vs/editor/common/viewModel'; import { LinePartMetadata } from 'vs/editor/common/viewLayout/viewLineRenderer'; export class LineDecoration { diff --git a/src/vs/editor/common/viewLayout/linesLayout.ts b/src/vs/editor/common/viewLayout/linesLayout.ts index 0bfc77d4cfb..01e2d26cf5a 100644 --- a/src/vs/editor/common/viewLayout/linesLayout.ts +++ b/src/vs/editor/common/viewLayout/linesLayout.ts @@ -3,27 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import { IViewWhitespaceViewportData } from 'vs/editor/common/viewModel/viewModel'; +import { IEditorWhitespace, IPartialViewLinesViewportData, IViewWhitespaceViewportData, IWhitespaceChangeAccessor } from 'vs/editor/common/viewModel'; import * as strings from 'vs/base/common/strings'; -export interface IEditorWhitespace { - readonly id: string; - readonly afterLineNumber: number; - readonly height: number; -} - -/** - * An accessor that allows for whtiespace to be added, removed or changed in bulk. - */ -export interface IWhitespaceChangeAccessor { - insertWhitespace(afterLineNumber: number, ordinal: number, heightInPx: number, minWidth: number): string; - changeOneWhitespace(id: string, newAfterLineNumber: number, newHeight: number): void; - removeWhitespace(id: string): void; -} - -interface IPendingChange { id: string; newAfterLineNumber: number; newHeight: number; } -interface IPendingRemove { id: string; } +interface IPendingChange { id: string; newAfterLineNumber: number; newHeight: number } +interface IPendingRemove { id: string } class PendingChanges { private _hasPending: boolean; diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index 52b3d920043..f6c1de10eeb 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -9,10 +9,9 @@ import { IScrollPosition, ScrollEvent, Scrollable, ScrollbarVisibility, INewScro import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; -import { LinesLayout, IEditorWhitespace, IWhitespaceChangeAccessor } from 'vs/editor/common/viewLayout/linesLayout'; -import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import { IViewLayout, IViewWhitespaceViewportData, Viewport } from 'vs/editor/common/viewModel/viewModel'; -import { ContentSizeChangedEvent } from 'vs/editor/common/viewModel/viewModelEventDispatcher'; +import { LinesLayout } from 'vs/editor/common/viewLayout/linesLayout'; +import { IEditorWhitespace, IPartialViewLinesViewportData, IViewLayout, IViewWhitespaceViewportData, IWhitespaceChangeAccessor, Viewport } from 'vs/editor/common/viewModel'; +import { ContentSizeChangedEvent } from 'vs/editor/common/viewModelEventDispatcher'; const SMOOTH_SCROLLING_TIME = 125; @@ -83,7 +82,11 @@ class EditorScrollable extends Disposable { constructor(smoothScrollDuration: number, scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable) { super(); this._dimensions = new EditorScrollDimensions(0, 0, 0, 0); - this._scrollable = this._register(new Scrollable(smoothScrollDuration, scheduleAtNextAnimationFrame)); + this._scrollable = this._register(new Scrollable({ + forceIntegerValues: true, + smoothScrollDuration, + scheduleAtNextAnimationFrame + })); this.onDidScroll = this._scrollable.onScroll; } @@ -339,7 +342,7 @@ export class ViewLayout extends Disposable implements IViewLayout { // ---- view state - public saveState(): { scrollTop: number; scrollTopWithoutViewZones: number; scrollLeft: number; } { + public saveState(): { scrollTop: number; scrollTopWithoutViewZones: number; scrollLeft: number } { const currentScrollPosition = this._scrollable.getFutureScrollPosition(); const scrollTop = currentScrollPosition.scrollTop; const firstLineNumberInViewport = this._linesLayout.getLineNumberAtOrAfterVerticalOffset(scrollTop); @@ -351,7 +354,7 @@ export class ViewLayout extends Disposable implements IViewLayout { }; } - // ---- IVerticalLayoutProvider + // ---- public changeWhitespace(callback: (accessor: IWhitespaceChangeAccessor) => void): boolean { const hadAChange = this._linesLayout.changeWhitespace(callback); if (hadAChange) { @@ -402,7 +405,7 @@ export class ViewLayout extends Disposable implements IViewLayout { return this._linesLayout.getWhitespaces(); } - // ---- IScrollingProvider + // ---- public getContentWidth(): number { const scrollDimensions = this._scrollable.getScrollDimensions(); diff --git a/src/vs/editor/common/viewLayout/viewLineRenderer.ts b/src/vs/editor/common/viewLayout/viewLineRenderer.ts index 0c1c7baf26a..03de5d9989c 100644 --- a/src/vs/editor/common/viewLayout/viewLineRenderer.ts +++ b/src/vs/editor/common/viewLayout/viewLineRenderer.ts @@ -5,10 +5,10 @@ import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; -import { IViewLineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; import { IStringBuilder, createStringBuilder } from 'vs/editor/common/core/stringBuilder'; import { LineDecoration, LineDecorationsNormalizer } from 'vs/editor/common/viewLayout/lineDecorations'; -import { InlineDecorationType } from 'vs/editor/common/viewModel/viewModel'; +import { InlineDecorationType } from 'vs/editor/common/viewModel'; export const enum RenderWhitespace { None = 0, diff --git a/src/vs/editor/common/viewLayout/viewLinesViewportData.ts b/src/vs/editor/common/viewLayout/viewLinesViewportData.ts index 9a1771f236c..de06a61132e 100644 --- a/src/vs/editor/common/viewLayout/viewLinesViewportData.ts +++ b/src/vs/editor/common/viewLayout/viewLinesViewportData.ts @@ -5,38 +5,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IViewModel, IViewWhitespaceViewportData, ViewLineRenderingData, ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel'; - -export interface IPartialViewLinesViewportData { - /** - * Value to be substracted from `scrollTop` (in order to vertical offset numbers < 1MM) - */ - readonly bigNumbersDelta: number; - /** - * The first (partially) visible line number. - */ - readonly startLineNumber: number; - /** - * The last (partially) visible line number. - */ - readonly endLineNumber: number; - /** - * relativeVerticalOffset[i] is the `top` position for line at `i` + `startLineNumber`. - */ - readonly relativeVerticalOffset: number[]; - /** - * The centered line in the viewport. - */ - readonly centeredLineNumber: number; - /** - * The first completely visible line number. - */ - readonly completelyVisibleStartLineNumber: number; - /** - * The last completely visible line number. - */ - readonly completelyVisibleEndLineNumber: number; -} +import { IPartialViewLinesViewportData, IViewModel, IViewWhitespaceViewportData, ViewLineRenderingData, ViewModelDecoration } from 'vs/editor/common/viewModel'; /** * Contains all data needed to render at a specific viewport. diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel.ts similarity index 86% rename from src/vs/editor/common/viewModel/viewModel.ts rename to src/vs/editor/common/viewModel.ts index 3123af088a0..19fea69d49c 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel.ts @@ -5,20 +5,18 @@ import { IScrollPosition, Scrollable } from 'vs/base/common/scrollable'; import * as strings from 'vs/base/common/strings'; -import { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, ICursorSimpleModel, PartialCursorState } from 'vs/editor/common/controller/cursorCommon'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { IViewLineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, ICursorSimpleModel, PartialCursorState } from 'vs/editor/common/cursorCommon'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; +import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; import { IPosition, Position } from 'vs/editor/common/core/position'; -import { IRange, Range } from 'vs/editor/common/core/range'; +import { Range } from 'vs/editor/common/core/range'; import { INewScrollPosition, ScrollType } from 'vs/editor/common/editorCommon'; -import { EndOfLinePreference, IModelDecorationOptions, ITextModel, PositionAffinity, TextModelResolvedOptions } from 'vs/editor/common/model'; -import { BracketGuideOptions, IActiveIndentGuideInfo, IndentGuide } from 'vs/editor/common/model/guidesTextModelPart'; -import { EditorTheme } from 'vs/editor/common/view/viewContext'; -import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; -import { IEditorWhitespace, IWhitespaceChangeAccessor } from 'vs/editor/common/viewLayout/linesLayout'; -import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import { ILineBreaksComputer, InjectedText } from 'vs/editor/common/viewModel/modelLineProjectionData'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; +import { EndOfLinePreference, IModelDecorationOptions, ITextModel, PositionAffinity } from 'vs/editor/common/model'; +import { BracketGuideOptions, IActiveIndentGuideInfo, IndentGuide } from 'vs/editor/common/textModelGuides'; +import { EditorTheme } from 'vs/editor/common/editorTheme'; +import { VerticalRevealType } from 'vs/editor/common/viewEvents'; +import { ILineBreaksComputer, InjectedText } from 'vs/editor/common/modelLineProjectionData'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; export interface IViewModel extends ICursorSimpleModel { @@ -41,7 +39,6 @@ export interface IViewModel extends ICursorSimpleModel { setHasFocus(hasFocus: boolean): void; onCompositionStart(): void; onCompositionEnd(): void; - onDidColorThemeChange(): void; getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[]; getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData; @@ -50,7 +47,6 @@ export interface IViewModel extends ICursorSimpleModel { getCompletelyVisibleViewRange(): Range; getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range; - getTextModelOptions(): TextModelResolvedOptions; getLineCount(): number; getLineContent(lineNumber: number): string; getLineLength(lineNumber: number): number; @@ -62,26 +58,13 @@ export interface IViewModel extends ICursorSimpleModel { getLineFirstNonWhitespaceColumn(lineNumber: number): number; getLineLastNonWhitespaceColumn(lineNumber: number): number; getAllOverviewRulerDecorations(theme: EditorTheme): OverviewRulerDecorationsGroup[]; - invalidateOverviewRulerColorCache(): void; - invalidateMinimapColorCache(): void; getValueInRange(range: Range, eol: EndOfLinePreference): string; getInjectedTextAt(viewPosition: Position): InjectedText | null; - getModelLineMaxColumn(modelLineNumber: number): number; - validateModelPosition(modelPosition: IPosition): Position; - validateModelRange(range: IRange): Range; - deduceModelPositionRelativeToViewPosition(viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position; - getEOL(): string; getPlainTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[]; - getRichTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean): { html: string, mode: string } | null; - - //#region model - - pushStackElement(): void; - - //#endregion + getRichTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean): { html: string; mode: string } | null; createLineBreaksComputer(): ILineBreaksComputer; @@ -102,13 +85,7 @@ export interface IViewModel extends ICursorSimpleModel { //#endregion //#region viewLayout - getVerticalOffsetForLineNumber(viewLineNumber: number): number; - getScrollTop(): number; - setScrollTop(newScrollTop: number, scrollType: ScrollType): void; - setScrollPosition(position: INewScrollPosition, type: ScrollType): void; - deltaScrollNow(deltaScrollLeft: number, deltaScrollTop: number): void; changeWhitespace(callback: (accessor: IWhitespaceChangeAccessor) => void): void; - setMaxLineWidth(maxLineWidth: number): void; //#endregion } @@ -125,8 +102,13 @@ export interface IViewLayout { getFutureViewport(): Viewport; + setScrollPosition(position: INewScrollPosition, type: ScrollType): void; + deltaScrollNow(deltaScrollLeft: number, deltaScrollTop: number): void; + validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition; + setMaxLineWidth(maxLineWidth: number): void; + getLinesViewportData(): IPartialViewLinesViewportData; getLinesViewportDataAtScrollTop(scrollTop: number): IPartialViewLinesViewportData; getWhitespaces(): IEditorWhitespace[]; @@ -144,6 +126,52 @@ export interface IViewLayout { getWhitespaceViewportData(): IViewWhitespaceViewportData[]; } +export interface IEditorWhitespace { + readonly id: string; + readonly afterLineNumber: number; + readonly height: number; +} + +/** + * An accessor that allows for whtiespace to be added, removed or changed in bulk. + */ +export interface IWhitespaceChangeAccessor { + insertWhitespace(afterLineNumber: number, ordinal: number, heightInPx: number, minWidth: number): string; + changeOneWhitespace(id: string, newAfterLineNumber: number, newHeight: number): void; + removeWhitespace(id: string): void; +} + +export interface IPartialViewLinesViewportData { + /** + * Value to be substracted from `scrollTop` (in order to vertical offset numbers < 1MM) + */ + readonly bigNumbersDelta: number; + /** + * The first (partially) visible line number. + */ + readonly startLineNumber: number; + /** + * The last (partially) visible line number. + */ + readonly endLineNumber: number; + /** + * relativeVerticalOffset[i] is the `top` position for line at `i` + `startLineNumber`. + */ + readonly relativeVerticalOffset: number[]; + /** + * The centered line in the viewport. + */ + readonly centeredLineNumber: number; + /** + * The first completely visible line number. + */ + readonly completelyVisibleStartLineNumber: number; + /** + * The last completely visible line number. + */ + readonly completelyVisibleEndLineNumber: number; +} + export interface IViewWhitespaceViewportData { readonly id: string; readonly afterLineNumber: number; diff --git a/src/vs/editor/common/viewModel/modelLineProjection.ts b/src/vs/editor/common/viewModel/modelLineProjection.ts index b95f041fdca..8a2380d3b74 100644 --- a/src/vs/editor/common/viewModel/modelLineProjection.ts +++ b/src/vs/editor/common/viewModel/modelLineProjection.ts @@ -3,13 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { Position } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; import { EndOfLinePreference, ITextModel, PositionAffinity } from 'vs/editor/common/model'; -import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; -import { InjectedText, ModelLineProjectionData } from 'vs/editor/common/viewModel/modelLineProjectionData'; -import { SingleLineInlineDecoration, ViewLineData } from 'vs/editor/common/viewModel/viewModel'; +import { LineInjectedText } from 'vs/editor/common/textModelEvents'; +import { InjectedText, ModelLineProjectionData } from 'vs/editor/common/modelLineProjectionData'; +import { SingleLineInlineDecoration, ViewLineData } from 'vs/editor/common/viewModel'; export interface IModelLineProjection { isVisible(): boolean; diff --git a/src/vs/editor/common/viewModel/monospaceLineBreaksComputer.ts b/src/vs/editor/common/viewModel/monospaceLineBreaksComputer.ts index 216cbd7bdf6..f61919b4ceb 100644 --- a/src/vs/editor/common/viewModel/monospaceLineBreaksComputer.ts +++ b/src/vs/editor/common/viewModel/monospaceLineBreaksComputer.ts @@ -8,9 +8,9 @@ import * as strings from 'vs/base/common/strings'; import { WrappingIndent, IComputedEditorOptions, EditorOption } from 'vs/editor/common/config/editorOptions'; import { CharacterClassifier } from 'vs/editor/common/core/characterClassifier'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; -import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; +import { LineInjectedText } from 'vs/editor/common/textModelEvents'; import { InjectedTextOptions } from 'vs/editor/common/model'; -import { ILineBreaksComputerFactory, ILineBreaksComputer, ModelLineProjectionData } from 'vs/editor/common/viewModel/modelLineProjectionData'; +import { ILineBreaksComputerFactory, ILineBreaksComputer, ModelLineProjectionData } from 'vs/editor/common/modelLineProjectionData'; export class MonospaceLineBreaksComputerFactory implements ILineBreaksComputerFactory { public static create(options: IComputedEditorOptions): MonospaceLineBreaksComputerFactory { diff --git a/src/vs/editor/common/view/overviewZoneManager.ts b/src/vs/editor/common/viewModel/overviewZoneManager.ts similarity index 98% rename from src/vs/editor/common/view/overviewZoneManager.ts rename to src/vs/editor/common/viewModel/overviewZoneManager.ts index 254659785be..8cf1b7764dc 100644 --- a/src/vs/editor/common/view/overviewZoneManager.ts +++ b/src/vs/editor/common/viewModel/overviewZoneManager.ts @@ -85,7 +85,7 @@ export class OverviewZoneManager { private _pixelRatio: number; private _lastAssignedId: number; - private readonly _color2Id: { [color: string]: number; }; + private readonly _color2Id: { [color: string]: number }; private readonly _id2Color: string[]; constructor(getVerticalOffsetForLine: (lineNumber: number) => number) { diff --git a/src/vs/editor/common/view/viewContext.ts b/src/vs/editor/common/viewModel/viewContext.ts similarity index 57% rename from src/vs/editor/common/view/viewContext.ts rename to src/vs/editor/common/viewModel/viewContext.ts index fea39d37b17..1b401b18f76 100644 --- a/src/vs/editor/common/view/viewContext.ts +++ b/src/vs/editor/common/viewModel/viewContext.ts @@ -4,38 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; -import { IViewLayout, IViewModel } from 'vs/editor/common/viewModel/viewModel'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; +import { IViewLayout, IViewModel } from 'vs/editor/common/viewModel'; import { IColorTheme } from 'vs/platform/theme/common/themeService'; -import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; -import { Color } from 'vs/base/common/color'; -import { ColorScheme } from 'vs/platform/theme/common/theme'; - -export class EditorTheme { - - private _theme: IColorTheme; - - public get type(): ColorScheme { - return this._theme.type; - } - - constructor(theme: IColorTheme) { - this._theme = theme; - } - - public update(theme: IColorTheme): void { - this._theme = theme; - } - - public getColor(color: ColorIdentifier): Color | undefined { - return this._theme.getColor(color); - } -} +import { EditorTheme } from 'vs/editor/common/editorTheme'; export class ViewContext { public readonly configuration: IEditorConfiguration; - public readonly model: IViewModel; + public readonly viewModel: IViewModel; public readonly viewLayout: IViewLayout; public readonly theme: EditorTheme; @@ -46,15 +23,15 @@ export class ViewContext { ) { this.configuration = configuration; this.theme = new EditorTheme(theme); - this.model = model; + this.viewModel = model; this.viewLayout = model.viewLayout; } public addEventHandler(eventHandler: ViewEventHandler): void { - this.model.addViewEventHandler(eventHandler); + this.viewModel.addViewEventHandler(eventHandler); } public removeEventHandler(eventHandler: ViewEventHandler): void { - this.model.removeViewEventHandler(eventHandler); + this.viewModel.removeViewEventHandler(eventHandler); } } diff --git a/src/vs/editor/common/viewModel/viewModelDecorations.ts b/src/vs/editor/common/viewModel/viewModelDecorations.ts index b4fa2165d34..47d1d23ea99 100644 --- a/src/vs/editor/common/viewModel/viewModelDecorations.ts +++ b/src/vs/editor/common/viewModel/viewModelDecorations.ts @@ -9,7 +9,7 @@ import { Range } from 'vs/editor/common/core/range'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; import { IModelDecoration, ITextModel, PositionAffinity } from 'vs/editor/common/model'; import { IViewModelLines } from 'vs/editor/common/viewModel/viewModelLines'; -import { ICoordinatesConverter, InlineDecoration, InlineDecorationType, ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel'; +import { ICoordinatesConverter, InlineDecoration, InlineDecorationType, ViewModelDecoration } from 'vs/editor/common/viewModel'; import { filterValidationDecorations } from 'vs/editor/common/config/editorOptions'; import { StandardTokenType } from 'vs/editor/common/languages'; @@ -32,7 +32,7 @@ export class ViewModelDecorations implements IDisposable { private readonly _linesCollection: IViewModelLines; private readonly _coordinatesConverter: ICoordinatesConverter; - private _decorationsCache: { [decorationId: string]: ViewModelDecoration; }; + private _decorationsCache: { [decorationId: string]: ViewModelDecoration }; private _cachedModelDecorationsResolver: IDecorationsViewportData | null; private _cachedModelDecorationsResolverViewRange: Range | null; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index a54cf6ece79..48d60971b87 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -11,33 +11,33 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import * as strings from 'vs/base/common/strings'; import { ConfigurationChangedEvent, EditorOption, EDITOR_FONT_DEFAULTS, filterValidationDecorations } from 'vs/editor/common/config/editorOptions'; -import { CursorsController } from 'vs/editor/common/controller/cursor'; -import { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from 'vs/editor/common/controller/cursorCommon'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; +import { CursorsController } from 'vs/editor/common/cursor/cursor'; +import { CursorConfiguration, CursorState, EditOperationType, IColumnSelectData, PartialCursorState } from 'vs/editor/common/cursorCommon'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; import { IPosition, Position } from 'vs/editor/common/core/position'; -import { IRange, Range } from 'vs/editor/common/core/range'; +import { Range } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; -import { ICommand, ICursorState, INewScrollPosition, IViewState, ScrollType } from 'vs/editor/common/editorCommon'; +import { ICommand, ICursorState, IViewState, ScrollType } from 'vs/editor/common/editorCommon'; import { IEditorConfiguration } from 'vs/editor/common/config/editorConfiguration'; -import { EndOfLinePreference, ICursorStateComputer, IIdentifiedSingleEditOperation, ITextModel, PositionAffinity, TextModelResolvedOptions, TrackedRangeStickiness } from 'vs/editor/common/model'; -import { IActiveIndentGuideInfo, BracketGuideOptions, IndentGuide } from 'vs/editor/common/model/guidesTextModelPart'; +import { EndOfLinePreference, ICursorStateComputer, IIdentifiedSingleEditOperation, ITextModel, PositionAffinity, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { IActiveIndentGuideInfo, BracketGuideOptions, IndentGuide } from 'vs/editor/common/textModelGuides'; import { ModelDecorationMinimapOptions, ModelDecorationOptions, ModelDecorationOverviewRulerOptions } from 'vs/editor/common/model/textModel'; -import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; +import * as textModelEvents from 'vs/editor/common/textModelEvents'; import { ColorId, TokenizationRegistry } from 'vs/editor/common/languages'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; import { tokenizeLineToHTML } from 'vs/editor/common/languages/textToHtmlTokenizer'; -import { EditorTheme } from 'vs/editor/common/view/viewContext'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { IWhitespaceChangeAccessor } from 'vs/editor/common/viewLayout/linesLayout'; +import { EditorTheme } from 'vs/editor/common/editorTheme'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; import { MinimapTokensColorTracker } from 'vs/editor/common/viewModel/minimapTokensColorTracker'; -import { ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText } from 'vs/editor/common/viewModel/modelLineProjectionData'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; -import { ICoordinatesConverter, IViewModel, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel'; +import { ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText } from 'vs/editor/common/modelLineProjectionData'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; +import { ICoordinatesConverter, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from 'vs/editor/common/viewModel'; import { ViewModelDecorations } from 'vs/editor/common/viewModel/viewModelDecorations'; -import { FocusChangedEvent, OutgoingViewModelEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent } from 'vs/editor/common/viewModel/viewModelEventDispatcher'; +import { FocusChangedEvent, OutgoingViewModelEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent } from 'vs/editor/common/viewModelEventDispatcher'; import { IViewModelLines, ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from 'vs/editor/common/viewModel/viewModelLines'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; const USE_IDENTITY_LINES_COLLECTION = true; @@ -68,7 +68,8 @@ export class ViewModel extends Disposable implements IViewModel { domLineBreaksComputerFactory: ILineBreaksComputerFactory, monospaceLineBreaksComputerFactory: ILineBreaksComputerFactory, scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable, - private readonly languageConfigurationService: ILanguageConfigurationService + private readonly languageConfigurationService: ILanguageConfigurationService, + private readonly _themeService: IThemeService, ) { super(); @@ -147,6 +148,11 @@ export class ViewModel extends Disposable implements IViewModel { this._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensColorsChangedEvent()); })); + this._register(this._themeService.onDidColorThemeChange((theme) => { + this._invalidateDecorationsColorCache(); + this._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewThemeChangedEvent(theme)); + })); + this._updateConfigurationViewLineCountNow(); } @@ -156,7 +162,6 @@ export class ViewModel extends Disposable implements IViewModel { super.dispose(); this._decorations.dispose(); this._lines.dispose(); - this.invalidateMinimapColorCache(); this._viewportStartLineTrackedRange = this.model._setTrackedRange(this._viewportStartLineTrackedRange, null, TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges); this._eventDispatcher.dispose(); } @@ -207,10 +212,6 @@ export class ViewModel extends Disposable implements IViewModel { this._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewCompositionEndEvent()); } - public onDidColorThemeChange(): void { - this._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewThemeChangedEvent()); - } - private _onConfigurationChanged(eventsCollector: ViewModelEventsCollector, e: ConfigurationChangedEvent): void { // We might need to restore the current centered view range, so save it (if available) @@ -399,7 +400,7 @@ export class ViewModel extends Disposable implements IViewModel { })); this._register(this.model.onDidChangeTokens((e) => { - const viewRanges: { fromLineNumber: number; toLineNumber: number; }[] = []; + const viewRanges: { fromLineNumber: number; toLineNumber: number }[] = []; for (let j = 0, lenJ = e.ranges.length; j < lenJ; j++) { const modelRange = e.ranges[j]; const viewStartLineNumber = this.coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.fromLineNumber, 1)).lineNumber; @@ -579,7 +580,7 @@ export class ViewModel extends Disposable implements IViewModel { }; } - public reduceRestoreState(state: IViewState): { scrollLeft: number; scrollTop: number; } { + public reduceRestoreState(state: IViewState): { scrollLeft: number; scrollTop: number } { if (typeof state.firstPosition === 'undefined') { // This is a view state serialized by an older version return this._reduceRestoreStateCompatibility(state); @@ -594,7 +595,7 @@ export class ViewModel extends Disposable implements IViewModel { }; } - private _reduceRestoreStateCompatibility(state: IViewState): { scrollLeft: number; scrollTop: number; } { + private _reduceRestoreStateCompatibility(state: IViewState): { scrollLeft: number; scrollTop: number } { return { scrollLeft: state.scrollLeft, scrollTop: state.scrollTopWithoutViewZones! @@ -605,10 +606,6 @@ export class ViewModel extends Disposable implements IViewModel { return this.model.getOptions().tabSize; } - public getTextModelOptions(): TextModelResolvedOptions { - return this.model.getOptions(); - } - public getLineCount(): number { return this._lines.getViewLineCount(); } @@ -733,7 +730,7 @@ export class ViewModel extends Disposable implements IViewModel { if (lane === 0) { continue; } - const color = opts.getColor(theme); + const color = opts.getColor(theme.value); const viewStartLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.startLineNumber, decoration.range.startColumn); const viewEndLineNumber = this.coordinatesConverter.getViewLineNumberOfModelPosition(decoration.range.endLineNumber, decoration.range.endColumn); @@ -742,22 +739,16 @@ export class ViewModel extends Disposable implements IViewModel { return result.asArray; } - public invalidateOverviewRulerColorCache(): void { + private _invalidateDecorationsColorCache(): void { const decorations = this.model.getOverviewRulerDecorations(); for (const decoration of decorations) { - const opts = decoration.options.overviewRuler; - if (opts) { - opts.invalidateCachedColor(); + const opts1 = decoration.options.overviewRuler; + if (opts1) { + opts1.invalidateCachedColor(); } - } - } - - public invalidateMinimapColorCache(): void { - const decorations = this.model.getAllDecorations(); - for (const decoration of decorations) { - const opts = decoration.options.minimap; - if (opts) { - opts.invalidateCachedColor(); + const opts2 = decoration.options.minimap; + if (opts2) { + opts2.invalidateCachedColor(); } } } @@ -767,18 +758,6 @@ export class ViewModel extends Disposable implements IViewModel { return this.model.getValueInRange(modelRange, eol); } - public getModelLineMaxColumn(modelLineNumber: number): number { - return this.model.getLineMaxColumn(modelLineNumber); - } - - public validateModelPosition(position: IPosition): Position { - return this.model.validatePosition(position); - } - - public validateModelRange(range: IRange): Range { - return this.model.validateRange(range); - } - public deduceModelPositionRelativeToViewPosition(viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position { const modelAnchor = this.coordinatesConverter.convertViewPositionToModelPosition(viewAnchorPosition); if (this.model.getEOL().length === 2) { @@ -795,10 +774,6 @@ export class ViewModel extends Disposable implements IViewModel { return this.model.getPositionAt(resultOffset); } - public getEOL(): string { - return this.model.getEOL(); - } - public getPlainTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[] { const newLineCharacter = forceCRLF ? '\r\n' : this.model.getEOL(); @@ -860,7 +835,7 @@ export class ViewModel extends Disposable implements IViewModel { return result.length === 1 ? result[0] : result; } - public getRichTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean): { html: string, mode: string } | null { + public getRichTextToCopy(modelRanges: Range[], emptySelectionClipboard: boolean): { html: string; mode: string } | null { const languageId = this.model.getLanguageId(); if (languageId === PLAINTEXT_LANGUAGE_ID) { return null; @@ -956,14 +931,6 @@ export class ViewModel extends Disposable implements IViewModel { return result; } - //#region model - - public pushStackElement(): void { - this.model.pushStackElement(); - } - - //#endregion - //#region cursor operations public getPrimaryCursorState(): CursorState { @@ -1069,21 +1036,6 @@ export class ViewModel extends Disposable implements IViewModel { //#endregion //#region viewLayout - public getVerticalOffsetForLineNumber(viewLineNumber: number): number { - return this.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); - } - public getScrollTop(): number { - return this.viewLayout.getCurrentScrollTop(); - } - public setScrollTop(newScrollTop: number, scrollType: ScrollType): void { - this.viewLayout.setScrollPosition({ scrollTop: newScrollTop }, scrollType); - } - public setScrollPosition(position: INewScrollPosition, type: ScrollType): void { - this.viewLayout.setScrollPosition(position, type); - } - public deltaScrollNow(deltaScrollLeft: number, deltaScrollTop: number): void { - this.viewLayout.deltaScrollNow(deltaScrollLeft, deltaScrollTop); - } public changeWhitespace(callback: (accessor: IWhitespaceChangeAccessor) => void): void { const hadAChange = this.viewLayout.changeWhitespace(callback); if (hadAChange) { @@ -1091,9 +1043,6 @@ export class ViewModel extends Disposable implements IViewModel { this._eventDispatcher.emitOutgoingEvent(new ViewZonesChangedEvent()); } } - public setMaxLineWidth(maxLineWidth: number): void { - this.viewLayout.setMaxLineWidth(maxLineWidth); - } //#endregion private _withViewEventsCollector(callback: (eventsCollector: ViewModelEventsCollector) => T): T { @@ -1120,7 +1069,7 @@ export class ViewModel extends Disposable implements IViewModel { class OverviewRulerDecorations { - private readonly _asMap: { [color: string]: OverviewRulerDecorationsGroup; } = Object.create(null); + private readonly _asMap: { [color: string]: OverviewRulerDecorationsGroup } = Object.create(null); readonly asArray: OverviewRulerDecorationsGroup[] = []; public accept(color: string, zIndex: number, startLineNumber: number, endLineNumber: number, lane: number): void { diff --git a/src/vs/editor/common/viewModel/viewModelLines.ts b/src/vs/editor/common/viewModel/viewModelLines.ts index d578acab370..40a2ac24644 100644 --- a/src/vs/editor/common/viewModel/viewModelLines.ts +++ b/src/vs/editor/common/viewModel/viewModelLines.ts @@ -10,14 +10,14 @@ import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration, IModelDeltaDecoration, ITextModel, PositionAffinity } from 'vs/editor/common/model'; -import { IActiveIndentGuideInfo, BracketGuideOptions, IndentGuide, IndentGuideHorizontalLine } from 'vs/editor/common/model/guidesTextModelPart'; +import { IActiveIndentGuideInfo, BracketGuideOptions, IndentGuide, IndentGuideHorizontalLine } from 'vs/editor/common/textModelGuides'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { LineInjectedText } from 'vs/editor/common/model/textModelEvents'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { LineInjectedText } from 'vs/editor/common/textModelEvents'; +import * as viewEvents from 'vs/editor/common/viewEvents'; import { createModelLineProjection, IModelLineProjection } from 'vs/editor/common/viewModel/modelLineProjection'; -import { ILineBreaksComputer, ModelLineProjectionData, InjectedText, ILineBreaksComputerFactory } from 'vs/editor/common/viewModel/modelLineProjectionData'; -import { ConstantTimePrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; -import { ICoordinatesConverter, ViewLineData } from 'vs/editor/common/viewModel/viewModel'; +import { ILineBreaksComputer, ModelLineProjectionData, InjectedText, ILineBreaksComputerFactory } from 'vs/editor/common/modelLineProjectionData'; +import { ConstantTimePrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; +import { ICoordinatesConverter, ViewLineData } from 'vs/editor/common/viewModel'; export interface IViewModelLines extends IDisposable { createCoordinatesConverter(): ICoordinatesConverter; diff --git a/src/vs/editor/common/viewModel/viewModelEventDispatcher.ts b/src/vs/editor/common/viewModelEventDispatcher.ts similarity index 98% rename from src/vs/editor/common/viewModel/viewModelEventDispatcher.ts rename to src/vs/editor/common/viewModelEventDispatcher.ts index 641e5b2efef..cbdc9410776 100644 --- a/src/vs/editor/common/viewModel/viewModelEventDispatcher.ts +++ b/src/vs/editor/common/viewModelEventDispatcher.ts @@ -3,13 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; -import { ViewEvent } from 'vs/editor/common/view/viewEvents'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; +import { ViewEvent } from 'vs/editor/common/viewEvents'; import { IContentSizeChangedEvent } from 'vs/editor/common/editorCommon'; import { Emitter } from 'vs/base/common/event'; import { Selection } from 'vs/editor/common/core/selection'; import { Disposable } from 'vs/base/common/lifecycle'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; export class ViewModelEventDispatcher extends Disposable { diff --git a/src/vs/editor/contrib/anchorSelect/anchorSelect.css b/src/vs/editor/contrib/anchorSelect/browser/anchorSelect.css similarity index 100% rename from src/vs/editor/contrib/anchorSelect/anchorSelect.css rename to src/vs/editor/contrib/anchorSelect/browser/anchorSelect.css diff --git a/src/vs/editor/contrib/anchorSelect/anchorSelect.ts b/src/vs/editor/contrib/anchorSelect/browser/anchorSelect.ts similarity index 100% rename from src/vs/editor/contrib/anchorSelect/anchorSelect.ts rename to src/vs/editor/contrib/anchorSelect/browser/anchorSelect.ts diff --git a/src/vs/editor/contrib/bracketMatching/bracketMatching.css b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css similarity index 100% rename from src/vs/editor/contrib/bracketMatching/bracketMatching.css rename to src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css diff --git a/src/vs/editor/contrib/bracketMatching/bracketMatching.ts b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.ts similarity index 99% rename from src/vs/editor/contrib/bracketMatching/bracketMatching.ts rename to src/vs/editor/contrib/bracketMatching/browser/bracketMatching.ts index ed9a249a4b0..eaae20dc7b8 100644 --- a/src/vs/editor/contrib/bracketMatching/bracketMatching.ts +++ b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.ts @@ -17,7 +17,7 @@ import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IModelDeltaDecoration, OverviewRulerLane, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { editorBracketMatchBackground, editorBracketMatchBorder } from 'vs/editor/common/view/editorColorRegistry'; +import { editorBracketMatchBackground, editorBracketMatchBorder } from 'vs/editor/common/core/editorColorRegistry'; import * as nls from 'vs/nls'; import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; diff --git a/src/vs/editor/contrib/bracketMatching/test/bracketMatching.test.ts b/src/vs/editor/contrib/bracketMatching/test/browser/bracketMatching.test.ts similarity index 99% rename from src/vs/editor/contrib/bracketMatching/test/bracketMatching.test.ts rename to src/vs/editor/contrib/bracketMatching/test/browser/bracketMatching.test.ts index 7d0e841d1ae..7db8c60c134 100644 --- a/src/vs/editor/contrib/bracketMatching/test/bracketMatching.test.ts +++ b/src/vs/editor/contrib/bracketMatching/test/browser/bracketMatching.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { BracketMatchingController } from 'vs/editor/contrib/bracketMatching/bracketMatching'; +import { BracketMatchingController } from 'vs/editor/contrib/bracketMatching/browser/bracketMatching'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; diff --git a/src/vs/editor/contrib/caretOperations/caretOperations.ts b/src/vs/editor/contrib/caretOperations/browser/caretOperations.ts similarity index 98% rename from src/vs/editor/contrib/caretOperations/caretOperations.ts rename to src/vs/editor/contrib/caretOperations/browser/caretOperations.ts index fdcd80257cd..9279dedf100 100644 --- a/src/vs/editor/contrib/caretOperations/caretOperations.ts +++ b/src/vs/editor/contrib/caretOperations/browser/caretOperations.ts @@ -7,7 +7,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, IActionOptions, registerEditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ICommand } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { MoveCaretCommand } from 'vs/editor/contrib/caretOperations/moveCaretCommand'; +import { MoveCaretCommand } from 'vs/editor/contrib/caretOperations/browser/moveCaretCommand'; import * as nls from 'vs/nls'; class MoveCaretAction extends EditorAction { diff --git a/src/vs/editor/contrib/caretOperations/moveCaretCommand.ts b/src/vs/editor/contrib/caretOperations/browser/moveCaretCommand.ts similarity index 100% rename from src/vs/editor/contrib/caretOperations/moveCaretCommand.ts rename to src/vs/editor/contrib/caretOperations/browser/moveCaretCommand.ts diff --git a/src/vs/editor/contrib/caretOperations/transpose.ts b/src/vs/editor/contrib/caretOperations/browser/transpose.ts similarity index 97% rename from src/vs/editor/contrib/caretOperations/transpose.ts rename to src/vs/editor/contrib/caretOperations/browser/transpose.ts index 60db50e2123..cd0eef93837 100644 --- a/src/vs/editor/contrib/caretOperations/transpose.ts +++ b/src/vs/editor/contrib/caretOperations/browser/transpose.ts @@ -7,7 +7,7 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; -import { MoveOperations } from 'vs/editor/common/controller/cursorMoveOperations'; +import { MoveOperations } from 'vs/editor/common/cursor/cursorMoveOperations'; import { Range } from 'vs/editor/common/core/range'; import { ICommand } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; diff --git a/src/vs/editor/contrib/caretOperations/test/moveCarretCommand.test.ts b/src/vs/editor/contrib/caretOperations/test/browser/moveCarretCommand.test.ts similarity index 98% rename from src/vs/editor/contrib/caretOperations/test/moveCarretCommand.test.ts rename to src/vs/editor/contrib/caretOperations/test/browser/moveCarretCommand.test.ts index a5942fbc261..60dad4fbc01 100644 --- a/src/vs/editor/contrib/caretOperations/test/moveCarretCommand.test.ts +++ b/src/vs/editor/contrib/caretOperations/test/browser/moveCarretCommand.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Selection } from 'vs/editor/common/core/selection'; -import { MoveCaretCommand } from 'vs/editor/contrib/caretOperations/moveCaretCommand'; +import { MoveCaretCommand } from 'vs/editor/contrib/caretOperations/browser/moveCaretCommand'; import { testCommand } from 'vs/editor/test/browser/testCommand'; diff --git a/src/vs/editor/contrib/clipboard/clipboard.ts b/src/vs/editor/contrib/clipboard/browser/clipboard.ts similarity index 100% rename from src/vs/editor/contrib/clipboard/clipboard.ts rename to src/vs/editor/contrib/clipboard/browser/clipboard.ts diff --git a/src/vs/editor/contrib/codeAction/codeAction.ts b/src/vs/editor/contrib/codeAction/browser/codeAction.ts similarity index 83% rename from src/vs/editor/contrib/codeAction/codeAction.ts rename to src/vs/editor/contrib/codeAction/browser/codeAction.ts index d40624b21a6..c0114ed8bff 100644 --- a/src/vs/editor/contrib/codeAction/codeAction.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeAction.ts @@ -8,15 +8,17 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { illegalArgument, isCancellationError, onUnexpectedExternalError } from 'vs/base/common/errors'; import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { TextModelCancellationTokenSource } from 'vs/editor/browser/core/editorState'; +import { TextModelCancellationTokenSource } from 'vs/editor/contrib/editorState/browser/editorState'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IProgress, Progress } from 'vs/platform/progress/common/progress'; import { CodeActionFilter, CodeActionKind, CodeActionTrigger, filtersAction, mayIncludeActionsOfKind } from './types'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export const codeActionCommandId = 'editor.action.codeAction'; export const refactorCommandId = 'editor.action.refactor'; @@ -27,13 +29,13 @@ export const fixAllCommandId = 'editor.action.fixAll'; export class CodeActionItem { constructor( - readonly action: modes.CodeAction, - readonly provider: modes.CodeActionProvider | undefined, + readonly action: languages.CodeAction, + readonly provider: languages.CodeActionProvider | undefined, ) { } async resolve(token: CancellationToken): Promise { if (this.provider?.resolveCodeAction && !this.action.edit) { - let action: modes.CodeAction | undefined | null; + let action: languages.CodeAction | undefined | null; try { action = await this.provider.resolveCodeAction(this.action, token); } catch (err) { @@ -52,7 +54,7 @@ export interface CodeActionSet extends IDisposable { readonly allActions: readonly CodeActionItem[]; readonly hasAutoFix: boolean; - readonly documentation: readonly modes.Command[]; + readonly documentation: readonly languages.Command[]; } class ManagedCodeActionSet extends Disposable implements CodeActionSet { @@ -82,7 +84,7 @@ class ManagedCodeActionSet extends Disposable implements CodeActionSet { public constructor( actions: readonly CodeActionItem[], - public readonly documentation: readonly modes.Command[], + public readonly documentation: readonly languages.Command[], disposables: DisposableStore, ) { super(); @@ -100,21 +102,22 @@ class ManagedCodeActionSet extends Disposable implements CodeActionSet { const emptyCodeActionsResponse = { actions: [] as CodeActionItem[], documentation: undefined }; export function getCodeActions( + registry: LanguageFeatureRegistry, model: ITextModel, rangeOrSelection: Range | Selection, trigger: CodeActionTrigger, - progress: IProgress, + progress: IProgress, token: CancellationToken, ): Promise { const filter = trigger.filter || {}; - const codeActionContext: modes.CodeActionContext = { + const codeActionContext: languages.CodeActionContext = { only: filter.include?.value, trigger: trigger.type, }; const cts = new TextModelCancellationTokenSource(model, token); - const providers = getCodeActionProviders(model, filter); + const providers = getCodeActionProviders(registry, model, filter); const disposables = new DisposableStore(); const promises = providers.map(async provider => { @@ -144,8 +147,8 @@ export function getCodeActions( } }); - const listener = modes.CodeActionProviderRegistry.onDidChange(() => { - const newProviders = modes.CodeActionProviderRegistry.all(model); + const listener = registry.onDidChange(() => { + const newProviders = registry.all(model); if (!equals(newProviders, providers)) { cts.cancel(); } @@ -163,10 +166,11 @@ export function getCodeActions( } function getCodeActionProviders( + registry: LanguageFeatureRegistry, model: ITextModel, filter: CodeActionFilter ) { - return modes.CodeActionProviderRegistry.all(model) + return registry.all(model) // Don't include providers that we know will not return code actions of interest .filter(provider => { if (!provider.providedCodeActionKinds) { @@ -178,10 +182,10 @@ function getCodeActionProviders( } function getDocumentation( - provider: modes.CodeActionProvider, - providedCodeActions: readonly modes.CodeAction[], + provider: languages.CodeActionProvider, + providedCodeActions: readonly languages.CodeAction[], only?: CodeActionKind -): modes.Command | undefined { +): languages.Command | undefined { if (!provider.documentation) { return undefined; } @@ -189,7 +193,7 @@ function getDocumentation( const documentation = provider.documentation.map(entry => ({ kind: new CodeActionKind(entry.kind), command: entry.command })); if (only) { - let currentBest: { readonly kind: CodeActionKind, readonly command: modes.Command; } | undefined; + let currentBest: { readonly kind: CodeActionKind; readonly command: languages.Command } | undefined; for (const entry of documentation) { if (entry.kind.contains(only)) { if (!currentBest) { @@ -223,11 +227,12 @@ function getDocumentation( return undefined; } -CommandsRegistry.registerCommand('_executeCodeActionProvider', async function (accessor, resource: URI, rangeOrSelection: Range | Selection, kind?: string, itemResolveCount?: number): Promise> { +CommandsRegistry.registerCommand('_executeCodeActionProvider', async function (accessor, resource: URI, rangeOrSelection: Range | Selection, kind?: string, itemResolveCount?: number): Promise> { if (!(resource instanceof URI)) { throw illegalArgument(); } + const { codeActionProvider } = accessor.get(ILanguageFeaturesService); const model = accessor.get(IModelService).getModel(resource); if (!model) { throw illegalArgument(); @@ -245,9 +250,10 @@ CommandsRegistry.registerCommand('_executeCodeActionProvider', async function (a const include = typeof kind === 'string' ? new CodeActionKind(kind) : undefined; const codeActionSet = await getCodeActions( + codeActionProvider, model, validatedRangeOrSelection, - { type: modes.CodeActionTriggerType.Invoke, filter: { includeSourceActions: true, include } }, + { type: languages.CodeActionTriggerType.Invoke, filter: { includeSourceActions: true, include } }, Progress.None, CancellationToken.None); diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts similarity index 95% rename from src/vs/editor/contrib/codeAction/codeActionCommands.ts rename to src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts index 5422af70018..4cfe3155a58 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionCommands.ts @@ -17,9 +17,10 @@ import { IPosition } from 'vs/editor/common/core/position'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { CodeActionTriggerType } from 'vs/editor/common/languages'; -import { codeActionCommandId, CodeActionItem, CodeActionSet, fixAllCommandId, organizeImportsCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/codeAction'; -import { CodeActionUi } from 'vs/editor/contrib/codeAction/codeActionUi'; -import { MessageController } from 'vs/editor/contrib/message/messageController'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { codeActionCommandId, CodeActionItem, CodeActionSet, fixAllCommandId, organizeImportsCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { CodeActionUi } from 'vs/editor/contrib/codeAction/browser/codeActionUi'; +import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; import * as nls from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -83,11 +84,12 @@ export class QuickFixController extends Disposable implements IEditorContributio @IContextKeyService contextKeyService: IContextKeyService, @IEditorProgressService progressService: IEditorProgressService, @IInstantiationService private readonly _instantiationService: IInstantiationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); this._editor = editor; - this._model = this._register(new CodeActionModel(this._editor, markerService, contextKeyService, progressService)); + this._model = this._register(new CodeActionModel(this._editor, languageFeaturesService.codeActionProvider, markerService, contextKeyService, progressService)); this._register(this._model.onDidChangeState(newState => this.update(newState))); this._ui = new Lazy(() => @@ -152,9 +154,9 @@ export async function applyCodeAction( codeActionIsPreferred: boolean; }; type ApplyCodeEventClassification = { - codeActionTitle: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - codeActionKind: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - codeActionIsPreferred: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + codeActionTitle: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + codeActionKind: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + codeActionIsPreferred: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; telemetryService.publicLog2('codeAction.applyCodeAction', { diff --git a/src/vs/editor/contrib/codeAction/codeActionContributions.ts b/src/vs/editor/contrib/codeAction/browser/codeActionContributions.ts similarity index 92% rename from src/vs/editor/contrib/codeAction/codeActionContributions.ts rename to src/vs/editor/contrib/codeAction/browser/codeActionContributions.ts index e65d1aa5a79..ddbe57e0e31 100644 --- a/src/vs/editor/contrib/codeAction/codeActionContributions.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionContributions.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { registerEditorAction, registerEditorCommand, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { AutoFixAction, CodeActionCommand, FixAllAction, OrganizeImportsAction, QuickFixAction, QuickFixController, RefactorAction, SourceAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; +import { AutoFixAction, CodeActionCommand, FixAllAction, OrganizeImportsAction, QuickFixAction, QuickFixController, RefactorAction, SourceAction } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; registerEditorContribution(QuickFixController.ID, QuickFixController); diff --git a/src/vs/editor/contrib/codeAction/codeActionMenu.ts b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts similarity index 92% rename from src/vs/editor/contrib/codeAction/codeActionMenu.ts rename to src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts index 4d3ffb14e78..9978c8a442c 100644 --- a/src/vs/editor/contrib/codeAction/codeActionMenu.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionMenu.ts @@ -14,9 +14,10 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { ScrollType } from 'vs/editor/common/editorCommon'; -import { CodeAction, CodeActionProviderRegistry, Command } from 'vs/editor/common/languages'; -import { codeActionCommandId, CodeActionItem, CodeActionSet, fixAllCommandId, organizeImportsCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/codeAction'; -import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionKind, CodeActionTrigger } from 'vs/editor/contrib/codeAction/types'; +import { CodeAction, Command } from 'vs/editor/common/languages'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { codeActionCommandId, CodeActionItem, CodeActionSet, fixAllCommandId, organizeImportsCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { CodeActionAutoApply, CodeActionCommandArgs, CodeActionKind, CodeActionTrigger } from 'vs/editor/contrib/codeAction/browser/types'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; @@ -60,6 +61,7 @@ export class CodeActionMenu extends Disposable { private readonly _delegate: CodeActionWidgetDelegate, @IContextMenuService private readonly _contextMenuService: IContextMenuService, @IKeybindingService keybindingService: IKeybindingService, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, ) { super(); @@ -122,7 +124,7 @@ export class CodeActionMenu extends Disposable { const model = this._editor.getModel(); if (model && result.length) { - for (const provider of CodeActionProviderRegistry.all(model)) { + for (const provider of this._languageFeaturesService.codeActionProvider.all(model)) { if (provider._getAdditionalMenuItems) { allDocumentation.push(...provider._getAdditionalMenuItems({ trigger: trigger.type, only: trigger.filter?.include?.value }, actionsToShow.map(item => item.action))); } @@ -139,7 +141,7 @@ export class CodeActionMenu extends Disposable { return result; } - private _toCoords(position: IPosition): { x: number, y: number } { + private _toCoords(position: IPosition): { x: number; y: number } { if (!this._editor.hasModel()) { return { x: 0, y: 0 }; } @@ -167,7 +169,7 @@ export class CodeActionKeybindingResolver { constructor( private readonly _keybindingProvider: { - getKeybindings(): readonly ResolvedKeybindingItem[], + getKeybindings(): readonly ResolvedKeybindingItem[]; }, ) { } @@ -231,5 +233,3 @@ export class CodeActionKeybindingResolver { }, undefined as ResolveCodeActionKeybinding | undefined); } } - - diff --git a/src/vs/editor/contrib/codeAction/codeActionModel.ts b/src/vs/editor/contrib/codeAction/browser/codeActionModel.ts similarity index 94% rename from src/vs/editor/contrib/codeAction/codeActionModel.ts rename to src/vs/editor/contrib/codeAction/browser/codeActionModel.ts index ae4e27ed282..f0a781143ae 100644 --- a/src/vs/editor/contrib/codeAction/codeActionModel.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionModel.ts @@ -14,7 +14,8 @@ import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { CodeActionProviderRegistry, CodeActionTriggerType } from 'vs/editor/common/languages'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { CodeActionProvider, CodeActionTriggerType } from 'vs/editor/common/languages'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEditorProgressService, Progress } from 'vs/platform/progress/common/progress'; @@ -193,6 +194,7 @@ export class CodeActionModel extends Disposable { constructor( private readonly _editor: ICodeEditor, + private readonly _registry: LanguageFeatureRegistry, private readonly _markerService: IMarkerService, contextKeyService: IContextKeyService, private readonly _progressService?: IEditorProgressService @@ -202,7 +204,7 @@ export class CodeActionModel extends Disposable { this._register(this._editor.onDidChangeModel(() => this._update())); this._register(this._editor.onDidChangeModelLanguage(() => this._update())); - this._register(CodeActionProviderRegistry.onDidChange(() => this._update())); + this._register(this._registry.onDidChange(() => this._update())); this._update(); } @@ -228,11 +230,11 @@ export class CodeActionModel extends Disposable { const model = this._editor.getModel(); if (model - && CodeActionProviderRegistry.has(model) + && this._registry.has(model) && !this._editor.getOption(EditorOption.readOnly) ) { const supportedActions: string[] = []; - for (const provider of CodeActionProviderRegistry.all(model)) { + for (const provider of this._registry.all(model)) { if (Array.isArray(provider.providedCodeActionKinds)) { supportedActions.push(...provider.providedCodeActionKinds); } @@ -246,7 +248,7 @@ export class CodeActionModel extends Disposable { return; } - const actions = createCancelablePromise(token => getCodeActions(model, trigger.selection, trigger.trigger, Progress.None, token)); + const actions = createCancelablePromise(token => getCodeActions(this._registry, model, trigger.selection, trigger.trigger, Progress.None, token)); if (trigger.trigger.type === CodeActionTriggerType.Invoke) { this._progressService?.showWhile(actions, 250); } diff --git a/src/vs/editor/contrib/codeAction/codeActionUi.ts b/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts similarity index 97% rename from src/vs/editor/contrib/codeAction/codeActionUi.ts rename to src/vs/editor/contrib/codeAction/browser/codeActionUi.ts index 52b73cdb5a9..e191d6ba9f5 100644 --- a/src/vs/editor/contrib/codeAction/codeActionUi.ts +++ b/src/vs/editor/contrib/codeAction/browser/codeActionUi.ts @@ -10,8 +10,8 @@ import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IPosition } from 'vs/editor/common/core/position'; import { CodeActionTriggerType } from 'vs/editor/common/languages'; -import { CodeActionItem, CodeActionSet } from 'vs/editor/contrib/codeAction/codeAction'; -import { MessageController } from 'vs/editor/contrib/message/messageController'; +import { CodeActionItem, CodeActionSet } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CodeActionMenu, CodeActionShowOptions } from './codeActionMenu'; import { CodeActionsState } from './codeActionModel'; @@ -31,7 +31,7 @@ export class CodeActionUi extends Disposable { quickFixActionId: string, preferredFixActionId: string, private readonly delegate: { - applyCodeAction: (action: CodeActionItem, regtriggerAfterApply: boolean) => Promise + applyCodeAction: (action: CodeActionItem, regtriggerAfterApply: boolean) => Promise; }, @IInstantiationService instantiationService: IInstantiationService, ) { diff --git a/src/vs/editor/contrib/codeAction/lightBulbWidget.css b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css similarity index 100% rename from src/vs/editor/contrib/codeAction/lightBulbWidget.css rename to src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css diff --git a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts similarity index 98% rename from src/vs/editor/contrib/codeAction/lightBulbWidget.ts rename to src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts index 020b056e744..9e453a1c3aa 100644 --- a/src/vs/editor/contrib/codeAction/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts @@ -14,8 +14,8 @@ import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentW import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; import { computeIndentLevel } from 'vs/editor/common/model/utils'; -import { CodeActionSet } from 'vs/editor/contrib/codeAction/codeAction'; -import type { CodeActionTrigger } from 'vs/editor/contrib/codeAction/types'; +import { CodeActionSet } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import type { CodeActionTrigger } from 'vs/editor/contrib/codeAction/browser/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'; diff --git a/src/vs/editor/contrib/codeAction/types.ts b/src/vs/editor/contrib/codeAction/browser/types.ts similarity index 98% rename from src/vs/editor/contrib/codeAction/types.ts rename to src/vs/editor/contrib/codeAction/browser/types.ts index 00c0ca8bf6e..ae406530c68 100644 --- a/src/vs/editor/contrib/codeAction/types.ts +++ b/src/vs/editor/contrib/codeAction/browser/types.ts @@ -125,7 +125,7 @@ export interface CodeActionTrigger { } export class CodeActionCommandArgs { - public static fromUser(arg: any, defaults: { kind: CodeActionKind, apply: CodeActionAutoApply }): CodeActionCommandArgs { + public static fromUser(arg: any, defaults: { kind: CodeActionKind; apply: CodeActionAutoApply }): CodeActionCommandArgs { if (!arg || typeof arg !== 'object') { return new CodeActionCommandArgs(defaults.kind, defaults.apply, false); } diff --git a/src/vs/editor/contrib/codeAction/test/codeAction.test.ts b/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts similarity index 63% rename from src/vs/editor/contrib/codeAction/test/codeAction.test.ts rename to src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts index 7cba4b750c1..77d5b2577a3 100644 --- a/src/vs/editor/contrib/codeAction/test/codeAction.test.ts +++ b/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts @@ -8,16 +8,17 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { Range } from 'vs/editor/common/core/range'; import { TextModel } from 'vs/editor/common/model/textModel'; -import * as modes from 'vs/editor/common/languages'; -import { CodeActionItem, getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/types'; +import * as languages from 'vs/editor/common/languages'; +import { CodeActionItem, getCodeActions } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { Progress } from 'vs/platform/progress/common/progress'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; -function staticCodeActionProvider(...actions: modes.CodeAction[]): modes.CodeActionProvider { - return new class implements modes.CodeActionProvider { - provideCodeActions(): modes.CodeActionList { +function staticCodeActionProvider(...actions: languages.CodeAction[]): languages.CodeActionProvider { + return new class implements languages.CodeActionProvider { + provideCodeActions(): languages.CodeActionList { return { actions: actions, dispose: () => { } @@ -32,6 +33,7 @@ suite('CodeAction', () => { let langId = 'fooLang'; let uri = URI.parse('untitled:path'); let model: TextModel; + let registry: LanguageFeatureRegistry; const disposables = new DisposableStore(); let testData = { diagnostics: { @@ -60,7 +62,7 @@ suite('CodeAction', () => { }, command: { abc: { - command: new class implements modes.Command { + command: new class implements languages.Command { id!: '1'; title!: 'abc'; }, @@ -70,8 +72,8 @@ suite('CodeAction', () => { spelling: { bcd: { diagnostics: [], - edit: new class implements modes.WorkspaceEdit { - edits!: modes.WorkspaceTextEdit[]; + edit: new class implements languages.WorkspaceEdit { + edits!: languages.WorkspaceTextEdit[]; }, title: 'abc' } @@ -93,6 +95,7 @@ suite('CodeAction', () => { }; setup(function () { + registry = new LanguageFeatureRegistry(); disposables.clear(); model = createTextModel('test1\ntest2\ntest3', langId, undefined, uri); disposables.add(model); @@ -113,7 +116,7 @@ suite('CodeAction', () => { testData.diagnostics.abc ); - disposables.add(modes.CodeActionProviderRegistry.register('fooLang', provider)); + disposables.add(registry.register('fooLang', provider)); const expected = [ // CodeActions with a diagnostics array are shown first ordered by diagnostics.message @@ -127,7 +130,7 @@ suite('CodeAction', () => { new CodeActionItem(testData.tsLint.abc, provider) ]; - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { type: modes.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 6); assert.deepStrictEqual(actions, expected); }); @@ -139,30 +142,30 @@ suite('CodeAction', () => { { title: 'a.b', kind: 'a.b' } ); - disposables.add(modes.CodeActionProviderRegistry.register('fooLang', provider)); + disposables.add(registry.register('fooLang', provider)); { - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { type: modes.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a') } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a') } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 2); assert.strictEqual(actions[0].action.title, 'a'); assert.strictEqual(actions[1].action.title, 'a.b'); } { - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { type: modes.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a.b') } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a.b') } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); assert.strictEqual(actions[0].action.title, 'a.b'); } { - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { type: modes.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a.b.c') } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a.b.c') } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 0); } }); test('getCodeActions should forward requested scope to providers', async function () { - const provider = new class implements modes.CodeActionProvider { - provideCodeActions(_model: any, _range: Range, context: modes.CodeActionContext, _token: any): modes.CodeActionList { + const provider = new class implements languages.CodeActionProvider { + provideCodeActions(_model: any, _range: Range, context: languages.CodeActionContext, _token: any): languages.CodeActionList { return { actions: [ { title: context.only || '', kind: context.only } @@ -172,9 +175,9 @@ suite('CodeAction', () => { } }; - disposables.add(modes.CodeActionProviderRegistry.register('fooLang', provider)); + disposables.add(registry.register('fooLang', provider)); - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { type: modes.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a') } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: new CodeActionKind('a') } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); assert.strictEqual(actions[0].action.title, 'a'); }); @@ -185,16 +188,16 @@ suite('CodeAction', () => { { title: 'b', kind: 'b' } ); - disposables.add(modes.CodeActionProviderRegistry.register('fooLang', provider)); + disposables.add(registry.register('fooLang', provider)); { - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { type: modes.CodeActionTriggerType.Auto }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); assert.strictEqual(actions[0].action.title, 'b'); } { - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { type: modes.CodeActionTriggerType.Auto, filter: { include: CodeActionKind.Source, includeSourceActions: true } }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { type: languages.CodeActionTriggerType.Auto, filter: { include: CodeActionKind.Source, includeSourceActions: true } }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); assert.strictEqual(actions[0].action.title, 'a'); } @@ -207,11 +210,11 @@ suite('CodeAction', () => { { title: 'c', kind: 'c' } ); - disposables.add(modes.CodeActionProviderRegistry.register('fooLang', provider)); + disposables.add(registry.register('fooLang', provider)); { - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { - type: modes.CodeActionTriggerType.Auto, filter: { + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { + type: languages.CodeActionTriggerType.Auto, filter: { include: CodeActionKind.Source.append('test'), excludes: [CodeActionKind.Source], includeSourceActions: true, @@ -226,16 +229,16 @@ suite('CodeAction', () => { const baseType = CodeActionKind.Refactor; const subType = CodeActionKind.Refactor.append('sub'); - disposables.add(modes.CodeActionProviderRegistry.register('fooLang', staticCodeActionProvider( + disposables.add(registry.register('fooLang', staticCodeActionProvider( { title: 'a', kind: baseType.value } ))); let didInvoke = false; - disposables.add(modes.CodeActionProviderRegistry.register('fooLang', new class implements modes.CodeActionProvider { + disposables.add(registry.register('fooLang', new class implements languages.CodeActionProvider { providedCodeActionKinds = [subType.value]; - provideCodeActions(): modes.ProviderResult { + provideCodeActions(): languages.ProviderResult { didInvoke = true; return { actions: [ @@ -247,8 +250,8 @@ suite('CodeAction', () => { })); { - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { - type: modes.CodeActionTriggerType.Auto, filter: { + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { + type: languages.CodeActionTriggerType.Auto, filter: { include: baseType, excludes: [subType], } @@ -261,8 +264,8 @@ suite('CodeAction', () => { test('getCodeActions should not invoke code action providers filtered out by providedCodeActionKinds', async function () { let wasInvoked = false; - const provider = new class implements modes.CodeActionProvider { - provideCodeActions(): modes.CodeActionList { + const provider = new class implements languages.CodeActionProvider { + provideCodeActions(): languages.CodeActionList { wasInvoked = true; return { actions: [], dispose: () => { } }; } @@ -270,10 +273,10 @@ suite('CodeAction', () => { providedCodeActionKinds = [CodeActionKind.Refactor.value]; }; - disposables.add(modes.CodeActionProviderRegistry.register('fooLang', provider)); + disposables.add(registry.register('fooLang', provider)); - const { validActions: actions } = await getCodeActions(model, new Range(1, 1, 2, 1), { - type: modes.CodeActionTriggerType.Auto, + const { validActions: actions } = await getCodeActions(registry, model, new Range(1, 1, 2, 1), { + type: languages.CodeActionTriggerType.Auto, filter: { include: CodeActionKind.QuickFix } diff --git a/src/vs/editor/contrib/codeAction/test/codeActionKeybindingResolver.test.ts b/src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts similarity index 95% rename from src/vs/editor/contrib/codeAction/test/codeActionKeybindingResolver.test.ts rename to src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts index 11c57579648..6e039fa0fe3 100644 --- a/src/vs/editor/contrib/codeAction/test/codeActionKeybindingResolver.test.ts +++ b/src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts @@ -7,9 +7,9 @@ import * as assert from 'assert'; import { KeyCode } from 'vs/base/common/keyCodes'; import { ChordKeybinding, SimpleKeybinding } from 'vs/base/common/keybindings'; import { OperatingSystem } from 'vs/base/common/platform'; -import { organizeImportsCommandId, refactorCommandId } from 'vs/editor/contrib/codeAction/codeAction'; -import { CodeActionKeybindingResolver } from 'vs/editor/contrib/codeAction/codeActionMenu'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/types'; +import { organizeImportsCommandId, refactorCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { CodeActionKeybindingResolver } from 'vs/editor/contrib/codeAction/browser/codeActionMenu'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; diff --git a/src/vs/editor/contrib/codeAction/test/codeActionModel.test.ts b/src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts similarity index 81% rename from src/vs/editor/contrib/codeAction/test/codeActionModel.test.ts rename to src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts index 3f6e608141b..a2a688534d0 100644 --- a/src/vs/editor/contrib/codeAction/test/codeActionModel.test.ts +++ b/src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts @@ -11,15 +11,16 @@ import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Selection } from 'vs/editor/common/core/selection'; import { TextModel } from 'vs/editor/common/model/textModel'; -import * as modes from 'vs/editor/common/languages'; -import { CodeActionModel, CodeActionsState } from 'vs/editor/contrib/codeAction/codeActionModel'; +import * as languages from 'vs/editor/common/languages'; +import { CodeActionModel, CodeActionsState } from 'vs/editor/contrib/codeAction/browser/codeActionModel'; import { createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { MarkerService } from 'vs/platform/markers/common/markerService'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; const testProvider = { - provideCodeActions(): modes.CodeActionList { + provideCodeActions(): languages.CodeActionList { return { actions: [ { title: 'test', command: { id: 'test-command', title: 'test', arguments: [] } } @@ -36,6 +37,7 @@ suite('CodeActionModel', () => { let model: TextModel; let markerService: MarkerService; let editor: ICodeEditor; + let registry: LanguageFeatureRegistry; const disposables = new DisposableStore(); setup(() => { @@ -44,6 +46,7 @@ suite('CodeActionModel', () => { model = createTextModel('foobar foo bar\nfarboo far boo', languageId, undefined, uri); editor = createTestCodeEditor(model); editor.setPosition({ lineNumber: 1, column: 1 }); + registry = new LanguageFeatureRegistry(); }); teardown(() => { @@ -59,15 +62,15 @@ suite('CodeActionModel', () => { done = resolve; }); await runWithFakedTimers({ useFakeTimers: true }, () => { - const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider); + const reg = registry.register(languageId, testProvider); disposables.add(reg); const contextKeys = new MockContextKeyService(); - const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined)); + const model = disposables.add(new CodeActionModel(editor, registry, markerService, contextKeys, undefined)); disposables.add(model.onDidChangeState((e: CodeActionsState.State) => { assertType(e.type === CodeActionsState.Type.Triggered); - assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto); + assert.strictEqual(e.trigger.type, languages.CodeActionTriggerType.Auto); assert.ok(e.actions); e.actions.then(fixes => { @@ -91,7 +94,7 @@ suite('CodeActionModel', () => { test('Oracle -> position changed', async () => { await runWithFakedTimers({ useFakeTimers: true }, () => { - const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider); + const reg = registry.register(languageId, testProvider); disposables.add(reg); markerService.changeOne('fake', uri, [{ @@ -106,11 +109,11 @@ suite('CodeActionModel', () => { return new Promise((resolve, reject) => { const contextKeys = new MockContextKeyService(); - const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined)); + const model = disposables.add(new CodeActionModel(editor, registry, markerService, contextKeys, undefined)); disposables.add(model.onDidChangeState((e: CodeActionsState.State) => { assertType(e.type === CodeActionsState.Type.Triggered); - assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto); + assert.strictEqual(e.trigger.type, languages.CodeActionTriggerType.Auto); assert.ok(e.actions); e.actions.then(fixes => { model.dispose(); @@ -125,8 +128,8 @@ suite('CodeActionModel', () => { }); test('Lightbulb is in the wrong place, #29933', async () => { - const reg = modes.CodeActionProviderRegistry.register(languageId, { - provideCodeActions(_doc, _range): modes.CodeActionList { + const reg = registry.register(languageId, { + provideCodeActions(_doc, _range): languages.CodeActionList { return { actions: [], dispose() { /* noop*/ } }; } }); @@ -146,11 +149,11 @@ suite('CodeActionModel', () => { // case 1 - drag selection over multiple lines -> range of enclosed marker, position or marker await new Promise(resolve => { const contextKeys = new MockContextKeyService(); - const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined)); + const model = disposables.add(new CodeActionModel(editor, registry, markerService, contextKeys, undefined)); disposables.add(model.onDidChangeState((e: CodeActionsState.State) => { assertType(e.type === CodeActionsState.Type.Triggered); - assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto); + assert.strictEqual(e.trigger.type, languages.CodeActionTriggerType.Auto); const selection = e.rangeOrSelection; assert.strictEqual(selection.selectionStartLineNumber, 1); assert.strictEqual(selection.selectionStartColumn, 1); @@ -172,16 +175,16 @@ suite('CodeActionModel', () => { const donePromise = new Promise(resolve => { done = resolve; }); await runWithFakedTimers({ useFakeTimers: true }, () => { - const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider); + const reg = registry.register(languageId, testProvider); disposables.add(reg); let triggerCount = 0; const contextKeys = new MockContextKeyService(); - const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined)); + const model = disposables.add(new CodeActionModel(editor, registry, markerService, contextKeys, undefined)); disposables.add(model.onDidChangeState((e: CodeActionsState.State) => { assertType(e.type === CodeActionsState.Type.Triggered); - assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto); + assert.strictEqual(e.trigger.type, languages.CodeActionTriggerType.Auto); ++triggerCount; // give time for second trigger before completing test diff --git a/src/vs/editor/contrib/codelens/codeLensCache.ts b/src/vs/editor/contrib/codelens/browser/codeLensCache.ts similarity index 98% rename from src/vs/editor/contrib/codelens/codeLensCache.ts rename to src/vs/editor/contrib/codelens/browser/codeLensCache.ts index 1f445f47dca..d3999833da7 100644 --- a/src/vs/editor/contrib/codelens/codeLensCache.ts +++ b/src/vs/editor/contrib/codelens/browser/codeLensCache.ts @@ -9,7 +9,7 @@ import { LRUCache } from 'vs/base/common/map'; import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; import { CodeLens, CodeLensList, CodeLensProvider } from 'vs/editor/common/languages'; -import { CodeLensModel } from 'vs/editor/contrib/codelens/codelens'; +import { CodeLensModel } from 'vs/editor/contrib/codelens/browser/codelens'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService, StorageScope, StorageTarget, WillSaveStateReason } from 'vs/platform/storage/common/storage'; diff --git a/src/vs/editor/contrib/codelens/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts similarity index 85% rename from src/vs/editor/contrib/codelens/codelens.ts rename to src/vs/editor/contrib/codelens/browser/codelens.ts index 0bf2566db24..229338ec186 100644 --- a/src/vs/editor/contrib/codelens/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -9,9 +9,11 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; -import { CodeLens, CodeLensList, CodeLensProvider, CodeLensProviderRegistry } from 'vs/editor/common/languages'; +import { CodeLens, CodeLensList, CodeLensProvider } from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export interface CodeLensItem { symbol: CodeLens; @@ -40,9 +42,9 @@ export class CodeLensModel { } } -export async function getCodeLensModel(model: ITextModel, token: CancellationToken): Promise { +export async function getCodeLensModel(registry: LanguageFeatureRegistry, model: ITextModel, token: CancellationToken): Promise { - const provider = CodeLensProviderRegistry.ordered(model); + const provider = registry.ordered(model); const providerRanks = new Map(); const result = new CodeLensModel(); @@ -88,6 +90,8 @@ CommandsRegistry.registerCommand('_executeCodeLensProvider', function (accessor, assertType(URI.isUri(uri)); assertType(typeof itemResolveCount === 'number' || !itemResolveCount); + const { codeLensProvider } = accessor.get(ILanguageFeaturesService); + const model = accessor.get(IModelService).getModel(uri); if (!model) { throw illegalArgument(); @@ -95,7 +99,7 @@ CommandsRegistry.registerCommand('_executeCodeLensProvider', function (accessor, const result: CodeLens[] = []; const disposables = new DisposableStore(); - return getCodeLensModel(model, CancellationToken.None).then(value => { + return getCodeLensModel(codeLensProvider, model, CancellationToken.None).then(value => { disposables.add(value); let resolve: Promise[] = []; diff --git a/src/vs/editor/contrib/codelens/codelensController.ts b/src/vs/editor/contrib/codelens/browser/codelensController.ts similarity index 93% rename from src/vs/editor/contrib/codelens/codelensController.ts rename to src/vs/editor/contrib/codelens/browser/codelensController.ts index 7fabde50d14..d2d2eca45e7 100644 --- a/src/vs/editor/contrib/codelens/codelensController.ts +++ b/src/vs/editor/contrib/codelens/browser/codelensController.ts @@ -8,22 +8,23 @@ import { CancelablePromise, createCancelablePromise, disposableTimeout, RunOnceS import { onUnexpectedError, onUnexpectedExternalError } from 'vs/base/common/errors'; import { hash } from 'vs/base/common/hash'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; -import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; +import { StableEditorScrollState } from 'vs/editor/browser/stableEditorScroll'; import { IActiveCodeEditor, ICodeEditor, IViewZoneChangeAccessor, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { EditorOption, EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IModelDecorationsChangeAccessor } from 'vs/editor/common/model'; -import { CodeLens, CodeLensProviderRegistry, Command } from 'vs/editor/common/languages'; -import { CodeLensItem, CodeLensModel, getCodeLensModel } from 'vs/editor/contrib/codelens/codelens'; -import { ICodeLensCache } from 'vs/editor/contrib/codelens/codeLensCache'; -import { CodeLensHelper, CodeLensWidget } from 'vs/editor/contrib/codelens/codelensWidget'; +import { CodeLens, Command } from 'vs/editor/common/languages'; +import { CodeLensItem, CodeLensModel, getCodeLensModel } from 'vs/editor/contrib/codelens/browser/codelens'; +import { ICodeLensCache } from 'vs/editor/contrib/codelens/browser/codeLensCache'; +import { CodeLensHelper, CodeLensWidget } from 'vs/editor/contrib/codelens/browser/codelensWidget'; import { localize } from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class CodeLensContribution implements IEditorContribution { @@ -46,13 +47,14 @@ export class CodeLensContribution implements IEditorContribution { constructor( private readonly _editor: ICodeEditor, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, @ILanguageFeatureDebounceService debounceService: ILanguageFeatureDebounceService, @ICommandService private readonly _commandService: ICommandService, @INotificationService private readonly _notificationService: INotificationService, @ICodeLensCache private readonly _codeLensCache: ICodeLensCache ) { - this._provideCodeLensDebounce = debounceService.for(CodeLensProviderRegistry, { min: 250 }); - this._resolveCodeLensesDebounce = debounceService.for(CodeLensProviderRegistry, { min: 250, salt: 'resolve' }); + this._provideCodeLensDebounce = debounceService.for(_languageFeaturesService.codeLensProvider, 'CodeLensProvide', { min: 250 }); + this._resolveCodeLensesDebounce = debounceService.for(_languageFeaturesService.codeLensProvider, 'CodeLensResolve', { min: 250, salt: 'resolve' }); this._resolveCodeLensesScheduler = new RunOnceScheduler(() => this._resolveCodeLensesInViewport(), this._resolveCodeLensesDebounce.default()); this._disposables.add(this._editor.onDidChangeModel(() => this._onModelChange())); @@ -65,7 +67,7 @@ export class CodeLensContribution implements IEditorContribution { this._onModelChange(); } })); - this._disposables.add(CodeLensProviderRegistry.onDidChange(this._onModelChange, this)); + this._disposables.add(_languageFeaturesService.codeLensProvider.onDidChange(this._onModelChange, this)); this._onModelChange(); this._styleClassName = '_' + hash(this._editor.getId()).toString(16); @@ -153,7 +155,7 @@ export class CodeLensContribution implements IEditorContribution { this._renderCodeLensSymbols(cachedLenses); } - if (!CodeLensProviderRegistry.has(model)) { + if (!this._languageFeaturesService.codeLensProvider.has(model)) { // no provider -> return but check with // cached lenses. they expire after 30 seconds if (cachedLenses) { @@ -168,7 +170,7 @@ export class CodeLensContribution implements IEditorContribution { return; } - for (const provider of CodeLensProviderRegistry.all(model)) { + for (const provider of this._languageFeaturesService.codeLensProvider.all(model)) { if (typeof provider.onDidChange === 'function') { let registration = provider.onDidChange(() => scheduler.schedule()); this._localToDispose.add(registration); @@ -179,7 +181,7 @@ export class CodeLensContribution implements IEditorContribution { const t1 = Date.now(); this._getCodeLensModelPromise?.cancel(); - this._getCodeLensModelPromise = createCancelablePromise(token => getCodeLensModel(model, token)); + this._getCodeLensModelPromise = createCancelablePromise(token => getCodeLensModel(this._languageFeaturesService.codeLensProvider, model, token)); this._getCodeLensModelPromise.then(result => { if (this._currentCodeLensModel) { @@ -484,7 +486,7 @@ registerEditorAction(class ShowLensesInCurrentLine extends EditorAction { return; } - const items: { label: string, command: Command }[] = []; + const items: { label: string; command: Command }[] = []; for (const lens of model.lenses) { if (lens.symbol.command && lens.symbol.range.startLineNumber === lineNumber) { items.push({ diff --git a/src/vs/editor/contrib/codelens/codelensWidget.css b/src/vs/editor/contrib/codelens/browser/codelensWidget.css similarity index 100% rename from src/vs/editor/contrib/codelens/codelensWidget.css rename to src/vs/editor/contrib/codelens/browser/codelensWidget.css diff --git a/src/vs/editor/contrib/codelens/codelensWidget.ts b/src/vs/editor/contrib/codelens/browser/codelensWidget.ts similarity index 99% rename from src/vs/editor/contrib/codelens/codelensWidget.ts rename to src/vs/editor/contrib/codelens/browser/codelensWidget.ts index 64bb8640009..2eebad09917 100644 --- a/src/vs/editor/contrib/codelens/codelensWidget.ts +++ b/src/vs/editor/contrib/codelens/browser/codelensWidget.ts @@ -12,7 +12,7 @@ import { Range } from 'vs/editor/common/core/range'; import { IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { CodeLens, Command } from 'vs/editor/common/languages'; -import { CodeLensItem } from 'vs/editor/contrib/codelens/codelens'; +import { CodeLensItem } from 'vs/editor/contrib/codelens/browser/codelens'; class CodeLensViewZone implements IViewZone { diff --git a/src/vs/editor/contrib/colorPicker/color.ts b/src/vs/editor/contrib/colorPicker/browser/color.ts similarity index 78% rename from src/vs/editor/contrib/colorPicker/color.ts rename to src/vs/editor/contrib/colorPicker/browser/color.ts index 3e89fdf9b14..a1c10b2f148 100644 --- a/src/vs/editor/contrib/colorPicker/color.ts +++ b/src/vs/editor/contrib/colorPicker/browser/color.ts @@ -8,9 +8,11 @@ import { illegalArgument } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import { ColorProviderRegistry, DocumentColorProvider, IColorInformation, IColorPresentation } from 'vs/editor/common/languages'; +import { DocumentColorProvider, IColorInformation, IColorPresentation } from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; export interface IColorData { @@ -18,9 +20,9 @@ export interface IColorData { provider: DocumentColorProvider; } -export function getColors(model: ITextModel, token: CancellationToken): Promise { +export function getColors(registry: LanguageFeatureRegistry, model: ITextModel, token: CancellationToken): Promise { const colors: IColorData[] = []; - const providers = ColorProviderRegistry.ordered(model).reverse(); + const providers = registry.ordered(model).reverse(); const promises = providers.map(provider => Promise.resolve(provider.provideDocumentColors(model, token)).then(result => { if (Array.isArray(result)) { for (let colorInfo of result) { @@ -42,14 +44,14 @@ CommandsRegistry.registerCommand('_executeDocumentColorProvider', function (acce if (!(resource instanceof URI)) { throw illegalArgument(); } - + const { colorProvider: colorProviderRegistry } = accessor.get(ILanguageFeaturesService); const model = accessor.get(IModelService).getModel(resource); if (!model) { throw illegalArgument(); } - const rawCIs: { range: IRange, color: [number, number, number, number] }[] = []; - const providers = ColorProviderRegistry.ordered(model).reverse(); + const rawCIs: { range: IRange; color: [number, number, number, number] }[] = []; + const providers = colorProviderRegistry.ordered(model).reverse(); const promises = providers.map(provider => Promise.resolve(provider.provideDocumentColors(model, CancellationToken.None)).then(result => { if (Array.isArray(result)) { for (let ci of result) { @@ -71,6 +73,7 @@ CommandsRegistry.registerCommand('_executeColorPresentationProvider', function ( } const [red, green, blue, alpha] = color; + const { colorProvider: colorProviderRegistry } = accessor.get(ILanguageFeaturesService); const model = accessor.get(IModelService).getModel(uri); if (!model) { throw illegalArgument(); @@ -82,7 +85,7 @@ CommandsRegistry.registerCommand('_executeColorPresentationProvider', function ( }; const presentations: IColorPresentation[] = []; - const providers = ColorProviderRegistry.ordered(model).reverse(); + const providers = colorProviderRegistry.ordered(model).reverse(); const promises = providers.map(provider => Promise.resolve(provider.provideColorPresentations(model, colorInfo, CancellationToken.None)).then(result => { if (Array.isArray(result)) { presentations.push(...result); diff --git a/src/vs/editor/contrib/colorPicker/colorContributions.ts b/src/vs/editor/contrib/colorPicker/browser/colorContributions.ts similarity index 81% rename from src/vs/editor/contrib/colorPicker/colorContributions.ts rename to src/vs/editor/contrib/colorPicker/browser/colorContributions.ts index 7d1f5b8d2e9..c6a4071877f 100644 --- a/src/vs/editor/contrib/colorPicker/colorContributions.ts +++ b/src/vs/editor/contrib/colorPicker/browser/colorContributions.ts @@ -8,9 +8,11 @@ import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/brows import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { ColorDecorationInjectedTextMarker } from 'vs/editor/contrib/colorPicker/colorDetector'; -import { ModesHoverController } from 'vs/editor/contrib/hover/hover'; -import { HoverStartMode } from 'vs/editor/contrib/hover/hoverOperation'; +import { ColorDecorationInjectedTextMarker } from 'vs/editor/contrib/colorPicker/browser/colorDetector'; +import { ColorHoverParticipant } from 'vs/editor/contrib/colorPicker/browser/colorHoverParticipant'; +import { ModesHoverController } from 'vs/editor/contrib/hover/browser/hover'; +import { HoverStartMode } from 'vs/editor/contrib/hover/browser/hoverOperation'; +import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes'; export class ColorContribution extends Disposable implements IEditorContribution { @@ -59,3 +61,4 @@ export class ColorContribution extends Disposable implements IEditorContribution } registerEditorContribution(ColorContribution.ID, ColorContribution); +HoverParticipantRegistry.register(ColorHoverParticipant); diff --git a/src/vs/editor/contrib/colorPicker/colorDetector.ts b/src/vs/editor/contrib/colorPicker/browser/colorDetector.ts similarity index 86% rename from src/vs/editor/contrib/colorPicker/colorDetector.ts rename to src/vs/editor/contrib/colorPicker/browser/colorDetector.ts index e2d3b148c42..2a312a7c9b8 100644 --- a/src/vs/editor/contrib/colorPicker/colorDetector.ts +++ b/src/vs/editor/contrib/colorPicker/browser/colorDetector.ts @@ -7,6 +7,7 @@ import { CancelablePromise, createCancelablePromise, TimeoutTimer } from 'vs/bas import { RGBA } from 'vs/base/common/color'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { StopWatch } from 'vs/base/common/stopwatch'; import { noBreakWhitespace } from 'vs/base/common/strings'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { DynamicCssRules } from 'vs/editor/browser/editorDom'; @@ -17,8 +18,9 @@ import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { IModelDeltaDecoration } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { ColorProviderRegistry } from 'vs/editor/common/languages'; -import { getColors, IColorData } from 'vs/editor/contrib/colorPicker/color'; +import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { getColors, IColorData } from 'vs/editor/contrib/colorPicker/browser/color'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export const ColorDecorationInjectedTextMarker = Object.create({}); @@ -34,6 +36,7 @@ export class ColorDetector extends Disposable implements IEditorContribution { private readonly _localToDispose = this._register(new DisposableStore()); private _computePromise: CancelablePromise | null; private _timeoutTimer: TimeoutTimer | null; + private _debounceInformation: IFeatureDebounceInformation; private _decorationsIds: string[] = []; private _colorDatas = new Map(); @@ -46,15 +49,18 @@ export class ColorDetector extends Disposable implements IEditorContribution { constructor( private readonly _editor: ICodeEditor, - @IConfigurationService private readonly _configurationService: IConfigurationService + @IConfigurationService private readonly _configurationService: IConfigurationService, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, + @ILanguageFeatureDebounceService languageFeatureDebounceService: ILanguageFeatureDebounceService, ) { super(); + this._debounceInformation = languageFeatureDebounceService.for(_languageFeaturesService.colorProvider, 'Document Colors', { min: ColorDetector.RECOMPUTE_TIME }); this._register(_editor.onDidChangeModel(() => { this._isEnabled = this.isEnabled(); this.onModelChanged(); })); this._register(_editor.onDidChangeModelLanguage(() => this.onModelChanged())); - this._register(ColorProviderRegistry.onDidChange(() => this.onModelChanged())); + this._register(_languageFeaturesService.colorProvider.onDidChange(() => this.onModelChanged())); this._register(_editor.onDidChangeConfiguration(() => { let prevIsEnabled = this._isEnabled; this._isEnabled = this.isEnabled(); @@ -109,7 +115,7 @@ export class ColorDetector extends Disposable implements IEditorContribution { } const model = this._editor.getModel(); - if (!model || !ColorProviderRegistry.has(model)) { + if (!model || !this._languageFeaturesService.colorProvider.has(model)) { return; } @@ -119,19 +125,22 @@ export class ColorDetector extends Disposable implements IEditorContribution { this._timeoutTimer.cancelAndSet(() => { this._timeoutTimer = null; this.beginCompute(); - }, ColorDetector.RECOMPUTE_TIME); + }, this._debounceInformation.get(model)); } })); this.beginCompute(); } private beginCompute(): void { - this._computePromise = createCancelablePromise(token => { + this._computePromise = createCancelablePromise(async token => { const model = this._editor.getModel(); if (!model) { return Promise.resolve([]); } - return getColors(model, token); + const sw = new StopWatch(false); + const colors = await getColors(this._languageFeaturesService.colorProvider, model, token); + this._debounceInformation.update(model, sw.elapsed()); + return colors; }); this._computePromise.then((colorInfos) => { this.updateDecorations(colorInfos); diff --git a/src/vs/editor/contrib/hover/colorHoverParticipant.ts b/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts similarity index 90% rename from src/vs/editor/contrib/hover/colorHoverParticipant.ts rename to src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts index c38ec304835..406407f5fd4 100644 --- a/src/vs/editor/contrib/hover/colorHoverParticipant.ts +++ b/src/vs/editor/contrib/colorPicker/browser/colorHoverParticipant.ts @@ -10,14 +10,15 @@ import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecyc import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; -import { IIdentifiedSingleEditOperation, IModelDecoration, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { IModelDecoration, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { DocumentColorProvider, IColorInformation } from 'vs/editor/common/languages'; -import { getColorPresentations } from 'vs/editor/contrib/colorPicker/color'; -import { ColorDetector } from 'vs/editor/contrib/colorPicker/colorDetector'; -import { ColorPickerModel } from 'vs/editor/contrib/colorPicker/colorPickerModel'; -import { ColorPickerWidget } from 'vs/editor/contrib/colorPicker/colorPickerWidget'; -import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/hoverTypes'; +import { getColorPresentations } from 'vs/editor/contrib/colorPicker/browser/color'; +import { ColorDetector } from 'vs/editor/contrib/colorPicker/browser/colorDetector'; +import { ColorPickerModel } from 'vs/editor/contrib/colorPicker/browser/colorPickerModel'; +import { ColorPickerWidget } from 'vs/editor/contrib/colorPicker/browser/colorPickerWidget'; +import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; export class ColorHover implements IHoverPart { @@ -45,6 +46,8 @@ export class ColorHover implements IHoverPart { export class ColorHoverParticipant implements IEditorHoverParticipant { + public readonly hoverOrdinal: number = 1; + constructor( private readonly _editor: ICodeEditor, @IThemeService private readonly _themeService: IThemeService, @@ -110,10 +113,10 @@ export class ColorHoverParticipant implements IEditorHoverParticipant { - let textEdits: IIdentifiedSingleEditOperation[]; + let textEdits: ISingleEditOperation[]; let newRange: Range; if (model.presentation.textEdit) { - textEdits = [model.presentation.textEdit as IIdentifiedSingleEditOperation]; + textEdits = [model.presentation.textEdit]; newRange = new Range( model.presentation.textEdit.range.startLineNumber, model.presentation.textEdit.range.startColumn, @@ -125,14 +128,14 @@ export class ColorHoverParticipant implements IEditorHoverParticipant | null; - private readonly _onDidChange = new Emitter<{ s: number, v: number }>(); - readonly onDidChange: Event<{ s: number, v: number }> = this._onDidChange.event; + private readonly _onDidChange = new Emitter<{ s: number; v: number }>(); + readonly onDidChange: Event<{ s: number; v: number }> = this._onDidChange.event; private readonly _onColorFlushed = new Emitter(); readonly onColorFlushed: Event = this._onColorFlushed.event; @@ -336,7 +337,7 @@ class HueStrip extends Strip { } } -export class ColorPickerWidget extends Widget { +export class ColorPickerWidget extends Widget implements IEditorHoverColorPickerWidget { private static readonly ID = 'editor.contrib.colorPickerWidget'; diff --git a/src/vs/editor/contrib/colorPicker/images/opacity-background.png b/src/vs/editor/contrib/colorPicker/browser/images/opacity-background.png similarity index 100% rename from src/vs/editor/contrib/colorPicker/images/opacity-background.png rename to src/vs/editor/contrib/colorPicker/browser/images/opacity-background.png diff --git a/src/vs/editor/contrib/comment/blockCommentCommand.ts b/src/vs/editor/contrib/comment/browser/blockCommentCommand.ts similarity index 94% rename from src/vs/editor/contrib/comment/blockCommentCommand.ts rename to src/vs/editor/contrib/comment/browser/blockCommentCommand.ts index 47485dc3c0d..b0a162d3422 100644 --- a/src/vs/editor/contrib/comment/blockCommentCommand.ts +++ b/src/vs/editor/contrib/comment/browser/blockCommentCommand.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { CharCode } from 'vs/base/common/charCode'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; -import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; export class BlockCommentCommand implements ICommand { @@ -93,7 +93,7 @@ export class BlockCommentCommand implements ICommand { } } - let ops: IIdentifiedSingleEditOperation[]; + let ops: ISingleEditOperation[]; if (startTokenIndex !== -1 && endTokenIndex !== -1) { // Consider spaces as part of the comment tokens @@ -120,8 +120,8 @@ export class BlockCommentCommand implements ICommand { } } - public static _createRemoveBlockCommentOperations(r: Range, startToken: string, endToken: string): IIdentifiedSingleEditOperation[] { - let res: IIdentifiedSingleEditOperation[] = []; + public static _createRemoveBlockCommentOperations(r: Range, startToken: string, endToken: string): ISingleEditOperation[] { + let res: ISingleEditOperation[] = []; if (!Range.isEmpty(r)) { // Remove block comment start @@ -146,8 +146,8 @@ export class BlockCommentCommand implements ICommand { return res; } - public static _createAddBlockCommentOperations(r: Range, startToken: string, endToken: string, insertSpace: boolean): IIdentifiedSingleEditOperation[] { - let res: IIdentifiedSingleEditOperation[] = []; + public static _createAddBlockCommentOperations(r: Range, startToken: string, endToken: string, insertSpace: boolean): ISingleEditOperation[] { + let res: ISingleEditOperation[] = []; if (!Range.isEmpty(r)) { // Insert block comment start diff --git a/src/vs/editor/contrib/comment/comment.ts b/src/vs/editor/contrib/comment/browser/comment.ts similarity index 98% rename from src/vs/editor/contrib/comment/comment.ts rename to src/vs/editor/contrib/comment/browser/comment.ts index 33ca5a5a099..538d6a3ca6c 100644 --- a/src/vs/editor/contrib/comment/comment.ts +++ b/src/vs/editor/contrib/comment/browser/comment.ts @@ -11,8 +11,8 @@ import { Range } from 'vs/editor/common/core/range'; import { ICommand } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { BlockCommentCommand } from 'vs/editor/contrib/comment/blockCommentCommand'; -import { LineCommentCommand, Type } from 'vs/editor/contrib/comment/lineCommentCommand'; +import { BlockCommentCommand } from 'vs/editor/contrib/comment/browser/blockCommentCommand'; +import { LineCommentCommand, Type } from 'vs/editor/contrib/comment/browser/lineCommentCommand'; import * as nls from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; diff --git a/src/vs/editor/contrib/comment/lineCommentCommand.ts b/src/vs/editor/contrib/comment/browser/lineCommentCommand.ts similarity index 96% rename from src/vs/editor/contrib/comment/lineCommentCommand.ts rename to src/vs/editor/contrib/comment/browser/lineCommentCommand.ts index dde561f1759..e9c96926006 100644 --- a/src/vs/editor/contrib/comment/lineCommentCommand.ts +++ b/src/vs/editor/contrib/comment/browser/lineCommentCommand.ts @@ -6,14 +6,14 @@ import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; import { Constants } from 'vs/base/common/uint'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; -import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; import { ILanguageConfigurationService, LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { BlockCommentCommand } from 'vs/editor/contrib/comment/blockCommentCommand'; +import { BlockCommentCommand } from 'vs/editor/contrib/comment/browser/blockCommentCommand'; export interface IInsertionPoint { ignore: boolean; @@ -204,7 +204,7 @@ export class LineCommentCommand implements ICommand { */ private _executeLineComments(model: ISimpleModel, builder: IEditOperationBuilder, data: IPreflightDataSupported, s: Selection): void { - let ops: IIdentifiedSingleEditOperation[]; + let ops: ISingleEditOperation[]; if (data.shouldRemoveComments) { ops = LineCommentCommand._createRemoveLineCommentsOperations(data.lines, s.startLineNumber); @@ -228,7 +228,7 @@ export class LineCommentCommand implements ICommand { this._selectionId = builder.trackSelection(s); } - private _attemptRemoveBlockComment(model: ITextModel, s: Selection, startToken: string, endToken: string): IIdentifiedSingleEditOperation[] | null { + private _attemptRemoveBlockComment(model: ITextModel, s: Selection, startToken: string, endToken: string): ISingleEditOperation[] | null { let startLineNumber = s.startLineNumber; let endLineNumber = s.endLineNumber; @@ -380,8 +380,8 @@ export class LineCommentCommand implements ICommand { /** * Generate edit operations in the remove line comment case */ - public static _createRemoveLineCommentsOperations(lines: ILinePreflightData[], startLineNumber: number): IIdentifiedSingleEditOperation[] { - let res: IIdentifiedSingleEditOperation[] = []; + public static _createRemoveLineCommentsOperations(lines: ILinePreflightData[], startLineNumber: number): ISingleEditOperation[] { + let res: ISingleEditOperation[] = []; for (let i = 0, len = lines.length; i < len; i++) { const lineData = lines[i]; @@ -402,8 +402,8 @@ export class LineCommentCommand implements ICommand { /** * Generate edit operations in the add line comment case */ - private _createAddLineCommentsOperations(lines: ILinePreflightData[], startLineNumber: number): IIdentifiedSingleEditOperation[] { - let res: IIdentifiedSingleEditOperation[] = []; + private _createAddLineCommentsOperations(lines: ILinePreflightData[], startLineNumber: number): ISingleEditOperation[] { + let res: ISingleEditOperation[] = []; const afterCommentStr = this._insertSpace ? ' ' : ''; diff --git a/src/vs/editor/contrib/comment/test/blockCommentCommand.test.ts b/src/vs/editor/contrib/comment/test/browser/blockCommentCommand.test.ts similarity index 99% rename from src/vs/editor/contrib/comment/test/blockCommentCommand.test.ts rename to src/vs/editor/contrib/comment/test/browser/blockCommentCommand.test.ts index a21f7948b66..db8f9ccde1d 100644 --- a/src/vs/editor/contrib/comment/test/blockCommentCommand.test.ts +++ b/src/vs/editor/contrib/comment/test/browser/blockCommentCommand.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Selection } from 'vs/editor/common/core/selection'; -import { BlockCommentCommand } from 'vs/editor/contrib/comment/blockCommentCommand'; +import { BlockCommentCommand } from 'vs/editor/contrib/comment/browser/blockCommentCommand'; import { testCommand } from 'vs/editor/test/browser/testCommand'; import { CommentMode } from 'vs/editor/test/common/commentMode'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; diff --git a/src/vs/editor/contrib/comment/test/lineCommentCommand.test.ts b/src/vs/editor/contrib/comment/test/browser/lineCommentCommand.test.ts similarity index 98% rename from src/vs/editor/contrib/comment/test/lineCommentCommand.test.ts rename to src/vs/editor/contrib/comment/test/browser/lineCommentCommand.test.ts index 57038622cab..4af97443a7e 100644 --- a/src/vs/editor/contrib/comment/test/lineCommentCommand.test.ts +++ b/src/vs/editor/contrib/comment/test/browser/lineCommentCommand.test.ts @@ -6,14 +6,13 @@ import * as assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Selection } from 'vs/editor/common/core/selection'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; import { ICommand } from 'vs/editor/common/editorCommon'; -import { ColorId, IState, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; +import { EncodedTokenizationResult, ColorId, IState, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; import { CommentRule } from 'vs/editor/common/languages/languageConfiguration'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { NullState } from 'vs/editor/common/languages/nullMode'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { ILinePreflightData, IPreflightData, ISimpleModel, LineCommentCommand, Type } from 'vs/editor/contrib/comment/lineCommentCommand'; +import { NullState } from 'vs/editor/common/languages/nullTokenize'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { ILinePreflightData, IPreflightData, ISimpleModel, LineCommentCommand, Type } from 'vs/editor/contrib/comment/browser/lineCommentCommand'; import { testCommand } from 'vs/editor/test/browser/testCommand'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { CommentMode } from 'vs/editor/test/common/commentMode'; diff --git a/src/vs/editor/contrib/contextmenu/contextmenu.ts b/src/vs/editor/contrib/contextmenu/browser/contextmenu.ts similarity index 100% rename from src/vs/editor/contrib/contextmenu/contextmenu.ts rename to src/vs/editor/contrib/contextmenu/browser/contextmenu.ts diff --git a/src/vs/editor/contrib/cursorUndo/cursorUndo.ts b/src/vs/editor/contrib/cursorUndo/browser/cursorUndo.ts similarity index 100% rename from src/vs/editor/contrib/cursorUndo/cursorUndo.ts rename to src/vs/editor/contrib/cursorUndo/browser/cursorUndo.ts diff --git a/src/vs/editor/contrib/cursorUndo/test/cursorUndo.test.ts b/src/vs/editor/contrib/cursorUndo/test/browser/cursorUndo.test.ts similarity index 96% rename from src/vs/editor/contrib/cursorUndo/test/cursorUndo.test.ts rename to src/vs/editor/contrib/cursorUndo/test/browser/cursorUndo.test.ts index faa9341a68a..dbeae91158f 100644 --- a/src/vs/editor/contrib/cursorUndo/test/cursorUndo.test.ts +++ b/src/vs/editor/contrib/cursorUndo/test/browser/cursorUndo.test.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { CoreEditingCommands, CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands, CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { Selection } from 'vs/editor/common/core/selection'; import { Handler } from 'vs/editor/common/editorCommon'; -import { CursorUndo, CursorUndoRedoController } from 'vs/editor/contrib/cursorUndo/cursorUndo'; +import { CursorUndo, CursorUndoRedoController } from 'vs/editor/contrib/cursorUndo/browser/cursorUndo'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; suite('FindController', () => { diff --git a/src/vs/editor/contrib/dnd/dnd.css b/src/vs/editor/contrib/dnd/browser/dnd.css similarity index 100% rename from src/vs/editor/contrib/dnd/dnd.css rename to src/vs/editor/contrib/dnd/browser/dnd.css diff --git a/src/vs/editor/contrib/dnd/dnd.ts b/src/vs/editor/contrib/dnd/browser/dnd.ts similarity index 98% rename from src/vs/editor/contrib/dnd/dnd.ts rename to src/vs/editor/contrib/dnd/browser/dnd.ts index 9ec09a245cb..ce2faf6d2eb 100644 --- a/src/vs/editor/contrib/dnd/dnd.ts +++ b/src/vs/editor/contrib/dnd/browser/dnd.ts @@ -13,14 +13,14 @@ import { ICodeEditor, IEditorMouseEvent, IMouseTarget, IPartialEditorMouseEvent, import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IEditorContribution, ScrollType } from 'vs/editor/common/editorCommon'; import { IModelDeltaDecoration } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { DragAndDropCommand } from 'vs/editor/contrib/dnd/dragAndDropCommand'; +import { DragAndDropCommand } from 'vs/editor/contrib/dnd/browser/dragAndDropCommand'; function hasTriggerModifier(e: IKeyboardEvent | IMouseEvent): boolean { if (isMacintosh) { diff --git a/src/vs/editor/contrib/dnd/dragAndDropCommand.ts b/src/vs/editor/contrib/dnd/browser/dragAndDropCommand.ts similarity index 100% rename from src/vs/editor/contrib/dnd/dragAndDropCommand.ts rename to src/vs/editor/contrib/dnd/browser/dragAndDropCommand.ts diff --git a/src/vs/editor/contrib/documentSymbols/documentSymbols.ts b/src/vs/editor/contrib/documentSymbols/browser/documentSymbols.ts similarity index 97% rename from src/vs/editor/contrib/documentSymbols/documentSymbols.ts rename to src/vs/editor/contrib/documentSymbols/browser/documentSymbols.ts index acf2032b631..cda0a4df066 100644 --- a/src/vs/editor/contrib/documentSymbols/documentSymbols.ts +++ b/src/vs/editor/contrib/documentSymbols/browser/documentSymbols.ts @@ -7,7 +7,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/outlineModel'; +import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; CommandsRegistry.registerCommand('_executeDocumentSymbolProvider', async function (accessor, ...args) { diff --git a/src/vs/editor/contrib/documentSymbols/outlineModel.ts b/src/vs/editor/contrib/documentSymbols/browser/outlineModel.ts similarity index 89% rename from src/vs/editor/contrib/documentSymbols/outlineModel.ts rename to src/vs/editor/contrib/documentSymbols/browser/outlineModel.ts index d67ea9a7671..2ffbf79fd5d 100644 --- a/src/vs/editor/contrib/documentSymbols/outlineModel.ts +++ b/src/vs/editor/contrib/documentSymbols/browser/outlineModel.ts @@ -13,11 +13,15 @@ import { URI } from 'vs/base/common/uri'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import { DocumentSymbol, DocumentSymbolProvider, DocumentSymbolProviderRegistry } from 'vs/editor/common/languages'; +import { DocumentSymbol, DocumentSymbolProvider } from 'vs/editor/common/languages'; import { MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IModelService } from 'vs/editor/common/services/model'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export abstract class TreeElement { @@ -25,8 +29,6 @@ export abstract class TreeElement { abstract children: Map; abstract parent: TreeElement | undefined; - abstract adopt(newParent: TreeElement): TreeElement; - remove(): void { if (this.parent) { this.parent.children.delete(this.id); @@ -98,7 +100,7 @@ export interface IOutlineMarker { export class OutlineElement extends TreeElement { children = new Map(); - marker: { count: number, topSev: MarkerSeverity } | undefined; + marker: { count: number; topSev: MarkerSeverity } | undefined; constructor( readonly id: string, @@ -107,14 +109,6 @@ export class OutlineElement extends TreeElement { ) { super(); } - - adopt(parent: TreeElement): OutlineElement { - let res = new OutlineElement(this.id, parent, this.symbol); - for (const [key, value] of this.children) { - res.children.set(key, value.adopt(res)); - } - return res; - } } export class OutlineGroup extends TreeElement { @@ -130,14 +124,6 @@ export class OutlineGroup extends TreeElement { super(); } - adopt(parent: TreeElement): OutlineGroup { - let res = new OutlineGroup(this.id, parent, this.label, this.order); - for (const [key, value] of this.children) { - res.children.set(key, value.adopt(res)); - } - return res; - } - getItemEnclosingPosition(position: IPosition): OutlineElement | undefined { return position ? this._getItemEnclosingPosition(position, this.children) : undefined; } @@ -208,11 +194,11 @@ export class OutlineGroup extends TreeElement { export class OutlineModel extends TreeElement { - static create(textModel: ITextModel, token: CancellationToken): Promise { + static create(registry: LanguageFeatureRegistry, textModel: ITextModel, token: CancellationToken): Promise { const cts = new CancellationTokenSource(token); const result = new OutlineModel(textModel.uri); - const provider = DocumentSymbolProviderRegistry.ordered(textModel); + const provider = registry.ordered(textModel); const promises = provider.map((provider, index) => { let id = TreeElement.findId(`provider_${index}`, result); @@ -235,8 +221,8 @@ export class OutlineModel extends TreeElement { }); }); - const listener = DocumentSymbolProviderRegistry.onDidChange(() => { - const newProvider = DocumentSymbolProviderRegistry.ordered(textModel); + const listener = registry.onDidChange(() => { + const newProvider = registry.ordered(textModel); if (!equals(newProvider, provider)) { cts.cancel(); } @@ -244,7 +230,7 @@ export class OutlineModel extends TreeElement { return Promise.all(promises).then(() => { if (cts.token.isCancellationRequested && !token.isCancellationRequested) { - return OutlineModel.create(textModel, token); + return OutlineModel.create(registry, textModel, token); } else { return result._compact(); } @@ -287,14 +273,6 @@ export class OutlineModel extends TreeElement { this.parent = undefined; } - adopt(): OutlineModel { - let res = new OutlineModel(this.uri); - for (const [key, value] of this._groups) { - res._groups.set(key, value.adopt(res)); - } - return res._compact(); - } - private _compact(): this { let count = 0; for (const [key, group] of this._groups) { @@ -432,18 +410,31 @@ export class OutlineModelService implements IOutlineModelService { declare _serviceBrand: undefined; + private readonly _disposables = new DisposableStore(); private readonly _debounceInformation: IFeatureDebounceInformation; private readonly _cache = new LRUCache(10, 0.7); constructor( - @ILanguageFeatureDebounceService debounces: ILanguageFeatureDebounceService + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, + @ILanguageFeatureDebounceService debounces: ILanguageFeatureDebounceService, + @IModelService modelService: IModelService ) { - this._debounceInformation = debounces.for(DocumentSymbolProviderRegistry, { min: 350 }); + this._debounceInformation = debounces.for(_languageFeaturesService.documentSymbolProvider, 'DocumentSymbols', { min: 350 }); + + // don't cache outline models longer than their text model + this._disposables.add(modelService.onModelRemoved(textModel => { + this._cache.delete(textModel.id); + })); + } + + dispose(): void { + this._disposables.dispose(); } async getOrCreate(textModel: ITextModel, token: CancellationToken): Promise { - const provider = DocumentSymbolProviderRegistry.ordered(textModel); + const registry = this._languageFeaturesService.documentSymbolProvider; + const provider = registry.ordered(textModel); let data = this._cache.get(textModel.id); if (!data || data.versionId !== textModel.getVersionId() || !equals(data.provider, provider)) { @@ -453,7 +444,7 @@ export class OutlineModelService implements IOutlineModelService { provider, promiseCnt: 0, source, - promise: OutlineModel.create(textModel, source.token), + promise: OutlineModel.create(registry, textModel, source.token), model: undefined, }; this._cache.set(textModel.id, data); diff --git a/src/vs/editor/contrib/documentSymbols/test/outlineModel.test.ts b/src/vs/editor/contrib/documentSymbols/test/browser/outlineModel.test.ts similarity index 82% rename from src/vs/editor/contrib/documentSymbols/test/outlineModel.test.ts rename to src/vs/editor/contrib/documentSymbols/test/browser/outlineModel.test.ts index 7cf98c83f98..d801c2c7722 100644 --- a/src/vs/editor/contrib/documentSymbols/test/outlineModel.test.ts +++ b/src/vs/editor/contrib/documentSymbols/test/browser/outlineModel.test.ts @@ -5,22 +5,36 @@ import * as assert from 'assert'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { Range } from 'vs/editor/common/core/range'; -import { DocumentSymbol, DocumentSymbolProviderRegistry, SymbolKind } from 'vs/editor/common/languages'; +import { DocumentSymbol, SymbolKind } from 'vs/editor/common/languages'; import { LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; -import { createTextModel } from 'vs/editor/test/common/testTextModel'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { IModelService } from 'vs/editor/common/services/model'; +import { createModelServices, createTextModel } from 'vs/editor/test/common/testTextModel'; +import { NullLogService } from 'vs/platform/log/common/log'; import { IMarker, MarkerSeverity } from 'vs/platform/markers/common/markers'; -import { OutlineElement, OutlineGroup, OutlineModel, OutlineModelService } from '../outlineModel'; +import { OutlineElement, OutlineGroup, OutlineModel, OutlineModelService } from '../../browser/outlineModel'; suite('OutlineModel', function () { + let disposables = new DisposableStore(); + const languageFeaturesService = new LanguageFeaturesService(); + + teardown(function () { + disposables.clear(); + }); + test('OutlineModel#create, cached', async function () { - const service = new OutlineModelService(new LanguageFeatureDebounceService()); + + const insta = createModelServices(disposables); + const modelService = insta.get(IModelService); + const service = new OutlineModelService(languageFeaturesService, new LanguageFeatureDebounceService(new NullLogService()), modelService); let model = createTextModel('foo', undefined, undefined, URI.file('/fome/path.foo')); let count = 0; - let reg = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, { + let reg = languageFeaturesService.documentSymbolProvider.register({ pattern: '**/path.foo' }, { provideDocumentSymbols() { count += 1; return []; @@ -45,11 +59,13 @@ suite('OutlineModel', function () { test('OutlineModel#create, cached/cancel', async function () { - const service = new OutlineModelService(new LanguageFeatureDebounceService()); + const insta = createModelServices(disposables); + const modelService = insta.get(IModelService); + const service = new OutlineModelService(languageFeaturesService, new LanguageFeatureDebounceService(new NullLogService()), modelService); let model = createTextModel('foo', undefined, undefined, URI.file('/fome/path.foo')); let isCancelled = false; - let reg = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, { + let reg = languageFeaturesService.documentSymbolProvider.register({ pattern: '**/path.foo' }, { provideDocumentSymbols(d, token) { return new Promise(resolve => { token.onCancellationRequested(_ => { diff --git a/src/vs/editor/browser/core/editorState.ts b/src/vs/editor/contrib/editorState/browser/editorState.ts similarity index 74% rename from src/vs/editor/browser/core/editorState.ts rename to src/vs/editor/contrib/editorState/browser/editorState.ts index 294a7c85cca..3bfadf65dae 100644 --- a/src/vs/editor/browser/core/editorState.ts +++ b/src/vs/editor/contrib/editorState/browser/editorState.ts @@ -10,7 +10,7 @@ import { Range, IRange } from 'vs/editor/common/core/range'; import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cancellation'; import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ITextModel } from 'vs/editor/common/model'; -import { EditorKeybindingCancellationTokenSource } from 'vs/editor/browser/core/keybindingCancellation'; +import { EditorKeybindingCancellationTokenSource } from 'vs/editor/contrib/editorState/browser/keybindingCancellation'; export const enum CodeEditorStateFlag { Value = 1, @@ -142,45 +142,3 @@ export class TextModelCancellationTokenSource extends CancellationTokenSource im super.dispose(); } } - -export class StableEditorScrollState { - - public static capture(editor: ICodeEditor): StableEditorScrollState { - let visiblePosition: Position | null = null; - let visiblePositionScrollDelta = 0; - if (editor.getScrollTop() !== 0) { - const visibleRanges = editor.getVisibleRanges(); - if (visibleRanges.length > 0) { - visiblePosition = visibleRanges[0].getStartPosition(); - const visiblePositionScrollTop = editor.getTopForPosition(visiblePosition.lineNumber, visiblePosition.column); - visiblePositionScrollDelta = editor.getScrollTop() - visiblePositionScrollTop; - } - } - return new StableEditorScrollState(visiblePosition, visiblePositionScrollDelta, editor.getPosition()); - } - - constructor( - private readonly _visiblePosition: Position | null, - private readonly _visiblePositionScrollDelta: number, - private readonly _cursorPosition: Position | null - ) { - } - - public restore(editor: ICodeEditor): void { - if (this._visiblePosition) { - const visiblePositionScrollTop = editor.getTopForPosition(this._visiblePosition.lineNumber, this._visiblePosition.column); - editor.setScrollTop(visiblePositionScrollTop + this._visiblePositionScrollDelta); - } - } - - public restoreRelativeVerticalPositionOfCursor(editor: ICodeEditor): void { - const currentCursorPosition = editor.getPosition(); - - if (!this._cursorPosition || !currentCursorPosition) { - return; - } - - const offset = editor.getTopForLineNumber(currentCursorPosition.lineNumber) - editor.getTopForLineNumber(this._cursorPosition.lineNumber); - editor.setScrollTop(editor.getScrollTop() + offset); - } -} diff --git a/src/vs/editor/browser/core/keybindingCancellation.ts b/src/vs/editor/contrib/editorState/browser/keybindingCancellation.ts similarity index 98% rename from src/vs/editor/browser/core/keybindingCancellation.ts rename to src/vs/editor/contrib/editorState/browser/keybindingCancellation.ts index 2fc418a32a4..7682be5a228 100644 --- a/src/vs/editor/browser/core/keybindingCancellation.ts +++ b/src/vs/editor/contrib/editorState/browser/keybindingCancellation.ts @@ -29,7 +29,7 @@ registerSingleton(IEditorCancellationTokens, class implements IEditorCancellatio declare readonly _serviceBrand: undefined; - private readonly _tokens = new WeakMap, tokens: LinkedList }>(); + private readonly _tokens = new WeakMap; tokens: LinkedList }>(); add(editor: ICodeEditor, cts: CancellationTokenSource): () => void { let data = this._tokens.get(editor); diff --git a/src/vs/editor/test/browser/core/editorState.test.ts b/src/vs/editor/contrib/editorState/test/browser/editorState.test.ts similarity index 94% rename from src/vs/editor/test/browser/core/editorState.test.ts rename to src/vs/editor/contrib/editorState/test/browser/editorState.test.ts index 32534c2b7d2..686847de0c0 100644 --- a/src/vs/editor/test/browser/core/editorState.test.ts +++ b/src/vs/editor/contrib/editorState/test/browser/editorState.test.ts @@ -5,17 +5,17 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; -import { CodeEditorStateFlag, EditorState } from 'vs/editor/browser/core/editorState'; +import { CodeEditorStateFlag, EditorState } from 'vs/editor/contrib/editorState/browser/editorState'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { ITextModel } from 'vs/editor/common/model'; interface IStubEditorState { - model?: { uri?: URI, version?: number }; + model?: { uri?: URI; version?: number }; position?: Position; selection?: Selection; - scroll?: { left?: number, top?: number }; + scroll?: { left?: number; top?: number }; } suite('Editor Core - Editor State', () => { diff --git a/src/vs/editor/contrib/find/findController.ts b/src/vs/editor/contrib/find/browser/findController.ts similarity index 99% rename from src/vs/editor/contrib/find/findController.ts rename to src/vs/editor/contrib/find/browser/findController.ts index 22ffd784036..e7df19f0b3e 100644 --- a/src/vs/editor/contrib/find/findController.ts +++ b/src/vs/editor/contrib/find/browser/findController.ts @@ -12,10 +12,10 @@ import { EditorAction, EditorCommand, MultiEditorAction, registerEditorAction, r import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { CONTEXT_FIND_INPUT_FOCUSED, CONTEXT_FIND_WIDGET_VISIBLE, CONTEXT_REPLACE_INPUT_FOCUSED, FindModelBoundToEditorModel, FIND_IDS, ToggleCaseSensitiveKeybinding, TogglePreserveCaseKeybinding, ToggleRegexKeybinding, ToggleSearchScopeKeybinding, ToggleWholeWordKeybinding } from 'vs/editor/contrib/find/findModel'; -import { FindOptionsWidget } from 'vs/editor/contrib/find/findOptionsWidget'; -import { FindReplaceState, FindReplaceStateChangedEvent, INewFindReplaceState } from 'vs/editor/contrib/find/findState'; -import { FindWidget, IFindController } from 'vs/editor/contrib/find/findWidget'; +import { CONTEXT_FIND_INPUT_FOCUSED, CONTEXT_FIND_WIDGET_VISIBLE, CONTEXT_REPLACE_INPUT_FOCUSED, FindModelBoundToEditorModel, FIND_IDS, ToggleCaseSensitiveKeybinding, TogglePreserveCaseKeybinding, ToggleRegexKeybinding, ToggleSearchScopeKeybinding, ToggleWholeWordKeybinding } from 'vs/editor/contrib/find/browser/findModel'; +import { FindOptionsWidget } from 'vs/editor/contrib/find/browser/findOptionsWidget'; +import { FindReplaceState, FindReplaceStateChangedEvent, INewFindReplaceState } from 'vs/editor/contrib/find/browser/findState'; +import { FindWidget, IFindController } from 'vs/editor/contrib/find/browser/findWidget'; import * as nls from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; diff --git a/src/vs/editor/contrib/find/findDecorations.ts b/src/vs/editor/contrib/find/browser/findDecorations.ts similarity index 100% rename from src/vs/editor/contrib/find/findDecorations.ts rename to src/vs/editor/contrib/find/browser/findDecorations.ts diff --git a/src/vs/editor/contrib/find/findModel.ts b/src/vs/editor/contrib/find/browser/findModel.ts similarity index 98% rename from src/vs/editor/contrib/find/findModel.ts rename to src/vs/editor/contrib/find/browser/findModel.ts index fe8b8f376de..4d545f40f8e 100644 --- a/src/vs/editor/contrib/find/findModel.ts +++ b/src/vs/editor/contrib/find/browser/findModel.ts @@ -11,17 +11,17 @@ import { Constants } from 'vs/base/common/uint'; import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { ReplaceCommand, ReplaceCommandThatPreservesSelection } from 'vs/editor/common/commands/replaceCommand'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/cursorEvents'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ICommand, ScrollType } from 'vs/editor/common/editorCommon'; import { EndOfLinePreference, FindMatch, ITextModel } from 'vs/editor/common/model'; import { SearchParams } from 'vs/editor/common/model/textModelSearch'; -import { FindDecorations } from 'vs/editor/contrib/find/findDecorations'; -import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/findState'; -import { ReplaceAllCommand } from 'vs/editor/contrib/find/replaceAllCommand'; -import { parseReplaceString, ReplacePattern } from 'vs/editor/contrib/find/replacePattern'; +import { FindDecorations } from 'vs/editor/contrib/find/browser/findDecorations'; +import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/browser/findState'; +import { ReplaceAllCommand } from 'vs/editor/contrib/find/browser/replaceAllCommand'; +import { parseReplaceString, ReplacePattern } from 'vs/editor/contrib/find/browser/replacePattern'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; diff --git a/src/vs/editor/contrib/find/findOptionsWidget.ts b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts similarity index 98% rename from src/vs/editor/contrib/find/findOptionsWidget.ts rename to src/vs/editor/contrib/find/browser/findOptionsWidget.ts index 6560b1ba72d..f54e05d73da 100644 --- a/src/vs/editor/contrib/find/findOptionsWidget.ts +++ b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts @@ -8,8 +8,8 @@ import { CaseSensitiveCheckbox, RegexCheckbox, WholeWordsCheckbox } from 'vs/bas import { Widget } from 'vs/base/browser/ui/widget'; import { RunOnceScheduler } from 'vs/base/common/async'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; -import { FIND_IDS } from 'vs/editor/contrib/find/findModel'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FIND_IDS } from 'vs/editor/contrib/find/browser/findModel'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { contrastBorder, editorWidgetBackground, editorWidgetForeground, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/editor/contrib/find/findState.ts b/src/vs/editor/contrib/find/browser/findState.ts similarity index 99% rename from src/vs/editor/contrib/find/findState.ts rename to src/vs/editor/contrib/find/browser/findState.ts index 33ba7d943ee..50c2357f7da 100644 --- a/src/vs/editor/contrib/find/findState.ts +++ b/src/vs/editor/contrib/find/browser/findState.ts @@ -35,7 +35,7 @@ export const enum FindOptionOverride { False = 2 } -export interface INewFindReplaceState void; } = { update: () => {} }> { +export interface INewFindReplaceState void } = { update: () => {} }> { searchString?: string; replaceString?: string; isRevealed?: boolean; @@ -64,7 +64,7 @@ function effectiveOptionValue(override: FindOptionOverride, value: boolean): boo return value; } -export class FindReplaceState void; } = { update: () => {} }> extends Disposable { +export class FindReplaceState void } = { update: () => {} }> extends Disposable { private _searchString: string; private _replaceString: string; private _isRevealed: boolean; diff --git a/src/vs/editor/contrib/find/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css similarity index 100% rename from src/vs/editor/contrib/find/findWidget.css rename to src/vs/editor/contrib/find/browser/findWidget.css diff --git a/src/vs/editor/contrib/find/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts similarity index 99% rename from src/vs/editor/contrib/find/findWidget.ts rename to src/vs/editor/contrib/find/browser/findWidget.ts index 68cded64ec4..e447737f896 100644 --- a/src/vs/editor/contrib/find/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -26,8 +26,8 @@ import 'vs/css!./findWidget'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; -import { CONTEXT_FIND_INPUT_FOCUSED, CONTEXT_REPLACE_INPUT_FOCUSED, FIND_IDS, MATCHES_LIMIT } from 'vs/editor/contrib/find/findModel'; -import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/findState'; +import { CONTEXT_FIND_INPUT_FOCUSED, CONTEXT_REPLACE_INPUT_FOCUSED, FIND_IDS, MATCHES_LIMIT } from 'vs/editor/contrib/find/browser/findModel'; +import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/browser/findState'; import * as nls from 'vs/nls'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; import { ContextScopedFindInput, ContextScopedReplaceInput } from 'vs/platform/history/browser/contextScopedHistoryWidget'; diff --git a/src/vs/editor/contrib/find/replaceAllCommand.ts b/src/vs/editor/contrib/find/browser/replaceAllCommand.ts similarity index 100% rename from src/vs/editor/contrib/find/replaceAllCommand.ts rename to src/vs/editor/contrib/find/browser/replaceAllCommand.ts diff --git a/src/vs/editor/contrib/find/replacePattern.ts b/src/vs/editor/contrib/find/browser/replacePattern.ts similarity index 100% rename from src/vs/editor/contrib/find/replacePattern.ts rename to src/vs/editor/contrib/find/browser/replacePattern.ts diff --git a/src/vs/editor/contrib/find/test/find.test.ts b/src/vs/editor/contrib/find/test/browser/find.test.ts similarity index 99% rename from src/vs/editor/contrib/find/test/find.test.ts rename to src/vs/editor/contrib/find/test/browser/find.test.ts index 55490860dc4..984b992be2a 100644 --- a/src/vs/editor/contrib/find/test/find.test.ts +++ b/src/vs/editor/contrib/find/test/browser/find.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { getSelectionSearchString } from 'vs/editor/contrib/find/findController'; +import { getSelectionSearchString } from 'vs/editor/contrib/find/browser/findController'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; diff --git a/src/vs/editor/contrib/find/test/findController.test.ts b/src/vs/editor/contrib/find/test/browser/findController.test.ts similarity index 99% rename from src/vs/editor/contrib/find/test/findController.test.ts rename to src/vs/editor/contrib/find/test/browser/findController.test.ts index 291c8be8b7e..6792db92b84 100644 --- a/src/vs/editor/contrib/find/test/findController.test.ts +++ b/src/vs/editor/contrib/find/test/browser/findController.test.ts @@ -13,8 +13,8 @@ import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { CommonFindController, FindStartFocusAction, IFindStartOptions, NextMatchFindAction, NextSelectionMatchFindAction, StartFindAction, StartFindReplaceAction, StartFindWithSelectionAction } from 'vs/editor/contrib/find/findController'; -import { CONTEXT_FIND_INPUT_FOCUSED } from 'vs/editor/contrib/find/findModel'; +import { CommonFindController, FindStartFocusAction, IFindStartOptions, NextMatchFindAction, NextSelectionMatchFindAction, StartFindAction, StartFindReplaceAction, StartFindWithSelectionAction } from 'vs/editor/contrib/find/browser/findController'; +import { CONTEXT_FIND_INPUT_FOCUSED } from 'vs/editor/contrib/find/browser/findModel'; import { withAsyncTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -64,7 +64,7 @@ function executeAction(instantiationService: IInstantiationService, editor: ICod } suite('FindController', async () => { - const queryState: { [key: string]: any; } = {}; + const queryState: { [key: string]: any } = {}; let clipboardState = ''; const serviceCollection = new ServiceCollection(); serviceCollection.set(IStorageService, { @@ -493,7 +493,7 @@ suite('FindController', async () => { }); suite('FindController query options persistence', async () => { - let queryState: { [key: string]: any; } = {}; + let queryState: { [key: string]: any } = {}; queryState['editor.isRegex'] = false; queryState['editor.matchCase'] = false; queryState['editor.wholeWord'] = false; diff --git a/src/vs/editor/contrib/find/test/findModel.test.ts b/src/vs/editor/contrib/find/test/browser/findModel.test.ts similarity index 99% rename from src/vs/editor/contrib/find/test/findModel.test.ts rename to src/vs/editor/contrib/find/test/browser/findModel.test.ts index 11af9036a8d..dd94c49a078 100644 --- a/src/vs/editor/contrib/find/test/findModel.test.ts +++ b/src/vs/editor/contrib/find/test/browser/findModel.test.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; -import { FindModelBoundToEditorModel } from 'vs/editor/contrib/find/findModel'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindModelBoundToEditorModel } from 'vs/editor/contrib/find/browser/findModel'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; suite('FindModel', () => { diff --git a/src/vs/editor/contrib/find/test/replacePattern.test.ts b/src/vs/editor/contrib/find/test/browser/replacePattern.test.ts similarity index 99% rename from src/vs/editor/contrib/find/test/replacePattern.test.ts rename to src/vs/editor/contrib/find/test/browser/replacePattern.test.ts index a68c4cdcec1..d11a704a660 100644 --- a/src/vs/editor/contrib/find/test/replacePattern.test.ts +++ b/src/vs/editor/contrib/find/test/browser/replacePattern.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { buildReplaceStringWithCasePreserved } from 'vs/base/common/search'; -import { parseReplaceString, ReplacePattern, ReplacePiece } from 'vs/editor/contrib/find/replacePattern'; +import { parseReplaceString, ReplacePattern, ReplacePiece } from 'vs/editor/contrib/find/browser/replacePattern'; suite('Replace Pattern test', () => { diff --git a/src/vs/editor/contrib/folding/folding.css b/src/vs/editor/contrib/folding/browser/folding.css similarity index 100% rename from src/vs/editor/contrib/folding/folding.css rename to src/vs/editor/contrib/folding/browser/folding.css diff --git a/src/vs/editor/contrib/folding/folding.ts b/src/vs/editor/contrib/folding/browser/folding.ts similarity index 95% rename from src/vs/editor/contrib/folding/folding.ts rename to src/vs/editor/contrib/folding/browser/folding.ts index a2b3d8c69a7..e714b54aeb6 100644 --- a/src/vs/editor/contrib/folding/folding.ts +++ b/src/vs/editor/contrib/folding/browser/folding.ts @@ -11,7 +11,7 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { escapeRegExpCharacters } from 'vs/base/common/strings'; import * as types from 'vs/base/common/types'; import 'vs/css!./folding'; -import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; +import { StableEditorScrollState } from 'vs/editor/browser/stableEditorScroll'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, registerEditorContribution, registerInstantiatedEditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; @@ -20,13 +20,13 @@ import { IRange } from 'vs/editor/common/core/range'; import { IEditorContribution, ScrollType } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel } from 'vs/editor/common/model'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import { FoldingRangeKind, FoldingRangeProviderRegistry } from 'vs/editor/common/languages'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; +import { FoldingRangeKind } from 'vs/editor/common/languages'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { CollapseMemento, FoldingModel, getNextFoldLine, getParentFoldLine as getParentFoldLine, getPreviousFoldLine, setCollapseStateAtLevel, setCollapseStateForMatchingLines, setCollapseStateForRest, setCollapseStateForType, setCollapseStateLevelsDown, setCollapseStateLevelsUp, setCollapseStateUp, toggleCollapseState } from 'vs/editor/contrib/folding/foldingModel'; -import { HiddenRangeModel } from 'vs/editor/contrib/folding/hiddenRangeModel'; -import { IndentRangeProvider } from 'vs/editor/contrib/folding/indentRangeProvider'; -import { ID_INIT_PROVIDER, InitializingRangeProvider } from 'vs/editor/contrib/folding/intializingRangeProvider'; +import { CollapseMemento, FoldingModel, getNextFoldLine, getParentFoldLine as getParentFoldLine, getPreviousFoldLine, setCollapseStateAtLevel, setCollapseStateForMatchingLines, setCollapseStateForRest, setCollapseStateForType, setCollapseStateLevelsDown, setCollapseStateLevelsUp, setCollapseStateUp, toggleCollapseState } from 'vs/editor/contrib/folding/browser/foldingModel'; +import { HiddenRangeModel } from 'vs/editor/contrib/folding/browser/hiddenRangeModel'; +import { IndentRangeProvider } from 'vs/editor/contrib/folding/browser/indentRangeProvider'; +import { ID_INIT_PROVIDER, InitializingRangeProvider } from 'vs/editor/contrib/folding/browser/intializingRangeProvider'; import * as nls from 'vs/nls'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -37,6 +37,9 @@ import { FoldingRegion, FoldingRegions } from './foldingRanges'; import { ID_SYNTAX_PROVIDER, SyntaxRangeProvider } from './syntaxRangeProvider'; import { INotificationService } from 'vs/platform/notification/common/notification'; import Severity from 'vs/base/common/severity'; +import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { StopWatch } from 'vs/base/common/stopwatch'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const CONTEXT_FOLDING_ENABLED = new RawContextKey('foldingEnabled', false); @@ -51,7 +54,7 @@ interface FoldingStateMemento { collapsedRegions?: CollapseMemento; lineCount?: number; provider?: string; - foldedImports?: boolean + foldedImports?: boolean; } export class FoldingController extends Disposable implements IEditorContribution { @@ -85,18 +88,21 @@ export class FoldingController extends Disposable implements IEditorContribution private foldingModelPromise: Promise | null; private updateScheduler: Delayer | null; + private readonly updateDebounceInfo: IFeatureDebounceInformation; private foldingEnabled: IContextKey; private cursorChangedScheduler: RunOnceScheduler | null; private readonly localToDispose = this._register(new DisposableStore()); - private mouseDownInfo: { lineNumber: number, iconClicked: boolean } | null; + private mouseDownInfo: { lineNumber: number; iconClicked: boolean } | null; constructor( editor: ICodeEditor, @IContextKeyService private readonly contextKeyService: IContextKeyService, @ILanguageConfigurationService private readonly languageConfigurationService: ILanguageConfigurationService, @INotificationService notificationService: INotificationService, + @ILanguageFeatureDebounceService languageFeatureDebounceService: ILanguageFeatureDebounceService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { super(); this.editor = editor; @@ -108,6 +114,7 @@ export class FoldingController extends Disposable implements IEditorContribution this._currentModelHasFoldedImports = false; this._foldingImportsByDefault = options.get(EditorOption.foldingImportsByDefault); this._maxFoldingRegions = options.get(EditorOption.foldingMaximumRegions); + this.updateDebounceInfo = languageFeatureDebounceService.for(languageFeaturesService.foldingRangeProvider, 'Folding', { min: 200 }); this.foldingModel = null; this.hiddenRangeModel = null; @@ -243,11 +250,11 @@ export class FoldingController extends Disposable implements IEditorContribution this.localToDispose.add(this.hiddenRangeModel); this.localToDispose.add(this.hiddenRangeModel.onDidChange(hr => this.onHiddenRangesChanges(hr))); - this.updateScheduler = new Delayer(200); + this.updateScheduler = new Delayer(this.updateDebounceInfo.get(model)); this.cursorChangedScheduler = new RunOnceScheduler(() => this.revealCursor(), 200); this.localToDispose.add(this.cursorChangedScheduler); - this.localToDispose.add(FoldingRangeProviderRegistry.onDidChange(() => this.onFoldingStrategyChanged())); + this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(() => this.onFoldingStrategyChanged())); this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(() => this.onFoldingStrategyChanged())); // covers model language changes as well this.localToDispose.add(this.editor.onDidChangeModelContent(e => this.onDidChangeModelContent(e))); this.localToDispose.add(this.editor.onDidChangeCursorPosition(() => this.onCursorPositionChanged())); @@ -292,7 +299,7 @@ export class FoldingController extends Disposable implements IEditorContribution this.rangeProvider = new IndentRangeProvider(editorModel, this.languageConfigurationService, this._maxFoldingRegions); // fallback if (this._useFoldingProviders && this.foldingModel) { - let foldingProviders = FoldingRangeProviderRegistry.ordered(this.foldingModel.textModel); + let foldingProviders = this.languageFeaturesService.foldingRangeProvider.ordered(this.foldingModel.textModel); if (foldingProviders.length === 0 && this.foldingStateMemento && this.foldingStateMemento.collapsedRegions) { const rangeProvider = this.rangeProvider = new InitializingRangeProvider(editorModel, this.foldingStateMemento.collapsedRegions, () => { // if after 30 the InitializingRangeProvider is still not replaced, force a refresh @@ -328,6 +335,7 @@ export class FoldingController extends Disposable implements IEditorContribution if (!foldingModel) { // null if editor has been disposed, or folding turned off return null; } + const sw = new StopWatch(true); const provider = this.getRangeProvider(foldingModel.textModel); let foldingRegionPromise = this.foldingRegionPromise = createCancelablePromise(token => provider.compute(token, this._notifyTooManyRegions)); return foldingRegionPromise.then(foldingRanges => { @@ -350,6 +358,12 @@ export class FoldingController extends Disposable implements IEditorContribution if (scrollState) { scrollState.restore(this.editor); } + + // update debounce info + const newValue = this.updateDebounceInfo.update(foldingModel.textModel, sw.elapsed()); + if (this.updateScheduler) { + this.updateScheduler.defaultDelay = newValue; + } } return foldingModel; }); diff --git a/src/vs/editor/contrib/folding/foldingDecorations.ts b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts similarity index 97% rename from src/vs/editor/contrib/folding/foldingDecorations.ts rename to src/vs/editor/contrib/folding/browser/foldingDecorations.ts index f259c11a6ee..a171ad7059d 100644 --- a/src/vs/editor/contrib/folding/foldingDecorations.ts +++ b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts @@ -7,7 +7,7 @@ import { Codicon } from 'vs/base/common/codicons'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IModelDecorationsChangeAccessor, IModelDeltaDecoration, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { IDecorationProvider } from 'vs/editor/contrib/folding/foldingModel'; +import { IDecorationProvider } from 'vs/editor/contrib/folding/browser/foldingModel'; import { localize } from 'vs/nls'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/editor/contrib/folding/foldingModel.ts b/src/vs/editor/contrib/folding/browser/foldingModel.ts similarity index 100% rename from src/vs/editor/contrib/folding/foldingModel.ts rename to src/vs/editor/contrib/folding/browser/foldingModel.ts diff --git a/src/vs/editor/contrib/folding/foldingRanges.ts b/src/vs/editor/contrib/folding/browser/foldingRanges.ts similarity index 100% rename from src/vs/editor/contrib/folding/foldingRanges.ts rename to src/vs/editor/contrib/folding/browser/foldingRanges.ts diff --git a/src/vs/editor/contrib/folding/hiddenRangeModel.ts b/src/vs/editor/contrib/folding/browser/hiddenRangeModel.ts similarity index 96% rename from src/vs/editor/contrib/folding/hiddenRangeModel.ts rename to src/vs/editor/contrib/folding/browser/hiddenRangeModel.ts index 4f246928ff9..ab8fc2d3477 100644 --- a/src/vs/editor/contrib/folding/hiddenRangeModel.ts +++ b/src/vs/editor/contrib/folding/browser/hiddenRangeModel.ts @@ -9,9 +9,9 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; -import { countEOL } from 'vs/editor/common/model/pieceTreeTextBuffer/eolCounter'; -import { CollapseMemento, FoldingModel } from 'vs/editor/contrib/folding/foldingModel'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; +import { countEOL } from 'vs/editor/common/core/eolCounter'; +import { CollapseMemento, FoldingModel } from 'vs/editor/contrib/folding/browser/foldingModel'; export class HiddenRangeModel { diff --git a/src/vs/editor/contrib/folding/indentRangeProvider.ts b/src/vs/editor/contrib/folding/browser/indentRangeProvider.ts similarity index 99% rename from src/vs/editor/contrib/folding/indentRangeProvider.ts rename to src/vs/editor/contrib/folding/browser/indentRangeProvider.ts index 70357da9a2b..e918367846e 100644 --- a/src/vs/editor/contrib/folding/indentRangeProvider.ts +++ b/src/vs/editor/contrib/folding/browser/indentRangeProvider.ts @@ -8,7 +8,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { computeIndentLevel } from 'vs/editor/common/model/utils'; import { FoldingMarkers } from 'vs/editor/common/languages/languageConfiguration'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { FoldingRegions, MAX_LINE_NUMBER } from 'vs/editor/contrib/folding/foldingRanges'; +import { FoldingRegions, MAX_LINE_NUMBER } from 'vs/editor/contrib/folding/browser/foldingRanges'; import { RangeProvider } from './folding'; const MAX_FOLDING_REGIONS_FOR_INDENT_DEFAULT = 5000; diff --git a/src/vs/editor/contrib/folding/intializingRangeProvider.ts b/src/vs/editor/contrib/folding/browser/intializingRangeProvider.ts similarity index 97% rename from src/vs/editor/contrib/folding/intializingRangeProvider.ts rename to src/vs/editor/contrib/folding/browser/intializingRangeProvider.ts index c64926fdf48..788a679410b 100644 --- a/src/vs/editor/contrib/folding/intializingRangeProvider.ts +++ b/src/vs/editor/contrib/folding/browser/intializingRangeProvider.ts @@ -5,8 +5,8 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IModelDeltaDecoration, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; -import { FoldingRegions, ILineRange } from 'vs/editor/contrib/folding/foldingRanges'; -import { IFoldingRangeData, sanitizeRanges } from 'vs/editor/contrib/folding/syntaxRangeProvider'; +import { FoldingRegions, ILineRange } from 'vs/editor/contrib/folding/browser/foldingRanges'; +import { IFoldingRangeData, sanitizeRanges } from 'vs/editor/contrib/folding/browser/syntaxRangeProvider'; import { RangeProvider } from './folding'; export const ID_INIT_PROVIDER = 'init'; diff --git a/src/vs/editor/contrib/folding/syntaxRangeProvider.ts b/src/vs/editor/contrib/folding/browser/syntaxRangeProvider.ts similarity index 100% rename from src/vs/editor/contrib/folding/syntaxRangeProvider.ts rename to src/vs/editor/contrib/folding/browser/syntaxRangeProvider.ts diff --git a/src/vs/editor/contrib/folding/test/foldingModel.test.ts b/src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts similarity index 99% rename from src/vs/editor/contrib/folding/test/foldingModel.test.ts rename to src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts index 2a29145e31c..6b54319a21a 100644 --- a/src/vs/editor/contrib/folding/test/foldingModel.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts @@ -9,9 +9,9 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { FoldingModel, getNextFoldLine, getParentFoldLine, getPreviousFoldLine, setCollapseStateAtLevel, setCollapseStateForMatchingLines, setCollapseStateForRest, setCollapseStateLevelsDown, setCollapseStateLevelsUp, setCollapseStateUp } from 'vs/editor/contrib/folding/foldingModel'; -import { FoldingRegion } from 'vs/editor/contrib/folding/foldingRanges'; -import { computeRanges } from 'vs/editor/contrib/folding/indentRangeProvider'; +import { FoldingModel, getNextFoldLine, getParentFoldLine, getPreviousFoldLine, setCollapseStateAtLevel, setCollapseStateForMatchingLines, setCollapseStateForRest, setCollapseStateLevelsDown, setCollapseStateLevelsUp, setCollapseStateUp } from 'vs/editor/contrib/folding/browser/foldingModel'; +import { FoldingRegion } from 'vs/editor/contrib/folding/browser/foldingRanges'; +import { computeRanges } from 'vs/editor/contrib/folding/browser/indentRangeProvider'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; diff --git a/src/vs/editor/contrib/folding/test/foldingRanges.test.ts b/src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts similarity index 95% rename from src/vs/editor/contrib/folding/test/foldingRanges.test.ts rename to src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts index ac03ec975d9..a5011b08698 100644 --- a/src/vs/editor/contrib/folding/test/foldingRanges.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts @@ -5,8 +5,8 @@ import * as assert from 'assert'; import { FoldingMarkers } from 'vs/editor/common/languages/languageConfiguration'; -import { MAX_FOLDING_REGIONS } from 'vs/editor/contrib/folding/foldingRanges'; -import { computeRanges } from 'vs/editor/contrib/folding/indentRangeProvider'; +import { MAX_FOLDING_REGIONS } from 'vs/editor/contrib/folding/browser/foldingRanges'; +import { computeRanges } from 'vs/editor/contrib/folding/browser/indentRangeProvider'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; let markers: FoldingMarkers = { diff --git a/src/vs/editor/contrib/folding/test/hiddenRangeModel.test.ts b/src/vs/editor/contrib/folding/test/browser/hiddenRangeModel.test.ts similarity index 94% rename from src/vs/editor/contrib/folding/test/hiddenRangeModel.test.ts rename to src/vs/editor/contrib/folding/test/browser/hiddenRangeModel.test.ts index 16e89223393..661fecbd92b 100644 --- a/src/vs/editor/contrib/folding/test/hiddenRangeModel.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/hiddenRangeModel.test.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import { IRange } from 'vs/editor/common/core/range'; -import { FoldingModel } from 'vs/editor/contrib/folding/foldingModel'; -import { HiddenRangeModel } from 'vs/editor/contrib/folding/hiddenRangeModel'; -import { computeRanges } from 'vs/editor/contrib/folding/indentRangeProvider'; +import { FoldingModel } from 'vs/editor/contrib/folding/browser/foldingModel'; +import { HiddenRangeModel } from 'vs/editor/contrib/folding/browser/hiddenRangeModel'; +import { computeRanges } from 'vs/editor/contrib/folding/browser/indentRangeProvider'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { TestDecorationProvider } from './foldingModel.test'; diff --git a/src/vs/editor/contrib/folding/test/indentFold.test.ts b/src/vs/editor/contrib/folding/test/browser/indentFold.test.ts similarity index 96% rename from src/vs/editor/contrib/folding/test/indentFold.test.ts rename to src/vs/editor/contrib/folding/test/browser/indentFold.test.ts index 1c25d6f11e9..41fe83e0ee5 100644 --- a/src/vs/editor/contrib/folding/test/indentFold.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/indentFold.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { computeRanges } from 'vs/editor/contrib/folding/indentRangeProvider'; +import { computeRanges } from 'vs/editor/contrib/folding/browser/indentRangeProvider'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; interface IndentRange { diff --git a/src/vs/editor/contrib/folding/test/indentRangeProvider.test.ts b/src/vs/editor/contrib/folding/test/browser/indentRangeProvider.test.ts similarity index 98% rename from src/vs/editor/contrib/folding/test/indentRangeProvider.test.ts rename to src/vs/editor/contrib/folding/test/browser/indentRangeProvider.test.ts index 27644fe711a..03224a1d635 100644 --- a/src/vs/editor/contrib/folding/test/indentRangeProvider.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/indentRangeProvider.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { FoldingMarkers } from 'vs/editor/common/languages/languageConfiguration'; -import { computeRanges } from 'vs/editor/contrib/folding/indentRangeProvider'; +import { computeRanges } from 'vs/editor/contrib/folding/browser/indentRangeProvider'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; interface ExpectedIndentRange { diff --git a/src/vs/editor/contrib/folding/test/syntaxFold.test.ts b/src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts similarity index 97% rename from src/vs/editor/contrib/folding/test/syntaxFold.test.ts rename to src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts index 67627a100b6..78ba1868ffa 100644 --- a/src/vs/editor/contrib/folding/test/syntaxFold.test.ts +++ b/src/vs/editor/contrib/folding/test/browser/syntaxFold.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ITextModel } from 'vs/editor/common/model'; import { FoldingContext, FoldingRange, FoldingRangeProvider, ProviderResult } from 'vs/editor/common/languages'; -import { SyntaxRangeProvider } from 'vs/editor/contrib/folding/syntaxRangeProvider'; +import { SyntaxRangeProvider } from 'vs/editor/contrib/folding/browser/syntaxRangeProvider'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; interface IndentRange { diff --git a/src/vs/editor/contrib/fontZoom/fontZoom.ts b/src/vs/editor/contrib/fontZoom/browser/fontZoom.ts similarity index 100% rename from src/vs/editor/contrib/fontZoom/fontZoom.ts rename to src/vs/editor/contrib/fontZoom/browser/fontZoom.ts diff --git a/src/vs/editor/contrib/format/format.ts b/src/vs/editor/contrib/format/browser/format.ts similarity index 85% rename from src/vs/editor/contrib/format/format.ts rename to src/vs/editor/contrib/format/browser/format.ts index eed788829b7..1618d7af989 100644 --- a/src/vs/editor/contrib/format/format.ts +++ b/src/vs/editor/contrib/format/browser/format.ts @@ -12,23 +12,26 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { LinkedList } from 'vs/base/common/linkedList'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; -import { CodeEditorStateFlag, EditorStateCancellationTokenSource, TextModelCancellationTokenSource } from 'vs/editor/browser/core/editorState'; +import { CodeEditorStateFlag, EditorStateCancellationTokenSource, TextModelCancellationTokenSource } from 'vs/editor/contrib/editorState/browser/editorState'; import { IActiveCodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ScrollType } from 'vs/editor/common/editorCommon'; -import { ISingleEditOperation, ITextModel } from 'vs/editor/common/model'; -import { DocumentFormattingEditProvider, DocumentFormattingEditProviderRegistry, DocumentRangeFormattingEditProvider, DocumentRangeFormattingEditProviderRegistry, FormattingOptions, OnTypeFormattingEditProviderRegistry, TextEdit } from 'vs/editor/common/languages'; +import { ITextModel } from 'vs/editor/common/model'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; +import { DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, FormattingOptions, TextEdit } from 'vs/editor/common/languages'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { FormattingEdit } from 'vs/editor/contrib/format/formattingEdit'; +import { FormattingEdit } from 'vs/editor/contrib/format/browser/formattingEdit'; import * as nls from 'vs/nls'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IProgress } from 'vs/platform/progress/common/progress'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; export function alertFormattingEdits(edits: ISingleEditOperation[]): void { @@ -57,12 +60,16 @@ export function alertFormattingEdits(edits: ISingleEditOperation[]): void { } } -export function getRealAndSyntheticDocumentFormattersOrdered(model: ITextModel): DocumentFormattingEditProvider[] { +export function getRealAndSyntheticDocumentFormattersOrdered( + documentFormattingEditProvider: LanguageFeatureRegistry, + documentRangeFormattingEditProvider: LanguageFeatureRegistry, + model: ITextModel +): DocumentFormattingEditProvider[] { const result: DocumentFormattingEditProvider[] = []; const seen = new Set(); // (1) add all document formatter - const docFormatter = DocumentFormattingEditProviderRegistry.ordered(model); + const docFormatter = documentFormattingEditProvider.ordered(model); for (const formatter of docFormatter) { result.push(formatter); if (formatter.extensionId) { @@ -71,7 +78,7 @@ export function getRealAndSyntheticDocumentFormattersOrdered(model: ITextModel): } // (2) add all range formatter as document formatter (unless the same extension already did that) - const rangeFormatter = DocumentRangeFormattingEditProviderRegistry.ordered(model); + const rangeFormatter = documentRangeFormattingEditProvider.ordered(model); for (const formatter of rangeFormatter) { if (formatter.extensionId) { if (seen.has(ExtensionIdentifier.toKey(formatter.extensionId))) { @@ -130,8 +137,9 @@ export async function formatDocumentRangesWithSelectedProvider( ): Promise { const instaService = accessor.get(IInstantiationService); + const { documentRangeFormattingEditProvider: documentRangeFormattingEditProviderRegistry } = accessor.get(ILanguageFeaturesService); const model = isCodeEditor(editorOrModel) ? editorOrModel.getModel() : editorOrModel; - const provider = DocumentRangeFormattingEditProviderRegistry.ordered(model); + const provider = documentRangeFormattingEditProviderRegistry.ordered(model); const selected = await FormattingConflicts.select(provider, model, mode); if (selected) { progress.report(selected); @@ -285,8 +293,9 @@ export async function formatDocumentWithSelectedProvider( ): Promise { const instaService = accessor.get(IInstantiationService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const model = isCodeEditor(editorOrModel) ? editorOrModel.getModel() : editorOrModel; - const provider = getRealAndSyntheticDocumentFormattersOrdered(model); + const provider = getRealAndSyntheticDocumentFormattersOrdered(languageFeaturesService.documentFormattingEditProvider, languageFeaturesService.documentRangeFormattingEditProvider, model); const selected = await FormattingConflicts.select(provider, model, mode); if (selected) { progress.report(selected); @@ -369,13 +378,14 @@ export async function formatDocumentWithProvider( export async function getDocumentRangeFormattingEditsUntilResult( workerService: IEditorWorkerService, + languageFeaturesService: ILanguageFeaturesService, model: ITextModel, range: Range, options: FormattingOptions, token: CancellationToken ): Promise { - const providers = DocumentRangeFormattingEditProviderRegistry.ordered(model); + const providers = languageFeaturesService.documentRangeFormattingEditProvider.ordered(model); for (const provider of providers) { let rawEdits = await Promise.resolve(provider.provideDocumentRangeFormattingEdits(model, range, options, token)).catch(onUnexpectedExternalError); if (isNonEmptyArray(rawEdits)) { @@ -387,12 +397,13 @@ export async function getDocumentRangeFormattingEditsUntilResult( export async function getDocumentFormattingEditsUntilResult( workerService: IEditorWorkerService, + languageFeaturesService: ILanguageFeaturesService, model: ITextModel, options: FormattingOptions, token: CancellationToken ): Promise { - const providers = getRealAndSyntheticDocumentFormattersOrdered(model); + const providers = getRealAndSyntheticDocumentFormattersOrdered(languageFeaturesService.documentFormattingEditProvider, languageFeaturesService.documentRangeFormattingEditProvider, model); for (const provider of providers) { let rawEdits = await Promise.resolve(provider.provideDocumentFormattingEdits(model, options, token)).catch(onUnexpectedExternalError); if (isNonEmptyArray(rawEdits)) { @@ -404,6 +415,7 @@ export async function getDocumentFormattingEditsUntilResult( export function getOnTypeFormattingEdits( workerService: IEditorWorkerService, + languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: Position, ch: string, @@ -411,7 +423,7 @@ export function getOnTypeFormattingEdits( token: CancellationToken ): Promise { - const providers = OnTypeFormattingEditProviderRegistry.ordered(model); + const providers = languageFeaturesService.onTypeFormattingEditProvider.ordered(model); if (providers.length === 0) { return Promise.resolve(undefined); @@ -433,9 +445,10 @@ CommandsRegistry.registerCommand('_executeFormatRangeProvider', async function ( const resolverService = accessor.get(ITextModelService); const workerService = accessor.get(IEditorWorkerService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const reference = await resolverService.createModelReference(resource); try { - return getDocumentRangeFormattingEditsUntilResult(workerService, reference.object.textEditorModel, Range.lift(range), options, CancellationToken.None); + return getDocumentRangeFormattingEditsUntilResult(workerService, languageFeaturesService, reference.object.textEditorModel, Range.lift(range), options, CancellationToken.None); } finally { reference.dispose(); } @@ -447,9 +460,10 @@ CommandsRegistry.registerCommand('_executeFormatDocumentProvider', async functio const resolverService = accessor.get(ITextModelService); const workerService = accessor.get(IEditorWorkerService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const reference = await resolverService.createModelReference(resource); try { - return getDocumentFormattingEditsUntilResult(workerService, reference.object.textEditorModel, options, CancellationToken.None); + return getDocumentFormattingEditsUntilResult(workerService, languageFeaturesService, reference.object.textEditorModel, options, CancellationToken.None); } finally { reference.dispose(); } @@ -463,9 +477,10 @@ CommandsRegistry.registerCommand('_executeFormatOnTypeProvider', async function const resolverService = accessor.get(ITextModelService); const workerService = accessor.get(IEditorWorkerService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const reference = await resolverService.createModelReference(resource); try { - return getOnTypeFormattingEdits(workerService, reference.object.textEditorModel, Position.lift(position), ch, options, CancellationToken.None); + return getOnTypeFormattingEdits(workerService, languageFeaturesService, reference.object.textEditorModel, Position.lift(position), ch, options, CancellationToken.None); } finally { reference.dispose(); } diff --git a/src/vs/editor/contrib/format/formatActions.ts b/src/vs/editor/contrib/format/browser/formatActions.ts similarity index 91% rename from src/vs/editor/contrib/format/formatActions.ts rename to src/vs/editor/contrib/format/browser/formatActions.ts index 8d538319138..df01e5796ba 100644 --- a/src/vs/editor/contrib/format/formatActions.ts +++ b/src/vs/editor/contrib/format/browser/formatActions.ts @@ -16,10 +16,10 @@ import { CharacterSet } from 'vs/editor/common/core/characterClassifier'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { DocumentRangeFormattingEditProviderRegistry, OnTypeFormattingEditProviderRegistry } from 'vs/editor/common/languages'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; -import { alertFormattingEdits, formatDocumentRangesWithSelectedProvider, formatDocumentWithSelectedProvider, FormattingMode, getOnTypeFormattingEdits } from 'vs/editor/contrib/format/format'; -import { FormattingEdit } from 'vs/editor/contrib/format/formattingEdit'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { alertFormattingEdits, formatDocumentRangesWithSelectedProvider, formatDocumentWithSelectedProvider, FormattingMode, getOnTypeFormattingEdits } from 'vs/editor/contrib/format/browser/format'; +import { FormattingEdit } from 'vs/editor/contrib/format/browser/formattingEdit'; import * as nls from 'vs/nls'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -37,10 +37,11 @@ class FormatOnType implements IEditorContribution { constructor( private readonly _editor: ICodeEditor, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, @IEditorWorkerService private readonly _workerService: IEditorWorkerService ) { - this._disposables.add(OnTypeFormattingEditProviderRegistry.onDidChange(this._update, this)); + this._disposables.add(_languageFeaturesService.onTypeFormattingEditProvider.onDidChange(this._update, this)); this._disposables.add(_editor.onDidChangeModel(() => this._update())); this._disposables.add(_editor.onDidChangeModelLanguage(() => this._update())); this._disposables.add(_editor.onDidChangeConfiguration(e => { @@ -73,7 +74,7 @@ class FormatOnType implements IEditorContribution { const model = this._editor.getModel(); // no support - const [support] = OnTypeFormattingEditProviderRegistry.ordered(model); + const [support] = this._languageFeaturesService.onTypeFormattingEditProvider.ordered(model); if (!support || !support.autoFormatTriggerCharacters) { return; } @@ -129,6 +130,7 @@ class FormatOnType implements IEditorContribution { getOnTypeFormattingEdits( this._workerService, + this._languageFeaturesService, model, position, ch, @@ -157,12 +159,13 @@ class FormatOnPaste implements IEditorContribution { constructor( private readonly editor: ICodeEditor, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, @IInstantiationService private readonly _instantiationService: IInstantiationService, ) { this._callOnDispose.add(editor.onDidChangeConfiguration(() => this._update())); this._callOnDispose.add(editor.onDidChangeModel(() => this._update())); this._callOnDispose.add(editor.onDidChangeModelLanguage(() => this._update())); - this._callOnDispose.add(DocumentRangeFormattingEditProviderRegistry.onDidChange(this._update, this)); + this._callOnDispose.add(_languageFeaturesService.documentRangeFormattingEditProvider.onDidChange(this._update, this)); } dispose(): void { @@ -186,7 +189,7 @@ class FormatOnPaste implements IEditorContribution { } // no formatter - if (!DocumentRangeFormattingEditProviderRegistry.has(this.editor.getModel())) { + if (!this._languageFeaturesService.documentRangeFormattingEditProvider.has(this.editor.getModel())) { return; } diff --git a/src/vs/editor/contrib/format/formattingEdit.ts b/src/vs/editor/contrib/format/browser/formattingEdit.ts similarity index 93% rename from src/vs/editor/contrib/format/formattingEdit.ts rename to src/vs/editor/contrib/format/browser/formattingEdit.ts index b5f4db59a8b..300f7b9132f 100644 --- a/src/vs/editor/contrib/format/formattingEdit.ts +++ b/src/vs/editor/contrib/format/browser/formattingEdit.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; -import { EndOfLineSequence, ISingleEditOperation } from 'vs/editor/common/model'; +import { EndOfLineSequence } from 'vs/editor/common/model'; import { TextEdit } from 'vs/editor/common/languages'; export class FormattingEdit { diff --git a/src/vs/editor/contrib/gotoError/gotoError.ts b/src/vs/editor/contrib/gotoError/browser/gotoError.ts similarity index 99% rename from src/vs/editor/contrib/gotoError/gotoError.ts rename to src/vs/editor/contrib/gotoError/browser/gotoError.ts index 10f4b12814c..86736c58583 100644 --- a/src/vs/editor/contrib/gotoError/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoError.ts @@ -14,7 +14,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { IMarkerNavigationService, MarkerList } from 'vs/editor/contrib/gotoError/markerNavigationService'; +import { IMarkerNavigationService, MarkerList } from 'vs/editor/contrib/gotoError/browser/markerNavigationService'; import * as nls from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts similarity index 99% rename from src/vs/editor/contrib/gotoError/gotoErrorWidget.ts rename to src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts index c2c9891b178..7478180d83b 100644 --- a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts @@ -19,7 +19,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; import { ScrollType } from 'vs/editor/common/editorCommon'; -import { peekViewTitleForeground, peekViewTitleInfoForeground, PeekViewWidget } from 'vs/editor/contrib/peekView/peekView'; +import { peekViewTitleForeground, peekViewTitleInfoForeground, PeekViewWidget } from 'vs/editor/contrib/peekView/browser/peekView'; import * as nls from 'vs/nls'; import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; diff --git a/src/vs/editor/contrib/gotoError/markerNavigationService.ts b/src/vs/editor/contrib/gotoError/browser/markerNavigationService.ts similarity index 100% rename from src/vs/editor/contrib/gotoError/markerNavigationService.ts rename to src/vs/editor/contrib/gotoError/browser/markerNavigationService.ts diff --git a/src/vs/editor/contrib/gotoError/media/gotoErrorWidget.css b/src/vs/editor/contrib/gotoError/browser/media/gotoErrorWidget.css similarity index 100% rename from src/vs/editor/contrib/gotoError/media/gotoErrorWidget.css rename to src/vs/editor/contrib/gotoError/browser/media/gotoErrorWidget.css diff --git a/src/vs/editor/contrib/gotoSymbol/goToCommands.ts b/src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts similarity index 88% rename from src/vs/editor/contrib/gotoSymbol/goToCommands.ts rename to src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts index a9167d13737..db0d755e5df 100644 --- a/src/vs/editor/contrib/gotoSymbol/goToCommands.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/goToCommands.ts @@ -11,7 +11,7 @@ import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { isWeb } from 'vs/base/common/platform'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; -import { CodeEditorStateFlag, EditorStateCancellationTokenSource } from 'vs/editor/browser/core/editorState'; +import { CodeEditorStateFlag, EditorStateCancellationTokenSource } from 'vs/editor/contrib/editorState/browser/editorState'; import { IActiveCodeEditor, ICodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, IActionOptions, registerInstantiatedEditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -21,13 +21,13 @@ import * as corePosition from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { IEditorAction, ScrollType } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { ITextModel, IWordAtPosition } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; import { isLocationLink, Location, LocationLink } from 'vs/editor/common/languages'; -import { ReferencesController } from 'vs/editor/contrib/gotoSymbol/peek/referencesController'; -import { ReferencesModel } from 'vs/editor/contrib/gotoSymbol/referencesModel'; -import { ISymbolNavigationService } from 'vs/editor/contrib/gotoSymbol/symbolNavigation'; -import { MessageController } from 'vs/editor/contrib/message/messageController'; -import { PeekContext } from 'vs/editor/contrib/peekView/peekView'; +import { ReferencesController } from 'vs/editor/contrib/gotoSymbol/browser/peek/referencesController'; +import { ReferencesModel } from 'vs/editor/contrib/gotoSymbol/browser/referencesModel'; +import { ISymbolNavigationService } from 'vs/editor/contrib/gotoSymbol/browser/symbolNavigation'; +import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; +import { PeekContext } from 'vs/editor/contrib/peekView/browser/peekView'; import * as nls from 'vs/nls'; import { ISubmenuItem, MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; @@ -38,6 +38,8 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis import { INotificationService } from 'vs/platform/notification/common/notification'; import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { getDeclarationsAtPosition, getDefinitionsAtPosition, getImplementationsAtPosition, getReferencesAtPosition, getTypeDefinitionsAtPosition } from './goToSymbol'; +import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; MenuRegistry.appendMenuItem(MenuId.EditorContext, { @@ -56,7 +58,7 @@ export interface SymbolNavigationActionConfig { const _goToActionIds = new Set(); -function registerGoToAction(ctor: { new(): T; }): T { +function registerGoToAction(ctor: { new(): T }): T { const result = new ctor(); registerInstantiatedEditorAction(result); _goToActionIds.add(result.id); @@ -98,6 +100,7 @@ export abstract class SymbolNavigationAction extends EditorAction { const editorService = accessor.get(ICodeEditorService); const progressService = accessor.get(IEditorProgressService); const symbolNavService = accessor.get(ISymbolNavigationService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const model = editor.getModel(); const position = editor.getPosition(); @@ -105,7 +108,7 @@ export abstract class SymbolNavigationAction extends EditorAction { const cts = new EditorStateCancellationTokenSource(editor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Position); - const promise = raceCancellation(this._getLocationModel(anchor.model, anchor.position, cts.token), cts.token).then(async references => { + const promise = raceCancellation(this._getLocationModel(languageFeaturesService, anchor.model, anchor.position, cts.token), cts.token).then(async references => { if (!references || cts.token.isCancellationRequested) { return; @@ -149,7 +152,7 @@ export abstract class SymbolNavigationAction extends EditorAction { return promise; } - protected abstract _getLocationModel(model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise; + protected abstract _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise; protected abstract _getNoResultFoundMessage(info: IWordAtPosition | null): string; @@ -234,8 +237,8 @@ export abstract class SymbolNavigationAction extends EditorAction { export class DefinitionAction extends SymbolNavigationAction { - protected async _getLocationModel(model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { - return new ReferencesModel(await getDefinitionsAtPosition(model, position, token), nls.localize('def.title', 'Definitions')); + protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { + return new ReferencesModel(await getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, position, token), nls.localize('def.title', 'Definitions')); } protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { @@ -353,8 +356,8 @@ registerGoToAction(class PeekDefinitionAction extends DefinitionAction { class DeclarationAction extends SymbolNavigationAction { - protected async _getLocationModel(model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { - return new ReferencesModel(await getDeclarationsAtPosition(model, position, token), nls.localize('decl.title', 'Declarations')); + protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { + return new ReferencesModel(await getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, position, token), nls.localize('decl.title', 'Declarations')); } protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { @@ -433,8 +436,8 @@ registerGoToAction(class PeekDeclarationAction extends DeclarationAction { class TypeDefinitionAction extends SymbolNavigationAction { - protected async _getLocationModel(model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { - return new ReferencesModel(await getTypeDefinitionsAtPosition(model, position, token), nls.localize('typedef.title', 'Type Definitions')); + protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { + return new ReferencesModel(await getTypeDefinitionsAtPosition(languageFeaturesService.typeDefinitionProvider, model, position, token), nls.localize('typedef.title', 'Type Definitions')); } protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { @@ -514,8 +517,8 @@ registerGoToAction(class PeekTypeDefinitionAction extends TypeDefinitionAction { class ImplementationAction extends SymbolNavigationAction { - protected async _getLocationModel(model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { - return new ReferencesModel(await getImplementationsAtPosition(model, position, token), nls.localize('impl.title', 'Implementations')); + protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { + return new ReferencesModel(await getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, position, token), nls.localize('impl.title', 'Implementations')); } protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { @@ -643,8 +646,8 @@ registerGoToAction(class GoToReferencesAction extends ReferencesAction { }); } - protected async _getLocationModel(model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { - return new ReferencesModel(await getReferencesAtPosition(model, position, true, token), nls.localize('ref.title', 'References')); + protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { + return new ReferencesModel(await getReferencesAtPosition(languageFeaturesService.referenceProvider, model, position, true, token), nls.localize('ref.title', 'References')); } }); @@ -672,8 +675,8 @@ registerGoToAction(class PeekReferencesAction extends ReferencesAction { }); } - protected async _getLocationModel(model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { - return new ReferencesModel(await getReferencesAtPosition(model, position, false, token), nls.localize('ref.title', 'References')); + protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, model: ITextModel, position: corePosition.Position, token: CancellationToken): Promise { + return new ReferencesModel(await getReferencesAtPosition(languageFeaturesService.referenceProvider, model, position, false, token), nls.localize('ref.title', 'References')); } }); @@ -700,7 +703,7 @@ class GenericGoToLocationAction extends SymbolNavigationAction { }); } - protected async _getLocationModel(_model: ITextModel, _position: corePosition.Position, _token: CancellationToken): Promise { + protected async _getLocationModel(languageFeaturesService: ILanguageFeaturesService, _model: ITextModel, _position: corePosition.Position, _token: CancellationToken): Promise { return new ReferencesModel(this._references, nls.localize('generic.title', 'Locations')); } @@ -785,6 +788,7 @@ CommandsRegistry.registerCommand({ assertType(URI.isUri(resource)); assertType(corePosition.Position.isIPosition(position)); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const codeEditorService = accessor.get(ICodeEditorService); return codeEditorService.openCodeEditor({ resource }, codeEditorService.getFocusedCodeEditor()).then(control => { if (!isCodeEditor(control) || !control.hasModel()) { @@ -796,7 +800,7 @@ CommandsRegistry.registerCommand({ return undefined; } - const references = createCancelablePromise(token => getReferencesAtPosition(control.getModel(), corePosition.Position.lift(position), false, token).then(references => new ReferencesModel(references, nls.localize('ref.title', 'References')))); + const references = createCancelablePromise(token => getReferencesAtPosition(languageFeaturesService.referenceProvider, control.getModel(), corePosition.Position.lift(position), false, token).then(references => new ReferencesModel(references, nls.localize('ref.title', 'References')))); const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); return Promise.resolve(controller.toggleWidget(range, references, false)); }); diff --git a/src/vs/editor/contrib/gotoSymbol/browser/goToSymbol.ts b/src/vs/editor/contrib/gotoSymbol/browser/goToSymbol.ts new file mode 100644 index 00000000000..8eabf0d952a --- /dev/null +++ b/src/vs/editor/contrib/gotoSymbol/browser/goToSymbol.ts @@ -0,0 +1,121 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CancellationToken } from 'vs/base/common/cancellation'; +import { onUnexpectedExternalError } from 'vs/base/common/errors'; +import { registerModelAndPositionCommand } from 'vs/editor/browser/editorExtensions'; +import { Position } from 'vs/editor/common/core/position'; +import { ITextModel } from 'vs/editor/common/model'; +import { DeclarationProvider, DefinitionProvider, ImplementationProvider, LocationLink, ProviderResult, ReferenceProvider, TypeDefinitionProvider } from 'vs/editor/common/languages'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ReferencesModel } from 'vs/editor/contrib/gotoSymbol/browser/referencesModel'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; + +function getLocationLinks( + model: ITextModel, + position: Position, + registry: LanguageFeatureRegistry, + provide: (provider: T, model: ITextModel, position: Position) => ProviderResult +): Promise { + const provider = registry.ordered(model); + + // get results + const promises = provider.map((provider): Promise => { + return Promise.resolve(provide(provider, model, position)).then(undefined, err => { + onUnexpectedExternalError(err); + return undefined; + }); + }); + + return Promise.all(promises).then(values => { + const result: LocationLink[] = []; + for (let value of values) { + if (Array.isArray(value)) { + result.push(...value); + } else if (value) { + result.push(value); + } + } + return result; + }); +} + +export function getDefinitionsAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { + return getLocationLinks(model, position, registry, (provider, model, position) => { + return provider.provideDefinition(model, position, token); + }); +} + +export function getDeclarationsAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { + return getLocationLinks(model, position, registry, (provider, model, position) => { + return provider.provideDeclaration(model, position, token); + }); +} + +export function getImplementationsAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { + return getLocationLinks(model, position, registry, (provider, model, position) => { + return provider.provideImplementation(model, position, token); + }); +} + +export function getTypeDefinitionsAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { + return getLocationLinks(model, position, registry, (provider, model, position) => { + return provider.provideTypeDefinition(model, position, token); + }); +} + +export function getReferencesAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, compact: boolean, token: CancellationToken): Promise { + return getLocationLinks(model, position, registry, async (provider, model, position) => { + const result = await provider.provideReferences(model, position, { includeDeclaration: true }, token); + if (!compact || !result || result.length !== 2) { + return result; + } + const resultWithoutDeclaration = await provider.provideReferences(model, position, { includeDeclaration: false }, token); + if (resultWithoutDeclaration && resultWithoutDeclaration.length === 1) { + return resultWithoutDeclaration; + } + return result; + }); +} + +// -- API commands ---- + +async function _sortedAndDeduped(callback: () => Promise): Promise { + const rawLinks = await callback(); + const model = new ReferencesModel(rawLinks, ''); + const modelLinks = model.references.map(ref => ref.link); + model.dispose(); + return modelLinks; +} + +registerModelAndPositionCommand('_executeDefinitionProvider', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const promise = getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, position, CancellationToken.None); + return _sortedAndDeduped(() => promise); +}); + +registerModelAndPositionCommand('_executeTypeDefinitionProvider', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const promise = getTypeDefinitionsAtPosition(languageFeaturesService.typeDefinitionProvider, model, position, CancellationToken.None); + return _sortedAndDeduped(() => promise); +}); + +registerModelAndPositionCommand('_executeDeclarationProvider', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const promise = getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, position, CancellationToken.None); + return _sortedAndDeduped(() => promise); +}); + +registerModelAndPositionCommand('_executeReferenceProvider', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const promise = getReferencesAtPosition(languageFeaturesService.referenceProvider, model, position, false, CancellationToken.None); + return _sortedAndDeduped(() => promise); +}); + +registerModelAndPositionCommand('_executeImplementationProvider', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const promise = getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, position, CancellationToken.None); + return _sortedAndDeduped(() => promise); +}); diff --git a/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture.ts b/src/vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture.ts similarity index 99% rename from src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture.ts rename to src/vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture.ts index 49d0d954cb8..96939cffa98 100644 --- a/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture.ts @@ -10,7 +10,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { ICodeEditor, IEditorMouseEvent, IMouseTarget } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; function hasModifier(e: { ctrlKey: boolean; shiftKey: boolean; altKey: boolean; metaKey: boolean }, modifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'): boolean { return !!e[modifier]; diff --git a/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.css b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.css similarity index 100% rename from src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.css rename to src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.css diff --git a/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts similarity index 93% rename from src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts rename to src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts index 2ca609be67d..e6a7f84ee0d 100644 --- a/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts @@ -11,20 +11,20 @@ import { MarkdownString } from 'vs/base/common/htmlContent'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { withNullAsUndefined } from 'vs/base/common/types'; import 'vs/css!./goToDefinitionAtPosition'; -import { CodeEditorStateFlag, EditorState } from 'vs/editor/browser/core/editorState'; +import { CodeEditorStateFlag, EditorState } from 'vs/editor/contrib/editorState/browser/editorState'; import { ICodeEditor, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { IModelDeltaDecoration, ITextModel, IWordAtPosition } from 'vs/editor/common/model'; -import { IFoundBracket } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; -import { DefinitionProviderRegistry, LocationLink } from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { IModelDeltaDecoration, ITextModel } from 'vs/editor/common/model'; +import { IFoundBracket } from 'vs/editor/common/textModelBracketPairs'; +import { LocationLink } from 'vs/editor/common/languages'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { ClickLinkGesture, ClickLinkKeyboardEvent, ClickLinkMouseEvent } from 'vs/editor/contrib/gotoSymbol/link/clickLinkGesture'; -import { PeekContext } from 'vs/editor/contrib/peekView/peekView'; +import { ClickLinkGesture, ClickLinkKeyboardEvent, ClickLinkMouseEvent } from 'vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture'; +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'; @@ -32,6 +32,8 @@ import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegist import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { DefinitionAction } from '../goToCommands'; import { getDefinitionsAtPosition } from '../goToSymbol'; +import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class GotoDefinitionAtPositionEditorContribution implements IEditorContribution { @@ -48,7 +50,8 @@ export class GotoDefinitionAtPositionEditorContribution implements IEditorContri constructor( editor: ICodeEditor, @ITextModelService private readonly textModelResolverService: ITextModelService, - @ILanguageService private readonly languageService: ILanguageService + @ILanguageService private readonly languageService: ILanguageService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { this.editor = editor; @@ -326,7 +329,7 @@ export class GotoDefinitionAtPositionEditorContribution implements IEditorContri mouseEvent.isNoneOrSingleMouseDown && (mouseEvent.target.type === MouseTargetType.CONTENT_TEXT) && (mouseEvent.hasTriggerModifier || (withKey ? withKey.keyCodeIsTriggerKey : false)) && - DefinitionProviderRegistry.has(this.editor.getModel()); + this.languageFeaturesService.definitionProvider.has(this.editor.getModel()); } private findDefinition(position: Position, token: CancellationToken): Promise { @@ -335,7 +338,7 @@ export class GotoDefinitionAtPositionEditorContribution implements IEditorContri return Promise.resolve(null); } - return getDefinitionsAtPosition(model, position, token); + return getDefinitionsAtPosition(this.languageFeaturesService.definitionProvider, model, position, token); } private gotoDefinition(position: Position, openToSide: boolean): Promise { diff --git a/src/vs/editor/contrib/gotoSymbol/peek/referencesController.ts b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.ts similarity index 97% rename from src/vs/editor/contrib/gotoSymbol/peek/referencesController.ts rename to src/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.ts index 97850104624..4ad25f48171 100644 --- a/src/vs/editor/contrib/gotoSymbol/peek/referencesController.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.ts @@ -14,14 +14,14 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { Location } from 'vs/editor/common/languages'; -import { getOuterEditor, PeekContext } from 'vs/editor/contrib/peekView/peekView'; +import { getOuterEditor, PeekContext } from 'vs/editor/contrib/peekView/browser/peekView'; import * as nls from 'vs/nls'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { IListService, WorkbenchListFocusContextKey } from 'vs/platform/list/browser/listService'; +import { IListService, WorkbenchListFocusContextKey, WorkbenchTreeElementCanCollapse, WorkbenchTreeElementCanExpand } from 'vs/platform/list/browser/listService'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { OneReference, ReferencesModel } from '../referencesModel'; @@ -380,7 +380,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ primary: KeyCode.Enter, secondary: [KeyMod.CtrlCmd | KeyCode.DownArrow] }, - when: ContextKeyExpr.and(ctxReferenceSearchVisible, WorkbenchListFocusContextKey), + when: ContextKeyExpr.and(ctxReferenceSearchVisible, WorkbenchListFocusContextKey, WorkbenchTreeElementCanCollapse.negate(), WorkbenchTreeElementCanExpand.negate()), handler(accessor: ServicesAccessor) { const listService = accessor.get(IListService); const focus = listService.lastFocusedList?.getFocus(); @@ -397,7 +397,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ mac: { primary: KeyMod.WinCtrl | KeyCode.Enter }, - when: ContextKeyExpr.and(ctxReferenceSearchVisible, WorkbenchListFocusContextKey), + when: ContextKeyExpr.and(ctxReferenceSearchVisible, WorkbenchListFocusContextKey, WorkbenchTreeElementCanCollapse.negate(), WorkbenchTreeElementCanExpand.negate()), handler(accessor: ServicesAccessor) { const listService = accessor.get(IListService); const focus = listService.lastFocusedList?.getFocus(); diff --git a/src/vs/editor/contrib/gotoSymbol/peek/referencesTree.ts b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.ts similarity index 99% rename from src/vs/editor/contrib/gotoSymbol/peek/referencesTree.ts rename to src/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.ts index 5ded91884f0..787120fc1e7 100644 --- a/src/vs/editor/contrib/gotoSymbol/peek/referencesTree.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.ts @@ -81,7 +81,7 @@ export class StringRepresentationProvider implements IKeyboardNavigationLabelPro constructor(@IKeybindingService private readonly _keybindingService: IKeybindingService) { } - getKeyboardNavigationLabel(element: TreeElement): { toString(): string; } { + getKeyboardNavigationLabel(element: TreeElement): { toString(): string } { if (element instanceof OneReference) { const parts = element.parent.getPreview(element)?.preview(element.range); if (parts) { @@ -99,7 +99,7 @@ export class StringRepresentationProvider implements IKeyboardNavigationLabelPro export class IdentityProvider implements IIdentityProvider { - getId(element: TreeElement): { toString(): string; } { + getId(element: TreeElement): { toString(): string } { return element instanceof OneReference ? element.id : element.uri; } } diff --git a/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.css b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.css similarity index 100% rename from src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.css rename to src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.css diff --git a/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.ts similarity index 99% rename from src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts rename to src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.ts index a251cb1f9ed..baee24e0c7b 100644 --- a/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.ts @@ -25,10 +25,10 @@ import { ModelDecorationOptions, TextModel } from 'vs/editor/common/model/textMo import { Location } from 'vs/editor/common/languages'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; -import { AccessibilityProvider, DataSource, Delegate, FileReferencesRenderer, IdentityProvider, OneReferenceRenderer, StringRepresentationProvider, TreeElement } from 'vs/editor/contrib/gotoSymbol/peek/referencesTree'; -import * as peekView from 'vs/editor/contrib/peekView/peekView'; +import { AccessibilityProvider, DataSource, Delegate, FileReferencesRenderer, IdentityProvider, OneReferenceRenderer, StringRepresentationProvider, TreeElement } from 'vs/editor/contrib/gotoSymbol/browser/peek/referencesTree'; +import * as peekView from 'vs/editor/contrib/peekView/browser/peekView'; import * as nls from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; diff --git a/src/vs/editor/contrib/gotoSymbol/referencesModel.ts b/src/vs/editor/contrib/gotoSymbol/browser/referencesModel.ts similarity index 100% rename from src/vs/editor/contrib/gotoSymbol/referencesModel.ts rename to src/vs/editor/contrib/gotoSymbol/browser/referencesModel.ts diff --git a/src/vs/editor/contrib/gotoSymbol/symbolNavigation.ts b/src/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.ts similarity index 99% rename from src/vs/editor/contrib/gotoSymbol/symbolNavigation.ts rename to src/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.ts index 8df2b9e7dde..e0ff47c0935 100644 --- a/src/vs/editor/contrib/gotoSymbol/symbolNavigation.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.ts @@ -11,7 +11,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorCommand, registerEditorCommand } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { Range } from 'vs/editor/common/core/range'; -import { OneReference, ReferencesModel } from 'vs/editor/contrib/gotoSymbol/referencesModel'; +import { OneReference, ReferencesModel } from 'vs/editor/contrib/gotoSymbol/browser/referencesModel'; import { localize } from 'vs/nls'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { TextEditorSelectionRevealType } from 'vs/platform/editor/common/editor'; diff --git a/src/vs/editor/contrib/gotoSymbol/goToSymbol.ts b/src/vs/editor/contrib/gotoSymbol/goToSymbol.ts deleted file mode 100644 index e65b7238c0e..00000000000 --- a/src/vs/editor/contrib/gotoSymbol/goToSymbol.ts +++ /dev/null @@ -1,96 +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 { CancellationToken } from 'vs/base/common/cancellation'; -import { onUnexpectedExternalError } from 'vs/base/common/errors'; -import { registerModelAndPositionCommand } from 'vs/editor/browser/editorExtensions'; -import { Position } from 'vs/editor/common/core/position'; -import { ITextModel } from 'vs/editor/common/model'; -import { DeclarationProviderRegistry, DefinitionProviderRegistry, ImplementationProviderRegistry, LocationLink, ProviderResult, ReferenceProviderRegistry, TypeDefinitionProviderRegistry } from 'vs/editor/common/languages'; -import { LanguageFeatureRegistry } from 'vs/editor/common/languages/languageFeatureRegistry'; -import { ReferencesModel } from 'vs/editor/contrib/gotoSymbol/referencesModel'; - -function getLocationLinks( - model: ITextModel, - position: Position, - registry: LanguageFeatureRegistry, - provide: (provider: T, model: ITextModel, position: Position) => ProviderResult -): Promise { - const provider = registry.ordered(model); - - // get results - const promises = provider.map((provider): Promise => { - return Promise.resolve(provide(provider, model, position)).then(undefined, err => { - onUnexpectedExternalError(err); - return undefined; - }); - }); - - return Promise.all(promises).then(values => { - const result: LocationLink[] = []; - for (let value of values) { - if (Array.isArray(value)) { - result.push(...value); - } else if (value) { - result.push(value); - } - } - return result; - }); -} - -export function getDefinitionsAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise { - return getLocationLinks(model, position, DefinitionProviderRegistry, (provider, model, position) => { - return provider.provideDefinition(model, position, token); - }); -} - -export function getDeclarationsAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise { - return getLocationLinks(model, position, DeclarationProviderRegistry, (provider, model, position) => { - return provider.provideDeclaration(model, position, token); - }); -} - -export function getImplementationsAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise { - return getLocationLinks(model, position, ImplementationProviderRegistry, (provider, model, position) => { - return provider.provideImplementation(model, position, token); - }); -} - -export function getTypeDefinitionsAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise { - return getLocationLinks(model, position, TypeDefinitionProviderRegistry, (provider, model, position) => { - return provider.provideTypeDefinition(model, position, token); - }); -} - -export function getReferencesAtPosition(model: ITextModel, position: Position, compact: boolean, token: CancellationToken): Promise { - return getLocationLinks(model, position, ReferenceProviderRegistry, async (provider, model, position) => { - const result = await provider.provideReferences(model, position, { includeDeclaration: true }, token); - if (!compact || !result || result.length !== 2) { - return result; - } - const resultWithoutDeclaration = await provider.provideReferences(model, position, { includeDeclaration: false }, token); - if (resultWithoutDeclaration && resultWithoutDeclaration.length === 1) { - return resultWithoutDeclaration; - } - return result; - }); -} - -// -- API commands ---- - -async function _sortedAndDeduped(callback: () => Promise): Promise { - const rawLinks = await callback(); - const model = new ReferencesModel(rawLinks, ''); - const modelLinks = model.references.map(ref => ref.link); - model.dispose(); - return modelLinks; -} - -registerModelAndPositionCommand('_executeDefinitionProvider', (model, position) => _sortedAndDeduped(() => getDefinitionsAtPosition(model, position, CancellationToken.None))); -registerModelAndPositionCommand('_executeDeclarationProvider', (model, position) => _sortedAndDeduped(() => getDeclarationsAtPosition(model, position, CancellationToken.None))); -registerModelAndPositionCommand('_executeImplementationProvider', (model, position) => _sortedAndDeduped(() => getImplementationsAtPosition(model, position, CancellationToken.None))); -registerModelAndPositionCommand('_executeTypeDefinitionProvider', (model, position) => _sortedAndDeduped(() => getTypeDefinitionsAtPosition(model, position, CancellationToken.None))); -registerModelAndPositionCommand('_executeReferenceProvider', (model, position) => _sortedAndDeduped(() => getReferencesAtPosition(model, position, false, CancellationToken.None))); diff --git a/src/vs/editor/contrib/gotoSymbol/test/referencesModel.test.ts b/src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts similarity index 94% rename from src/vs/editor/contrib/gotoSymbol/test/referencesModel.test.ts rename to src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts index 4303506c267..55291bf4d13 100644 --- a/src/vs/editor/contrib/gotoSymbol/test/referencesModel.test.ts +++ b/src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { ReferencesModel } from 'vs/editor/contrib/gotoSymbol/referencesModel'; +import { ReferencesModel } from 'vs/editor/contrib/gotoSymbol/browser/referencesModel'; suite('references', function () { diff --git a/src/vs/editor/contrib/hover/contentHover.ts b/src/vs/editor/contrib/hover/browser/contentHover.ts similarity index 88% rename from src/vs/editor/contrib/hover/contentHover.ts rename to src/vs/editor/contrib/hover/browser/contentHover.ts index 85289874883..af0789876b9 100644 --- a/src/vs/editor/contrib/hover/contentHover.ts +++ b/src/vs/editor/contrib/hover/browser/contentHover.ts @@ -17,40 +17,26 @@ import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration, IModelDeltaDecoration } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { TokenizationRegistry } from 'vs/editor/common/languages'; -import { ColorPickerWidget } from 'vs/editor/contrib/colorPicker/colorPickerWidget'; -import { ColorHoverParticipant } from 'vs/editor/contrib/hover/colorHoverParticipant'; -import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contrib/hover/hoverOperation'; -import { HoverAnchor, HoverAnchorType, HoverRangeAnchor, IEditorHoverAction, IEditorHoverParticipant, IEditorHoverRenderContext, IEditorHoverStatusBar, IHoverPart } from 'vs/editor/contrib/hover/hoverTypes'; -import { MarkdownHoverParticipant } from 'vs/editor/contrib/hover/markdownHoverParticipant'; -import { MarkerHoverParticipant } from 'vs/editor/contrib/hover/markerHoverParticipant'; -import { InlineCompletionsHoverParticipant } from 'vs/editor/contrib/inlineCompletions/inlineCompletionsHoverParticipant'; +import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contrib/hover/browser/hoverOperation'; +import { HoverAnchor, HoverAnchorType, HoverParticipantRegistry, HoverRangeAnchor, IEditorHoverColorPickerWidget, IEditorHoverAction, IEditorHoverParticipant, IEditorHoverRenderContext, IEditorHoverStatusBar, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { Context as SuggestContext } from 'vs/editor/contrib/suggest/suggest'; -import { UnicodeHighlighterHoverParticipant } from 'vs/editor/contrib/unicodeHighlighter/unicodeHighlighter'; +import { Context as SuggestContext } from 'vs/editor/contrib/suggest/browser/suggest'; import { AsyncIterableObject } from 'vs/base/common/async'; -import { InlayHintsHover } from 'vs/editor/contrib/inlayHints/inlayHintsHover'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { Emitter } from 'vs/base/common/event'; -import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelDecorationsChangedEvent } from 'vs/editor/common/textModelEvents'; const $ = dom.$; export class ContentHoverController extends Disposable { - private readonly _participants: IEditorHoverParticipant[] = [ - this._instantiationService.createInstance(ColorHoverParticipant, this._editor), - this._instantiationService.createInstance(MarkdownHoverParticipant, this._editor), - this._instantiationService.createInstance(InlineCompletionsHoverParticipant, this._editor), - this._instantiationService.createInstance(UnicodeHighlighterHoverParticipant, this._editor), - this._instantiationService.createInstance(MarkerHoverParticipant, this._editor), - this._instantiationService.createInstance(InlayHintsHover, this._editor), - ]; + private readonly _participants: IEditorHoverParticipant[]; private readonly _widget = this._register(this._instantiationService.createInstance(ContentHoverWidget, this._editor)); private readonly _decorationsChangerListener = this._register(new EditorDecorationsChangerListener(this._editor)); - private readonly _computer = new ContentHoverComputer(this._editor, this._participants); - private readonly _hoverOperation = this._register(new HoverOperation(this._editor, this._computer)); + private readonly _computer: ContentHoverComputer; + private readonly _hoverOperation: HoverOperation; private _messages: IHoverPart[]; private _messagesAreComplete: boolean; @@ -65,6 +51,16 @@ export class ContentHoverController extends Disposable { this._messages = []; this._messagesAreComplete = false; + // Instantiate participants and sort them by `hoverOrdinal` which is relevant for rendering order. + this._participants = []; + for (const participant of HoverParticipantRegistry.getAll()) { + this._participants.push(this._instantiationService.createInstance(participant, this._editor)); + } + this._participants.sort((p1, p2) => p1.hoverOrdinal - p2.hoverOrdinal); + + this._computer = new ContentHoverComputer(this._editor, this._participants); + this._hoverOperation = this._register(new HoverOperation(this._editor, this._computer)); + this._register(this._hoverOperation.onResult((result) => { this._withResult(result.value, result.isComplete, result.hasLoadingMessage); })); @@ -88,7 +84,7 @@ export class ContentHoverController extends Disposable { // we need to recompute the displayed text this._hoverOperation.cancel(); - if (!this._widget.colorPicker) { // TODO@Michel ensure that displayed text for other decorations is computed even if color picker is in place + if (!this._widget.isColorPickerVisible) { // TODO@Michel ensure that displayed text for other decorations is computed even if color picker is in place this._hoverOperation.start(HoverStartMode.Delayed); } } @@ -172,7 +168,7 @@ export class ContentHoverController extends Disposable { } public isColorPickerVisible(): boolean { - return !!this._widget.colorPicker; + return this._widget.isColorPickerVisible; } private _addLoadingMessage(result: IHoverPart[]): IHoverPart[] { @@ -217,7 +213,7 @@ export class ContentHoverController extends Disposable { const statusBar = disposables.add(new EditorHoverStatusBar(this._keybindingService)); const fragment = document.createDocumentFragment(); - let colorPicker: ColorPickerWidget | null = null; + let colorPicker: IEditorHoverColorPickerWidget | null = null; const context: IEditorHoverRenderContext = { fragment, statusBar, @@ -300,7 +296,7 @@ class EditorDecorationsChangerListener extends Disposable { class ContentHoverVisibleData { constructor( - public readonly colorPicker: ColorPickerWidget | null, + public readonly colorPicker: IEditorHoverColorPickerWidget | null, public readonly showAtPosition: Position, public readonly showAtRange: Range, public readonly preferAbove: boolean, @@ -327,11 +323,8 @@ export class ContentHoverWidget extends Disposable implements IContentWidget { return this._visibleData?.showAtPosition ?? null; } - /** - * Returns `null` if the color picker is not visible. - */ - public get colorPicker(): ColorPickerWidget | null { - return this._visibleData?.colorPicker ?? null; + public get isColorPickerVisible(): boolean { + return Boolean(this._visibleData?.colorPicker); } constructor( @@ -417,10 +410,11 @@ export class ContentHoverWidget extends Disposable implements IContentWidget { this._hover.contentsDomNode.textContent = ''; this._hover.contentsDomNode.appendChild(node); + this._hover.contentsDomNode.style.paddingBottom = ''; this._updateFont(); this._editor.layoutContentWidget(this); - this._hover.onContentsChanged(); + this.onContentsChanged(); // Simply force a synchronous render on the editor // such that the widget does not really render with left = '0px' @@ -429,7 +423,7 @@ export class ContentHoverWidget extends Disposable implements IContentWidget { // See https://github.com/microsoft/vscode/issues/140339 // TODO: Doing a second layout of the hover after force rendering the editor this._editor.layoutContentWidget(this); - this._hover.onContentsChanged(); + this.onContentsChanged(); if (visibleData.stoleFocus) { this._hover.containerDomNode.focus(); @@ -452,6 +446,18 @@ export class ContentHoverWidget extends Disposable implements IContentWidget { public onContentsChanged(): void { this._hover.onContentsChanged(); + + const scrollDimensions = this._hover.scrollbar.getScrollDimensions(); + const hasHorizontalScrollbar = (scrollDimensions.scrollWidth > scrollDimensions.width); + if (hasHorizontalScrollbar) { + // There is just a horizontal scrollbar + const extraBottomPadding = `${this._hover.scrollbar.options.horizontalScrollbarSize}px`; + if (this._hover.contentsDomNode.style.paddingBottom !== extraBottomPadding) { + this._hover.contentsDomNode.style.paddingBottom = extraBottomPadding; + this._editor.layoutContentWidget(this); + this._hover.onContentsChanged(); + } + } } public clear(): void { @@ -477,7 +483,7 @@ class EditorHoverStatusBar extends Disposable implements IEditorHoverStatusBar { this.actionsElement = dom.append(this.hoverElement, $('div.actions')); } - public addAction(actionOptions: { label: string, iconClass?: string, run: (target: HTMLElement) => void, commandId: string }): IEditorHoverAction { + public addAction(actionOptions: { label: string; iconClass?: string; run: (target: HTMLElement) => void; commandId: string }): IEditorHoverAction { const keybinding = this._keybindingService.lookupKeybinding(actionOptions.commandId); const keybindingLabel = keybinding ? keybinding.getLabel() : null; this._hasContent = true; diff --git a/src/vs/editor/contrib/hover/getHover.ts b/src/vs/editor/contrib/hover/browser/getHover.ts similarity index 64% rename from src/vs/editor/contrib/hover/getHover.ts rename to src/vs/editor/contrib/hover/browser/getHover.ts index 114e9f6ac24..a89e872eaba 100644 --- a/src/vs/editor/contrib/hover/getHover.ts +++ b/src/vs/editor/contrib/hover/browser/getHover.ts @@ -9,14 +9,16 @@ import { onUnexpectedExternalError } from 'vs/base/common/errors'; import { registerModelAndPositionCommand } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; -import { Hover, HoverProvider, HoverProviderRegistry } from 'vs/editor/common/languages'; +import { Hover, HoverProvider } from 'vs/editor/common/languages'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class HoverProviderResult { constructor( public readonly provider: HoverProvider, public readonly hover: Hover, public readonly ordinal: number - ) {} + ) { } } async function executeProvider(provider: HoverProvider, ordinal: number, model: ITextModel, position: Position, token: CancellationToken): Promise { @@ -31,17 +33,20 @@ async function executeProvider(provider: HoverProvider, ordinal: number, model: return undefined; } -export function getHover(model: ITextModel, position: Position, token: CancellationToken): AsyncIterableObject { - const providers = HoverProviderRegistry.ordered(model); +export function getHover(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): AsyncIterableObject { + const providers = registry.ordered(model); const promises = providers.map((provider, index) => executeProvider(provider, index, model, position, token)); return AsyncIterableObject.fromPromises(promises).coalesce(); } -export function getHoverPromise(model: ITextModel, position: Position, token: CancellationToken): Promise { - return getHover(model, position, token).map(item => item.hover).toPromise(); +export function getHoverPromise(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { + return getHover(registry, model, position, token).map(item => item.hover).toPromise(); } -registerModelAndPositionCommand('_executeHoverProvider', (model, position) => getHoverPromise(model, position, CancellationToken.None)); +registerModelAndPositionCommand('_executeHoverProvider', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + return getHoverPromise(languageFeaturesService.hoverProvider, model, position, CancellationToken.None); +}); function isValid(result: Hover) { const hasRange = (typeof result.range !== 'undefined'); diff --git a/src/vs/editor/contrib/hover/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts similarity index 94% rename from src/vs/editor/contrib/hover/hover.ts rename to src/vs/editor/contrib/hover/browser/hover.ts index 425626de805..1e7d769259b 100644 --- a/src/vs/editor/contrib/hover/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -12,11 +12,11 @@ import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution, IScrollEvent } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { GotoDefinitionAtPositionEditorContribution } from 'vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition'; -import { HoverStartMode } from 'vs/editor/contrib/hover/hoverOperation'; -import { ContentHoverWidget, ContentHoverController } from 'vs/editor/contrib/hover/contentHover'; -import { MarginHoverWidget } from 'vs/editor/contrib/hover/marginHover'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { GotoDefinitionAtPositionEditorContribution } from 'vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition'; +import { HoverStartMode } from 'vs/editor/contrib/hover/browser/hoverOperation'; +import { ContentHoverWidget, ContentHoverController } from 'vs/editor/contrib/hover/browser/contentHover'; +import { MarginHoverWidget } from 'vs/editor/contrib/hover/browser/marginHover'; import * as nls from 'vs/nls'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -25,6 +25,9 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis import { IOpenerService } from 'vs/platform/opener/common/opener'; import { editorHoverBackground, editorHoverBorder, editorHoverForeground, editorHoverHighlight, editorHoverStatusBarBackground, textCodeBlockBackground, textLinkActiveForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { MarkdownHoverParticipant } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; +import { MarkerHoverParticipant } from 'vs/editor/contrib/hover/browser/markerHoverParticipant'; export class ModesHoverController implements IEditorContribution { @@ -298,6 +301,8 @@ class ShowDefinitionPreviewHoverAction extends EditorAction { registerEditorContribution(ModesHoverController.ID, ModesHoverController); registerEditorAction(ShowHoverAction); registerEditorAction(ShowDefinitionPreviewHoverAction); +HoverParticipantRegistry.register(MarkdownHoverParticipant); +HoverParticipantRegistry.register(MarkerHoverParticipant); // theming registerThemingParticipant((theme, collector) => { diff --git a/src/vs/editor/contrib/hover/hoverOperation.ts b/src/vs/editor/contrib/hover/browser/hoverOperation.ts similarity index 100% rename from src/vs/editor/contrib/hover/hoverOperation.ts rename to src/vs/editor/contrib/hover/browser/hoverOperation.ts diff --git a/src/vs/editor/contrib/hover/hoverTypes.ts b/src/vs/editor/contrib/hover/browser/hoverTypes.ts similarity index 77% rename from src/vs/editor/contrib/hover/hoverTypes.ts rename to src/vs/editor/contrib/hover/browser/hoverTypes.ts index 71ec3220408..7dfa9e2a916 100644 --- a/src/vs/editor/contrib/hover/hoverTypes.ts +++ b/src/vs/editor/contrib/hover/browser/hoverTypes.ts @@ -6,11 +6,11 @@ import { AsyncIterableObject } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, IEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration } from 'vs/editor/common/model'; -import { ColorPickerWidget } from 'vs/editor/contrib/colorPicker/colorPickerWidget'; +import { BrandedService, IConstructorSignature } from 'vs/platform/instantiation/common/instantiation'; export interface IHoverPart { /** @@ -71,7 +71,7 @@ export class HoverForeignElementAnchor { export type HoverAnchor = HoverRangeAnchor | HoverForeignElementAnchor; export interface IEditorHoverStatusBar { - addAction(actionOptions: { label: string, iconClass?: string, run: (target: HTMLElement) => void, commandId: string }): IEditorHoverAction; + addAction(actionOptions: { label: string; iconClass?: string; run: (target: HTMLElement) => void; commandId: string }): IEditorHoverAction; append(element: HTMLElement): HTMLElement; } @@ -79,6 +79,10 @@ export interface IEditorHoverAction { setEnabled(enabled: boolean): void; } +export interface IEditorHoverColorPickerWidget { + layout(): void; +} + export interface IEditorHoverRenderContext { /** * The fragment where dom elements should be attached. @@ -91,7 +95,7 @@ export interface IEditorHoverRenderContext { /** * Set if the hover will render a color picker widget. */ - setColorPicker(widget: ColorPickerWidget): void; + setColorPicker(widget: IEditorHoverColorPickerWidget): void; /** * The contents rendered inside the fragment have been changed, which means that the hover should relayout. */ @@ -103,9 +107,26 @@ export interface IEditorHoverRenderContext { } export interface IEditorHoverParticipant { + readonly hoverOrdinal: number; suggestHoverAnchor?(mouseEvent: IEditorMouseEvent): HoverAnchor | null; computeSync(anchor: HoverAnchor, lineDecorations: IModelDecoration[]): T[]; computeAsync?(anchor: HoverAnchor, lineDecorations: IModelDecoration[], token: CancellationToken): AsyncIterableObject; createLoadingMessage?(anchor: HoverAnchor): T | null; renderHoverParts(context: IEditorHoverRenderContext, hoverParts: T[]): IDisposable; } + +export type IEditorHoverParticipantCtor = IConstructorSignature; + +export const HoverParticipantRegistry = (new class HoverParticipantRegistry { + + _participants: IEditorHoverParticipantCtor[] = []; + + public register(ctor: { new(editor: ICodeEditor, ...services: Services): IEditorHoverParticipant }): void { + this._participants.push(ctor as IEditorHoverParticipantCtor); + } + + public getAll(): IEditorHoverParticipantCtor[] { + return this._participants; + } + +}()); diff --git a/src/vs/editor/contrib/hover/marginHover.ts b/src/vs/editor/contrib/hover/browser/marginHover.ts similarity index 96% rename from src/vs/editor/contrib/hover/marginHover.ts rename to src/vs/editor/contrib/hover/browser/marginHover.ts index d9ccb5efd07..848ecb9bba5 100644 --- a/src/vs/editor/contrib/hover/marginHover.ts +++ b/src/vs/editor/contrib/hover/browser/marginHover.ts @@ -7,11 +7,11 @@ import * as dom from 'vs/base/browser/dom'; import { asArray } from 'vs/base/common/arrays'; import { IMarkdownString, isEmptyMarkdownString } from 'vs/base/common/htmlContent'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contrib/hover/hoverOperation'; +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 { HoverWidget } from 'vs/base/browser/ui/hover/hoverWidget'; diff --git a/src/vs/editor/contrib/hover/markdownHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts similarity index 90% rename from src/vs/editor/contrib/hover/markdownHoverParticipant.ts rename to src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts index c1dc56ffdab..c2e2f56a91e 100644 --- a/src/vs/editor/contrib/hover/markdownHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts @@ -9,18 +9,18 @@ import { AsyncIterableObject } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IMarkdownString, isEmptyMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration } from 'vs/editor/common/model'; -import { HoverProviderRegistry } from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { getHover } from 'vs/editor/contrib/hover/getHover'; -import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/hoverTypes'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { getHover } from 'vs/editor/contrib/hover/browser/getHover'; +import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const $ = dom.$; @@ -44,11 +44,14 @@ export class MarkdownHover implements IHoverPart { export class MarkdownHoverParticipant implements IEditorHoverParticipant { + public readonly hoverOrdinal: number = 2; + constructor( protected readonly _editor: ICodeEditor, @ILanguageService private readonly _languageService: ILanguageService, @IOpenerService private readonly _openerService: IOpenerService, @IConfigurationService private readonly _configurationService: IConfigurationService, + @ILanguageFeaturesService protected readonly _languageFeaturesService: ILanguageFeaturesService, ) { } public createLoadingMessage(anchor: HoverAnchor): MarkdownHover | null { @@ -101,12 +104,12 @@ export class MarkdownHoverParticipant implements IEditorHoverParticipant !isEmptyMarkdownString(item.hover.contents)) .map(item => { const rng = item.hover.range ? Range.lift(item.hover.range) : anchor.range; diff --git a/src/vs/editor/contrib/hover/markerHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts similarity index 95% rename from src/vs/editor/contrib/hover/markerHoverParticipant.ts rename to src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts index 044017037c1..275acba7e5a 100644 --- a/src/vs/editor/contrib/hover/markerHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts @@ -15,11 +15,11 @@ import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration } from 'vs/editor/common/model'; import { CodeActionTriggerType } from 'vs/editor/common/languages'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markerDecorations'; -import { CodeActionSet, getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; -import { QuickFixAction, QuickFixController } from 'vs/editor/contrib/codeAction/codeActionCommands'; -import { CodeActionKind, CodeActionTrigger } from 'vs/editor/contrib/codeAction/types'; -import { MarkerController, NextMarkerAction } from 'vs/editor/contrib/gotoError/gotoError'; -import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/hoverTypes'; +import { CodeActionSet, getCodeActions } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { QuickFixAction, QuickFixController } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; +import { CodeActionKind, CodeActionTrigger } from 'vs/editor/contrib/codeAction/browser/types'; +import { MarkerController, NextMarkerAction } from 'vs/editor/contrib/gotoError/browser/gotoError'; +import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; import * as nls from 'vs/nls'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IMarker, IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; @@ -27,6 +27,7 @@ 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.$; @@ -54,12 +55,15 @@ const markerCodeActionTrigger: CodeActionTrigger = { export class MarkerHoverParticipant implements IEditorHoverParticipant { - private recentMarkerCodeActionsInfo: { marker: IMarker, hasCodeActions: boolean } | undefined = undefined; + public readonly hoverOrdinal: number = 5; + + private recentMarkerCodeActionsInfo: { marker: IMarker; hasCodeActions: boolean } | undefined = undefined; constructor( private readonly _editor: ICodeEditor, @IMarkerDecorationsService private readonly _markerDecorationsService: IMarkerDecorationsService, @IOpenerService private readonly _openerService: IOpenerService, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, ) { } public computeSync(anchor: HoverAnchor, lineDecorations: IModelDecoration[]): MarkerHover[] { @@ -237,6 +241,7 @@ export class MarkerHoverParticipant implements IEditorHoverParticipant { return createCancelablePromise(cancellationToken => { return getCodeActions( + this._languageFeaturesService.codeActionProvider, this._editor.getModel()!, new Range(marker.startLineNumber, marker.startColumn, marker.endLineNumber, marker.endColumn), markerCodeActionTrigger, @@ -256,4 +261,3 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.monaco-hover .hover-contents a.code-link span:hover { color: ${activeLinkFg}; }`); } }); - diff --git a/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.ts b/src/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.ts similarity index 97% rename from src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.ts rename to src/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.ts index 81fdcdf8d91..bdcc799b1ca 100644 --- a/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.ts +++ b/src/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.ts @@ -6,7 +6,7 @@ import { CancelablePromise, createCancelablePromise, timeout } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { CodeEditorStateFlag, EditorState } from 'vs/editor/browser/core/editorState'; +import { CodeEditorStateFlag, EditorState } from 'vs/editor/contrib/editorState/browser/editorState'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { Range } from 'vs/editor/common/core/range'; @@ -16,7 +16,7 @@ import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { IInplaceReplaceSupportResult } from 'vs/editor/common/languages'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; -import { editorBracketMatchBorder } from 'vs/editor/common/view/editorColorRegistry'; +import { editorBracketMatchBorder } from 'vs/editor/common/core/editorColorRegistry'; import * as nls from 'vs/nls'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/editor/contrib/inPlaceReplace/inPlaceReplaceCommand.ts b/src/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplaceCommand.ts similarity index 100% rename from src/vs/editor/contrib/inPlaceReplace/inPlaceReplaceCommand.ts rename to src/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplaceCommand.ts diff --git a/src/vs/editor/contrib/indentation/indentUtils.ts b/src/vs/editor/contrib/indentation/browser/indentUtils.ts similarity index 100% rename from src/vs/editor/contrib/indentation/indentUtils.ts rename to src/vs/editor/contrib/indentation/browser/indentUtils.ts diff --git a/src/vs/editor/contrib/indentation/indentation.ts b/src/vs/editor/contrib/indentation/browser/indentation.ts similarity index 96% rename from src/vs/editor/contrib/indentation/indentation.ts rename to src/vs/editor/contrib/indentation/browser/indentation.ts index 3beb6f0c2f2..751ec8e5051 100644 --- a/src/vs/editor/contrib/indentation/indentation.ts +++ b/src/vs/editor/contrib/indentation/browser/indentation.ts @@ -9,22 +9,22 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, IActionOptions, registerEditorAction, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ShiftCommand } from 'vs/editor/common/commands/shiftCommand'; import { EditorAutoIndentStrategy, EditorOption } from 'vs/editor/common/config/editorOptions'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ICommand, ICursorStateComputerData, IEditOperationBuilder, IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { EndOfLineSequence, IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; -import { TextModel } from 'vs/editor/common/model/textModel'; +import { EndOfLineSequence, ITextModel } from 'vs/editor/common/model'; import { StandardTokenType, TextEdit } from 'vs/editor/common/languages'; import { ILanguageConfigurationService, LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { IndentConsts } from 'vs/editor/common/languages/supports/indentRules'; import { IModelService } from 'vs/editor/common/services/model'; -import * as indentUtils from 'vs/editor/contrib/indentation/indentUtils'; +import * as indentUtils from 'vs/editor/contrib/indentation/browser/indentUtils'; import * as nls from 'vs/nls'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { normalizeIndentation } from 'vs/editor/common/core/indentation'; -export function getReindentEditOperations(model: ITextModel, languageConfigurationService: ILanguageConfigurationService, startLineNumber: number, endLineNumber: number, inheritedIndent?: string): IIdentifiedSingleEditOperation[] { +export function getReindentEditOperations(model: ITextModel, languageConfigurationService: ILanguageConfigurationService, startLineNumber: number, endLineNumber: number, inheritedIndent?: string): ISingleEditOperation[] { if (model.getLineCount() === 1 && model.getLineMaxColumn(1) === 1) { // Model is empty return []; @@ -64,7 +64,7 @@ export function getReindentEditOperations(model: ITextModel, languageConfigurati count = count || 1; return ShiftCommand.unshiftIndent(indentation, indentation.length + count, tabSize, indentSize, insertSpaces); }; - let indentEdits: IIdentifiedSingleEditOperation[] = []; + let indentEdits: ISingleEditOperation[] = []; // indentation being passed to lines below let globalIndent: string; @@ -84,7 +84,7 @@ export function getReindentEditOperations(model: ITextModel, languageConfigurati } if (currentLineText !== adjustedLineContent) { - indentEdits.push(EditOperation.replaceMove(new Selection(startLineNumber, 1, startLineNumber, oldIndentation.length + 1), TextModel.normalizeIndentation(globalIndent, indentSize, insertSpaces))); + indentEdits.push(EditOperation.replaceMove(new Selection(startLineNumber, 1, startLineNumber, oldIndentation.length + 1), normalizeIndentation(globalIndent, indentSize, insertSpaces))); } } else { globalIndent = strings.getLeadingWhitespace(currentLineText); @@ -115,7 +115,7 @@ export function getReindentEditOperations(model: ITextModel, languageConfigurati } if (oldIndentation !== idealIndentForNextLine) { - indentEdits.push(EditOperation.replaceMove(new Selection(lineNumber, 1, lineNumber, oldIndentation.length + 1), TextModel.normalizeIndentation(idealIndentForNextLine, indentSize, insertSpaces))); + indentEdits.push(EditOperation.replaceMove(new Selection(lineNumber, 1, lineNumber, oldIndentation.length + 1), normalizeIndentation(idealIndentForNextLine, indentSize, insertSpaces))); } // calculate idealIndentForNextLine @@ -348,7 +348,7 @@ export class ReindentSelectedLinesAction extends EditorAction { return; } - let edits: IIdentifiedSingleEditOperation[] = []; + let edits: ISingleEditOperation[] = []; for (let selection of selections) { let startLineNumber = selection.startLineNumber; @@ -380,7 +380,7 @@ export class ReindentSelectedLinesAction extends EditorAction { export class AutoIndentOnPasteCommand implements ICommand { - private readonly _edits: { range: IRange; text: string; eol?: EndOfLineSequence; }[]; + private readonly _edits: { range: IRange; text: string; eol?: EndOfLineSequence }[]; private readonly _initialSelection: Selection; private _selectionId: string | null; @@ -392,7 +392,7 @@ export class AutoIndentOnPasteCommand implements ICommand { for (let edit of edits) { if (edit.range && typeof edit.text === 'string') { - this._edits.push(edit as { range: IRange; text: string; eol?: EndOfLineSequence; }); + this._edits.push(edit as { range: IRange; text: string; eol?: EndOfLineSequence }); } } } diff --git a/src/vs/editor/contrib/indentation/test/indentation.test.ts b/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts similarity index 98% rename from src/vs/editor/contrib/indentation/test/indentation.test.ts rename to src/vs/editor/contrib/indentation/test/browser/indentation.test.ts index 59ece7d34e7..3aeed9aba70 100644 --- a/src/vs/editor/contrib/indentation/test/indentation.test.ts +++ b/src/vs/editor/contrib/indentation/test/browser/indentation.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Selection } from 'vs/editor/common/core/selection'; -import { IndentationToSpacesCommand, IndentationToTabsCommand } from 'vs/editor/contrib/indentation/indentation'; +import { IndentationToSpacesCommand, IndentationToTabsCommand } from 'vs/editor/contrib/indentation/browser/indentation'; import { testCommand } from 'vs/editor/test/browser/testCommand'; function testIndentationToSpacesCommand(lines: string[], selection: Selection, tabSize: number, expectedLines: string[], expectedSelection: Selection): void { diff --git a/src/vs/editor/contrib/inlayHints/inlayHints.ts b/src/vs/editor/contrib/inlayHints/browser/inlayHints.ts similarity index 83% rename from src/vs/editor/contrib/inlayHints/inlayHints.ts rename to src/vs/editor/contrib/inlayHints/browser/inlayHints.ts index 0b83ddfcb43..9528fac5ea9 100644 --- a/src/vs/editor/contrib/inlayHints/inlayHints.ts +++ b/src/vs/editor/contrib/inlayHints/browser/inlayHints.ts @@ -4,11 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { CancellationToken } from 'vs/base/common/cancellation'; -import { onUnexpectedExternalError } from 'vs/base/common/errors'; +import { CancellationError, onUnexpectedExternalError } from 'vs/base/common/errors'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { InlayHint, InlayHintList, InlayHintsProvider, InlayHintsProviderRegistry } from 'vs/editor/common/languages'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { InlayHint, InlayHintList, InlayHintsProvider } from 'vs/editor/common/languages'; import { ITextModel } from 'vs/editor/common/model'; export class InlayHintAnchor { @@ -20,17 +21,17 @@ export class InlayHintItem { private _isResolved: boolean = false; private _currentResolve?: Promise; - constructor(readonly hint: InlayHint, readonly anchor: InlayHintAnchor, private readonly _provider: InlayHintsProvider) { } + constructor(readonly hint: InlayHint, readonly anchor: InlayHintAnchor, readonly provider: InlayHintsProvider) { } - with(delta: { anchor: InlayHintAnchor; }): InlayHintItem { - const result = new InlayHintItem(this.hint, delta.anchor, this._provider); + with(delta: { anchor: InlayHintAnchor }): InlayHintItem { + const result = new InlayHintItem(this.hint, delta.anchor, this.provider); result._isResolved = this._isResolved; result._currentResolve = this._currentResolve; return result; } async resolve(token: CancellationToken): Promise { - if (typeof this._provider.resolveInlayHint !== 'function') { + if (typeof this.provider.resolveInlayHint !== 'function') { return; } if (this._currentResolve) { @@ -51,7 +52,7 @@ export class InlayHintItem { private async _doResolve(token: CancellationToken) { try { - const newHint = await Promise.resolve(this._provider.resolveInlayHint!(this.hint, token)); + const newHint = await Promise.resolve(this.provider.resolveInlayHint!(this.hint, token)); this.hint.tooltip = newHint?.tooltip ?? this.hint.tooltip; this.hint.label = newHint?.label ?? this.hint.label; this._isResolved = true; @@ -64,11 +65,11 @@ export class InlayHintItem { export class InlayHintsFragments { - static async create(model: ITextModel, ranges: Range[], token: CancellationToken): Promise { + static async create(registry: LanguageFeatureRegistry, model: ITextModel, ranges: Range[], token: CancellationToken): Promise { const data: [InlayHintList, InlayHintsProvider][] = []; - const promises = InlayHintsProviderRegistry.ordered(model).reverse().map(provider => ranges.map(async range => { + const promises = registry.ordered(model).reverse().map(provider => ranges.map(async range => { try { const result = await provider.provideInlayHints(model, range, token); if (result?.hints.length) { @@ -81,6 +82,10 @@ export class InlayHintsFragments { await Promise.all(promises.flat()); + if (token.isCancellationRequested || model.isDisposed()) { + throw new CancellationError(); + } + return new InlayHintsFragments(ranges, data, model); } diff --git a/src/vs/editor/contrib/inlayHints/browser/inlayHintsContribution.ts b/src/vs/editor/contrib/inlayHints/browser/inlayHintsContribution.ts new file mode 100644 index 00000000000..17f44f00108 --- /dev/null +++ b/src/vs/editor/contrib/inlayHints/browser/inlayHintsContribution.ts @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; +import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { InlayHintsController } from 'vs/editor/contrib/inlayHints/browser/inlayHintsController'; +import { InlayHintsHover } from 'vs/editor/contrib/inlayHints/browser/inlayHintsHover'; + +registerEditorContribution(InlayHintsController.ID, InlayHintsController); +HoverParticipantRegistry.register(InlayHintsHover); diff --git a/src/vs/editor/contrib/inlayHints/inlayHintsController.ts b/src/vs/editor/contrib/inlayHints/browser/inlayHintsController.ts similarity index 73% rename from src/vs/editor/contrib/inlayHints/inlayHintsController.ts rename to src/vs/editor/contrib/inlayHints/browser/inlayHintsController.ts index 78ab52cd83f..acbbd1efd63 100644 --- a/src/vs/editor/contrib/inlayHints/inlayHintsController.ts +++ b/src/vs/editor/contrib/inlayHints/browser/inlayHintsController.ts @@ -5,6 +5,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; +import { onUnexpectedError } from 'vs/base/common/errors'; import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { LRUCache } from 'vs/base/common/map'; import { IRange } from 'vs/base/common/range'; @@ -12,7 +13,6 @@ import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IActiveCodeEditor, ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { ClassNameReference, CssProperties, DynamicCssRules } from 'vs/editor/browser/editorDom'; -import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { EditorOption, EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; @@ -20,20 +20,24 @@ import * as languages from 'vs/editor/common/languages'; import { IModelDeltaDecoration, InjectedTextCursorStops, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationInjectedTextOptions } from 'vs/editor/common/model/textModel'; import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { ClickLinkGesture, ClickLinkMouseEvent } from 'vs/editor/contrib/gotoSymbol/link/clickLinkGesture'; -import { InlayHintAnchor, InlayHintItem, InlayHintsFragments } from 'vs/editor/contrib/inlayHints/inlayHints'; -import { goToDefinitionWithLocation, showGoToContextMenu } from 'vs/editor/contrib/inlayHints/inlayHintsLocations'; +import { ClickLinkGesture, ClickLinkMouseEvent } from 'vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture'; +import { InlayHintAnchor, InlayHintItem, InlayHintsFragments } from 'vs/editor/contrib/inlayHints/browser/inlayHints'; +import { goToDefinitionWithLocation, showGoToContextMenu } from 'vs/editor/contrib/inlayHints/browser/inlayHintsLocations'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { INotificationService } from 'vs/platform/notification/common/notification'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import * as colors from 'vs/platform/theme/common/colorRegistry'; import { themeColorFromId } from 'vs/platform/theme/common/themeService'; -const MAX_DECORATORS = 1500; +// --- hint caching service (per session) class InlayHintsCache { + declare readonly _serviceBrand: undefined; + private readonly _entries = new LRUCache(50); get(model: ITextModel): InlayHintItem[] | undefined { @@ -51,6 +55,12 @@ class InlayHintsCache { } } +interface IInlayHintsCache extends InlayHintsCache { } +const IInlayHintsCache = createDecorator('IInlayHintsCache'); +registerSingleton(IInlayHintsCache, InlayHintsCache, true); + +// --- rendered label + export class RenderedInlayHintLabelPart { constructor(readonly item: InlayHintItem, readonly index: number) { } @@ -64,10 +74,14 @@ export class RenderedInlayHintLabelPart { } } +// --- controller + export class InlayHintsController implements IEditorContribution { static readonly ID: string = 'editor.contrib.InlayHints'; + private static readonly _MAX_DECORATORS = 1500; + static get(editor: ICodeEditor) { return editor.getContribution(InlayHintsController.ID) ?? undefined; } @@ -75,21 +89,22 @@ export class InlayHintsController implements IEditorContribution { private readonly _disposables = new DisposableStore(); private readonly _sessionDisposables = new DisposableStore(); private readonly _debounceInfo: IFeatureDebounceInformation; - private readonly _cache = new InlayHintsCache(); - private readonly _decorationsMetadata = new Map(); + private readonly _decorationsMetadata = new Map(); private readonly _ruleFactory = new DynamicCssRules(this._editor); private _activeInlayHintPart?: RenderedInlayHintLabelPart; constructor( private readonly _editor: ICodeEditor, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, @ILanguageFeatureDebounceService _featureDebounce: ILanguageFeatureDebounceService, + @IInlayHintsCache private readonly _inlayHintsCache: IInlayHintsCache, @ICommandService private readonly _commandService: ICommandService, @INotificationService private readonly _notificationService: INotificationService, @IInstantiationService private readonly _instaService: IInstantiationService, ) { - this._debounceInfo = _featureDebounce.for(languages.InlayHintsProviderRegistry, { min: 25 }); - this._disposables.add(languages.InlayHintsProviderRegistry.onDidChange(() => this._update())); + this._debounceInfo = _featureDebounce.for(_languageFeaturesService.inlayHintsProvider, 'InlayHint', { min: 25 }); + this._disposables.add(_languageFeaturesService.inlayHintsProvider.onDidChange(() => this._update())); this._disposables.add(_editor.onDidChangeModel(() => this._update())); this._disposables.add(_editor.onDidChangeModelLanguage(() => this._update())); this._disposables.add(_editor.onDidChangeConfiguration(e => { @@ -115,15 +130,21 @@ export class InlayHintsController implements IEditorContribution { } const model = this._editor.getModel(); - if (!model || !languages.InlayHintsProviderRegistry.has(model)) { + if (!model || !this._languageFeaturesService.inlayHintsProvider.has(model)) { return; } // iff possible, quickly update from cache - const cached = this._cache.get(model); + const cached = this._inlayHintsCache.get(model); if (cached) { this._updateHintsDecorators([model.getFullModelRange()], cached); } + this._sessionDisposables.add(toDisposable(() => { + // cache items when switching files etc + if (!model.isDisposed()) { + this._cacheHintsForFastRestore(model); + } + })); let cts: CancellationTokenSource | undefined; let watchedProviders = new Set(); @@ -133,48 +154,75 @@ export class InlayHintsController implements IEditorContribution { cts?.dispose(true); cts = new CancellationTokenSource(); + const listener = model.onWillDispose(() => cts?.cancel()); - const myToken = cts.token; - const inlayHints = await InlayHintsFragments.create(model, this._getHintsRanges(), myToken); - scheduler.delay = this._debounceInfo.update(model, Date.now() - t1); - if (myToken.isCancellationRequested) { - inlayHints.dispose(); - return; - } - - // listen to provider changes - for (const provider of inlayHints.provider) { - if (typeof provider.onDidChangeInlayHints === 'function' && !watchedProviders.has(provider)) { - this._sessionDisposables.add(provider.onDidChangeInlayHints(() => scheduler.schedule())); - watchedProviders.add(provider); + try { + const myToken = cts.token; + const inlayHints = await InlayHintsFragments.create(this._languageFeaturesService.inlayHintsProvider, model, this._getHintsRanges(), myToken); + scheduler.delay = this._debounceInfo.update(model, Date.now() - t1); + if (myToken.isCancellationRequested) { + inlayHints.dispose(); + return; } - } - this._sessionDisposables.add(inlayHints); - this._updateHintsDecorators(inlayHints.ranges, inlayHints.items); - this._cacheHintsForFastRestore(model); + // listen to provider changes + for (const provider of inlayHints.provider) { + if (typeof provider.onDidChangeInlayHints === 'function' && !watchedProviders.has(provider)) { + watchedProviders.add(provider); + this._sessionDisposables.add(provider.onDidChangeInlayHints(() => { + if (!scheduler.isScheduled()) { // ignore event when request is already scheduled + scheduler.schedule(); + } + })); + } + } + + this._sessionDisposables.add(inlayHints); + this._updateHintsDecorators(inlayHints.ranges, inlayHints.items); + this._cacheHintsForFastRestore(model); + + } catch (err) { + onUnexpectedError(err); + + } finally { + cts.dispose(); + listener.dispose(); + } }, this._debounceInfo.get(model)); this._sessionDisposables.add(scheduler); this._sessionDisposables.add(toDisposable(() => cts?.dispose(true))); + scheduler.schedule(0); - // update inline hints when content or scroll position changes - this._sessionDisposables.add(this._editor.onDidChangeModelContent(() => scheduler.schedule())); - this._sessionDisposables.add(this._editor.onDidScrollChange(() => scheduler.schedule())); - scheduler.schedule(); + this._sessionDisposables.add(this._editor.onDidScrollChange((e) => { + // update when scroll position changes + // uses scrollTopChanged has weak heuristic to differenatiate between scrolling due to + // typing or due to "actual" scrolling + if (e.scrollTopChanged || !scheduler.isScheduled()) { + scheduler.schedule(); + } + })); + this._sessionDisposables.add(this._editor.onDidChangeModelContent((e) => { + // update less aggressive when typing + const delay = Math.max(scheduler.delay, 1250); + scheduler.schedule(delay); + })); // mouse gestures this._sessionDisposables.add(this._installLinkGesture()); + this._sessionDisposables.add(this._installDblClickGesture()); this._sessionDisposables.add(this._installContextMenu()); } private _installLinkGesture(): IDisposable { - let removeHighlight = () => { }; - const gesture = new ClickLinkGesture(this._editor); + const store = new DisposableStore(); + const gesture = store.add(new ClickLinkGesture(this._editor)); - gesture.onMouseMoveOrRelevantKeyDown(e => { + let removeHighlight = () => { }; + + store.add(gesture.onMouseMoveOrRelevantKeyDown(e => { const [mouseEvent] = e; const labelPart = this._getInlayHintLabelPart(mouseEvent); const model = this._editor.getModel(); @@ -184,8 +232,8 @@ export class InlayHintsController implements IEditorContribution { return; } - // render link => when the modifier is pressed and when there is an action - if (mouseEvent.hasTriggerModifier && labelPart.part.action) { + // render link => when the modifier is pressed and when there is a command or location + if (mouseEvent.hasTriggerModifier && (labelPart.part.command || labelPart.part.location)) { // resolve the item const cts = new CancellationTokenSource(); @@ -208,23 +256,38 @@ export class InlayHintsController implements IEditorContribution { this._updateHintsDecorators([range], Array.from(lineHints)); }; } - }); - gesture.onCancel(removeHighlight); - gesture.onExecute(e => { + })); + store.add(gesture.onCancel(removeHighlight)); + store.add(gesture.onExecute(async e => { const label = this._getInlayHintLabelPart(e); if (label) { const part = label.part; - if (languages.Command.is(part.action)) { - // command -> execute it - this._commandService.executeCommand(part.action.id, ...(part.action.arguments ?? [])).catch(err => this._notificationService.error(err)); - - } else if (part.action) { + if (part.location) { // location -> execute go to def - this._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, part.action); + this._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, part.location); + } else if (languages.Command.is(part.command)) { + // command -> execute it + await this._invokeCommand(part.command, label.item); } } + })); + return store; + } + + private _installDblClickGesture(): IDisposable { + return this._editor.onMouseUp(async e => { + if (e.event.detail !== 2) { + return; + } + const part = this._getInlayHintLabelPart(e); + if (!part) { + return; + } + await part.item.resolve(CancellationToken.None); + if (part.item.hint.command) { + await this._invokeCommand(part.item.hint.command, part.item); + } }); - return gesture; } private _installContextMenu(): IDisposable { @@ -250,6 +313,18 @@ export class InlayHintsController implements IEditorContribution { return undefined; } + private async _invokeCommand(command: languages.Command, item: InlayHintItem) { + try { + await this._commandService.executeCommand(command.id, ...(command.arguments ?? [])); + } catch (err) { + this._notificationService.notify({ + severity: Severity.Error, + source: item.provider.displayName, + message: err + }); + } + } + private _cacheHintsForFastRestore(model: ITextModel): void { const items = new Map(); for (const [id, obj] of this._decorationsMetadata) { @@ -267,7 +342,7 @@ export class InlayHintsController implements IEditorContribution { } items.set(obj.item, value); } - this._cache.set(model, Array.from(items.values())); + this._inlayHintsCache.set(model, Array.from(items.values())); } private _getHintsRanges(): Range[] { @@ -289,7 +364,7 @@ export class InlayHintsController implements IEditorContribution { private _updateHintsDecorators(ranges: readonly Range[], items: readonly InlayHintItem[]): void { // utils to collect/create injected text decorations - const newDecorationsData: { item: InlayHintItem, decoration: IModelDeltaDecoration, classNameRef: IDisposable; }[] = []; + const newDecorationsData: { item: InlayHintItem; decoration: IModelDeltaDecoration; classNameRef: IDisposable }[] = []; const addInjectedText = (item: InlayHintItem, ref: ClassNameReference, content: string, cursorStops: InjectedTextCursorStops, attachedData?: RenderedInlayHintLabelPart): void => { newDecorationsData.push({ item, @@ -331,7 +406,7 @@ export class InlayHintsController implements IEditorContribution { for (const item of items) { // whitespace leading the actual label - if (item.hint.whitespaceBefore) { + if (item.hint.paddingLeft) { addInjectedWhitespace(item, false); } @@ -354,7 +429,7 @@ export class InlayHintsController implements IEditorContribution { this._fillInColors(cssProperties, item.hint); - if (part.action && this._activeInlayHintPart?.item === item && this._activeInlayHintPart.index === i) { + if ((part.command || part.location) && this._activeInlayHintPart?.item === item && this._activeInlayHintPart.index === i) { // active link! cssProperties.textDecoration = 'underline'; cssProperties.cursor = 'pointer'; @@ -381,17 +456,17 @@ export class InlayHintsController implements IEditorContribution { item, this._ruleFactory.createClassNameRef(cssProperties), fixSpace(part.label), - isLast && !item.hint.whitespaceAfter ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None, + isLast && !item.hint.paddingRight ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None, new RenderedInlayHintLabelPart(item, i) ); } // whitespace trailing the actual label - if (item.hint.whitespaceAfter) { + if (item.hint.paddingRight) { addInjectedWhitespace(item, true); } - if (newDecorationsData.length > MAX_DECORATORS) { + if (newDecorationsData.length > InlayHintsController._MAX_DECORATORS) { break; } } @@ -458,17 +533,16 @@ function fixSpace(str: string): string { return str.replace(/[ \t]/g, noBreakWhitespace); } -registerEditorContribution(InlayHintsController.ID, InlayHintsController); - CommandsRegistry.registerCommand('_executeInlayHintProvider', async (accessor, ...args: [URI, IRange]): Promise => { const [uri, range] = args; assertType(URI.isUri(uri)); assertType(Range.isIRange(range)); + const { inlayHintsProvider } = accessor.get(ILanguageFeaturesService); const ref = await accessor.get(ITextModelService).createModelReference(uri); try { - const model = await InlayHintsFragments.create(ref.object.textEditorModel, [Range.lift(range)], CancellationToken.None); + const model = await InlayHintsFragments.create(inlayHintsProvider, ref.object.textEditorModel, [Range.lift(range)], CancellationToken.None); const result = model.items.map(i => i.hint); setTimeout(() => model.dispose(), 0); // dispose after sending to ext host return result; diff --git a/src/vs/editor/contrib/inlayHints/inlayHintsHover.ts b/src/vs/editor/contrib/inlayHints/browser/inlayHintsHover.ts similarity index 71% rename from src/vs/editor/contrib/inlayHints/inlayHintsHover.ts rename to src/vs/editor/contrib/inlayHints/browser/inlayHintsHover.ts index b379c88d373..ce4559c6918 100644 --- a/src/vs/editor/contrib/inlayHints/inlayHintsHover.ts +++ b/src/vs/editor/contrib/inlayHints/browser/inlayHintsHover.ts @@ -8,17 +8,17 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IMarkdownString, isEmptyMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; -import { Command, HoverProviderRegistry } from 'vs/editor/common/languages'; import { IModelDecoration } from 'vs/editor/common/model'; import { ModelDecorationInjectedTextOptions } from 'vs/editor/common/model/textModel'; -import { HoverAnchor, HoverForeignElementAnchor, IEditorHoverParticipant } from 'vs/editor/contrib/hover/hoverTypes'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { HoverAnchor, HoverForeignElementAnchor, IEditorHoverParticipant } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { getHover } from 'vs/editor/contrib/hover/getHover'; -import { MarkdownHover, MarkdownHoverParticipant } from 'vs/editor/contrib/hover/markdownHoverParticipant'; -import { RenderedInlayHintLabelPart, InlayHintsController } from 'vs/editor/contrib/inlayHints/inlayHintsController'; +import { getHover } from 'vs/editor/contrib/hover/browser/getHover'; +import { MarkdownHover, MarkdownHoverParticipant } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; +import { RenderedInlayHintLabelPart, InlayHintsController } from 'vs/editor/contrib/inlayHints/browser/inlayHintsController'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; class InlayHintsHoverAnchor extends HoverForeignElementAnchor { constructor(readonly part: RenderedInlayHintLabelPart, owner: InlayHintsHover) { @@ -28,14 +28,17 @@ class InlayHintsHoverAnchor extends HoverForeignElementAnchor { export class InlayHintsHover extends MarkdownHoverParticipant implements IEditorHoverParticipant { + public override readonly hoverOrdinal: number = 6; + constructor( editor: ICodeEditor, @ILanguageService languageService: ILanguageService, @IOpenerService openerService: IOpenerService, @IConfigurationService configurationService: IConfigurationService, - @ITextModelService private readonly _resolverService: ITextModelService + @ITextModelService private readonly _resolverService: ITextModelService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { - super(editor, languageService, openerService, configurationService); + super(editor, languageService, openerService, configurationService, languageFeaturesService); } suggestHoverAnchor(mouseEvent: IEditorMouseEvent): HoverAnchor | null { @@ -72,17 +75,28 @@ export class InlayHintsHover extends MarkdownHoverParticipant implements IEditor } // (1) Inlay Tooltip - let contents: IMarkdownString | undefined; + let itemTooltip: IMarkdownString | undefined; if (typeof part.item.hint.tooltip === 'string') { - contents = new MarkdownString().appendText(part.item.hint.tooltip); + itemTooltip = new MarkdownString().appendText(part.item.hint.tooltip); } else if (part.item.hint.tooltip) { - contents = part.item.hint.tooltip; + itemTooltip = part.item.hint.tooltip; } - if (contents) { - executor.emitOne(new MarkdownHover(this, anchor.range, [contents], 0)); + if (itemTooltip) { + executor.emitOne(new MarkdownHover(this, anchor.range, [itemTooltip], 0)); } // (2) Inlay Label Part Tooltip + let partTooltip: IMarkdownString | undefined; + if (typeof part.part.tooltip === 'string') { + partTooltip = new MarkdownString().appendText(part.part.tooltip); + } else if (part.part.tooltip) { + partTooltip = part.part.tooltip; + } + if (partTooltip) { + executor.emitOne(new MarkdownHover(this, anchor.range, [partTooltip], 1)); + } + + // (3) Inlay Label Part Location tooltip const iterable = await this._resolveInlayHintLabelPartHover(part, token); for await (let item of iterable) { executor.emitOne(item); @@ -91,26 +105,19 @@ export class InlayHintsHover extends MarkdownHoverParticipant implements IEditor } private async _resolveInlayHintLabelPartHover(part: RenderedInlayHintLabelPart, token: CancellationToken): Promise> { - if (typeof part.item.hint.label === 'string') { + if (!part.part.location) { return AsyncIterableObject.EMPTY; } - - const candidate = part.part.action; - - if (!candidate || Command.is(candidate)) { - // LOCATION - return AsyncIterableObject.EMPTY; - } - const { uri, range } = candidate; + const { uri, range } = part.part.location; const ref = await this._resolverService.createModelReference(uri); try { const model = ref.object.textEditorModel; - if (!HoverProviderRegistry.has(model)) { + if (!this._languageFeaturesService.hoverProvider.has(model)) { return AsyncIterableObject.EMPTY; } - return getHover(model, new Position(range.startLineNumber, range.startColumn), token) + return getHover(this._languageFeaturesService.hoverProvider, model, new Position(range.startLineNumber, range.startColumn), token) .filter(item => !isEmptyMarkdownString(item.hover.contents)) - .map(item => new MarkdownHover(this, part.item.anchor.range, item.hover.contents, item.ordinal)); + .map(item => new MarkdownHover(this, part.item.anchor.range, item.hover.contents, 2 + item.ordinal)); } finally { ref.dispose(); } diff --git a/src/vs/editor/contrib/inlayHints/inlayHintsLocations.ts b/src/vs/editor/contrib/inlayHints/browser/inlayHintsLocations.ts similarity index 77% rename from src/vs/editor/contrib/inlayHints/inlayHintsLocations.ts rename to src/vs/editor/contrib/inlayHints/browser/inlayHintsLocations.ts index 0df51db6870..864f63be400 100644 --- a/src/vs/editor/contrib/inlayHints/inlayHintsLocations.ts +++ b/src/vs/editor/contrib/inlayHints/browser/inlayHintsLocations.ts @@ -4,36 +4,40 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { Action, IAction } from 'vs/base/common/actions'; +import { Action, IAction, Separator } from 'vs/base/common/actions'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; -import { Command, Location } from 'vs/editor/common/languages'; +import { Location } from 'vs/editor/common/languages'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { DefinitionAction, SymbolNavigationAction, SymbolNavigationAnchor } from 'vs/editor/contrib/gotoSymbol/goToCommands'; -import { ClickLinkMouseEvent } from 'vs/editor/contrib/gotoSymbol/link/clickLinkGesture'; -import { RenderedInlayHintLabelPart } from 'vs/editor/contrib/inlayHints/inlayHintsController'; -import { PeekContext } from 'vs/editor/contrib/peekView/peekView'; +import { DefinitionAction, SymbolNavigationAction, SymbolNavigationAnchor } from 'vs/editor/contrib/gotoSymbol/browser/goToCommands'; +import { ClickLinkMouseEvent } from 'vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture'; +import { RenderedInlayHintLabelPart } from 'vs/editor/contrib/inlayHints/browser/inlayHintsController'; +import { PeekContext } from 'vs/editor/contrib/peekView/browser/peekView'; import { isIMenuItem, MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; +import { ICommandService } from 'vs/platform/commands/common/commands'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; export async function showGoToContextMenu(accessor: ServicesAccessor, editor: ICodeEditor, anchor: HTMLElement, part: RenderedInlayHintLabelPart) { const resolverService = accessor.get(ITextModelService); const contextMenuService = accessor.get(IContextMenuService); + const commandService = accessor.get(ICommandService); const instaService = accessor.get(IInstantiationService); + const notificationService = accessor.get(INotificationService); await part.item.resolve(CancellationToken.None); - if (!part.part.action || Command.is(part.part.action)) { + if (!part.part.location) { return; } - const location: Location = part.part.action; + const location: Location = part.part.location; const menuActions: IAction[] = []; // from all registered (not active) context menu actions select those @@ -55,6 +59,22 @@ export async function showGoToContextMenu(accessor: ServicesAccessor, editor: IC } } + if (part.part.command) { + const { command } = part.part; + menuActions.push(new Separator()); + menuActions.push(new Action(command.id, command.title, undefined, true, async () => { + try { + await commandService.executeCommand(command.id, ...(command.arguments ?? [])); + } catch (err) { + notificationService.notify({ + severity: Severity.Error, + source: part.item.provider.displayName, + message: err + }); + } + })); + } + // show context menu const useShadowDOM = editor.getOption(EditorOption.useShadowDOM); contextMenuService.showContextMenu({ diff --git a/src/vs/editor/contrib/inlineCompletions/consts.ts b/src/vs/editor/contrib/inlineCompletions/browser/consts.ts similarity index 100% rename from src/vs/editor/contrib/inlineCompletions/consts.ts rename to src/vs/editor/contrib/inlineCompletions/browser/consts.ts diff --git a/src/vs/editor/contrib/inlineCompletions/ghostText.css b/src/vs/editor/contrib/inlineCompletions/browser/ghostText.css similarity index 100% rename from src/vs/editor/contrib/inlineCompletions/ghostText.css rename to src/vs/editor/contrib/inlineCompletions/browser/ghostText.css diff --git a/src/vs/editor/contrib/inlineCompletions/ghostText.ts b/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts similarity index 98% rename from src/vs/editor/contrib/inlineCompletions/ghostText.ts rename to src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts index 5e1876d1ba7..56370689ed5 100644 --- a/src/vs/editor/contrib/inlineCompletions/ghostText.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts @@ -76,7 +76,7 @@ class PositionOffsetTransformer { } } -function applyEdits(text: string, edits: { range: IRange, text: string }[]): string { +function applyEdits(text: string, edits: { range: IRange; text: string }[]): string { const transformer = new PositionOffsetTransformer(text); const offsetEdits = edits.map(e => { const range = Range.lift(e.range); diff --git a/src/vs/editor/contrib/inlineCompletions/ghostTextController.ts b/src/vs/editor/contrib/inlineCompletions/browser/ghostTextController.ts similarity index 94% rename from src/vs/editor/contrib/inlineCompletions/ghostTextController.ts rename to src/vs/editor/contrib/inlineCompletions/browser/ghostTextController.ts index 2c17fadf7e7..1b42ba757c3 100644 --- a/src/vs/editor/contrib/inlineCompletions/ghostTextController.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/ghostTextController.ts @@ -7,14 +7,14 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { firstNonWhitespaceIndex } from 'vs/base/common/strings'; import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { EditorAction, EditorCommand, registerEditorCommand, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { CursorColumns } from 'vs/editor/common/controller/cursorColumns'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; import { Range } from 'vs/editor/common/core/range'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { inlineSuggestCommitId } from 'vs/editor/contrib/inlineCompletions/consts'; -import { GhostTextModel } from 'vs/editor/contrib/inlineCompletions/ghostTextModel'; -import { GhostTextWidget } from 'vs/editor/contrib/inlineCompletions/ghostTextWidget'; +import { inlineSuggestCommitId } from 'vs/editor/contrib/inlineCompletions/browser/consts'; +import { GhostTextModel } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextModel'; +import { GhostTextWidget } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextWidget'; import * as nls from 'vs/nls'; import { ContextKeyExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -57,7 +57,7 @@ export class GhostTextController extends Disposable { this.updateModelController(); } - // Don't call this method when not neccessary. It will recreate the activeController. + // Don't call this method when not necessary. It will recreate the activeController. private updateModelController(): void { const suggestOptions = this.editor.getOption(EditorOption.suggest); const inlineSuggestOptions = this.editor.getOption(EditorOption.inlineSuggest); @@ -282,8 +282,3 @@ export class TriggerInlineSuggestionAction extends EditorAction { } } } - -registerEditorContribution(GhostTextController.ID, GhostTextController); -registerEditorAction(TriggerInlineSuggestionAction); -registerEditorAction(ShowNextInlineSuggestionAction); -registerEditorAction(ShowPreviousInlineSuggestionAction); diff --git a/src/vs/editor/contrib/inlineCompletions/ghostTextModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/ghostTextModel.ts similarity index 86% rename from src/vs/editor/contrib/inlineCompletions/ghostTextModel.ts rename to src/vs/editor/contrib/inlineCompletions/browser/ghostTextModel.ts index bed06e13d80..a804be067ec 100644 --- a/src/vs/editor/contrib/inlineCompletions/ghostTextModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/ghostTextModel.ts @@ -9,11 +9,11 @@ import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { InlineCompletionTriggerKind } from 'vs/editor/common/languages'; -import { GhostText, GhostTextWidgetModel } from 'vs/editor/contrib/inlineCompletions/ghostText'; -import { InlineCompletionsModel, LiveInlineCompletions, SynchronizedInlineCompletionsCache } from 'vs/editor/contrib/inlineCompletions/inlineCompletionsModel'; -import { SuggestWidgetPreviewModel } from 'vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel'; -import { createDisposableRef } from 'vs/editor/contrib/inlineCompletions/utils'; -import { ICommandService } from 'vs/platform/commands/common/commands'; +import { GhostText, GhostTextWidgetModel } from 'vs/editor/contrib/inlineCompletions/browser/ghostText'; +import { InlineCompletionsModel, SynchronizedInlineCompletionsCache, TrackedInlineCompletions } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel'; +import { SuggestWidgetPreviewModel } from 'vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel'; +import { createDisposableRef } from 'vs/editor/contrib/inlineCompletions/browser/utils'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; export abstract class DelegatingModel extends Disposable implements GhostTextWidgetModel { private readonly onDidChangeEmitter = new Emitter(); @@ -67,8 +67,8 @@ export abstract class DelegatingModel extends Disposable implements GhostTextWid */ export class GhostTextModel extends DelegatingModel implements GhostTextWidgetModel { public readonly sharedCache = this._register(new SharedInlineCompletionCache()); - public readonly suggestWidgetAdapterModel = this._register(new SuggestWidgetPreviewModel(this.editor, this.sharedCache)); - public readonly inlineCompletionsModel = this._register(new InlineCompletionsModel(this.editor, this.sharedCache, this.commandService)); + public readonly suggestWidgetAdapterModel = this._register(this.instantiationService.createInstance(SuggestWidgetPreviewModel, this.editor, this.sharedCache)); + public readonly inlineCompletionsModel = this._register(this.instantiationService.createInstance(InlineCompletionsModel, this.editor, this.sharedCache)); public get activeInlineCompletionsModel(): InlineCompletionsModel | undefined { if (this.targetModel === this.inlineCompletionsModel) { @@ -79,7 +79,7 @@ export class GhostTextModel extends DelegatingModel implements GhostTextWidgetMo constructor( private readonly editor: IActiveCodeEditor, - @ICommandService private readonly commandService: ICommandService + @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); @@ -143,7 +143,7 @@ export class SharedInlineCompletionCache extends Disposable { } public setValue(editor: IActiveCodeEditor, - completionsSource: LiveInlineCompletions, + completionsSource: TrackedInlineCompletions, triggerKind: InlineCompletionTriggerKind ) { this.cache.value = new SynchronizedInlineCompletionsCache( diff --git a/src/vs/editor/contrib/inlineCompletions/ghostTextWidget.ts b/src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts similarity index 97% rename from src/vs/editor/contrib/inlineCompletions/ghostTextWidget.ts rename to src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts index 1047b6a2f0e..95bb7165588 100644 --- a/src/vs/editor/contrib/inlineCompletions/ghostTextWidget.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts @@ -10,18 +10,18 @@ import 'vs/css!./ghostText'; import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { EditorFontLigatures, EditorOption, IComputedEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { createStringBuilder } from 'vs/editor/common/core/stringBuilder'; -import { IModelDeltaDecoration } from 'vs/editor/common/model'; +import { IModelDeltaDecoration, PositionAffinity } from 'vs/editor/common/model'; import { ILanguageIdCodec } from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { ghostTextBackground, ghostTextBorder, ghostTextForeground } from 'vs/editor/common/view/editorColorRegistry'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { ghostTextBackground, ghostTextBorder, ghostTextForeground } from 'vs/editor/common/core/editorColorRegistry'; import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations'; import { RenderLineInput, renderViewLine } from 'vs/editor/common/viewLayout/viewLineRenderer'; -import { InlineDecorationType } from 'vs/editor/common/viewModel/viewModel'; -import { GhostTextWidgetModel } from 'vs/editor/contrib/inlineCompletions/ghostText'; +import { InlineDecorationType } from 'vs/editor/common/viewModel'; +import { GhostTextWidgetModel } from 'vs/editor/contrib/inlineCompletions/browser/ghostText'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; @@ -290,6 +290,7 @@ class AdditionalLinesWidget implements IDisposable { afterLineNumber: lineNumber, heightInLines: heightInLines, domNode, + afterColumnAffinity: PositionAffinity.Right }); } }); diff --git a/src/vs/editor/contrib/inlineCompletions/inlineCompletionToGhostText.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionToGhostText.ts similarity index 97% rename from src/vs/editor/contrib/inlineCompletions/inlineCompletionToGhostText.ts rename to src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionToGhostText.ts index 01e6e3e3a8d..f8c25639ecb 100644 --- a/src/vs/editor/contrib/inlineCompletions/inlineCompletionToGhostText.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionToGhostText.ts @@ -9,8 +9,11 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; import { InlineCompletion } from 'vs/editor/common/languages'; -import { GhostText, GhostTextPart } from 'vs/editor/contrib/inlineCompletions/ghostText'; +import { GhostText, GhostTextPart } from 'vs/editor/contrib/inlineCompletions/browser/ghostText'; +/** + * A normalized inline completion is an inline completion with a defined range. +*/ export interface NormalizedInlineCompletion extends InlineCompletion { range: Range; } @@ -135,7 +138,7 @@ export function inlineCompletionToGhostText( return new GhostText(lineNumber, parts, 0); } -let lastRequest: { originalValue: string; newValue: string; changes: readonly IDiffChange[] | undefined; } | undefined = undefined; +let lastRequest: { originalValue: string; newValue: string; changes: readonly IDiffChange[] | undefined } | undefined = undefined; function cachingDiff(originalValue: string, newValue: string): readonly IDiffChange[] | undefined { if (lastRequest?.originalValue === originalValue && lastRequest?.newValue === newValue) { return lastRequest?.changes; diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsContribution.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsContribution.ts new file mode 100644 index 00000000000..a455e09d4d8 --- /dev/null +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsContribution.ts @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; +import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { GhostTextController, ShowNextInlineSuggestionAction, ShowPreviousInlineSuggestionAction, TriggerInlineSuggestionAction } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextController'; +import { InlineCompletionsHoverParticipant } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHoverParticipant'; + +registerEditorContribution(GhostTextController.ID, GhostTextController); +registerEditorAction(TriggerInlineSuggestionAction); +registerEditorAction(ShowNextInlineSuggestionAction); +registerEditorAction(ShowPreviousInlineSuggestionAction); +HoverParticipantRegistry.register(InlineCompletionsHoverParticipant); diff --git a/src/vs/editor/contrib/inlineCompletions/inlineCompletionsHoverParticipant.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHoverParticipant.ts similarity index 95% rename from src/vs/editor/contrib/inlineCompletions/inlineCompletionsHoverParticipant.ts rename to src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHoverParticipant.ts index ff6652b8f12..1a4fe99af7c 100644 --- a/src/vs/editor/contrib/inlineCompletions/inlineCompletionsHoverParticipant.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHoverParticipant.ts @@ -6,13 +6,13 @@ import * as dom from 'vs/base/browser/dom'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { Range } from 'vs/editor/common/core/range'; import { IModelDecoration } from 'vs/editor/common/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { HoverAnchor, HoverAnchorType, HoverForeignElementAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/hoverTypes'; -import { commitInlineSuggestionAction, GhostTextController, ShowNextInlineSuggestionAction, ShowPreviousInlineSuggestionAction } from 'vs/editor/contrib/inlineCompletions/ghostTextController'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { HoverAnchor, HoverAnchorType, HoverForeignElementAnchor, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { commitInlineSuggestionAction, GhostTextController, ShowNextInlineSuggestionAction, ShowPreviousInlineSuggestionAction } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextController'; import * as nls from 'vs/nls'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; @@ -41,6 +41,9 @@ export class InlineCompletionsHover implements IHoverPart { } export class InlineCompletionsHoverParticipant implements IEditorHoverParticipant { + + public readonly hoverOrdinal: number = 3; + constructor( private readonly _editor: ICodeEditor, @ICommandService private readonly _commandService: ICommandService, diff --git a/src/vs/editor/contrib/inlineCompletions/inlineCompletionsModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts similarity index 72% rename from src/vs/editor/contrib/inlineCompletions/inlineCompletionsModel.ts rename to src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts index c04081bcd65..9545d8a1a6e 100644 --- a/src/vs/editor/contrib/inlineCompletions/inlineCompletionsModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts @@ -9,67 +9,97 @@ import { onUnexpectedError, onUnexpectedExternalError } from 'vs/base/common/err import { Emitter } from 'vs/base/common/event'; import { Disposable, IDisposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { commonPrefixLength, commonSuffixLength } from 'vs/base/common/strings'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import { InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider, InlineCompletionsProviderRegistry, InlineCompletionTriggerKind } from 'vs/editor/common/languages'; -import { BaseGhostTextWidgetModel, GhostText, GhostTextWidgetModel } from 'vs/editor/contrib/inlineCompletions/ghostText'; +import { InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider, InlineCompletionTriggerKind } from 'vs/editor/common/languages'; +import { BaseGhostTextWidgetModel, GhostText, GhostTextWidgetModel } from 'vs/editor/contrib/inlineCompletions/browser/ghostText'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { inlineSuggestCommitId } from './consts'; -import { SharedInlineCompletionCache } from './ghostTextModel'; -import { inlineCompletionToGhostText, NormalizedInlineCompletion } from './inlineCompletionToGhostText'; +import { inlineSuggestCommitId } from 'vs/editor/contrib/inlineCompletions/browser/consts'; +import { SharedInlineCompletionCache } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextModel'; +import { inlineCompletionToGhostText, NormalizedInlineCompletion } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionToGhostText'; +import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { fixBracketsInLine } from 'vs/editor/common/model/bracketPairsTextModelPart/fixBrackets'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; -export class InlineCompletionsModel extends Disposable implements GhostTextWidgetModel { +export class InlineCompletionsModel + extends Disposable + implements GhostTextWidgetModel { protected readonly onDidChangeEmitter = new Emitter(); public readonly onDidChange = this.onDidChangeEmitter.event; - public readonly completionSession = this._register(new MutableDisposable()); + public readonly completionSession = this._register( + new MutableDisposable() + ); private active: boolean = false; private disposed = false; + private readonly debounceValue = this.debounceService.for( + this.languageFeaturesService.inlineCompletionsProvider, + 'InlineCompletionsDebounce', + { min: 50, max: 200 } + ); constructor( private readonly editor: IActiveCodeEditor, private readonly cache: SharedInlineCompletionCache, @ICommandService private readonly commandService: ICommandService, + @ILanguageConfigurationService + private readonly languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService + private readonly languageFeaturesService: ILanguageFeaturesService, + @ILanguageFeatureDebounceService + private readonly debounceService: ILanguageFeatureDebounceService ) { super(); - this._register(commandService.onDidExecuteCommand(e => { - // These commands don't trigger onDidType. - const commands = new Set([ - CoreEditingCommands.Tab.id, - CoreEditingCommands.DeleteLeft.id, - CoreEditingCommands.DeleteRight.id, - inlineSuggestCommitId, - 'acceptSelectedSuggestion' - ]); - if (commands.has(e.commandId) && editor.hasTextFocus()) { + this._register( + commandService.onDidExecuteCommand((e) => { + // These commands don't trigger onDidType. + const commands = new Set([ + CoreEditingCommands.Tab.id, + CoreEditingCommands.DeleteLeft.id, + CoreEditingCommands.DeleteRight.id, + inlineSuggestCommitId, + 'acceptSelectedSuggestion', + ]); + if (commands.has(e.commandId) && editor.hasTextFocus()) { + this.handleUserInput(); + } + }) + ); + + this._register( + this.editor.onDidType((e) => { this.handleUserInput(); - } - })); + }) + ); - this._register(this.editor.onDidType((e) => { - this.handleUserInput(); - })); + this._register( + this.editor.onDidChangeCursorPosition((e) => { + if (this.session && !this.session.isValid) { + this.hide(); + } + }) + ); - this._register(this.editor.onDidChangeCursorPosition((e) => { - if (this.session && !this.session.isValid) { + this._register( + toDisposable(() => { + this.disposed = true; + }) + ); + + this._register( + this.editor.onDidBlurEditorWidget(() => { this.hide(); - } - })); - - this._register(toDisposable(() => { - this.disposed = true; - })); - - this._register(this.editor.onDidBlurEditorWidget(() => { - this.hide(); - })); + }) + ); } private handleUserInput() { @@ -138,7 +168,10 @@ export class InlineCompletionsModel extends Disposable implements GhostTextWidge () => this.active, this.commandService, this.cache, - triggerKind + triggerKind, + this.languageConfigurationService, + this.languageFeaturesService.inlineCompletionsProvider, + this.debounceValue ); this.completionSession.value.takeOwnership( this.completionSession.value.onDidChange(() => { @@ -189,7 +222,10 @@ export class InlineCompletionsSession extends BaseGhostTextWidgetModel { private readonly shouldUpdate: () => boolean, private readonly commandService: ICommandService, private readonly cache: SharedInlineCompletionCache, - private initialTriggerKind: InlineCompletionTriggerKind + private initialTriggerKind: InlineCompletionTriggerKind, + private readonly languageConfigurationService: ILanguageConfigurationService, + private readonly registry: LanguageFeatureRegistry, + private readonly debounce: IFeatureDebounceInformation, ) { super(editor); @@ -220,8 +256,8 @@ export class InlineCompletionsSession extends BaseGhostTextWidgetModel { this.scheduleAutomaticUpdate(); })); - this._register(InlineCompletionsProviderRegistry.onDidChange(() => { - this.updateSoon.schedule(); + this._register(this.registry.onDidChange(() => { + this.updateSoon.schedule(this.debounce.get(this.editor.getModel())); })); this.scheduleAutomaticUpdate(); @@ -310,7 +346,7 @@ export class InlineCompletionsSession extends BaseGhostTextWidgetModel { return currentCompletion ? inlineCompletionToGhostText(currentCompletion, this.editor.getModel(), mode, this.editor.getPosition()) : undefined; } - get currentCompletion(): LiveInlineCompletion | undefined { + get currentCompletion(): TrackedInlineCompletion | undefined { const completion = this.currentCachedCompletion; if (!completion) { return undefined; @@ -326,7 +362,7 @@ export class InlineCompletionsSession extends BaseGhostTextWidgetModel { // Since updateSoon debounces, starvation can happen. // To prevent stale cache, we clear the current update operation. this.updateOperation.clear(); - this.updateSoon.schedule(); + this.updateSoon.schedule(this.debounce.get(this.editor.getModel())); } private async update(triggerKind: InlineCompletionTriggerKind): Promise { @@ -336,14 +372,21 @@ export class InlineCompletionsSession extends BaseGhostTextWidgetModel { const position = this.editor.getPosition(); + const startTime = new Date(); + const promise = createCancelablePromise(async token => { let result; try { - result = await provideInlineCompletions(position, + result = await provideInlineCompletions(this.registry, position, this.editor.getModel(), { triggerKind, selectedSuggestionInfo: undefined }, - token + token, + this.languageConfigurationService ); + + const endTime = new Date(); + this.debounce.update(this.editor.getModel(), endTime.getTime() - startTime.getTime()); + } catch (e) { onUnexpectedError(e); return; @@ -384,7 +427,7 @@ export class InlineCompletionsSession extends BaseGhostTextWidgetModel { } } - public commit(completion: LiveInlineCompletion): void { + public commit(completion: TrackedInlineCompletion): void { // Mark the cache as stale, but don't dispose it yet, // otherwise command args might get disposed. const cache = this.cache.clearAndLeak(); @@ -428,7 +471,7 @@ export class SynchronizedInlineCompletionsCache extends Disposable { constructor( editor: IActiveCodeEditor, - completionsSource: LiveInlineCompletions, + completionsSource: TrackedInlineCompletions, onChange: () => void, public readonly triggerKind: InlineCompletionTriggerKind, ) { @@ -486,13 +529,13 @@ class CachedInlineCompletion { public synchronizedRange: Range; constructor( - public readonly inlineCompletion: LiveInlineCompletion, + public readonly inlineCompletion: TrackedInlineCompletion, public readonly decorationId: string, ) { this.synchronizedRange = inlineCompletion.range; } - public toLiveInlineCompletion(): LiveInlineCompletion | undefined { + public toLiveInlineCompletion(): TrackedInlineCompletion | undefined { return { text: this.inlineCompletion.text, range: this.synchronizedRange, @@ -504,16 +547,29 @@ class CachedInlineCompletion { } } -export interface LiveInlineCompletion extends NormalizedInlineCompletion { +/** + * A normalized inline completion that tracks which inline completion it has been constructed from. +*/ +export interface TrackedInlineCompletion extends NormalizedInlineCompletion { sourceProvider: InlineCompletionsProvider; + + /** + * A reference to the original inline completion this inline completion has been constructed from. + * Used for event data to ensure referential equality. + */ sourceInlineCompletion: InlineCompletion; + + /** + * A reference to the original inline completion list this inline completion has been constructed from. + * Used for event data to ensure referential equality. + */ sourceInlineCompletions: InlineCompletions; } /** * Contains no duplicated items. */ -export interface LiveInlineCompletions extends InlineCompletions { +export interface TrackedInlineCompletions extends InlineCompletions { dispose(): void; } @@ -528,18 +584,20 @@ function getDefaultRange(position: Position, model: ITextModel): Range { } export async function provideInlineCompletions( + registry: LanguageFeatureRegistry, position: Position, model: ITextModel, context: InlineCompletionContext, - token: CancellationToken = CancellationToken.None -): Promise { + token: CancellationToken = CancellationToken.None, + languageConfigurationService?: ILanguageConfigurationService +): Promise { const defaultReplaceRange = getDefaultRange(position, model); - const providers = InlineCompletionsProviderRegistry.all(model); + const providers = registry.all(model); const results = await Promise.all( providers.map( async provider => { - const completions = await provider.provideInlineCompletions(model, position, context, token); + const completions = await Promise.resolve(provider.provideInlineCompletions(model, position, context, token)).catch(onUnexpectedExternalError); return ({ completions, provider, @@ -553,23 +611,38 @@ export async function provideInlineCompletions( ) ); - const itemsByHash = new Map(); + const itemsByHash = new Map(); for (const result of results) { const completions = result.completions; if (completions) { - for (const item of completions.items.map(item => ({ - text: item.text, - range: item.range ? Range.lift(item.range) : defaultReplaceRange, - command: item.command, - sourceProvider: result.provider, - sourceInlineCompletions: completions, - sourceInlineCompletion: item - }))) { - if (item.range.startLineNumber !== item.range.endLineNumber) { + for (const item of completions.items) { + const range = item.range ? Range.lift(item.range) : defaultReplaceRange; + + if (range.startLineNumber !== range.endLineNumber) { // Ignore invalid ranges. continue; } - itemsByHash.set(JSON.stringify({ text: item.text, range: item.range }), item); + + const text = + languageConfigurationService && item.completeBracketPairs + ? closeBrackets( + item.text, + range.getStartPosition(), + model, + languageConfigurationService + ) + : item.text; + + const trackedItem: TrackedInlineCompletion = ({ + text, + range, + command: item.command, + sourceProvider: result.provider, + sourceInlineCompletions: completions, + sourceInlineCompletion: item + }); + + itemsByHash.set(JSON.stringify({ text, range: item.range }), trackedItem); } } } @@ -584,6 +657,22 @@ export async function provideInlineCompletions( }; } +function closeBrackets(text: string, position: Position, model: ITextModel, languageConfigurationService: ILanguageConfigurationService): string { + const lineStart = model.getLineContent(position.lineNumber).substring(0, position.column - 1); + const newLine = lineStart + text; + + const newTokens = model.tokenizeLineWithEdit(position, newLine.length - (position.column - 1), text); + const slicedTokens = newTokens?.sliceAndInflate(position.column - 1, newLine.length, 0); + if (!slicedTokens) { + return text; + } + + console.log(slicedTokens); + const newText = fixBracketsInLine(slicedTokens, languageConfigurationService); + + return newText; +} + /** * Shrinks the range if the text has a suffix/prefix that agrees with the text buffer. * E.g. text buffer: `ab[cdef]ghi`, [...] is the replace range, `cxyzf` is the new text. diff --git a/src/vs/editor/contrib/inlineCompletions/suggestWidgetInlineCompletionProvider.ts b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts similarity index 96% rename from src/vs/editor/contrib/inlineCompletions/suggestWidgetInlineCompletionProvider.ts rename to src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts index a600ee8c72f..dffc56e313e 100644 --- a/src/vs/editor/contrib/inlineCompletions/suggestWidgetInlineCompletionProvider.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts @@ -11,10 +11,10 @@ import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { CompletionItemInsertTextRule, CompletionItemKind } from 'vs/editor/common/languages'; -import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; -import { SnippetSession } from 'vs/editor/contrib/snippet/snippetSession'; -import { CompletionItem } from 'vs/editor/contrib/suggest/suggest'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; +import { SnippetSession } from 'vs/editor/contrib/snippet/browser/snippetSession'; +import { CompletionItem } from 'vs/editor/contrib/suggest/browser/suggest'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { minimizeInlineCompletion } from './inlineCompletionsModel'; import { NormalizedInlineCompletion, normalizedInlineCompletionsEquals } from './inlineCompletionToGhostText'; diff --git a/src/vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts similarity index 95% rename from src/vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel.ts rename to src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts index 52eab815564..dc7917d5556 100644 --- a/src/vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts @@ -9,7 +9,8 @@ import { MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { InlineCompletionTriggerKind, SelectedSuggestionInfo } from 'vs/editor/common/languages'; -import { SharedInlineCompletionCache } from 'vs/editor/contrib/inlineCompletions/ghostTextModel'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { SharedInlineCompletionCache } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextModel'; import { BaseGhostTextWidgetModel, GhostText } from './ghostText'; import { minimizeInlineCompletion, provideInlineCompletions, UpdateOperation } from './inlineCompletionsModel'; import { inlineCompletionToGhostText, NormalizedInlineCompletion } from './inlineCompletionToGhostText'; @@ -35,6 +36,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { constructor( editor: IActiveCodeEditor, private readonly cache: SharedInlineCompletionCache, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { super(editor); @@ -95,7 +97,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { const promise = createCancelablePromise(async token => { let result; try { - result = await provideInlineCompletions(position, + result = await provideInlineCompletions(this.languageFeaturesService.inlineCompletionsProvider, position, this.editor.getModel(), { triggerKind: InlineCompletionTriggerKind.Automatic, selectedSuggestionInfo: info }, token diff --git a/src/vs/editor/contrib/inlineCompletions/utils.ts b/src/vs/editor/contrib/inlineCompletions/browser/utils.ts similarity index 100% rename from src/vs/editor/contrib/inlineCompletions/utils.ts rename to src/vs/editor/contrib/inlineCompletions/browser/utils.ts diff --git a/src/vs/editor/contrib/inlineCompletions/test/inlineCompletionsProvider.test.ts b/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsProvider.test.ts similarity index 94% rename from src/vs/editor/contrib/inlineCompletions/test/inlineCompletionsProvider.test.ts rename to src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsProvider.test.ts index 0bca2ed8fe0..02cb7a564fa 100644 --- a/src/vs/editor/contrib/inlineCompletions/test/inlineCompletionsProvider.test.ts +++ b/src/vs/editor/contrib/inlineCompletions/test/browser/inlineCompletionsProvider.test.ts @@ -9,14 +9,17 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { Range } from 'vs/editor/common/core/range'; -import { InlineCompletionsProvider, InlineCompletionsProviderRegistry, InlineCompletionTriggerKind } from 'vs/editor/common/languages'; +import { InlineCompletionsProvider, InlineCompletionTriggerKind } from 'vs/editor/common/languages'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; -import { SharedInlineCompletionCache } from 'vs/editor/contrib/inlineCompletions/ghostTextModel'; -import { InlineCompletionsModel } from 'vs/editor/contrib/inlineCompletions/inlineCompletionsModel'; -import { GhostTextContext, MockInlineCompletionsProvider } from 'vs/editor/contrib/inlineCompletions/test/utils'; +import { SharedInlineCompletionCache } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextModel'; +import { InlineCompletionsModel } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel'; +import { GhostTextContext, MockInlineCompletionsProvider } from 'vs/editor/contrib/inlineCompletions/test/browser/utils'; import { ITestCodeEditor, TestCodeEditorInstantiationOptions, withAsyncTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; -import { inlineCompletionToGhostText } from '../inlineCompletionToGhostText'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { inlineCompletionToGhostText } from '../../browser/inlineCompletionToGhostText'; suite('Inline Completions', () => { ensureNoDisposablesAreLeakedInTestSuite(); @@ -537,17 +540,23 @@ suite('Inline Completions', () => { async function withAsyncTestCodeEditorAndInlineCompletionsModel( text: string, - options: TestCodeEditorInstantiationOptions & { provider?: InlineCompletionsProvider, fakeClock?: boolean }, - callback: (args: { editor: ITestCodeEditor, editorViewModel: ViewModel, model: InlineCompletionsModel, context: GhostTextContext }) => Promise + options: TestCodeEditorInstantiationOptions & { provider?: InlineCompletionsProvider; fakeClock?: boolean }, + callback: (args: { editor: ITestCodeEditor; editorViewModel: ViewModel; model: InlineCompletionsModel; context: GhostTextContext }) => Promise ): Promise { return await runWithFakedTimers({ useFakeTimers: options.fakeClock, }, async () => { const disposableStore = new DisposableStore(); + try { if (options.provider) { - const d = InlineCompletionsProviderRegistry.register({ pattern: '**' }, options.provider); + const languageFeaturesService = new LanguageFeaturesService(); + if (!options.serviceCollection) { + options.serviceCollection = new ServiceCollection(); + } + options.serviceCollection.set(ILanguageFeaturesService, languageFeaturesService); + const d = languageFeaturesService.inlineCompletionsProvider.register({ pattern: '**' }, options.provider); disposableStore.add(d); } diff --git a/src/vs/editor/contrib/inlineCompletions/test/suggestWidgetModel.test.ts b/src/vs/editor/contrib/inlineCompletions/test/browser/suggestWidgetModel.test.ts similarity index 87% rename from src/vs/editor/contrib/inlineCompletions/test/suggestWidgetModel.test.ts rename to src/vs/editor/contrib/inlineCompletions/test/browser/suggestWidgetModel.test.ts index c4c4b37fd12..7e03f58e981 100644 --- a/src/vs/editor/contrib/inlineCompletions/test/suggestWidgetModel.test.ts +++ b/src/vs/editor/contrib/inlineCompletions/test/browser/suggestWidgetModel.test.ts @@ -9,15 +9,15 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { mock } from 'vs/base/test/common/mock'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { Range } from 'vs/editor/common/core/range'; -import { CompletionItemKind, CompletionItemProvider, CompletionProviderRegistry } from 'vs/editor/common/languages'; +import { CompletionItemKind, CompletionItemProvider } from 'vs/editor/common/languages'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; -import { SharedInlineCompletionCache } from 'vs/editor/contrib/inlineCompletions/ghostTextModel'; -import { SuggestWidgetPreviewModel } from 'vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel'; -import { GhostTextContext } from 'vs/editor/contrib/inlineCompletions/test/utils'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/suggestMemory'; +import { SharedInlineCompletionCache } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextModel'; +import { SuggestWidgetPreviewModel } from 'vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel'; +import { GhostTextContext } from 'vs/editor/contrib/inlineCompletions/test/browser/utils'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; +import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/browser/suggestMemory'; import { ITestCodeEditor, TestCodeEditorInstantiationOptions, withAsyncTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { IMenu, IMenuService } from 'vs/platform/actions/common/actions'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -31,8 +31,10 @@ import assert = require('assert'); import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { ILabelService } from 'vs/platform/label/common/label'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { minimizeInlineCompletion } from 'vs/editor/contrib/inlineCompletions/inlineCompletionsModel'; -import { rangeStartsWith } from 'vs/editor/contrib/inlineCompletions/suggestWidgetInlineCompletionProvider'; +import { minimizeInlineCompletion } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel'; +import { rangeStartsWith } from 'vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; suite('Suggest Widget Model', () => { test('rangeStartsWith', () => { @@ -138,8 +140,8 @@ const provider: CompletionItemProvider = { async function withAsyncTestCodeEditorAndInlineCompletionsModel( text: string, - options: TestCodeEditorInstantiationOptions & { provider?: CompletionItemProvider, fakeClock?: boolean, serviceCollection?: never }, - callback: (args: { editor: ITestCodeEditor, editorViewModel: ViewModel, model: SuggestWidgetPreviewModel, context: GhostTextContext }) => Promise + options: TestCodeEditorInstantiationOptions & { provider?: CompletionItemProvider; fakeClock?: boolean; serviceCollection?: never }, + callback: (args: { editor: ITestCodeEditor; editorViewModel: ViewModel; model: SuggestWidgetPreviewModel; context: GhostTextContext }) => Promise ): Promise { await runWithFakedTimers({ useFakeTimers: options.fakeClock }, async () => { const disposableStore = new DisposableStore(); @@ -172,7 +174,9 @@ async function withAsyncTestCodeEditorAndInlineCompletionsModel( ); if (options.provider) { - const d = CompletionProviderRegistry.register({ pattern: '**' }, options.provider); + const languageFeaturesService = new LanguageFeaturesService(); + serviceCollection.set(ILanguageFeaturesService, languageFeaturesService); + const d = languageFeaturesService.completionProvider.register({ pattern: '**' }, options.provider); disposableStore.add(d); } diff --git a/src/vs/editor/contrib/inlineCompletions/test/utils.ts b/src/vs/editor/contrib/inlineCompletions/test/browser/utils.ts similarity index 98% rename from src/vs/editor/contrib/inlineCompletions/test/utils.ts rename to src/vs/editor/contrib/inlineCompletions/test/browser/utils.ts index 6747543804b..17eba2098c3 100644 --- a/src/vs/editor/contrib/inlineCompletions/test/utils.ts +++ b/src/vs/editor/contrib/inlineCompletions/test/browser/utils.ts @@ -6,11 +6,11 @@ import { timeout } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable } from 'vs/base/common/lifecycle'; -import { CoreEditingCommands, CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands, CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { Position } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; import { InlineCompletion, InlineCompletionContext, InlineCompletionsProvider } from 'vs/editor/common/languages'; -import { GhostTextWidgetModel } from 'vs/editor/contrib/inlineCompletions/ghostText'; +import { GhostTextWidgetModel } from 'vs/editor/contrib/inlineCompletions/browser/ghostText'; import { ITestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; export class MockInlineCompletionsProvider implements InlineCompletionsProvider { diff --git a/src/vs/editor/contrib/lineSelection/lineSelection.ts b/src/vs/editor/contrib/lineSelection/browser/lineSelection.ts similarity index 91% rename from src/vs/editor/contrib/lineSelection/lineSelection.ts rename to src/vs/editor/contrib/lineSelection/browser/lineSelection.ts index f261fb7b6c9..0e773d81809 100644 --- a/src/vs/editor/contrib/lineSelection/lineSelection.ts +++ b/src/vs/editor/contrib/lineSelection/browser/lineSelection.ts @@ -6,8 +6,8 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { CursorMoveCommands } from 'vs/editor/common/controller/cursorMoveCommands'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; +import { CursorMoveCommands } from 'vs/editor/common/cursor/cursorMoveCommands'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import * as nls from 'vs/nls'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; diff --git a/src/vs/editor/contrib/lineSelection/test/lineSelection.test.ts b/src/vs/editor/contrib/lineSelection/test/browser/lineSelection.test.ts similarity index 98% rename from src/vs/editor/contrib/lineSelection/test/lineSelection.test.ts rename to src/vs/editor/contrib/lineSelection/test/browser/lineSelection.test.ts index 1e475a8fe41..a66ab44d60a 100644 --- a/src/vs/editor/contrib/lineSelection/test/lineSelection.test.ts +++ b/src/vs/editor/contrib/lineSelection/test/browser/lineSelection.test.ts @@ -8,7 +8,7 @@ import type { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; -import { ExpandLineSelectionAction } from 'vs/editor/contrib/lineSelection/lineSelection'; +import { ExpandLineSelectionAction } from 'vs/editor/contrib/lineSelection/browser/lineSelection'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; function executeAction(action: EditorAction, editor: ICodeEditor): void { diff --git a/src/vs/editor/contrib/linesOperations/copyLinesCommand.ts b/src/vs/editor/contrib/linesOperations/browser/copyLinesCommand.ts similarity index 100% rename from src/vs/editor/contrib/linesOperations/copyLinesCommand.ts rename to src/vs/editor/contrib/linesOperations/browser/copyLinesCommand.ts diff --git a/src/vs/editor/contrib/linesOperations/linesOperations.ts b/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts similarity index 98% rename from src/vs/editor/contrib/linesOperations/linesOperations.ts rename to src/vs/editor/contrib/linesOperations/browser/linesOperations.ts index 5def246b039..52993bdb46a 100644 --- a/src/vs/editor/contrib/linesOperations/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts @@ -4,23 +4,23 @@ *--------------------------------------------------------------------------------------------*/ import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, IActionOptions, registerEditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ReplaceCommand, ReplaceCommandThatPreservesSelection, ReplaceCommandThatSelectsText } from 'vs/editor/common/commands/replaceCommand'; import { TrimTrailingWhitespaceCommand } from 'vs/editor/common/commands/trimTrailingWhitespaceCommand'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { TypeOperations } from 'vs/editor/common/cursor/cursorTypeOperations'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ICommand } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; -import { CopyLinesCommand } from 'vs/editor/contrib/linesOperations/copyLinesCommand'; -import { MoveLinesCommand } from 'vs/editor/contrib/linesOperations/moveLinesCommand'; -import { SortLinesCommand } from 'vs/editor/contrib/linesOperations/sortLinesCommand'; +import { ITextModel } from 'vs/editor/common/model'; +import { CopyLinesCommand } from 'vs/editor/contrib/linesOperations/browser/copyLinesCommand'; +import { MoveLinesCommand } from 'vs/editor/contrib/linesOperations/browser/moveLinesCommand'; +import { SortLinesCommand } from 'vs/editor/contrib/linesOperations/browser/sortLinesCommand'; import * as nls from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -302,7 +302,7 @@ export class DeleteDuplicateLinesAction extends EditorAction { return; } - let edits: IIdentifiedSingleEditOperation[] = []; + let edits: ISingleEditOperation[] = []; let endCursorState: Selection[] = []; let linesDeleted = 0; @@ -430,7 +430,7 @@ export class DeleteLinesAction extends EditorAction { } let linesDeleted = 0; - let edits: IIdentifiedSingleEditOperation[] = []; + let edits: ISingleEditOperation[] = []; let cursorState: Selection[] = []; for (let i = 0, len = ops.length; i < len; i++) { const op = ops[i]; @@ -625,7 +625,7 @@ export abstract class AbstractDeleteAllToBoundaryAction extends EditorAction { let endCursorState = this._getEndCursorState(primaryCursor, effectiveRanges); - let edits: IIdentifiedSingleEditOperation[] = effectiveRanges.map(range => { + let edits: ISingleEditOperation[] = effectiveRanges.map(range => { return EditOperation.replace(range, ''); }); @@ -849,7 +849,7 @@ export class JoinLinesAction extends EditorAction { return; } - let edits: IIdentifiedSingleEditOperation[] = []; + let edits: ISingleEditOperation[] = []; let endCursorState: Selection[] = []; let endPrimaryCursor = primaryCursor; let lineOffset = 0; @@ -1018,7 +1018,7 @@ export abstract class AbstractCaseAction extends EditorAction { } const wordSeparators = editor.getOption(EditorOption.wordSeparators); - const textEdits: IIdentifiedSingleEditOperation[] = []; + const textEdits: ISingleEditOperation[] = []; for (const selection of selections) { if (selection.isEmpty()) { diff --git a/src/vs/editor/contrib/linesOperations/moveLinesCommand.ts b/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts similarity index 99% rename from src/vs/editor/contrib/linesOperations/moveLinesCommand.ts rename to src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts index 0249ac3ec26..c3ede1e5e0f 100644 --- a/src/vs/editor/contrib/linesOperations/moveLinesCommand.ts +++ b/src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts @@ -13,7 +13,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { CompleteEnterAction, IndentAction } from 'vs/editor/common/languages/languageConfiguration'; import { IIndentConverter, LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { IndentConsts } from 'vs/editor/common/languages/supports/indentRules'; -import * as indentUtils from 'vs/editor/contrib/indentation/indentUtils'; +import * as indentUtils from 'vs/editor/contrib/indentation/browser/indentUtils'; export class MoveLinesCommand implements ICommand { diff --git a/src/vs/editor/contrib/linesOperations/sortLinesCommand.ts b/src/vs/editor/contrib/linesOperations/browser/sortLinesCommand.ts similarity index 93% rename from src/vs/editor/contrib/linesOperations/sortLinesCommand.ts rename to src/vs/editor/contrib/linesOperations/browser/sortLinesCommand.ts index f3d3ccc6332..6b84299974a 100644 --- a/src/vs/editor/contrib/linesOperations/sortLinesCommand.ts +++ b/src/vs/editor/contrib/linesOperations/browser/sortLinesCommand.ts @@ -3,11 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; -import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; export class SortLinesCommand implements ICommand { @@ -102,7 +102,7 @@ function getSortData(model: ITextModel, selection: Selection, descending: boolea /** * Generate commands for sorting lines on a model. */ -function sortLines(model: ITextModel, selection: Selection, descending: boolean): IIdentifiedSingleEditOperation | null { +function sortLines(model: ITextModel, selection: Selection, descending: boolean): ISingleEditOperation | null { let data = getSortData(model, selection, descending); if (!data) { diff --git a/src/vs/editor/contrib/linesOperations/test/copyLinesCommand.test.ts b/src/vs/editor/contrib/linesOperations/test/browser/copyLinesCommand.test.ts similarity index 98% rename from src/vs/editor/contrib/linesOperations/test/copyLinesCommand.test.ts rename to src/vs/editor/contrib/linesOperations/test/browser/copyLinesCommand.test.ts index 587419c716a..9881cb0e4ed 100644 --- a/src/vs/editor/contrib/linesOperations/test/copyLinesCommand.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/browser/copyLinesCommand.test.ts @@ -5,8 +5,8 @@ import * as assert from 'assert'; import { Selection } from 'vs/editor/common/core/selection'; -import { CopyLinesCommand } from 'vs/editor/contrib/linesOperations/copyLinesCommand'; -import { DuplicateSelectionAction } from 'vs/editor/contrib/linesOperations/linesOperations'; +import { CopyLinesCommand } from 'vs/editor/contrib/linesOperations/browser/copyLinesCommand'; +import { DuplicateSelectionAction } from 'vs/editor/contrib/linesOperations/browser/linesOperations'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { testCommand } from 'vs/editor/test/browser/testCommand'; diff --git a/src/vs/editor/contrib/linesOperations/test/linesOperations.test.ts b/src/vs/editor/contrib/linesOperations/test/browser/linesOperations.test.ts similarity index 99% rename from src/vs/editor/contrib/linesOperations/test/linesOperations.test.ts rename to src/vs/editor/contrib/linesOperations/test/browser/linesOperations.test.ts index 7451caa0e56..79d7b30a676 100644 --- a/src/vs/editor/contrib/linesOperations/test/linesOperations.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/browser/linesOperations.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import type { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; @@ -11,7 +11,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { Handler } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; -import { DeleteAllLeftAction, DeleteAllRightAction, DeleteDuplicateLinesAction, DeleteLinesAction, IndentLinesAction, InsertLineAfterAction, InsertLineBeforeAction, JoinLinesAction, LowerCaseAction, SnakeCaseAction, SortLinesAscendingAction, SortLinesDescendingAction, TitleCaseAction, TransposeAction, UpperCaseAction } from 'vs/editor/contrib/linesOperations/linesOperations'; +import { DeleteAllLeftAction, DeleteAllRightAction, DeleteDuplicateLinesAction, DeleteLinesAction, IndentLinesAction, InsertLineAfterAction, InsertLineBeforeAction, JoinLinesAction, LowerCaseAction, SnakeCaseAction, SortLinesAscendingAction, SortLinesDescendingAction, TitleCaseAction, TransposeAction, UpperCaseAction } from 'vs/editor/contrib/linesOperations/browser/linesOperations'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; diff --git a/src/vs/editor/contrib/linesOperations/test/moveLinesCommand.test.ts b/src/vs/editor/contrib/linesOperations/test/browser/moveLinesCommand.test.ts similarity index 99% rename from src/vs/editor/contrib/linesOperations/test/moveLinesCommand.test.ts rename to src/vs/editor/contrib/linesOperations/test/browser/moveLinesCommand.test.ts index 4c0b96defdb..a7735a08dbc 100644 --- a/src/vs/editor/contrib/linesOperations/test/moveLinesCommand.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/browser/moveLinesCommand.test.ts @@ -6,7 +6,7 @@ import { EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions' import { Selection } from 'vs/editor/common/core/selection'; import { IndentationRule } from 'vs/editor/common/languages/languageConfiguration'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { MoveLinesCommand } from 'vs/editor/contrib/linesOperations/moveLinesCommand'; +import { MoveLinesCommand } from 'vs/editor/contrib/linesOperations/browser/moveLinesCommand'; import { testCommand } from 'vs/editor/test/browser/testCommand'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; diff --git a/src/vs/editor/contrib/linesOperations/test/sortLinesCommand.test.ts b/src/vs/editor/contrib/linesOperations/test/browser/sortLinesCommand.test.ts similarity index 99% rename from src/vs/editor/contrib/linesOperations/test/sortLinesCommand.test.ts rename to src/vs/editor/contrib/linesOperations/test/browser/sortLinesCommand.test.ts index 8be9c5f37b5..62f60269b52 100644 --- a/src/vs/editor/contrib/linesOperations/test/sortLinesCommand.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/browser/sortLinesCommand.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Selection } from 'vs/editor/common/core/selection'; -import { SortLinesCommand } from 'vs/editor/contrib/linesOperations/sortLinesCommand'; +import { SortLinesCommand } from 'vs/editor/contrib/linesOperations/browser/sortLinesCommand'; import { testCommand } from 'vs/editor/test/browser/testCommand'; function testSortLinesAscendingCommand(lines: string[], selection: Selection, expectedLines: string[], expectedSelection: Selection): void { diff --git a/src/vs/editor/contrib/linkedEditing/linkedEditing.ts b/src/vs/editor/contrib/linkedEditing/browser/linkedEditing.ts similarity index 88% rename from src/vs/editor/contrib/linkedEditing/linkedEditing.ts rename to src/vs/editor/contrib/linkedEditing/browser/linkedEditing.ts index fee0bd887ee..71a2502412c 100644 --- a/src/vs/editor/contrib/linkedEditing/linkedEditing.ts +++ b/src/vs/editor/contrib/linkedEditing/browser/linkedEditing.ts @@ -21,15 +21,20 @@ import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { IIdentifiedSingleEditOperation, IModelDeltaDecoration, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { IModelDeltaDecoration, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { LinkedEditingRangeProviderRegistry, LinkedEditingRanges } from 'vs/editor/common/languages'; +import { LinkedEditingRangeProvider, LinkedEditingRanges } from 'vs/editor/common/languages'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import * as nls from 'vs/nls'; import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; +import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { StopWatch } from 'vs/base/common/stopwatch'; export const CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE = new RawContextKey('LinkedEditingInputVisible', false); @@ -49,12 +54,14 @@ export class LinkedEditingContribution extends Disposable implements IEditorCont return editor.getContribution(LinkedEditingContribution.ID); } - private _debounceDuration = 200; + private _debounceDuration: number | undefined; private readonly _editor: ICodeEditor; + private readonly _providers: LanguageFeatureRegistry; private _enabled: boolean; private readonly _visibleContextKey: IContextKey; + private readonly _debounceInformation: IFeatureDebounceInformation; private _rangeUpdateTriggerPromise: Promise | null; private _rangeSyncTriggerPromise: Promise | null; @@ -73,12 +80,16 @@ export class LinkedEditingContribution extends Disposable implements IEditorCont constructor( editor: ICodeEditor, @IContextKeyService contextKeyService: IContextKeyService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, @ILanguageConfigurationService private readonly languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeatureDebounceService languageFeatureDebounceService: ILanguageFeatureDebounceService ) { super(); this._editor = editor; + this._providers = languageFeaturesService.linkedEditingRangeProvider; this._enabled = false; this._visibleContextKey = CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE.bindTo(contextKeyService); + this._debounceInformation = languageFeatureDebounceService.for(this._providers, 'Linked Editing', { min: 200 }); this._currentDecorations = []; this._languageWordPattern = null; @@ -100,7 +111,7 @@ export class LinkedEditingContribution extends Disposable implements IEditorCont this.reinitialize(false); } })); - this._register(LinkedEditingRangeProviderRegistry.onDidChange(() => this.reinitialize(false))); + this._register(this._providers.onDidChange(() => this.reinitialize(false))); this._register(this._editor.onDidChangeModelLanguage(() => this.reinitialize(true))); this.reinitialize(true); @@ -108,7 +119,7 @@ export class LinkedEditingContribution extends Disposable implements IEditorCont private reinitialize(forceRefresh: boolean) { const model = this._editor.getModel(); - const isEnabled = model !== null && (this._editor.getOption(EditorOption.linkedEditing) || this._editor.getOption(EditorOption.renameOnType)) && LinkedEditingRangeProviderRegistry.has(model); + const isEnabled = model !== null && (this._editor.getOption(EditorOption.linkedEditing) || this._editor.getOption(EditorOption.renameOnType)) && this._providers.has(model); if (isEnabled === this._enabled && !forceRefresh) { return; } @@ -131,9 +142,9 @@ export class LinkedEditingContribution extends Disposable implements IEditorCont ) ); - const rangeUpdateScheduler = new Delayer(this._debounceDuration); + const rangeUpdateScheduler = new Delayer(this._debounceInformation.get(model)); const triggerRangeUpdate = () => { - this._rangeUpdateTriggerPromise = rangeUpdateScheduler.trigger(() => this.updateRanges(), this._debounceDuration); + this._rangeUpdateTriggerPromise = rangeUpdateScheduler.trigger(() => this.updateRanges(), this._debounceDuration ?? this._debounceInformation.get(model)); }; const rangeSyncScheduler = new Delayer(0); const triggerRangeSync = (decorations: string[]) => { @@ -156,8 +167,8 @@ export class LinkedEditingContribution extends Disposable implements IEditorCont })); this._localToDispose.add({ dispose: () => { - rangeUpdateScheduler.cancel(); - rangeSyncScheduler.cancel(); + rangeUpdateScheduler.dispose(); + rangeSyncScheduler.dispose(); } }); this.updateRanges(); @@ -186,7 +197,7 @@ export class LinkedEditingContribution extends Disposable implements IEditorCont } } - let edits: IIdentifiedSingleEditOperation[] = []; + let edits: ISingleEditOperation[] = []; for (let i = 1, len = decorations.length; i < len; i++) { const mirrorRange = model.getDecorationRange(decorations[i]); if (!mirrorRange) { @@ -291,7 +302,9 @@ export class LinkedEditingContribution extends Disposable implements IEditorCont this._currentRequestModelVersion = modelVersionId; const request = createCancelablePromise(async token => { try { - const response = await getLinkedEditingRanges(model, position, token); + const sw = new StopWatch(false); + const response = await getLinkedEditingRanges(this._providers, model, position, token); + this._debounceInformation.update(model, sw.elapsed()); if (request !== this._currentRequest) { return; } @@ -428,8 +441,8 @@ registerEditorCommand(new LinkedEditingCommand({ })); -function getLinkedEditingRanges(model: ITextModel, position: Position, token: CancellationToken): Promise { - const orderedByScore = LinkedEditingRangeProviderRegistry.ordered(model); +function getLinkedEditingRanges(providers: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { + const orderedByScore = providers.ordered(model); // in order of score ask the linked editing range provider // until someone response with a good result @@ -452,7 +465,10 @@ registerThemingParticipant((theme, collector) => { } }); -registerModelAndPositionCommand('_executeLinkedEditingProvider', (model, position) => getLinkedEditingRanges(model, position, CancellationToken.None)); +registerModelAndPositionCommand('_executeLinkedEditingProvider', (_accessor, model, position) => { + const { linkedEditingRangeProvider } = _accessor.get(ILanguageFeaturesService); + return getLinkedEditingRanges(linkedEditingRangeProvider, model, position, CancellationToken.None); +}); registerEditorContribution(LinkedEditingContribution.ID, LinkedEditingContribution); registerEditorAction(LinkedEditingAction); diff --git a/src/vs/editor/contrib/linkedEditing/test/linkedEditing.test..ts b/src/vs/editor/contrib/linkedEditing/test/browser/linkedEditing.test.ts similarity index 92% rename from src/vs/editor/contrib/linkedEditing/test/linkedEditing.test..ts rename to src/vs/editor/contrib/linkedEditing/test/browser/linkedEditing.test.ts index 9225bec10c8..a66491e7c89 100644 --- a/src/vs/editor/contrib/linkedEditing/test/linkedEditing.test..ts +++ b/src/vs/editor/contrib/linkedEditing/test/browser/linkedEditing.test.ts @@ -6,17 +6,19 @@ import * as assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Handler } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; -import * as modes from 'vs/editor/common/languages'; +import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/core/wordHelper'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { LinkedEditingContribution } from 'vs/editor/contrib/linkedEditing/linkedEditing'; -import { createTestCodeEditor, ITestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; +import { LinkedEditingContribution } from 'vs/editor/contrib/linkedEditing/browser/linkedEditing'; +import { createTestCodeEditor, ITestCodeEditor, TestCodeEditorInstantiationOptions } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const mockFile = URI.parse('test:somefile.ttt'); const mockFileSelector = { scheme: 'test' }; @@ -46,10 +48,10 @@ suite('linked editing', () => { disposables.clear(); }); - function createMockEditor(text: string | string[]): ITestCodeEditor { + function createMockEditor(text: string | string[], options: TestCodeEditorInstantiationOptions = {}): ITestCodeEditor { const model = createTextModel(typeof text === 'string' ? text : text.join('\n'), languageId, undefined, mockFile); - const editor = createTestCodeEditor(model); + const editor = createTestCodeEditor(model, options); disposables.add(model); disposables.add(editor); @@ -59,12 +61,16 @@ suite('linked editing', () => { function testCase( name: string, - initialState: { text: string | string[], responseWordPattern?: RegExp }, + initialState: { text: string | string[]; responseWordPattern?: RegExp }, operations: (editor: TestEditor) => Promise, expectedEndText: string | string[] ) { test(name, async () => { - disposables.add(modes.LinkedEditingRangeProviderRegistry.register(mockFileSelector, { + + const languageFeaturesService = new LanguageFeaturesService(); + const serviceCollection = new ServiceCollection([ILanguageFeaturesService, languageFeaturesService]); + + disposables.add(languageFeaturesService.linkedEditingRangeProvider.register(mockFileSelector, { provideLinkedEditingRanges(model: ITextModel, pos: IPosition) { const wordAtPos = model.getWordAtPosition(pos); if (wordAtPos) { @@ -75,11 +81,11 @@ suite('linked editing', () => { } })); - const editor = createMockEditor(initialState.text); + const editor = createMockEditor(initialState.text, { serviceCollection }); editor.updateOptions({ linkedEditing: true }); const linkedEditingContribution = editor.registerAndInstantiateContribution( LinkedEditingContribution.ID, - LinkedEditingContribution + LinkedEditingContribution, ); linkedEditingContribution.setDebounceDuration(0); diff --git a/src/vs/editor/contrib/links/getLinks.ts b/src/vs/editor/contrib/links/browser/getLinks.ts similarity index 88% rename from src/vs/editor/contrib/links/getLinks.ts rename to src/vs/editor/contrib/links/browser/getLinks.ts index ebcec2a8776..09e49fea271 100644 --- a/src/vs/editor/contrib/links/getLinks.ts +++ b/src/vs/editor/contrib/links/browser/getLinks.ts @@ -11,9 +11,11 @@ import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import { ILink, ILinksList, LinkProvider, LinkProviderRegistry } from 'vs/editor/common/languages'; +import { ILink, ILinksList, LinkProvider } from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class Link implements ILink { @@ -135,12 +137,12 @@ export class LinksList { } -export function getLinks(model: ITextModel, token: CancellationToken): Promise { +export function getLinks(providers: LanguageFeatureRegistry, model: ITextModel, token: CancellationToken): Promise { const lists: [ILinksList, LinkProvider][] = []; // ask all providers for links in parallel - const promises = LinkProviderRegistry.ordered(model).reverse().map((provider, i) => { + const promises = providers.ordered(model).reverse().map((provider, i) => { return Promise.resolve(provider.provideLinks(model, token)).then(result => { if (result) { lists[i] = [result, provider]; @@ -167,11 +169,12 @@ CommandsRegistry.registerCommand('_executeLinkProvider', async (accessor, ...arg resolveCount = 0; } + const { linkProvider } = accessor.get(ILanguageFeaturesService); const model = accessor.get(IModelService).getModel(uri); if (!model) { return []; } - const list = await getLinks(model, CancellationToken.None); + const list = await getLinks(linkProvider, model, CancellationToken.None); if (!list) { return []; } diff --git a/src/vs/editor/contrib/links/links.css b/src/vs/editor/contrib/links/browser/links.css similarity index 100% rename from src/vs/editor/contrib/links/links.css rename to src/vs/editor/contrib/links/browser/links.css diff --git a/src/vs/editor/contrib/links/links.ts b/src/vs/editor/contrib/links/browser/links.ts similarity index 74% rename from src/vs/editor/contrib/links/links.ts rename to src/vs/editor/contrib/links/browser/links.ts index a3b45b53995..d647d57bd7d 100644 --- a/src/vs/editor/contrib/links/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -3,14 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as async from 'vs/base/common/async'; +import { createCancelablePromise, CancelablePromise, RunOnceScheduler } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { onUnexpectedError } from 'vs/base/common/errors'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import { DisposableStore } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import * as platform from 'vs/base/common/platform'; import * as resources from 'vs/base/common/resources'; +import { StopWatch } from 'vs/base/common/stopwatch'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./links'; import { ICodeEditor, MouseTargetType } from 'vs/editor/browser/editorBrowser'; @@ -18,101 +19,21 @@ import { EditorAction, registerEditorAction, registerEditorContribution, Service import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { LinkProvider } from 'vs/editor/common/languages'; import { IModelDecorationsChangeAccessor, IModelDeltaDecoration, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { LinkProviderRegistry } from 'vs/editor/common/languages'; -import { ClickLinkGesture, ClickLinkKeyboardEvent, ClickLinkMouseEvent } from 'vs/editor/contrib/gotoSymbol/link/clickLinkGesture'; -import { getLinks, Link, LinksList } from 'vs/editor/contrib/links/getLinks'; +import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { ClickLinkGesture, ClickLinkKeyboardEvent, ClickLinkMouseEvent } from 'vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture'; +import { getLinks, Link, LinksList } from 'vs/editor/contrib/links/browser/getLinks'; import * as nls from 'vs/nls'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -function getHoverMessage(link: Link, useMetaKey: boolean): MarkdownString { - const executeCmd = link.url && /^command:/i.test(link.url.toString()); - - const label = link.tooltip - ? link.tooltip - : executeCmd - ? nls.localize('links.navigate.executeCmd', 'Execute command') - : nls.localize('links.navigate.follow', 'Follow link'); - - const kb = useMetaKey - ? platform.isMacintosh - ? nls.localize('links.navigate.kb.meta.mac', "cmd + click") - : nls.localize('links.navigate.kb.meta', "ctrl + click") - : platform.isMacintosh - ? nls.localize('links.navigate.kb.alt.mac', "option + click") - : nls.localize('links.navigate.kb.alt', "alt + click"); - - if (link.url) { - let nativeLabel = ''; - if (/^command:/i.test(link.url.toString())) { - // Don't show complete command arguments in the native tooltip - const match = link.url.toString().match(/^command:([^?#]+)/); - if (match) { - const commandId = match[1]; - const nativeLabelText = nls.localize('tooltip.explanation', "Execute command {0}", commandId); - nativeLabel = ` "${nativeLabelText}"`; - } - } - const hoverMessage = new MarkdownString('', true).appendMarkdown(`[${label}](${link.url.toString(true).replace(/ /g, '%20')}${nativeLabel}) (${kb})`); - return hoverMessage; - } else { - return new MarkdownString().appendText(`${label} (${kb})`); - } -} - -const decoration = { - general: ModelDecorationOptions.register({ - description: 'detected-link', - stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - collapseOnReplaceEdit: true, - inlineClassName: 'detected-link' - }), - active: ModelDecorationOptions.register({ - description: 'detected-link-active', - stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - collapseOnReplaceEdit: true, - inlineClassName: 'detected-link-active' - }) -}; - - -class LinkOccurrence { - - public static decoration(link: Link, useMetaKey: boolean): IModelDeltaDecoration { - return { - range: link.range, - options: LinkOccurrence._getOptions(link, useMetaKey, false) - }; - } - - private static _getOptions(link: Link, useMetaKey: boolean, isActive: boolean): ModelDecorationOptions { - const options = { ... (isActive ? decoration.active : decoration.general) }; - options.hoverMessage = getHoverMessage(link, useMetaKey); - return options; - } - - public decorationId: string; - public link: Link; - - constructor(link: Link, decorationId: string) { - this.link = link; - this.decorationId = decorationId; - } - - public activate(changeAccessor: IModelDecorationsChangeAccessor, useMetaKey: boolean): void { - changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurrence._getOptions(this.link, useMetaKey, true)); - } - - public deactivate(changeAccessor: IModelDecorationsChangeAccessor, useMetaKey: boolean): void { - changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurrence._getOptions(this.link, useMetaKey, false)); - } -} - -export class LinkDetector implements IEditorContribution { +export class LinkDetector extends Disposable implements IEditorContribution { public static readonly ID: string = 'editor.linkDetector'; @@ -120,49 +41,46 @@ export class LinkDetector implements IEditorContribution { return editor.getContribution(LinkDetector.ID); } - static readonly RECOMPUTE_TIME = 1000; // ms - - private readonly editor: ICodeEditor; - private enabled: boolean; - private readonly listenersToRemove = new DisposableStore(); - private readonly timeout: async.TimeoutTimer; - private computePromise: async.CancelablePromise | null; + private readonly providers: LanguageFeatureRegistry; + private readonly debounceInformation: IFeatureDebounceInformation; + private readonly computeLinks: RunOnceScheduler; + private computePromise: CancelablePromise | null; private activeLinksList: LinksList | null; private activeLinkDecorationId: string | null; - private readonly openerService: IOpenerService; - private readonly notificationService: INotificationService; - private currentOccurrences: { [decorationId: string]: LinkOccurrence; }; + private currentOccurrences: { [decorationId: string]: LinkOccurrence }; constructor( - editor: ICodeEditor, - @IOpenerService openerService: IOpenerService, - @INotificationService notificationService: INotificationService + private readonly editor: ICodeEditor, + @IOpenerService private readonly openerService: IOpenerService, + @INotificationService private readonly notificationService: INotificationService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, + @ILanguageFeatureDebounceService languageFeatureDebounceService: ILanguageFeatureDebounceService, ) { - this.editor = editor; - this.openerService = openerService; - this.notificationService = notificationService; + super(); - let clickLinkGesture = new ClickLinkGesture(editor); - this.listenersToRemove.add(clickLinkGesture); - this.listenersToRemove.add(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { + this.providers = this.languageFeaturesService.linkProvider; + this.debounceInformation = languageFeatureDebounceService.for(this.providers, 'Links', { min: 1000, max: 4000 }); + this.computeLinks = this._register(new RunOnceScheduler(() => this.computeLinksNow(), 1000)); + this.computePromise = null; + this.activeLinksList = null; + this.currentOccurrences = {}; + this.activeLinkDecorationId = null; + + const clickLinkGesture = this._register(new ClickLinkGesture(editor)); + + this._register(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { this._onEditorMouseMove(mouseEvent, keyboardEvent); })); - this.listenersToRemove.add(clickLinkGesture.onExecute((e) => { + this._register(clickLinkGesture.onExecute((e) => { this.onEditorMouseUp(e); })); - this.listenersToRemove.add(clickLinkGesture.onCancel((e) => { + this._register(clickLinkGesture.onCancel((e) => { this.cleanUpActiveLinkDecoration(); })); - - this.enabled = editor.getOption(EditorOption.links); - this.listenersToRemove.add(editor.onDidChangeConfiguration((e) => { - const enabled = editor.getOption(EditorOption.links); - if (this.enabled === enabled) { - // No change in our configuration option + this._register(editor.onDidChangeConfiguration((e) => { + if (!e.hasChanged(EditorOption.links)) { return; } - this.enabled = enabled; - // Remove any links (for the getting disabled case) this.updateDecorations([]); @@ -170,45 +88,40 @@ export class LinkDetector implements IEditorContribution { this.stop(); // Start computing (for the getting enabled case) - this.beginCompute(); + this.computeLinks.schedule(0); + })); + this._register(editor.onDidChangeModelContent((e) => { + if (!this.editor.hasModel()) { + return; + } + this.computeLinks.schedule(this.debounceInformation.get(this.editor.getModel())); + })); + this._register(editor.onDidChangeModel((e) => { + this.currentOccurrences = {}; + this.activeLinkDecorationId = null; + this.stop(); + this.computeLinks.schedule(0); + })); + this._register(editor.onDidChangeModelLanguage((e) => { + this.stop(); + this.computeLinks.schedule(0); + })); + this._register(this.providers.onDidChange((e) => { + this.stop(); + this.computeLinks.schedule(0); })); - this.listenersToRemove.add(editor.onDidChangeModelContent((e) => this.onChange())); - this.listenersToRemove.add(editor.onDidChangeModel((e) => this.onModelChanged())); - this.listenersToRemove.add(editor.onDidChangeModelLanguage((e) => this.onModelLanguageChanged())); - this.listenersToRemove.add(LinkProviderRegistry.onDidChange((e) => this.onModelLanguageChanged())); - this.timeout = new async.TimeoutTimer(); - this.computePromise = null; - this.activeLinksList = null; - this.currentOccurrences = {}; - this.activeLinkDecorationId = null; - this.beginCompute(); + this.computeLinks.schedule(0); } - private onModelChanged(): void { - this.currentOccurrences = {}; - this.activeLinkDecorationId = null; - this.stop(); - this.beginCompute(); - } - - private onModelLanguageChanged(): void { - this.stop(); - this.beginCompute(); - } - - private onChange(): void { - this.timeout.setIfNotSet(() => this.beginCompute(), LinkDetector.RECOMPUTE_TIME); - } - - private async beginCompute(): Promise { - if (!this.editor.hasModel() || !this.enabled) { + private async computeLinksNow(): Promise { + if (!this.editor.hasModel() || !this.editor.getOption(EditorOption.links)) { return; } const model = this.editor.getModel(); - if (!LinkProviderRegistry.has(model)) { + if (!this.providers.has(model)) { return; } @@ -217,9 +130,14 @@ export class LinkDetector implements IEditorContribution { this.activeLinksList = null; } - this.computePromise = async.createCancelablePromise(token => getLinks(model, token)); + this.computePromise = createCancelablePromise(token => getLinks(this.providers, model, token)); try { + const sw = new StopWatch(false); this.activeLinksList = await this.computePromise; + this.debounceInformation.update(model, sw.elapsed()); + if (model.isDisposed()) { + return; + } this.updateDecorations(this.activeLinksList.links); } catch (err) { onUnexpectedError(err); @@ -230,15 +148,14 @@ export class LinkDetector implements IEditorContribution { private updateDecorations(links: Link[]): void { const useMetaKey = (this.editor.getOption(EditorOption.multiCursorModifier) === 'altKey'); - let oldDecorations: string[] = []; - let keys = Object.keys(this.currentOccurrences); - for (let i = 0, len = keys.length; i < len; i++) { - let decorationId = keys[i]; - let occurance = this.currentOccurrences[decorationId]; - oldDecorations.push(occurance.decorationId); + const oldDecorations: string[] = []; + const keys = Object.keys(this.currentOccurrences); + for (const decorationId of keys) { + const occurence = this.currentOccurrences[decorationId]; + oldDecorations.push(occurence.decorationId); } - let newDecorations: IModelDeltaDecoration[] = []; + const newDecorations: IModelDeltaDecoration[] = []; if (links) { // Not sure why this is sometimes null for (const link of links) { @@ -246,13 +163,13 @@ export class LinkDetector implements IEditorContribution { } } - let decorations = this.editor.deltaDecorations(oldDecorations, newDecorations); + const decorations = this.editor.deltaDecorations(oldDecorations, newDecorations); this.currentOccurrences = {}; this.activeLinkDecorationId = null; for (let i = 0, len = decorations.length; i < len; i++) { - let occurance = new LinkOccurrence(links[i], decorations[i]); - this.currentOccurrences[occurance.decorationId] = occurance; + const occurence = new LinkOccurrence(links[i], decorations[i]); + this.currentOccurrences[occurence.decorationId] = occurence; } } @@ -374,7 +291,7 @@ export class LinkDetector implements IEditorContribution { } private stop(): void { - this.timeout.cancel(); + this.computeLinks.cancel(); if (this.activeLinksList) { this.activeLinksList?.dispose(); this.activeLinksList = null; @@ -385,10 +302,91 @@ export class LinkDetector implements IEditorContribution { } } - public dispose(): void { - this.listenersToRemove.dispose(); + public override dispose(): void { + super.dispose(); this.stop(); - this.timeout.dispose(); + } +} + +const decoration = { + general: ModelDecorationOptions.register({ + description: 'detected-link', + stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + collapseOnReplaceEdit: true, + inlineClassName: 'detected-link' + }), + active: ModelDecorationOptions.register({ + description: 'detected-link-active', + stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + collapseOnReplaceEdit: true, + inlineClassName: 'detected-link-active' + }) +}; + +class LinkOccurrence { + + public static decoration(link: Link, useMetaKey: boolean): IModelDeltaDecoration { + return { + range: link.range, + options: LinkOccurrence._getOptions(link, useMetaKey, false) + }; + } + + private static _getOptions(link: Link, useMetaKey: boolean, isActive: boolean): ModelDecorationOptions { + const options = { ... (isActive ? decoration.active : decoration.general) }; + options.hoverMessage = getHoverMessage(link, useMetaKey); + return options; + } + + public decorationId: string; + public link: Link; + + constructor(link: Link, decorationId: string) { + this.link = link; + this.decorationId = decorationId; + } + + public activate(changeAccessor: IModelDecorationsChangeAccessor, useMetaKey: boolean): void { + changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurrence._getOptions(this.link, useMetaKey, true)); + } + + public deactivate(changeAccessor: IModelDecorationsChangeAccessor, useMetaKey: boolean): void { + changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurrence._getOptions(this.link, useMetaKey, false)); + } +} + +function getHoverMessage(link: Link, useMetaKey: boolean): MarkdownString { + const executeCmd = link.url && /^command:/i.test(link.url.toString()); + + const label = link.tooltip + ? link.tooltip + : executeCmd + ? nls.localize('links.navigate.executeCmd', 'Execute command') + : nls.localize('links.navigate.follow', 'Follow link'); + + const kb = useMetaKey + ? platform.isMacintosh + ? nls.localize('links.navigate.kb.meta.mac', "cmd + click") + : nls.localize('links.navigate.kb.meta', "ctrl + click") + : platform.isMacintosh + ? nls.localize('links.navigate.kb.alt.mac', "option + click") + : nls.localize('links.navigate.kb.alt', "alt + click"); + + if (link.url) { + let nativeLabel = ''; + if (/^command:/i.test(link.url.toString())) { + // Don't show complete command arguments in the native tooltip + const match = link.url.toString().match(/^command:([^?#]+)/); + if (match) { + const commandId = match[1]; + const nativeLabelText = nls.localize('tooltip.explanation', "Execute command {0}", commandId); + nativeLabel = ` "${nativeLabelText}"`; + } + } + const hoverMessage = new MarkdownString('', true).appendMarkdown(`[${label}](${link.url.toString(true).replace(/ /g, '%20')}${nativeLabel}) (${kb})`); + return hoverMessage; + } else { + return new MarkdownString().appendText(`${label} (${kb})`); } } @@ -412,11 +410,9 @@ class OpenLinkAction extends EditorAction { return; } - let selections = editor.getSelections(); - - for (let sel of selections) { - let link = linkDetector.getLinkOccurrence(sel.getEndPosition()); - + const selections = editor.getSelections(); + for (const sel of selections) { + const link = linkDetector.getLinkOccurrence(sel.getEndPosition()); if (link) { linkDetector.openLinkOccurrence(link, false); } diff --git a/src/vs/editor/browser/core/markdownRenderer.ts b/src/vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts similarity index 96% rename from src/vs/editor/browser/core/markdownRenderer.ts rename to src/vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts index 2b9eb3ec8b0..d5cb8c34935 100644 --- a/src/vs/editor/browser/core/markdownRenderer.ts +++ b/src/vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts @@ -6,14 +6,13 @@ import { IMarkdownString } from 'vs/base/common/htmlContent'; import { renderMarkdown, MarkdownRenderOptions, MarkedOptions } from 'vs/base/browser/markdownRenderer'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { onUnexpectedError } from 'vs/base/common/errors'; import { tokenizeToString } from 'vs/editor/common/languages/textToHtmlTokenizer'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Emitter } from 'vs/base/common/event'; import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { URI } from 'vs/base/common/uri'; import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; @@ -23,7 +22,6 @@ export interface IMarkdownRenderResult extends IDisposable { export interface IMarkdownRendererOptions { editor?: ICodeEditor; - baseUrl?: URI; codeBlockFontFamily?: string; } @@ -68,7 +66,6 @@ export class MarkdownRenderer { protected _getRenderOptions(markdown: IMarkdownString, disposeables: DisposableStore): MarkdownRenderOptions { return { - baseUrl: this._options.baseUrl, codeBlockRenderer: async (languageAlias, value) => { // In markdown, // it is possible that we stumble upon language aliases (e.g.js instead of javascript) diff --git a/src/vs/editor/contrib/message/messageController.css b/src/vs/editor/contrib/message/browser/messageController.css similarity index 100% rename from src/vs/editor/contrib/message/messageController.css rename to src/vs/editor/contrib/message/browser/messageController.css diff --git a/src/vs/editor/contrib/message/messageController.ts b/src/vs/editor/contrib/message/browser/messageController.ts similarity index 100% rename from src/vs/editor/contrib/message/messageController.ts rename to src/vs/editor/contrib/message/browser/messageController.ts diff --git a/src/vs/editor/contrib/multicursor/multicursor.ts b/src/vs/editor/contrib/multicursor/browser/multicursor.ts similarity index 97% rename from src/vs/editor/contrib/multicursor/multicursor.ts rename to src/vs/editor/contrib/multicursor/browser/multicursor.ts index 7d3a810ab4b..c14b4a43c63 100644 --- a/src/vs/editor/contrib/multicursor/multicursor.ts +++ b/src/vs/editor/contrib/multicursor/browser/multicursor.ts @@ -11,24 +11,24 @@ import { Constants } from 'vs/base/common/uint'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { CursorState } from 'vs/editor/common/controller/cursorCommon'; -import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { CursorMoveCommands } from 'vs/editor/common/controller/cursorMoveCommands'; +import { CursorState } from 'vs/editor/common/cursorCommon'; +import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; +import { CursorMoveCommands } from 'vs/editor/common/cursor/cursorMoveCommands'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IEditorContribution, ScrollType } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { FindMatch, ITextModel, OverviewRulerLane, TrackedRangeStickiness, MinimapPosition } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { DocumentHighlightProviderRegistry } from 'vs/editor/common/languages'; -import { CommonFindController } from 'vs/editor/contrib/find/findController'; -import { FindOptionOverride, INewFindReplaceState } from 'vs/editor/contrib/find/findState'; +import { CommonFindController } from 'vs/editor/contrib/find/browser/findController'; +import { FindOptionOverride, INewFindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import * as nls from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { overviewRulerSelectionHighlightForeground, minimapSelectionOccurrenceHighlight } from 'vs/platform/theme/common/colorRegistry'; import { themeColorFromId } from 'vs/platform/theme/common/themeService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; function announceCursorChange(previousCursorState: CursorState[], cursorState: CursorState[]): void { const cursorDiff = cursorState.filter(cs => !previousCursorState.find(pcs => pcs.equals(cs))); @@ -80,7 +80,7 @@ export class InsertCursorAbove extends EditorAction { return; } - viewModel.pushStackElement(); + viewModel.model.pushStackElement(); const previousCursorState = viewModel.getCursorStates(); viewModel.setCursorStates( args.source, @@ -133,7 +133,7 @@ export class InsertCursorBelow extends EditorAction { return; } - viewModel.pushStackElement(); + viewModel.model.pushStackElement(); const previousCursorState = viewModel.getCursorStates(); viewModel.setCursorStates( args.source, @@ -856,7 +856,10 @@ export class SelectionHighlighter extends Disposable implements IEditorContribut private readonly updateSoon: RunOnceScheduler; private state: SelectionHighlighterState | null; - constructor(editor: ICodeEditor) { + constructor( + editor: ICodeEditor, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService + ) { super(); this.editor = editor; this._isEnabled = editor.getOption(EditorOption.selectionHighlight); @@ -1036,7 +1039,7 @@ export class SelectionHighlighter extends Disposable implements IEditorContribut } } - const hasFindOccurrences = DocumentHighlightProviderRegistry.has(model) && this.editor.getOption(EditorOption.occurrencesHighlight); + const hasFindOccurrences = this._languageFeaturesService.documentHighlightProvider.has(model) && this.editor.getOption(EditorOption.occurrencesHighlight); const decorations = matches.map(r => { return { range: r, diff --git a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts b/src/vs/editor/contrib/multicursor/test/browser/multicursor.test.ts similarity index 98% rename from src/vs/editor/contrib/multicursor/test/multicursor.test.ts rename to src/vs/editor/contrib/multicursor/test/browser/multicursor.test.ts index d4c234da91d..c05ab3cd861 100644 --- a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts +++ b/src/vs/editor/contrib/multicursor/test/browser/multicursor.test.ts @@ -8,8 +8,8 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { Handler } from 'vs/editor/common/editorCommon'; import { EndOfLineSequence } from 'vs/editor/common/model'; -import { CommonFindController } from 'vs/editor/contrib/find/findController'; -import { AddSelectionToNextFindMatchAction, InsertCursorAbove, InsertCursorBelow, MultiCursorSelectionController, SelectHighlightsAction } from 'vs/editor/contrib/multicursor/multicursor'; +import { CommonFindController } from 'vs/editor/contrib/find/browser/findController'; +import { AddSelectionToNextFindMatchAction, InsertCursorAbove, InsertCursorBelow, MultiCursorSelectionController, SelectHighlightsAction } from 'vs/editor/contrib/multicursor/browser/multicursor'; import { ITestCodeEditor, withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -82,7 +82,7 @@ function fromRange(rng: Range): number[] { } suite('Multicursor selection', () => { - let queryState: { [key: string]: any; } = {}; + let queryState: { [key: string]: any } = {}; let serviceCollection = new ServiceCollection(); serviceCollection.set(IStorageService, { _serviceBrand: undefined, diff --git a/src/vs/editor/contrib/parameterHints/parameterHints.css b/src/vs/editor/contrib/parameterHints/browser/parameterHints.css similarity index 93% rename from src/vs/editor/contrib/parameterHints/parameterHints.css rename to src/vs/editor/contrib/parameterHints/browser/parameterHints.css index 4aaffeac455..b752f49f415 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHints.css +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHints.css @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ .monaco-editor .parameter-hints-widget { - z-index: 10; + /* Must be higher than the sash's z-index and terminal canvases but lower than the suggest widget */ + z-index: 39; display: flex; flex-direction: column; line-height: 1.5em; @@ -59,6 +60,7 @@ font-family: var(--monaco-monospace-font); } +.monaco-editor .parameter-hints-widget .docs .monaco-tokenized-source, .monaco-editor .parameter-hints-widget .docs .code { white-space: pre-wrap; } @@ -96,7 +98,6 @@ text-align: center; height: 12px; line-height: 12px; - opacity: 0.5; font-family: var(--monaco-monospace-font); } diff --git a/src/vs/editor/contrib/parameterHints/parameterHints.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHints.ts similarity index 94% rename from src/vs/editor/contrib/parameterHints/parameterHints.ts rename to src/vs/editor/contrib/parameterHints/browser/parameterHints.ts index cdeed90302b..d147634c0eb 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHints.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHints.ts @@ -9,9 +9,9 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import * as modes from 'vs/editor/common/languages'; -import { TriggerContext } from 'vs/editor/contrib/parameterHints/parameterHintsModel'; -import { Context } from 'vs/editor/contrib/parameterHints/provideSignatureHelp'; +import * as languages from 'vs/editor/common/languages'; +import { TriggerContext } from 'vs/editor/contrib/parameterHints/browser/parameterHintsModel'; +import { Context } from 'vs/editor/contrib/parameterHints/browser/provideSignatureHelp'; import * as nls from 'vs/nls'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -72,7 +72,7 @@ export class TriggerParameterHintsAction extends EditorAction { const controller = ParameterHintsController.get(editor); if (controller) { controller.trigger({ - triggerKind: modes.SignatureHelpTriggerKind.Invoke + triggerKind: languages.SignatureHelpTriggerKind.Invoke }); } } diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsModel.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHintsModel.ts similarity index 84% rename from src/vs/editor/contrib/parameterHints/parameterHintsModel.ts rename to src/vs/editor/contrib/parameterHints/browser/parameterHintsModel.ts index ee280d8a3a6..67f90c816cd 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsModel.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHintsModel.ts @@ -9,13 +9,14 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; import { CharacterSet } from 'vs/editor/common/core/characterClassifier'; -import * as modes from 'vs/editor/common/languages'; -import { provideSignatureHelp } from 'vs/editor/contrib/parameterHints/provideSignatureHelp'; +import * as languages from 'vs/editor/common/languages'; +import { provideSignatureHelp } from 'vs/editor/contrib/parameterHints/browser/provideSignatureHelp'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; export interface TriggerContext { - readonly triggerKind: modes.SignatureHelpTriggerKind; + readonly triggerKind: languages.SignatureHelpTriggerKind; readonly triggerCharacter?: string; } @@ -31,15 +32,15 @@ namespace ParameterHintState { export class Pending { readonly type = Type.Pending; constructor( - readonly request: CancelablePromise, - readonly previouslyActiveHints: modes.SignatureHelp | undefined, + readonly request: CancelablePromise, + readonly previouslyActiveHints: languages.SignatureHelp | undefined, ) { } } export class Active { readonly type = Type.Active; constructor( - readonly hints: modes.SignatureHelp + readonly hints: languages.SignatureHelp ) { } } @@ -50,14 +51,15 @@ export class ParameterHintsModel extends Disposable { private static readonly DEFAULT_DELAY = 120; // ms - private readonly _onChangedHints = this._register(new Emitter()); + private readonly _onChangedHints = this._register(new Emitter()); public readonly onChangedHints = this._onChangedHints.event; private readonly editor: ICodeEditor; + private readonly providers: LanguageFeatureRegistry; private triggerOnType = false; private _state: ParameterHintState.State = ParameterHintState.Default; private _pendingTriggers: TriggerContext[] = []; - private readonly _lastSignatureHelpResult = this._register(new MutableDisposable()); + private readonly _lastSignatureHelpResult = this._register(new MutableDisposable()); private triggerChars = new CharacterSet(); private retriggerChars = new CharacterSet(); @@ -66,11 +68,13 @@ export class ParameterHintsModel extends Disposable { constructor( editor: ICodeEditor, + providers: LanguageFeatureRegistry, delay: number = ParameterHintsModel.DEFAULT_DELAY ) { super(); this.editor = editor; + this.providers = providers; this.throttledDelayer = new Delayer(delay); @@ -80,7 +84,7 @@ export class ParameterHintsModel extends Disposable { this._register(this.editor.onDidChangeModelLanguage(_ => this.onModelChanged())); this._register(this.editor.onDidChangeCursorSelection(e => this.onCursorChange(e))); this._register(this.editor.onDidChangeModelContent(e => this.onModelContentChange())); - this._register(modes.SignatureHelpProviderRegistry.onDidChange(this.onModelChanged, this)); + this._register(this.providers.onDidChange(this.onModelChanged, this)); this._register(this.editor.onDidType(text => this.onDidType(text))); this.onEditorConfigurationChange(); @@ -107,7 +111,7 @@ export class ParameterHintsModel extends Disposable { trigger(context: TriggerContext, delay?: number): void { const model = this.editor.getModel(); - if (!model || !modes.SignatureHelpProviderRegistry.has(model)) { + if (!model || !this.providers.has(model)) { return; } @@ -194,7 +198,7 @@ export class ParameterHintsModel extends Disposable { const position = this.editor.getPosition(); this.state = new ParameterHintState.Pending( - createCancelablePromise(token => provideSignatureHelp(model, position, triggerContext, token)), + createCancelablePromise(token => provideSignatureHelp(this.providers, model, position, triggerContext, token)), activeSignatureHelp); try { @@ -227,7 +231,7 @@ export class ParameterHintsModel extends Disposable { } } - private getLastActiveHints(): modes.SignatureHelp | undefined { + private getLastActiveHints(): languages.SignatureHelp | undefined { switch (this.state.type) { case ParameterHintState.Type.Active: return this.state.hints; case ParameterHintState.Type.Pending: return this.state.previouslyActiveHints; @@ -253,7 +257,7 @@ export class ParameterHintsModel extends Disposable { return; } - for (const support of modes.SignatureHelpProviderRegistry.ordered(model)) { + for (const support of this.providers.ordered(model)) { for (const ch of support.signatureHelpTriggerCharacters || []) { this.triggerChars.add(ch.charCodeAt(0)); @@ -277,7 +281,7 @@ export class ParameterHintsModel extends Disposable { if (this.triggerChars.has(triggerCharCode) || this.isTriggered && this.retriggerChars.has(triggerCharCode)) { this.trigger({ - triggerKind: modes.SignatureHelpTriggerKind.TriggerCharacter, + triggerKind: languages.SignatureHelpTriggerKind.TriggerCharacter, triggerCharacter: text.charAt(lastCharIndex), }); } @@ -287,13 +291,13 @@ export class ParameterHintsModel extends Disposable { if (e.source === 'mouse') { this.cancel(); } else if (this.isTriggered) { - this.trigger({ triggerKind: modes.SignatureHelpTriggerKind.ContentChange }); + this.trigger({ triggerKind: languages.SignatureHelpTriggerKind.ContentChange }); } } private onModelContentChange(): void { if (this.isTriggered) { - this.trigger({ triggerKind: modes.SignatureHelpTriggerKind.ContentChange }); + this.trigger({ triggerKind: languages.SignatureHelpTriggerKind.ContentChange }); } } @@ -313,15 +317,15 @@ export class ParameterHintsModel extends Disposable { function mergeTriggerContexts(previous: TriggerContext, current: TriggerContext) { switch (current.triggerKind) { - case modes.SignatureHelpTriggerKind.Invoke: + case languages.SignatureHelpTriggerKind.Invoke: // Invoke overrides previous triggers. return current; - case modes.SignatureHelpTriggerKind.ContentChange: + case languages.SignatureHelpTriggerKind.ContentChange: // Ignore content changes triggers return previous; - case modes.SignatureHelpTriggerKind.TriggerCharacter: + case languages.SignatureHelpTriggerKind.TriggerCharacter: default: return current; } diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts similarity index 92% rename from src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts rename to src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts index ddcafe6ab91..71fb4bbcab2 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts @@ -13,13 +13,13 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { escapeRegExpCharacters } from 'vs/base/common/strings'; import { assertIsDefined } from 'vs/base/common/types'; import 'vs/css!./parameterHints'; -import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; -import * as modes from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { ParameterHintsModel, TriggerContext } from 'vs/editor/contrib/parameterHints/parameterHintsModel'; -import { Context } from 'vs/editor/contrib/parameterHints/provideSignatureHelp'; +import * as languages from 'vs/editor/common/languages'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { ParameterHintsModel, TriggerContext } from 'vs/editor/contrib/parameterHints/browser/parameterHintsModel'; +import { Context } from 'vs/editor/contrib/parameterHints/browser/provideSignatureHelp'; import * as nls from 'vs/nls'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -27,6 +27,7 @@ import { editorHoverBackground, editorHoverBorder, editorHoverForeground, regist import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const $ = dom.$; @@ -62,10 +63,11 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { @IContextKeyService contextKeyService: IContextKeyService, @IOpenerService openerService: IOpenerService, @ILanguageService languageService: ILanguageService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService ) { super(); this.markdownRenderer = this._register(new MarkdownRenderer({ editor }, languageService, openerService)); - this.model = this._register(new ParameterHintsModel(editor)); + this.model = this._register(new ParameterHintsModel(editor, languageFeaturesService.signatureHelpProvider)); this.keyVisible = Context.Visible.bindTo(contextKeyService); this.keyMultipleSignatures = Context.MultipleSignatures.bindTo(contextKeyService); @@ -190,7 +192,7 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { return null; } - private render(hints: modes.SignatureHelp): void { + private render(hints: languages.SignatureHelp): void { this.renderDisposeables.clear(); if (!this.domNodes) { @@ -224,7 +226,7 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { this.renderParameters(code, signature, activeParameterIndex); } - const activeParameter: modes.ParameterInformation | undefined = signature.parameters[activeParameterIndex]; + const activeParameter: languages.ParameterInformation | undefined = signature.parameters[activeParameterIndex]; if (activeParameter?.documentation) { const documentation = $('span.documentation'); if (typeof activeParameter.documentation === 'string') { @@ -291,7 +293,7 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { return renderedContents; } - private hasDocs(signature: modes.SignatureInformation, activeParameter: modes.ParameterInformation | undefined): boolean { + private hasDocs(signature: languages.SignatureInformation, activeParameter: languages.ParameterInformation | undefined): boolean { if (activeParameter && typeof activeParameter.documentation === 'string' && assertIsDefined(activeParameter.documentation).length > 0) { return true; } @@ -307,7 +309,7 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { return false; } - private renderParameters(parent: HTMLElement, signature: modes.SignatureInformation, activeParameterIndex: number): void { + private renderParameters(parent: HTMLElement, signature: languages.SignatureInformation, activeParameterIndex: number): void { const [start, end] = this.getParameterLabelOffsets(signature, activeParameterIndex); const beforeSpan = document.createElement('span'); @@ -323,7 +325,7 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { dom.append(parent, beforeSpan, paramSpan, afterSpan); } - private getParameterLabelOffsets(signature: modes.SignatureInformation, paramIdx: number): [number, number] { + private getParameterLabelOffsets(signature: languages.SignatureInformation, paramIdx: number): [number, number] { const param = signature.parameters[paramIdx]; if (!param) { return [0, 0]; diff --git a/src/vs/editor/contrib/parameterHints/provideSignatureHelp.ts b/src/vs/editor/contrib/parameterHints/browser/provideSignatureHelp.ts similarity index 74% rename from src/vs/editor/contrib/parameterHints/provideSignatureHelp.ts rename to src/vs/editor/contrib/parameterHints/browser/provideSignatureHelp.ts index c1fe7210800..81b24a508c4 100644 --- a/src/vs/editor/contrib/parameterHints/provideSignatureHelp.ts +++ b/src/vs/editor/contrib/parameterHints/browser/provideSignatureHelp.ts @@ -9,10 +9,12 @@ import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export const Context = { Visible: new RawContextKey('parameterHintsVisible', false), @@ -20,13 +22,14 @@ export const Context = { }; export async function provideSignatureHelp( + registry: LanguageFeatureRegistry, model: ITextModel, position: Position, - context: modes.SignatureHelpContext, + context: languages.SignatureHelpContext, token: CancellationToken -): Promise { +): Promise { - const supports = modes.SignatureHelpProviderRegistry.ordered(model); + const supports = registry.ordered(model); for (const support of supports) { try { @@ -47,11 +50,13 @@ CommandsRegistry.registerCommand('_executeSignatureHelpProvider', async (accesso assertType(Position.isIPosition(position)); assertType(typeof triggerCharacter === 'string' || !triggerCharacter); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + const ref = await accessor.get(ITextModelService).createModelReference(uri); try { - const result = await provideSignatureHelp(ref.object.textEditorModel, Position.lift(position), { - triggerKind: modes.SignatureHelpTriggerKind.Invoke, + const result = await provideSignatureHelp(languageFeaturesService.signatureHelpProvider, ref.object.textEditorModel, Position.lift(position), { + triggerKind: languages.SignatureHelpTriggerKind.Invoke, isRetrigger: false, triggerCharacter, }, CancellationToken.None); diff --git a/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts b/src/vs/editor/contrib/parameterHints/test/browser/parameterHintsModel.test.ts similarity index 75% rename from src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts rename to src/vs/editor/contrib/parameterHints/test/browser/parameterHintsModel.test.ts index bb1dab6c8dd..3b85e657efc 100644 --- a/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts +++ b/src/vs/editor/contrib/parameterHints/test/browser/parameterHintsModel.test.ts @@ -11,20 +11,21 @@ import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; import { Position } from 'vs/editor/common/core/position'; import { Handler } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; -import { ParameterHintsModel } from 'vs/editor/contrib/parameterHints/parameterHintsModel'; +import * as languages from 'vs/editor/common/languages'; +import { ParameterHintsModel } from 'vs/editor/contrib/parameterHints/browser/parameterHintsModel'; import { createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { InMemoryStorageService, IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; const mockFile = URI.parse('test:somefile.ttt'); const mockFileSelector = { scheme: 'test' }; -const emptySigHelp: modes.SignatureHelp = { +const emptySigHelp: languages.SignatureHelp = { signatures: [{ label: 'none', parameters: [] @@ -33,7 +34,7 @@ const emptySigHelp: modes.SignatureHelp = { activeSignature: 0 }; -const emptySigHelpResult: modes.SignatureHelpResult = { +const emptySigHelpResult: languages.SignatureHelpResult = { value: emptySigHelp, dispose: () => { } }; @@ -41,8 +42,11 @@ const emptySigHelpResult: modes.SignatureHelpResult = { suite('ParameterHintsModel', () => { const disposables = new DisposableStore(); + let registry = new LanguageFeatureRegistry(); + setup(() => { disposables.clear(); + registry = new LanguageFeatureRegistry(); }); teardown(() => { @@ -69,14 +73,14 @@ suite('ParameterHintsModel', () => { const triggerChar = '('; const editor = createMockEditor(''); - disposables.add(new ParameterHintsModel(editor)); + disposables.add(new ParameterHintsModel(editor, registry)); - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = [triggerChar]; signatureHelpRetriggerCharacters = []; - provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext) { + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerCharacter, triggerChar); done(); return undefined; @@ -96,18 +100,18 @@ suite('ParameterHintsModel', () => { const triggerChar = '('; const editor = createMockEditor(''); - disposables.add(new ParameterHintsModel(editor)); + disposables.add(new ParameterHintsModel(editor, registry)); let invokeCount = 0; - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = [triggerChar]; signatureHelpRetriggerCharacters = []; - provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext): modes.SignatureHelpResult | Promise { + provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext): languages.SignatureHelpResult | Promise { ++invokeCount; try { if (invokeCount === 1) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerCharacter, triggerChar); assert.strictEqual(context.isRetrigger, false); assert.strictEqual(context.activeSignatureHelp, undefined); @@ -116,7 +120,7 @@ suite('ParameterHintsModel', () => { setTimeout(() => editor.trigger('keyboard', Handler.Type, { text: triggerChar }), 0); } else { assert.strictEqual(invokeCount, 2); - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.isRetrigger, true); assert.strictEqual(context.triggerCharacter, triggerChar); assert.strictEqual(context.activeSignatureHelp, emptySigHelp); @@ -144,19 +148,19 @@ suite('ParameterHintsModel', () => { const triggerChar = '('; const editor = createMockEditor(''); - const hintModel = new ParameterHintsModel(editor); + const hintModel = new ParameterHintsModel(editor, registry); disposables.add(hintModel); let invokeCount = 0; - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = [triggerChar]; signatureHelpRetriggerCharacters = []; - provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext): modes.SignatureHelpResult | Promise { + provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext): languages.SignatureHelpResult | Promise { try { ++invokeCount; if (invokeCount === 1) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerCharacter, triggerChar); assert.strictEqual(context.isRetrigger, false); assert.strictEqual(context.activeSignatureHelp, undefined); @@ -166,7 +170,7 @@ suite('ParameterHintsModel', () => { editor.trigger('keyboard', Handler.Type, { text: triggerChar }); } else { assert.strictEqual(invokeCount, 2); - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerCharacter, triggerChar); assert.strictEqual(context.isRetrigger, true); assert.strictEqual(context.activeSignatureHelp, undefined); @@ -191,18 +195,18 @@ suite('ParameterHintsModel', () => { const donePromise = new Promise(resolve => { done = resolve; }); const editor = createMockEditor(''); - disposables.add(new ParameterHintsModel(editor, 5)); + disposables.add(new ParameterHintsModel(editor, registry, 5)); let invokeCount = 0; - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = ['a', 'b', 'c']; signatureHelpRetriggerCharacters = []; - provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext) { + provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext) { try { ++invokeCount; - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.isRetrigger, false); assert.strictEqual(context.triggerCharacter, 'c'); @@ -234,25 +238,25 @@ suite('ParameterHintsModel', () => { const donePromise = new Promise(resolve => { done = resolve; }); const editor = createMockEditor(''); - disposables.add(new ParameterHintsModel(editor, 5)); + disposables.add(new ParameterHintsModel(editor, registry, 5)); let invokeCount = 0; - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = ['a', 'b']; signatureHelpRetriggerCharacters = []; - provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext): modes.SignatureHelpResult | Promise { + provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext): languages.SignatureHelpResult | Promise { try { ++invokeCount; if (invokeCount === 1) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerCharacter, 'a'); // retrigger after delay for widget to show up setTimeout(() => editor.trigger('keyboard', Handler.Type, { text: 'b' }), 50); } else if (invokeCount === 2) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.ok(context.isRetrigger); assert.strictEqual(context.triggerCharacter, 'b'); done(); @@ -277,26 +281,26 @@ suite('ParameterHintsModel', () => { test('Should cancel existing request when new request comes in', async () => { const editor = createMockEditor('abc def'); - const hintsModel = new ParameterHintsModel(editor); + const hintsModel = new ParameterHintsModel(editor, registry); let didRequestCancellationOf = -1; let invokeCount = 0; - const longRunningProvider = new class implements modes.SignatureHelpProvider { + const longRunningProvider = new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = []; signatureHelpRetriggerCharacters = []; - provideSignatureHelp(_model: ITextModel, _position: Position, token: CancellationToken): modes.SignatureHelpResult | Promise { + provideSignatureHelp(_model: ITextModel, _position: Position, token: CancellationToken): languages.SignatureHelpResult | Promise { try { const count = invokeCount++; token.onCancellationRequested(() => { didRequestCancellationOf = count; }); // retrigger on first request if (count === 0) { - hintsModel.trigger({ triggerKind: modes.SignatureHelpTriggerKind.Invoke }, 0); + hintsModel.trigger({ triggerKind: languages.SignatureHelpTriggerKind.Invoke }, 0); } - return new Promise(resolve => { + return new Promise(resolve => { setTimeout(() => { resolve({ value: { @@ -318,11 +322,11 @@ suite('ParameterHintsModel', () => { } }; - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, longRunningProvider)); + disposables.add(registry.register(mockFileSelector, longRunningProvider)); await runWithFakedTimers({ useFakeTimers: true }, async () => { - hintsModel.trigger({ triggerKind: modes.SignatureHelpTriggerKind.Invoke }, 0); + hintsModel.trigger({ triggerKind: languages.SignatureHelpTriggerKind.Invoke }, 0); assert.strictEqual(-1, didRequestCancellationOf); return new Promise((resolve, reject) => @@ -346,24 +350,24 @@ suite('ParameterHintsModel', () => { const retriggerChar = 'b'; const editor = createMockEditor(''); - disposables.add(new ParameterHintsModel(editor, 5)); + disposables.add(new ParameterHintsModel(editor, registry, 5)); let invokeCount = 0; - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = [triggerChar]; signatureHelpRetriggerCharacters = [retriggerChar]; - provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext): modes.SignatureHelpResult | Promise { + provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext): languages.SignatureHelpResult | Promise { try { ++invokeCount; if (invokeCount === 1) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerCharacter, triggerChar); // retrigger after delay for widget to show up setTimeout(() => editor.trigger('keyboard', Handler.Type, { text: retriggerChar }), 50); } else if (invokeCount === 2) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.ok(context.isRetrigger); assert.strictEqual(context.triggerCharacter, retriggerChar); done(); @@ -397,14 +401,14 @@ suite('ParameterHintsModel', () => { const paramterLabel = 'parameter'; const editor = createMockEditor(''); - const model = new ParameterHintsModel(editor, 5); + const model = new ParameterHintsModel(editor, registry, 5); disposables.add(model); - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = [triggerChar]; signatureHelpRetriggerCharacters = []; - async provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext): Promise { + async provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext): Promise { try { if (!context.isRetrigger) { // retrigger after delay for widget to show up @@ -433,11 +437,11 @@ suite('ParameterHintsModel', () => { } })); - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = [triggerChar]; signatureHelpRetriggerCharacters = []; - async provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext): Promise { + async provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext): Promise { if (context.isRetrigger) { return { value: { @@ -473,22 +477,22 @@ suite('ParameterHintsModel', () => { test('Quick typing should use the first trigger character', async () => { const editor = createMockEditor(''); - const model = new ParameterHintsModel(editor, 50); + const model = new ParameterHintsModel(editor, registry, 50); disposables.add(model); const triggerCharacter = 'a'; let invokeCount = 0; - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = [triggerCharacter]; signatureHelpRetriggerCharacters = []; - provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext): modes.SignatureHelpResult | Promise { + provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext): languages.SignatureHelpResult | Promise { try { ++invokeCount; if (invokeCount === 1) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerCharacter, triggerCharacter); } else { assert.fail('Unexpected invoke'); @@ -515,23 +519,23 @@ suite('ParameterHintsModel', () => { const donePromise = new Promise(resolve => { done = resolve; }); const editor = createMockEditor(''); - const model = new ParameterHintsModel(editor, 50); + const model = new ParameterHintsModel(editor, registry, 50); disposables.add(model); const triggerCharacter = 'a'; const retriggerCharacter = 'b'; let invokeCount = 0; - disposables.add(modes.SignatureHelpProviderRegistry.register(mockFileSelector, new class implements modes.SignatureHelpProvider { + disposables.add(registry.register(mockFileSelector, new class implements languages.SignatureHelpProvider { signatureHelpTriggerCharacters = [triggerCharacter]; signatureHelpRetriggerCharacters = [retriggerCharacter]; - async provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: modes.SignatureHelpContext): Promise { + async provideSignatureHelp(_model: ITextModel, _position: Position, _token: CancellationToken, context: languages.SignatureHelpContext): Promise { try { ++invokeCount; if (invokeCount === 1) { - assert.strictEqual(context.triggerKind, modes.SignatureHelpTriggerKind.TriggerCharacter); + assert.strictEqual(context.triggerKind, languages.SignatureHelpTriggerKind.TriggerCharacter); assert.strictEqual(context.triggerCharacter, triggerCharacter); setTimeout(() => editor.trigger('keyboard', Handler.Type, { text: retriggerCharacter }), 50); } else if (invokeCount === 2) { @@ -568,11 +572,10 @@ suite('ParameterHintsModel', () => { }); function getNextHint(model: ParameterHintsModel) { - return new Promise(resolve => { + return new Promise(resolve => { const sub = model.onChangedHints(e => { sub.dispose(); return resolve(e ? { value: e, dispose: () => { } } : undefined); }); }); } - diff --git a/src/vs/editor/contrib/peekView/media/peekViewWidget.css b/src/vs/editor/contrib/peekView/browser/media/peekViewWidget.css similarity index 100% rename from src/vs/editor/contrib/peekView/media/peekViewWidget.css rename to src/vs/editor/contrib/peekView/browser/media/peekViewWidget.css diff --git a/src/vs/editor/contrib/peekView/peekView.ts b/src/vs/editor/contrib/peekView/browser/peekView.ts similarity index 99% rename from src/vs/editor/contrib/peekView/peekView.ts rename to src/vs/editor/contrib/peekView/browser/peekView.ts index b345a94b46f..07a5b527d8c 100644 --- a/src/vs/editor/contrib/peekView/peekView.ts +++ b/src/vs/editor/contrib/peekView/browser/peekView.ts @@ -19,7 +19,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/embeddedCodeEditorWidget'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { IOptions, IStyles, ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget'; +import { IOptions, IStyles, ZoneWidget } from 'vs/editor/contrib/zoneWidget/browser/zoneWidget'; import * as nls from 'vs/nls'; import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -36,7 +36,7 @@ export interface IPeekViewService { registerSingleton(IPeekViewService, class implements IPeekViewService { declare readonly _serviceBrand: undefined; - private readonly _widgets = new Map(); + private readonly _widgets = new Map(); addExclusiveWidget(editor: ICodeEditor, widget: PeekViewWidget): void { const existing = this._widgets.get(editor); diff --git a/src/vs/editor/contrib/quickAccess/commandsQuickAccess.ts b/src/vs/editor/contrib/quickAccess/browser/commandsQuickAccess.ts similarity index 100% rename from src/vs/editor/contrib/quickAccess/commandsQuickAccess.ts rename to src/vs/editor/contrib/quickAccess/browser/commandsQuickAccess.ts diff --git a/src/vs/editor/contrib/quickAccess/editorNavigationQuickAccess.ts b/src/vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess.ts similarity index 97% rename from src/vs/editor/contrib/quickAccess/editorNavigationQuickAccess.ts rename to src/vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess.ts index 350f410c700..f07e73969b3 100644 --- a/src/vs/editor/contrib/quickAccess/editorNavigationQuickAccess.ts +++ b/src/vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess.ts @@ -12,7 +12,7 @@ import { getCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IRange } from 'vs/editor/common/core/range'; import { IDiffEditor, IEditor, ScrollType } from 'vs/editor/common/editorCommon'; import { IModelDeltaDecoration, ITextModel, OverviewRulerLane } from 'vs/editor/common/model'; -import { overviewRulerRangeHighlight } from 'vs/editor/common/view/editorColorRegistry'; +import { overviewRulerRangeHighlight } from 'vs/editor/common/core/editorColorRegistry'; import { IQuickAccessProvider } from 'vs/platform/quickinput/common/quickAccess'; import { IKeyMods, IQuickPick, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { themeColorFromId } from 'vs/platform/theme/common/themeService'; @@ -140,7 +140,7 @@ export abstract class AbstractEditorNavigationQuickAccessProvider implements IQu */ protected abstract provideWithoutTextEditor(picker: IQuickPick, token: CancellationToken): IDisposable; - protected gotoLocation({ editor }: IQuickAccessTextEditorContext, options: { range: IRange, keyMods: IKeyMods, forceSideBySide?: boolean, preserveFocus?: boolean }): void { + protected gotoLocation({ editor }: IQuickAccessTextEditorContext, options: { range: IRange; keyMods: IKeyMods; forceSideBySide?: boolean; preserveFocus?: boolean }): void { editor.setSelection(options.range); editor.revealRangeInCenter(options.range, ScrollType.Smooth); if (!options.preserveFocus) { diff --git a/src/vs/editor/contrib/quickAccess/gotoLineQuickAccess.ts b/src/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.ts similarity index 98% rename from src/vs/editor/contrib/quickAccess/gotoLineQuickAccess.ts rename to src/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.ts index 1c349d7e91e..6db58ae6cc0 100644 --- a/src/vs/editor/contrib/quickAccess/gotoLineQuickAccess.ts +++ b/src/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.ts @@ -10,7 +10,7 @@ import { EditorOption, RenderLineNumbersType } from 'vs/editor/common/config/edi import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; import { IEditor, ScrollType } from 'vs/editor/common/editorCommon'; -import { AbstractEditorNavigationQuickAccessProvider, IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/editorNavigationQuickAccess'; +import { AbstractEditorNavigationQuickAccessProvider, IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess'; import { localize } from 'vs/nls'; import { IQuickPick, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; diff --git a/src/vs/editor/contrib/quickAccess/gotoSymbolQuickAccess.ts b/src/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.ts similarity index 95% rename from src/vs/editor/contrib/quickAccess/gotoSymbolQuickAccess.ts rename to src/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.ts index d70f2e1e23d..1801ab78538 100644 --- a/src/vs/editor/contrib/quickAccess/gotoSymbolQuickAccess.ts +++ b/src/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.ts @@ -13,21 +13,22 @@ import { format, trim } from 'vs/base/common/strings'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import { DocumentSymbol, DocumentSymbolProviderRegistry, SymbolKind, SymbolKinds, SymbolTag } from 'vs/editor/common/languages'; -import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/outlineModel'; -import { AbstractEditorNavigationQuickAccessProvider, IEditorNavigationQuickAccessOptions, IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/editorNavigationQuickAccess'; +import { DocumentSymbol, SymbolKind, SymbolKinds, SymbolTag } from 'vs/editor/common/languages'; +import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; +import { AbstractEditorNavigationQuickAccessProvider, IEditorNavigationQuickAccessOptions, IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess'; import { localize } from 'vs/nls'; import { IQuickPick, IQuickPickItem, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export interface IGotoSymbolQuickPickItem extends IQuickPickItem { - kind: SymbolKind, - index: number, + kind: SymbolKind; + index: number; score?: number; - range?: { decoration: IRange, selection: IRange } + range?: { decoration: IRange; selection: IRange }; } export interface IGotoSymbolQuickAccessProviderOptions extends IEditorNavigationQuickAccessOptions { - openSideBySideDirection?: () => undefined | 'right' | 'down' + openSideBySideDirection?: () => undefined | 'right' | 'down'; } export abstract class AbstractGotoSymbolQuickAccessProvider extends AbstractEditorNavigationQuickAccessProvider { @@ -39,6 +40,7 @@ export abstract class AbstractGotoSymbolQuickAccessProvider extends AbstractEdit protected override readonly options: IGotoSymbolQuickAccessProviderOptions; constructor( + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, @IOutlineModelService private readonly _outlineModelService: IOutlineModelService, options: IGotoSymbolQuickAccessProviderOptions = Object.create(null) ) { @@ -62,7 +64,7 @@ export abstract class AbstractGotoSymbolQuickAccessProvider extends AbstractEdit } // Provide symbols from model if available in registry - if (DocumentSymbolProviderRegistry.has(model)) { + if (this._languageFeaturesService.documentSymbolProvider.has(model)) { return this.doProvideWithEditorSymbols(context, model, picker, token); } @@ -101,15 +103,15 @@ export abstract class AbstractGotoSymbolQuickAccessProvider extends AbstractEdit } protected async waitForLanguageSymbolRegistry(model: ITextModel, disposables: DisposableStore): Promise { - if (DocumentSymbolProviderRegistry.has(model)) { + if (this._languageFeaturesService.documentSymbolProvider.has(model)) { return true; } const symbolProviderRegistryPromise = new DeferredPromise(); // Resolve promise when registry knows model - const symbolProviderListener = disposables.add(DocumentSymbolProviderRegistry.onDidChange(() => { - if (DocumentSymbolProviderRegistry.has(model)) { + const symbolProviderListener = disposables.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(() => { + if (this._languageFeaturesService.documentSymbolProvider.has(model)) { symbolProviderListener.dispose(); symbolProviderRegistryPromise.complete(true); diff --git a/src/vs/editor/contrib/rename/rename.ts b/src/vs/editor/contrib/rename/browser/rename.ts similarity index 91% rename from src/vs/editor/contrib/rename/rename.ts rename to src/vs/editor/contrib/rename/browser/rename.ts index fe601569789..80a86dac88e 100644 --- a/src/vs/editor/contrib/rename/rename.ts +++ b/src/vs/editor/contrib/rename/browser/rename.ts @@ -11,7 +11,7 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; -import { CodeEditorStateFlag, EditorStateCancellationTokenSource } from 'vs/editor/browser/core/editorState'; +import { CodeEditorStateFlag, EditorStateCancellationTokenSource } from 'vs/editor/contrib/editorState/browser/editorState'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, registerModelAndPositionCommand, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { IBulkEditService, ResourceEdit } from 'vs/editor/browser/services/bulkEditService'; @@ -21,9 +21,9 @@ import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel } from 'vs/editor/common/model'; -import { Rejection, RenameLocation, RenameProvider, RenameProviderRegistry, WorkspaceEdit } from 'vs/editor/common/languages'; +import { Rejection, RenameLocation, RenameProvider, WorkspaceEdit } from 'vs/editor/common/languages'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; -import { MessageController } from 'vs/editor/contrib/message/messageController'; +import { MessageController } from 'vs/editor/contrib/message/browser/messageController'; import * as nls from 'vs/nls'; import { ConfigurationScope, Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -34,6 +34,8 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { Registry } from 'vs/platform/registry/common/platform'; import { CONTEXT_RENAME_INPUT_VISIBLE, RenameInputField } from './renameInputField'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; class RenameSkeleton { @@ -42,9 +44,10 @@ class RenameSkeleton { constructor( private readonly model: ITextModel, - private readonly position: Position + private readonly position: Position, + registry: LanguageFeatureRegistry ) { - this._providers = RenameProviderRegistry.ordered(model); + this._providers = registry.ordered(model); } hasProvider() { @@ -109,8 +112,8 @@ class RenameSkeleton { } } -export async function rename(model: ITextModel, position: Position, newName: string): Promise { - const skeleton = new RenameSkeleton(model, position); +export async function rename(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, newName: string): Promise { + const skeleton = new RenameSkeleton(model, position, registry); const loc = await skeleton.resolveRenameLocation(CancellationToken.None); if (loc?.rejectReason) { return { edits: [], rejectReason: loc.rejectReason }; @@ -140,6 +143,7 @@ class RenameController implements IEditorContribution { @IEditorProgressService private readonly _progressService: IEditorProgressService, @ILogService private readonly _logService: ILogService, @ITextResourceConfigurationService private readonly _configService: ITextResourceConfigurationService, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, ) { this._renameInputField = this._dispoableStore.add(new IdleValue(() => this._dispoableStore.add(this._instaService.createInstance(RenameInputField, this.editor, ['acceptRenameInput', 'acceptRenameInputWithPreview'])))); } @@ -158,7 +162,7 @@ class RenameController implements IEditorContribution { } const position = this.editor.getPosition(); - const skeleton = new RenameSkeleton(this.editor.getModel(), position); + const skeleton = new RenameSkeleton(this.editor.getModel(), position, this._languageFeaturesService.renameProvider); if (!skeleton.hasProvider()) { return undefined; @@ -354,14 +358,16 @@ registerEditorCommand(new RenameCommand({ // ---- api bridge command -registerModelAndPositionCommand('_executeDocumentRenameProvider', function (model, position, ...args) { +registerModelAndPositionCommand('_executeDocumentRenameProvider', function (accessor, model, position, ...args) { const [newName] = args; assertType(typeof newName === 'string'); - return rename(model, position, newName); + const { renameProvider } = accessor.get(ILanguageFeaturesService); + return rename(renameProvider, model, position, newName); }); -registerModelAndPositionCommand('_executePrepareRename', async function (model, position) { - const skeleton = new RenameSkeleton(model, position); +registerModelAndPositionCommand('_executePrepareRename', async function (accessor, model, position) { + const { renameProvider } = accessor.get(ILanguageFeaturesService); + const skeleton = new RenameSkeleton(model, position, renameProvider); const loc = await skeleton.resolveRenameLocation(CancellationToken.None); if (loc?.rejectReason) { throw new Error(loc.rejectReason); diff --git a/src/vs/editor/contrib/rename/renameInputField.css b/src/vs/editor/contrib/rename/browser/renameInputField.css similarity index 100% rename from src/vs/editor/contrib/rename/renameInputField.css rename to src/vs/editor/contrib/rename/browser/renameInputField.css diff --git a/src/vs/editor/contrib/rename/renameInputField.ts b/src/vs/editor/contrib/rename/browser/renameInputField.ts similarity index 98% rename from src/vs/editor/contrib/rename/renameInputField.ts rename to src/vs/editor/contrib/rename/browser/renameInputField.ts index a63af317ca9..af9ade477ac 100644 --- a/src/vs/editor/contrib/rename/renameInputField.ts +++ b/src/vs/editor/contrib/rename/browser/renameInputField.ts @@ -193,7 +193,7 @@ export class RenameInputField implements IContentWidget { }); }; - token.onCancellationRequested(() => this.cancelInput(true)); + disposeOnDone.add(token.onCancellationRequested(() => this.cancelInput(true))); disposeOnDone.add(this._editor.onDidBlurEditorWidget(() => this.cancelInput(false))); this._show(); diff --git a/src/vs/editor/contrib/smartSelect/bracketSelections.ts b/src/vs/editor/contrib/smartSelect/browser/bracketSelections.ts similarity index 100% rename from src/vs/editor/contrib/smartSelect/bracketSelections.ts rename to src/vs/editor/contrib/smartSelect/browser/bracketSelections.ts diff --git a/src/vs/editor/contrib/smartSelect/smartSelect.ts b/src/vs/editor/contrib/smartSelect/browser/smartSelect.ts similarity index 83% rename from src/vs/editor/contrib/smartSelect/smartSelect.ts rename to src/vs/editor/contrib/smartSelect/browser/smartSelect.ts index 537f261b0cd..2bdc82c8cbe 100644 --- a/src/vs/editor/contrib/smartSelect/smartSelect.ts +++ b/src/vs/editor/contrib/smartSelect/browser/smartSelect.ts @@ -9,7 +9,7 @@ import { onUnexpectedExternalError } from 'vs/base/common/errors'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { EditorAction, IActionOptions, registerEditorAction, registerEditorContribution, registerModelCommand, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; +import { EditorAction, IActionOptions, registerEditorAction, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; @@ -17,13 +17,18 @@ import { Selection } from 'vs/editor/common/core/selection'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; -import { BracketSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/bracketSelections'; -import { WordSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/wordSelections'; +import * as languages from 'vs/editor/common/languages'; +import { BracketSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/browser/bracketSelections'; +import { WordSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/browser/wordSelections'; import * as nls from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { assertType } from 'vs/base/common/types'; +import { URI } from 'vs/base/common/uri'; class SelectionRanges { @@ -58,7 +63,10 @@ class SmartSelectController implements IEditorContribution { private _selectionListener?: IDisposable; private _ignoreSelection: boolean = false; - constructor(private readonly _editor: ICodeEditor) { } + constructor( + private readonly _editor: ICodeEditor, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, + ) { } dispose(): void { this._selectionListener?.dispose(); @@ -71,13 +79,13 @@ class SmartSelectController implements IEditorContribution { const selections = this._editor.getSelections(); const model = this._editor.getModel(); - if (!modes.SelectionRangeRegistry.has(model)) { + if (!this._languageFeaturesService.selectionRangeProvider.has(model)) { return; } if (!this._state) { - await provideSelectionRanges(model, selections.map(s => s.getPosition()), this._editor.getOption(EditorOption.smartSelect), CancellationToken.None).then(ranges => { + await provideSelectionRanges(this._languageFeaturesService.selectionRangeProvider, model, selections.map(s => s.getPosition()), this._editor.getOption(EditorOption.smartSelect), CancellationToken.None).then(ranges => { if (!arrays.isNonEmptyArray(ranges) || ranges.length !== selections.length) { // invalid result return; @@ -201,16 +209,14 @@ registerEditorContribution(SmartSelectController.ID, SmartSelectController); registerEditorAction(GrowSelectionAction); registerEditorAction(ShrinkSelectionAction); -// word selection -modes.SelectionRangeRegistry.register('*', new WordSelectionRangeProvider()); - export interface SelectionRangesOptions { - selectLeadingAndTrailingWhitespace: boolean + selectLeadingAndTrailingWhitespace: boolean; } -export async function provideSelectionRanges(model: ITextModel, positions: Position[], options: SelectionRangesOptions, token: CancellationToken): Promise { +export async function provideSelectionRanges(registry: LanguageFeatureRegistry, model: ITextModel, positions: Position[], options: SelectionRangesOptions, token: CancellationToken): Promise { - const providers = modes.SelectionRangeRegistry.all(model); + const providers = registry.all(model) + .concat(new WordSelectionRangeProvider()); // ALWAYS have word based selection range if (providers.length === 1) { // add word selection and bracket selection when no provider exists @@ -300,7 +306,18 @@ export async function provideSelectionRanges(model: ITextModel, positions: Posit }); } -registerModelCommand('_executeSelectionRangeProvider', function (model, ...args) { - const [positions] = args; - return provideSelectionRanges(model, positions, { selectLeadingAndTrailingWhitespace: true }, CancellationToken.None); + +CommandsRegistry.registerCommand('_executeSelectionRangeProvider', async function (accessor, ...args) { + + const [resource, positions] = args; + assertType(URI.isUri(resource)); + + const registry = accessor.get(ILanguageFeaturesService).selectionRangeProvider; + const reference = await accessor.get(ITextModelService).createModelReference(resource); + + try { + return provideSelectionRanges(registry, reference.object.textEditorModel, positions, { selectLeadingAndTrailingWhitespace: true }, CancellationToken.None); + } finally { + reference.dispose(); + } }); diff --git a/src/vs/editor/contrib/smartSelect/wordSelections.ts b/src/vs/editor/contrib/smartSelect/browser/wordSelections.ts similarity index 100% rename from src/vs/editor/contrib/smartSelect/wordSelections.ts rename to src/vs/editor/contrib/smartSelect/browser/wordSelections.ts diff --git a/src/vs/editor/contrib/smartSelect/test/smartSelect.test.ts b/src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts similarity index 95% rename from src/vs/editor/contrib/smartSelect/test/smartSelect.test.ts rename to src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts index 3fc8f68072c..1efa3009591 100644 --- a/src/vs/editor/contrib/smartSelect/test/smartSelect.test.ts +++ b/src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts @@ -8,15 +8,16 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; -import { SelectionRangeProvider, SelectionRangeRegistry } from 'vs/editor/common/languages'; +import { SelectionRangeProvider } from 'vs/editor/common/languages'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { IModelService } from 'vs/editor/common/services/model'; -import { BracketSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/bracketSelections'; -import { provideSelectionRanges } from 'vs/editor/contrib/smartSelect/smartSelect'; -import { WordSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/wordSelections'; +import { BracketSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/browser/bracketSelections'; +import { provideSelectionRanges } from 'vs/editor/contrib/smartSelect/browser/smartSelect'; +import { WordSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/browser/wordSelections'; import { createModelServices } from 'vs/editor/test/common/testTextModel'; import { MockMode, StaticLanguageSelector } from 'vs/editor/test/common/mocks/mockMode'; import { javascriptOnEnterRules } from 'vs/editor/test/common/modes/supports/javascriptOnEnterRules'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; class MockJSMode extends MockMode { @@ -53,11 +54,12 @@ suite('SmartSelect', () => { let disposables: DisposableStore; let modelService: IModelService; let mode: MockJSMode; + let providers = new LanguageFeatureRegistry(); setup(() => { disposables = new DisposableStore(); const instantiationService = createModelServices(disposables); - modelService = instantiationService.invokeFunction((accessor) => accessor.get(IModelService)); + modelService = instantiationService.get(IModelService); mode = disposables.add(new MockJSMode()); }); @@ -69,7 +71,7 @@ suite('SmartSelect', () => { async function assertGetRangesToPosition(text: string[], lineNumber: number, column: number, ranges: Range[], selectLeadingAndTrailingWhitespace = true): Promise { let uri = URI.file('test.js'); let model = modelService.createModel(text.join('\n'), new StaticLanguageSelector(mode.languageId), uri); - let [actual] = await provideSelectionRanges(model, [new Position(lineNumber, column)], { selectLeadingAndTrailingWhitespace }, CancellationToken.None); + let [actual] = await provideSelectionRanges(providers, model, [new Position(lineNumber, column)], { selectLeadingAndTrailingWhitespace }, CancellationToken.None); let actualStr = actual!.map(r => new Range(r.startLineNumber, r.startColumn, r.endLineNumber, r.endColumn).toString()); let desiredStr = ranges.reverse().map(r => String(r)); @@ -337,7 +339,7 @@ suite('SmartSelect', () => { test('Smart select: only add line ranges if they\'re contained by the next range #73850', async function () { - const reg = SelectionRangeRegistry.register('*', { + const reg = providers.register('*', { provideSelectionRanges() { return [[ { range: { startLineNumber: 1, startColumn: 10, endLineNumber: 1, endColumn: 11 } }, diff --git a/src/vs/editor/contrib/snippet/snippet.md b/src/vs/editor/contrib/snippet/browser/snippet.md similarity index 100% rename from src/vs/editor/contrib/snippet/snippet.md rename to src/vs/editor/contrib/snippet/browser/snippet.md diff --git a/src/vs/editor/contrib/snippet/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts similarity index 94% rename from src/vs/editor/contrib/snippet/snippetController2.ts rename to src/vs/editor/contrib/snippet/browser/snippetController2.ts index 5e17ff58f10..712e5c72526 100644 --- a/src/vs/editor/contrib/snippet/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -12,11 +12,12 @@ import { Selection } from 'vs/editor/common/core/selection'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { CompletionItem, CompletionItemKind } from 'vs/editor/common/languages'; -import { Choice } from 'vs/editor/contrib/snippet/snippetParser'; -import { showSimpleSuggestions } from 'vs/editor/contrib/suggest/suggest'; -import { OvertypingCapturer } from 'vs/editor/contrib/suggest/suggestOvertypingCapturer'; +import { Choice } from 'vs/editor/contrib/snippet/browser/snippetParser'; +import { showSimpleSuggestions } from 'vs/editor/contrib/suggest/browser/suggest'; +import { OvertypingCapturer } from 'vs/editor/contrib/suggest/browser/suggestOvertypingCapturer'; import { localize } from 'vs/nls'; import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ILogService } from 'vs/platform/log/common/log'; import { SnippetSession } from './snippetSession'; @@ -64,6 +65,7 @@ export class SnippetController2 implements IEditorContribution { constructor( private readonly _editor: ICodeEditor, + @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILogService private readonly _logService: ILogService, @IContextKeyService contextKeyService: IContextKeyService ) { @@ -153,6 +155,7 @@ export class SnippetController2 implements IEditorContribution { } if (this._session.isAtLastPlaceholder || !this._session.isSelectionWithinPlaceholders()) { + this._editor.getModel().pushStackElement(); return this.cancel(); } @@ -183,7 +186,7 @@ export class SnippetController2 implements IEditorContribution { const [first] = choice.options; - showSimpleSuggestions(this._editor, choice.options.map((option, i) => { + this._instantiationService.invokeFunction(showSimpleSuggestions, this._editor, choice.options.map((option, i) => { // let before = choice.options.slice(0, i); // let after = choice.options.slice(i); diff --git a/src/vs/editor/contrib/snippet/snippetParser.ts b/src/vs/editor/contrib/snippet/browser/snippetParser.ts similarity index 99% rename from src/vs/editor/contrib/snippet/snippetParser.ts rename to src/vs/editor/contrib/snippet/browser/snippetParser.ts index 6b63318c36c..b896cff1f74 100644 --- a/src/vs/editor/contrib/snippet/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetParser.ts @@ -498,7 +498,7 @@ function walk(marker: Marker[], visitor: (marker: Marker) => boolean): void { export class TextmateSnippet extends Marker { - private _placeholders?: { all: Placeholder[], last?: Placeholder }; + private _placeholders?: { all: Placeholder[]; last?: Placeholder }; get placeholderInfo() { if (!this._placeholders) { diff --git a/src/vs/editor/contrib/snippet/snippetSession.css b/src/vs/editor/contrib/snippet/browser/snippetSession.css similarity index 100% rename from src/vs/editor/contrib/snippet/snippetSession.css rename to src/vs/editor/contrib/snippet/browser/snippetSession.css diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts similarity index 98% rename from src/vs/editor/contrib/snippet/snippetSession.ts rename to src/vs/editor/contrib/snippet/browser/snippetSession.ts index ff99f621a7a..73108d88f15 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -11,13 +11,13 @@ import { withNullAsUndefined } from 'vs/base/common/types'; import 'vs/css!./snippetSession'; import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { IPosition } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IIdentifiedSingleEditOperation, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { OvertypingCapturer } from 'vs/editor/contrib/suggest/suggestOvertypingCapturer'; +import { OvertypingCapturer } from 'vs/editor/contrib/suggest/browser/suggestOvertypingCapturer'; import { ILabelService } from 'vs/platform/label/common/label'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { Choice, Marker, Placeholder, SnippetParser, Text, TextmateSnippet } from './snippetParser'; @@ -87,7 +87,7 @@ export class OneSnippet { // Transform placeholder text if necessary if (this._placeholderGroupsIdx >= 0) { - let operations: IIdentifiedSingleEditOperation[] = []; + let operations: ISingleEditOperation[] = []; for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) { // Check if the placeholder has a transformation @@ -392,7 +392,7 @@ export class SnippetSession { return selection; } - static createEditsAndSnippets(editor: IActiveCodeEditor, template: string, overwriteBefore: number, overwriteAfter: number, enforceFinalTabstop: boolean, adjustWhitespace: boolean, clipboardText: string | undefined, overtypingCapturer: OvertypingCapturer | undefined): { edits: IIdentifiedSingleEditOperation[], snippets: OneSnippet[] } { + static createEditsAndSnippets(editor: IActiveCodeEditor, template: string, overwriteBefore: number, overwriteAfter: number, enforceFinalTabstop: boolean, adjustWhitespace: boolean, clipboardText: string | undefined, overtypingCapturer: OvertypingCapturer | undefined): { edits: IIdentifiedSingleEditOperation[]; snippets: OneSnippet[] } { const edits: IIdentifiedSingleEditOperation[] = []; const snippets: OneSnippet[] = []; diff --git a/src/vs/editor/contrib/snippet/snippetVariables.ts b/src/vs/editor/contrib/snippet/browser/snippetVariables.ts similarity index 97% rename from src/vs/editor/contrib/snippet/snippetVariables.ts rename to src/vs/editor/contrib/snippet/browser/snippetVariables.ts index a9ff640f67e..09c08f4b026 100644 --- a/src/vs/editor/contrib/snippet/snippetVariables.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetVariables.ts @@ -11,12 +11,11 @@ import { generateUuid } from 'vs/base/common/uuid'; import { Selection } from 'vs/editor/common/core/selection'; import { ITextModel } from 'vs/editor/common/model'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { Text, Variable, VariableResolver } from 'vs/editor/contrib/snippet/snippetParser'; -import { OvertypingCapturer } from 'vs/editor/contrib/suggest/suggestOvertypingCapturer'; +import { Text, Variable, VariableResolver } from 'vs/editor/contrib/snippet/browser/snippetParser'; +import { OvertypingCapturer } from 'vs/editor/contrib/suggest/browser/suggestOvertypingCapturer'; import * as nls from 'vs/nls'; import { ILabelService } from 'vs/platform/label/common/label'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, toWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; +import { WORKSPACE_EXTENSION, isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier, IWorkspaceContextService, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export const KnownSnippetVariableNames: { [key: string]: true } = Object.freeze({ 'CURRENT_YEAR': true, diff --git a/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts similarity index 98% rename from src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts rename to src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts index 8c997c34cd1..6a8495d6abf 100644 --- a/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts @@ -7,9 +7,10 @@ import { mock } from 'vs/base/test/common/mock'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { ITestCodeEditor, withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { ILabelService } from 'vs/platform/label/common/label'; import { NullLogService } from 'vs/platform/log/common/log'; @@ -19,9 +20,10 @@ class TestSnippetController extends SnippetController2 { constructor( editor: ICodeEditor, + @IInstantiationService instaService: IInstantiationService, @IContextKeyService private readonly _contextKeyService: IContextKeyService ) { - super(editor, new NullLogService(), _contextKeyService); + super(editor, instaService, new NullLogService(), _contextKeyService); } isInSnippetMode(): boolean { diff --git a/src/vs/editor/contrib/snippet/test/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts similarity index 86% rename from src/vs/editor/contrib/snippet/test/snippetController2.test.ts rename to src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index 7435662a636..a3e55bdbbdc 100644 --- a/src/vs/editor/contrib/snippet/test/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -4,18 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import { mock } from 'vs/base/test/common/mock'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Selection } from 'vs/editor/common/core/selection'; import { Handler } from 'vs/editor/common/editorCommon'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { ILabelService } from 'vs/platform/label/common/label'; -import { NullLogService } from 'vs/platform/log/common/log'; +import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; suite('SnippetController2', function () { @@ -37,7 +40,7 @@ suite('SnippetController2', function () { let editor: ICodeEditor; let model: TextModel; let contextKeys: MockContextKeyService; - let logService = new NullLogService(); + let instaService: IInstantiationService; setup(function () { contextKeys = new MockContextKeyService(); @@ -45,7 +48,10 @@ suite('SnippetController2', function () { const serviceCollection = new ServiceCollection( [ILabelService, new class extends mock() { }], [IWorkspaceContextService, new class extends mock() { }], + [ILogService, new NullLogService()], + [IContextKeyService, contextKeys], ); + instaService = new InstantiationService(serviceCollection); editor = createTestCodeEditor(model, { serviceCollection }); editor.setSelections([new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)]); assert.strictEqual(model.getEOL(), '\n'); @@ -56,13 +62,13 @@ suite('SnippetController2', function () { }); test('creation', () => { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); assertContextKeys(contextKeys, false, false, false); ctrl.dispose(); }); test('insert, insert -> abort', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('foo${1:bar}foo$0'); assertContextKeys(contextKeys, true, false, true); @@ -74,7 +80,7 @@ suite('SnippetController2', function () { }); test('insert, insert -> tab, tab, done', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('${1:one}${2:two}$0'); assertContextKeys(contextKeys, true, false, true); @@ -92,7 +98,7 @@ suite('SnippetController2', function () { }); test('insert, insert -> cursor moves out (left/right)', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('foo${1:bar}foo$0'); assertContextKeys(contextKeys, true, false, true); @@ -104,7 +110,7 @@ suite('SnippetController2', function () { }); test('insert, insert -> cursor moves out (up/down)', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('foo${1:bar}foo$0'); assertContextKeys(contextKeys, true, false, true); @@ -116,7 +122,7 @@ suite('SnippetController2', function () { }); test('insert, insert -> cursors collapse', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('foo${1:bar}foo$0'); assert.strictEqual(SnippetController2.InSnippetMode.getValue(contextKeys), true); @@ -128,7 +134,7 @@ suite('SnippetController2', function () { }); test('insert, insert plain text -> no snippet mode', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('foobar'); assertContextKeys(contextKeys, false, false, false); @@ -136,7 +142,7 @@ suite('SnippetController2', function () { }); test('insert, delete snippet text', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('${1:foobar}$0'); assertContextKeys(contextKeys, true, false, true); @@ -160,7 +166,7 @@ suite('SnippetController2', function () { }); test('insert, nested snippet', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('${1:foobar}$0'); assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); @@ -179,7 +185,7 @@ suite('SnippetController2', function () { }); test('insert, nested plain text', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('${1:foobar}$0'); assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); @@ -194,7 +200,7 @@ suite('SnippetController2', function () { }); test('Nested snippets without final placeholder jumps to next outer placeholder, #27898', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('for(const ${1:element} of ${2:array}) {$0}'); assertContextKeys(contextKeys, true, false, true); @@ -213,7 +219,7 @@ suite('SnippetController2', function () { }); test('Inconsistent tab stop behaviour with recursive snippets and tab / shift tab, #27543', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); ctrl.insert('1_calize(${1:nl}, \'${2:value}\')$0'); assertContextKeys(contextKeys, true, false, true); @@ -237,7 +243,7 @@ suite('SnippetController2', function () { }); test('Snippet tabstop selecting content of previously entered variable only works when separated by space, #23728', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); @@ -255,7 +261,7 @@ suite('SnippetController2', function () { }); test('HTML Snippets Combine, #32211', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); model.updateOptions({ insertSpaces: false, tabSize: 4, trimAutoWhitespace: false }); @@ -286,7 +292,7 @@ suite('SnippetController2', function () { }); test('Problems with nested snippet insertion #39594', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); @@ -303,7 +309,7 @@ suite('SnippetController2', function () { test('Problems with nested snippet insertion #39594', function () { // ensure selection-change-to-cancel logic isn't too aggressive - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue('a-\naaa-'); editor.setSelections([new Selection(2, 5, 2, 5), new Selection(1, 3, 1, 3)]); @@ -315,7 +321,7 @@ suite('SnippetController2', function () { test('“Nested” snippets terminating abruptly in VSCode 1.19.2. #42012', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); ctrl.insert('var ${2:${1:name}} = ${1:name} + 1;${0}'); @@ -329,7 +335,7 @@ suite('SnippetController2', function () { test('Placeholders order #58267', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); ctrl.insert('\\pth{$1}$0'); @@ -358,7 +364,7 @@ suite('SnippetController2', function () { }); test('Must tab through deleted tab stops in snippets #31619', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); ctrl.insert('foo${1:a${2:bar}baz}end$0'); @@ -373,7 +379,7 @@ suite('SnippetController2', function () { }); test('Cancelling snippet mode should discard added cursors #68512 (soft cancel)', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); @@ -393,7 +399,7 @@ suite('SnippetController2', function () { }); test('Cancelling snippet mode should discard added cursors #68512 (hard cancel)', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); @@ -413,7 +419,7 @@ suite('SnippetController2', function () { }); test('User defined snippet tab stops ignored #72862', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); @@ -422,7 +428,7 @@ suite('SnippetController2', function () { }); test('Optional tabstop in snippets #72358', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); @@ -440,7 +446,7 @@ suite('SnippetController2', function () { }); test('issue #90135: confusing trim whitespace edits', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); @@ -449,7 +455,7 @@ suite('SnippetController2', function () { }); test('leading TAB by snippets won\'t replace by spaces #101870', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); model.updateOptions({ insertSpaces: true, tabSize: 4 }); ctrl.insert('\tHello World\n\tNew Line'); @@ -457,7 +463,7 @@ suite('SnippetController2', function () { }); test('leading TAB by snippets won\'t replace by spaces #101870 (part 2)', function () { - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); model.updateOptions({ insertSpaces: true, tabSize: 4 }); ctrl.insert('\tHello World\n\tNew Line\n${1:\tmore}'); @@ -468,7 +474,7 @@ suite('SnippetController2', function () { { // HAPPY - no nested snippet - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); model.updateOptions({ insertSpaces: true, tabSize: 4 }); ctrl.insert('$1\n\n${1/([A-Za-z0-9]+): ([A-Za-z]+).*/$1: \'$2\',/gm}'); @@ -479,7 +485,7 @@ suite('SnippetController2', function () { assert.strictEqual(model.getValue(), `foo: number;\n\nfoo: 'number',`); } - const ctrl = new SnippetController2(editor, logService, contextKeys); + const ctrl = instaService.createInstance(SnippetController2, editor); model.setValue(''); model.updateOptions({ insertSpaces: true, tabSize: 4 }); ctrl.insert('$1\n\n${1/([A-Za-z0-9]+): ([A-Za-z]+).*/$1: \'$2\',/gm}'); diff --git a/src/vs/editor/contrib/snippet/test/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts similarity index 99% rename from src/vs/editor/contrib/snippet/test/snippetParser.test.ts rename to src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts index 0fd104557fa..26cef12d7b3 100644 --- a/src/vs/editor/contrib/snippet/test/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { Choice, FormatString, Marker, Placeholder, Scanner, SnippetParser, Text, TextmateSnippet, TokenType, Transform, Variable } from 'vs/editor/contrib/snippet/snippetParser'; +import { Choice, FormatString, Marker, Placeholder, Scanner, SnippetParser, Text, TextmateSnippet, TokenType, Transform, Variable } from 'vs/editor/contrib/snippet/browser/snippetParser'; suite('SnippetParser', () => { diff --git a/src/vs/editor/contrib/snippet/test/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts similarity index 99% rename from src/vs/editor/contrib/snippet/test/snippetSession.test.ts rename to src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index c649964b326..b2f953d2697 100644 --- a/src/vs/editor/contrib/snippet/test/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -9,8 +9,8 @@ import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; -import { SnippetSession } from 'vs/editor/contrib/snippet/snippetSession'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; +import { SnippetSession } from 'vs/editor/contrib/snippet/browser/snippetSession'; import { createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; diff --git a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts similarity index 99% rename from src/vs/editor/contrib/snippet/test/snippetVariables.test.ts rename to src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts index 43aed9a920b..cfee631930b 100644 --- a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts @@ -12,8 +12,8 @@ import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; import { Selection } from 'vs/editor/common/core/selection'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { SnippetParser, Variable, VariableResolver } from 'vs/editor/contrib/snippet/snippetParser'; -import { ClipboardBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, SelectionBasedVariableResolver, TimeBasedVariableResolver, WorkspaceBasedVariableResolver } from 'vs/editor/contrib/snippet/snippetVariables'; +import { SnippetParser, Variable, VariableResolver } from 'vs/editor/contrib/snippet/browser/snippetParser'; +import { ClipboardBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, SelectionBasedVariableResolver, TimeBasedVariableResolver, WorkspaceBasedVariableResolver } from 'vs/editor/contrib/snippet/browser/snippetVariables'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { ILabelService } from 'vs/platform/label/common/label'; import { IWorkspace, IWorkspaceContextService, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; diff --git a/src/vs/editor/contrib/suggest/completionModel.ts b/src/vs/editor/contrib/suggest/browser/completionModel.ts similarity index 99% rename from src/vs/editor/contrib/suggest/completionModel.ts rename to src/vs/editor/contrib/suggest/browser/completionModel.ts index 28e22a4264c..73ddaa1a444 100644 --- a/src/vs/editor/contrib/suggest/completionModel.ts +++ b/src/vs/editor/contrib/suggest/browser/completionModel.ts @@ -9,7 +9,7 @@ import { anyScore, fuzzyScore, FuzzyScore, fuzzyScoreGracefulAggressive, FuzzySc import { compareIgnoreCase } from 'vs/base/common/strings'; import { InternalSuggestOptions } from 'vs/editor/common/config/editorOptions'; import { CompletionItemKind, CompletionItemProvider } from 'vs/editor/common/languages'; -import { WordDistance } from 'vs/editor/contrib/suggest/wordDistance'; +import { WordDistance } from 'vs/editor/contrib/suggest/browser/wordDistance'; import { CompletionItem } from './suggest'; type StrictCompletionItem = Required; diff --git a/src/vs/editor/contrib/suggest/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css similarity index 100% rename from src/vs/editor/contrib/suggest/media/suggest.css rename to src/vs/editor/contrib/suggest/browser/media/suggest.css diff --git a/src/vs/editor/contrib/suggest/resizable.ts b/src/vs/editor/contrib/suggest/browser/resizable.ts similarity index 100% rename from src/vs/editor/contrib/suggest/resizable.ts rename to src/vs/editor/contrib/suggest/browser/resizable.ts diff --git a/src/vs/editor/contrib/suggest/suggest.ts b/src/vs/editor/contrib/suggest/browser/suggest.ts similarity index 79% rename from src/vs/editor/contrib/suggest/suggest.ts rename to src/vs/editor/contrib/suggest/browser/suggest.ts index f7e4843ff4a..b75392d912c 100644 --- a/src/vs/editor/contrib/suggest/suggest.ts +++ b/src/vs/editor/contrib/suggest/browser/suggest.ts @@ -15,16 +15,20 @@ import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; import { localize } from 'vs/nls'; import { MenuId } from 'vs/platform/actions/common/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { historyNavigationVisible } from 'vs/platform/history/browser/contextScopedHistoryWidget'; export const Context = { - Visible: new RawContextKey('suggestWidgetVisible', false, localize('suggestWidgetVisible', "Whether suggestion are visible")), + Visible: historyNavigationVisible, DetailsVisible: new RawContextKey('suggestWidgetDetailsVisible', false, localize('suggestWidgetDetailsVisible', "Whether suggestion details are visible")), MultipleSuggestions: new RawContextKey('suggestWidgetMultipleSuggestions', false, localize('suggestWidgetMultipleSuggestions', "Whether there are multiple suggestions to pick from")), MakesTextEdit: new RawContextKey('suggestionMakesTextEdit', true, localize('suggestionMakesTextEdit', "Whether inserting the current suggestion yields in a change or has everything already been typed")), @@ -68,9 +72,9 @@ export class CompletionItem { constructor( readonly position: IPosition, - readonly completion: modes.CompletionItem, - readonly container: modes.CompletionList, - readonly provider: modes.CompletionItemProvider, + readonly completion: languages.CompletionItem, + readonly container: languages.CompletionList, + readonly provider: languages.CompletionItemProvider, ) { this.textLabel = typeof completion.label === 'string' ? completion.label @@ -153,19 +157,19 @@ export class CompletionOptions { constructor( readonly snippetSortOrder = SnippetSortOrder.Bottom, - readonly kindFilter = new Set(), - readonly providerFilter = new Set(), + readonly kindFilter = new Set(), + readonly providerFilter = new Set(), readonly showDeprecated = true ) { } } -let _snippetSuggestSupport: modes.CompletionItemProvider; +let _snippetSuggestSupport: languages.CompletionItemProvider; -export function getSnippetSuggestSupport(): modes.CompletionItemProvider { +export function getSnippetSuggestSupport(): languages.CompletionItemProvider { return _snippetSuggestSupport; } -export function setSnippetSuggestSupport(support: modes.CompletionItemProvider): modes.CompletionItemProvider { +export function setSnippetSuggestSupport(support: languages.CompletionItemProvider): languages.CompletionItemProvider { const old = _snippetSuggestSupport; _snippetSuggestSupport = support; return old; @@ -192,10 +196,11 @@ export class CompletionItemModel { } export async function provideSuggestionItems( + registry: LanguageFeatureRegistry, model: ITextModel, position: Position, options: CompletionOptions = CompletionOptions.default, - context: modes.CompletionContext = { triggerKind: modes.CompletionTriggerKind.Invoke }, + context: languages.CompletionContext = { triggerKind: languages.CompletionTriggerKind.Invoke }, token: CancellationToken = CancellationToken.None ): Promise { @@ -211,7 +216,7 @@ export async function provideSuggestionItems( const durations: CompletionDurationEntry[] = []; let needsClipboard = false; - const onCompletionList = (provider: modes.CompletionItemProvider, container: modes.CompletionList | null | undefined, sw: StopWatch): boolean => { + const onCompletionList = (provider: languages.CompletionItemProvider, container: languages.CompletionList | null | undefined, sw: StopWatch): boolean => { let didAddResult = false; if (!container) { return didAddResult; @@ -219,7 +224,7 @@ export async function provideSuggestionItems( for (let suggestion of container.suggestions) { if (!options.kindFilter.has(suggestion.kind)) { // skip if not showing deprecated suggestions - if (!options.showDeprecated && suggestion?.tags?.includes(modes.CompletionItemTag.Deprecated)) { + if (!options.showDeprecated && suggestion?.tags?.includes(languages.CompletionItemTag.Deprecated)) { continue; } // fill in default range when missing @@ -230,7 +235,7 @@ export async function provideSuggestionItems( if (!suggestion.sortText) { suggestion.sortText = typeof suggestion.label === 'string' ? suggestion.label : suggestion.label.label; } - if (!needsClipboard && suggestion.insertTextRules && suggestion.insertTextRules & modes.CompletionItemInsertTextRule.InsertAsSnippet) { + if (!needsClipboard && suggestion.insertTextRules && suggestion.insertTextRules & languages.CompletionItemInsertTextRule.InsertAsSnippet) { needsClipboard = SnippetParser.guessNeedsClipboard(suggestion.insertText); } result.push(new CompletionItem(position, suggestion, container, provider)); @@ -241,7 +246,7 @@ export async function provideSuggestionItems( disposables.add(container); } durations.push({ - providerName: provider._debugDisplayName ?? 'unkown_provider', elapsedProvider: container.duration ?? -1, elapsedOverall: sw.elapsed() + providerName: provider._debugDisplayName ?? 'unknown_provider', elapsedProvider: container.duration ?? -1, elapsedOverall: sw.elapsed() }); return didAddResult; }; @@ -249,7 +254,7 @@ export async function provideSuggestionItems( // ask for snippets in parallel to asking "real" providers. Only do something if configured to // do so - no snippet filter, no special-providers-only request const snippetCompletions = (async () => { - if (!_snippetSuggestSupport || options.kindFilter.has(modes.CompletionItemKind.Snippet)) { + if (!_snippetSuggestSupport || options.kindFilter.has(languages.CompletionItemKind.Snippet)) { return; } if (options.providerFilter.size > 0 && !options.providerFilter.has(_snippetSuggestSupport)) { @@ -263,7 +268,7 @@ export async function provideSuggestionItems( // add suggestions from contributed providers - providers are ordered in groups of // equal score and once a group produces a result the process stops // get provider groups, always add snippet suggestion provider - for (let providerGroup of modes.CompletionProviderRegistry.orderedGroups(model)) { + for (let providerGroup of registry.orderedGroups(model)) { // for each support in the group ask for suggestions let didAddResult = false; @@ -322,9 +327,9 @@ function defaultComparator(a: CompletionItem, b: CompletionItem): number { function snippetUpComparator(a: CompletionItem, b: CompletionItem): number { if (a.completion.kind !== b.completion.kind) { - if (a.completion.kind === modes.CompletionItemKind.Snippet) { + if (a.completion.kind === languages.CompletionItemKind.Snippet) { return -1; - } else if (b.completion.kind === modes.CompletionItemKind.Snippet) { + } else if (b.completion.kind === languages.CompletionItemKind.Snippet) { return 1; } } @@ -333,16 +338,16 @@ function snippetUpComparator(a: CompletionItem, b: CompletionItem): number { function snippetDownComparator(a: CompletionItem, b: CompletionItem): number { if (a.completion.kind !== b.completion.kind) { - if (a.completion.kind === modes.CompletionItemKind.Snippet) { + if (a.completion.kind === languages.CompletionItemKind.Snippet) { return 1; - } else if (b.completion.kind === modes.CompletionItemKind.Snippet) { + } else if (b.completion.kind === languages.CompletionItemKind.Snippet) { return -1; } } return defaultComparator(a, b); } -interface Comparator { (a: T, b: T): number; } +interface Comparator { (a: T, b: T): number } const _snippetComparators = new Map>(); _snippetComparators.set(SnippetSortOrder.Top, snippetUpComparator); _snippetComparators.set(SnippetSortOrder.Bottom, snippetDownComparator); @@ -359,16 +364,17 @@ CommandsRegistry.registerCommand('_executeCompletionItemProvider', async (access assertType(typeof triggerCharacter === 'string' || !triggerCharacter); assertType(typeof maxItemsToResolve === 'number' || !maxItemsToResolve); + const { completionProvider } = accessor.get(ILanguageFeaturesService); const ref = await accessor.get(ITextModelService).createModelReference(uri); try { - const result: modes.CompletionList = { + const result: languages.CompletionList = { incomplete: false, suggestions: [] }; const resolving: Promise[] = []; - const completions = await provideSuggestionItems(ref.object.textEditorModel, Position.lift(position), undefined, { triggerCharacter, triggerKind: triggerCharacter ? modes.CompletionTriggerKind.TriggerCharacter : modes.CompletionTriggerKind.Invoke }); + const completions = await provideSuggestionItems(completionProvider, ref.object.textEditorModel, Position.lift(position), undefined, { triggerCharacter, triggerKind: triggerCharacter ? languages.CompletionTriggerKind.TriggerCharacter : languages.CompletionTriggerKind.Invoke }); for (const item of completions.items) { if (resolving.length < (maxItemsToResolve ?? 0)) { resolving.push(item.resolve(CancellationToken.None)); @@ -391,27 +397,36 @@ CommandsRegistry.registerCommand('_executeCompletionItemProvider', async (access }); interface SuggestController extends IEditorContribution { - triggerSuggest(onlyFrom?: Set): void; + triggerSuggest(onlyFrom?: Set): void; } -const _provider = new class implements modes.CompletionItemProvider { - onlyOnceSuggestions: modes.CompletionItem[] = []; +const _once = new WeakMap(); - provideCompletionItems(): modes.CompletionList { - let suggestions = this.onlyOnceSuggestions.slice(0); - let result = { suggestions }; - this.onlyOnceSuggestions.length = 0; - return result; - } -}; +export function showSimpleSuggestions(accessor: ServicesAccessor, editor: ICodeEditor, suggestions: languages.CompletionItem[]) { -modes.CompletionProviderRegistry.register('*', _provider); + const { completionProvider } = accessor.get(ILanguageFeaturesService); + + const _provider = new class implements languages.CompletionItemProvider { + + onlyOnceSuggestions: languages.CompletionItem[] = []; + + provideCompletionItems(): languages.CompletionList { + let suggestions = this.onlyOnceSuggestions.slice(0); + let result = { suggestions }; + this.onlyOnceSuggestions.length = 0; + dispo.dispose(); + return result; + } + }; + + const dispo = completionProvider.register('*', _provider); + _once.get(editor)?.dispose(); + _once.set(editor, dispo); -export function showSimpleSuggestions(editor: ICodeEditor, suggestions: modes.CompletionItem[]) { setTimeout(() => { _provider.onlyOnceSuggestions.push(...suggestions); - editor.getContribution('editor.contrib.suggestController')?.triggerSuggest(new Set().add(_provider)); + editor.getContribution('editor.contrib.suggestController')?.triggerSuggest(new Set().add(_provider)); }, 0); } diff --git a/src/vs/editor/contrib/suggest/suggestAlternatives.ts b/src/vs/editor/contrib/suggest/browser/suggestAlternatives.ts similarity index 100% rename from src/vs/editor/contrib/suggest/suggestAlternatives.ts rename to src/vs/editor/contrib/suggest/browser/suggestAlternatives.ts diff --git a/src/vs/editor/contrib/suggest/suggestCommitCharacters.ts b/src/vs/editor/contrib/suggest/browser/suggestCommitCharacters.ts similarity index 100% rename from src/vs/editor/contrib/suggest/suggestCommitCharacters.ts rename to src/vs/editor/contrib/suggest/browser/suggestCommitCharacters.ts diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts similarity index 98% rename from src/vs/editor/contrib/suggest/suggestController.ts rename to src/vs/editor/contrib/suggest/browser/suggestController.ts index a1509f05ba4..9d10443ee47 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -15,7 +15,7 @@ import { DisposableStore, dispose, IDisposable, MutableDisposable, toDisposable import * as platform from 'vs/base/common/platform'; import { StopWatch } from 'vs/base/common/stopwatch'; import { assertType, isObject } from 'vs/base/common/types'; -import { StableEditorScrollState } from 'vs/editor/browser/core/editorState'; +import { StableEditorScrollState } from 'vs/editor/browser/stableEditorScroll'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; @@ -26,10 +26,10 @@ import { IEditorContribution, ScrollType } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { CompletionItemInsertTextRule, CompletionItemProvider } from 'vs/editor/common/languages'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; -import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/suggestMemory'; -import { WordContextKey } from 'vs/editor/contrib/suggest/wordContextKey'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; +import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/browser/suggestMemory'; +import { WordContextKey } from 'vs/editor/contrib/suggest/browser/wordContextKey'; import * as nls from 'vs/nls'; import { MenuRegistry } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; @@ -448,12 +448,12 @@ export class SuggestController implements IEditorContribution { return; } - type AcceptedSuggestion = { providerId: string; fileExtension: string; languageId: string; basenameHash: string; }; + type AcceptedSuggestion = { providerId: string; fileExtension: string; languageId: string; basenameHash: string }; type AcceptedSuggestionClassification = { - providerId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; }; - basenameHash: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; }; - fileExtension: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; }; - languageId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; }; + providerId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + basenameHash: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + fileExtension: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + languageId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; // _debugDisplayName looks like `vscode.css-language-features(/-:)`, where the last bit is the trigger chars // normalize it to just the extension ID and lowercase @@ -466,7 +466,7 @@ export class SuggestController implements IEditorContribution { }); } - getOverwriteInfo(item: CompletionItem, toggleMode: boolean): { overwriteBefore: number, overwriteAfter: number } { + getOverwriteInfo(item: CompletionItem, toggleMode: boolean): { overwriteBefore: number; overwriteAfter: number } { assertType(this.editor.hasModel()); let replace = this.editor.getOption(EditorOption.suggest).insertMode === 'replace'; diff --git a/src/vs/editor/contrib/suggest/suggestMemory.ts b/src/vs/editor/contrib/suggest/browser/suggestMemory.ts similarity index 99% rename from src/vs/editor/contrib/suggest/suggestMemory.ts rename to src/vs/editor/contrib/suggest/browser/suggestMemory.ts index b65ea018696..ce3ade98d03 100644 --- a/src/vs/editor/contrib/suggest/suggestMemory.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestMemory.ts @@ -10,7 +10,7 @@ import { LRUCache, TernarySearchTree } from 'vs/base/common/map'; import { IPosition } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; import { CompletionItemKind, CompletionItemKinds } from 'vs/editor/common/languages'; -import { CompletionItem } from 'vs/editor/contrib/suggest/suggest'; +import { CompletionItem } from 'vs/editor/contrib/suggest/browser/suggest'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/browser/suggestModel.ts similarity index 95% rename from src/vs/editor/contrib/suggest/suggestModel.ts rename to src/vs/editor/contrib/suggest/browser/suggestModel.ts index 9670e82e8c8..9f9e0399142 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestModel.ts @@ -11,14 +11,14 @@ import { DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle' import { getLeadingWhitespace, isHighSurrogate, isLowSurrogate } from 'vs/base/common/strings'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; -import { ITextModel, IWordAtPosition } from 'vs/editor/common/model'; -import { CompletionContext, CompletionItemKind, CompletionItemProvider, CompletionProviderRegistry, CompletionTriggerKind, StandardTokenType } from 'vs/editor/common/languages'; +import { ITextModel } from 'vs/editor/common/model'; +import { CompletionContext, CompletionItemKind, CompletionItemProvider, CompletionTriggerKind, StandardTokenType } from 'vs/editor/common/languages'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { WordDistance } from 'vs/editor/contrib/suggest/wordDistance'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { WordDistance } from 'vs/editor/contrib/suggest/browser/wordDistance'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -26,6 +26,8 @@ import { ILogService } from 'vs/platform/log/common/log'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CompletionModel } from './completionModel'; import { CompletionDurations, CompletionItem, CompletionOptions, getSnippetSuggestSupport, getSuggestionComparator, provideSuggestionItems, SnippetSortOrder } from './suggest'; +import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export interface ICancelEvent { readonly retrigger: boolean; @@ -165,6 +167,7 @@ export class SuggestModel implements IDisposable { @ILogService private readonly _logService: ILogService, @IContextKeyService private readonly _contextKeyService: IContextKeyService, @IConfigurationService private readonly _configurationService: IConfigurationService, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, ) { this._currentSelection = this._editor.getSelection() || new Selection(1, 1, 1, 1); @@ -181,7 +184,7 @@ export class SuggestModel implements IDisposable { this._updateTriggerCharacters(); this._updateQuickSuggest(); })); - this._toDispose.add(CompletionProviderRegistry.onDidChange(() => { + this._toDispose.add(this._languageFeaturesService.completionProvider.onDidChange(() => { this._updateTriggerCharacters(); this._updateActiveSuggestSession(); })); @@ -242,7 +245,7 @@ export class SuggestModel implements IDisposable { } const supportsByTriggerCharacter = new Map>(); - for (const support of CompletionProviderRegistry.all(this._editor.getModel())) { + for (const support of this._languageFeaturesService.completionProvider.all(this._editor.getModel())) { for (const ch of support.triggerCharacters || []) { let set = supportsByTriggerCharacter.get(ch); if (!set) { @@ -321,7 +324,7 @@ export class SuggestModel implements IDisposable { private _updateActiveSuggestSession(): void { if (this._state !== State.Idle) { - if (!this._editor.hasModel() || !CompletionProviderRegistry.has(this._editor.getModel())) { + if (!this._editor.hasModel() || !this._languageFeaturesService.completionProvider.has(this._editor.getModel())) { this.cancel(); } else { this.trigger({ auto: this._state === State.Auto, shy: false }, true); @@ -422,7 +425,7 @@ export class SuggestModel implements IDisposable { return; } - if (!CompletionProviderRegistry.has(model)) { + if (!this._languageFeaturesService.completionProvider.has(model)) { return; } @@ -452,7 +455,7 @@ export class SuggestModel implements IDisposable { }); } - trigger(context: SuggestTriggerContext, retrigger: boolean = false, onlyFrom?: Set, existing?: { items: CompletionItem[], clipboardText: string | undefined }): void { + trigger(context: SuggestTriggerContext, retrigger: boolean = false, onlyFrom?: Set, existing?: { items: CompletionItem[]; clipboardText: string | undefined }): void { if (!this._editor.hasModel()) { return; } @@ -500,6 +503,7 @@ export class SuggestModel implements IDisposable { const wordDistance = WordDistance.create(this._editorWorkerService, this._editor); const completions = provideSuggestionItems( + this._languageFeaturesService.completionProvider, model, this._editor.getPosition(), new CompletionOptions(snippetSortOrder, itemKindFilter, onlyFrom, showDeprecated), @@ -563,8 +567,8 @@ export class SuggestModel implements IDisposable { } setTimeout(() => { - type Durations = { data: string; }; - type DurationsClassification = { data: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' } }; + type Durations = { data: string }; + type DurationsClassification = { data: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' } }; this._telemetryService.publicLog2('suggest.durations.json', { data: JSON.stringify(durations) }); this._logService.debug('suggest.durations.json', durations); }); @@ -654,7 +658,7 @@ export class SuggestModel implements IDisposable { // Select those providers have not contributed to this completion model and re-trigger completions for // them. Also adopt the existing items and merge them into the new completion model - const inactiveProvider = new Set(CompletionProviderRegistry.all(this._editor.getModel()!)); + const inactiveProvider = new Set(this._languageFeaturesService.completionProvider.all(this._editor.getModel()!)); for (let provider of this._completionModel.allProvider) { inactiveProvider.delete(provider); } diff --git a/src/vs/editor/contrib/suggest/suggestOvertypingCapturer.ts b/src/vs/editor/contrib/suggest/browser/suggestOvertypingCapturer.ts similarity index 96% rename from src/vs/editor/contrib/suggest/suggestOvertypingCapturer.ts rename to src/vs/editor/contrib/suggest/browser/suggestOvertypingCapturer.ts index 4ec87c6b537..4a24f8807c1 100644 --- a/src/vs/editor/contrib/suggest/suggestOvertypingCapturer.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestOvertypingCapturer.ts @@ -5,7 +5,7 @@ import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { SuggestModel } from 'vs/editor/contrib/suggest/suggestModel'; +import { SuggestModel } from 'vs/editor/contrib/suggest/browser/suggestModel'; export class OvertypingCapturer implements IDisposable { diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts similarity index 96% rename from src/vs/editor/contrib/suggest/suggestWidget.ts rename to src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 8aa64e00ed2..920659b3d38 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -19,8 +19,8 @@ import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentW import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/embeddedCodeEditorWidget'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; -import { SuggestWidgetStatus } from 'vs/editor/contrib/suggest/suggestWidgetStatus'; -import 'vs/editor/contrib/symbolIcons/symbolIcons'; // The codicon symbol colors are defined here and must be loaded to get colors +import { SuggestWidgetStatus } from 'vs/editor/contrib/suggest/browser/suggestWidgetStatus'; +import 'vs/editor/contrib/symbolIcons/browser/symbolIcons'; // The codicon symbol colors are defined here and must be loaded to get colors import * as nls from 'vs/nls'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -107,7 +107,7 @@ export class SuggestWidget implements IDisposable { private _focusedItem?: CompletionItem; private _ignoreFocusEvents: boolean = false; private _completionModel?: CompletionModel; - private _cappedHeight?: { wanted: number; capped: number; }; + private _cappedHeight?: { wanted: number; capped: number }; private _forceRenderingAbove: boolean = false; private _explainMode: boolean = false; @@ -224,21 +224,34 @@ export class SuggestWidget implements IDisposable { mouseSupport: false, accessibilityProvider: { getRole: () => 'option', - getAriaLabel: (item: CompletionItem) => { - if (item.isResolved && this._isDetailsVisible()) { - const { documentation, detail } = item.completion; - const docs = strings.format( - '{0}{1}', - detail || '', - documentation ? (typeof documentation === 'string' ? documentation : documentation.value) : ''); - - return nls.localize('ariaCurrenttSuggestionReadDetails', "{0}, docs: {1}", item.textLabel, docs); - } else { - return item.textLabel; - } - }, getWidgetAriaLabel: () => nls.localize('suggest', "Suggest"), - getWidgetRole: () => 'listbox' + getWidgetRole: () => 'listbox', + getAriaLabel: (item: CompletionItem) => { + + let label = item.textLabel; + if (typeof item.completion.label !== 'string') { + const { detail, description } = item.completion.label; + if (detail && description) { + label = nls.localize('label.full', '{0}{1}, {2}', label, detail, description); + } else if (detail) { + label = nls.localize('label.detail', '{0}{1}', label, detail); + } else if (description) { + label = nls.localize('label.desc', '{0}, {1}', label, description); + } + } + + if (!item.isResolved || !this._isDetailsVisible()) { + return label; + } + + const { documentation, detail } = item.completion; + const docs = strings.format( + '{0}{1}', + detail || '', + documentation ? (typeof documentation === 'string' ? documentation : documentation.value) : ''); + + return nls.localize('ariaCurrenttSuggestionReadDetails', "{0}, docs: {1}", label, docs); + }, } }); @@ -375,9 +388,10 @@ export class SuggestWidget implements IDisposable { this.showDetails(true); } }, 250); - token.onCancellationRequested(() => loading.dispose()); + const sub = token.onCancellationRequested(() => loading.dispose()); const result = await item.resolve(token); loading.dispose(); + sub.dispose(); return result; }); diff --git a/src/vs/editor/contrib/suggest/suggestWidgetDetails.ts b/src/vs/editor/contrib/suggest/browser/suggestWidgetDetails.ts similarity index 98% rename from src/vs/editor/contrib/suggest/suggestWidgetDetails.ts rename to src/vs/editor/contrib/suggest/browser/suggestWidgetDetails.ts index e12163c1035..fc4a44920ed 100644 --- a/src/vs/editor/contrib/suggest/suggestWidgetDetails.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidgetDetails.ts @@ -10,10 +10,10 @@ import { Codicon } from 'vs/base/common/codicons'; import { Emitter, Event } from 'vs/base/common/event'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { ICodeEditor, IOverlayWidget } from 'vs/editor/browser/editorBrowser'; import { EditorOption, EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; -import { ResizableHTMLElement } from 'vs/editor/contrib/suggest/resizable'; +import { ResizableHTMLElement } from 'vs/editor/contrib/suggest/browser/resizable'; import * as nls from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CompletionItem } from './suggest'; @@ -377,7 +377,7 @@ export class SuggestDetailsOverlay implements IOverlayWidget { const defaultMinSize = new dom.Dimension(220, 2 * info.lineHeight); const defaultTop = anchorBox.top; - type Placement = { top: number, left: number, fit: number, maxSizeTop: dom.Dimension, maxSizeBottom: dom.Dimension, minSize: dom.Dimension }; + type Placement = { top: number; left: number; fit: number; maxSizeTop: dom.Dimension; maxSizeBottom: dom.Dimension; minSize: dom.Dimension }; // EAST const eastPlacement: Placement = (function () { diff --git a/src/vs/editor/contrib/suggest/suggestWidgetRenderer.ts b/src/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.ts similarity index 99% rename from src/vs/editor/contrib/suggest/suggestWidgetRenderer.ts rename to src/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.ts index ecc1d8446b5..9823da21955 100644 --- a/src/vs/editor/contrib/suggest/suggestWidgetRenderer.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.ts @@ -18,7 +18,7 @@ import { EditorOption, EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/edit import { CompletionItemKind, CompletionItemKinds, CompletionItemTag } from 'vs/editor/common/languages'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import * as nls from 'vs/nls'; import { FileKind } from 'vs/platform/files/common/files'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; diff --git a/src/vs/editor/contrib/suggest/suggestWidgetStatus.ts b/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts similarity index 99% rename from src/vs/editor/contrib/suggest/suggestWidgetStatus.ts rename to src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts index 6958ea0e8f1..ad4ce287160 100644 --- a/src/vs/editor/contrib/suggest/suggestWidgetStatus.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidgetStatus.ts @@ -8,7 +8,7 @@ import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar import { IAction } from 'vs/base/common/actions'; import { ResolvedKeybinding } from 'vs/base/common/keybindings'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { suggestWidgetStatusbarMenu } from 'vs/editor/contrib/suggest/suggest'; +import { suggestWidgetStatusbarMenu } from 'vs/editor/contrib/suggest/browser/suggest'; import { localize } from 'vs/nls'; import { MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuItemAction } from 'vs/platform/actions/common/actions'; diff --git a/src/vs/editor/contrib/suggest/wordContextKey.ts b/src/vs/editor/contrib/suggest/browser/wordContextKey.ts similarity index 100% rename from src/vs/editor/contrib/suggest/wordContextKey.ts rename to src/vs/editor/contrib/suggest/browser/wordContextKey.ts diff --git a/src/vs/editor/contrib/suggest/wordDistance.ts b/src/vs/editor/contrib/suggest/browser/wordDistance.ts similarity index 98% rename from src/vs/editor/contrib/suggest/wordDistance.ts rename to src/vs/editor/contrib/suggest/browser/wordDistance.ts index a9e2a7c84e0..1b479c45330 100644 --- a/src/vs/editor/contrib/suggest/wordDistance.ts +++ b/src/vs/editor/contrib/suggest/browser/wordDistance.ts @@ -10,7 +10,7 @@ import { IPosition } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { CompletionItem, CompletionItemKind } from 'vs/editor/common/languages'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; -import { BracketSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/bracketSelections'; +import { BracketSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/browser/bracketSelections'; export abstract class WordDistance { diff --git a/src/vs/editor/contrib/suggest/test/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts similarity index 88% rename from src/vs/editor/contrib/suggest/test/completionModel.test.ts rename to src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts index 250a765300e..4e1a988003f 100644 --- a/src/vs/editor/contrib/suggest/test/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts @@ -5,13 +5,13 @@ import * as assert from 'assert'; import { EditorOptions, InternalSuggestOptions } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; -import * as modes from 'vs/editor/common/languages'; -import { CompletionModel } from 'vs/editor/contrib/suggest/completionModel'; -import { CompletionItem, getSuggestionComparator, SnippetSortOrder } from 'vs/editor/contrib/suggest/suggest'; -import { WordDistance } from 'vs/editor/contrib/suggest/wordDistance'; +import * as languages from 'vs/editor/common/languages'; +import { CompletionModel } from 'vs/editor/contrib/suggest/browser/completionModel'; +import { CompletionItem, getSuggestionComparator, SnippetSortOrder } from 'vs/editor/contrib/suggest/browser/suggest'; +import { WordDistance } from 'vs/editor/contrib/suggest/browser/wordDistance'; -export function createSuggestItem(label: string, overwriteBefore: number, kind = modes.CompletionItemKind.Property, incomplete: boolean = false, position: IPosition = { lineNumber: 1, column: 1 }, sortText?: string, filterText?: string): CompletionItem { - const suggestion: modes.CompletionItem = { +export function createSuggestItem(label: string, overwriteBefore: number, kind = languages.CompletionItemKind.Property, incomplete: boolean = false, position: IPosition = { lineNumber: 1, column: 1 }, sortText?: string, filterText?: string): CompletionItem { + const suggestion: languages.CompletionItem = { label, sortText, filterText, @@ -19,11 +19,11 @@ export function createSuggestItem(label: string, overwriteBefore: number, kind = insertText: label, kind }; - const container: modes.CompletionList = { + const container: languages.CompletionList = { incomplete, suggestions: [suggestion] }; - const provider: modes.CompletionItemProvider = { + const provider: languages.CompletionItemProvider = { provideCompletionItems(): any { return; } @@ -186,9 +186,9 @@ suite('CompletionModel', function () { test('keep snippet sorting with prefix: top, #25495', function () { model = new CompletionModel([ - createSuggestItem('Snippet1', 1, modes.CompletionItemKind.Snippet), - createSuggestItem('tnippet2', 1, modes.CompletionItemKind.Snippet), - createSuggestItem('semver', 1, modes.CompletionItemKind.Property), + createSuggestItem('Snippet1', 1, languages.CompletionItemKind.Snippet), + createSuggestItem('tnippet2', 1, languages.CompletionItemKind.Snippet), + createSuggestItem('semver', 1, languages.CompletionItemKind.Property), ], 1, { leadingLineContent: 's', characterCountDelta: 0 @@ -205,9 +205,9 @@ suite('CompletionModel', function () { test('keep snippet sorting with prefix: bottom, #25495', function () { model = new CompletionModel([ - createSuggestItem('snippet1', 1, modes.CompletionItemKind.Snippet), - createSuggestItem('tnippet2', 1, modes.CompletionItemKind.Snippet), - createSuggestItem('Semver', 1, modes.CompletionItemKind.Property), + createSuggestItem('snippet1', 1, languages.CompletionItemKind.Snippet), + createSuggestItem('tnippet2', 1, languages.CompletionItemKind.Snippet), + createSuggestItem('Semver', 1, languages.CompletionItemKind.Property), ], 1, { leadingLineContent: 's', characterCountDelta: 0 @@ -223,8 +223,8 @@ suite('CompletionModel', function () { test('keep snippet sorting with prefix: inline, #25495', function () { model = new CompletionModel([ - createSuggestItem('snippet1', 1, modes.CompletionItemKind.Snippet), - createSuggestItem('tnippet2', 1, modes.CompletionItemKind.Snippet), + createSuggestItem('snippet1', 1, languages.CompletionItemKind.Snippet), + createSuggestItem('tnippet2', 1, languages.CompletionItemKind.Snippet), createSuggestItem('Semver', 1), ], 1, { leadingLineContent: 's', @@ -259,8 +259,8 @@ suite('CompletionModel', function () { test('Vscode 1.12 no longer obeys \'sortText\' in completion items (from language server), #26096', function () { - const item1 = createSuggestItem('<- groups', 2, modes.CompletionItemKind.Property, false, { lineNumber: 1, column: 3 }, '00002', ' groups'); - const item2 = createSuggestItem('source', 0, modes.CompletionItemKind.Property, false, { lineNumber: 1, column: 3 }, '00001', 'source'); + const item1 = createSuggestItem('<- groups', 2, languages.CompletionItemKind.Property, false, { lineNumber: 1, column: 3 }, '00002', ' groups'); + const item2 = createSuggestItem('source', 0, languages.CompletionItemKind.Property, false, { lineNumber: 1, column: 3 }, '00001', 'source'); const items = [item1, item2].sort(getSuggestionComparator(SnippetSortOrder.Inline)); model = new CompletionModel(items, 3, { diff --git a/src/vs/editor/contrib/suggest/test/suggest.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggest.test.ts similarity index 71% rename from src/vs/editor/contrib/suggest/test/suggest.test.ts rename to src/vs/editor/contrib/suggest/test/browser/suggest.test.ts index fe45d0c3cb1..04987101122 100644 --- a/src/vs/editor/contrib/suggest/test/suggest.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggest.test.ts @@ -8,20 +8,22 @@ import { URI } from 'vs/base/common/uri'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { CompletionItemKind, CompletionItemProvider, CompletionProviderRegistry } from 'vs/editor/common/languages'; -import { CompletionOptions, provideSuggestionItems, SnippetSortOrder } from 'vs/editor/contrib/suggest/suggest'; +import { CompletionItemKind, CompletionItemProvider } from 'vs/editor/common/languages'; +import { CompletionOptions, provideSuggestionItems, SnippetSortOrder } from 'vs/editor/contrib/suggest/browser/suggest'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; suite('Suggest', function () { let model: TextModel; let registration: IDisposable; + let registry: LanguageFeatureRegistry; setup(function () { - + registry = new LanguageFeatureRegistry(); model = createTextModel('FOO\nbar\BAR\nfoo', undefined, undefined, URI.parse('foo:bar/path')); - registration = CompletionProviderRegistry.register({ pattern: 'bar/path', scheme: 'foo' }, { + registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, { provideCompletionItems(_doc, pos) { return { incomplete: false, @@ -52,7 +54,7 @@ suite('Suggest', function () { }); test('sort - snippet inline', async function () { - const { items } = await provideSuggestionItems(model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Inline)); + const { items } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Inline)); assert.strictEqual(items.length, 3); assert.strictEqual(items[0].completion.label, 'aaa'); assert.strictEqual(items[1].completion.label, 'fff'); @@ -60,7 +62,7 @@ suite('Suggest', function () { }); test('sort - snippet top', async function () { - const { items } = await provideSuggestionItems(model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Top)); + const { items } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Top)); assert.strictEqual(items.length, 3); assert.strictEqual(items[0].completion.label, 'aaa'); assert.strictEqual(items[1].completion.label, 'zzz'); @@ -68,7 +70,7 @@ suite('Suggest', function () { }); test('sort - snippet bottom', async function () { - const { items } = await provideSuggestionItems(model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Bottom)); + const { items } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Bottom)); assert.strictEqual(items.length, 3); assert.strictEqual(items[0].completion.label, 'fff'); assert.strictEqual(items[1].completion.label, 'aaa'); @@ -76,7 +78,7 @@ suite('Suggest', function () { }); test('sort - snippet none', async function () { - const { items } = await provideSuggestionItems(model, new Position(1, 1), new CompletionOptions(undefined, new Set().add(CompletionItemKind.Snippet))); + const { items } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(undefined, new Set().add(CompletionItemKind.Snippet))); assert.strictEqual(items.length, 1); assert.strictEqual(items[0].completion.label, 'fff'); }); @@ -97,9 +99,9 @@ suite('Suggest', function () { }; } }; - const registration = CompletionProviderRegistry.register({ pattern: 'bar/path', scheme: 'foo' }, foo); + const registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, foo); - provideSuggestionItems(model, new Position(1, 1), new CompletionOptions(undefined, undefined, new Set().add(foo))).then(({ items }) => { + provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(undefined, undefined, new Set().add(foo))).then(({ items }) => { registration.dispose(); assert.strictEqual(items.length, 1); @@ -137,8 +139,8 @@ suite('Suggest', function () { } }; - const registration = CompletionProviderRegistry.register({ pattern: 'bar/path', scheme: 'foo' }, foo); - const { items } = await provideSuggestionItems(model, new Position(0, 0), new CompletionOptions(undefined, undefined, new Set().add(foo))); + const registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, foo); + const { items } = await provideSuggestionItems(registry, model, new Position(0, 0), new CompletionOptions(undefined, undefined, new Set().add(foo))); registration.dispose(); assert.strictEqual(items.length, 2); diff --git a/src/vs/editor/contrib/suggest/test/suggestController.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggestController.test.ts similarity index 90% rename from src/vs/editor/contrib/suggest/test/suggestController.test.ts rename to src/vs/editor/contrib/suggest/test/browser/suggestController.test.ts index 06474905567..0bdcf236e44 100644 --- a/src/vs/editor/contrib/suggest/test/suggestController.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggestController.test.ts @@ -12,11 +12,11 @@ import { mock } from 'vs/base/test/common/mock'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { CompletionItemInsertTextRule, CompletionItemKind, CompletionProviderRegistry } from 'vs/editor/common/languages'; +import { CompletionItemInsertTextRule, CompletionItemKind } from 'vs/editor/common/languages'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/suggestMemory'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; +import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/browser/suggestMemory'; import { createTestCodeEditor, ITestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { IMenu, IMenuService } from 'vs/platform/actions/common/actions'; @@ -29,6 +29,8 @@ import { InMemoryStorageService, IStorageService } from 'vs/platform/storage/com import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; suite('SuggestController', function () { @@ -37,6 +39,8 @@ suite('SuggestController', function () { let controller: SuggestController; let editor: ITestCodeEditor; let model: TextModel; + const languageFeaturesService = new LanguageFeaturesService(); + teardown(function () { disposables.clear(); @@ -45,6 +49,7 @@ suite('SuggestController', function () { setup(function () { const serviceCollection = new ServiceCollection( + [ILanguageFeaturesService, languageFeaturesService], [ITelemetryService, NullTelemetryService], [ILogService, new NullLogService()], [IStorageService, new InMemoryStorageService()], @@ -78,7 +83,7 @@ suite('SuggestController', function () { }); test('postfix completion reports incorrect position #86984', async function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { + disposables.add(languageFeaturesService.completionProvider.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ @@ -114,7 +119,7 @@ suite('SuggestController', function () { test('use additionalTextEdits sync when possible', async function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { + disposables.add(languageFeaturesService.completionProvider.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ @@ -155,7 +160,7 @@ suite('SuggestController', function () { let resolveCallCount = 0; - disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { + disposables.add(languageFeaturesService.completionProvider.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ @@ -207,7 +212,7 @@ suite('SuggestController', function () { let resolveCallCount = 0; let resolve: Function = () => { }; - disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { + disposables.add(languageFeaturesService.completionProvider.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ @@ -263,7 +268,7 @@ suite('SuggestController', function () { let resolveCallCount = 0; let resolve: Function = () => { }; - disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { + disposables.add(languageFeaturesService.completionProvider.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ @@ -312,7 +317,7 @@ suite('SuggestController', function () { let resolveCallCount = 0; let resolve: Function = () => { }; - disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { + disposables.add(languageFeaturesService.completionProvider.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ @@ -366,7 +371,7 @@ suite('SuggestController', function () { test('resolve additionalTextEdits async when needed (cancel)', async function () { let resolve: Function[] = []; - disposables.add(CompletionProviderRegistry.register({ scheme: 'test-ctrl' }, { + disposables.add(languageFeaturesService.completionProvider.register({ scheme: 'test-ctrl' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ diff --git a/src/vs/editor/contrib/suggest/test/suggestMemory.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts similarity index 97% rename from src/vs/editor/contrib/suggest/test/suggestMemory.test.ts rename to src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts index c63e062928a..1e0818d3003 100644 --- a/src/vs/editor/contrib/suggest/test/suggestMemory.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts @@ -6,9 +6,9 @@ import * as assert from 'assert'; import { IPosition } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; -import { CompletionItem } from 'vs/editor/contrib/suggest/suggest'; -import { LRUMemory, Memory, NoMemory, PrefixMemory } from 'vs/editor/contrib/suggest/suggestMemory'; -import { createSuggestItem } from 'vs/editor/contrib/suggest/test/completionModel.test'; +import { CompletionItem } from 'vs/editor/contrib/suggest/browser/suggest'; +import { LRUMemory, Memory, NoMemory, PrefixMemory } from 'vs/editor/contrib/suggest/browser/suggestMemory'; +import { createSuggestItem } from 'vs/editor/contrib/suggest/test/browser/completionModel.test'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; suite('SuggestMemories', function () { diff --git a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/browser/suggestModel.test.ts similarity index 88% rename from src/vs/editor/contrib/suggest/test/suggestModel.test.ts rename to src/vs/editor/contrib/suggest/test/browser/suggestModel.test.ts index 9c62978eec1..729666346b0 100644 --- a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/suggestModel.test.ts @@ -7,44 +7,44 @@ import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; import { Handler } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { CompletionItemKind, CompletionItemProvider, CompletionList, CompletionProviderRegistry, CompletionTriggerKind, IState, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; +import { CompletionItemKind, CompletionItemProvider, CompletionList, CompletionTriggerKind, EncodedTokenizationResult, IState, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { NullState } from 'vs/editor/common/languages/nullMode'; -import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/suggestMemory'; -import { LineContext, SuggestModel } from 'vs/editor/contrib/suggest/suggestModel'; -import { ISelectedSuggestion } from 'vs/editor/contrib/suggest/suggestWidget'; +import { NullState } from 'vs/editor/common/languages/nullTokenize'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; +import { ISuggestMemoryService } from 'vs/editor/contrib/suggest/browser/suggestMemory'; +import { LineContext, SuggestModel } from 'vs/editor/contrib/suggest/browser/suggestModel'; +import { ISelectedSuggestion } from 'vs/editor/contrib/suggest/browser/suggestWidget'; import { createTestCodeEditor, ITestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createModelServices, createTextModel, instantiateTextModel } from 'vs/editor/test/common/testTextModel'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; -import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { MockContextKeyService, MockKeybindingService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; +import { MockKeybindingService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { ILabelService } from 'vs/platform/label/common/label'; -import { NullLogService } from 'vs/platform/log/common/log'; import { InMemoryStorageService, IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -function createMockEditor(model: TextModel): ITestCodeEditor { +function createMockEditor(model: TextModel, languageFeaturesService: ILanguageFeaturesService): ITestCodeEditor { + const editor = createTestCodeEditor(model, { serviceCollection: new ServiceCollection( + [ILanguageFeaturesService, languageFeaturesService], [ITelemetryService, NullTelemetryService], [IStorageService, new InMemoryStorageService()], [IKeybindingService, new MockKeybindingService()], @@ -110,7 +110,7 @@ suite('SuggestModel - Context', function () { const assertAutoTrigger = (model: TextModel, offset: number, expected: boolean, message?: string): void => { const pos = model.getPositionAt(offset); - const editor = createMockEditor(model); + const editor = createMockEditor(model, new LanguageFeaturesService()); editor.setPosition(pos); assert.strictEqual(LineContext.shouldAutoTrigger(editor), expected, message); editor.dispose(); @@ -190,6 +190,8 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { let disposables: DisposableStore; let model: TextModel; + const languageFeaturesService = new LanguageFeaturesService(); + let registry = languageFeaturesService.completionProvider; setup(function () { disposables = new DisposableStore(); @@ -204,24 +206,8 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { function withOracle(callback: (model: SuggestModel, editor: ITestCodeEditor) => any): Promise { return new Promise((resolve, reject) => { - const editor = createMockEditor(model); - const oracle = new SuggestModel( - editor, - new class extends mock() { - override computeWordRanges() { - return Promise.resolve({}); - } - }, - new class extends mock() { - override readText() { - return Promise.resolve('CLIPPY'); - } - }, - NullTelemetryService, - new NullLogService(), - new MockContextKeyService(), - new TestConfigurationService() - ); + const editor = createMockEditor(model, languageFeaturesService); + const oracle = editor.invokeWithinContext(accessor => accessor.get(IInstantiationService).createInstance(SuggestModel, editor)); disposables.add(oracle); disposables.add(editor); @@ -287,7 +273,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('events - suggest/empty', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, alwaysEmptySupport)); + disposables.add(registry.register({ scheme: 'test' }, alwaysEmptySupport)); return withOracle(model => { return Promise.all([ @@ -309,7 +295,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('trigger - on type', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, alwaysSomethingSupport)); + disposables.add(registry.register({ scheme: 'test' }, alwaysSomethingSupport)); return withOracle((model, editor) => { return assertEvent(model.onDidSuggest, () => { @@ -328,7 +314,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('#17400: Keep filtering suggestModel.ts after space', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos): CompletionList { return { incomplete: false, @@ -378,7 +364,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('#21484: Trigger character always force a new completion session', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos): CompletionList { return { incomplete: false, @@ -392,7 +378,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { } })); - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { triggerCharacters: ['.'], provideCompletionItems(doc, pos): CompletionList { return { @@ -440,7 +426,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('Intellisense Completion doesn\'t respect space after equal sign (.html file), #29353 [1/2]', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, alwaysSomethingSupport)); + disposables.add(registry.register({ scheme: 'test' }, alwaysSomethingSupport)); return withOracle((model, editor) => { @@ -465,7 +451,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('Intellisense Completion doesn\'t respect space after equal sign (.html file), #29353 [2/2]', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, alwaysSomethingSupport)); + disposables.add(registry.register({ scheme: 'test' }, alwaysSomethingSupport)); return withOracle((model, editor) => { @@ -490,7 +476,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('Incomplete suggestion results cause re-triggering when typing w/o further context, #28400 (1/2)', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos): CompletionList { return { incomplete: true, @@ -527,7 +513,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('Incomplete suggestion results cause re-triggering when typing w/o further context, #28400 (2/2)', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos): CompletionList { return { incomplete: true, @@ -570,7 +556,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('Trigger character is provided in suggest context', function () { let triggerCharacter = ''; - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { triggerCharacters: ['.'], provideCompletionItems(doc, pos, context): CompletionList { assert.strictEqual(context.triggerKind, CompletionTriggerKind.TriggerCharacter); @@ -603,7 +589,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }); test('Mac press and hold accent character insertion does not update suggestions, #35269', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos): CompletionList { return { incomplete: true, @@ -646,7 +632,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }); test('Backspace should not always cancel code completion, #36491', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, alwaysSomethingSupport)); + disposables.add(registry.register({ scheme: 'test' }, alwaysSomethingSupport)); return withOracle(async (model, editor) => { await assertEvent(model.onDidSuggest, () => { @@ -675,7 +661,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }); test('Text changes for completion CodeAction are affected by the completion #39893', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos): CompletionList { return { incomplete: true, @@ -725,7 +711,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('Completion unexpectedly triggers on second keypress of an edit group in a snippet #43523', function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, alwaysSomethingSupport)); + disposables.add(registry.register({ scheme: 'test' }, alwaysSomethingSupport)); return withOracle((model, editor) => { return assertEvent(model.onDidSuggest, () => { @@ -749,7 +735,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { let disposeA = 0; let disposeB = 0; - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos) { return { incomplete: true, @@ -764,7 +750,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }; } })); - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos) { return { incomplete: false, @@ -818,7 +804,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { let countA = 0; let countB = 0; - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos) { countA += 1; return { @@ -832,7 +818,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }; } })); - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos) { countB += 1; if (!doc.getWordUntilPosition(pos).word.startsWith('a')) { @@ -881,7 +867,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { test('registerCompletionItemProvider with letters as trigger characters block other completion items to show up #127815', async function () { - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { provideCompletionItems(doc, pos) { return { suggestions: [{ @@ -893,7 +879,7 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { }; } })); - disposables.add(CompletionProviderRegistry.register({ scheme: 'test' }, { + disposables.add(registry.register({ scheme: 'test' }, { triggerCharacters: ['a', '.'], provideCompletionItems(doc, pos) { return { diff --git a/src/vs/editor/contrib/suggest/test/wordDistance.test.ts b/src/vs/editor/contrib/suggest/test/browser/wordDistance.test.ts similarity index 88% rename from src/vs/editor/contrib/suggest/test/wordDistance.test.ts rename to src/vs/editor/contrib/suggest/test/browser/wordDistance.test.ts index 9914191b000..138ebbd580d 100644 --- a/src/vs/editor/contrib/suggest/test/wordDistance.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/wordDistance.test.ts @@ -10,21 +10,22 @@ import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; -import { DEFAULT_WORD_REGEXP } from 'vs/editor/common/model/wordHelper'; -import * as modes from 'vs/editor/common/languages'; +import { DEFAULT_WORD_REGEXP } from 'vs/editor/common/core/wordHelper'; +import * as languages from 'vs/editor/common/languages'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { EditorSimpleWorker } from 'vs/editor/common/services/editorSimpleWorker'; import { EditorWorkerService } from 'vs/editor/browser/services/editorWorkerService'; import { IEditorWorkerHost } from 'vs/editor/common/services/editorWorkerHost'; import { IModelService } from 'vs/editor/common/services/model'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; -import { CompletionItem } from 'vs/editor/contrib/suggest/suggest'; -import { WordDistance } from 'vs/editor/contrib/suggest/wordDistance'; +import { CompletionItem } from 'vs/editor/contrib/suggest/browser/suggest'; +import { WordDistance } from 'vs/editor/contrib/suggest/browser/wordDistance'; import { createTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; import { NullLogService } from 'vs/platform/log/common/log'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; suite('suggest, word distance', function () { @@ -67,7 +68,7 @@ suite('suggest, word distance', function () { private _worker = new EditorSimpleWorker(new class extends mock() { }, null); constructor() { - super(modelService, new class extends mock() { }, new NullLogService(), new TestLanguageConfigurationService()); + super(modelService, new class extends mock() { }, new NullLogService(), new TestLanguageConfigurationService(), new LanguageFeaturesService()); this._worker.acceptNewModel({ url: model.uri.toString(), lines: model.getLinesContent(), @@ -94,16 +95,16 @@ suite('suggest, word distance', function () { }); function createSuggestItem(label: string, overwriteBefore: number, position: IPosition): CompletionItem { - const suggestion: modes.CompletionItem = { + const suggestion: languages.CompletionItem = { label, range: { startLineNumber: position.lineNumber, startColumn: position.column - overwriteBefore, endLineNumber: position.lineNumber, endColumn: position.column }, insertText: label, kind: 0 }; - const container: modes.CompletionList = { + const container: languages.CompletionList = { suggestions: [suggestion] }; - const provider: modes.CompletionItemProvider = { + const provider: languages.CompletionItemProvider = { provideCompletionItems(): any { return; } diff --git a/src/vs/editor/contrib/symbolIcons/symbolIcons.ts b/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts similarity index 100% rename from src/vs/editor/contrib/symbolIcons/symbolIcons.ts rename to src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts diff --git a/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.ts b/src/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.ts similarity index 100% rename from src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.ts rename to src/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.ts diff --git a/src/vs/editor/contrib/tokenization/tokenization.ts b/src/vs/editor/contrib/tokenization/browser/tokenization.ts similarity index 100% rename from src/vs/editor/contrib/tokenization/tokenization.ts rename to src/vs/editor/contrib/tokenization/browser/tokenization.ts diff --git a/src/vs/editor/contrib/unicodeHighlighter/bannerController.css b/src/vs/editor/contrib/unicodeHighlighter/browser/bannerController.css similarity index 100% rename from src/vs/editor/contrib/unicodeHighlighter/bannerController.css rename to src/vs/editor/contrib/unicodeHighlighter/browser/bannerController.css diff --git a/src/vs/editor/contrib/unicodeHighlighter/bannerController.ts b/src/vs/editor/contrib/unicodeHighlighter/browser/bannerController.ts similarity index 97% rename from src/vs/editor/contrib/unicodeHighlighter/bannerController.ts rename to src/vs/editor/contrib/unicodeHighlighter/browser/bannerController.ts index 4276d56c1ff..868a8024e59 100644 --- a/src/vs/editor/contrib/unicodeHighlighter/bannerController.ts +++ b/src/vs/editor/contrib/unicodeHighlighter/browser/bannerController.ts @@ -8,7 +8,7 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { Action } from 'vs/base/common/actions'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { Disposable } from 'vs/base/common/lifecycle'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILinkDescriptor, Link } from 'vs/platform/opener/browser/link'; diff --git a/src/vs/editor/contrib/unicodeHighlighter/unicodeHighlighter.css b/src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.css similarity index 100% rename from src/vs/editor/contrib/unicodeHighlighter/unicodeHighlighter.css rename to src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.css diff --git a/src/vs/editor/contrib/unicodeHighlighter/unicodeHighlighter.ts b/src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.ts similarity index 95% rename from src/vs/editor/contrib/unicodeHighlighter/unicodeHighlighter.ts rename to src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.ts index 5ec996aa213..eb21f65f984 100644 --- a/src/vs/editor/contrib/unicodeHighlighter/unicodeHighlighter.ts +++ b/src/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.ts @@ -16,23 +16,21 @@ import { EditorAction, registerEditorAction, registerEditorContribution, Service import { InUntrustedWorkspace, inUntrustedWorkspace, EditorOption, InternalUnicodeHighlightOptions, unicodeHighlightConfigKeys } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { IModelDecoration, IModelDeltaDecoration, ITextModel, MinimapPosition, OverviewRulerLane, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { IModelDecoration, IModelDeltaDecoration, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { UnicodeHighlighterOptions, UnicodeHighlighterReason, UnicodeHighlighterReasonKind, UnicodeTextModelHighlighter } from 'vs/editor/common/languages/unicodeTextModelHighlighter'; +import { UnicodeHighlighterOptions, UnicodeHighlighterReason, UnicodeHighlighterReasonKind, UnicodeTextModelHighlighter } from 'vs/editor/common/services/unicodeTextModelHighlighter'; import { IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { isModelDecorationInComment, isModelDecorationInString, isModelDecorationVisible } from 'vs/editor/common/viewModel/viewModelDecorations'; -import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/hoverTypes'; -import { MarkdownHover, renderMarkdownHovers } from 'vs/editor/contrib/hover/markdownHoverParticipant'; -import { BannerController } from 'vs/editor/contrib/unicodeHighlighter/bannerController'; +import { HoverAnchor, HoverAnchorType, HoverParticipantRegistry, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes'; +import { MarkdownHover, renderMarkdownHovers } from 'vs/editor/contrib/hover/browser/markdownHoverParticipant'; +import { BannerController } from 'vs/editor/contrib/unicodeHighlighter/browser/bannerController'; import * as nls from 'vs/nls'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { minimapUnicodeHighlight, overviewRulerUnicodeHighlightForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; -import { themeColorFromId } from 'vs/platform/theme/common/themeService'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; export const warningIcon = registerIcon('extensions-warning-message', Codicon.warning, nls.localize('warningIcon', 'Icon shown with a warning message in the extensions editor.')); @@ -240,6 +238,10 @@ class DocumentUnicodeHighlighter extends Disposable { } private _update(): void { + if (this._model.isDisposed()) { + return; + } + if (!this._model.mightContainNonBasicASCII()) { this._decorationIds = new Set(this._editor.deltaDecorations(Array.from(this._decorationIds), [])); return; @@ -249,6 +251,9 @@ class DocumentUnicodeHighlighter extends Disposable { this._editorWorkerService .computedUnicodeHighlights(this._model.uri, this._options) .then((info) => { + if (this._model.isDisposed()) { + return; + } if (this._model.getVersionId() !== modelVersionId) { // model changed in the meantime return; @@ -260,7 +265,10 @@ class DocumentUnicodeHighlighter extends Disposable { // Don't show decoration if there are too many. // In this case, a banner is shown. for (const range of info.ranges) { - decorations.push({ range: range, options: Decorations.instance.getDecoration(!this._options.includeComments, !this._options.includeStrings) }); + decorations.push({ + range: range, + options: Decorations.instance.getDecorationFromOptions(this._options), + }); } } this._decorationIds = new Set(this._editor.deltaDecorations( @@ -278,7 +286,7 @@ class DocumentUnicodeHighlighter extends Disposable { const range = model.getDecorationRange(decorationId)!; const decoration = { range: range, - options: Decorations.instance.getDecoration(!this._options.includeComments, !this._options.includeStrings), + options: Decorations.instance.getDecorationFromOptions(this._options), id: decorationId, ownerId: 0, }; @@ -333,6 +341,10 @@ class ViewportUnicodeHighlighter extends Disposable { } private _update(): void { + if (this._model.isDisposed()) { + return; + } + if (!this._model.mightContainNonBasicASCII()) { this._decorationIds = new Set(this._editor.deltaDecorations(Array.from(this._decorationIds), [])); return; @@ -362,7 +374,7 @@ class ViewportUnicodeHighlighter extends Disposable { // Don't show decorations if there are too many. // A banner will be shown instead. for (const range of totalResult.ranges) { - decorations.push({ range, options: Decorations.instance.getDecoration(!this._options.includeComments, !this._options.includeStrings) }); + decorations.push({ range, options: Decorations.instance.getDecorationFromOptions(this._options) }); } } this._updateState(totalResult); @@ -379,7 +391,7 @@ class ViewportUnicodeHighlighter extends Disposable { const text = model.getValueInRange(range); const decoration = { range: range, - options: Decorations.instance.getDecoration(!this._options.includeComments, !this._options.includeStrings), + options: Decorations.instance.getDecorationFromOptions(this._options), id: decorationId, ownerId: 0, }; @@ -412,6 +424,8 @@ export class UnicodeHighlighterHover implements IHoverPart { export class UnicodeHighlighterHoverParticipant implements IEditorHoverParticipant { + public readonly hoverOrdinal: number = 4; + constructor( private readonly _editor: ICodeEditor, @ILanguageService private readonly _languageService: ILanguageService, @@ -525,7 +539,11 @@ class Decorations { private readonly map = new Map(); - getDecoration(hideInComments: boolean, hideInStrings: boolean): ModelDecorationOptions { + getDecorationFromOptions(options: UnicodeHighlighterOptions): ModelDecorationOptions { + return this.getDecoration(!options.includeComments, !options.includeStrings); + } + + private getDecoration(hideInComments: boolean, hideInStrings: boolean): ModelDecorationOptions { const key = `${hideInComments}${hideInStrings}`; let options = this.map.get(key); if (!options) { @@ -534,14 +552,8 @@ class Decorations { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'unicode-highlight', showIfCollapsed: true, - overviewRuler: { - color: themeColorFromId(overviewRulerUnicodeHighlightForeground), - position: OverviewRulerLane.Center - }, - minimap: { - color: themeColorFromId(minimapUnicodeHighlight), - position: MinimapPosition.Inline - }, + overviewRuler: null, + minimap: null, hideInCommentTokens: hideInComments, hideInStringTokens: hideInStrings, }); @@ -809,3 +821,4 @@ registerEditorAction(DisableHighlightingOfInvisibleCharactersAction); registerEditorAction(DisableHighlightingOfNonBasicAsciiCharactersAction); registerEditorAction(ShowExcludeOptions); registerEditorContribution(UnicodeHighlighter.ID, UnicodeHighlighter); +HoverParticipantRegistry.register(UnicodeHighlighterHoverParticipant); diff --git a/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts b/src/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.ts similarity index 100% rename from src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts rename to src/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.ts diff --git a/src/vs/editor/contrib/viewportSemanticTokens/viewportSemanticTokens.ts b/src/vs/editor/contrib/viewportSemanticTokens/browser/viewportSemanticTokens.ts similarity index 72% rename from src/vs/editor/contrib/viewportSemanticTokens/viewportSemanticTokens.ts rename to src/vs/editor/contrib/viewportSemanticTokens/browser/viewportSemanticTokens.ts index e03bf3c8e69..a37ebe5408b 100644 --- a/src/vs/editor/contrib/viewportSemanticTokens/viewportSemanticTokens.ts +++ b/src/vs/editor/contrib/viewportSemanticTokens/browser/viewportSemanticTokens.ts @@ -10,13 +10,17 @@ import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import { DocumentRangeSemanticTokensProviderRegistry } from 'vs/editor/common/languages'; import { getDocumentRangeSemanticTokens, hasDocumentRangeSemanticTokensProvider } from 'vs/editor/common/services/getSemanticTokens'; import { IModelService } from 'vs/editor/common/services/model'; import { isSemanticColoringEnabled, SEMANTIC_HIGHLIGHTING_SETTING_ID } from 'vs/editor/common/services/modelService'; import { toMultilineTokens2 } from 'vs/editor/common/services/semanticTokensProviderStyling'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { StopWatch } from 'vs/base/common/stopwatch'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { DocumentRangeSemanticTokensProvider } from 'vs/editor/common/languages'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; class ViewportSemanticTokensContribution extends Disposable implements IEditorContribution { @@ -27,6 +31,8 @@ class ViewportSemanticTokensContribution extends Disposable implements IEditorCo } private readonly _editor: ICodeEditor; + private readonly _provider: LanguageFeatureRegistry; + private readonly _debounceInformation: IFeatureDebounceInformation; private readonly _tokenizeViewport: RunOnceScheduler; private _outstandingRequests: CancelablePromise[]; @@ -34,36 +40,45 @@ class ViewportSemanticTokensContribution extends Disposable implements IEditorCo editor: ICodeEditor, @IModelService private readonly _modelService: IModelService, @IThemeService private readonly _themeService: IThemeService, - @IConfigurationService private readonly _configurationService: IConfigurationService + @IConfigurationService private readonly _configurationService: IConfigurationService, + @ILanguageFeatureDebounceService languageFeatureDebounceService: ILanguageFeatureDebounceService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); this._editor = editor; - this._tokenizeViewport = new RunOnceScheduler(() => this._tokenizeViewportNow(), 100); + this._provider = languageFeaturesService.documentRangeSemanticTokensProvider; + this._debounceInformation = languageFeatureDebounceService.for(this._provider, 'DocumentRangeSemanticTokens', { min: 100, max: 500 }); + this._tokenizeViewport = this._register(new RunOnceScheduler(() => this._tokenizeViewportNow(), 100)); this._outstandingRequests = []; + const scheduleTokenizeViewport = () => { + if (this._editor.hasModel()) { + this._tokenizeViewport.schedule(this._debounceInformation.get(this._editor.getModel())); + } + }; this._register(this._editor.onDidScrollChange(() => { - this._tokenizeViewport.schedule(); + scheduleTokenizeViewport(); })); this._register(this._editor.onDidChangeModel(() => { this._cancelAll(); - this._tokenizeViewport.schedule(); + scheduleTokenizeViewport(); })); this._register(this._editor.onDidChangeModelContent((e) => { this._cancelAll(); - this._tokenizeViewport.schedule(); + scheduleTokenizeViewport(); })); - this._register(DocumentRangeSemanticTokensProviderRegistry.onDidChange(() => { + this._register(this._provider.onDidChange(() => { this._cancelAll(); - this._tokenizeViewport.schedule(); + scheduleTokenizeViewport(); })); this._register(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(SEMANTIC_HIGHLIGHTING_SETTING_ID)) { this._cancelAll(); - this._tokenizeViewport.schedule(); + scheduleTokenizeViewport(); } })); this._register(this._themeService.onDidColorThemeChange(() => { this._cancelAll(); - this._tokenizeViewport.schedule(); + scheduleTokenizeViewport(); })); } @@ -97,7 +112,7 @@ class ViewportSemanticTokensContribution extends Disposable implements IEditorCo } return; } - if (!hasDocumentRangeSemanticTokensProvider(model)) { + if (!hasDocumentRangeSemanticTokensProvider(this._provider, model)) { if (model.hasSomeSemanticTokens()) { model.setSemanticTokens(null, false); } @@ -110,8 +125,10 @@ class ViewportSemanticTokensContribution extends Disposable implements IEditorCo private _requestRange(model: ITextModel, range: Range): CancelablePromise { const requestVersionId = model.getVersionId(); - const request = createCancelablePromise(token => Promise.resolve(getDocumentRangeSemanticTokens(model, range, token))); + const request = createCancelablePromise(token => Promise.resolve(getDocumentRangeSemanticTokens(this._provider, model, range, token))); + const sw = new StopWatch(false); request.then((r) => { + this._debounceInformation.update(model, sw.elapsed()); if (!r || !r.tokens || model.isDisposed() || model.getVersionId() !== requestVersionId) { return; } diff --git a/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.ts similarity index 89% rename from src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts rename to src/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.ts index 6dbd9592ebe..32fce4bba3c 100644 --- a/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.ts @@ -13,21 +13,24 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, IActionOptions, registerEditorAction, registerEditorContribution, registerModelAndPositionCommand } from 'vs/editor/browser/editorExtensions'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/cursorEvents'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { IModelDeltaDecoration, ITextModel, IWordAtPosition, MinimapPosition, OverviewRulerLane, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { IModelDeltaDecoration, ITextModel, MinimapPosition, OverviewRulerLane, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { DocumentHighlight, DocumentHighlightKind, DocumentHighlightProviderRegistry } from 'vs/editor/common/languages'; +import { DocumentHighlight, DocumentHighlightKind, DocumentHighlightProvider } from 'vs/editor/common/languages'; import * as nls from 'vs/nls'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { activeContrastBorder, editorSelectionHighlight, editorSelectionHighlightBorder, minimapSelectionOccurrenceHighlight, overviewRulerSelectionHighlightForeground, registerColor } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant, themeColorFromId } from 'vs/platform/theme/common/themeService'; +import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const editorWordHighlight = registerColor('editor.wordHighlightBackground', { dark: '#575757B8', light: '#57575740', hc: null }, nls.localize('wordHighlight', 'Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations.'), true); const editorWordHighlightStrong = registerColor('editor.wordHighlightStrongBackground', { dark: '#004972B8', light: '#0e639c40', hc: null }, nls.localize('wordHighlightStrong', 'Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations.'), true); @@ -37,9 +40,9 @@ const overviewRulerWordHighlightForeground = registerColor('editorOverviewRuler. const overviewRulerWordHighlightStrongForeground = registerColor('editorOverviewRuler.wordHighlightStrongForeground', { dark: '#C0A0C0CC', light: '#C0A0C0CC', hc: '#C0A0C0CC' }, nls.localize('overviewRulerWordHighlightStrongForeground', 'Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.'), true); const ctxHasWordHighlights = new RawContextKey('hasWordHighlights', false); -export function getOccurrencesAtPosition(model: ITextModel, position: Position, token: CancellationToken): Promise { +export function getOccurrencesAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, position: Position, token: CancellationToken): Promise { - const orderedByScore = DocumentHighlightProviderRegistry.ordered(model); + const orderedByScore = registry.ordered(model); // in order of score ask the occurrences provider // until someone response with a good result @@ -59,11 +62,19 @@ interface IOccurenceAtPositionRequest { abstract class OccurenceAtPositionRequest implements IOccurenceAtPositionRequest { private readonly _wordRange: Range | null; - public readonly result: CancelablePromise; + private _result: CancelablePromise | null; + + constructor(private readonly _model: ITextModel, private readonly _selection: Selection, private readonly _wordSeparators: string) { + this._wordRange = this._getCurrentWordRange(_model, _selection); + this._result = null; + } + + get result() { + if (!this._result) { + this._result = createCancelablePromise(token => this._compute(this._model, this._selection, this._wordSeparators, token)); + } + return this._result; - constructor(model: ITextModel, selection: Selection, wordSeparators: string) { - this._wordRange = this._getCurrentWordRange(model, selection); - this.result = createCancelablePromise(token => this._compute(model, selection, wordSeparators, token)); } protected abstract _compute(model: ITextModel, selection: Selection, wordSeparators: string, token: CancellationToken): Promise; @@ -105,8 +116,16 @@ abstract class OccurenceAtPositionRequest implements IOccurenceAtPositionRequest } class SemanticOccurenceAtPositionRequest extends OccurenceAtPositionRequest { + + private readonly _providers: LanguageFeatureRegistry; + + constructor(model: ITextModel, selection: Selection, wordSeparators: string, providers: LanguageFeatureRegistry) { + super(model, selection, wordSeparators); + this._providers = providers; + } + protected _compute(model: ITextModel, selection: Selection, wordSeparators: string, token: CancellationToken): Promise { - return getOccurrencesAtPosition(model, selection.getPosition(), token).then(value => value || []); + return getOccurrencesAtPosition(this._providers, model, selection.getPosition(), token).then(value => value || []); } } @@ -149,18 +168,22 @@ class TextualOccurenceAtPositionRequest extends OccurenceAtPositionRequest { } } -function computeOccurencesAtPosition(model: ITextModel, selection: Selection, wordSeparators: string): IOccurenceAtPositionRequest { - if (DocumentHighlightProviderRegistry.has(model)) { - return new SemanticOccurenceAtPositionRequest(model, selection, wordSeparators); +function computeOccurencesAtPosition(registry: LanguageFeatureRegistry, model: ITextModel, selection: Selection, wordSeparators: string): IOccurenceAtPositionRequest { + if (registry.has(model)) { + return new SemanticOccurenceAtPositionRequest(model, selection, wordSeparators, registry); } return new TextualOccurenceAtPositionRequest(model, selection, wordSeparators); } -registerModelAndPositionCommand('_executeDocumentHighlights', (model, position) => getOccurrencesAtPosition(model, position, CancellationToken.None)); +registerModelAndPositionCommand('_executeDocumentHighlights', (accessor, model, position) => { + const languageFeaturesService = accessor.get(ILanguageFeaturesService); + return getOccurrencesAtPosition(languageFeaturesService.documentHighlightProvider, model, position, CancellationToken.None); +}); class WordHighlighter { private readonly editor: IActiveCodeEditor; + private readonly providers: LanguageFeatureRegistry; private occurrencesHighlight: boolean; private readonly model: ITextModel; private _decorationIds: string[]; @@ -177,8 +200,9 @@ class WordHighlighter { private readonly _hasWordHighlights: IContextKey; private _ignorePositionChangeEvent: boolean; - constructor(editor: IActiveCodeEditor, contextKeyService: IContextKeyService) { + constructor(editor: IActiveCodeEditor, providers: LanguageFeatureRegistry, contextKeyService: IContextKeyService) { this.editor = editor; + this.providers = providers; this._hasWordHighlights = ctxHasWordHighlights.bindTo(contextKeyService); this._ignorePositionChangeEvent = false; this.occurrencesHighlight = this.editor.getOption(EditorOption.occurrencesHighlight); @@ -388,7 +412,7 @@ class WordHighlighter { let myRequestId = ++this.workerRequestTokenId; this.workerRequestCompleted = false; - this.workerRequest = computeOccurencesAtPosition(this.model, this.editor.getSelection(), this.editor.getOption(EditorOption.wordSeparators)); + this.workerRequest = computeOccurencesAtPosition(this.providers, this.model, this.editor.getSelection(), this.editor.getOption(EditorOption.wordSeparators)); this.workerRequest.result.then(data => { if (myRequestId === this.workerRequestTokenId) { @@ -500,12 +524,12 @@ class WordHighlighterContribution extends Disposable implements IEditorContribut private wordHighlighter: WordHighlighter | null; - constructor(editor: ICodeEditor, @IContextKeyService contextKeyService: IContextKeyService) { + constructor(editor: ICodeEditor, @IContextKeyService contextKeyService: IContextKeyService, @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService) { super(); this.wordHighlighter = null; const createWordHighlighterIfPossible = () => { if (editor.hasModel()) { - this.wordHighlighter = new WordHighlighter(editor, contextKeyService); + this.wordHighlighter = new WordHighlighter(editor, languageFeaturesService.documentHighlightProvider, contextKeyService); } }; this._register(editor.onDidChangeModel((e) => { diff --git a/src/vs/editor/contrib/wordOperations/wordOperations.ts b/src/vs/editor/contrib/wordOperations/browser/wordOperations.ts similarity index 98% rename from src/vs/editor/contrib/wordOperations/wordOperations.ts rename to src/vs/editor/contrib/wordOperations/browser/wordOperations.ts index 6e04ed226c0..3c6257885e5 100644 --- a/src/vs/editor/contrib/wordOperations/wordOperations.ts +++ b/src/vs/editor/contrib/wordOperations/browser/wordOperations.ts @@ -8,10 +8,10 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, EditorCommand, ICommandOptions, registerEditorAction, registerEditorCommand, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; import { EditorOption, EditorOptions } from 'vs/editor/common/config/editorOptions'; -import { CursorState } from 'vs/editor/common/controller/cursorCommon'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { DeleteWordContext, WordNavigationType, WordOperations } from 'vs/editor/common/controller/cursorWordOperations'; -import { getMapForWordSeparators, WordCharacterClassifier } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { CursorState } from 'vs/editor/common/cursorCommon'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; +import { DeleteWordContext, WordNavigationType, WordOperations } from 'vs/editor/common/cursor/cursorWordOperations'; +import { getMapForWordSeparators, WordCharacterClassifier } from 'vs/editor/common/core/wordCharacterClassifier'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts similarity index 99% rename from src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts rename to src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts index a31119acbcb..886329de6ab 100644 --- a/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/browser/wordOperations.test.ts @@ -4,16 +4,16 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorCommand } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { ILanguageConfigurationService, LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; -import { deserializePipePositions, serializePipePositions, testRepeatedActionAndExtractPositions } from 'vs/editor/contrib/wordOperations/test/wordTestUtils'; -import { CursorWordAccessibilityLeft, CursorWordAccessibilityLeftSelect, CursorWordAccessibilityRight, CursorWordAccessibilityRightSelect, CursorWordEndLeft, CursorWordEndLeftSelect, CursorWordEndRight, CursorWordEndRightSelect, CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect, CursorWordStartLeft, CursorWordStartLeftSelect, CursorWordStartRight, CursorWordStartRightSelect, DeleteInsideWord, DeleteWordEndLeft, DeleteWordEndRight, DeleteWordLeft, DeleteWordRight, DeleteWordStartLeft, DeleteWordStartRight } from 'vs/editor/contrib/wordOperations/wordOperations'; -import { StaticServiceAccessor } from 'vs/editor/contrib/wordPartOperations/test/utils'; +import { deserializePipePositions, serializePipePositions, testRepeatedActionAndExtractPositions } from 'vs/editor/contrib/wordOperations/test/browser/wordTestUtils'; +import { CursorWordAccessibilityLeft, CursorWordAccessibilityLeftSelect, CursorWordAccessibilityRight, CursorWordAccessibilityRightSelect, CursorWordEndLeft, CursorWordEndLeftSelect, CursorWordEndRight, CursorWordEndRightSelect, CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect, CursorWordStartLeft, CursorWordStartLeftSelect, CursorWordStartRight, CursorWordStartRightSelect, DeleteInsideWord, DeleteWordEndLeft, DeleteWordEndRight, DeleteWordLeft, DeleteWordRight, DeleteWordStartLeft, DeleteWordStartRight } from 'vs/editor/contrib/wordOperations/browser/wordOperations'; +import { StaticServiceAccessor } from 'vs/editor/contrib/wordPartOperations/test/browser/utils'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; diff --git a/src/vs/editor/contrib/wordOperations/test/wordTestUtils.ts b/src/vs/editor/contrib/wordOperations/test/browser/wordTestUtils.ts similarity index 100% rename from src/vs/editor/contrib/wordOperations/test/wordTestUtils.ts rename to src/vs/editor/contrib/wordOperations/test/browser/wordTestUtils.ts diff --git a/src/vs/editor/contrib/wordPartOperations/wordPartOperations.ts b/src/vs/editor/contrib/wordPartOperations/browser/wordPartOperations.ts similarity index 96% rename from src/vs/editor/contrib/wordPartOperations/wordPartOperations.ts rename to src/vs/editor/contrib/wordPartOperations/browser/wordPartOperations.ts index b968fe1276a..7baece69513 100644 --- a/src/vs/editor/contrib/wordPartOperations/wordPartOperations.ts +++ b/src/vs/editor/contrib/wordPartOperations/browser/wordPartOperations.ts @@ -5,13 +5,13 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { registerEditorCommand } from 'vs/editor/browser/editorExtensions'; -import { DeleteWordContext, WordNavigationType, WordPartOperations } from 'vs/editor/common/controller/cursorWordOperations'; -import { WordCharacterClassifier } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { DeleteWordContext, WordNavigationType, WordPartOperations } from 'vs/editor/common/cursor/cursorWordOperations'; +import { WordCharacterClassifier } from 'vs/editor/common/core/wordCharacterClassifier'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel } from 'vs/editor/common/model'; -import { DeleteWordCommand, MoveWordCommand } from 'vs/editor/contrib/wordOperations/wordOperations'; +import { DeleteWordCommand, MoveWordCommand } from 'vs/editor/contrib/wordOperations/browser/wordOperations'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; diff --git a/src/vs/editor/contrib/wordPartOperations/test/utils.ts b/src/vs/editor/contrib/wordPartOperations/test/browser/utils.ts similarity index 100% rename from src/vs/editor/contrib/wordPartOperations/test/utils.ts rename to src/vs/editor/contrib/wordPartOperations/test/browser/utils.ts diff --git a/src/vs/editor/contrib/wordPartOperations/test/wordPartOperations.test.ts b/src/vs/editor/contrib/wordPartOperations/test/browser/wordPartOperations.test.ts similarity index 98% rename from src/vs/editor/contrib/wordPartOperations/test/wordPartOperations.test.ts rename to src/vs/editor/contrib/wordPartOperations/test/browser/wordPartOperations.test.ts index d8e4754dbe6..584ae1c8cf2 100644 --- a/src/vs/editor/contrib/wordPartOperations/test/wordPartOperations.test.ts +++ b/src/vs/editor/contrib/wordPartOperations/test/browser/wordPartOperations.test.ts @@ -8,9 +8,9 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorCommand } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { deserializePipePositions, serializePipePositions, testRepeatedActionAndExtractPositions } from 'vs/editor/contrib/wordOperations/test/wordTestUtils'; -import { StaticServiceAccessor } from 'vs/editor/contrib/wordPartOperations/test/utils'; -import { CursorWordPartLeft, CursorWordPartLeftSelect, CursorWordPartRight, CursorWordPartRightSelect, DeleteWordPartLeft, DeleteWordPartRight } from 'vs/editor/contrib/wordPartOperations/wordPartOperations'; +import { deserializePipePositions, serializePipePositions, testRepeatedActionAndExtractPositions } from 'vs/editor/contrib/wordOperations/test/browser/wordTestUtils'; +import { StaticServiceAccessor } from 'vs/editor/contrib/wordPartOperations/test/browser/utils'; +import { CursorWordPartLeft, CursorWordPartLeftSelect, CursorWordPartRight, CursorWordPartRightSelect, DeleteWordPartLeft, DeleteWordPartRight } from 'vs/editor/contrib/wordPartOperations/browser/wordPartOperations'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; suite('WordPartOperations', () => { diff --git a/src/vs/editor/contrib/zoneWidget/zoneWidget.css b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.css similarity index 100% rename from src/vs/editor/contrib/zoneWidget/zoneWidget.css rename to src/vs/editor/contrib/zoneWidget/browser/zoneWidget.css diff --git a/src/vs/editor/contrib/zoneWidget/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts similarity index 99% rename from src/vs/editor/contrib/zoneWidget/zoneWidget.ts rename to src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts index 671f8e39ad3..c65d7f7e539 100644 --- a/src/vs/editor/contrib/zoneWidget/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts @@ -494,7 +494,7 @@ export abstract class ZoneWidget implements IHorizontalSashLayoutProvider { this._resizeSash.state = SashState.Disabled; } - let data: { startY: number; heightInLines: number; } | undefined; + let data: { startY: number; heightInLines: number } | undefined; this._disposables.add(this._resizeSash.onDidStart((e: ISashEvent) => { if (this._viewZone) { data = { diff --git a/src/vs/editor/editor.all.ts b/src/vs/editor/editor.all.ts index 24db1953ce0..8487300d628 100644 --- a/src/vs/editor/editor.all.ts +++ b/src/vs/editor/editor.all.ts @@ -3,53 +3,53 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/editor/browser/controller/coreCommands'; +import 'vs/editor/browser/coreCommands'; import 'vs/editor/browser/widget/codeEditorWidget'; import 'vs/editor/browser/widget/diffEditorWidget'; import 'vs/editor/browser/widget/diffNavigator'; -import 'vs/editor/contrib/anchorSelect/anchorSelect'; -import 'vs/editor/contrib/bracketMatching/bracketMatching'; -import 'vs/editor/contrib/caretOperations/caretOperations'; -import 'vs/editor/contrib/caretOperations/transpose'; -import 'vs/editor/contrib/clipboard/clipboard'; -import 'vs/editor/contrib/codeAction/codeActionContributions'; -import 'vs/editor/contrib/codelens/codelensController'; -import 'vs/editor/contrib/colorPicker/colorContributions'; -import 'vs/editor/contrib/comment/comment'; -import 'vs/editor/contrib/contextmenu/contextmenu'; -import 'vs/editor/contrib/cursorUndo/cursorUndo'; -import 'vs/editor/contrib/dnd/dnd'; -import 'vs/editor/contrib/find/findController'; -import 'vs/editor/contrib/folding/folding'; -import 'vs/editor/contrib/fontZoom/fontZoom'; -import 'vs/editor/contrib/format/formatActions'; -import 'vs/editor/contrib/documentSymbols/documentSymbols'; -import 'vs/editor/contrib/inlineCompletions/ghostTextController'; -import 'vs/editor/contrib/gotoSymbol/goToCommands'; -import 'vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition'; -import 'vs/editor/contrib/gotoError/gotoError'; -import 'vs/editor/contrib/hover/hover'; -import 'vs/editor/contrib/indentation/indentation'; -import 'vs/editor/contrib/inlayHints/inlayHintsController'; -import 'vs/editor/contrib/inPlaceReplace/inPlaceReplace'; -import 'vs/editor/contrib/lineSelection/lineSelection'; -import 'vs/editor/contrib/linesOperations/linesOperations'; -import 'vs/editor/contrib/linkedEditing/linkedEditing'; -import 'vs/editor/contrib/links/links'; -import 'vs/editor/contrib/multicursor/multicursor'; -import 'vs/editor/contrib/parameterHints/parameterHints'; -import 'vs/editor/contrib/rename/rename'; -import 'vs/editor/contrib/smartSelect/smartSelect'; -import 'vs/editor/contrib/snippet/snippetController2'; -import 'vs/editor/contrib/suggest/suggestController'; -import 'vs/editor/contrib/tokenization/tokenization'; -import 'vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode'; -import 'vs/editor/contrib/unicodeHighlighter/unicodeHighlighter'; -import 'vs/editor/contrib/unusualLineTerminators/unusualLineTerminators'; -import 'vs/editor/contrib/viewportSemanticTokens/viewportSemanticTokens'; -import 'vs/editor/contrib/wordHighlighter/wordHighlighter'; -import 'vs/editor/contrib/wordOperations/wordOperations'; -import 'vs/editor/contrib/wordPartOperations/wordPartOperations'; +import 'vs/editor/contrib/anchorSelect/browser/anchorSelect'; +import 'vs/editor/contrib/bracketMatching/browser/bracketMatching'; +import 'vs/editor/contrib/caretOperations/browser/caretOperations'; +import 'vs/editor/contrib/caretOperations/browser/transpose'; +import 'vs/editor/contrib/clipboard/browser/clipboard'; +import 'vs/editor/contrib/codeAction/browser/codeActionContributions'; +import 'vs/editor/contrib/codelens/browser/codelensController'; +import 'vs/editor/contrib/colorPicker/browser/colorContributions'; +import 'vs/editor/contrib/comment/browser/comment'; +import 'vs/editor/contrib/contextmenu/browser/contextmenu'; +import 'vs/editor/contrib/cursorUndo/browser/cursorUndo'; +import 'vs/editor/contrib/dnd/browser/dnd'; +import 'vs/editor/contrib/find/browser/findController'; +import 'vs/editor/contrib/folding/browser/folding'; +import 'vs/editor/contrib/fontZoom/browser/fontZoom'; +import 'vs/editor/contrib/format/browser/formatActions'; +import 'vs/editor/contrib/documentSymbols/browser/documentSymbols'; +import 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsContribution'; +import 'vs/editor/contrib/gotoSymbol/browser/goToCommands'; +import 'vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition'; +import 'vs/editor/contrib/gotoError/browser/gotoError'; +import 'vs/editor/contrib/hover/browser/hover'; +import 'vs/editor/contrib/indentation/browser/indentation'; +import 'vs/editor/contrib/inlayHints/browser/inlayHintsContribution'; +import 'vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace'; +import 'vs/editor/contrib/lineSelection/browser/lineSelection'; +import 'vs/editor/contrib/linesOperations/browser/linesOperations'; +import 'vs/editor/contrib/linkedEditing/browser/linkedEditing'; +import 'vs/editor/contrib/links/browser/links'; +import 'vs/editor/contrib/multicursor/browser/multicursor'; +import 'vs/editor/contrib/parameterHints/browser/parameterHints'; +import 'vs/editor/contrib/rename/browser/rename'; +import 'vs/editor/contrib/smartSelect/browser/smartSelect'; +import 'vs/editor/contrib/snippet/browser/snippetController2'; +import 'vs/editor/contrib/suggest/browser/suggestController'; +import 'vs/editor/contrib/tokenization/browser/tokenization'; +import 'vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode'; +import 'vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter'; +import 'vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators'; +import 'vs/editor/contrib/viewportSemanticTokens/browser/viewportSemanticTokens'; +import 'vs/editor/contrib/wordHighlighter/browser/wordHighlighter'; +import 'vs/editor/contrib/wordOperations/browser/wordOperations'; +import 'vs/editor/contrib/wordPartOperations/browser/wordPartOperations'; // Load up these strings even in VSCode, even if they are not used // in order to get them translated diff --git a/src/vs/editor/editor.api.ts b/src/vs/editor/editor.api.ts index 02cd7697b4f..2378f8508ef 100644 --- a/src/vs/editor/editor.api.ts +++ b/src/vs/editor/editor.api.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { EditorOptions, WrappingIndent, EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions'; -import { createMonacoBaseAPI } from 'vs/editor/common/standalone/standaloneBase'; +import { createMonacoBaseAPI } from 'vs/editor/common/services/editorBaseApi'; import { createMonacoEditorAPI } from 'vs/editor/standalone/browser/standaloneEditor'; import { createMonacoLanguagesAPI } from 'vs/editor/standalone/browser/standaloneLanguages'; import { globals } from 'vs/base/common/platform'; -import { FormattingConflicts } from 'vs/editor/contrib/format/format'; +import { FormattingConflicts } from 'vs/editor/contrib/format/browser/format'; // Set defaults for standalone editor EditorOptions.wrappingIndent.defaultValue = WrappingIndent.None; diff --git a/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts b/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts index aeb54f64fdd..4e3eb751577 100644 --- a/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts +++ b/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts @@ -19,7 +19,7 @@ import { EditorAction, EditorCommand, registerEditorAction, registerEditorComman import { Selection } from 'vs/editor/common/core/selection'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode'; +import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode'; import { IStandaloneEditorConstructionOptions } from 'vs/editor/standalone/browser/standaloneCodeEditor'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/editor/standalone/browser/colorizer.ts b/src/vs/editor/standalone/browser/colorizer.ts index 810c733521e..e30d28fbebb 100644 --- a/src/vs/editor/standalone/browser/colorizer.ts +++ b/src/vs/editor/standalone/browser/colorizer.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as strings from 'vs/base/common/strings'; -import { IViewLineTokens, LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { IViewLineTokens, LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { ITextModel } from 'vs/editor/common/model'; import { ColorId, FontStyle, ILanguageIdCodec, ITokenizationSupport, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { RenderLineInput, renderViewLine2 as renderViewLine } from 'vs/editor/common/viewLayout/viewLineRenderer'; -import { ViewLineRenderingData } from 'vs/editor/common/viewModel/viewModel'; +import { ViewLineRenderingData } from 'vs/editor/common/viewModel'; import { IStandaloneThemeService } from 'vs/editor/standalone/common/standaloneTheme'; import { MonarchTokenizer } from 'vs/editor/standalone/common/monarch/monarchLexer'; diff --git a/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.ts b/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.ts index 7ef88b1a190..8fb53d4f66c 100644 --- a/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.ts +++ b/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.ts @@ -12,12 +12,11 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { ContentWidgetPositionPreference, IActiveCodeEditor, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { EditorAction, ServicesAccessor, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; -import { Token } from 'vs/editor/common/core/token'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import { FontStyle, IState, ITokenizationSupport, StandardTokenType, TokenMetadata, TokenizationRegistry, ILanguageIdCodec } from 'vs/editor/common/languages'; -import { NullState, nullTokenize, nullTokenizeEncoded } from 'vs/editor/common/languages/nullMode'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { FontStyle, IState, ITokenizationSupport, StandardTokenType, TokenMetadata, TokenizationRegistry, ILanguageIdCodec, Token } from 'vs/editor/common/languages'; +import { NullState, nullTokenize, nullTokenizeEncoded } from 'vs/editor/common/languages/nullTokenize'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IStandaloneThemeService } from 'vs/editor/standalone/common/standaloneTheme'; import { editorHoverBackground, editorHoverBorder, editorHoverForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.ts b/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.ts index 97c3244e891..ebfa9222d40 100644 --- a/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.ts +++ b/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.ts @@ -8,7 +8,7 @@ import { IQuickAccessRegistry, Extensions } from 'vs/platform/quickinput/common/ import { QuickCommandNLS } from 'vs/editor/common/standaloneStrings'; import { ICommandQuickPick } from 'vs/platform/quickinput/browser/commandsQuickAccess'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { AbstractEditorCommandsQuickAccessProvider } from 'vs/editor/contrib/quickAccess/commandsQuickAccess'; +import { AbstractEditorCommandsQuickAccessProvider } from 'vs/editor/contrib/quickAccess/browser/commandsQuickAccess'; import { IEditor } from 'vs/editor/common/editorCommon'; import { withNullAsUndefined } from 'vs/base/common/types'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.ts b/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.ts index 9698e2dfd39..578c44f1d3c 100644 --- a/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.ts +++ b/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { AbstractGotoLineQuickAccessProvider } from 'vs/editor/contrib/quickAccess/gotoLineQuickAccess'; +import { AbstractGotoLineQuickAccessProvider } from 'vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess'; import { Registry } from 'vs/platform/registry/common/platform'; import { IQuickAccessRegistry, Extensions } from 'vs/platform/quickinput/common/quickAccess'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; diff --git a/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.ts b/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.ts index 73fd0d4d4fc..b479fd5c2d6 100644 --- a/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.ts +++ b/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/base/browser/ui/codicons/codiconStyles'; // The codicon symbol styles are defined here and must be loaded -import 'vs/editor/contrib/symbolIcons/symbolIcons'; // The codicon symbol colors are defined here and must be loaded to get colors -import { AbstractGotoSymbolQuickAccessProvider } from 'vs/editor/contrib/quickAccess/gotoSymbolQuickAccess'; +import 'vs/editor/contrib/symbolIcons/browser/symbolIcons'; // The codicon symbol colors are defined here and must be loaded to get colors +import { AbstractGotoSymbolQuickAccessProvider } from 'vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess'; import { Registry } from 'vs/platform/registry/common/platform'; import { IQuickAccessRegistry, Extensions } from 'vs/platform/quickinput/common/quickAccess'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -18,7 +18,8 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; -import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/outlineModel'; +import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class StandaloneGotoSymbolQuickAccessProvider extends AbstractGotoSymbolQuickAccessProvider { @@ -26,9 +27,10 @@ export class StandaloneGotoSymbolQuickAccessProvider extends AbstractGotoSymbolQ constructor( @ICodeEditorService private readonly editorService: ICodeEditorService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, @IOutlineModelService outlineModelService: IOutlineModelService, ) { - super(outlineModelService); + super(languageFeaturesService, outlineModelService); } protected get activeTextEditorControl() { diff --git a/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch.ts b/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch.ts index 9222a29a49e..e726783017d 100644 --- a/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch.ts +++ b/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch.ts @@ -6,7 +6,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { ReferencesController } from 'vs/editor/contrib/gotoSymbol/peek/referencesController'; +import { ReferencesController } from 'vs/editor/contrib/gotoSymbol/browser/peek/referencesController'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index 5e2e06a886e..ad20d8ee612 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -5,7 +5,7 @@ import * as aria from 'vs/base/browser/ui/aria/aria'; import { Disposable, IDisposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { ICodeEditor, IDiffEditor, IDiffEditorConstructionOptions, IEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, IDiffEditor, IDiffEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget'; @@ -31,11 +31,13 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService import { IEditorProgressService } from 'vs/platform/progress/common/progress'; import { StandaloneThemeService } from 'vs/editor/standalone/browser/standaloneThemeService'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageSelection, ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageSelection, ILanguageService } from 'vs/editor/common/languages/language'; import { URI } from 'vs/base/common/uri'; import { StandaloneCodeEditorService } from 'vs/editor/standalone/browser/standaloneCodeEditorService'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; /** * Description of an action contribution @@ -272,11 +274,12 @@ export class StandaloneCodeEditor extends CodeEditorWidget implements IStandalon @INotificationService notificationService: INotificationService, @IAccessibilityService accessibilityService: IAccessibilityService, @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { const options = { ..._options }; options.ariaLabel = options.ariaLabel || StandaloneCodeEditorNLS.editorViewAccessibleLabel; options.ariaLabel = options.ariaLabel + ';' + (StandaloneCodeEditorNLS.accessibilityHelpMessage); - super(domElement, options, {}, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService); + super(domElement, options, {}, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService); if (keybindingService instanceof StandaloneKeybindingService) { this._standaloneKeybindingService = keybindingService; @@ -414,6 +417,7 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon @IModelService modelService: IModelService, @ILanguageService languageService: ILanguageService, @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { const options = { ..._options }; updateConfigurationService(configurationService, options, false); @@ -426,7 +430,7 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon } const _model: ITextModel | null | undefined = options.model; delete options.model; - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService, themeService, notificationService, accessibilityService, languageConfigurationService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService); this._configurationService = configurationService; this._standaloneThemeService = themeService; diff --git a/src/vs/editor/standalone/browser/standaloneEditor.ts b/src/vs/editor/standalone/browser/standaloneEditor.ts index f4d225c26f3..f6f4600ed03 100644 --- a/src/vs/editor/standalone/browser/standaloneEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneEditor.ts @@ -13,13 +13,12 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { DiffNavigator, IDiffNavigator } from 'vs/editor/browser/widget/diffNavigator'; import { ApplyUpdateResult, ConfigurationChangedEvent, EditorOptions } from 'vs/editor/common/config/editorOptions'; import { BareFontInfo, FontInfo } from 'vs/editor/common/config/fontInfo'; -import { Token } from 'vs/editor/common/core/token'; import { EditorType } from 'vs/editor/common/editorCommon'; import { FindMatch, ITextModel, TextModelResolvedOptions } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { NullState, nullTokenize } from 'vs/editor/common/languages/nullMode'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { NullState, nullTokenize } from 'vs/editor/common/languages/nullTokenize'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { createWebWorker as actualCreateWebWorker, IWebWorkerOptions, MonacoWebWorker } from 'vs/editor/browser/services/webWorker'; import * as standaloneEnums from 'vs/editor/common/standalone/standaloneEnums'; @@ -113,7 +112,7 @@ export function setModelMarkers(model: ITextModel, owner: string, markers: IMark * * @returns list of markers */ -export function getModelMarkers(filter: { owner?: string, resource?: URI, take?: number }): IMarker[] { +export function getModelMarkers(filter: { owner?: string; resource?: URI; take?: number }): IMarker[] { const markerService = StandaloneServices.get(IMarkerService); return markerService.read(filter); } @@ -165,7 +164,7 @@ export function onWillDisposeModel(listener: (model: ITextModel) => void): IDisp * Emitted when a different language is set to a model. * @event */ -export function onDidChangeModelLanguage(listener: (e: { readonly model: ITextModel; readonly oldLanguage: string; }) => void): IDisposable { +export function onDidChangeModelLanguage(listener: (e: { readonly model: ITextModel; readonly oldLanguage: string }) => void): IDisposable { const modelService = StandaloneServices.get(IModelService); return modelService.onModelLanguageChanged((e) => { listener({ @@ -215,27 +214,27 @@ export function colorizeModelLine(model: ITextModel, lineNumber: number, tabSize /** * @internal */ -function getSafeTokenizationSupport(language: string): Omit { - const tokenizationSupport = modes.TokenizationRegistry.get(language); +function getSafeTokenizationSupport(language: string): Omit { + const tokenizationSupport = languages.TokenizationRegistry.get(language); if (tokenizationSupport) { return tokenizationSupport; } return { getInitialState: () => NullState, - tokenize: (line: string, hasEOL: boolean, state: modes.IState) => nullTokenize(language, state) + tokenize: (line: string, hasEOL: boolean, state: languages.IState) => nullTokenize(language, state) }; } /** * Tokenize `text` using language `languageId` */ -export function tokenize(text: string, languageId: string): Token[][] { +export function tokenize(text: string, languageId: string): languages.Token[][] { // Needed in order to get the mode registered for subsequent look-ups - modes.TokenizationRegistry.getOrCreate(languageId); + languages.TokenizationRegistry.getOrCreate(languageId); const tokenizationSupport = getSafeTokenizationSupport(languageId); const lines = splitLines(text); - const result: Token[][] = []; + const result: languages.Token[][] = []; let state = tokenizationSupport.getInitialState(); for (let i = 0, len = lines.length; i < len; i++) { const line = lines[i]; @@ -332,6 +331,7 @@ export function createMonacoEditorAPI(): typeof monaco.editor { TrackedRangeStickiness: standaloneEnums.TrackedRangeStickiness, WrappingIndent: standaloneEnums.WrappingIndent, InjectedTextCursorStops: standaloneEnums.InjectedTextCursorStops, + PositionAffinity: standaloneEnums.PositionAffinity, // classes ConfigurationChangedEvent: ConfigurationChangedEvent, diff --git a/src/vs/editor/standalone/browser/standaloneLanguages.ts b/src/vs/editor/standalone/browser/standaloneLanguages.ts index afb9aa1dc9a..dbf5359e1a5 100644 --- a/src/vs/editor/standalone/browser/standaloneLanguages.ts +++ b/src/vs/editor/standalone/browser/standaloneLanguages.ts @@ -8,13 +8,12 @@ import { Color } from 'vs/base/common/color'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { Token, TokenizationResult, EncodedTokenizationResult } from 'vs/editor/common/core/token'; import * as model from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { LanguageConfiguration } from 'vs/editor/common/languages/languageConfiguration'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageExtensionPoint, ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageExtensionPoint, ILanguageService } from 'vs/editor/common/languages/language'; import * as standaloneEnums from 'vs/editor/common/standalone/standaloneEnums'; import { StandaloneServices } from 'vs/editor/standalone/browser/standaloneServices'; import { compile } from 'vs/editor/standalone/common/monarch/monarchCompile'; @@ -22,6 +21,7 @@ import { MonarchTokenizer } from 'vs/editor/standalone/common/monarch/monarchLex import { IMonarchLanguage } from 'vs/editor/standalone/common/monarch/monarchTypes'; import { IStandaloneThemeService } from 'vs/editor/standalone/common/standaloneTheme'; import { IMarkerData, IMarkerService } from 'vs/platform/markers/common/markers'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; /** * Register information about a new language. @@ -75,7 +75,7 @@ export function setLanguageConfiguration(languageId: string, configuration: Lang /** * @internal */ -export class EncodedTokenizationSupportAdapter implements modes.ITokenizationSupport { +export class EncodedTokenizationSupportAdapter implements languages.ITokenizationSupport { private readonly _languageId: string; private readonly _actual: EncodedTokensProvider; @@ -85,27 +85,27 @@ export class EncodedTokenizationSupportAdapter implements modes.ITokenizationSup this._actual = actual; } - public getInitialState(): modes.IState { + public getInitialState(): languages.IState { return this._actual.getInitialState(); } - public tokenize(line: string, hasEOL: boolean, state: modes.IState): TokenizationResult { + public tokenize(line: string, hasEOL: boolean, state: languages.IState): languages.TokenizationResult { if (typeof this._actual.tokenize === 'function') { - return TokenizationSupportAdapter.adaptTokenize(this._languageId, <{ tokenize(line: string, state: modes.IState): ILineTokens; }>this._actual, line, state); + return TokenizationSupportAdapter.adaptTokenize(this._languageId, <{ tokenize(line: string, state: languages.IState): ILineTokens }>this._actual, line, state); } throw new Error('Not supported!'); } - public tokenizeEncoded(line: string, hasEOL: boolean, state: modes.IState): EncodedTokenizationResult { + public tokenizeEncoded(line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult { const result = this._actual.tokenizeEncoded(line, state); - return new EncodedTokenizationResult(result.tokens, result.endState); + return new languages.EncodedTokenizationResult(result.tokens, result.endState); } } /** * @internal */ -export class TokenizationSupportAdapter implements modes.ITokenizationSupport { +export class TokenizationSupportAdapter implements languages.ITokenizationSupport { constructor( private readonly _languageId: string, @@ -115,12 +115,12 @@ export class TokenizationSupportAdapter implements modes.ITokenizationSupport { ) { } - public getInitialState(): modes.IState { + public getInitialState(): languages.IState { return this._actual.getInitialState(); } - private static _toClassicTokens(tokens: IToken[], language: string): Token[] { - const result: Token[] = []; + private static _toClassicTokens(tokens: IToken[], language: string): languages.Token[] { + const result: languages.Token[] = []; let previousStartIndex: number = 0; for (let i = 0, len = tokens.length; i < len; i++) { const t = tokens[i]; @@ -135,18 +135,18 @@ export class TokenizationSupportAdapter implements modes.ITokenizationSupport { startIndex = previousStartIndex; } - result[i] = new Token(startIndex, t.scopes, language); + result[i] = new languages.Token(startIndex, t.scopes, language); previousStartIndex = startIndex; } return result; } - public static adaptTokenize(language: string, actual: { tokenize(line: string, state: modes.IState): ILineTokens; }, line: string, state: modes.IState): TokenizationResult { + public static adaptTokenize(language: string, actual: { tokenize(line: string, state: languages.IState): ILineTokens }, line: string, state: languages.IState): languages.TokenizationResult { const actualResult = actual.tokenize(line, state); const tokens = TokenizationSupportAdapter._toClassicTokens(actualResult.tokens, language); - let endState: modes.IState; + let endState: languages.IState; // try to save an object if possible if (actualResult.endState.equals(state)) { endState = state; @@ -154,14 +154,14 @@ export class TokenizationSupportAdapter implements modes.ITokenizationSupport { endState = actualResult.endState; } - return new TokenizationResult(tokens, endState); + return new languages.TokenizationResult(tokens, endState); } - public tokenize(line: string, hasEOL: boolean, state: modes.IState): TokenizationResult { + public tokenize(line: string, hasEOL: boolean, state: languages.IState): languages.TokenizationResult { return TokenizationSupportAdapter.adaptTokenize(this._languageId, this._actual, line, state); } - private _toBinaryTokens(languageIdCodec: modes.ILanguageIdCodec, tokens: IToken[]): Uint32Array { + private _toBinaryTokens(languageIdCodec: languages.ILanguageIdCodec, tokens: IToken[]): Uint32Array { const languageId = languageIdCodec.encodeLanguageId(this._languageId); const tokenTheme = this._standaloneThemeService.getColorTheme().tokenTheme; @@ -200,11 +200,11 @@ export class TokenizationSupportAdapter implements modes.ITokenizationSupport { return actualResult; } - public tokenizeEncoded(line: string, hasEOL: boolean, state: modes.IState): EncodedTokenizationResult { + public tokenizeEncoded(line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult { const actualResult = this._actual.tokenize(line, state); const tokens = this._toBinaryTokens(this._languageService.languageIdCodec, actualResult.tokens); - let endState: modes.IState; + let endState: languages.IState; // try to save an object if possible if (actualResult.endState.equals(state)) { endState = state; @@ -212,7 +212,7 @@ export class TokenizationSupportAdapter implements modes.ITokenizationSupport { endState = actualResult.endState; } - return new EncodedTokenizationResult(tokens, endState); + return new languages.EncodedTokenizationResult(tokens, endState); } } @@ -236,7 +236,7 @@ export interface ILineTokens { * The tokenization end state. * A pointer will be held to this and the object should not be modified by the tokenizer after the pointer is returned. */ - endState: modes.IState; + endState: languages.IState; } /** @@ -268,14 +268,14 @@ export interface IEncodedLineTokens { * The tokenization end state. * A pointer will be held to this and the object should not be modified by the tokenizer after the pointer is returned. */ - endState: modes.IState; + endState: languages.IState; } /** * A factory for token providers. */ export interface TokensProviderFactory { - create(): modes.ProviderResult; + create(): languages.ProviderResult; } /** @@ -285,11 +285,11 @@ export interface TokensProvider { /** * The initial state of a language. Will be the state passed in to tokenize the first line. */ - getInitialState(): modes.IState; + getInitialState(): languages.IState; /** * Tokenize a line given the state at the beginning of the line. */ - tokenize(line: string, state: modes.IState): ILineTokens; + tokenize(line: string, state: languages.IState): ILineTokens; } /** @@ -299,15 +299,15 @@ export interface EncodedTokensProvider { /** * The initial state of a language. Will be the state passed in to tokenize the first line. */ - getInitialState(): modes.IState; + getInitialState(): languages.IState; /** * Tokenize a line given the state at the beginning of the line. */ - tokenizeEncoded(line: string, state: modes.IState): IEncodedLineTokens; + tokenizeEncoded(line: string, state: languages.IState): IEncodedLineTokens; /** * Tokenize a line given the state at the beginning of the line. */ - tokenize?(line: string, state: modes.IState): ILineTokens; + tokenize?(line: string, state: languages.IState): ILineTokens; } function isATokensProvider(provider: TokensProvider | EncodedTokensProvider | IMonarchLanguage): provider is TokensProvider | EncodedTokensProvider { @@ -361,8 +361,8 @@ function createTokenizationSupportAdapter(languageId: string, provider: TokensPr * with a tokens provider set using `registerDocumentSemanticTokensProvider` or `registerDocumentRangeSemanticTokensProvider`. */ export function registerTokensProviderFactory(languageId: string, factory: TokensProviderFactory): IDisposable { - const adaptedFactory: modes.ITokenizationSupportFactory = { - createTokenizationSupport: async (): Promise => { + const adaptedFactory: languages.ITokenizationSupportFactory = { + createTokenizationSupport: async (): Promise => { const result = await Promise.resolve(factory.create()); if (!result) { return null; @@ -373,7 +373,7 @@ export function registerTokensProviderFactory(languageId: string, factory: Token return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, result)); } }; - return modes.TokenizationRegistry.registerFactory(languageId, adaptedFactory); + return languages.TokenizationRegistry.registerFactory(languageId, adaptedFactory); } /** @@ -390,7 +390,7 @@ export function setTokensProvider(languageId: string, provider: TokensProvider | if (isThenable(provider)) { return registerTokensProviderFactory(languageId, { create: () => provider }); } - return modes.TokenizationRegistry.register(languageId, createTokenizationSupportAdapter(languageId, provider)); + return languages.TokenizationRegistry.register(languageId, createTokenizationSupportAdapter(languageId, provider)); } /** @@ -406,39 +406,43 @@ export function setMonarchTokensProvider(languageId: string, languageDef: IMonar if (isThenable(languageDef)) { return registerTokensProviderFactory(languageId, { create: () => languageDef }); } - return modes.TokenizationRegistry.register(languageId, create(languageDef)); + return languages.TokenizationRegistry.register(languageId, create(languageDef)); } /** * Register a reference provider (used by e.g. reference search). */ -export function registerReferenceProvider(languageId: string, provider: modes.ReferenceProvider): IDisposable { - return modes.ReferenceProviderRegistry.register(languageId, provider); +export function registerReferenceProvider(languageId: string, provider: languages.ReferenceProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.referenceProvider.register(languageId, provider); } /** * Register a rename provider (used by e.g. rename symbol). */ -export function registerRenameProvider(languageId: string, provider: modes.RenameProvider): IDisposable { - return modes.RenameProviderRegistry.register(languageId, provider); +export function registerRenameProvider(languageId: string, provider: languages.RenameProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.renameProvider.register(languageId, provider); } /** * Register a signature help provider (used by e.g. parameter hints). */ -export function registerSignatureHelpProvider(languageId: string, provider: modes.SignatureHelpProvider): IDisposable { - return modes.SignatureHelpProviderRegistry.register(languageId, provider); +export function registerSignatureHelpProvider(languageId: string, provider: languages.SignatureHelpProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.signatureHelpProvider.register(languageId, provider); } /** * Register a hover provider (used by e.g. editor hover). */ -export function registerHoverProvider(languageId: string, provider: modes.HoverProvider): IDisposable { - return modes.HoverProviderRegistry.register(languageId, { - provideHover: (model: model.ITextModel, position: Position, token: CancellationToken): Promise => { +export function registerHoverProvider(languageId: string, provider: languages.HoverProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.hoverProvider.register(languageId, { + provideHover: (model: model.ITextModel, position: Position, token: CancellationToken): Promise => { const word = model.getWordAtPosition(position); - return Promise.resolve(provider.provideHover(model, position, token)).then((value): modes.Hover | undefined => { + return Promise.resolve(provider.provideHover(model, position, token)).then((value): languages.Hover | undefined => { if (!value) { return undefined; } @@ -457,59 +461,67 @@ export function registerHoverProvider(languageId: string, provider: modes.HoverP /** * Register a document symbol provider (used by e.g. outline). */ -export function registerDocumentSymbolProvider(languageId: string, provider: modes.DocumentSymbolProvider): IDisposable { - return modes.DocumentSymbolProviderRegistry.register(languageId, provider); +export function registerDocumentSymbolProvider(languageId: string, provider: languages.DocumentSymbolProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentSymbolProvider.register(languageId, provider); } /** * Register a document highlight provider (used by e.g. highlight occurrences). */ -export function registerDocumentHighlightProvider(languageId: string, provider: modes.DocumentHighlightProvider): IDisposable { - return modes.DocumentHighlightProviderRegistry.register(languageId, provider); +export function registerDocumentHighlightProvider(languageId: string, provider: languages.DocumentHighlightProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentHighlightProvider.register(languageId, provider); } /** * Register an linked editing range provider. */ -export function registerLinkedEditingRangeProvider(languageId: string, provider: modes.LinkedEditingRangeProvider): IDisposable { - return modes.LinkedEditingRangeProviderRegistry.register(languageId, provider); +export function registerLinkedEditingRangeProvider(languageId: string, provider: languages.LinkedEditingRangeProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.linkedEditingRangeProvider.register(languageId, provider); } /** * Register a definition provider (used by e.g. go to definition). */ -export function registerDefinitionProvider(languageId: string, provider: modes.DefinitionProvider): IDisposable { - return modes.DefinitionProviderRegistry.register(languageId, provider); +export function registerDefinitionProvider(languageId: string, provider: languages.DefinitionProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.definitionProvider.register(languageId, provider); } /** * Register a implementation provider (used by e.g. go to implementation). */ -export function registerImplementationProvider(languageId: string, provider: modes.ImplementationProvider): IDisposable { - return modes.ImplementationProviderRegistry.register(languageId, provider); +export function registerImplementationProvider(languageId: string, provider: languages.ImplementationProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.implementationProvider.register(languageId, provider); } /** * Register a type definition provider (used by e.g. go to type definition). */ -export function registerTypeDefinitionProvider(languageId: string, provider: modes.TypeDefinitionProvider): IDisposable { - return modes.TypeDefinitionProviderRegistry.register(languageId, provider); +export function registerTypeDefinitionProvider(languageId: string, provider: languages.TypeDefinitionProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.typeDefinitionProvider.register(languageId, provider); } /** * Register a code lens provider (used by e.g. inline code lenses). */ -export function registerCodeLensProvider(languageId: string, provider: modes.CodeLensProvider): IDisposable { - return modes.CodeLensProviderRegistry.register(languageId, provider); +export function registerCodeLensProvider(languageId: string, provider: languages.CodeLensProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.codeLensProvider.register(languageId, provider); } /** * Register a code action provider (used by e.g. quick fix). */ export function registerCodeActionProvider(languageId: string, provider: CodeActionProvider, metadata?: CodeActionProviderMetadata): IDisposable { - return modes.CodeActionProviderRegistry.register(languageId, { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.codeActionProvider.register(languageId, { providedCodeActionKinds: metadata?.providedCodeActionKinds, - provideCodeActions: (model: model.ITextModel, range: Range, context: modes.CodeActionContext, token: CancellationToken): modes.ProviderResult => { + provideCodeActions: (model: model.ITextModel, range: Range, context: languages.CodeActionContext, token: CancellationToken): languages.ProviderResult => { const markerService = StandaloneServices.get(IMarkerService); const markers = markerService.read({ resource: model.uri }).filter(m => { return Range.areIntersectingOrTouching(m, range); @@ -523,64 +535,73 @@ export function registerCodeActionProvider(languageId: string, provider: CodeAct /** * Register a formatter that can handle only entire models. */ -export function registerDocumentFormattingEditProvider(languageId: string, provider: modes.DocumentFormattingEditProvider): IDisposable { - return modes.DocumentFormattingEditProviderRegistry.register(languageId, provider); +export function registerDocumentFormattingEditProvider(languageId: string, provider: languages.DocumentFormattingEditProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentFormattingEditProvider.register(languageId, provider); } /** * Register a formatter that can handle a range inside a model. */ -export function registerDocumentRangeFormattingEditProvider(languageId: string, provider: modes.DocumentRangeFormattingEditProvider): IDisposable { - return modes.DocumentRangeFormattingEditProviderRegistry.register(languageId, provider); +export function registerDocumentRangeFormattingEditProvider(languageId: string, provider: languages.DocumentRangeFormattingEditProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentRangeFormattingEditProvider.register(languageId, provider); } /** * Register a formatter than can do formatting as the user types. */ -export function registerOnTypeFormattingEditProvider(languageId: string, provider: modes.OnTypeFormattingEditProvider): IDisposable { - return modes.OnTypeFormattingEditProviderRegistry.register(languageId, provider); +export function registerOnTypeFormattingEditProvider(languageId: string, provider: languages.OnTypeFormattingEditProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.onTypeFormattingEditProvider.register(languageId, provider); } /** * Register a link provider that can find links in text. */ -export function registerLinkProvider(languageId: string, provider: modes.LinkProvider): IDisposable { - return modes.LinkProviderRegistry.register(languageId, provider); +export function registerLinkProvider(languageId: string, provider: languages.LinkProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.linkProvider.register(languageId, provider); } /** * Register a completion item provider (use by e.g. suggestions). */ -export function registerCompletionItemProvider(languageId: string, provider: modes.CompletionItemProvider): IDisposable { - return modes.CompletionProviderRegistry.register(languageId, provider); +export function registerCompletionItemProvider(languageId: string, provider: languages.CompletionItemProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.completionProvider.register(languageId, provider); } /** * Register a document color provider (used by Color Picker, Color Decorator). */ -export function registerColorProvider(languageId: string, provider: modes.DocumentColorProvider): IDisposable { - return modes.ColorProviderRegistry.register(languageId, provider); +export function registerColorProvider(languageId: string, provider: languages.DocumentColorProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.colorProvider.register(languageId, provider); } /** * Register a folding range provider */ -export function registerFoldingRangeProvider(languageId: string, provider: modes.FoldingRangeProvider): IDisposable { - return modes.FoldingRangeProviderRegistry.register(languageId, provider); +export function registerFoldingRangeProvider(languageId: string, provider: languages.FoldingRangeProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.foldingRangeProvider.register(languageId, provider); } /** * Register a declaration provider */ -export function registerDeclarationProvider(languageId: string, provider: modes.DeclarationProvider): IDisposable { - return modes.DeclarationProviderRegistry.register(languageId, provider); +export function registerDeclarationProvider(languageId: string, provider: languages.DeclarationProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.declarationProvider.register(languageId, provider); } /** * Register a selection range provider */ -export function registerSelectionRangeProvider(languageId: string, provider: modes.SelectionRangeProvider): IDisposable { - return modes.SelectionRangeRegistry.register(languageId, provider); +export function registerSelectionRangeProvider(languageId: string, provider: languages.SelectionRangeProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.selectionRangeProvider.register(languageId, provider); } /** @@ -590,8 +611,9 @@ export function registerSelectionRangeProvider(languageId: string, provider: mod * * For the best user experience, register both a semantic tokens provider and a top-down tokenizer. */ -export function registerDocumentSemanticTokensProvider(languageId: string, provider: modes.DocumentSemanticTokensProvider): IDisposable { - return modes.DocumentSemanticTokensProviderRegistry.register(languageId, provider); +export function registerDocumentSemanticTokensProvider(languageId: string, provider: languages.DocumentSemanticTokensProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentSemanticTokensProvider.register(languageId, provider); } /** @@ -601,22 +623,25 @@ export function registerDocumentSemanticTokensProvider(languageId: string, provi * * For the best user experience, register both a semantic tokens provider and a top-down tokenizer. */ -export function registerDocumentRangeSemanticTokensProvider(languageId: string, provider: modes.DocumentRangeSemanticTokensProvider): IDisposable { - return modes.DocumentRangeSemanticTokensProviderRegistry.register(languageId, provider); +export function registerDocumentRangeSemanticTokensProvider(languageId: string, provider: languages.DocumentRangeSemanticTokensProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.documentRangeSemanticTokensProvider.register(languageId, provider); } /** * Register an inline completions provider. */ -export function registerInlineCompletionsProvider(languageId: string, provider: modes.InlineCompletionsProvider): IDisposable { - return modes.InlineCompletionsProviderRegistry.register(languageId, provider); +export function registerInlineCompletionsProvider(languageId: string, provider: languages.InlineCompletionsProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.inlineCompletionsProvider.register(languageId, provider); } /** * Register an inlay hints provider. */ -export function registerInlayHintsProvider(languageId: string, provider: modes.InlayHintsProvider): IDisposable { - return modes.InlayHintsProviderRegistry.register(languageId, provider); +export function registerInlayHintsProvider(languageId: string, provider: languages.InlayHintsProvider): IDisposable { + const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService); + return languageFeaturesService.inlayHintsProvider.register(languageId, provider); } /** @@ -644,12 +669,12 @@ export interface CodeActionProvider { /** * Provide commands for the given document and range. */ - provideCodeActions(model: model.ITextModel, range: Range, context: CodeActionContext, token: CancellationToken): modes.ProviderResult; + provideCodeActions(model: model.ITextModel, range: Range, context: CodeActionContext, token: CancellationToken): languages.ProviderResult; /** * Given a code action fill in the edit. Will only invoked when missing. */ - resolveCodeAction?(codeAction: modes.CodeAction, token: CancellationToken): modes.ProviderResult; + resolveCodeAction?(codeAction: languages.CodeAction, token: CancellationToken): languages.ProviderResult; } @@ -725,6 +750,6 @@ export function createMonacoLanguagesAPI(): typeof monaco.languages { InlineCompletionTriggerKind: standaloneEnums.InlineCompletionTriggerKind, // classes - FoldingRangeKind: modes.FoldingRangeKind, + FoldingRangeKind: languages.FoldingRangeKind, }; } diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index 0b658f5b130..3e53572dd10 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -7,6 +7,7 @@ import 'vs/editor/common/languages/languageConfigurationRegistry'; import 'vs/editor/standalone/browser/standaloneCodeEditorService'; import 'vs/editor/standalone/browser/standaloneLayoutService'; import 'vs/platform/undoRedo/common/undoRedoService'; +import 'vs/editor/common/services/languageFeatureDebounce'; import * as strings from 'vs/base/common/strings'; import * as dom from 'vs/base/browser/dom'; @@ -19,10 +20,10 @@ import Severity from 'vs/base/common/severity'; import { URI } from 'vs/base/common/uri'; import { IBulkEditOptions, IBulkEditResult, IBulkEditService, ResourceEdit, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService'; import { isDiffEditorConfigurationKey, isEditorConfigurationKey } from 'vs/editor/common/config/editorConfigurationSchema'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { IPosition, Position as Pos } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { IIdentifiedSingleEditOperation, ITextModel, ITextSnapshot } from 'vs/editor/common/model'; +import { ITextModel, ITextSnapshot } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; import { IResolvedTextEditorModel, ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { ITextResourceConfigurationService, ITextResourcePropertiesService, ITextResourceConfigurationChangeEvent } from 'vs/editor/common/services/textResourceConfiguration'; @@ -42,8 +43,7 @@ import { ILabelService, ResourceLabelFormatter, IFormatterChangeEvent } from 'vs import { INotification, INotificationHandle, INotificationService, IPromptChoice, IPromptOptions, NoOpNotification, IStatusMessageOptions, NotificationsFilter } from 'vs/platform/notification/common/notification'; import { IProgressRunner, IEditorProgressService } from 'vs/platform/progress/common/progress'; import { ITelemetryInfo, ITelemetryService, TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; -import { IWorkspace, IWorkspaceContextService, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, IWorkspaceFoldersWillChangeEvent, WorkbenchState, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, IWorkspace, IWorkspaceContextService, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, IWorkspaceFoldersWillChangeEvent, WorkbenchState, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { StandaloneServicesNLS } from 'vs/editor/common/standaloneStrings'; import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; @@ -62,7 +62,7 @@ import { getSingletonServiceDescriptors, registerSingleton } from 'vs/platform/i import { OpenerService } from 'vs/editor/browser/services/openerService'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { EditorWorkerService } from 'vs/editor/browser/services/editorWorkerService'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { MarkerDecorationsService } from 'vs/editor/common/services/markerDecorationsService'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markerDecorations'; import { ModelService } from 'vs/editor/common/services/modelService'; @@ -86,6 +86,8 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IStorageService, InMemoryStorageService } from 'vs/platform/storage/common/storage'; +import 'vs/editor/common/services/languageFeaturesService'; + class SimpleModel implements IResolvedTextEditorModel { private readonly model: ITextModel; @@ -764,7 +766,7 @@ class StandaloneBulkEditService implements IBulkEditService { async apply(edits: ResourceEdit[], _options?: IBulkEditOptions): Promise { - const textEdits = new Map(); + const textEdits = new Map(); for (let edit of edits) { if (!(edit instanceof ResourceTextEdit)) { @@ -808,7 +810,7 @@ class StandaloneUriLabelService implements ILabelService { public readonly onDidChangeFormatters: Event = Event.None; - public getUriLabel(resource: URI, options?: { relative?: boolean, forceNoTildify?: boolean }): string { + public getUriLabel(resource: URI, options?: { relative?: boolean; forceNoTildify?: boolean }): string { if (resource.scheme === 'file') { return resource.fsPath; } @@ -819,7 +821,7 @@ class StandaloneUriLabelService implements ILabelService { return basename(resource); } - public getWorkspaceLabel(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace, options?: { verbose: boolean; }): string { + public getWorkspaceLabel(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace, options?: { verbose: boolean }): string { return ''; } @@ -1000,6 +1002,13 @@ export module StandaloneServices { } initialized = true; + // Add singletons that were registered after this module loaded + for (const [id, descriptor] of getSingletonServiceDescriptors()) { + if (!serviceCollection.get(id)) { + serviceCollection.set(id, descriptor); + } + } + // Initialize the service collection with the overrides, but only if the // service was not instantiated in the meantime. for (const serviceId in overrides) { diff --git a/src/vs/editor/standalone/browser/standaloneThemeService.ts b/src/vs/editor/standalone/browser/standaloneThemeService.ts index 32fca3d7bbb..025cc66a24c 100644 --- a/src/vs/editor/standalone/browser/standaloneThemeService.ts +++ b/src/vs/editor/standalone/browser/standaloneThemeService.ts @@ -32,7 +32,7 @@ class StandaloneTheme implements IStandaloneTheme { private readonly themeData: IStandaloneThemeData; private colors: Map | null; - private readonly defaultColors: { [colorId: string]: Color | undefined; }; + private readonly defaultColors: { [colorId: string]: Color | undefined }; private _tokenTheme: TokenTheme | null; constructor(name: string, standaloneThemeData: IStandaloneThemeData) { @@ -354,7 +354,7 @@ export class StandaloneThemeService extends Disposable implements IStandaloneThe private _updateThemeOrColorMap(): void { const cssRules: string[] = []; - const hasRule: { [rule: string]: boolean; } = {}; + const hasRule: { [rule: string]: boolean } = {}; const ruleCollector: ICssStyleCollector = { addRule: (rule: string) => { if (!hasRule[rule]) { diff --git a/src/vs/editor/standalone/common/monarch/monarchCommon.ts b/src/vs/editor/standalone/common/monarch/monarchCommon.ts index bd96a9f0879..9c7febccbc8 100644 --- a/src/vs/editor/standalone/common/monarch/monarchCommon.ts +++ b/src/vs/editor/standalone/common/monarch/monarchCommon.ts @@ -28,7 +28,7 @@ export interface ILexerMin { unicode: boolean; usesEmbedded: boolean; defaultToken: string; - stateNames: { [stateName: string]: any; }; + stateNames: { [stateName: string]: any }; [attr: string]: any; } @@ -39,7 +39,7 @@ export interface ILexer extends ILexerMin { unicode: boolean; tokenPostfix: string; - tokenizer: { [stateName: string]: IRule[]; }; + tokenizer: { [stateName: string]: IRule[] }; brackets: IBracket[]; } diff --git a/src/vs/editor/standalone/common/monarch/monarchLexer.ts b/src/vs/editor/standalone/common/monarch/monarchLexer.ts index 3b40159d476..bdc490fdb41 100644 --- a/src/vs/editor/standalone/common/monarch/monarchLexer.ts +++ b/src/vs/editor/standalone/common/monarch/monarchLexer.ts @@ -9,11 +9,10 @@ */ import { IDisposable } from 'vs/base/common/lifecycle'; -import { Token, TokenizationResult, EncodedTokenizationResult } from 'vs/editor/common/core/token'; -import * as modes from 'vs/editor/common/languages'; -import { NullState } from 'vs/editor/common/languages/nullMode'; +import * as languages from 'vs/editor/common/languages'; +import { NullState } from 'vs/editor/common/languages/nullTokenize'; import { TokenTheme } from 'vs/editor/common/languages/supports/tokenization'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import * as monarchCommon from 'vs/editor/standalone/common/monarch/monarchCommon'; import { IStandaloneThemeService } from 'vs/editor/standalone/common/standaloneTheme'; @@ -30,7 +29,7 @@ class MonarchStackElementFactory { } private readonly _maxCacheDepth: number; - private readonly _entries: { [stackElementId: string]: MonarchStackElement; }; + private readonly _entries: { [stackElementId: string]: MonarchStackElement }; constructor(maxCacheDepth: number) { this._maxCacheDepth = maxCacheDepth; @@ -126,9 +125,9 @@ class MonarchStackElement { class EmbeddedLanguageData { public readonly languageId: string; - public readonly state: modes.IState; + public readonly state: languages.IState; - constructor(languageId: string, state: modes.IState) { + constructor(languageId: string, state: languages.IState) { this.languageId = languageId; this.state = state; } @@ -161,7 +160,7 @@ class MonarchLineStateFactory { } private readonly _maxCacheDepth: number; - private readonly _entries: { [stackElementId: string]: MonarchLineState; }; + private readonly _entries: { [stackElementId: string]: MonarchLineState }; constructor(maxCacheDepth: number) { this._maxCacheDepth = maxCacheDepth; @@ -189,7 +188,7 @@ class MonarchLineStateFactory { } } -class MonarchLineState implements modes.IState { +class MonarchLineState implements languages.IState { public readonly stack: MonarchStackElement; public readonly embeddedLanguageData: EmbeddedLanguageData | null; @@ -202,7 +201,7 @@ class MonarchLineState implements modes.IState { this.embeddedLanguageData = embeddedLanguageData; } - public clone(): modes.IState { + public clone(): languages.IState { const embeddedlanguageDataClone = this.embeddedLanguageData ? this.embeddedLanguageData.clone() : null; // save an object if (embeddedlanguageDataClone === this.embeddedLanguageData) { @@ -211,7 +210,7 @@ class MonarchLineState implements modes.IState { return MonarchLineStateFactory.create(this.stack, this.embeddedLanguageData); } - public equals(other: modes.IState): boolean { + public equals(other: languages.IState): boolean { if (!(other instanceof MonarchLineState)) { return false; } @@ -231,12 +230,12 @@ class MonarchLineState implements modes.IState { interface IMonarchTokensCollector { enterLanguage(languageId: string): void; emit(startOffset: number, type: string): void; - nestedLanguageTokenize(embeddedLanguageLine: string, hasEOL: boolean, embeddedLanguageData: EmbeddedLanguageData, offsetDelta: number): modes.IState; + nestedLanguageTokenize(embeddedLanguageLine: string, hasEOL: boolean, embeddedLanguageData: EmbeddedLanguageData, offsetDelta: number): languages.IState; } class MonarchClassicTokensCollector implements IMonarchTokensCollector { - private _tokens: Token[]; + private _tokens: languages.Token[]; private _languageId: string | null; private _lastTokenType: string | null; private _lastTokenLanguage: string | null; @@ -258,14 +257,14 @@ class MonarchClassicTokensCollector implements IMonarchTokensCollector { } this._lastTokenType = type; this._lastTokenLanguage = this._languageId; - this._tokens.push(new Token(startOffset, type, this._languageId!)); + this._tokens.push(new languages.Token(startOffset, type, this._languageId!)); } - public nestedLanguageTokenize(embeddedLanguageLine: string, hasEOL: boolean, embeddedLanguageData: EmbeddedLanguageData, offsetDelta: number): modes.IState { + public nestedLanguageTokenize(embeddedLanguageLine: string, hasEOL: boolean, embeddedLanguageData: EmbeddedLanguageData, offsetDelta: number): languages.IState { const nestedLanguageId = embeddedLanguageData.languageId; const embeddedModeState = embeddedLanguageData.state; - const nestedLanguageTokenizationSupport = modes.TokenizationRegistry.get(nestedLanguageId); + const nestedLanguageTokenizationSupport = languages.TokenizationRegistry.get(nestedLanguageId); if (!nestedLanguageTokenizationSupport) { this.enterLanguage(nestedLanguageId); this.emit(offsetDelta, ''); @@ -275,7 +274,7 @@ class MonarchClassicTokensCollector implements IMonarchTokensCollector { const nestedResult = nestedLanguageTokenizationSupport.tokenize(embeddedLanguageLine, hasEOL, embeddedModeState); if (offsetDelta !== 0) { for (const token of nestedResult.tokens) { - this._tokens.push(new Token(token.offset + offsetDelta, token.type, token.language)); + this._tokens.push(new languages.Token(token.offset + offsetDelta, token.type, token.language)); } } else { this._tokens = this._tokens.concat(nestedResult.tokens); @@ -286,8 +285,8 @@ class MonarchClassicTokensCollector implements IMonarchTokensCollector { return nestedResult.endState; } - public finalize(endState: MonarchLineState): TokenizationResult { - return new TokenizationResult(this._tokens, endState); + public finalize(endState: MonarchLineState): languages.TokenizationResult { + return new languages.TokenizationResult(this._tokens, endState); } } @@ -297,7 +296,7 @@ class MonarchModernTokensCollector implements IMonarchTokensCollector { private readonly _theme: TokenTheme; private _prependTokens: Uint32Array | null; private _tokens: number[]; - private _currentLanguageId: modes.LanguageId; + private _currentLanguageId: languages.LanguageId; private _lastTokenMetadata: number; constructor(languageService: ILanguageService, theme: TokenTheme) { @@ -305,7 +304,7 @@ class MonarchModernTokensCollector implements IMonarchTokensCollector { this._theme = theme; this._prependTokens = null; this._tokens = []; - this._currentLanguageId = modes.LanguageId.Null; + this._currentLanguageId = languages.LanguageId.Null; this._lastTokenMetadata = 0; } @@ -351,11 +350,11 @@ class MonarchModernTokensCollector implements IMonarchTokensCollector { return result; } - public nestedLanguageTokenize(embeddedLanguageLine: string, hasEOL: boolean, embeddedLanguageData: EmbeddedLanguageData, offsetDelta: number): modes.IState { + public nestedLanguageTokenize(embeddedLanguageLine: string, hasEOL: boolean, embeddedLanguageData: EmbeddedLanguageData, offsetDelta: number): languages.IState { const nestedLanguageId = embeddedLanguageData.languageId; const embeddedModeState = embeddedLanguageData.state; - const nestedLanguageTokenizationSupport = modes.TokenizationRegistry.get(nestedLanguageId); + const nestedLanguageTokenizationSupport = languages.TokenizationRegistry.get(nestedLanguageId); if (!nestedLanguageTokenizationSupport) { this.enterLanguage(nestedLanguageId); this.emit(offsetDelta, ''); @@ -376,23 +375,23 @@ class MonarchModernTokensCollector implements IMonarchTokensCollector { return nestedResult.endState; } - public finalize(endState: MonarchLineState): EncodedTokenizationResult { - return new EncodedTokenizationResult( + public finalize(endState: MonarchLineState): languages.EncodedTokenizationResult { + return new languages.EncodedTokenizationResult( MonarchModernTokensCollector._merge(this._prependTokens, this._tokens, null), endState ); } } -export type ILoadStatus = { loaded: true; } | { loaded: false; promise: Promise; }; +export type ILoadStatus = { loaded: true } | { loaded: false; promise: Promise }; -export class MonarchTokenizer implements modes.ITokenizationSupport { +export class MonarchTokenizer implements languages.ITokenizationSupport { private readonly _languageService: ILanguageService; private readonly _standaloneThemeService: IStandaloneThemeService; private readonly _languageId: string; private readonly _lexer: monarchCommon.ILexer; - private readonly _embeddedLanguages: { [languageId: string]: boolean; }; + private readonly _embeddedLanguages: { [languageId: string]: boolean }; public embeddedLoaded: Promise; private readonly _tokenizationRegistryListener: IDisposable; @@ -406,7 +405,7 @@ export class MonarchTokenizer implements modes.ITokenizationSupport { // Set up listening for embedded modes let emitting = false; - this._tokenizationRegistryListener = modes.TokenizationRegistry.onDidChange((e) => { + this._tokenizationRegistryListener = languages.TokenizationRegistry.onDidChange((e) => { if (emitting) { return; } @@ -420,7 +419,7 @@ export class MonarchTokenizer implements modes.ITokenizationSupport { } if (isOneOfMyEmbeddedModes) { emitting = true; - modes.TokenizationRegistry.fire([this._languageId]); + languages.TokenizationRegistry.fire([this._languageId]); emitting = false; } }); @@ -433,7 +432,7 @@ export class MonarchTokenizer implements modes.ITokenizationSupport { public getLoadStatus(): ILoadStatus { const promises: Thenable[] = []; for (let nestedLanguageId in this._embeddedLanguages) { - const tokenizationSupport = modes.TokenizationRegistry.get(nestedLanguageId); + const tokenizationSupport = languages.TokenizationRegistry.get(nestedLanguageId); if (tokenizationSupport) { // The nested language is already loaded if (tokenizationSupport instanceof MonarchTokenizer) { @@ -445,9 +444,9 @@ export class MonarchTokenizer implements modes.ITokenizationSupport { continue; } - if (!modes.TokenizationRegistry.isResolved(nestedLanguageId)) { + if (!languages.TokenizationRegistry.isResolved(nestedLanguageId)) { // The nested language is in the process of being loaded - promises.push(modes.TokenizationRegistry.getOrCreate(nestedLanguageId)); + promises.push(languages.TokenizationRegistry.getOrCreate(nestedLanguageId)); } } @@ -462,18 +461,18 @@ export class MonarchTokenizer implements modes.ITokenizationSupport { }; } - public getInitialState(): modes.IState { + public getInitialState(): languages.IState { const rootState = MonarchStackElementFactory.create(null, this._lexer.start!); return MonarchLineStateFactory.create(rootState, null); } - public tokenize(line: string, hasEOL: boolean, lineState: modes.IState): TokenizationResult { + public tokenize(line: string, hasEOL: boolean, lineState: languages.IState): languages.TokenizationResult { const tokensCollector = new MonarchClassicTokensCollector(); const endLineState = this._tokenize(line, hasEOL, lineState, tokensCollector); return tokensCollector.finalize(endLineState); } - public tokenizeEncoded(line: string, hasEOL: boolean, lineState: modes.IState): EncodedTokenizationResult { + public tokenizeEncoded(line: string, hasEOL: boolean, lineState: languages.IState): languages.EncodedTokenizationResult { const tokensCollector = new MonarchModernTokensCollector(this._languageService, this._standaloneThemeService.getColorTheme().tokenTheme); const endLineState = this._tokenize(line, hasEOL, lineState, tokensCollector); return tokensCollector.finalize(endLineState); @@ -572,7 +571,7 @@ export class MonarchTokenizer implements modes.ITokenizationSupport { interface GroupMatching { matches: string[]; rule: monarchCommon.IRule | null; - groups: { action: monarchCommon.FuzzyAction; matched: string; }[]; + groups: { action: monarchCommon.FuzzyAction; matched: string }[]; } let groupMatching: GroupMatching | null = null; @@ -865,11 +864,11 @@ export class MonarchTokenizer implements modes.ITokenizationSupport { if (languageId !== this._languageId) { // Fire language loading event - modes.TokenizationRegistry.getOrCreate(languageId); + languages.TokenizationRegistry.getOrCreate(languageId); this._embeddedLanguages[languageId] = true; } - const tokenizationSupport = modes.TokenizationRegistry.get(languageId); + const tokenizationSupport = languages.TokenizationRegistry.get(languageId); if (tokenizationSupport) { return new EmbeddedLanguageData(languageId, tokenizationSupport.getInitialState()); } diff --git a/src/vs/editor/standalone/common/standaloneTheme.ts b/src/vs/editor/standalone/common/standaloneTheme.ts index 78988e643f3..5be2dd3d110 100644 --- a/src/vs/editor/standalone/common/standaloneTheme.ts +++ b/src/vs/editor/standalone/common/standaloneTheme.ts @@ -11,7 +11,7 @@ import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeServic export const IStandaloneThemeService = createDecorator('themeService'); export type BuiltinTheme = 'vs' | 'vs-dark' | 'hc-black'; -export type IColors = { [colorId: string]: string; }; +export type IColors = { [colorId: string]: string }; export interface IStandaloneThemeData { base: BuiltinTheme; diff --git a/src/vs/editor/standalone/common/themes.ts b/src/vs/editor/standalone/common/themes.ts index 748bc4b1b9e..d7fefbc15d5 100644 --- a/src/vs/editor/standalone/common/themes.ts +++ b/src/vs/editor/standalone/common/themes.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { editorActiveIndentGuides, editorIndentGuides } from 'vs/editor/common/view/editorColorRegistry'; +import { editorActiveIndentGuides, editorIndentGuides } from 'vs/editor/common/core/editorColorRegistry'; import { IStandaloneThemeData } from 'vs/editor/standalone/common/standaloneTheme'; import { editorBackground, editorForeground, editorInactiveSelection, editorSelectionHighlight } from 'vs/platform/theme/common/colorRegistry'; diff --git a/src/vs/editor/standalone/test/browser/monarch.test.ts b/src/vs/editor/standalone/test/browser/monarch.test.ts index d423e251162..4e7c94577ee 100644 --- a/src/vs/editor/standalone/test/browser/monarch.test.ts +++ b/src/vs/editor/standalone/test/browser/monarch.test.ts @@ -5,11 +5,10 @@ import * as assert from 'assert'; import { LanguageService } from 'vs/editor/common/services/languageService'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { MonarchTokenizer } from 'vs/editor/standalone/common/monarch/monarchLexer'; import { compile } from 'vs/editor/standalone/common/monarch/monarchCompile'; -import { Token } from 'vs/editor/common/core/token'; -import { TokenizationRegistry } from 'vs/editor/common/languages'; +import { Token, TokenizationRegistry } from 'vs/editor/common/languages'; import { IMonarchLanguage } from 'vs/editor/standalone/common/monarch/monarchTypes'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; diff --git a/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts b/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts index d476945d427..1b268940fd1 100644 --- a/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts +++ b/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts @@ -7,8 +7,7 @@ import * as assert from 'assert'; import { Color } from 'vs/base/common/color'; import { Emitter } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { Token } from 'vs/editor/common/core/token'; -import { IState, LanguageId, MetadataConsts } from 'vs/editor/common/languages'; +import { Token, IState, LanguageId, MetadataConsts } from 'vs/editor/common/languages'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; import { TokenTheme } from 'vs/editor/common/languages/supports/tokenization'; import { LanguageService } from 'vs/editor/common/services/languageService'; diff --git a/src/vs/editor/test/browser/commands/shiftCommand.test.ts b/src/vs/editor/test/browser/commands/shiftCommand.test.ts index 0cf6c975ec7..fe5b6186816 100644 --- a/src/vs/editor/test/browser/commands/shiftCommand.test.ts +++ b/src/vs/editor/test/browser/commands/shiftCommand.test.ts @@ -7,18 +7,18 @@ import * as assert from 'assert'; import { ShiftCommand } from 'vs/editor/common/commands/shiftCommand'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { getEditOperation, testCommand } from 'vs/editor/test/browser/testCommand'; import { withEditorModel } from 'vs/editor/test/common/testTextModel'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { javascriptOnEnterRules } from 'vs/editor/test/common/modes/supports/javascriptOnEnterRules'; import { EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; /** * Create single edit operation */ -export function createSingleEditOp(text: string, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): IIdentifiedSingleEditOperation { +export function createSingleEditOp(text: string, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): ISingleEditOperation { return { range: new Range(selectionLineNumber, selectionColumn, positionLineNumber, positionColumn), text: text, @@ -952,7 +952,7 @@ suite('Editor Commands - ShiftCommand', () => { // 3 => 2 testIndentation(4, 4, ' ', 2, 3); - function _assertUnshiftCommand(tabSize: number, indentSize: number, insertSpaces: boolean, text: string[], expected: IIdentifiedSingleEditOperation[]): void { + function _assertUnshiftCommand(tabSize: number, indentSize: number, insertSpaces: boolean, text: string[], expected: ISingleEditOperation[]): void { return withEditorModel(text, (model) => { let op = new ShiftCommand(new Selection(1, 1, text.length + 1, 1), { isUnshift: true, @@ -967,7 +967,7 @@ suite('Editor Commands - ShiftCommand', () => { }); } - function _assertShiftCommand(tabSize: number, indentSize: number, insertSpaces: boolean, text: string[], expected: IIdentifiedSingleEditOperation[]): void { + function _assertShiftCommand(tabSize: number, indentSize: number, insertSpaces: boolean, text: string[], expected: ISingleEditOperation[]): void { return withEditorModel(text, (model) => { let op = new ShiftCommand(new Selection(1, 1, text.length + 1, 1), { isUnshift: false, diff --git a/src/vs/editor/test/browser/commands/sideEditing.test.ts b/src/vs/editor/test/browser/commands/sideEditing.test.ts index f8a8bbae532..ff6ddbb8217 100644 --- a/src/vs/editor/test/browser/commands/sideEditing.test.ts +++ b/src/vs/editor/test/browser/commands/sideEditing.test.ts @@ -4,14 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; -function testCommand(lines: string[], selections: Selection[], edits: IIdentifiedSingleEditOperation[], expectedLines: string[], expectedSelections: Selection[]): void { +function testCommand(lines: string[], selections: Selection[], edits: ISingleEditOperation[], expectedLines: string[], expectedSelections: Selection[]): void { withTestCodeEditor(lines, {}, (editor, viewModel) => { const model = editor.getModel()!; diff --git a/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts b/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts index 035ff1852a6..e72e03ccea3 100644 --- a/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts +++ b/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts @@ -5,17 +5,17 @@ import * as assert from 'assert'; import { TrimTrailingWhitespaceCommand, trimTrailingWhitespace } from 'vs/editor/common/commands/trimTrailingWhitespaceCommand'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; import { getEditOperation } from 'vs/editor/test/browser/testCommand'; import { withEditorModel } from 'vs/editor/test/common/testTextModel'; /** * Create single edit operation */ -function createInsertDeleteSingleEditOp(text: string | null, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): IIdentifiedSingleEditOperation { +function createInsertDeleteSingleEditOp(text: string | null, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): ISingleEditOperation { return { range: new Range(selectionLineNumber, selectionColumn, positionLineNumber, positionColumn), text: text @@ -25,7 +25,7 @@ function createInsertDeleteSingleEditOp(text: string | null, positionLineNumber: /** * Create single edit operation */ -export function createSingleEditOp(text: string | null, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): IIdentifiedSingleEditOperation { +export function createSingleEditOp(text: string | null, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): ISingleEditOperation { return { range: new Range(selectionLineNumber, selectionColumn, positionLineNumber, positionColumn), text: text, @@ -33,7 +33,7 @@ export function createSingleEditOp(text: string | null, positionLineNumber: numb }; } -function assertTrimTrailingWhitespaceCommand(text: string[], expected: IIdentifiedSingleEditOperation[]): void { +function assertTrimTrailingWhitespaceCommand(text: string[], expected: ISingleEditOperation[]): void { return withEditorModel(text, (model) => { let op = new TrimTrailingWhitespaceCommand(new Selection(1, 1, 1, 1), []); let actual = getEditOperation(model, op); @@ -41,7 +41,7 @@ function assertTrimTrailingWhitespaceCommand(text: string[], expected: IIdentifi }); } -function assertTrimTrailingWhitespace(text: string[], cursors: Position[], expected: IIdentifiedSingleEditOperation[]): void { +function assertTrimTrailingWhitespace(text: string[], cursors: Position[], expected: ISingleEditOperation[]): void { return withEditorModel(text, (model) => { let actual = trimTrailingWhitespace(model, cursors); assert.deepStrictEqual(actual, expected); diff --git a/src/vs/editor/test/browser/controller/cursor.test.ts b/src/vs/editor/test/browser/controller/cursor.test.ts index 809bb2fd03b..069bedc6062 100644 --- a/src/vs/editor/test/browser/controller/cursor.test.ts +++ b/src/vs/editor/test/browser/controller/cursor.test.ts @@ -4,29 +4,29 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { CoreEditingCommands, CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands, CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; import { EndOfLinePreference, EndOfLineSequence, ITextModel } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { IState, ITokenizationSupport, MetadataConsts, StandardTokenType, TokenizationRegistry } from 'vs/editor/common/languages'; +import { EncodedTokenizationResult, IState, ITokenizationSupport, MetadataConsts, StandardTokenType, TokenizationRegistry } from 'vs/editor/common/languages'; import { IndentAction, IndentationRule } from 'vs/editor/common/languages/languageConfiguration'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { NullState } from 'vs/editor/common/languages/nullMode'; +import { NullState } from 'vs/editor/common/languages/nullTokenize'; import { withTestCodeEditor, TestCodeEditorInstantiationOptions, ITestCodeEditor, createCodeEditorServices } from 'vs/editor/test/browser/testCodeEditor'; import { IRelaxedTextModelCreationOptions, createTextModel, instantiateTextModel } from 'vs/editor/test/common/testTextModel'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { javascriptOnEnterRules } from 'vs/editor/test/common/modes/supports/javascriptOnEnterRules'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; -import { OutgoingViewModelEventKind } from 'vs/editor/common/viewModel/viewModelEventDispatcher'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { OutgoingViewModelEventKind } from 'vs/editor/common/viewModelEventDispatcher'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; +import { ICursorPositionChangedEvent } from 'vs/editor/common/cursorEvents'; // --------- utils @@ -1230,6 +1230,38 @@ suite('Editor Controller - Cursor', () => { ]); }); }); + + test('setSelection / setPosition with source', () => { + + const tokenizationSupport: ITokenizationSupport = { + getInitialState: () => NullState, + tokenize: undefined!, + tokenizeEncoded: (line: string, hasEOL: boolean, state: IState): EncodedTokenizationResult => { + return new EncodedTokenizationResult(new Uint32Array(0), state); + } + }; + + const LANGUAGE_ID = 'modelModeTest1'; + const languageRegistration = TokenizationRegistry.register(LANGUAGE_ID, tokenizationSupport); + let model = createTextModel('Just text', LANGUAGE_ID); + + withTestCodeEditor(model, {}, (editor1, cursor1) => { + let event: ICursorPositionChangedEvent | undefined = undefined; + editor1.onDidChangeCursorPosition(e => { + event = e; + }); + + editor1.setSelection(new Range(1, 2, 1, 3), 'navigation'); + assert.strictEqual(event!.source, 'navigation'); + + event = undefined; + editor1.setPosition(new Position(1, 2), 'navigation'); + assert.strictEqual(event!.source, 'navigation'); + }); + + languageRegistration.dispose(); + model.dispose(); + }); }); class SurroundingMode extends MockMode { @@ -4830,7 +4862,7 @@ suite('autoClosingPairs', () => { tokenize: undefined!, tokenizeEncoded: function (line: string, hasEOL: boolean, _state: IState): EncodedTokenizationResult { let state = _state; - const tokens: { length: number; type: StandardTokenType; }[] = []; + const tokens: { length: number; type: StandardTokenType }[] = []; const generateToken = (length: number, type: StandardTokenType, newState?: State) => { if (tokens.length > 0 && tokens[tokens.length - 1].type === type) { // grow last tokens @@ -4977,7 +5009,7 @@ suite('autoClosingPairs', () => { test('issue #132912: quotes should not auto-close if they are closing a string', () => { const disposables = new DisposableStore(); const instantiationService = createCodeEditorServices(disposables); - const languageService = instantiationService.invokeFunction((accessor) => accessor.get(ILanguageService)); + const languageService = instantiationService.get(ILanguageService); const mode = disposables.add(new AutoClosingMode(languageService)); withTestCodeEditor( disposables.add(instantiateTextModel(instantiationService, 'const t2 = `something ${t1}', mode.languageId)), diff --git a/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts b/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts index bc4e38bc5ac..62d00dc365b 100644 --- a/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts +++ b/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; -import { CursorMove } from 'vs/editor/common/controller/cursorMoveCommands'; +import { CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; +import { CursorMove } from 'vs/editor/common/cursor/cursorMoveCommands'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/test/browser/controller/imeRecordedTypes.ts b/src/vs/editor/test/browser/controller/imeRecordedTypes.ts index 01224552e45..70499b308f1 100644 --- a/src/vs/editor/test/browser/controller/imeRecordedTypes.ts +++ b/src/vs/editor/test/browser/controller/imeRecordedTypes.ts @@ -50,9 +50,9 @@ export type IRecordedEvent = IRecordedKeyboardEvent | IRecordedCompositionEvent export interface IRecorded { env: { - OS: OperatingSystem, - browser: IBrowser - } + OS: OperatingSystem; + browser: IBrowser; + }; initial: IRecordedTextareaState; events: IRecordedEvent[]; final: IRecordedTextareaState; diff --git a/src/vs/editor/test/browser/services/openerService.test.ts b/src/vs/editor/test/browser/services/openerService.test.ts index cd1e0509a6f..53a0ae396c8 100644 --- a/src/vs/editor/test/browser/services/openerService.test.ts +++ b/src/vs/editor/test/browser/services/openerService.test.ts @@ -275,4 +275,28 @@ suite('OpenerService', function () { assert.deepStrictEqual(result.resolved.toString(), 'file:///Users/user/folder'); disposable.dispose(); }); + + test('vscode.open command can\'t open HTTP URL with hash (#) in it [extension development] #140907', async function () { + const openerService = new OpenerService(editorService, NullCommandService); + + let actual: string[] = []; + + openerService.setDefaultExternalOpener({ + async openExternal(href) { + actual.push(href); + return true; + } + }); + + const href = 'https://gitlab.com/viktomas/test-project/merge_requests/new?merge_request%5Bsource_branch%5D=test-%23-hash'; + const uri = URI.parse(href); + + assert.ok(await openerService.open(uri)); + assert.ok(await openerService.open(href)); + + assert.deepStrictEqual(actual, [ + encodeURI(uri.toString(true)), // BAD, the encoded # (%23) is double encoded to %2523 (% is double encoded) + href // good + ]); + }); }); diff --git a/src/vs/editor/test/browser/testCodeEditor.ts b/src/vs/editor/test/browser/testCodeEditor.ts index 93cb029166d..84235b3d056 100644 --- a/src/vs/editor/test/browser/testCodeEditor.ts +++ b/src/vs/editor/test/browser/testCodeEditor.ts @@ -4,26 +4,29 @@ *--------------------------------------------------------------------------------------------*/ import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { ICodeEditor, IActiveCodeEditor, IEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; -import { IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; +import { EditorConfiguration, IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; +import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { View } from 'vs/editor/browser/view/view'; +import { View } from 'vs/editor/browser/view'; import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { ITextBufferFactory, ITextModel } from 'vs/editor/common/model'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { ITextBufferFactory, ITextModel } from 'vs/editor/common/model'; +import { ILanguageFeatureDebounceService, LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { LanguageService } from 'vs/editor/common/services/languageService'; import { IModelService } from 'vs/editor/common/services/model'; import { ModelService } from 'vs/editor/common/services/modelService'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { LanguageService } from 'vs/editor/common/services/languageService'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfiguration'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; -import { TestCodeEditorService, TestCommandService } from 'vs/editor/test/browser/editorTestServices'; -import { instantiateTextModel } from 'vs/editor/test/common/testTextModel'; import { TestConfiguration } from 'vs/editor/test/browser/config/testConfiguration'; +import { TestCodeEditorService, TestCommandService } from 'vs/editor/test/browser/editorTestServices'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; import { TestTextResourcePropertiesService } from 'vs/editor/test/common/services/testTextResourcePropertiesService'; +import { instantiateTextModel } from 'vs/editor/test/common/testTextModel'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; @@ -32,8 +35,8 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogService'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { BrandedService, IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; -import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -44,8 +47,6 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { UndoRedoService } from 'vs/platform/undoRedo/common/undoRedoService'; -import { EditorConfiguration } from 'vs/editor/browser/config/editorConfiguration'; -import { ILanguageFeatureDebounceService, LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; export interface ITestCodeEditor extends IActiveCodeEditor { getViewModel(): ViewModel | undefined; @@ -76,8 +77,8 @@ export class TestCodeEditor extends CodeEditorWidget implements ICodeEditor { public getViewModel(): ViewModel | undefined { return this._modelData ? this._modelData.viewModel : undefined; } - public registerAndInstantiateContribution(id: string, ctor: new (editor: ICodeEditor, ...services: Services) => T): T { - const r: T = this._instantiationService.createInstance(ctor as IEditorContributionCtor, this); + public registerAndInstantiateContribution(id: string, ctor: new (editor: ICodeEditor, ...services: BrandedService[]) => T): T { + const r: T = this._instantiationService.createInstance(ctor, this); this._contributions[id] = r; return r; } @@ -173,6 +174,7 @@ export function createCodeEditorServices(disposables: DisposableStore, services: define(ICommandService, TestCommandService); define(ITelemetryService, NullTelemetryServiceShape); define(ILanguageFeatureDebounceService, LanguageFeatureDebounceService); + define(ILanguageFeaturesService, LanguageFeaturesService); const instantiationService = new TestInstantiationService(services); disposables.add(toDisposable(() => { diff --git a/src/vs/editor/test/browser/testCommand.ts b/src/vs/editor/test/browser/testCommand.ts index 578886db2f8..bb397f60135 100644 --- a/src/vs/editor/test/browser/testCommand.ts +++ b/src/vs/editor/test/browser/testCommand.ts @@ -7,11 +7,12 @@ import * as assert from 'assert'; import { IRange } from 'vs/editor/common/core/range'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; import { ICommand, IEditOperationBuilder } from 'vs/editor/common/editorCommon'; -import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; import { instantiateTestCodeEditor, createCodeEditorServices } from 'vs/editor/test/browser/testCodeEditor'; import { instantiateTextModel } from 'vs/editor/test/common/testTextModel'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; export function testCommand( lines: string[], @@ -51,8 +52,8 @@ export function testCommand( /** * Extract edit operations if command `command` were to execute on model `model` */ -export function getEditOperation(model: ITextModel, command: ICommand): IIdentifiedSingleEditOperation[] { - let operations: IIdentifiedSingleEditOperation[] = []; +export function getEditOperation(model: ITextModel, command: ICommand): ISingleEditOperation[] { + let operations: ISingleEditOperation[] = []; let editOperationBuilder: IEditOperationBuilder = { addEditOperation: (range: IRange, text: string, forceMoveMarkers: boolean = false) => { operations.push({ diff --git a/src/vs/editor/test/browser/viewModel/modelLineProjection.test.ts b/src/vs/editor/test/browser/viewModel/modelLineProjection.test.ts index 15c6d75a0de..88c17e7823d 100644 --- a/src/vs/editor/test/browser/viewModel/modelLineProjection.test.ts +++ b/src/vs/editor/test/browser/viewModel/modelLineProjection.test.ts @@ -5,22 +5,21 @@ import * as assert from 'assert'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IViewLineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; import { EndOfLinePreference } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; -import * as modes from 'vs/editor/common/languages'; -import { NullState } from 'vs/editor/common/languages/nullMode'; +import * as languages from 'vs/editor/common/languages'; +import { NullState } from 'vs/editor/common/languages/nullTokenize'; import { MonospaceLineBreaksComputerFactory } from 'vs/editor/common/viewModel/monospaceLineBreaksComputer'; import { ViewModelLinesFromProjectedModel } from 'vs/editor/common/viewModel/viewModelLines'; -import { ViewLineData } from 'vs/editor/common/viewModel/viewModel'; +import { ViewLineData } from 'vs/editor/common/viewModel'; import { TestConfiguration } from 'vs/editor/test/browser/config/testConfiguration'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { ISimpleModel, IModelLineProjection, createModelLineProjection } from 'vs/editor/common/viewModel/modelLineProjection'; -import { ModelLineProjectionData } from 'vs/editor/common/viewModel/modelLineProjectionData'; +import { ModelLineProjectionData } from 'vs/editor/common/modelLineProjectionData'; suite('Editor ViewModel - SplitLinesCollection', () => { test('SplitLine', () => { @@ -333,24 +332,24 @@ suite('SplitLinesCollection', () => { setup(() => { let _lineIndex = 0; - const tokenizationSupport: modes.ITokenizationSupport = { + const tokenizationSupport: languages.ITokenizationSupport = { getInitialState: () => NullState, tokenize: undefined!, - tokenizeEncoded: (line: string, hasEOL: boolean, state: modes.IState): EncodedTokenizationResult => { + tokenizeEncoded: (line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult => { let tokens = _tokens[_lineIndex++]; let result = new Uint32Array(2 * tokens.length); for (let i = 0; i < tokens.length; i++) { result[2 * i] = tokens[i].startIndex; result[2 * i + 1] = ( - tokens[i].value << modes.MetadataConsts.FOREGROUND_OFFSET + tokens[i].value << languages.MetadataConsts.FOREGROUND_OFFSET ); } - return new EncodedTokenizationResult(result, state); + return new languages.EncodedTokenizationResult(result, state); } }; const LANGUAGE_ID = 'modelModeTest1'; - languageRegistration = modes.TokenizationRegistry.register(LANGUAGE_ID, tokenizationSupport); + languageRegistration = languages.TokenizationRegistry.register(LANGUAGE_ID, tokenizationSupport); model = createTextModel(_text.join('\n'), LANGUAGE_ID); // force tokenization model.forceTokenization(model.getLineCount()); diff --git a/src/vs/editor/test/browser/viewModel/testViewModel.ts b/src/vs/editor/test/browser/viewModel/testViewModel.ts index b8317241bb7..28fb4ac5e19 100644 --- a/src/vs/editor/test/browser/viewModel/testViewModel.ts +++ b/src/vs/editor/test/browser/viewModel/testViewModel.ts @@ -10,6 +10,7 @@ import { TestConfiguration } from 'vs/editor/test/browser/config/testConfigurati import { MonospaceLineBreaksComputerFactory } from 'vs/editor/common/viewModel/monospaceLineBreaksComputer'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; +import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; export function testViewModel(text: string[], options: IEditorOptions, callback: (viewModel: ViewModel, model: TextModel) => void): void { const EDITOR_ID = 1; @@ -17,7 +18,7 @@ export function testViewModel(text: string[], options: IEditorOptions, callback: const configuration = new TestConfiguration(options); const model = createTextModel(text.join('\n')); const monospaceLineBreaksComputerFactory = MonospaceLineBreaksComputerFactory.create(configuration.options); - const viewModel = new ViewModel(EDITOR_ID, configuration, model, monospaceLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, null!, new TestLanguageConfigurationService()); + const viewModel = new ViewModel(EDITOR_ID, configuration, model, monospaceLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, null!, new TestLanguageConfigurationService(), new TestThemeService()); callback(viewModel, model); diff --git a/src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts b/src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts index a5942b1148d..0b203e82672 100644 --- a/src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts +++ b/src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { Range } from 'vs/editor/common/core/range'; -import { InlineDecoration, InlineDecorationType } from 'vs/editor/common/viewModel/viewModel'; +import { InlineDecoration, InlineDecorationType } from 'vs/editor/common/viewModel'; import { testViewModel } from 'vs/editor/test/browser/viewModel/testViewModel'; suite('ViewModelDecorations', () => { diff --git a/src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts b/src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts index 0c8d08b6a9d..9505b838e06 100644 --- a/src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts +++ b/src/vs/editor/test/browser/viewModel/viewModelImpl.test.ts @@ -7,8 +7,8 @@ import * as assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLineSequence, PositionAffinity } from 'vs/editor/common/model'; import { testViewModel } from 'vs/editor/test/browser/viewModel/testViewModel'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; -import { ViewEvent } from 'vs/editor/common/view/viewEvents'; +import { ViewEventHandler } from 'vs/editor/common/viewEventHandler'; +import { ViewEvent } from 'vs/editor/common/viewEvents'; import { Position } from 'vs/editor/common/core/position'; suite('ViewModel', () => { diff --git a/src/vs/editor/test/common/controller/cursorAtomicMoveOperations.test.ts b/src/vs/editor/test/common/controller/cursorAtomicMoveOperations.test.ts index e9c60b6e3be..7d579689ebc 100644 --- a/src/vs/editor/test/common/controller/cursorAtomicMoveOperations.test.ts +++ b/src/vs/editor/test/common/controller/cursorAtomicMoveOperations.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { AtomicTabMoveOperations, Direction } from 'vs/editor/common/controller/cursorAtomicMoveOperations'; +import { AtomicTabMoveOperations, Direction } from 'vs/editor/common/cursor/cursorAtomicMoveOperations'; suite('Cursor move command test', () => { diff --git a/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts b/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts index e07042281eb..3d873862937 100644 --- a/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts +++ b/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { CursorColumns } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns } from 'vs/editor/common/core/cursorColumns'; suite('CursorMove', () => { diff --git a/src/vs/editor/test/common/core/lineTokens.test.ts b/src/vs/editor/test/common/core/lineTokens.test.ts index b177abd67bb..ac74d86cf8f 100644 --- a/src/vs/editor/test/common/core/lineTokens.test.ts +++ b/src/vs/editor/test/common/core/lineTokens.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IViewLineTokens, LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { IViewLineTokens, LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { MetadataConsts } from 'vs/editor/common/languages'; import { LanguageIdCodec } from 'vs/editor/common/services/languagesRegistry'; diff --git a/src/vs/editor/test/common/core/testLineToken.ts b/src/vs/editor/test/common/core/testLineToken.ts index 547d6bb13ef..0c6b236fbc7 100644 --- a/src/vs/editor/test/common/core/testLineToken.ts +++ b/src/vs/editor/test/common/core/testLineToken.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IViewLineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; import { ColorId, ITokenPresentation, TokenMetadata } from 'vs/editor/common/languages'; /** @@ -107,6 +107,13 @@ export class TestLineTokens implements IViewLineTokens { throw new Error('Not implemented'); } + public getMetadata(tokenIndex: number): number { + throw new Error('Method not implemented.'); + } + + public getLanguageId(tokenIndex: number): string { + throw new Error('Method not implemented.'); + } } export class TestLineTokenFactory { diff --git a/src/vs/editor/test/common/diff/diffComputer.test.ts b/src/vs/editor/test/common/diff/diffComputer.test.ts index c63da46f810..88037f3cfa6 100644 --- a/src/vs/editor/test/common/diff/diffComputer.test.ts +++ b/src/vs/editor/test/common/diff/diffComputer.test.ts @@ -3,8 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { DiffComputer } from 'vs/editor/common/diff/diffComputer'; -import { IChange, ICharChange, ILineChange } from 'vs/editor/common/editorCommon'; +import { DiffComputer, IChange, ICharChange, ILineChange } from 'vs/editor/common/diff/diffComputer'; function extractCharChangeRepresentation(change: ICharChange, expectedChange: ICharChange | null): ICharChange { let hasOriginal = expectedChange && expectedChange.originalStartLineNumber > 0; diff --git a/src/vs/editor/test/common/mocks/mockMode.ts b/src/vs/editor/test/common/mocks/mockMode.ts index a8ed2b3549c..4ad2a686fbb 100644 --- a/src/vs/editor/test/common/mocks/mockMode.ts +++ b/src/vs/editor/test/common/mocks/mockMode.ts @@ -6,7 +6,7 @@ import { Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageSelection } from 'vs/editor/common/services/language'; +import { ILanguageSelection } from 'vs/editor/common/languages/language'; export class MockMode extends Disposable { constructor( diff --git a/src/vs/editor/test/common/model/benchmark/benchmarkUtils.ts b/src/vs/editor/test/common/model/benchmark/benchmarkUtils.ts deleted file mode 100644 index 357d3bb551e..00000000000 --- a/src/vs/editor/test/common/model/benchmark/benchmarkUtils.ts +++ /dev/null @@ -1,74 +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 { DefaultEndOfLine, ITextBuffer, ITextBufferBuilder, ITextBufferFactory } from 'vs/editor/common/model'; -import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; - -export function doBenchmark(id: string, ts: T[], fn: (t: T) => void) { - let columns: string[] = [id]; - for (const t of ts) { - let start = process.hrtime(); - fn(t); - let diff = process.hrtime(start); - columns.push(`${(diff[0] * 1000 + diff[1] / 1000000).toFixed(3)} ms`); - } - console.log('|' + columns.join('\t|') + '|'); -} - -export interface IBenchmark { - name: string; - /** - * Before each cycle, this function will be called to create TextBufferFactory - */ - buildBuffer: (textBufferBuilder: ITextBufferBuilder) => ITextBufferFactory; - /** - * Before each cycle, this function will be called to do pre-work for text buffer. - * This will be called onece `buildBuffer` is finished. - */ - preCycle: (textBuffer: ITextBuffer) => void; - /** - * The function we are benchmarking - */ - fn: (textBuffer: ITextBuffer) => void; -} - -export class BenchmarkSuite { - name: string; - iterations: number; - benchmarks: IBenchmark[]; - - constructor(suiteOptions: { name: string, iterations: number }) { - this.name = suiteOptions.name; - this.iterations = suiteOptions.iterations; - this.benchmarks = []; - } - - add(benchmark: IBenchmark) { - this.benchmarks.push(benchmark); - } - - run() { - console.log(`|${this.name}\t|line buffer\t|piece table\t|edcore\t`); - console.log('|---|---|---|---|'); - for (const benchmark of this.benchmarks) { - let columns: string[] = [benchmark.name]; - [new PieceTreeTextBufferBuilder()].forEach((builder: ITextBufferBuilder) => { - let timeDiffTotal = 0; - for (let j = 0; j < this.iterations; j++) { - let factory = benchmark.buildBuffer(builder); - let buffer = factory.create(DefaultEndOfLine.LF).textBuffer; - benchmark.preCycle(buffer); - let start = process.hrtime(); - benchmark.fn(buffer); - let diff = process.hrtime(start); - timeDiffTotal += (diff[0] * 1000 * 1000 + diff[1] / 1000); - } - columns.push(`${(timeDiffTotal / 1000 / this.iterations).toFixed(3)} ms`); - }); - console.log('|' + columns.join('\t|') + '|'); - } - console.log('\n'); - } -} diff --git a/src/vs/editor/test/common/model/benchmark/modelbuilder.benchmark.ts b/src/vs/editor/test/common/model/benchmark/modelbuilder.benchmark.ts deleted file mode 100644 index a01339eb263..00000000000 --- a/src/vs/editor/test/common/model/benchmark/modelbuilder.benchmark.ts +++ /dev/null @@ -1,31 +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 { ITextBufferBuilder } from 'vs/editor/common/model'; -import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; -import { doBenchmark } from 'vs/editor/test/common/model/benchmark/benchmarkUtils'; -import { generateRandomChunkWithLF } from 'vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils'; - -let pieceTreeTextBufferBuilder = new PieceTreeTextBufferBuilder(); -let chunks: string[] = []; - -for (let i = 0; i < 100; i++) { - chunks.push(generateRandomChunkWithLF(16 * 1000, 64 * 1000)); -} - -let modelBuildBenchmark = function (id: string, builders: ITextBufferBuilder[], chunkCnt: number) { - doBenchmark(id, builders, builder => { - for (let i = 0, len = Math.min(chunkCnt, chunks.length); i < len; i++) { - builder.acceptChunk(chunks[i]); - } - builder.finish(); - }); -}; - -console.log(`|model builder\t|line buffer\t|piece table\t|`); -console.log('|---|---|---|'); -for (let i of [10, 100]) { - modelBuildBenchmark(`${i} random chunks`, [pieceTreeTextBufferBuilder], i); -} diff --git a/src/vs/editor/test/common/model/benchmark/operations.benchmark.ts b/src/vs/editor/test/common/model/benchmark/operations.benchmark.ts deleted file mode 100644 index ded9745ef09..00000000000 --- a/src/vs/editor/test/common/model/benchmark/operations.benchmark.ts +++ /dev/null @@ -1,137 +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 { Range } from 'vs/editor/common/core/range'; -import { EndOfLinePreference, ITextBufferBuilder } from 'vs/editor/common/model'; -import { BenchmarkSuite } from 'vs/editor/test/common/model/benchmark/benchmarkUtils'; -import { generateRandomChunkWithLF, generateRandomEdits, generateSequentialInserts, getRandomInt } from 'vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils'; - -let fileSizes = [1, 1000, 64 * 1000, 32 * 1000 * 1000]; -let editTypes = [ - { - id: 'random edits', - generateEdits: generateRandomEdits - }, - { - id: 'sequential inserts', - generateEdits: generateSequentialInserts - } -]; - -for (let fileSize of fileSizes) { - let chunks: string[] = []; - - let chunkCnt = Math.floor(fileSize / (64 * 1000)); - if (chunkCnt === 0) { - chunks.push(generateRandomChunkWithLF(fileSize, fileSize)); - } else { - let chunk = generateRandomChunkWithLF(64 * 1000, 64 * 1000); - // try to avoid OOM - for (let j = 0; j < chunkCnt; j++) { - chunks.push(Buffer.from(chunk + j).toString()); - } - } - - for (let editType of editTypes) { - const edits = editType.generateEdits(chunks, 1000); - - let editsSuite = new BenchmarkSuite({ - name: `File Size: ${fileSize}Byte, ${editType.id}`, - iterations: 10 - }); - - editsSuite.add({ - name: `apply 1000 edits`, - buildBuffer: (textBufferBuilder: ITextBufferBuilder) => { - chunks.forEach(ck => textBufferBuilder.acceptChunk(ck)); - return textBufferBuilder.finish(); - }, - preCycle: (textBuffer) => { - return textBuffer; - }, - fn: (textBuffer) => { - // for line model, this loop doesn't reflect the real situation. - for (const edit of edits) { - textBuffer.applyEdits([edit], false, false); - } - } - }); - - editsSuite.add({ - name: `Read all lines after 1000 edits`, - buildBuffer: (textBufferBuilder: ITextBufferBuilder) => { - chunks.forEach(ck => textBufferBuilder.acceptChunk(ck)); - return textBufferBuilder.finish(); - }, - preCycle: (textBuffer) => { - for (const edit of edits) { - textBuffer.applyEdits([edit], false, false); - } - return textBuffer; - }, - fn: (textBuffer) => { - for (let j = 0, len = textBuffer.getLineCount(); j < len; j++) { - let str = textBuffer.getLineContent(j + 1); - let firstChar = str.charCodeAt(0); - let lastChar = str.charCodeAt(str.length - 1); - firstChar = firstChar - lastChar; - lastChar = firstChar + lastChar; - firstChar = lastChar - firstChar; - } - } - }); - - editsSuite.add({ - name: `Read 10 random windows after 1000 edits`, - buildBuffer: (textBufferBuilder: ITextBufferBuilder) => { - chunks.forEach(ck => textBufferBuilder.acceptChunk(ck)); - return textBufferBuilder.finish(); - }, - preCycle: (textBuffer) => { - for (const edit of edits) { - textBuffer.applyEdits([edit], false, false); - } - return textBuffer; - }, - fn: (textBuffer) => { - for (let i = 0; i < 10; i++) { - let minLine = 1; - let maxLine = textBuffer.getLineCount(); - let startLine = getRandomInt(minLine, Math.max(minLine, maxLine - 100)); - let endLine = Math.min(maxLine, startLine + 100); - for (let j = startLine; j < endLine; j++) { - let str = textBuffer.getLineContent(j + 1); - let firstChar = str.charCodeAt(0); - let lastChar = str.charCodeAt(str.length - 1); - firstChar = firstChar - lastChar; - lastChar = firstChar + lastChar; - firstChar = lastChar - firstChar; - } - } - } - }); - - editsSuite.add({ - name: `save file after 1000 edits`, - buildBuffer: (textBufferBuilder: ITextBufferBuilder) => { - chunks.forEach(ck => textBufferBuilder.acceptChunk(ck)); - return textBufferBuilder.finish(); - }, - preCycle: (textBuffer) => { - for (const edit of edits) { - textBuffer.applyEdits([edit], false, false); - } - return textBuffer; - }, - fn: (textBuffer) => { - const lineCount = textBuffer.getLineCount(); - const fullModelRange = new Range(1, 1, lineCount, textBuffer.getLineLength(lineCount) + 1); - textBuffer.getValueInRange(fullModelRange, EndOfLinePreference.LF); - } - }); - - editsSuite.run(); - } -} diff --git a/src/vs/editor/test/common/model/benchmark/searchNReplace.benchmark.ts b/src/vs/editor/test/common/model/benchmark/searchNReplace.benchmark.ts deleted file mode 100644 index 7a417a22aab..00000000000 --- a/src/vs/editor/test/common/model/benchmark/searchNReplace.benchmark.ts +++ /dev/null @@ -1,50 +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 { ITextBufferBuilder } from 'vs/editor/common/model'; -import { BenchmarkSuite } from 'vs/editor/test/common/model/benchmark/benchmarkUtils'; -import { generateRandomChunkWithLF, generateRandomReplaces } from 'vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils'; - -const fileSizes = [1, 1000, 64 * 1000, 32 * 1000 * 1000]; - -for (const fileSize of fileSizes) { - const chunks: string[] = []; - - const chunkCnt = Math.floor(fileSize / (64 * 1000)); - if (chunkCnt === 0) { - chunks.push(generateRandomChunkWithLF(fileSize, fileSize)); - } else { - const chunk = generateRandomChunkWithLF(64 * 1000, 64 * 1000); - // try to avoid OOM - for (let j = 0; j < chunkCnt; j++) { - chunks.push(Buffer.from(chunk + j).toString()); - } - } - - const replaceSuite = new BenchmarkSuite({ - name: `File Size: ${fileSize}Byte`, - iterations: 10 - }); - - const edits = generateRandomReplaces(chunks, 500, 5, 10); - - for (const i of [10, 100, 500]) { - replaceSuite.add({ - name: `replace ${i} occurrences`, - buildBuffer: (textBufferBuilder: ITextBufferBuilder) => { - chunks.forEach(ck => textBufferBuilder.acceptChunk(ck)); - return textBufferBuilder.finish(); - }, - preCycle: (textBuffer) => { - return textBuffer; - }, - fn: (textBuffer) => { - textBuffer.applyEdits(edits.slice(0, i), false, false); - } - }); - } - - replaceSuite.run(); -} diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/beforeEditPositionMapper.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/beforeEditPositionMapper.test.ts index 5401b4fab6b..27fe72154f8 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/beforeEditPositionMapper.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/beforeEditPositionMapper.test.ts @@ -392,7 +392,7 @@ class PositionOffsetTransformer { } } -function applyLineColumnEdits(text: string, edits: { range: IRange, text: string }[]): string { +function applyLineColumnEdits(text: string, edits: { range: IRange; text: string }[]): string { const transformer = new PositionOffsetTransformer(text); const offsetEdits = edits.map(e => { const range = Range.lift(e.range); diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/getBracketPairsInRange.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/getBracketPairsInRange.test.ts index 9535a744d7e..70180f74827 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/getBracketPairsInRange.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/getBracketPairsInRange.test.ts @@ -7,7 +7,7 @@ import assert = require('assert'); import { Disposable, disposeOnReturn } from 'vs/base/common/lifecycle'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { BracketPairInfo } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; +import { BracketPairInfo } from 'vs/editor/common/textModelBracketPairs'; import { LanguageConfiguration } from 'vs/editor/common/languages/languageConfiguration'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; @@ -230,7 +230,7 @@ class AnnotatedDocument { } interface MockLanguageOptions { - configuration?: LanguageConfiguration + configuration?: LanguageConfiguration; } class MockLanguage extends Disposable { diff --git a/src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts b/src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts index a59961d145f..f465597af2f 100644 --- a/src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts +++ b/src/vs/editor/test/common/model/bracketPairColorizer/tokenizer.test.ts @@ -5,16 +5,15 @@ import assert = require('assert'); import { DisposableStore } from 'vs/base/common/lifecycle'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; import { LanguageAgnosticBracketTokens } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets'; import { Length, lengthAdd, lengthsToRange, lengthZero } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length'; import { DenseKeyProvider } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet'; import { TextBufferTokenizer, Token, Tokenizer, TokenKind } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { IState, ITokenizationSupport, LanguageId, MetadataConsts, StandardTokenType, TokenizationRegistry } from 'vs/editor/common/languages'; +import { EncodedTokenizationResult, IState, ITokenizationSupport, LanguageId, MetadataConsts, StandardTokenType, TokenizationRegistry } from 'vs/editor/common/languages'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { createModelServices, instantiateTextModel } from 'vs/editor/test/common/testTextModel'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; @@ -23,7 +22,7 @@ suite('Bracket Pair Colorizer - Tokenizer', () => { const mode1 = 'testMode1'; const disposableStore = new DisposableStore(); const instantiationService = createModelServices(disposableStore); - const languageService = instantiationService.invokeFunction((accessor) => accessor.get(ILanguageService)); + const languageService = instantiationService.get(ILanguageService); disposableStore.add(ModesRegistry.registerLanguage({ id: mode1 })); const encodedMode1 = languageService.languageIdCodec.encodeLanguageId(mode1); diff --git a/src/vs/editor/test/common/model/editStack.test.ts b/src/vs/editor/test/common/model/editStack.test.ts index e5541675529..27cb5864613 100644 --- a/src/vs/editor/test/common/model/editStack.test.ts +++ b/src/vs/editor/test/common/model/editStack.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { EndOfLineSequence } from 'vs/editor/common/model'; import { SingleModelEditStackData } from 'vs/editor/common/model/editStack'; import { Selection } from 'vs/editor/common/core/selection'; -import { TextChange } from 'vs/editor/common/model/textChange'; +import { TextChange } from 'vs/editor/common/core/textChange'; suite('EditStack', () => { diff --git a/src/vs/editor/test/common/model/editableTextModel.test.ts b/src/vs/editor/test/common/model/editableTextModel.test.ts index c04480a6b94..7ddfde1434f 100644 --- a/src/vs/editor/test/common/model/editableTextModel.test.ts +++ b/src/vs/editor/test/common/model/editableTextModel.test.ts @@ -4,16 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; -import { EndOfLinePreference, EndOfLineSequence, IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; +import { EndOfLinePreference, EndOfLineSequence } from 'vs/editor/common/model'; import { MirrorTextModel } from 'vs/editor/common/model/mirrorTextModel'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { assertSyncedModels, testApplyEditsWithSyncedModels } from 'vs/editor/test/common/model/editableTextModelTestUtils'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; suite('EditorModel - EditableTextModel.applyEdits updates mightContainRTL', () => { - function testApplyEdits(original: string[], edits: IIdentifiedSingleEditOperation[], before: boolean, after: boolean): void { + function testApplyEdits(original: string[], edits: ISingleEditOperation[], before: boolean, after: boolean): void { let model = createTextModel(original.join('\n')); model.setEOL(EndOfLineSequence.LF); @@ -24,7 +25,7 @@ suite('EditorModel - EditableTextModel.applyEdits updates mightContainRTL', () = model.dispose(); } - function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[]): IIdentifiedSingleEditOperation { + function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[]): ISingleEditOperation { return { range: new Range(startLineNumber, startColumn, endLineNumber, endColumn), text: text.join('\n') @@ -59,7 +60,7 @@ suite('EditorModel - EditableTextModel.applyEdits updates mightContainRTL', () = suite('EditorModel - EditableTextModel.applyEdits updates mightContainNonBasicASCII', () => { - function testApplyEdits(original: string[], edits: IIdentifiedSingleEditOperation[], before: boolean, after: boolean): void { + function testApplyEdits(original: string[], edits: ISingleEditOperation[], before: boolean, after: boolean): void { let model = createTextModel(original.join('\n')); model.setEOL(EndOfLineSequence.LF); @@ -70,7 +71,7 @@ suite('EditorModel - EditableTextModel.applyEdits updates mightContainNonBasicAS model.dispose(); } - function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[]): IIdentifiedSingleEditOperation { + function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[]): ISingleEditOperation { return { range: new Range(startLineNumber, startColumn, endLineNumber, endColumn), text: text.join('\n') @@ -101,9 +102,8 @@ suite('EditorModel - EditableTextModel.applyEdits updates mightContainNonBasicAS suite('EditorModel - EditableTextModel.applyEdits', () => { - function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[]): IIdentifiedSingleEditOperation { + function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[]): ISingleEditOperation { return { - identifier: null, range: new Range(startLineNumber, startColumn, endLineNumber, endColumn), text: text.join('\n'), forceMoveMarkers: false @@ -852,7 +852,7 @@ suite('EditorModel - EditableTextModel.applyEdits', () => { ); }); - function testApplyEditsFails(original: string[], edits: IIdentifiedSingleEditOperation[]): void { + function testApplyEditsFails(original: string[], edits: ISingleEditOperation[]): void { let model = createTextModel(original.join('\n')); let hasThrown = false; diff --git a/src/vs/editor/test/common/model/editableTextModelAuto.test.ts b/src/vs/editor/test/common/model/editableTextModelAuto.test.ts index 5b3ab479ab9..2510299594c 100644 --- a/src/vs/editor/test/common/model/editableTextModelAuto.test.ts +++ b/src/vs/editor/test/common/model/editableTextModelAuto.test.ts @@ -4,17 +4,16 @@ *--------------------------------------------------------------------------------------------*/ import { CharCode } from 'vs/base/common/charCode'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; import { testApplyEditsWithSyncedModels } from 'vs/editor/test/common/model/editableTextModelTestUtils'; const GENERATE_TESTS = false; suite('EditorModel Auto Tests', () => { - function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[]): IIdentifiedSingleEditOperation { + function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[]): ISingleEditOperation { return { - identifier: null, range: new Range(startLineNumber, startColumn, endLineNumber, endColumn), text: text.join('\n'), forceMoveMarkers: false @@ -194,7 +193,7 @@ class TestModel { public initialContent: string; public resultingContent: string; - public edits: IIdentifiedSingleEditOperation[]; + public edits: ISingleEditOperation[]; private static _generateOffsetToPosition(content: string): Position[] { let result: Position[] = []; diff --git a/src/vs/editor/test/common/model/editableTextModelTestUtils.ts b/src/vs/editor/test/common/model/editableTextModelTestUtils.ts index 71996dac28e..b65925da973 100644 --- a/src/vs/editor/test/common/model/editableTextModelTestUtils.ts +++ b/src/vs/editor/test/common/model/editableTextModelTestUtils.ts @@ -4,14 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; -import { EndOfLinePreference, EndOfLineSequence, IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; +import { EndOfLinePreference, EndOfLineSequence } from 'vs/editor/common/model'; import { MirrorTextModel } from 'vs/editor/common/model/mirrorTextModel'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; -export function testApplyEditsWithSyncedModels(original: string[], edits: IIdentifiedSingleEditOperation[], expected: string[], inputEditsAreInvalid: boolean = false): void { +export function testApplyEditsWithSyncedModels(original: string[], edits: ISingleEditOperation[], expected: string[], inputEditsAreInvalid: boolean = false): void { let originalStr = original.join('\n'); let expectedStr = expected.join('\n'); @@ -31,13 +32,11 @@ export function testApplyEditsWithSyncedModels(original: string[], edits: IIdent assert.deepStrictEqual(model.getValue(EndOfLinePreference.LF), originalStr); if (!inputEditsAreInvalid) { - const simplifyEdit = (edit: IIdentifiedSingleEditOperation) => { + const simplifyEdit = (edit: ISingleEditOperation) => { return { - identifier: edit.identifier, range: edit.range, text: edit.text, - forceMoveMarkers: edit.forceMoveMarkers || false, - isAutoWhitespaceEdit: edit.isAutoWhitespaceEdit || false + forceMoveMarkers: edit.forceMoveMarkers || false }; }; // Assert the inverse of the inverse edits are the original edits diff --git a/src/vs/editor/test/common/model/model.line.test.ts b/src/vs/editor/test/common/model/model.line.test.ts index e3d979bacb3..541f39e0d39 100644 --- a/src/vs/editor/test/common/model/model.line.test.ts +++ b/src/vs/editor/test/common/model/model.line.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { Range } from 'vs/editor/common/core/range'; import { computeIndentLevel } from 'vs/editor/common/model/utils'; import { MetadataConsts } from 'vs/editor/common/languages'; diff --git a/src/vs/editor/test/common/model/model.modes.test.ts b/src/vs/editor/test/common/model/model.modes.test.ts index 9a400492984..8f3bf8433ef 100644 --- a/src/vs/editor/test/common/model/model.modes.test.ts +++ b/src/vs/editor/test/common/model/model.modes.test.ts @@ -8,10 +8,9 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; import { TextModel } from 'vs/editor/common/model/textModel'; -import * as modes from 'vs/editor/common/languages'; -import { NullState } from 'vs/editor/common/languages/nullMode'; +import * as languages from 'vs/editor/common/languages'; +import { NullState } from 'vs/editor/common/languages/nullTokenize'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; // --------- utils @@ -25,12 +24,12 @@ suite('Editor Model - Model Modes 1', () => { calledFor = []; } - const tokenizationSupport: modes.ITokenizationSupport = { + const tokenizationSupport: languages.ITokenizationSupport = { getInitialState: () => NullState, tokenize: undefined!, - tokenizeEncoded: (line: string, hasEOL: boolean, state: modes.IState): EncodedTokenizationResult => { + tokenizeEncoded: (line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult => { calledFor.push(line.charAt(0)); - return new EncodedTokenizationResult(new Uint32Array(0), state); + return new languages.EncodedTokenizationResult(new Uint32Array(0), state); } }; @@ -46,7 +45,7 @@ suite('Editor Model - Model Modes 1', () => { '5'; const LANGUAGE_ID = 'modelModeTest1'; calledFor = []; - languageRegistration = modes.TokenizationRegistry.register(LANGUAGE_ID, tokenizationSupport); + languageRegistration = languages.TokenizationRegistry.register(LANGUAGE_ID, tokenizationSupport); thisModel = createTextModel(TEXT, LANGUAGE_ID); }); @@ -155,18 +154,18 @@ suite('Editor Model - Model Modes 1', () => { suite('Editor Model - Model Modes 2', () => { - class ModelState2 implements modes.IState { + class ModelState2 implements languages.IState { prevLineContent: string; constructor(prevLineContent: string) { this.prevLineContent = prevLineContent; } - clone(): modes.IState { + clone(): languages.IState { return new ModelState2(this.prevLineContent); } - equals(other: modes.IState): boolean { + equals(other: languages.IState): boolean { return (other instanceof ModelState2) && other.prevLineContent === this.prevLineContent; } } @@ -178,13 +177,13 @@ suite('Editor Model - Model Modes 2', () => { calledFor = []; } - const tokenizationSupport: modes.ITokenizationSupport = { + const tokenizationSupport: languages.ITokenizationSupport = { getInitialState: () => new ModelState2(''), tokenize: undefined!, - tokenizeEncoded: (line: string, hasEOL: boolean, state: modes.IState): EncodedTokenizationResult => { + tokenizeEncoded: (line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult => { calledFor.push(line); (state).prevLineContent = line; - return new EncodedTokenizationResult(new Uint32Array(0), state); + return new languages.EncodedTokenizationResult(new Uint32Array(0), state); } }; @@ -199,7 +198,7 @@ suite('Editor Model - Model Modes 2', () => { 'Line4' + '\r\n' + 'Line5'; const LANGUAGE_ID = 'modelModeTest2'; - languageRegistration = modes.TokenizationRegistry.register(LANGUAGE_ID, tokenizationSupport); + languageRegistration = languages.TokenizationRegistry.register(LANGUAGE_ID, tokenizationSupport); thisModel = createTextModel(TEXT, LANGUAGE_ID); }); diff --git a/src/vs/editor/test/common/model/model.test.ts b/src/vs/editor/test/common/model/model.test.ts index 9e6965d25be..31e049dbdc9 100644 --- a/src/vs/editor/test/common/model/model.test.ts +++ b/src/vs/editor/test/common/model/model.test.ts @@ -8,15 +8,14 @@ import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { ModelRawContentChangedEvent, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/model/textModelEvents'; -import { IState, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; +import { ModelRawContentChangedEvent, ModelRawFlush, ModelRawLineChanged, ModelRawLinesDeleted, ModelRawLinesInserted } from 'vs/editor/common/textModelEvents'; +import { EncodedTokenizationResult, IState, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { NullState } from 'vs/editor/common/languages/nullMode'; +import { NullState } from 'vs/editor/common/languages/nullTokenize'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { createModelServices, createTextModel, instantiateTextModel } from 'vs/editor/test/common/testTextModel'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; // --------- utils diff --git a/src/vs/editor/test/common/model/modelDecorations.test.ts b/src/vs/editor/test/common/model/modelDecorations.test.ts index 91660996494..20cbad78268 100644 --- a/src/vs/editor/test/common/model/modelDecorations.test.ts +++ b/src/vs/editor/test/common/model/modelDecorations.test.ts @@ -51,8 +51,8 @@ function addDecoration(model: TextModel, startLineNumber: number, startColumn: n })!; } -function lineHasDecorations(model: TextModel, lineNumber: number, decorations: { start: number; end: number; className: string; }[]) { - let lineDecorations: Array<{ start: number; end: number; className: string | null | undefined; }> = []; +function lineHasDecorations(model: TextModel, lineNumber: number, decorations: { start: number; end: number; className: string }[]) { + let lineDecorations: Array<{ start: number; end: number; className: string | null | undefined }> = []; let decs = model.getLineDecorations(lineNumber); for (let i = 0, len = decs.length; i < len; i++) { lineDecorations.push({ diff --git a/src/vs/editor/test/common/model/modelEditOperation.test.ts b/src/vs/editor/test/common/model/modelEditOperation.test.ts index 1d05bdb75ed..b8115c3e416 100644 --- a/src/vs/editor/test/common/model/modelEditOperation.test.ts +++ b/src/vs/editor/test/common/model/modelEditOperation.test.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; -import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; @@ -31,7 +31,7 @@ suite('Editor Model - Model Edit Operation', () => { model.dispose(); }); - function createSingleEditOp(text: string, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): IIdentifiedSingleEditOperation { + function createSingleEditOp(text: string, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): ISingleEditOperation { let range = new Range( selectionLineNumber, selectionColumn, @@ -40,14 +40,13 @@ suite('Editor Model - Model Edit Operation', () => { ); return { - identifier: null, range: range, text: text, forceMoveMarkers: false }; } - function assertSingleEditOp(singleEditOp: IIdentifiedSingleEditOperation, editedLines: string[]) { + function assertSingleEditOp(singleEditOp: ISingleEditOperation, editedLines: string[]) { let editOp = [singleEditOp]; let inverseEditOp = model.applyEdits(editOp, true); @@ -66,13 +65,11 @@ suite('Editor Model - Model Edit Operation', () => { assert.strictEqual(model.getLineContent(4), LINE4); assert.strictEqual(model.getLineContent(5), LINE5); - const simplifyEdit = (edit: IIdentifiedSingleEditOperation) => { + const simplifyEdit = (edit: ISingleEditOperation) => { return { - identifier: edit.identifier, range: edit.range, text: edit.text, - forceMoveMarkers: edit.forceMoveMarkers || false, - isAutoWhitespaceEdit: edit.isAutoWhitespaceEdit || false + forceMoveMarkers: edit.forceMoveMarkers || false }; }; assert.deepStrictEqual(originalOp.map(simplifyEdit), editOp.map(simplifyEdit)); diff --git a/src/vs/editor/test/common/model/modelInjectedText.test.ts b/src/vs/editor/test/common/model/modelInjectedText.test.ts index 6c849a2f961..2621c44eb69 100644 --- a/src/vs/editor/test/common/model/modelInjectedText.test.ts +++ b/src/vs/editor/test/common/model/modelInjectedText.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { LineInjectedText, ModelRawChange, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; +import { LineInjectedText, ModelRawChange, RawContentChangedType } from 'vs/editor/common/textModelEvents'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; suite('Editor Model - Injected Text Events', () => { diff --git a/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts b/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts index cebc068c248..a03329482c9 100644 --- a/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts +++ b/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts @@ -4,16 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { WordCharacterClassifier } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { WordCharacterClassifier } from 'vs/editor/common/core/wordCharacterClassifier'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { DefaultEndOfLine, ITextSnapshot } from 'vs/editor/common/model'; +import { DefaultEndOfLine, ITextSnapshot, SearchData } from 'vs/editor/common/model'; import { PieceTreeBase } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase'; import { PieceTreeTextBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer'; import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; import { NodeColor, SENTINEL, TreeNode } from 'vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; -import { SearchData } from 'vs/editor/common/model/textModelSearch'; import { splitLines } from 'vs/base/common/strings'; const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n'; @@ -180,7 +179,7 @@ function depth(n: TreeNode): number { return (n.color === NodeColor.Black ? 1 : 0) + depth(n.left); } -function assertValidNode(n: TreeNode): { size: number, lf_cnt: number } { +function assertValidNode(n: TreeNode): { size: number; lf_cnt: number } { if (n === SENTINEL) { return { size: 0, lf_cnt: 0 }; } diff --git a/src/vs/editor/test/common/model/textChange.test.ts b/src/vs/editor/test/common/model/textChange.test.ts index 6fd1bbfba9c..4cd42025301 100644 --- a/src/vs/editor/test/common/model/textChange.test.ts +++ b/src/vs/editor/test/common/model/textChange.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { compressConsecutiveTextChanges, TextChange } from 'vs/editor/common/model/textChange'; +import { compressConsecutiveTextChanges, TextChange } from 'vs/editor/common/core/textChange'; const GENERATE_TESTS = false; diff --git a/src/vs/editor/test/common/model/textModelSearch.test.ts b/src/vs/editor/test/common/model/textModelSearch.test.ts index 73fba223008..ef807a04f24 100644 --- a/src/vs/editor/test/common/model/textModelSearch.test.ts +++ b/src/vs/editor/test/common/model/textModelSearch.test.ts @@ -4,13 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { getMapForWordSeparators } from 'vs/editor/common/core/wordCharacterClassifier'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { EndOfLineSequence, FindMatch } from 'vs/editor/common/model'; +import { EndOfLineSequence, FindMatch, SearchData } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { SearchData, SearchParams, TextModelSearch, isMultilineRegexSource } from 'vs/editor/common/model/textModelSearch'; -import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; +import { SearchParams, TextModelSearch, isMultilineRegexSource } from 'vs/editor/common/model/textModelSearch'; +import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/core/wordHelper'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; // --------- Find diff --git a/src/vs/editor/test/common/model/textModelWithTokens.test.ts b/src/vs/editor/test/common/model/textModelWithTokens.test.ts index 1cc1ab8101f..7e9b758974d 100644 --- a/src/vs/editor/test/common/model/textModelWithTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelWithTokens.test.ts @@ -7,15 +7,14 @@ import * as assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; -import { IFoundBracket } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairs'; +import { IFoundBracket } from 'vs/editor/common/textModelBracketPairs'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { ITokenizationSupport, MetadataConsts, TokenizationRegistry, StandardTokenType } from 'vs/editor/common/languages'; +import { ITokenizationSupport, MetadataConsts, TokenizationRegistry, StandardTokenType, EncodedTokenizationResult } from 'vs/editor/common/languages'; import { CharacterPair } from 'vs/editor/common/languages/languageConfiguration'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; -import { NullState } from 'vs/editor/common/languages/nullMode'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { NullState } from 'vs/editor/common/languages/nullTokenize'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { TestLineToken } from 'vs/editor/test/common/core/testLineToken'; import { createModelServices, createTextModel, instantiateTextModel } from 'vs/editor/test/common/testTextModel'; @@ -240,7 +239,7 @@ suite('TextModelWithTokens - bracket matching', () => { [new Position(5, 5), new Range(5, 4, 5, 5), new Range(1, 11, 1, 12)], ]; - let isABracket: { [lineNumber: number]: { [col: number]: boolean; }; } = { 1: {}, 2: {}, 3: {}, 4: {}, 5: {} }; + let isABracket: { [lineNumber: number]: { [col: number]: boolean } } = { 1: {}, 2: {}, 3: {}, 4: {}, 5: {} }; for (let i = 0, len = brackets.length; i < len; i++) { let [testPos, b1, b2] = brackets[i]; assertIsBracket(model, testPos, [b1, b2]); @@ -349,7 +348,7 @@ suite('TextModelWithTokens', () => { const mode1 = 'testMode1'; const mode2 = 'testMode2'; - const languageIdCodec = instantiationService.invokeFunction((accessor) => accessor.get(ILanguageService).languageIdCodec); + const languageIdCodec = instantiationService.get(ILanguageService).languageIdCodec; disposables.add(ModesRegistry.registerLanguage({ id: mode1 })); disposables.add(ModesRegistry.registerLanguage({ id: mode2 })); @@ -451,7 +450,7 @@ suite('TextModelWithTokens', () => { const instantiationService = createModelServices(disposables); const mode = 'testMode'; - const languageIdCodec = instantiationService.invokeFunction((accessor) => accessor.get(ILanguageService).languageIdCodec); + const languageIdCodec = instantiationService.get(ILanguageService).languageIdCodec; const encodedMode = languageIdCodec!.encodeLanguageId(mode); @@ -670,7 +669,7 @@ suite('TextModelWithTokens regression tests', () => { disposables.add(ModesRegistry.registerLanguage({ id: outerMode })); disposables.add(ModesRegistry.registerLanguage({ id: innerMode })); - const languageIdCodec = instantiationService.invokeFunction((accessor) => accessor.get(ILanguageService).languageIdCodec); + const languageIdCodec = instantiationService.get(ILanguageService).languageIdCodec; const encodedInnerMode = languageIdCodec.encodeLanguageId(innerMode); const tokenizationSupport: ITokenizationSupport = { diff --git a/src/vs/editor/test/common/model/tokensStore.test.ts b/src/vs/editor/test/common/model/tokensStore.test.ts index 5cef06d3ba6..ba69c425adf 100644 --- a/src/vs/editor/test/common/model/tokensStore.test.ts +++ b/src/vs/editor/test/common/model/tokensStore.test.ts @@ -4,21 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { SparseMultilineTokens } from 'vs/editor/common/model/tokens/sparseMultilineTokens'; -import { SparseTokensStore } from 'vs/editor/common/model/tokens/sparseTokensStore'; +import { SparseMultilineTokens } from 'vs/editor/common/tokens/sparseMultilineTokens'; +import { SparseTokensStore } from 'vs/editor/common/tokens/sparseTokensStore'; import { Range } from 'vs/editor/common/core/range'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; import { MetadataConsts, TokenMetadata, FontStyle, ColorId } from 'vs/editor/common/languages'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { LanguageIdCodec } from 'vs/editor/common/services/languagesRegistry'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; suite('TokensStore', () => { const SEMANTIC_COLOR: ColorId = 5; - function parseTokensState(state: string[]): { text: string; tokens: SparseMultilineTokens; } { + function parseTokensState(state: string[]): { text: string; tokens: SparseMultilineTokens } { let text: string[] = []; let tokens: number[] = []; let baseLine = 1; @@ -98,7 +98,7 @@ suite('TokensStore', () => { // function extractState - function testTokensAdjustment(rawInitialState: string[], edits: IIdentifiedSingleEditOperation[], rawFinalState: string[]) { + function testTokensAdjustment(rawInitialState: string[], edits: ISingleEditOperation[], rawFinalState: string[]) { const initialState = parseTokensState(rawInitialState); const model = createTextModel(initialState.text); model.setSemanticTokens([initialState.tokens], true); diff --git a/src/vs/editor/test/common/modes/languageSelector.test.ts b/src/vs/editor/test/common/modes/languageSelector.test.ts index 041a2ba3aea..1bbcd33884f 100644 --- a/src/vs/editor/test/common/modes/languageSelector.test.ts +++ b/src/vs/editor/test/common/modes/languageSelector.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; -import { score } from 'vs/editor/common/languages/languageSelector'; +import { score } from 'vs/editor/common/languageSelector'; suite('LanguageSelector', function () { diff --git a/src/vs/editor/test/common/modes/supports/onEnter.test.ts b/src/vs/editor/test/common/modes/supports/onEnter.test.ts index b585d64c479..5e630f31bc7 100644 --- a/src/vs/editor/test/common/modes/supports/onEnter.test.ts +++ b/src/vs/editor/test/common/modes/supports/onEnter.test.ts @@ -168,4 +168,22 @@ suite('OnEnter', () => { testIndentAction('', ' * test() {', '', IndentAction.Indent, null, 0); testIndentAction(' ', ' * test() {', '', IndentAction.Indent, null, 0); }); + + test('issue #141816', () => { + let support = new OnEnterSupport({ + onEnterRules: javascriptOnEnterRules + }); + let testIndentAction = (beforeText: string, afterText: string, expected: IndentAction) => { + let actual = support.onEnter(EditorAutoIndentStrategy.Advanced, '', beforeText, afterText); + if (expected === IndentAction.None) { + assert.strictEqual(actual, null); + } else { + assert.strictEqual(actual!.indentAction, expected); + } + }; + + testIndentAction('const r = /{/;', '', IndentAction.None); + testIndentAction('const r = /{[0-9]/;', '', IndentAction.None); + testIndentAction('const r = /[a-zA-Z]{/;', '', IndentAction.None); + }); }); diff --git a/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts b/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts index e930e242889..ffd333033f0 100644 --- a/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts +++ b/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts @@ -4,8 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { EncodedTokenizationResult } from 'vs/editor/common/core/token'; -import { ColorId, FontStyle, IState, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; +import { EncodedTokenizationResult, ColorId, FontStyle, IState, MetadataConsts, TokenizationRegistry } from 'vs/editor/common/languages'; import { tokenizeLineToHTML, _tokenizeToString } from 'vs/editor/common/languages/textToHtmlTokenizer'; import { LanguageIdCodec } from 'vs/editor/common/services/languagesRegistry'; import { TestLineToken, TestLineTokens } from 'vs/editor/test/common/core/testLineToken'; diff --git a/src/vs/editor/test/common/modesTestUtils.ts b/src/vs/editor/test/common/modesTestUtils.ts index 357d57159e0..d198101edca 100644 --- a/src/vs/editor/test/common/modesTestUtils.ts +++ b/src/vs/editor/test/common/modesTestUtils.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { MetadataConsts, StandardTokenType } from 'vs/editor/common/languages'; import { ScopedLineTokens, createScopedLineTokens } from 'vs/editor/common/languages/supports'; import { LanguageIdCodec } from 'vs/editor/common/services/languagesRegistry'; diff --git a/src/vs/editor/test/common/services/getSemanticTokens.test.ts b/src/vs/editor/test/common/services/getSemanticTokens.test.ts index f8dec3fa383..aff59d80eea 100644 --- a/src/vs/editor/test/common/services/getSemanticTokens.test.ts +++ b/src/vs/editor/test/common/services/getSemanticTokens.test.ts @@ -8,15 +8,16 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { canceled } from 'vs/base/common/errors'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ITextModel } from 'vs/editor/common/model'; -import { DocumentSemanticTokensProvider, DocumentSemanticTokensProviderRegistry, ProviderResult, SemanticTokens, SemanticTokensEdits, SemanticTokensLegend } from 'vs/editor/common/languages'; +import { DocumentSemanticTokensProvider, ProviderResult, SemanticTokens, SemanticTokensEdits, SemanticTokensLegend } from 'vs/editor/common/languages'; import { getDocumentSemanticTokens } from 'vs/editor/common/services/getSemanticTokens'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; suite('getSemanticTokens', () => { test('issue #136540: semantic highlighting flickers', async () => { const disposables = new DisposableStore(); - + const registry = new LanguageFeatureRegistry(); const provider = new class implements DocumentSemanticTokensProvider { getLegend(): SemanticTokensLegend { return { tokenTypes: ['test'], tokenModifiers: [] }; @@ -28,11 +29,11 @@ suite('getSemanticTokens', () => { } }; - disposables.add(DocumentSemanticTokensProviderRegistry.register('testLang', provider)); + disposables.add(registry.register('testLang', provider)); const textModel = disposables.add(createTextModel('example', 'testLang')); - await getDocumentSemanticTokens(textModel, null, null, CancellationToken.None).then((res) => { + await getDocumentSemanticTokens(registry, textModel, null, null, CancellationToken.None).then((res) => { assert.fail(); }, (err) => { assert.ok(!!err); diff --git a/src/vs/editor/test/common/services/modelService.test.ts b/src/vs/editor/test/common/services/modelService.test.ts index 2d8e6c4bef0..7d89dddc014 100644 --- a/src/vs/editor/test/common/services/modelService.test.ts +++ b/src/vs/editor/test/common/services/modelService.test.ts @@ -13,7 +13,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { createStringBuilder } from 'vs/editor/common/core/stringBuilder'; import { DefaultEndOfLine, ITextModel } from 'vs/editor/common/model'; import { createTextBuffer } from 'vs/editor/common/model/textModel'; -import { ModelSemanticColoring, ModelService } from 'vs/editor/common/services/modelService'; +import { ModelService } from 'vs/editor/common/services/modelService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TestColorTheme, TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { NullLogService } from 'vs/platform/log/common/log'; @@ -22,17 +22,21 @@ import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogSer import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { DocumentSemanticTokensProvider, DocumentSemanticTokensProviderRegistry, SemanticTokens, SemanticTokensEdits, SemanticTokensLegend } from 'vs/editor/common/languages'; +import { DocumentSemanticTokensProvider, SemanticTokens, SemanticTokensEdits, SemanticTokensLegend } from 'vs/editor/common/languages'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Barrier, timeout } from 'vs/base/common/async'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { TestTextResourcePropertiesService } from 'vs/editor/test/common/services/testTextResourcePropertiesService'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; import { getDocumentSemanticTokens, isSemanticTokens } from 'vs/editor/common/services/getSemanticTokens'; +import { LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const GENERATE_TESTS = false; @@ -47,14 +51,17 @@ suite('ModelService', () => { configService.setUserConfiguration('files', { 'eol': '\r\n' }, URI.file(platform.isWindows ? 'c:\\myroot' : '/myroot')); const dialogService = new TestDialogService(); + const logService = new NullLogService(); modelService = disposables.add(new ModelService( configService, new TestTextResourcePropertiesService(configService), new TestThemeService(), - new NullLogService(), + logService, new UndoRedoService(dialogService, new TestNotificationService()), disposables.add(new LanguageService()), - new TestLanguageConfigurationService() + new TestLanguageConfigurationService(), + new LanguageFeatureDebounceService(logService), + new LanguageFeaturesService() )); }); @@ -409,158 +416,163 @@ suite('ModelService', () => { suite('ModelSemanticColoring', () => { const disposables = new DisposableStore(); - const ORIGINAL_FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY = ModelSemanticColoring.FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY; let modelService: IModelService; let languageService: ILanguageService; + let languageFeaturesService: ILanguageFeaturesService; setup(() => { - ModelSemanticColoring.FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY = 0; - const configService = new TestConfigurationService({ editor: { semanticHighlighting: true } }); const themeService = new TestThemeService(); themeService.setTheme(new TestColorTheme({}, ColorScheme.DARK, true)); + const logService = new NullLogService(); + languageFeaturesService = new LanguageFeaturesService(); modelService = disposables.add(new ModelService( configService, new TestTextResourcePropertiesService(configService), themeService, - new NullLogService(), + logService, new UndoRedoService(new TestDialogService(), new TestNotificationService()), disposables.add(new LanguageService()), - new TestLanguageConfigurationService() + new TestLanguageConfigurationService(), + new LanguageFeatureDebounceService(logService), + languageFeaturesService )); languageService = disposables.add(new LanguageService(false)); }); teardown(() => { disposables.clear(); - ModelSemanticColoring.FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY = ORIGINAL_FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY; }); test('DocumentSemanticTokens should be fetched when the result is empty if there are pending changes', async () => { + await runWithFakedTimers({}, async () => { - disposables.add(ModesRegistry.registerLanguage({ id: 'testMode' })); + disposables.add(ModesRegistry.registerLanguage({ id: 'testMode' })); - const inFirstCall = new Barrier(); - const delayFirstResult = new Barrier(); - const secondResultProvided = new Barrier(); - let callCount = 0; + const inFirstCall = new Barrier(); + const delayFirstResult = new Barrier(); + const secondResultProvided = new Barrier(); + let callCount = 0; - disposables.add(DocumentSemanticTokensProviderRegistry.register('testMode', new class implements DocumentSemanticTokensProvider { - getLegend(): SemanticTokensLegend { - return { tokenTypes: ['class'], tokenModifiers: [] }; - } - async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise { - callCount++; - if (callCount === 1) { - assert.ok('called once'); - inFirstCall.open(); - await delayFirstResult.wait(); - await timeout(0); // wait for the simple scheduler to fire to check that we do actually get rescheduled - return null; + disposables.add(languageFeaturesService.documentSemanticTokensProvider.register('testMode', new class implements DocumentSemanticTokensProvider { + getLegend(): SemanticTokensLegend { + return { tokenTypes: ['class'], tokenModifiers: [] }; } - if (callCount === 2) { - assert.ok('called twice'); - secondResultProvided.open(); - return null; + async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise { + callCount++; + if (callCount === 1) { + assert.ok('called once'); + inFirstCall.open(); + await delayFirstResult.wait(); + await timeout(0); // wait for the simple scheduler to fire to check that we do actually get rescheduled + return null; + } + if (callCount === 2) { + assert.ok('called twice'); + secondResultProvided.open(); + return null; + } + assert.fail('Unexpected call'); } - assert.fail('Unexpected call'); - } - releaseDocumentSemanticTokens(resultId: string | undefined): void { - } - })); + releaseDocumentSemanticTokens(resultId: string | undefined): void { + } + })); - const textModel = disposables.add(modelService.createModel('Hello world', languageService.createById('testMode'))); + const textModel = disposables.add(modelService.createModel('Hello world', languageService.createById('testMode'))); - // wait for the provider to be called - await inFirstCall.wait(); + // wait for the provider to be called + await inFirstCall.wait(); - // the provider is now in the provide call - // change the text buffer while the provider is running - textModel.applyEdits([{ range: new Range(1, 1, 1, 1), text: 'x' }]); + // the provider is now in the provide call + // change the text buffer while the provider is running + textModel.applyEdits([{ range: new Range(1, 1, 1, 1), text: 'x' }]); - // let the provider finish its first result - delayFirstResult.open(); + // let the provider finish its first result + delayFirstResult.open(); - // we need to check that the provider is called again, even if it returns null - await secondResultProvided.wait(); + // we need to check that the provider is called again, even if it returns null + await secondResultProvided.wait(); - // assert that it got called twice - assert.strictEqual(callCount, 2); + // assert that it got called twice + assert.strictEqual(callCount, 2); + }); }); test('DocumentSemanticTokens should be pick the token provider with actual items', async () => { + await runWithFakedTimers({}, async () => { - let callCount = 0; - disposables.add(ModesRegistry.registerLanguage({ id: 'testMode2' })); - disposables.add(DocumentSemanticTokensProviderRegistry.register('testMode2', new class implements DocumentSemanticTokensProvider { - getLegend(): SemanticTokensLegend { - return { tokenTypes: ['class1'], tokenModifiers: [] }; - } - async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise { - callCount++; - // For a secondary request return a different value - if (lastResultId) { + let callCount = 0; + disposables.add(ModesRegistry.registerLanguage({ id: 'testMode2' })); + disposables.add(languageFeaturesService.documentSemanticTokensProvider.register('testMode2', new class implements DocumentSemanticTokensProvider { + getLegend(): SemanticTokensLegend { + return { tokenTypes: ['class1'], tokenModifiers: [] }; + } + async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise { + callCount++; + // For a secondary request return a different value + if (lastResultId) { + return { + data: new Uint32Array([2, 1, 1, 1, 1, 0, 2, 1, 1, 1]) + }; + } return { - data: new Uint32Array([2, 1, 1, 1, 1, 0, 2, 1, 1, 1]) + resultId: '1', + data: new Uint32Array([0, 1, 1, 1, 1, 0, 2, 1, 1, 1]) }; } - return { - resultId: '1', - data: new Uint32Array([0, 1, 1, 1, 1, 0, 2, 1, 1, 1]) - }; - } - releaseDocumentSemanticTokens(resultId: string | undefined): void { - } - })); - disposables.add(DocumentSemanticTokensProviderRegistry.register('testMode2', new class implements DocumentSemanticTokensProvider { - getLegend(): SemanticTokensLegend { - return { tokenTypes: ['class2'], tokenModifiers: [] }; - } - async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise { - callCount++; - return null; - } - releaseDocumentSemanticTokens(resultId: string | undefined): void { - } - })); + releaseDocumentSemanticTokens(resultId: string | undefined): void { + } + })); + disposables.add(languageFeaturesService.documentSemanticTokensProvider.register('testMode2', new class implements DocumentSemanticTokensProvider { + getLegend(): SemanticTokensLegend { + return { tokenTypes: ['class2'], tokenModifiers: [] }; + } + async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise { + callCount++; + return null; + } + releaseDocumentSemanticTokens(resultId: string | undefined): void { + } + })); - function toArr(arr: Uint32Array): number[] { - const result: number[] = []; - for (let i = 0; i < arr.length; i++) { - result[i] = arr[i]; + function toArr(arr: Uint32Array): number[] { + const result: number[] = []; + for (let i = 0; i < arr.length; i++) { + result[i] = arr[i]; + } + return result; } - return result; - } - const textModel = modelService.createModel('Hello world 2', languageService.createById('testMode2')); - try { - let result = await getDocumentSemanticTokens(textModel, null, null, CancellationToken.None); - assert.ok(result, `We should have tokens (1)`); - assert.ok(result.tokens, `Tokens are found from multiple providers (1)`); - assert.ok(isSemanticTokens(result.tokens), `Tokens are full (1)`); - assert.ok(result.tokens.resultId, `Token result id found from multiple providers (1)`); - assert.deepStrictEqual(toArr(result.tokens.data), [0, 1, 1, 1, 1, 0, 2, 1, 1, 1], `Token data returned for multiple providers (1)`); - assert.deepStrictEqual(callCount, 2, `Called both token providers (1)`); - assert.deepStrictEqual(result.provider.getLegend(), { tokenTypes: ['class1'], tokenModifiers: [] }, `Legend matches the tokens (1)`); + const textModel = modelService.createModel('Hello world 2', languageService.createById('testMode2')); + try { + let result = await getDocumentSemanticTokens(languageFeaturesService.documentSemanticTokensProvider, textModel, null, null, CancellationToken.None); + assert.ok(result, `We should have tokens (1)`); + assert.ok(result.tokens, `Tokens are found from multiple providers (1)`); + assert.ok(isSemanticTokens(result.tokens), `Tokens are full (1)`); + assert.ok(result.tokens.resultId, `Token result id found from multiple providers (1)`); + assert.deepStrictEqual(toArr(result.tokens.data), [0, 1, 1, 1, 1, 0, 2, 1, 1, 1], `Token data returned for multiple providers (1)`); + assert.deepStrictEqual(callCount, 2, `Called both token providers (1)`); + assert.deepStrictEqual(result.provider.getLegend(), { tokenTypes: ['class1'], tokenModifiers: [] }, `Legend matches the tokens (1)`); - // Make a second request. Make sure we get the secondary value - result = await getDocumentSemanticTokens(textModel, result.provider, result.tokens.resultId, CancellationToken.None); - assert.ok(result, `We should have tokens (2)`); - assert.ok(result.tokens, `Tokens are found from multiple providers (2)`); - assert.ok(isSemanticTokens(result.tokens), `Tokens are full (2)`); - assert.ok(!result.tokens.resultId, `Token result id found from multiple providers (2)`); - assert.deepStrictEqual(toArr(result.tokens.data), [2, 1, 1, 1, 1, 0, 2, 1, 1, 1], `Token data returned for multiple providers (2)`); - assert.deepStrictEqual(callCount, 4, `Called both token providers (2)`); - assert.deepStrictEqual(result.provider.getLegend(), { tokenTypes: ['class1'], tokenModifiers: [] }, `Legend matches the tokens (2)`); - } finally { - disposables.clear(); + // Make a second request. Make sure we get the secondary value + result = await getDocumentSemanticTokens(languageFeaturesService.documentSemanticTokensProvider, textModel, result.provider, result.tokens.resultId, CancellationToken.None); + assert.ok(result, `We should have tokens (2)`); + assert.ok(result.tokens, `Tokens are found from multiple providers (2)`); + assert.ok(isSemanticTokens(result.tokens), `Tokens are full (2)`); + assert.ok(!result.tokens.resultId, `Token result id found from multiple providers (2)`); + assert.deepStrictEqual(toArr(result.tokens.data), [2, 1, 1, 1, 1, 0, 2, 1, 1, 1], `Token data returned for multiple providers (2)`); + assert.deepStrictEqual(callCount, 4, `Called both token providers (2)`); + assert.deepStrictEqual(result.provider.getLegend(), { tokenTypes: ['class1'], tokenModifiers: [] }, `Legend matches the tokens (2)`); + } finally { + disposables.clear(); - // Wait for scheduler to finish - await timeout(0); + // Wait for scheduler to finish + await timeout(0); - // Now dispose the text model - textModel.dispose(); - } + // Now dispose the text model + textModel.dispose(); + } + }); }); }); diff --git a/src/vs/editor/test/common/services/semanticTokensDto.test.ts b/src/vs/editor/test/common/services/semanticTokensDto.test.ts index 9cedebd292e..a0ffe79f823 100644 --- a/src/vs/editor/test/common/services/semanticTokensDto.test.ts +++ b/src/vs/editor/test/common/services/semanticTokensDto.test.ts @@ -29,7 +29,7 @@ suite('SemanticTokensDto', () => { } function assertEqualDelta(actual: IDeltaSemanticTokensDto, expected: IDeltaSemanticTokensDto): void { - const convertOne = (delta: { start: number; deleteCount: number; data?: Uint32Array; }) => { + const convertOne = (delta: { start: number; deleteCount: number; data?: Uint32Array }) => { if (!delta.data) { return delta; } diff --git a/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts b/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts index 1c2a6d54e14..030f9433805 100644 --- a/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts +++ b/src/vs/editor/test/common/services/semanticTokensProviderStyling.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { SparseMultilineTokens } from 'vs/editor/common/model/tokens/sparseMultilineTokens'; +import { SparseMultilineTokens } from 'vs/editor/common/tokens/sparseMultilineTokens'; import { MetadataConsts } from 'vs/editor/common/languages'; import { ModesRegistry } from 'vs/editor/common/languages/modesRegistry'; import { SemanticTokensProviderStyling, toMultilineTokens2 } from 'vs/editor/common/services/semanticTokensProviderStyling'; diff --git a/src/vs/editor/test/common/services/textResourceConfigurationService.test.ts b/src/vs/editor/test/common/services/textResourceConfigurationService.test.ts index 0ed29121aec..0e96cff2069 100644 --- a/src/vs/editor/test/common/services/textResourceConfigurationService.test.ts +++ b/src/vs/editor/test/common/services/textResourceConfigurationService.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IConfigurationValue, IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { TextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/editor/test/common/testTextModel.ts b/src/vs/editor/test/common/testTextModel.ts index cc2b236c5b5..3be6c15f0da 100644 --- a/src/vs/editor/test/common/testTextModel.ts +++ b/src/vs/editor/test/common/testTextModel.ts @@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri'; import { BracketPairColorizationOptions, DefaultEndOfLine, ITextBufferFactory, ITextModelCreationOptions } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfiguration'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; @@ -31,6 +31,7 @@ import { IModelService } from 'vs/editor/common/services/model'; import { ModelService } from 'vs/editor/common/services/modelService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; +import { ILanguageFeatureDebounceService, LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; class TestTextModel extends TextModel { public registerDisposable(disposable: IDisposable): void { @@ -102,6 +103,7 @@ export function createModelServices(disposables: DisposableStore, services: Serv define(ITextResourcePropertiesService, TestTextResourcePropertiesService); define(IThemeService, TestThemeService); define(ILogService, NullLogService); + define(ILanguageFeatureDebounceService, LanguageFeatureDebounceService); define(IModelService, ModelService); const instantiationService = new TestInstantiationService(services); diff --git a/src/vs/editor/test/common/view/overviewZoneManager.test.ts b/src/vs/editor/test/common/view/overviewZoneManager.test.ts index 59f7e2d83f3..751e7651ed1 100644 --- a/src/vs/editor/test/common/view/overviewZoneManager.test.ts +++ b/src/vs/editor/test/common/view/overviewZoneManager.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { ColorZone, OverviewRulerZone, OverviewZoneManager } from 'vs/editor/common/view/overviewZoneManager'; +import { ColorZone, OverviewRulerZone, OverviewZoneManager } from 'vs/editor/common/viewModel/overviewZoneManager'; suite('Editor View - OverviewZoneManager', () => { diff --git a/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts b/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts index 9ced21b60ff..7acf0b75f3f 100644 --- a/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts +++ b/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; import { DecorationSegment, LineDecoration, LineDecorationsNormalizer } from 'vs/editor/common/viewLayout/lineDecorations'; -import { InlineDecoration, InlineDecorationType } from 'vs/editor/common/viewModel/viewModel'; +import { InlineDecoration, InlineDecorationType } from 'vs/editor/common/viewModel'; suite('Editor ViewLayout - ViewLineParts', () => { diff --git a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts index b0146cd411d..320574897a1 100644 --- a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts +++ b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts @@ -6,11 +6,11 @@ import * as assert from 'assert'; import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; -import { IViewLineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import { IViewLineTokens } from 'vs/editor/common/tokens/lineTokens'; import { MetadataConsts } from 'vs/editor/common/languages'; import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations'; import { CharacterMapping, RenderLineInput, renderViewLine2 as renderViewLine, LineRange, DomPosition } from 'vs/editor/common/viewLayout/viewLineRenderer'; -import { InlineDecorationType } from 'vs/editor/common/viewModel/viewModel'; +import { InlineDecorationType } from 'vs/editor/common/viewModel'; import { TestLineToken, TestLineTokens } from 'vs/editor/test/common/core/testLineToken'; function createViewLineTokens(viewLineTokens: TestLineToken[]): IViewLineTokens { diff --git a/src/vs/editor/test/common/viewModel/lineBreakData.test.ts b/src/vs/editor/test/common/viewModel/lineBreakData.test.ts index 6ff5c565287..9b2715c1c23 100644 --- a/src/vs/editor/test/common/viewModel/lineBreakData.test.ts +++ b/src/vs/editor/test/common/viewModel/lineBreakData.test.ts @@ -6,7 +6,7 @@ import assert = require('assert'); import { PositionAffinity } from 'vs/editor/common/model'; import { ModelDecorationInjectedTextOptions } from 'vs/editor/common/model/textModel'; -import { ModelLineProjectionData } from 'vs/editor/common/viewModel/modelLineProjectionData'; +import { ModelLineProjectionData } from 'vs/editor/common/modelLineProjectionData'; suite('Editor ViewModel - LineBreakData', () => { test('Basic', () => { diff --git a/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts b/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts index 8eed821c53f..fdd4bfcc55b 100644 --- a/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts +++ b/src/vs/editor/test/common/viewModel/monospaceLineBreaksComputer.test.ts @@ -6,9 +6,9 @@ import * as assert from 'assert'; import { WrappingIndent, EditorOptions } from 'vs/editor/common/config/editorOptions'; import { MonospaceLineBreaksComputerFactory } from 'vs/editor/common/viewModel/monospaceLineBreaksComputer'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; -import { ModelLineProjectionData, ILineBreaksComputerFactory } from 'vs/editor/common/viewModel/modelLineProjectionData'; +import { ModelLineProjectionData, ILineBreaksComputerFactory } from 'vs/editor/common/modelLineProjectionData'; -function parseAnnotatedText(annotatedText: string): { text: string; indices: number[]; } { +function parseAnnotatedText(annotatedText: string): { text: string; indices: number[] } { let text = ''; let currentLineIndex = 0; const indices: number[] = []; diff --git a/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts b/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts index b1271a5ce76..a0dcd9d76b1 100644 --- a/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts +++ b/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { toUint32 } from 'vs/base/common/uint'; -import { PrefixSumComputer, PrefixSumIndexOfResult } from 'vs/editor/common/viewModel/prefixSumComputer'; +import { PrefixSumComputer, PrefixSumIndexOfResult } from 'vs/editor/common/model/prefixSumComputer'; function toUint32Array(arr: number[]): Uint32Array { const len = arr.length; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 1de2d4856c7..3226ae97984 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -423,6 +423,7 @@ declare namespace monaco { readonly isTrusted?: boolean; readonly supportThemeIcons?: boolean; readonly supportHtml?: boolean; + readonly baseUri?: UriComponents; uris?: { [href: string]: UriComponents; }; @@ -705,6 +706,7 @@ declare namespace monaco { */ static lift(range: undefined | null): null; static lift(range: IRange): Range; + static lift(range: IRange | undefined | null): Range | null; /** * Test if `obj` is an `IRange`. */ @@ -731,6 +733,7 @@ declare namespace monaco { * Test if the range spans multiple lines. */ static spansMultipleLines(range: IRange): boolean; + toJSON(): IRange; } /** @@ -1351,6 +1354,44 @@ declare namespace monaco.editor { id: string; } + /** + * A single edit operation, that acts as a simple replace. + * i.e. Replace text at `range` with `text` in model. + */ + export interface ISingleEditOperation { + /** + * The range to replace. This can be empty to emulate a simple insert. + */ + range: IRange; + /** + * The text to replace with. This can be null to emulate a simple delete. + */ + text: string | null; + /** + * This indicates that this operation has "insert" semantics. + * i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved. + */ + forceMoveMarkers?: boolean; + } + + /** + * Word inside a model. + */ + export interface IWordAtPosition { + /** + * The word. + */ + readonly word: string; + /** + * The column where the word starts. + */ + readonly startColumn: number; + /** + * The column where the word ends. + */ + readonly endColumn: number; + } + /** * Vertical Lane in the overview ruler of the editor. */ @@ -1556,24 +1597,6 @@ declare namespace monaco.editor { readonly options: IModelDecorationOptions; } - /** - * Word inside a model. - */ - export interface IWordAtPosition { - /** - * The word. - */ - readonly word: string; - /** - * The column where the word starts. - */ - readonly startColumn: number; - /** - * The column where the word ends. - */ - readonly endColumn: number; - } - /** * End of line character preference. */ @@ -1620,43 +1643,10 @@ declare namespace monaco.editor { CRLF = 1 } - /** - * A single edit operation, that acts as a simple replace. - * i.e. Replace text at `range` with `text` in model. - */ - export interface ISingleEditOperation { - /** - * The range to replace. This can be empty to emulate a simple insert. - */ - range: IRange; - /** - * The text to replace with. This can be null to emulate a simple delete. - */ - text: string | null; - /** - * This indicates that this operation has "insert" semantics. - * i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved. - */ - forceMoveMarkers?: boolean; - } - /** * A single edit operation, that has an identifier. */ - export interface IIdentifiedSingleEditOperation { - /** - * The range to replace. This can be empty to emulate a simple insert. - */ - range: IRange; - /** - * The text to replace with. This can be null to emulate a simple delete. - */ - text: string | null; - /** - * This indicates that this operation has "insert" semantics. - * i.e. forceMoveMarkers = true => if `range` is collapsed, all markers at the position will be moved. - */ - forceMoveMarkers?: boolean; + export interface IIdentifiedSingleEditOperation extends ISingleEditOperation { } export interface IValidEditOperation { @@ -2089,6 +2079,52 @@ declare namespace monaco.editor { isAttachedToEditor(): boolean; } + export enum PositionAffinity { + /** + * Prefers the left most position. + */ + Left = 0, + /** + * Prefers the right most position. + */ + Right = 1, + /** + * No preference. + */ + None = 2 + } + + /** + * A change + */ + export interface IChange { + readonly originalStartLineNumber: number; + readonly originalEndLineNumber: number; + readonly modifiedStartLineNumber: number; + readonly modifiedEndLineNumber: number; + } + + /** + * A character level change. + */ + export interface ICharChange extends IChange { + readonly originalStartColumn: number; + readonly originalEndColumn: number; + readonly modifiedStartColumn: number; + readonly modifiedEndColumn: number; + } + + /** + * A line change + */ + export interface ILineChange extends IChange { + readonly charChanges: ICharChange[] | undefined; + } + export interface IDimension { + width: number; + height: number; + } + /** * A builder and helper for edit operations for a command. */ @@ -2181,38 +2217,6 @@ declare namespace monaco.editor { readonly newModelUrl: Uri | null; } - export interface IDimension { - width: number; - height: number; - } - - /** - * A change - */ - export interface IChange { - readonly originalStartLineNumber: number; - readonly originalEndLineNumber: number; - readonly modifiedStartLineNumber: number; - readonly modifiedEndLineNumber: number; - } - - /** - * A character level change. - */ - export interface ICharChange extends IChange { - readonly originalStartColumn: number; - readonly originalEndColumn: number; - readonly modifiedStartColumn: number; - readonly modifiedEndColumn: number; - } - - /** - * A line change - */ - export interface ILineChange extends IChange { - readonly charChanges: ICharChange[] | undefined; - } - export interface IContentSizeChangedEvent { readonly contentWidth: number; readonly contentHeight: number; @@ -2350,8 +2354,9 @@ declare namespace monaco.editor { /** * Set the primary position of the cursor. This will remove any secondary cursors. * @param position New primary cursor's position + * @param source Source of the call that caused the position */ - setPosition(position: IPosition): void; + setPosition(position: IPosition, source?: string): void; /** * Scroll vertically as necessary and reveal a line. */ @@ -2397,28 +2402,34 @@ declare namespace monaco.editor { /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection + * @param source Source of the call that caused the selection */ - setSelection(selection: IRange): void; + setSelection(selection: IRange, source?: string): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection + * @param source Source of the call that caused the selection */ - setSelection(selection: Range): void; + setSelection(selection: Range, source?: string): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection + * @param source Source of the call that caused the selection */ - setSelection(selection: ISelection): void; + setSelection(selection: ISelection, source?: string): void; /** * Set the primary selection of the editor. This will remove any secondary cursors. * @param selection The new selection + * @param source Source of the call that caused the selection */ - setSelection(selection: Selection): void; + setSelection(selection: Selection, source?: string): void; /** * Set the selections for all the cursors of the editor. * Cursors will be removed or added, as necessary. + * @param selections The new selection + * @param source Source of the call that caused the selection */ - setSelections(selections: readonly ISelection[]): void; + setSelections(selections: readonly ISelection[], source?: string): void; /** * Scroll vertically as necessary and reveal lines. */ @@ -3321,7 +3332,14 @@ declare namespace monaco.editor { * Controls the behavior of editor guides. */ guides?: IGuidesOptions; + /** + * Controls the behavior of the unicode highlight feature + * (by default, ambiguous and invisible characters are highlighted). + */ unicodeHighlight?: IUnicodeHighlightOptions; + /** + * Configures bracket pair colorization (disabled by default). + */ bracketPairColorization?: IBracketPairColorizationOptions; } @@ -3902,15 +3920,33 @@ declare namespace monaco.editor { * Configuration options for unicode highlighting. */ export interface IUnicodeHighlightOptions { + /** + * Controls whether all non-basic ASCII characters are highlighted. Only characters between U+0020 and U+007E, tab, line-feed and carriage-return are considered basic ASCII. + */ nonBasicASCII?: boolean | InUntrustedWorkspace; + /** + * Controls whether characters that just reserve space or have no width at all are highlighted. + */ invisibleCharacters?: boolean; + /** + * Controls whether characters are highlighted that can be confused with basic ASCII characters, except those that are common in the current user locale. + */ ambiguousCharacters?: boolean; + /** + * Controls whether characters in comments should also be subject to unicode highlighting. + */ includeComments?: boolean | InUntrustedWorkspace; + /** + * Controls whether characters in strings should also be subject to unicode highlighting. + */ includeStrings?: boolean | InUntrustedWorkspace; /** - * A map of allowed characters (true: allowed). - */ + * Defines allowed characters that are not being highlighted. + */ allowedCharacters?: Record; + /** + * Unicode characters that are common in allowed locales are not being highlighted. + */ allowedLocales?: Record; } @@ -4437,6 +4473,18 @@ declare namespace monaco.editor { export type FindComputedEditorOptionValueById = NonNullable]>>; + export interface IEditorConstructionOptions extends IEditorOptions { + /** + * The initial editor dimension (to avoid measuring the container). + */ + dimension?: IDimension; + /** + * Place overflow widgets inside an external DOM node. + * Defaults to an internal DOM node. + */ + overflowWidgetsDomNode?: HTMLElement; + } + /** * A view zone is a full horizontal rectangle that 'pushes' text down. * The editor reserves space for view zones when rendering. @@ -4450,8 +4498,13 @@ declare namespace monaco.editor { /** * The column after which this zone should appear. * If not set, the maxLineColumn of `afterLineNumber` will be used. + * This is relevant for wrapped lines. */ afterColumn?: number; + /** + * If the `afterColumn` has multiple view columns, the affinity specifies which one to use. Defaults to `none`. + */ + afterColumnAffinity?: PositionAffinity; /** * Suppress mouse down events. * If set, the editor will attach a mouse down listener to the view zone and .preventDefault on it. @@ -4837,18 +4890,6 @@ declare namespace monaco.editor { readonly languageId: string | null; } - export interface IEditorConstructionOptions extends IEditorOptions { - /** - * The initial editor dimension (to avoid measuring the container). - */ - dimension?: IDimension; - /** - * Place overflow widgets inside an external DOM node. - * Defaults to an internal DOM node. - */ - overflowWidgetsDomNode?: HTMLElement; - } - export interface IDiffEditorConstructionOptions extends IDiffEditorOptions { /** * The initial editor dimension (to avoid measuring the container). @@ -6192,6 +6233,11 @@ declare namespace monaco.languages { */ readonly range?: IRange; readonly command?: Command; + /** + * If set to `true`, unopened closing brackets are removed and unclosed opening brackets are closed. + * Defaults to `false`. + */ + readonly completeBracketPairs?: boolean; } export interface InlineCompletions { @@ -6857,24 +6903,25 @@ declare namespace monaco.languages { } export enum InlayHintKind { - Other = 0, Type = 1, Parameter = 2 } export interface InlayHintLabelPart { label: string; - collapsible?: boolean; - action?: Command | Location; + tooltip?: string | IMarkdownString; + command?: Command; + location?: Location; } export interface InlayHint { label: string | InlayHintLabelPart[]; tooltip?: string | IMarkdownString; + command?: Command; position: IPosition; - kind: InlayHintKind; - whitespaceBefore?: boolean; - whitespaceAfter?: boolean; + kind?: InlayHintKind; + paddingLeft?: boolean; + paddingRight?: boolean; } export interface InlayHintList { @@ -6883,6 +6930,7 @@ declare namespace monaco.languages { } export interface InlayHintsProvider { + displayName?: string; onDidChangeInlayHints?: IEvent; provideInlayHints(model: editor.ITextModel, range: Range, token: CancellationToken): ProviderResult; resolveInlayHint?(hint: InlayHint, token: CancellationToken): ProviderResult; diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 83b5bc8bfb8..dc848c86d17 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -24,7 +24,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; -export function createAndFillInContextMenuActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, primaryGroup?: string): IDisposable { +export function createAndFillInContextMenuActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[] }, primaryGroup?: string): IDisposable { const groups = menu.getActions(options); const modifierKeyEmitter = ModifierKeyEmitter.getInstance(); const useAlternativeActions = modifierKeyEmitter.keyStatus.altKey || ((isWindows || isLinux) && modifierKeyEmitter.keyStatus.shiftKey); @@ -32,7 +32,7 @@ export function createAndFillInContextMenuActions(menu: IMenu, options: IMenuAct return asDisposable(groups); } -export function createAndFillInActionBarActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, primaryGroup?: string | ((actionGroup: string) => boolean), primaryMaxCount?: number, shouldInlineSubmenu?: (action: SubmenuAction, group: string, groupSize: number) => boolean, useSeparatorsInPrimaryActions?: boolean): IDisposable { +export function createAndFillInActionBarActions(menu: IMenu, options: IMenuActionOptions | undefined, target: IAction[] | { primary: IAction[]; secondary: IAction[] }, primaryGroup?: string | ((actionGroup: string) => boolean), primaryMaxCount?: number, shouldInlineSubmenu?: (action: SubmenuAction, group: string, groupSize: number) => boolean, useSeparatorsInPrimaryActions?: boolean): IDisposable { const groups = menu.getActions(options); const isPrimaryAction = typeof primaryGroup === 'string' ? (actionGroup: string) => actionGroup === primaryGroup : primaryGroup; @@ -53,7 +53,7 @@ function asDisposable(groups: ReadonlyArray<[string, ReadonlyArray]>, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, + groups: ReadonlyArray<[string, ReadonlyArray]>, target: IAction[] | { primary: IAction[]; secondary: IAction[] }, useAlternativeActions: boolean, isPrimaryAction: (actionGroup: string) => boolean = actionGroup => actionGroup === 'navigation', primaryMaxCount: number = Number.MAX_SAFE_INTEGER, @@ -71,7 +71,7 @@ function fillInActions( secondaryBucket = target.secondary; } - const submenuInfo = new Set<{ group: string, action: SubmenuAction, index: number }>(); + const submenuInfo = new Set<{ group: string; action: SubmenuAction; index: number }>(); for (const [group, actions] of groups) { diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 7c474d77838..5bf640a9ba8 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -14,7 +14,7 @@ import { URI } from 'vs/base/common/uri'; import { CommandsRegistry, ICommandHandlerDescription, ICommandService } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, ContextKeyExpression, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { SyncDescriptor, SyncDescriptor0 } from 'vs/platform/instantiation/common/descriptors'; -import { BrandedService, createDecorator, IConstructorSignature2, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { BrandedService, createDecorator, IConstructorSignature, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingRule, IKeybindings, KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; @@ -36,7 +36,7 @@ export interface ICommandActionTitle extends ILocalizedString { mnemonicTitle?: string; } -export type Icon = { dark?: URI; light?: URI; } | ThemeIcon; +export type Icon = { dark?: URI; light?: URI } | ThemeIcon; export interface ICommandAction { id: string; @@ -47,7 +47,7 @@ export interface ICommandAction { icon?: Icon; source?: string; precondition?: ContextKeyExpression; - toggled?: ContextKeyExpression | { condition: ContextKeyExpression, icon?: Icon, tooltip?: string, title?: string | ILocalizedString }; + toggled?: ContextKeyExpression | { condition: ContextKeyExpression; icon?: Icon; tooltip?: string; title?: string | ILocalizedString }; } export type ISerializableCommandAction = UriDto; @@ -113,6 +113,7 @@ export class MenuId { static readonly MenubarLayoutMenu = new MenuId('MenubarLayoutMenu'); static readonly MenubarNewBreakpointMenu = new MenuId('MenubarNewBreakpointMenu'); static readonly MenubarPanelAlignmentMenu = new MenuId('MenubarPanelAlignmentMenu'); + static readonly MenubarPanelPositionMenu = new MenuId('MenubarPanelPositionMenu'); static readonly MenubarPreferencesMenu = new MenuId('MenubarPreferencesMenu'); static readonly MenubarRecentMenu = new MenuId('MenubarRecentMenu'); static readonly MenubarSelectionMenu = new MenuId('MenubarSelectionMenu'); @@ -233,7 +234,7 @@ export interface IMenuRegistry { addCommand(userCommand: ICommandAction): IDisposable; getCommand(id: string): ICommandAction | undefined; getCommands(): ICommandsMap; - appendMenuItems(items: Iterable<{ id: MenuId, item: IMenuItem | ISubmenuItem }>): IDisposable; + appendMenuItems(items: Iterable<{ id: MenuId; item: IMenuItem | ISubmenuItem }>): IDisposable; appendMenuItem(menu: MenuId, item: IMenuItem | ISubmenuItem): IDisposable; getMenuItems(loc: MenuId): Array; } @@ -284,7 +285,7 @@ export const MenuRegistry: IMenuRegistry = new class implements IMenuRegistry { return this.appendMenuItems(Iterable.single({ id, item })); } - appendMenuItems(items: Iterable<{ id: MenuId, item: IMenuItem | ISubmenuItem }>): IDisposable { + appendMenuItems(items: Iterable<{ id: MenuId; item: IMenuItem | ISubmenuItem }>): IDisposable { const changedIds = new Set(); const toRemove = new LinkedList(); @@ -346,21 +347,6 @@ export const MenuRegistry: IMenuRegistry = new class implements IMenuRegistry { } }; -export class ExecuteCommandAction extends Action { - - constructor( - id: string, - label: string, - @ICommandService private readonly _commandService: ICommandService) { - - super(id, label); - } - - override run(...args: any[]): Promise { - return this._commandService.executeCommand(this.id, ...args); - } -} - export class SubmenuItemAction extends SubmenuAction { constructor( @@ -423,7 +409,7 @@ export class MenuItemAction implements IAction { if (item.toggled) { const toggled = ((item.toggled as { condition: ContextKeyExpression }).condition ? item.toggled : { condition: item.toggled }) as { - condition: ContextKeyExpression, icon?: Icon, tooltip?: string | ILocalizedString, title?: string | ILocalizedString + condition: ContextKeyExpression; icon?: Icon; tooltip?: string | ILocalizedString; title?: string | ILocalizedString; }; this.checked = contextKeyService.contextMatchesRules(toggled.condition); if (this.checked && toggled.tooltip) { @@ -477,7 +463,7 @@ export class SyncActionDescriptor { public static create(ctor: { new(id: string, label: string, ...services: Services): Action }, id: string, label: string | undefined, keybindings?: IKeybindings, keybindingContext?: ContextKeyExpression, keybindingWeight?: number ): SyncActionDescriptor { - return new SyncActionDescriptor(ctor as IConstructorSignature2, id, label, keybindings, keybindingContext, keybindingWeight); + return new SyncActionDescriptor(ctor as IConstructorSignature, id, label, keybindings, keybindingContext, keybindingWeight); } public static from( @@ -491,7 +477,7 @@ export class SyncActionDescriptor { return SyncActionDescriptor.create(ctor, ctor.ID, ctor.LABEL, keybindings, keybindingContext, keybindingWeight); } - private constructor(ctor: IConstructorSignature2, + private constructor(ctor: IConstructorSignature, id: string, label: string | undefined, keybindings?: IKeybindings, keybindingContext?: ContextKeyExpression, keybindingWeight?: number ) { this._id = id; @@ -499,7 +485,7 @@ export class SyncActionDescriptor { this._keybindings = keybindings; this._keybindingContext = keybindingContext; this._keybindingWeight = keybindingWeight; - this._descriptor = new SyncDescriptor(ctor, [this._id, this._label]) as unknown as SyncDescriptor0; + this._descriptor = new SyncDescriptor(ctor, [this._id, this._label]); } public get syncDescriptor(): SyncDescriptor0 { diff --git a/src/vs/platform/backup/electron-main/backup.ts b/src/vs/platform/backup/electron-main/backup.ts index 1569939b36c..74fca3a51fe 100644 --- a/src/vs/platform/backup/electron-main/backup.ts +++ b/src/vs/platform/backup/electron-main/backup.ts @@ -6,7 +6,8 @@ import { URI } from 'vs/base/common/uri'; import { IEmptyWindowBackupInfo } from 'vs/platform/backup/node/backup'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IFolderBackupInfo, IWorkspaceBackupInfo, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IFolderBackupInfo, IWorkspaceBackupInfo } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export const IBackupMainService = createDecorator('backupMainService'); diff --git a/src/vs/platform/backup/electron-main/backupMainService.ts b/src/vs/platform/backup/electron-main/backupMainService.ts index 90155063a80..d7e0d46febd 100644 --- a/src/vs/platform/backup/electron-main/backupMainService.ts +++ b/src/vs/platform/backup/electron-main/backupMainService.ts @@ -18,7 +18,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import { HotExitConfiguration, IFilesConfiguration } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; -import { IFolderBackupInfo, isFolderBackupInfo, isWorkspaceIdentifier, IWorkspaceBackupInfo, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IFolderBackupInfo, isFolderBackupInfo, IWorkspaceBackupInfo } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export class BackupMainService implements IBackupMainService { diff --git a/src/vs/platform/backup/node/backup.ts b/src/vs/platform/backup/node/backup.ts index cf98a57aab2..8587d581763 100644 --- a/src/vs/platform/backup/node/backup.ts +++ b/src/vs/platform/backup/node/backup.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -export interface ISerializedWorkspace { id: string; configURIPath: string; remoteAuthority?: string; } +export interface ISerializedWorkspace { id: string; configURIPath: string; remoteAuthority?: string } -export interface ISerializedFolder { folderUri: string; remoteAuthority?: string; } +export interface ISerializedFolder { folderUri: string; remoteAuthority?: string } export interface IBackupWorkspacesFormat { rootURIWorkspaces: ISerializedWorkspace[]; diff --git a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts index 384054607a6..2a06b982d57 100644 --- a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts +++ b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts @@ -22,8 +22,8 @@ import { OPTIONS, parseArgs } from 'vs/platform/environment/node/argv'; import { HotExitConfiguration } from 'vs/platform/files/common/files'; import { ConsoleMainLogger, LogService } from 'vs/platform/log/common/log'; import product from 'vs/platform/product/common/product'; -import { IFolderBackupInfo, isFolderBackupInfo, IWorkspaceBackupInfo, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; -import { Uri } from 'vscode'; +import { IFolderBackupInfo, isFolderBackupInfo, IWorkspaceBackupInfo } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; flakySuite('BackupMainService', () => { @@ -49,7 +49,7 @@ flakySuite('BackupMainService', () => { }; } - function toFolderBackupInfo(uri: Uri, remoteAuthority?: string): IFolderBackupInfo { + function toFolderBackupInfo(uri: URI, remoteAuthority?: string): IFolderBackupInfo { return { folderUri: uri, remoteAuthority }; } @@ -95,7 +95,7 @@ flakySuite('BackupMainService', () => { const fooFile = URI.file(platform.isWindows ? 'C:\\foo' : '/foo'); const barFile = URI.file(platform.isWindows ? 'C:\\bar' : '/bar'); - let service: BackupMainService & { toBackupPath(arg: URI | string): string, getFolderHash(folder: IFolderBackupInfo): string }; + let service: BackupMainService & { toBackupPath(arg: URI | string): string; getFolderHash(folder: IFolderBackupInfo): string }; let configService: TestConfigurationService; let environmentService: EnvironmentMainService; @@ -622,7 +622,7 @@ flakySuite('BackupMainService', () => { suite('getWorkspaceHash', () => { (platform.isLinux ? test.skip : test)('should ignore case on Windows and Mac', () => { - const assertFolderHash = (uri1: Uri, uri2: Uri) => { + const assertFolderHash = (uri1: URI, uri2: URI) => { assert.strictEqual(service.getFolderHash(toFolderBackupInfo(uri1)), service.getFolderHash(toFolderBackupInfo(uri2))); }; diff --git a/src/vs/platform/configuration/common/configuration.ts b/src/vs/platform/configuration/common/configuration.ts index 1686b418ce9..dcfdbd41441 100644 --- a/src/vs/platform/configuration/common/configuration.ts +++ b/src/vs/platform/configuration/common/configuration.ts @@ -31,7 +31,7 @@ export function isConfigurationUpdateOverrides(thing: any): thing is IConfigurat && (!thing.resource || thing.resource instanceof URI); } -export type IConfigurationUpdateOverrides = Omit & { overrideIdentifiers?: string[] | null; }; +export type IConfigurationUpdateOverrides = Omit & { overrideIdentifiers?: string[] | null }; export const enum ConfigurationTarget { USER = 1, @@ -82,13 +82,13 @@ export interface IConfigurationValue { readonly memoryValue?: T; readonly value?: T; - readonly default?: { value?: T, override?: T }; - readonly user?: { value?: T, override?: T }; - readonly userLocal?: { value?: T, override?: T }; - readonly userRemote?: { value?: T, override?: T }; - readonly workspace?: { value?: T, override?: T }; - readonly workspaceFolder?: { value?: T, override?: T }; - readonly memory?: { value?: T, override?: T }; + readonly default?: { value?: T; override?: T }; + readonly user?: { value?: T; override?: T }; + readonly userLocal?: { value?: T; override?: T }; + readonly userRemote?: { value?: T; override?: T }; + readonly workspace?: { value?: T; override?: T }; + readonly workspaceFolder?: { value?: T; override?: T }; + readonly memory?: { value?: T; override?: T }; readonly overrideIdentifiers?: string[]; } @@ -113,9 +113,27 @@ export interface IConfigurationService { getValue(overrides: IConfigurationOverrides): T; getValue(section: string, overrides: IConfigurationOverrides): T; + /** + * Update a configuration value. + * + * Use `target` to update the configuration in a specific `ConfigurationTarget`. + * + * Use `overrides` to update the configuration for a resource or for override identifiers or both. + * + * Passing a resource through overrides will update the configuration in the workspace folder containing that resource. + * + * *Note 1:* Updating configuraiton to a default value will remove the configuration from the requested target. If not target is passed, it will be removed from all writeable targets. + * + * *Note 2:* Use `undefined` value to remove the configuration from the given target. If not target is passed, it will be removed from all writeable targets. + * + * Use `donotNotifyError` and set it to `true` to surpresss errors. + * + * @param key setting to be updated + * @param value The new value + */ updateValue(key: string, value: any): Promise; - updateValue(key: string, value: any, overrides: IConfigurationOverrides | IConfigurationUpdateOverrides): Promise; updateValue(key: string, value: any, target: ConfigurationTarget): Promise; + updateValue(key: string, value: any, overrides: IConfigurationOverrides | IConfigurationUpdateOverrides): Promise; updateValue(key: string, value: any, overrides: IConfigurationOverrides | IConfigurationUpdateOverrides, target: ConfigurationTarget, donotNotifyError?: boolean): Promise; inspect(key: string, overrides?: IConfigurationOverrides): IConfigurationValue>; diff --git a/src/vs/platform/configuration/common/configurationModels.ts b/src/vs/platform/configuration/common/configurationModels.ts index eb599ee7f30..fac7b51ce1f 100644 --- a/src/vs/platform/configuration/common/configurationModels.ts +++ b/src/vs/platform/configuration/common/configurationModels.ts @@ -15,7 +15,7 @@ import * as types from 'vs/base/common/types'; import { URI, UriComponents } from 'vs/base/common/uri'; import { addToValueTree, ConfigurationTarget, getConfigurationValue, IConfigurationChange, IConfigurationChangeEvent, IConfigurationCompareResult, IConfigurationData, IConfigurationModel, IConfigurationOverrides, IConfigurationUpdateOverrides, IConfigurationValue, IOverrides, removeFromValueTree, toValuesTree } from 'vs/platform/configuration/common/configuration'; import { ConfigurationScope, Extensions, IConfigurationPropertySchema, IConfigurationRegistry, overrideIdentifiersFromKey, OVERRIDE_PROPERTY_REGEX } from 'vs/platform/configuration/common/configurationRegistry'; -import { IFileService } from 'vs/platform/files/common/files'; +import { FileOperation, IFileService } from 'vs/platform/files/common/files'; import { Registry } from 'vs/platform/registry/common/platform'; import { Workspace } from 'vs/platform/workspace/common/workspace'; @@ -372,7 +372,7 @@ export class ConfigurationModelParser { return { contents, keys, overrides, restricted: filtered.restricted }; } - private filter(properties: any, configurationProperties: { [qualifiedKey: string]: IConfigurationPropertySchema | undefined }, filterOverriddenProperties: boolean, options?: ConfigurationParseOptions): { raw: {}, restricted: string[] } { + private filter(properties: any, configurationProperties: { [qualifiedKey: string]: IConfigurationPropertySchema | undefined }, filterOverriddenProperties: boolean, options?: ConfigurationParseOptions): { raw: {}; restricted: string[] } { if (!options?.scopes && !options?.skipRestricted) { return { raw: properties, restricted: [] }; } @@ -439,7 +439,10 @@ export class UserSettings extends Disposable { this._register(this.fileService.watch(extUri.dirname(this.userSettingsResource))); // Also listen to the resource incase the resource is a symlink - https://github.com/microsoft/vscode/issues/118134 this._register(this.fileService.watch(this.userSettingsResource)); - this._register(Event.filter(this.fileService.onDidFilesChange, e => e.contains(this.userSettingsResource))(() => this._onDidChange.fire())); + this._register(Event.any( + Event.filter(this.fileService.onDidFilesChange, e => e.contains(this.userSettingsResource)), + Event.filter(this.fileService.onDidRunOperation, e => (e.isOperation(FileOperation.CREATE) || e.isOperation(FileOperation.DELETE) || e.isOperation(FileOperation.WRITE)) && extUri.isEqual(e.resource, userSettingsResource)) + )(() => this._onDidChange.fire())); } async loadConfiguration(): Promise { @@ -852,7 +855,7 @@ export class ConfigurationChangeEvent implements IConfigurationChangeEvent { source!: ConfigurationTarget; sourceConfig: any; - constructor(readonly change: IConfigurationChange, private readonly previous: { workspace?: Workspace, data: IConfigurationData } | undefined, private readonly currentConfiguraiton: Configuration, private readonly currentWorkspace?: Workspace) { + constructor(readonly change: IConfigurationChange, private readonly previous: { workspace?: Workspace; data: IConfigurationData } | undefined, private readonly currentConfiguraiton: Configuration, private readonly currentWorkspace?: Workspace) { const keysSet = new Set(); change.keys.forEach(key => keysSet.add(key)); change.overrides.forEach(([, keys]) => keys.forEach(key => keysSet.add(key))); @@ -939,7 +942,7 @@ function compare(from: ConfigurationModel | undefined, to: ConfigurationModel | return { added, removed, updated, overrides }; } -function compareConfigurationContents(to: { keys: string[], contents: any } | undefined, from: { keys: string[], contents: any } | undefined) { +function compareConfigurationContents(to: { keys: string[]; contents: any } | undefined, from: { keys: string[]; contents: any } | undefined) { const added = to ? from ? to.keys.filter(key => from.keys.indexOf(key) === -1) : [...to.keys] : []; diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index 28b6aa327ea..1aa57c19107 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -43,7 +43,7 @@ export interface IConfigurationRegistry { * - registering the configurations to add * - dereigstering the configurations to remove */ - updateConfigurations(configurations: { add: IConfigurationNode[], remove: IConfigurationNode[] }): void; + updateConfigurations(configurations: { add: IConfigurationNode[]; remove: IConfigurationNode[] }): void; /** * Register multiple default configurations to the registry. @@ -67,16 +67,16 @@ export interface IConfigurationRegistry { notifyConfigurationSchemaUpdated(...configurations: IConfigurationNode[]): void; /** - * Event that fires whenver a configuration has been + * Event that fires whenever a configuration has been * registered. */ readonly onDidSchemaChange: Event; /** - * Event that fires whenver a configuration has been + * Event that fires whenever a configuration has been * registered. */ - readonly onDidUpdateConfiguration: Event<{ properties: string[], defaultsOverrides?: boolean }>; + readonly onDidUpdateConfiguration: Event<{ properties: string[]; defaultsOverrides?: boolean }>; /** * Returns all configuration nodes contributed to this registry. @@ -200,19 +200,19 @@ export interface IConfigurationDefaults { } export type IRegisteredConfigurationPropertySchema = IConfigurationPropertySchema & { - defaultDefaultValue?: any, - source?: IExtensionInfo, + defaultDefaultValue?: any; + source?: IExtensionInfo; defaultValueSource?: IExtensionInfo | string; }; -export type IConfigurationDefaultOverride = { value: any, source?: IExtensionInfo | string }; +export type IConfigurationDefaultOverride = { value: any; source?: IExtensionInfo | string }; -export const allSettings: { properties: IStringDictionary, patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; -export const applicationSettings: { properties: IStringDictionary, patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; -export const machineSettings: { properties: IStringDictionary, patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; -export const machineOverridableSettings: { properties: IStringDictionary, patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; -export const windowSettings: { properties: IStringDictionary, patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; -export const resourceSettings: { properties: IStringDictionary, patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; +export const allSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; +export const applicationSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; +export const machineSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; +export const machineOverridableSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; +export const windowSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; +export const resourceSettings: { properties: IStringDictionary; patternProperties: IStringDictionary } = { properties: {}, patternProperties: {} }; export const resourceLanguageSettingsSchemaId = 'vscode://schemas/settings/resourceLanguage'; export const configurationDefaultsSchemaId = 'vscode://schemas/settings/configurationDefaults'; @@ -232,7 +232,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { private readonly _onDidSchemaChange = new Emitter(); readonly onDidSchemaChange: Event = this._onDidSchemaChange.event; - private readonly _onDidUpdateConfiguration = new Emitter<{ properties: string[], defaultsOverrides?: boolean }>(); + private readonly _onDidUpdateConfiguration = new Emitter<{ properties: string[]; defaultsOverrides?: boolean }>(); readonly onDidUpdateConfiguration = this._onDidUpdateConfiguration.event; constructor() { @@ -271,7 +271,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { this._onDidUpdateConfiguration.fire({ properties }); } - public updateConfigurations({ add, remove }: { add: IConfigurationNode[], remove: IConfigurationNode[] }): void { + public updateConfigurations({ add, remove }: { add: IConfigurationNode[]; remove: IConfigurationNode[] }): void { const properties = []; properties.push(...this.doDeregisterConfigurations(remove)); properties.push(...this.doRegisterConfigurations(add, false)); diff --git a/src/vs/platform/configuration/test/common/configurationService.test.ts b/src/vs/platform/configuration/test/common/configurationService.test.ts index bd9c6f36de7..559803b0588 100644 --- a/src/vs/platform/configuration/test/common/configurationService.test.ts +++ b/src/vs/platform/configuration/test/common/configurationService.test.ts @@ -139,7 +139,7 @@ suite('ConfigurationService', () => { configuration: { service: { testSetting: string; - } + }; }; } diff --git a/src/vs/platform/contextkey/browser/contextKeyService.ts b/src/vs/platform/contextkey/browser/contextKeyService.ts index 820ee32657e..e434b633cd3 100644 --- a/src/vs/platform/contextkey/browser/contextKeyService.ts +++ b/src/vs/platform/contextkey/browser/contextKeyService.ts @@ -12,14 +12,13 @@ import { localize } from 'vs/nls'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpression, ContextKeyInfo, IContext, IContextKey, IContextKeyChangeEvent, IContextKeyService, IContextKeyServiceTarget, IReadableSet, RawContextKey, SET_CONTEXT_COMMAND_ID } from 'vs/platform/contextkey/common/contextkey'; -import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver'; const KEYBINDING_CONTEXT_ATTR = 'data-keybinding-context'; export class Context implements IContext { protected _parent: Context | null; - protected _value: { [key: string]: any; }; + protected _value: { [key: string]: any }; protected _id: number; constructor(id: number, parent: Context | null) { @@ -59,7 +58,7 @@ export class Context implements IContext { this._parent = parent; } - public collectAllValues(): { [key: string]: any; } { + public collectAllValues(): { [key: string]: any } { let result = this._parent ? this._parent.collectAllValues() : Object.create(null); result = { ...result, ...this._value }; delete result['_contextId']; @@ -87,7 +86,7 @@ class NullContext extends Context { return undefined; } - override collectAllValues(): { [key: string]: any; } { + override collectAllValues(): { [key: string]: any } { return Object.create(null); } } @@ -176,7 +175,7 @@ class ConfigAwareContextValuesContainer extends Context { return super.removeValue(key); } - override collectAllValues(): { [key: string]: any; } { + override collectAllValues(): { [key: string]: any } { const result: { [key: string]: any } = Object.create(null); this._values.forEach((value, index) => result[index] = value); return { ...result, ...super.collectAllValues() }; @@ -300,7 +299,7 @@ export abstract class AbstractContextKeyService implements IContextKeyService { throw new Error(`AbstractContextKeyService has been disposed`); } const context = this.getContextValuesContainer(this._myContextId); - const result = KeybindingResolver.contextMatchesRules(context, rules); + const result = (rules ? rules.evaluate(context) : true); // console.group(rules.serialize() + ' -> ' + result); // rules.keys().forEach(key => { console.log(key, ctx[key]); }); // console.groupEnd(); @@ -536,7 +535,7 @@ class OverlayContextKeyService implements IContextKeyService { contextMatchesRules(rules: ContextKeyExpression | undefined): boolean { const context = this.getContextValuesContainer(this.contextId); - const result = KeybindingResolver.contextMatchesRules(context, rules); + const result = (rules ? rules.evaluate(context) : true); return result; } diff --git a/src/vs/platform/contextkey/common/contextkey.ts b/src/vs/platform/contextkey/common/contextkey.ts index b7eca730c6e..b44172da4c8 100644 --- a/src/vs/platform/contextkey/common/contextkey.ts +++ b/src/vs/platform/contextkey/common/contextkey.ts @@ -4,11 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { isLinux, isMacintosh, isWeb, isWindows, userAgent } from 'vs/base/common/platform'; +import { isChrome, isEdge, isFirefox, isLinux, isMacintosh, isSafari, isWeb, isWindows } from 'vs/base/common/platform'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -let _userAgent = userAgent || ''; const CONSTANT_VALUES = new Map(); CONSTANT_VALUES.set('false', false); CONSTANT_VALUES.set('true', true); @@ -17,10 +16,10 @@ CONSTANT_VALUES.set('isLinux', isLinux); CONSTANT_VALUES.set('isWindows', isWindows); CONSTANT_VALUES.set('isWeb', isWeb); CONSTANT_VALUES.set('isMacNative', isMacintosh && !isWeb); -CONSTANT_VALUES.set('isEdge', _userAgent.indexOf('Edg/') >= 0); -CONSTANT_VALUES.set('isFirefox', _userAgent.indexOf('Firefox') >= 0); -CONSTANT_VALUES.set('isChrome', _userAgent.indexOf('Chrome') >= 0); -CONSTANT_VALUES.set('isSafari', _userAgent.indexOf('Safari') >= 0); +CONSTANT_VALUES.set('isEdge', isEdge); +CONSTANT_VALUES.set('isFirefox', isFirefox); +CONSTANT_VALUES.set('isChrome', isChrome); +CONSTANT_VALUES.set('isSafari', isSafari); const hasOwnProperty = Object.prototype.hasOwnProperty; @@ -1535,7 +1534,7 @@ export class RawContextKey extends ContextKeyDefinedExpr { private readonly _defaultValue: T | undefined; - constructor(key: string, defaultValue: T | undefined, metaOrHide?: string | true | { type: string, description: string }) { + constructor(key: string, defaultValue: T | undefined, metaOrHide?: string | true | { type: string; description: string }) { super(key, null); this._defaultValue = defaultValue; diff --git a/src/vs/platform/contextview/browser/contextView.ts b/src/vs/platform/contextview/browser/contextView.ts index 0b01f2e40c8..b99bfdc0aa5 100644 --- a/src/vs/platform/contextview/browser/contextView.ts +++ b/src/vs/platform/contextview/browser/contextView.ts @@ -26,7 +26,7 @@ export interface IContextViewDelegate { canRelayout?: boolean; // Default: true - getAnchor(): HTMLElement | { x: number; y: number; width?: number; height?: number; }; + getAnchor(): HTMLElement | { x: number; y: number; width?: number; height?: number }; render(container: HTMLElement): IDisposable; onDOMEvent?(e: any, activeElement: HTMLElement): void; onHide?(data?: any): void; diff --git a/src/vs/platform/credentials/common/credentials.ts b/src/vs/platform/credentials/common/credentials.ts index d303a566734..5ec41dc712f 100644 --- a/src/vs/platform/credentials/common/credentials.ts +++ b/src/vs/platform/credentials/common/credentials.ts @@ -13,16 +13,72 @@ export interface ICredentialsProvider { setPassword(service: string, account: string, password: string): Promise; deletePassword(service: string, account: string): Promise; findPassword(service: string): Promise; - findCredentials(service: string): Promise>; + findCredentials(service: string): Promise>; clear?(): Promise; } export interface ICredentialsChangeEvent { - service: string + service: string; account: string; } export interface ICredentialsService extends ICredentialsProvider { readonly _serviceBrand: undefined; readonly onDidChangePassword: Event; + + /* + * Each CredentialsService must provide a prefix that will be used + * by the SecretStorage API when storing secrets. + * This is a method that returns a Promise so that it can be defined in + * the main process and proxied on the renderer side. + */ + getSecretStoragePrefix(): Promise; +} + +export const ICredentialsMainService = createDecorator('credentialsMainService'); + +export interface ICredentialsMainService extends ICredentialsService { } + +interface ISecretVault { + [service: string]: { [account: string]: string } | undefined; +} + +export class InMemoryCredentialsProvider implements ICredentialsProvider { + private secretVault: ISecretVault = {}; + + async getPassword(service: string, account: string): Promise { + return this.secretVault[service]?.[account] ?? null; + } + + async setPassword(service: string, account: string, password: string): Promise { + this.secretVault[service] = this.secretVault[service] ?? {}; + this.secretVault[service]![account] = password; + } + + async deletePassword(service: string, account: string): Promise { + if (!this.secretVault[service]?.[account]) { + return false; + } + delete this.secretVault[service]![account]; + if (Object.keys(this.secretVault[service]!).length === 0) { + delete this.secretVault[service]; + } + return true; + } + + async findPassword(service: string): Promise { + return JSON.stringify(this.secretVault[service]) ?? null; + } + + async findCredentials(service: string): Promise> { + const credentials: { account: string; password: string }[] = []; + for (const account of Object.keys(this.secretVault[service] || {})) { + credentials.push({ account, password: this.secretVault[service]![account] }); + } + return credentials; + } + + async clear(): Promise { + this.secretVault = {}; + } } diff --git a/src/vs/platform/credentials/node/credentialsMainService.ts b/src/vs/platform/credentials/node/credentialsMainService.ts index 933f9d5ad85..ae8bb8de811 100644 --- a/src/vs/platform/credentials/node/credentialsMainService.ts +++ b/src/vs/platform/credentials/node/credentialsMainService.ts @@ -3,24 +3,21 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ICredentialsChangeEvent, ICredentialsService } from 'vs/platform/credentials/common/credentials'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { ICredentialsChangeEvent, ICredentialsMainService, InMemoryCredentialsProvider } from 'vs/platform/credentials/common/credentials'; import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; import { isWindows } from 'vs/base/common/platform'; import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; - -export const ICredentialsMainService = createDecorator('credentialsMainService'); - -export interface ICredentialsMainService extends ICredentialsService { } +import { IProductService } from 'vs/platform/product/common/productService'; interface ChunkedPassword { content: string; hasNextChunk: boolean; } +type KeytarModule = typeof import('keytar'); + export class CredentialsMainService extends Disposable implements ICredentialsMainService { private static readonly MAX_PASSWORD_LENGTH = 2500; @@ -30,15 +27,21 @@ export class CredentialsMainService extends Disposable implements ICredentialsMa private _onDidChangePassword: Emitter = this._register(new Emitter()); readonly onDidChangePassword = this._onDidChangePassword.event; + private _keytarCache: KeytarModule | undefined; + + // If the credentials service is running on the server, we add a suffix -server to differentiate from the location that the + // client would store the credentials. + public async getSecretStoragePrefix() { return `${this.productService.urlProtocol}${this.isRunningOnServer ? '-server' : ''}`; } + constructor( + private isRunningOnServer: boolean, @ILogService private readonly logService: ILogService, - @INativeEnvironmentService private readonly environmentMainService: INativeEnvironmentService + @INativeEnvironmentService private readonly environmentMainService: INativeEnvironmentService, + @IProductService private readonly productService: IProductService, ) { super(); } - //#region Credentials - async getPassword(service: string, account: string): Promise { const keytar = await this.withKeytar(); @@ -134,25 +137,42 @@ export class CredentialsMainService extends Disposable implements ICredentialsMa return keytar.findPassword(service); } - async findCredentials(service: string): Promise> { + async findCredentials(service: string): Promise> { const keytar = await this.withKeytar(); return keytar.findCredentials(service); } - private async withKeytar(): Promise { - if (this.environmentMainService.disableKeytar) { - throw new Error('keytar has been disabled via --disable-keytar option'); + private async withKeytar(): Promise { + if (this._keytarCache) { + return this._keytarCache; } - return await import('keytar'); + if (this.environmentMainService.disableKeytar) { + this.logService.info('Keytar is disabled. Using in-memory credential store instead.'); + this._keytarCache = new InMemoryCredentialsProvider(); + return this._keytarCache; + } + + try { + this._keytarCache = await import('keytar'); + // Try using keytar to see if it throws or not. + await this._keytarCache.findCredentials('test-keytar-loads'); + } catch (e) { + this.logService.warn(`Switching to using in-memory credential store instead because Keytar failed to load: ${e.message}`); + this._keytarCache = new InMemoryCredentialsProvider(); + } + return this._keytarCache; } - //#endregion + public clear(): Promise { + if (this._keytarCache instanceof InMemoryCredentialsProvider) { + return this._keytarCache.clear(); + } - // This class doesn't implement the clear() function because we don't know - // what services have stored credentials. For reference, a "service" is an extension. - // TODO: should we clear credentials for the built-in auth extensions? + // We don't know how to properly clear Keytar because we don't know + // what services have stored credentials. For reference, a "service" is an extension. + // TODO: should we clear credentials for the built-in auth extensions? + return Promise.resolve(); + } } - -registerSingleton(ICredentialsService, CredentialsMainService, true); diff --git a/src/vs/platform/diagnostics/electron-main/diagnosticsMainService.ts b/src/vs/platform/diagnostics/electron-main/diagnosticsMainService.ts new file mode 100644 index 00000000000..9c6e9d778d4 --- /dev/null +++ b/src/vs/platform/diagnostics/electron-main/diagnosticsMainService.ts @@ -0,0 +1,92 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event as IpcEvent, ipcMain } from 'electron'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { URI } from 'vs/base/common/uri'; +import { IDiagnosticInfo, IDiagnosticInfoOptions, IRemoteDiagnosticError, IRemoteDiagnosticInfo } from 'vs/platform/diagnostics/common/diagnostics'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { ICodeWindow, IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; +import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; +import { IWorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; + +export const ID = 'diagnosticsMainService'; +export const IDiagnosticsMainService = createDecorator(ID); + +export interface IRemoteDiagnosticOptions { + includeProcesses?: boolean; + includeWorkspaceMetadata?: boolean; +} + +export interface IDiagnosticsMainService { + readonly _serviceBrand: undefined; + getRemoteDiagnostics(options: IRemoteDiagnosticOptions): Promise<(IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]>; +} + +export class DiagnosticsMainService implements IDiagnosticsMainService { + + declare readonly _serviceBrand: undefined; + + constructor( + @IWindowsMainService private readonly windowsMainService: IWindowsMainService, + @IWorkspacesManagementMainService private readonly workspacesManagementMainService: IWorkspacesManagementMainService + ) { } + + async getRemoteDiagnostics(options: IRemoteDiagnosticOptions): Promise<(IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]> { + const windows = this.windowsMainService.getWindows(); + const diagnostics: Array = await Promise.all(windows.map(window => { + return new Promise((resolve) => { + const remoteAuthority = window.remoteAuthority; + if (remoteAuthority) { + const replyChannel = `vscode:getDiagnosticInfoResponse${window.id}`; + const args: IDiagnosticInfoOptions = { + includeProcesses: options.includeProcesses, + folders: options.includeWorkspaceMetadata ? this.getFolderURIs(window) : undefined + }; + + window.sendWhenReady('vscode:getDiagnosticInfo', CancellationToken.None, { replyChannel, args }); + + ipcMain.once(replyChannel, (_: IpcEvent, data: IRemoteDiagnosticInfo) => { + // No data is returned if getting the connection fails. + if (!data) { + resolve({ hostName: remoteAuthority, errorMessage: `Unable to resolve connection to '${remoteAuthority}'.` }); + } + + resolve(data); + }); + + setTimeout(() => { + resolve({ hostName: remoteAuthority, errorMessage: `Connection to '${remoteAuthority}' could not be established` }); + }, 5000); + } else { + resolve(undefined); + } + }); + })); + + return diagnostics.filter((x): x is IRemoteDiagnosticInfo | IRemoteDiagnosticError => !!x); + } + + private getFolderURIs(window: ICodeWindow): URI[] { + const folderURIs: URI[] = []; + + const workspace = window.openedWorkspace; + if (isSingleFolderWorkspaceIdentifier(workspace)) { + folderURIs.push(workspace.uri); + } else if (isWorkspaceIdentifier(workspace)) { + const resolvedWorkspace = this.workspacesManagementMainService.resolveLocalWorkspaceSync(workspace.configPath); // workspace folders can only be shown for local (resolved) workspaces + if (resolvedWorkspace) { + const rootFolders = resolvedWorkspace.folders; + rootFolders.forEach(root => { + folderURIs.push(root.uri); + }); + } else { + //TODO@RMacfarlane: can we add the workspace file here? + } + } + + return folderURIs; + } +} diff --git a/src/vs/platform/diagnostics/node/diagnosticsService.ts b/src/vs/platform/diagnostics/node/diagnosticsService.ts index cbeeb6173ca..192e09c463e 100644 --- a/src/vs/platform/diagnostics/node/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/node/diagnosticsService.ts @@ -38,11 +38,6 @@ interface ConfigFilePatterns { relativePathPattern?: RegExp; } -interface RootFileMatcher { - tag: string; - matcher: (path: string) => boolean; -} - export async function collectWorkspaceStats(folder: string, filter: string[]): Promise { const configFilePatterns: ConfigFilePatterns[] = [ { tag: 'grunt.js', filePattern: /^gruntfile\.js$/i }, @@ -66,83 +61,12 @@ export async function collectWorkspaceStats(folder: string, filter: string[]): P { tag: 'dockerfile', filePattern: /^(dockerfile|docker\-compose\.ya?ml)$/i } ]; - let rootFileMatchers: RootFileMatcher[]; - - // Linux is omitted because few cloud sync clients support it, and for those who are available on Linux, there are multiple clients and they can be configured differently - const homeDir = osLib.homedir().toLowerCase(); - switch (process.platform) { - case 'win32': - rootFileMatchers = [ - { - tag: 'gdrive', matcher: (path) => { - // File Streaming or Mirror Files mode - return /^[a-z]:\\(my drive|shared drives)\\/.test(path) || path.startsWith(homeDir + '\\my drive\\'); - } - }, - { - tag: 'dropbox', matcher: path => path.startsWith(homeDir + '\\dropbox') // Ending in * - }, - { - tag: 'onedrive', matcher: path => path.startsWith(homeDir + '\\onedrive') // Ending in * - }, - { - tag: 'box', matcher: path => path.startsWith(homeDir + '\\box\\') - }, - { - tag: 'nextcloud', matcher: path => path.startsWith(homeDir + '\\nextcloud\\') - }, - { - tag: 'owncloud', matcher: path => path.startsWith(homeDir + '\\owncloud\\') - }, - ]; - break; - - case 'darwin': - rootFileMatchers = [ - { - tag: 'gdrive', matcher: (path) => { - // File Streaming mode - return path.startsWith('/volumes/googledrive/') || path.startsWith(homeDir + '/my drive/'); - } - }, - { - tag: 'dropbox', matcher: path => path.startsWith(homeDir + '/dropbox') // Ending in * - }, - { - tag: 'onedrive', matcher: (path) => { - // Old vs new client - return path.startsWith(homeDir + '/onedrive') || path.startsWith(homeDir + '/library/cloudstorage/onedrive'); - } - }, - { - tag: 'icloud', matcher: path => path.startsWith(homeDir + '/library/mobile documents/') - }, - { - tag: 'box', matcher: path => path.startsWith(homeDir + '/box/') - }, - { - tag: 'nextcloud', matcher: path => path.startsWith(homeDir + '/nextcloud/') - }, - { - tag: 'owncloud', matcher: path => path.startsWith(homeDir + '/owncloud/') - }, - ]; - break; - } - const fileTypes = new Map(); const configFiles = new Map(); const MAX_FILES = 20000; - function collect(root: string, dir: string, filter: string[], token: { count: number, maxReached: boolean }): Promise { - for (const rootPath of rootFileMatchers) { - const lowercaseRoot = root.toLowerCase(); - if (rootPath.matcher(lowercaseRoot)) { - configFiles.set(rootPath.tag, 1); - } - } - + function collect(root: string, dir: string, filter: string[], token: { count: number; maxReached: boolean }): Promise { const relativePath = dir.substring(root.length + 1); return Promises.withAsyncBody(async resolve => { @@ -211,7 +135,7 @@ export async function collectWorkspaceStats(folder: string, filter: string[]): P }); } - const token: { count: number, maxReached: boolean } = { count: 0, maxReached: false }; + const token: { count: number; maxReached: boolean } = { count: 0, maxReached: false }; await collect(folder, folder, filter, token); const launchConfigs = await collectLaunchConfigs(folder); @@ -583,8 +507,8 @@ export class DiagnosticsService implements IDiagnosticsService { try { const stats = await collectWorkspaceStats(folder, ['node_modules', '.git']); type WorkspaceStatsClassification = { - 'workspace.id': { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - rendererSessionId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + 'workspace.id': { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + rendererSessionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type WorkspaceStatsEvent = { 'workspace.id': string | undefined; @@ -595,9 +519,9 @@ export class DiagnosticsService implements IDiagnosticsService { rendererSessionId: workspace.rendererSessionId }); type WorkspaceStatsFileClassification = { - rendererSessionId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - type: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - count: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + rendererSessionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + type: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; type WorkspaceStatsFileEvent = { rendererSessionId: string; diff --git a/src/vs/platform/dialogs/common/dialogs.ts b/src/vs/platform/dialogs/common/dialogs.ts index 2d4d654eb26..2ae876cdcc8 100644 --- a/src/vs/platform/dialogs/common/dialogs.ts +++ b/src/vs/platform/dialogs/common/dialogs.ts @@ -193,8 +193,8 @@ export interface ICustomDialogOptions { } export interface ICustomDialogMarkdown { - markdown: IMarkdownString, - classes?: string[] + markdown: IMarkdownString; + classes?: string[]; } export interface IDialogOptions { @@ -206,7 +206,7 @@ export interface IDialogOptions { export interface IInput { placeholder?: string; - type?: 'text' | 'password' + type?: 'text' | 'password'; value?: string; } diff --git a/src/vs/platform/dialogs/electron-main/dialogMainService.ts b/src/vs/platform/dialogs/electron-main/dialogMainService.ts index 9ab97df3593..975036b0a5a 100644 --- a/src/vs/platform/dialogs/electron-main/dialogMainService.ts +++ b/src/vs/platform/dialogs/electron-main/dialogMainService.ts @@ -18,7 +18,7 @@ import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IStateMainService } from 'vs/platform/state/electron-main/state'; -import { WORKSPACE_FILTER } from 'vs/platform/workspaces/common/workspaces'; +import { WORKSPACE_FILTER } from 'vs/platform/workspace/common/workspace'; export const IDialogMainService = createDecorator('dialogMainService'); diff --git a/src/vs/platform/driver/browser/baseDriver.ts b/src/vs/platform/driver/browser/baseDriver.ts index 184ff5d1935..9875672768a 100644 --- a/src/vs/platform/driver/browser/baseDriver.ts +++ b/src/vs/platform/driver/browser/baseDriver.ts @@ -99,7 +99,7 @@ export abstract class BaseWindowDriver implements IWindowDriver { }; } - async getElementXY(selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number; }> { + async getElementXY(selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number }> { const offset = typeof xoffset === 'number' && typeof yoffset === 'number' ? { x: xoffset, y: yoffset } : undefined; return this._getElementXY(selector, offset); } @@ -176,7 +176,7 @@ export abstract class BaseWindowDriver implements IWindowDriver { }); } - protected async _getElementXY(selector: string, offset?: { x: number, y: number }): Promise<{ x: number; y: number; }> { + protected async _getElementXY(selector: string, offset?: { x: number; y: number }): Promise<{ x: number; y: number }> { const element = document.querySelector(selector); if (!element) { diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 717e6c82307..ca36bc4409b 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -12,7 +12,7 @@ export interface IElement { tagName: string; className: string; textContent: string; - attributes: { [name: string]: string; }; + attributes: { [name: string]: string }; children: IElement[]; top: number; left: number; @@ -52,7 +52,7 @@ export interface IDriver { getTitle(windowId: number): Promise; isActiveElement(windowId: number, selector: string): Promise; getElements(windowId: number, selector: string, recursive?: boolean): Promise; - getElementXY(windowId: number, selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number; }>; + getElementXY(windowId: number, selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number }>; typeInEditor(windowId: number, selector: string, text: string): Promise; getTerminalBuffer(windowId: number, selector: string): Promise; writeInTerminal(windowId: number, selector: string, text: string): Promise; @@ -67,12 +67,12 @@ export interface IWindowDriver { getTitle(): Promise; isActiveElement(selector: string): Promise; getElements(selector: string, recursive: boolean): Promise; - getElementXY(selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number; }>; + getElementXY(selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number }>; typeInEditor(selector: string, text: string): Promise; getTerminalBuffer(selector: string): Promise; writeInTerminal(selector: string, text: string): Promise; getLocaleInfo(): Promise; - getLocalizedStrings(): Promise + getLocalizedStrings(): Promise; } //*END diff --git a/src/vs/platform/driver/common/driverIpc.ts b/src/vs/platform/driver/common/driverIpc.ts index 71cf00fc7dc..49593c75882 100644 --- a/src/vs/platform/driver/common/driverIpc.ts +++ b/src/vs/platform/driver/common/driverIpc.ts @@ -65,7 +65,7 @@ export class WindowDriverChannelClient implements IWindowDriver { return this.channel.call('getElements', [selector, recursive]); } - getElementXY(selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number, y: number }> { + getElementXY(selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number }> { return this.channel.call('getElementXY', [selector, xoffset, yoffset]); } diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index e2c3e7bac08..aa1e5f6ee79 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -200,7 +200,7 @@ export class Driver implements IDriver, IWindowDriverRegistry { return await windowDriver.getElements(selector, recursive); } - async getElementXY(windowId: number, selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number; }> { + async getElementXY(windowId: number, selector: string, xoffset?: number, yoffset?: number): Promise<{ x: number; y: number }> { const windowDriver = await this.getWindowDriver(windowId); return await windowDriver.getElementXY(selector, xoffset, yoffset); } diff --git a/src/vs/platform/driver/electron-sandbox/driver.ts b/src/vs/platform/driver/electron-sandbox/driver.ts index b43678f1156..84bc965bd9b 100644 --- a/src/vs/platform/driver/electron-sandbox/driver.ts +++ b/src/vs/platform/driver/electron-sandbox/driver.ts @@ -28,7 +28,7 @@ class WindowDriver extends BaseWindowDriver { return this._click(selector, 2); } - private async _click(selector: string, clickCount: number, offset?: { x: number, y: number }): Promise { + private async _click(selector: string, clickCount: number, offset?: { x: number; y: number }): Promise { const { x, y } = await this._getElementXY(selector, offset); await this.nativeHostService.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount } as any); @@ -55,11 +55,6 @@ export async function registerWindowDriver(accessor: ServicesAccessor, windowId: const windowDriverRegistry = new WindowDriverRegistryChannelClient(windowDriverRegistryChannel); await windowDriverRegistry.registerWindowDriver(windowId); - // const options = await windowDriverRegistry.registerWindowDriver(windowId); - - // if (options.verbose) { - // windowDriver.openDevTools(); - // } return toDisposable(() => windowDriverRegistry.reloadWindowDriver(windowId)); } diff --git a/src/vs/platform/driver/node/driver.ts b/src/vs/platform/driver/node/driver.ts index 9f05cb20932..4e56bc540e4 100644 --- a/src/vs/platform/driver/node/driver.ts +++ b/src/vs/platform/driver/node/driver.ts @@ -102,7 +102,7 @@ export class DriverChannelClient implements IDriver { return this.channel.call('getElements', [windowId, selector, recursive]); } - getElementXY(windowId: number, selector: string, xoffset: number | undefined, yoffset: number | undefined): Promise<{ x: number, y: number }> { + getElementXY(windowId: number, selector: string, xoffset: number | undefined, yoffset: number | undefined): Promise<{ x: number; y: number }> { return this.channel.call('getElementXY', [windowId, selector, xoffset, yoffset]); } @@ -145,7 +145,7 @@ export class WindowDriverRegistryChannel implements IServerChannel { } } -export async function connect(handle: string): Promise<{ client: Client, driver: IDriver }> { +export async function connect(handle: string): Promise<{ client: Client; driver: IDriver }> { const client = await connectNet(handle, 'driverClient'); const channel = client.getChannel('driver'); const driver = new DriverChannelClient(channel); diff --git a/src/vs/platform/editor/common/editor.ts b/src/vs/platform/editor/common/editor.ts index 4047101dece..686fd93b8a7 100644 --- a/src/vs/platform/editor/common/editor.ts +++ b/src/vs/platform/editor/common/editor.ts @@ -324,6 +324,22 @@ export const enum TextEditorSelectionRevealType { NearTopIfOutsideViewport = 3, } +export const enum TextEditorSelectionSource { + + /** + * Programmatic source indicates a selection change that + * was not triggered by the user via keyboard or mouse. + */ + PROGRAMMATIC = 'api', + + /** + * Navigation source indicates a change that was caused + * by navigating in the text editor from commands such + * as "Go to definition" + */ + NAVIGATION = 'code.navigation' +} + export interface ITextEditorOptions extends IEditorOptions { /** diff --git a/src/vs/platform/encryption/common/encryptionService.ts b/src/vs/platform/encryption/common/encryptionService.ts index 5b3743e0702..8379401883e 100644 --- a/src/vs/platform/encryption/common/encryptionService.ts +++ b/src/vs/platform/encryption/common/encryptionService.ts @@ -3,6 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const IEncryptionMainService = createDecorator('encryptionMainService'); + +export interface IEncryptionMainService extends ICommonEncryptionService { } + export interface ICommonEncryptionService { readonly _serviceBrand: undefined; diff --git a/src/vs/platform/encryption/node/encryptionMainService.ts b/src/vs/platform/encryption/node/encryptionMainService.ts index a48458dfa7d..c989b431571 100644 --- a/src/vs/platform/encryption/node/encryptionMainService.ts +++ b/src/vs/platform/encryption/node/encryptionMainService.ts @@ -4,11 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { ICommonEncryptionService } from 'vs/platform/encryption/common/encryptionService'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; - -export const IEncryptionMainService = createDecorator('encryptionMainService'); - -export interface IEncryptionMainService extends ICommonEncryptionService { } export interface Encryption { encrypt(salt: string, value: string): Promise; diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index d8f40bfb81d..22d030e30f4 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -5,7 +5,6 @@ import { URI } from 'vs/base/common/uri'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; -import { ExtensionKind } from 'vs/platform/extensions/common/extensions'; import { createDecorator, refineServiceDecorator } from 'vs/platform/instantiation/common/instantiation'; export const IEnvironmentService = createDecorator('environmentService'); @@ -21,6 +20,13 @@ export interface IExtensionHostDebugParams extends IDebugParams { env?: Record; } +/** + * Type of extension. + * + * **NOTE**: This is defined in `platform/environment` because it can appear as a CLI argument. + */ +export type ExtensionKind = 'ui' | 'workspace' | 'web'; + /** * A basic environment service that can be used in various processes, * such as main, renderer and shared process. Use subclasses of this diff --git a/src/vs/platform/environment/common/environmentService.ts b/src/vs/platform/environment/common/environmentService.ts index 1ee4818dbf9..82dc3799130 100644 --- a/src/vs/platform/environment/common/environmentService.ts +++ b/src/vs/platform/environment/common/environmentService.ts @@ -11,8 +11,7 @@ import { env } from 'vs/base/common/process'; import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; -import { IDebugParams, IExtensionHostDebugParams, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ExtensionKind } from 'vs/platform/extensions/common/extensions'; +import { ExtensionKind, IDebugParams, IExtensionHostDebugParams, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; import { IProductService } from 'vs/platform/product/common/productService'; export interface INativeEnvironmentPaths { @@ -23,7 +22,7 @@ export interface INativeEnvironmentPaths { * * Only one instance of VSCode can use the same `userDataDir`. */ - userDataDir: string + userDataDir: string; /** * The user home directory mainly used for persisting extensions @@ -35,7 +34,7 @@ export interface INativeEnvironmentPaths { /** * OS tmp dir. */ - tmpDir: string, + tmpDir: string; } export abstract class AbstractNativeEnvironmentService implements INativeEnvironmentService { diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 4821a44b65d..c27ce56b9f5 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -56,10 +56,10 @@ export const OPTIONS: OptionDescriptions> = { 'list-extensions': { type: 'boolean', cat: 'e', description: localize('listExtensions', "List the installed extensions.") }, 'show-versions': { type: 'boolean', cat: 'e', description: localize('showVersions', "Show versions of installed extensions, when using --list-extensions.") }, 'category': { type: 'string', cat: 'e', description: localize('category', "Filters installed extensions by provided category, when using --list-extensions."), args: 'category' }, - 'install-extension': { type: 'string[]', cat: 'e', args: 'extension-id[@version] | path-to-vsix', description: localize('installExtension', "Installs or updates the extension. The identifier of an extension is always `${publisher}.${name}`. Use `--force` argument to update to latest version. To install a specific version provide `@${version}`. For example: 'vscode.csharp@1.2.3'.") }, + 'install-extension': { type: 'string[]', cat: 'e', args: 'ext-id | path', description: localize('installExtension', "Installs or updates an extension. The argument is either an extension id or a path to a VSIX. The identifier of an extension is '${publisher}.${name}'. Use '--force' argument to update to latest version. To install a specific version provide '@${version}'. For example: 'vscode.csharp@1.2.3'.") }, 'pre-release': { type: 'boolean', cat: 'e', description: localize('install prerelease', "Installs the pre-release version of the extension, when using --install-extension") }, - 'uninstall-extension': { type: 'string[]', cat: 'e', args: 'extension-id', description: localize('uninstallExtension', "Uninstalls an extension.") }, - 'enable-proposed-api': { type: 'string[]', cat: 'e', args: 'extension-id', description: localize('experimentalApis', "Enables proposed API features for extensions. Can receive one or more extension IDs to enable individually.") }, + 'uninstall-extension': { type: 'string[]', cat: 'e', args: 'ext-id', description: localize('uninstallExtension', "Uninstalls an extension.") }, + 'enable-proposed-api': { type: 'string[]', cat: 'e', args: 'ext-id', description: localize('experimentalApis', "Enables proposed API features for extensions. Can receive one or more extension IDs to enable individually.") }, 'version': { type: 'boolean', cat: 't', alias: 'v', description: localize('version', "Print version.") }, 'verbose': { type: 'boolean', cat: 't', description: localize('verbose', "Print verbose output (implies --wait).") }, @@ -71,8 +71,8 @@ export const OPTIONS: OptionDescriptions> = { 'prof-startup-prefix': { type: 'string' }, 'prof-v8-extensions': { type: 'boolean' }, 'disable-extensions': { type: 'boolean', deprecates: ['disableExtensions'], cat: 't', description: localize('disableExtensions', "Disable all installed extensions.") }, - 'disable-extension': { type: 'string[]', cat: 't', args: 'extension-id', description: localize('disableExtension', "Disable an extension.") }, - 'sync': { type: 'string', cat: 't', description: localize('turn sync', "Turn sync on or off."), args: ['on', 'off'] }, + 'disable-extension': { type: 'string[]', cat: 't', args: 'ext-id', description: localize('disableExtension', "Disable an extension.") }, + 'sync': { type: 'string', cat: 't', description: localize('turn sync', "Turn sync on or off."), args: ['on | off'] }, 'inspect-extensions': { type: 'string', deprecates: ['debugPluginHost'], args: 'port', cat: 't', description: localize('inspect-extensions', "Allow debugging and profiling of extensions. Check the developer tools for the connection URI.") }, 'inspect-brk-extensions': { type: 'string', deprecates: ['debugBrkPluginHost'], args: 'port', cat: 't', description: localize('inspect-brk-extensions', "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection URI.") }, @@ -305,9 +305,8 @@ function wrapText(text: string, columns: number): string[] { return lines; } -export function buildHelpMessage(productName: string, executableName: string, version: string, options: OptionDescriptions, capabilities?: { noPipe?: boolean, noInputFiles: boolean }): string { +export function buildHelpMessage(productName: string, executableName: string, version: string, options: OptionDescriptions, capabilities?: { noPipe?: boolean; noInputFiles: boolean }): string { const columns = (process.stdout).isTTY && (process.stdout).columns || 80; - const inputFiles = capabilities?.noInputFiles !== true ? `[${localize('paths', 'paths')}...]` : ''; const help = [`${productName} ${version}`]; diff --git a/src/vs/platform/environment/node/argvHelper.ts b/src/vs/platform/environment/node/argvHelper.ts index facf7cb0a72..1e03fb5dfe1 100644 --- a/src/vs/platform/environment/node/argvHelper.ts +++ b/src/vs/platform/environment/node/argvHelper.ts @@ -8,7 +8,8 @@ import { IProcessEnvironment } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; import { ErrorReporter, OPTIONS, parseArgs } from 'vs/platform/environment/node/argv'; -import { MIN_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/common/files'; + +const MIN_MAX_MEMORY_SIZE_MB = 2048; function parseAndValidate(cmdLineArgs: string[], reportWarnings: boolean): NativeParsedArgs { const errorReporter: ErrorReporter = { diff --git a/src/vs/platform/environment/test/node/nativeModules.test.ts b/src/vs/platform/environment/test/node/nativeModules.test.ts index 1d4b01900b7..f3ef9e7a635 100644 --- a/src/vs/platform/environment/test/node/nativeModules.test.ts +++ b/src/vs/platform/environment/test/node/nativeModules.test.ts @@ -28,12 +28,12 @@ flakySuite('Native Modules (all platforms)', () => { assert.ok(typeof watchDog.start === 'function', testErrorMessage('native-watchdog')); }); - test('node-pty', async () => { + (process.type === 'renderer' ? test.skip /* TODO@electron module is not context aware yet and thus cannot load in Electron renderer used by tests */ : test)('node-pty', async () => { const nodePty = await import('node-pty'); assert.ok(typeof nodePty.spawn === 'function', testErrorMessage('node-pty')); }); - test('spdlog', async () => { + (process.type === 'renderer' ? test.skip /* TODO@electron module is not context aware yet and thus cannot load in Electron renderer used by tests */ : test)('spdlog', async () => { const spdlog = await import('spdlog'); assert.ok(typeof spdlog.createRotatingLogger === 'function', testErrorMessage('spdlog')); }); @@ -73,7 +73,7 @@ flakySuite('Native Modules (all platforms)', () => { (!isWindows ? suite.skip : suite)('Native Modules (Windows)', () => { - test('windows-mutex', async () => { + (process.type === 'renderer' ? test.skip /* TODO@electron module is not context aware yet and thus cannot load in Electron renderer used by tests */ : test)('windows-mutex', async () => { const mutex = await import('windows-mutex'); assert.ok(mutex && typeof mutex.isActive === 'function', testErrorMessage('windows-mutex')); assert.ok(typeof mutex.isActive === 'function', testErrorMessage('windows-mutex')); @@ -89,9 +89,9 @@ flakySuite('Native Modules (all platforms)', () => { assert.ok(typeof processTree.getProcessTree === 'function', testErrorMessage('windows-process-tree')); }); - test('vscode-windows-registry', async () => { + test('@vscode/windows-registry', async () => { const windowsRegistry = await import('@vscode/windows-registry'); - assert.ok(typeof windowsRegistry.GetStringRegKey === 'function', testErrorMessage('vscode-windows-registry')); + assert.ok(typeof windowsRegistry.GetStringRegKey === 'function', testErrorMessage('@vscode/windows-registry')); }); test('vscode-windows-ca-certs', async () => { diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 17403e14371..7f175cb3ab6 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -110,7 +110,8 @@ export abstract class AbstractExtensionManagementService extends Disposable impl throw new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled")); } - const galleryExtension = await this.findGalleryExtension(extension); + 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")); } @@ -145,7 +146,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl options = { ...options, installOnlyNewlyAddedFromExtensionPack: true /* always true for gallery extensions */ }; } - const allInstallExtensionTasks: { task: IInstallExtensionTask, manifest: IExtensionManifest }[] = []; + const allInstallExtensionTasks: { task: IInstallExtensionTask; manifest: IExtensionManifest }[] = []; const installResults: (InstallExtensionResult & { local: ILocalExtension })[] = []; const installExtensionTask = this.createInstallExtensionTask(manifest, extension, options); if (!URI.isUri(extension)) { @@ -194,7 +195,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const extensionsToInstallMap = allInstallExtensionTasks.reduce((result, { task, manifest }) => { result.set(task.identifier.id.toLowerCase(), { task, manifest }); return result; - }, new Map()); + }, new Map()); while (extensionsToInstallMap.size) { let extensionsToInstall; @@ -294,7 +295,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl return results; } - private async getAllDepsAndPackExtensionsToInstall(extensionIdentifier: IExtensionIdentifier, manifest: IExtensionManifest, getOnlyNewlyAddedFromExtensionPack: boolean, installPreRelease: boolean): Promise<{ gallery: IGalleryExtension, manifest: IExtensionManifest }[]> { + private async getAllDepsAndPackExtensionsToInstall(extensionIdentifier: IExtensionIdentifier, manifest: IExtensionManifest, getOnlyNewlyAddedFromExtensionPack: boolean, installPreRelease: boolean): Promise<{ gallery: IGalleryExtension; manifest: IExtensionManifest }[]> { if (!this.galleryService.isEnabled()) { return []; } @@ -302,7 +303,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl let installed = await this.getInstalled(); const knownIdentifiers = [extensionIdentifier, ...(installed).map(i => i.identifier)]; - const allDependenciesAndPacks: { gallery: IGalleryExtension, manifest: IExtensionManifest }[] = []; + const allDependenciesAndPacks: { gallery: IGalleryExtension; manifest: IExtensionManifest }[] = []; const collectDependenciesAndPackExtensionsToInstall = async (extensionIdentifier: IExtensionIdentifier, manifest: IExtensionManifest): Promise => { const dependecies: string[] = manifest.extensionDependencies || []; const dependenciesAndPackExtensions = [...dependecies]; @@ -321,10 +322,10 @@ export abstract class AbstractExtensionManagementService extends Disposable impl if (dependenciesAndPackExtensions.length) { // filter out installed and known extensions const identifiers = [...knownIdentifiers, ...allDependenciesAndPacks.map(r => r.gallery.identifier)]; - const names = dependenciesAndPackExtensions.filter(id => identifiers.every(galleryIdentifier => !areSameExtensions(galleryIdentifier, { id }))); - if (names.length) { - const galleryResult = await this.galleryService.query({ names, pageSize: dependenciesAndPackExtensions.length }, CancellationToken.None); - for (const galleryExtension of galleryResult.firstPage) { + const ids = dependenciesAndPackExtensions.filter(id => identifiers.every(galleryIdentifier => !areSameExtensions(galleryIdentifier, { id }))); + if (ids.length) { + const galleryExtensions = await this.galleryService.getExtensions(ids.map(id => ({ id, preRelease: installPreRelease })), CancellationToken.None); + for (const galleryExtension of galleryExtensions) { if (identifiers.find(identifier => areSameExtensions(identifier, galleryExtension.identifier))) { continue; } @@ -341,7 +342,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } } allDependenciesAndPacks.push({ gallery: compatible.extension, manifest: compatible.manifest }); - await collectDependenciesAndPackExtensionsToInstall(compatible.extension.identifier, manifest); + await collectDependenciesAndPackExtensionsToInstall(compatible.extension.identifier, compatible.manifest); } } } @@ -352,7 +353,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl return allDependenciesAndPacks.filter(e => !installed.some(i => areSameExtensions(i.identifier, e.gallery.identifier))); } - private async checkAndGetCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, installPreRelease: boolean): Promise<{ extension: IGalleryExtension, manifest: IExtensionManifest }> { + private async checkAndGetCompatibleVersion(extension: IGalleryExtension, fetchCompatibleVersion: boolean, installPreRelease: boolean): Promise<{ extension: IGalleryExtension; manifest: IExtensionManifest }> { const report = await this.getExtensionsControlManifest(); if (getMaliciousExtensionsSet(report).has(extension.identifier.id)) { throw new ExtensionManagementError(nls.localize('malicious extension', "Can't install '{0}' extension since it was reported to be problematic.", extension.identifier.id), ExtensionManagementErrorCode.Malicious); @@ -369,7 +370,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const compatibleExtension = await this.getCompatibleVersion(extension, fetchCompatibleVersion, installPreRelease); if (compatibleExtension) { - if (installPreRelease && extension.hasPreReleaseVersion && !compatibleExtension.properties.isPreReleaseVersion) { + if (installPreRelease && fetchCompatibleVersion && extension.hasPreReleaseVersion && !compatibleExtension.properties.isPreReleaseVersion) { throw new ExtensionManagementError(nls.localize('notFoundCompatiblePrereleaseDependency', "Can't install pre-release version of '{0}' extension because it is not compatible with the current version of {1} (version {2}).", extension.identifier.id, this.productService.nameLong, this.productService.version), ExtensionManagementErrorCode.IncompatiblePreRelease); } } else { @@ -566,24 +567,6 @@ export abstract class AbstractExtensionManagementService extends Disposable impl return installed.filter(e => e.manifest.extensionDependencies && e.manifest.extensionDependencies.some(id => areSameExtensions({ id }, extension.identifier))); } - private async findGalleryExtension(local: ILocalExtension): Promise { - if (local.identifier.uuid) { - const galleryExtension = await this.findGalleryExtensionById(local.identifier.uuid); - return galleryExtension ? galleryExtension : this.findGalleryExtensionByName(local.identifier.id); - } - return this.findGalleryExtensionByName(local.identifier.id); - } - - private async findGalleryExtensionById(uuid: string): Promise { - const galleryResult = await this.galleryService.query({ ids: [uuid], pageSize: 1 }, CancellationToken.None); - return galleryResult.firstPage[0]; - } - - private async findGalleryExtensionByName(name: string): Promise { - const galleryResult = await this.galleryService.query({ names: [name], pageSize: 1 }, CancellationToken.None); - return galleryResult.firstPage[0]; - } - private async updateControlCache(): Promise { try { this.logService.trace('ExtensionManagementService.refreshReportedCache'); diff --git a/src/vs/platform/extensionManagement/common/extensionEnablementService.ts b/src/vs/platform/extensionManagement/common/extensionEnablementService.ts index 58f97c18c09..9011756540b 100644 --- a/src/vs/platform/extensionManagement/common/extensionEnablementService.ts +++ b/src/vs/platform/extensionManagement/common/extensionEnablementService.ts @@ -14,8 +14,8 @@ export class GlobalExtensionEnablementService extends Disposable implements IGlo declare readonly _serviceBrand: undefined; - private _onDidChangeEnablement = new Emitter<{ readonly extensions: IExtensionIdentifier[], readonly source?: string }>(); - readonly onDidChangeEnablement: Event<{ readonly extensions: IExtensionIdentifier[], readonly source?: string }> = this._onDidChangeEnablement.event; + private _onDidChangeEnablement = new Emitter<{ readonly extensions: IExtensionIdentifier[]; readonly source?: string }>(); + readonly onDidChangeEnablement: Event<{ readonly extensions: IExtensionIdentifier[]; readonly source?: string }> = this._onDidChangeEnablement.event; private readonly storageManger: StorageManager; constructor( diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index 4e7f7208b02..80abfb0fb78 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -13,10 +13,10 @@ import { isWeb, platform } from 'vs/base/common/platform'; import { arch } from 'vs/base/common/process'; import { isBoolean } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; -import { IHeaders, IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request'; +import { IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { DefaultIconPath, getFallbackTargetPlarforms, getTargetPlatform, IExtensionGalleryService, IExtensionIdentifier, IExtensionInfo, IGalleryExtension, IGalleryExtensionAsset, IGalleryExtensionAssets, IGalleryExtensionVersion, InstallOperation, IQueryOptions, IExtensionsControlManifest, isNotWebExtensionInWebTargetPlatform, isTargetPlatformCompatible, ITranslation, SortBy, SortOrder, StatisticType, TargetPlatform, toTargetPlatform, WEB_EXTENSION_TAG } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { DefaultIconPath, getFallbackTargetPlarforms, getTargetPlatform, IExtensionGalleryService, IExtensionIdentifier, IExtensionInfo, IGalleryExtension, IGalleryExtensionAsset, IGalleryExtensionAssets, IGalleryExtensionVersion, InstallOperation, IQueryOptions, IExtensionsControlManifest, isNotWebExtensionInWebTargetPlatform, isTargetPlatformCompatible, ITranslation, SortBy, SortOrder, StatisticType, TargetPlatform, toTargetPlatform, WEB_EXTENSION_TAG, IExtensionQueryOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { adoptToGalleryExtensionId, areSameExtensions, getGalleryExtensionId, getGalleryExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator'; @@ -24,10 +24,9 @@ import { IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; import { asJson, asText, IRequestService, isSuccess } from 'vs/platform/request/common/request'; -import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; +import { resolveMarketplaceHeaders } from 'vs/platform/externalServices/common/marketplace'; import { IStorageService } from 'vs/platform/storage/common/storage'; -import { ITelemetryService, TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; -import { getTelemetryLevel, supportsTelemetry } from 'vs/platform/telemetry/common/telemetryUtils'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; const CURRENT_TARGET_PLATFORM = isWeb ? TargetPlatform.WEB : getTargetPlatform(platform, arch); @@ -235,17 +234,17 @@ const DefaultQueryState: IQueryState = { }; type GalleryServiceQueryClassification = { - readonly filterTypes: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly flags: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly sortBy: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly sortOrder: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly duration: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', 'isMeasurement': true; }; - readonly success: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly requestBodySize: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly responseBodySize?: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly statusCode?: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly errorCode?: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - readonly count?: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + readonly filterTypes: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly flags: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly sortBy: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly sortOrder: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true }; + readonly success: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly requestBodySize: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly responseBodySize?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly statusCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly errorCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + readonly count?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type QueryTelemetryData = { @@ -266,8 +265,8 @@ type GalleryServiceQueryEvent = QueryTelemetryData & { }; type GalleryServiceAdditionalQueryClassification = { - readonly duration: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', 'isMeasurement': true }; - readonly count: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + readonly duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; 'isMeasurement': true }; + readonly count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type GalleryServiceAdditionalQueryEvent = { @@ -278,7 +277,7 @@ type GalleryServiceAdditionalQueryEvent = { interface IExtensionCriteria { readonly targetPlatform: TargetPlatform; readonly compatible: boolean; - readonly preRelease: boolean | (IExtensionIdentifier & { preRelease: boolean })[]; + readonly includePreRelease: boolean | (IExtensionIdentifier & { includePreRelease: boolean })[]; readonly versions?: (IExtensionIdentifier & { version: string })[]; } @@ -472,6 +471,16 @@ export function sortExtensionVersions(versions: IRawGalleryExtensionVersion[], p return versions; } +function setTelemetry(extension: IGalleryExtension, index: number, querySource?: string): void { + /* __GDPR__FRAGMENT__ + "GalleryExtensionTelemetryData2" : { + "index" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "querySource": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + extension.telemetryData = { index, querySource }; +} + function toExtension(galleryExtension: IRawGalleryExtension, version: IRawGalleryExtensionVersion, allTargetPlatforms: TargetPlatform[]): IGalleryExtension { const latestVersion = galleryExtension.versions[0]; const assets = { @@ -521,10 +530,10 @@ function toExtension(galleryExtension: IRawGalleryExtension, version: IRawGaller }; } -type PreReleaseMigrationInfo = { id: string, displayName: string, migrateStorage?: boolean, engine?: string }; +type PreReleaseMigrationInfo = { id: string; displayName: string; migrateStorage?: boolean; engine?: string }; interface IRawExtensionsControlManifest { malicious: string[]; - unsupported?: IStringDictionary; + unsupported?: IStringDictionary; migrateToPreRelease?: IStringDictionary; } @@ -535,7 +544,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi private extensionsGalleryUrl: string | undefined; private extensionsControlUrl: string | undefined; - private readonly commonHeadersPromise: Promise<{ [key: string]: string; }>; + private readonly commonHeadersPromise: Promise<{ [key: string]: string }>; constructor( storageService: IStorageService | undefined, @@ -562,21 +571,25 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi } getExtensions(extensionInfos: ReadonlyArray, token: CancellationToken): Promise; - getExtensions(extensionInfos: ReadonlyArray, options: { targetPlatform: TargetPlatform, compatible?: boolean }, token: CancellationToken): Promise; + getExtensions(extensionInfos: ReadonlyArray, options: IExtensionQueryOptions, token: CancellationToken): Promise; async getExtensions(extensionInfos: ReadonlyArray, arg1: any, arg2?: any): Promise { - const options = CancellationToken.isCancellationToken(arg1) ? { targetPlatform: CURRENT_TARGET_PLATFORM } : arg1 as { targetPlatform: TargetPlatform, compatible?: boolean }; + const options = CancellationToken.isCancellationToken(arg1) ? {} : arg1 as IExtensionQueryOptions; const token = CancellationToken.isCancellationToken(arg1) ? arg1 : arg2 as CancellationToken; - const names: string[] = []; const ids: string[] = [], preRelease: (IExtensionIdentifier & { preRelease: boolean })[] = [], versions: (IExtensionIdentifier & { version: string })[] = []; + const names: string[] = []; const ids: string[] = [], includePreReleases: (IExtensionIdentifier & { includePreRelease: boolean })[] = [], versions: (IExtensionIdentifier & { version: string })[] = []; + let isQueryForReleaseVersionFromPreReleaseVersion = true; for (const extensionInfo of extensionInfos) { if (extensionInfo.uuid) { ids.push(extensionInfo.uuid); } else { names.push(extensionInfo.id); } - preRelease.push({ ...extensionInfo, preRelease: !!extensionInfo.preRelease }); + // Set includePreRelease to true if version is set, because the version can be a pre-release version + const includePreRelease = !!(extensionInfo.version || extensionInfo.preRelease); + includePreReleases.push({ id: extensionInfo.id, uuid: extensionInfo.uuid, includePreRelease }); if (extensionInfo.version) { - versions.push({ ...extensionInfo, version: extensionInfo.version }); + versions.push({ id: extensionInfo.id, uuid: extensionInfo.uuid, version: extensionInfo.version }); } + isQueryForReleaseVersionFromPreReleaseVersion = isQueryForReleaseVersionFromPreReleaseVersion && (!!extensionInfo.hasPreRelease && !includePreRelease); } if (!ids.length && !names.length) { @@ -590,8 +603,14 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi if (names.length) { query = query.withFilter(FilterType.ExtensionName, ...names); } + if (options.queryAllVersions || isQueryForReleaseVersionFromPreReleaseVersion /* Inlcude all versions if every requested extension is for release version and has pre-release version */) { + query = query.withFlags(query.flags, Flags.IncludeVersions); + } - const { extensions } = await this.queryGalleryExtensions(query, { targetPlatform: options.targetPlatform, preRelease, versions, compatible: !!options.compatible }, token); + const { extensions } = await this.queryGalleryExtensions(query, { targetPlatform: options.targetPlatform ?? CURRENT_TARGET_PLATFORM, includePreRelease: includePreReleases, versions, compatible: !!options.compatible }, token); + if (options.source) { + extensions.forEach((e, index) => setTelemetry(e, index, options.source)); + } return extensions; } @@ -606,7 +625,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi .withFlags(Flags.IncludeVersions) .withPage(1, 1) .withFilter(FilterType.ExtensionId, extension.identifier.uuid); - const { extensions } = await this.queryGalleryExtensions(query, { targetPlatform, compatible: true, preRelease: includePreRelease }, CancellationToken.None); + const { extensions } = await this.queryGalleryExtensions(query, { targetPlatform, compatible: true, includePreRelease }, CancellationToken.None); return extensions[0] || null; } @@ -616,6 +635,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi } if (!includePreRelease && extension.properties.isPreReleaseVersion) { + // Pre-releases are not allowed when include pre-release flag is not set return false; } @@ -630,12 +650,12 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi return isEngineValid(engine, this.productService.version, this.productService.date); } - private async isValidVersion(rawGalleryExtensionVersion: IRawGalleryExtensionVersion, preRelease: boolean, compatible: boolean, allTargetPlatforms: TargetPlatform[], targetPlatform: TargetPlatform): Promise { + private async isValidVersion(rawGalleryExtensionVersion: IRawGalleryExtensionVersion, versionType: 'release' | 'prerelease' | 'any', compatible: boolean, allTargetPlatforms: TargetPlatform[], targetPlatform: TargetPlatform): Promise { if (!isTargetPlatformCompatible(getTargetPlatformForExtensionVersion(rawGalleryExtensionVersion), allTargetPlatforms, targetPlatform)) { return false; } - if (!preRelease && isPreReleaseVersion(rawGalleryExtensionVersion)) { + if (versionType !== 'any' && isPreReleaseVersion(rawGalleryExtensionVersion) !== (versionType === 'prerelease')) { return false; } @@ -704,15 +724,8 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi } const runQuery = async (query: Query, token: CancellationToken) => { - const { extensions, total } = await this.queryGalleryExtensions(query, { targetPlatform: CURRENT_TARGET_PLATFORM, compatible: false, preRelease: !!options.includePreRelease }, token); - extensions.forEach((e, index) => - /* __GDPR__FRAGMENT__ - "GalleryExtensionTelemetryData2" : { - "index" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "querySource": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - e.telemetryData = { index: ((query.pageNumber - 1) * query.pageSize) + index, querySource: options.source }); + const { extensions, total } = await this.queryGalleryExtensions(query, { targetPlatform: CURRENT_TARGET_PLATFORM, compatible: false, includePreRelease: !!options.includePreRelease }, token); + extensions.forEach((e, index) => setTelemetry(e, ((query.pageNumber - 1) * query.pageSize) + index, options.source)); return { extensions, total }; }; const { extensions, total } = await runQuery(query, token); @@ -727,7 +740,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi return { firstPage: extensions, total, pageSize: query.pageSize, getPage } as IPager; } - private async queryGalleryExtensions(query: Query, criteria: IExtensionCriteria, token: CancellationToken): Promise<{ extensions: IGalleryExtension[], total: number; }> { + private async queryGalleryExtensions(query: Query, criteria: IExtensionCriteria, token: CancellationToken): Promise<{ extensions: IGalleryExtension[]; total: number }> { const flags = query.flags; /** @@ -774,7 +787,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi for (let index = 0; index < rawGalleryExtensions.length; index++) { const rawGalleryExtension = rawGalleryExtensions[index]; const extensionIdentifier = { id: getGalleryExtensionId(rawGalleryExtension.publisher.publisherName, rawGalleryExtension.extensionName), uuid: rawGalleryExtension.extensionId }; - const preRelease = isBoolean(criteria.preRelease) ? criteria.preRelease : !!criteria.preRelease.find(extensionIdentifierWithPreRelease => areSameExtensions(extensionIdentifierWithPreRelease, extensionIdentifier))?.preRelease; + const includePreRelease = isBoolean(criteria.includePreRelease) ? criteria.includePreRelease : !!criteria.includePreRelease.find(extensionIdentifierWithPreRelease => areSameExtensions(extensionIdentifierWithPreRelease, extensionIdentifier))?.includePreRelease; let extension = await this.toGalleryExtensionWithCriteria(rawGalleryExtension, criteria, false); if (!extension /** Skip if the extension is a pre-release version but @@ -782,7 +795,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi * - the extension has no release version * Get all versions to get or check the release version */ - || (extension.properties.isPreReleaseVersion && (!preRelease || !extension.hasReleaseVersion)) + || (extension.properties.isPreReleaseVersion && (!includePreRelease || !extension.hasReleaseVersion)) /** * Skip if the extension is a release version with a different target platform than requested and also has a pre-release version * Because, this is a platform specific extension and can have a newer release version supporting this platform. @@ -820,7 +833,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi const extensionIdentifier = { id: getGalleryExtensionId(rawGalleryExtension.publisher.publisherName, rawGalleryExtension.extensionName), uuid: rawGalleryExtension.extensionId }; const version = criteria.versions?.find(extensionIdentifierWithVersion => areSameExtensions(extensionIdentifierWithVersion, extensionIdentifier))?.version; - const preRelease = isBoolean(criteria.preRelease) ? criteria.preRelease : !!criteria.preRelease.find(extensionIdentifierWithPreRelease => areSameExtensions(extensionIdentifierWithPreRelease, extensionIdentifier))?.preRelease; + const includePreRelease = isBoolean(criteria.includePreRelease) ? criteria.includePreRelease : !!criteria.includePreRelease.find(extensionIdentifierWithPreRelease => areSameExtensions(extensionIdentifierWithPreRelease, extensionIdentifier))?.includePreRelease; const allTargetPlatforms = getAllTargetPlatforms(rawGalleryExtension); const rawGalleryExtensionVersions = sortExtensionVersions(rawGalleryExtension.versions, criteria.targetPlatform); @@ -833,7 +846,8 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi if (version && rawGalleryExtensionVersion.version !== version) { continue; } - if (await this.isValidVersion(rawGalleryExtensionVersion, preRelease, criteria.compatible, allTargetPlatforms, criteria.targetPlatform)) { + // Allow any version if includePreRelease flag is set otherwise only release versions are allowed + if (await this.isValidVersion(rawGalleryExtensionVersion, includePreRelease ? 'any' : 'release', criteria.compatible, allTargetPlatforms, criteria.targetPlatform)) { return toExtension(rawGalleryExtension, rawGalleryExtensionVersion, allTargetPlatforms); } if (version && rawGalleryExtensionVersion.version === version) { @@ -852,7 +866,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi return toExtension(rawGalleryExtension, rawGalleryExtension.versions[0], allTargetPlatforms); } - private async queryRawGalleryExtensions(query: Query, token: CancellationToken): Promise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> { + private async queryRawGalleryExtensions(query: Query, token: CancellationToken): Promise<{ galleryExtensions: IRawGalleryExtension[]; total: number }> { if (!this.isEnabled()) { throw new Error('No extension gallery service configured.'); } @@ -1032,13 +1046,18 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi } const result: IGalleryExtensionVersion[] = []; - for (const version of galleryExtensions[0].versions) { + const seenVersions = new Set(); + await Promise.all(galleryExtensions[0].versions.map(async (version) => { try { - if (result[result.length - 1]?.version !== version.version && await this.isValidVersion(version, includePreRelease, true, allTargetPlatforms, targetPlatform)) { + if (seenVersions.has(version.version)) { + return; + } + if (await this.isValidVersion(version, includePreRelease ? 'any' : 'release', true, allTargetPlatforms, targetPlatform)) { result.push({ version: version.version, date: version.lastUpdated, isPreReleaseVersion: isPreReleaseVersion(version) }); + seenVersions.add(version.version); } } catch (error) { /* Ignore error and skip version */ } - } + })); return result; } @@ -1066,8 +1085,8 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi const message = getErrorMessage(err); type GalleryServiceCDNFallbackClassification = { - url: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - message: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + url: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + message: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type GalleryServiceCDNFallbackEvent = { url: string; @@ -1108,7 +1127,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi const result = await asJson(context); const malicious: IExtensionIdentifier[] = []; - const unsupportedPreReleaseExtensions: IStringDictionary<{ id: string, displayName: string, migrateStorage?: boolean }> = {}; + const unsupportedPreReleaseExtensions: IStringDictionary<{ id: string; displayName: string; migrateStorage?: boolean }> = {}; if (result) { for (const id of result.malicious) { @@ -1165,15 +1184,3 @@ export class ExtensionGalleryServiceWithNoStorageService extends AbstractExtensi super(undefined, requestService, logService, environmentService, telemetryService, fileService, productService, configurationService); } } - -export async function resolveMarketplaceHeaders(version: string, productService: IProductService, environmentService: IEnvironmentService, configurationService: IConfigurationService, fileService: IFileService, storageService: IStorageService | undefined): Promise<{ [key: string]: string; }> { - const headers: IHeaders = { - 'X-Market-Client-Id': `VSCode ${version}`, - 'User-Agent': `VSCode ${version} (${productService.nameShort})` - }; - const uuid = await getServiceMachineId(environmentService, fileService, storageService); - if (supportsTelemetry(productService, environmentService) && getTelemetryLevel(configurationService) === TelemetryLevel.USAGE) { - headers['X-Market-User-Id'] = uuid; - } - return headers; -} diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 6da3ea60800..27de9692f6d 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -11,6 +11,7 @@ import { IPager } from 'vs/base/common/paging'; import { Platform } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; +import { adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, IExtension, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -18,6 +19,15 @@ export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9-A-Z]*)\\.([a-z export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); export const WEB_EXTENSION_TAG = '__web_extension'; +const EXTENSION_IDENTIFIER_WITH_VERSION_REGEX = /^([^.]+\..+)@(\d+\.\d+\.\d+(-.*)?)$/; +export function getIdAndVersion(id: string): [string, string | undefined] { + const matches = EXTENSION_IDENTIFIER_WITH_VERSION_REGEX.exec(id); + if (matches && matches[1]) { + return [adoptToGalleryExtensionId(matches[1]), matches[2]]; + } + return [adoptToGalleryExtensionId(id), undefined]; +} + export const enum TargetPlatform { WIN32_X64 = 'win32-x64', WIN32_IA32 = 'win32-ia32', @@ -222,11 +232,6 @@ export interface IExtensionIdentifier { uuid?: string; } -export interface IExtensionInfo extends IExtensionIdentifier { - version?: string; - preRelease?: boolean; -} - export interface IGalleryExtensionIdentifier extends IExtensionIdentifier { uuid: string; } @@ -245,7 +250,7 @@ export interface IGalleryExtension { publisherId: string; publisher: string; publisherDisplayName: string; - publisherDomain?: { link: string, verified: boolean }; + publisherDomain?: { link: string; verified: boolean }; description: string; installCount: number; rating: number; @@ -267,10 +272,10 @@ export interface IGalleryMetadata { id: string; publisherId: string; publisherDisplayName: string; - isPreReleaseVersion: boolean, + isPreReleaseVersion: boolean; } -export type Metadata = Partial; +export type Metadata = Partial; export interface ILocalExtension extends IExtension { isMachineScoped: boolean; @@ -316,7 +321,7 @@ export const enum StatisticType { export interface IExtensionsControlManifest { malicious: IExtensionIdentifier[]; - unsupportedPreReleaseExtensions?: IStringDictionary<{ id: string, displayName: string, migrateStorage?: boolean }>; + unsupportedPreReleaseExtensions?: IStringDictionary<{ id: string; displayName: string; migrateStorage?: boolean }>; } export const enum InstallOperation { @@ -330,13 +335,26 @@ export interface ITranslation { contents: { [key: string]: {} }; } +export interface IExtensionInfo extends IExtensionIdentifier { + version?: string; + preRelease?: boolean; + hasPreRelease?: boolean; +} + +export interface IExtensionQueryOptions { + targetPlatform?: TargetPlatform; + compatible?: boolean; + queryAllVersions?: boolean; + source?: string; +} + export const IExtensionGalleryService = createDecorator('extensionGalleryService'); export interface IExtensionGalleryService { readonly _serviceBrand: undefined; isEnabled(): boolean; query(options: IQueryOptions, token: CancellationToken): Promise>; getExtensions(extensionInfos: ReadonlyArray, token: CancellationToken): Promise; - getExtensions(extensionInfos: ReadonlyArray, options: { targetPlatform: TargetPlatform, compatible?: boolean }, token: CancellationToken): Promise; + getExtensions(extensionInfos: ReadonlyArray, options: IExtensionQueryOptions, token: CancellationToken): Promise; isExtensionCompatible(extension: IGalleryExtension, includePreRelease: boolean, targetPlatform: TargetPlatform): Promise; getCompatibleExtension(extension: IGalleryExtension, includePreRelease: boolean, targetPlatform: TargetPlatform): Promise; getAllCompatibleVersions(extension: IGalleryExtension, includePreRelease: boolean, targetPlatform: TargetPlatform): Promise; @@ -391,9 +409,9 @@ export class ExtensionManagementError extends Error { } } -export type InstallOptions = { isBuiltin?: boolean, isMachineScoped?: boolean, donotIncludePackAndDependencies?: boolean, installGivenVersion?: boolean, installPreReleaseVersion?: boolean, operation?: InstallOperation }; +export type InstallOptions = { isBuiltin?: boolean; isMachineScoped?: boolean; donotIncludePackAndDependencies?: boolean; installGivenVersion?: boolean; installPreReleaseVersion?: boolean; operation?: InstallOperation }; export type InstallVSIXOptions = Omit & { installOnlyNewlyAddedFromExtensionPack?: boolean }; -export type UninstallOptions = { donotIncludePack?: boolean, donotCheckDependents?: boolean }; +export type UninstallOptions = { donotIncludePack?: boolean; donotCheckDependents?: boolean }; export interface IExtensionManagementParticipant { postInstall(local: ILocalExtension, source: URI | IGalleryExtension, options: InstallOptions | InstallVSIXOptions, token: CancellationToken): Promise; @@ -433,7 +451,7 @@ export const IGlobalExtensionEnablementService = createDecorator; + readonly onDidChangeEnablement: Event<{ readonly extensions: IExtensionIdentifier[]; readonly source?: string }>; getDisabledExtensions(): IExtensionIdentifier[]; enableExtension(extension: IExtensionIdentifier, source?: string): Promise; @@ -442,23 +460,23 @@ export interface IGlobalExtensionEnablementService { } export type IConfigBasedExtensionTip = { - readonly extensionId: string, - readonly extensionName: string, - readonly isExtensionPack: boolean, - readonly configName: string, - readonly important: boolean, + readonly extensionId: string; + readonly extensionName: string; + readonly isExtensionPack: boolean; + readonly configName: string; + readonly important: boolean; }; export type IExecutableBasedExtensionTip = { - readonly extensionId: string, - readonly extensionName: string, - readonly isExtensionPack: boolean, - readonly exeName: string, - readonly exeFriendlyName: string, - readonly windowsPath?: string, + readonly extensionId: string; + readonly extensionName: string; + readonly isExtensionPack: boolean; + readonly exeName: string; + readonly exeFriendlyName: string; + readonly windowsPath?: string; }; -export type IWorkspaceTips = { readonly remoteSet: string[]; readonly recommendations: string[]; }; +export type IWorkspaceTips = { readonly remoteSet: string[]; readonly recommendations: string[] }; export const IExtensionTipsService = createDecorator('IExtensionTipsService'); export interface IExtensionTipsService { diff --git a/src/vs/platform/extensionManagement/common/extensionManagementCLIService.ts b/src/vs/platform/extensionManagement/common/extensionManagementCLIService.ts index bc408d13aaa..2fcfbce9cdd 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementCLIService.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementCLIService.ts @@ -10,8 +10,8 @@ import { Schemas } from 'vs/base/common/network'; import { gt } from 'vs/base/common/semver/semver'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; -import { CLIOutput, IExtensionGalleryService, IExtensionManagementCLIService, IExtensionManagementService, IGalleryExtension, ILocalExtension, InstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { adoptToGalleryExtensionId, areSameExtensions, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { CLIOutput, getIdAndVersion, IExtensionGalleryService, IExtensionManagementCLIService, IExtensionManagementService, IGalleryExtension, ILocalExtension, InstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { areSameExtensions, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, EXTENSION_CATEGORIES, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; @@ -27,17 +27,7 @@ function getId(manifest: IExtensionManifest, withVersion?: boolean): string { } } -const EXTENSION_ID_REGEX = /^([^.]+\..+)@(\d+\.\d+\.\d+(-.*)?)$/; - -export function getIdAndVersion(id: string): [string, string | undefined] { - const matches = EXTENSION_ID_REGEX.exec(id); - if (matches && matches[1]) { - return [adoptToGalleryExtensionId(matches[1]), matches[2]]; - } - return [adoptToGalleryExtensionId(id), undefined]; -} - -type InstallExtensionInfo = { id: string, version?: string, installOptions: InstallOptions; }; +type InstallExtensionInfo = { id: string; version?: string; installOptions: InstallOptions }; export class ExtensionManagementCLIService implements IExtensionManagementCLIService { @@ -201,7 +191,7 @@ export class ExtensionManagementCLIService implements IExtensionManagementCLISer private async getGalleryExtensions(extensions: InstallExtensionInfo[]): Promise> { const galleryExtensions = new Map(); const preRelease = extensions.some(e => e.installOptions.installPreReleaseVersion); - const result = await this.extensionGalleryService.getExtensions(extensions.map(e => ({...e, preRelease})), CancellationToken.None); + const result = await this.extensionGalleryService.getExtensions(extensions.map(e => ({ ...e, preRelease })), CancellationToken.None); for (const extension of result) { galleryExtensions.set(extension.identifier.id.toLowerCase(), extension); } diff --git a/src/vs/platform/extensionManagement/electron-sandbox/extensionTipsService.ts b/src/vs/platform/extensionManagement/electron-sandbox/extensionTipsService.ts index 5e72182fb26..f8d77a97cc0 100644 --- a/src/vs/platform/extensionManagement/electron-sandbox/extensionTipsService.ts +++ b/src/vs/platform/extensionManagement/electron-sandbox/extensionTipsService.ts @@ -25,14 +25,14 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; type ExeExtensionRecommendationsClassification = { - extensionId: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; - exeName: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + exeName: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; }; type IExeBasedExtensionTips = { - readonly exeFriendlyName: string, - readonly windowsPath?: string, - readonly recommendations: { extensionId: string, extensionName: string, isExtensionPack: boolean }[]; + readonly exeFriendlyName: string; + readonly windowsPath?: string; + readonly recommendations: { extensionId: string; extensionName: string; isExtensionPack: boolean }[]; }; const promptedExecutableTipsStorageKey = 'extensionTips/promptedExecutableTips'; @@ -64,9 +64,9 @@ export class ExtensionTipsService extends BaseExtensionTipsService { super(fileService, productService, requestService, logService); if (productService.exeBasedExtensionTips) { forEach(productService.exeBasedExtensionTips, ({ key, value: exeBasedExtensionTip }) => { - const highImportanceRecommendations: { extensionId: string, extensionName: string, isExtensionPack: boolean }[] = []; - const mediumImportanceRecommendations: { extensionId: string, extensionName: string, isExtensionPack: boolean }[] = []; - const otherRecommendations: { extensionId: string, extensionName: string, isExtensionPack: boolean }[] = []; + const highImportanceRecommendations: { extensionId: string; extensionName: string; isExtensionPack: boolean }[] = []; + const mediumImportanceRecommendations: { extensionId: string; extensionName: string; isExtensionPack: boolean }[] = []; + const otherRecommendations: { extensionId: string; extensionName: string; isExtensionPack: boolean }[] = []; forEach(exeBasedExtensionTip.recommendations, ({ key: extensionId, value }) => { if (value.important) { if (exeBasedExtensionTip.important) { @@ -130,13 +130,13 @@ export class ExtensionTipsService extends BaseExtensionTipsService { for (const extensionId of installed) { const tip = importantExeBasedRecommendations.get(extensionId); if (tip) { - this.telemetryService.publicLog2<{ exeName: string, extensionId: string }, ExeExtensionRecommendationsClassification>('exeExtensionRecommendations:alreadyInstalled', { extensionId, exeName: tip.exeName }); + this.telemetryService.publicLog2<{ exeName: string; extensionId: string }, ExeExtensionRecommendationsClassification>('exeExtensionRecommendations:alreadyInstalled', { extensionId, exeName: tip.exeName }); } } for (const extensionId of recommendations) { const tip = importantExeBasedRecommendations.get(extensionId); if (tip) { - this.telemetryService.publicLog2<{ exeName: string, extensionId: string }, ExeExtensionRecommendationsClassification>('exeExtensionRecommendations:notInstalled', { extensionId, exeName: tip.exeName }); + this.telemetryService.publicLog2<{ exeName: string; extensionId: string }, ExeExtensionRecommendationsClassification>('exeExtensionRecommendations:notInstalled', { extensionId, exeName: tip.exeName }); } } @@ -271,7 +271,7 @@ export class ExtensionTipsService extends BaseExtensionTipsService { this.storageService.store(promptedExecutableTipsStorageKey, JSON.stringify(promptedExecutableTips), StorageScope.GLOBAL, StorageTarget.USER); } - private groupByInstalled(recommendationsToSuggest: string[], local: ILocalExtension[]): { installed: string[], uninstalled: string[] } { + private groupByInstalled(recommendationsToSuggest: string[], local: ILocalExtension[]): { installed: string[]; uninstalled: string[] } { const installed: string[] = [], uninstalled: string[] = []; const installedExtensionsIds = local.reduce((result, i) => { result.add(i.identifier.id.toLowerCase()); return result; }, new Set()); recommendationsToSuggest.forEach(id => { diff --git a/src/vs/platform/extensionManagement/node/extensionLifecycle.ts b/src/vs/platform/extensionManagement/node/extensionLifecycle.ts index 730d2357c12..5ebcea3b966 100644 --- a/src/vs/platform/extensionManagement/node/extensionLifecycle.ts +++ b/src/vs/platform/extensionManagement/node/extensionLifecycle.ts @@ -37,7 +37,7 @@ export class ExtensionsLifecycle extends Disposable { return Promises.rm(this.getExtensionStoragePath(extension)).then(undefined, e => this.logService.error('Error while removing extension storage path', e)); } - private parseScript(extension: ILocalExtension, type: string): { script: string, args: string[] } | null { + private parseScript(extension: ILocalExtension, type: string): { script: string; args: string[] } | null { const scriptKey = `vscode:${type}`; if (extension.location.scheme === Schemas.file && extension.manifest && extension.manifest['scripts'] && typeof extension.manifest['scripts'][scriptKey] === 'string') { const script = (extension.manifest['scripts'][scriptKey]).split(' '); @@ -97,7 +97,7 @@ export class ExtensionsLifecycle extends Disposable { const extensionUninstallProcess = fork(uninstallHook, [`--type=extension-post-${lifecycleType}`, ...args], opts); // Catch all output coming from the process - type Output = { data: string, format: string[] }; + type Output = { data: string; format: string[] }; extensionUninstallProcess.stdout!.setEncoding('utf8'); extensionUninstallProcess.stderr!.setEncoding('utf8'); diff --git a/src/vs/platform/extensionManagement/node/extensionsScanner.ts b/src/vs/platform/extensionManagement/node/extensionsScanner.ts index 981ce6e662d..593ae22edfc 100644 --- a/src/vs/platform/extensionManagement/node/extensionsScanner.ts +++ b/src/vs/platform/extensionManagement/node/extensionsScanner.ts @@ -5,6 +5,7 @@ import { flatten } from 'vs/base/common/arrays'; import { Limiter, Promises, Queue } from 'vs/base/common/async'; +import { CancellationToken } from 'vs/base/common/cancellation'; import { IStringDictionary } from 'vs/base/common/collections'; import { getErrorMessage } from 'vs/base/common/errors'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -22,11 +23,11 @@ import { INativeEnvironmentService } from 'vs/platform/environment/common/enviro import { ExtensionManagementError, ExtensionManagementErrorCode, Metadata, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions, ExtensionIdentifierWithVersion, getGalleryExtensionId, groupByExtension } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { localizeManifest } from 'vs/platform/extensionManagement/common/extensionNls'; -import { ExtensionType, IExtensionIdentifier, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; +import { ExtensionType, IExtensionIdentifier, IExtensionManifest, UNDEFINED_PUBLISHER } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; -import { CancellationToken } from 'vscode'; + export type ILocalExtensionManifest = IExtensionManifest & { __metadata?: Metadata }; type IRelaxedLocalExtension = Omit & { isBuiltin: boolean }; @@ -390,7 +391,7 @@ export class ExtensionsScanner extends Disposable { return this._devSystemExtensionsPath; } - private async readManifest(extensionPath: string): Promise<{ manifest: IExtensionManifest; metadata: Metadata | null; }> { + private async readManifest(extensionPath: string): Promise<{ manifest: IExtensionManifest; metadata: Metadata | null }> { const promises = [ pfs.Promises.readFile(path.join(extensionPath, 'package.json'), 'utf8') .then(raw => this.parseManifest(raw)), @@ -406,10 +407,14 @@ export class ExtensionsScanner extends Disposable { }; } - private parseManifest(raw: string): Promise<{ manifest: IExtensionManifest; metadata: Metadata | null; }> { + private parseManifest(raw: string): Promise<{ manifest: IExtensionManifest; metadata: Metadata | null }> { return new Promise((c, e) => { try { - const manifest = JSON.parse(raw); + const manifest = JSON.parse(raw); + // allow publisher to be undefined to make the initial extension authoring experience smoother + if (!manifest.publisher) { + manifest.publisher = UNDEFINED_PUBLISHER; + } const metadata = manifest.__metadata || null; c({ manifest, metadata }); } catch (err) { diff --git a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts index 0c8f7e0044c..0c32205fe91 100644 --- a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts +++ b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts @@ -16,7 +16,7 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' export class ExtensionsWatcher extends Disposable { - private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: ILocalExtension[], removed: IExtensionIdentifier[] }>()); + private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: ILocalExtension[]; removed: IExtensionIdentifier[] }>()); readonly onDidChangeExtensionsByAnotherSource = this._onDidChangeExtensionsByAnotherSource.event; private startTimestamp = 0; diff --git a/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts b/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts index 176954d9823..11533d2f326 100644 --- a/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts +++ b/src/vs/platform/extensionManagement/test/common/extensionGalleryService.test.ts @@ -12,7 +12,7 @@ import { mock } from 'vs/base/test/common/mock'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IRawGalleryExtensionVersion, resolveMarketplaceHeaders, sortExtensionVersions } from 'vs/platform/extensionManagement/common/extensionGalleryService'; +import { IRawGalleryExtensionVersion, sortExtensionVersions } from 'vs/platform/extensionManagement/common/extensionGalleryService'; import { TargetPlatform } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IFileService } from 'vs/platform/files/common/files'; import { FileService } from 'vs/platform/files/common/fileService'; @@ -20,6 +20,7 @@ import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFil import { NullLogService } from 'vs/platform/log/common/log'; import product from 'vs/platform/product/common/product'; import { IProductService } from 'vs/platform/product/common/productService'; +import { resolveMarketplaceHeaders } from 'vs/platform/externalServices/common/marketplace'; import { InMemoryStorageService, IStorageService } from 'vs/platform/storage/common/storage'; import { TelemetryConfiguration, TELEMETRY_SETTING_ID } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/vs/platform/extensions/common/extensionHostStarter.ts b/src/vs/platform/extensions/common/extensionHostStarter.ts index 66f5483cfe3..d4fc6b48112 100644 --- a/src/vs/platform/extensions/common/extensionHostStarter.ts +++ b/src/vs/platform/extensions/common/extensionHostStarter.ts @@ -12,7 +12,7 @@ export const IExtensionHostStarter = createDecorator('ext export const ipcExtensionHostStarterChannelName = 'extensionHostStarter'; export interface IExtensionHostProcessOptions { - env: { [key: string]: string | undefined; }; + env: { [key: string]: string | undefined }; detached: boolean; execArgv: string[] | undefined; silent: boolean; @@ -24,11 +24,11 @@ export interface IExtensionHostStarter { onDynamicStdout(id: string): Event; onDynamicStderr(id: string): Event; onDynamicMessage(id: string): Event; - onDynamicError(id: string): Event<{ error: SerializedError; }>; + onDynamicError(id: string): Event<{ error: SerializedError }>; onDynamicExit(id: string): Event<{ code: number; signal: string }>; - createExtensionHost(): Promise<{ id: string; }>; - start(id: string, opts: IExtensionHostProcessOptions): Promise<{ pid: number; }>; + createExtensionHost(): Promise<{ id: string }>; + start(id: string, opts: IExtensionHostProcessOptions): Promise<{ pid: number }>; enableInspectPort(id: string): Promise; kill(id: string): Promise; diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index fa86a6e9aed..5aa0a9b745e 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -5,13 +5,14 @@ import * as strings from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; +import { ExtensionKind } from 'vs/platform/environment/common/environment'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { ILocalization } from 'vs/platform/localizations/common/localizations'; import { getRemoteName } from 'vs/platform/remote/common/remoteHosts'; export const MANIFEST_CACHE_FOLDER = 'CachedExtensions'; export const USER_MANIFEST_CACHE_FILE = 'user'; export const BUILTIN_MANIFEST_CACHE_FILE = 'builtin'; +export const UNDEFINED_PUBLISHER = 'undefined_publisher'; export interface ICommand { command: string; @@ -26,10 +27,10 @@ export interface IConfigurationProperty { } export interface IConfiguration { - id?: string, - order?: number, - title?: string, - properties: { [key: string]: IConfigurationProperty; }; + id?: string; + order?: number; + title?: string; + properties: { [key: string]: IConfigurationProperty }; } export interface IDebugger { @@ -90,7 +91,7 @@ export interface IView { export interface IColor { id: string; description: string; - defaults: { light: string, dark: string, highContrast: string }; + defaults: { light: string; dark: string; highContrast: string }; } export interface IWebviewEditor { @@ -122,9 +123,9 @@ export interface IWalkthroughStep { readonly title: string; readonly description: string | undefined; readonly media: - | { image: string | { dark: string, light: string, hc: string }, altText: string, markdown?: never, svg?: never } - | { markdown: string, image?: never, svg?: never } - | { svg: string, altText: string, markdown?: never, image?: never } + | { image: string | { dark: string; light: string; hc: string }; altText: string; markdown?: never; svg?: never } + | { markdown: string; image?: never; svg?: never } + | { svg: string; altText: string; markdown?: never; image?: never }; readonly completionEvents?: string[]; /** @deprecated use `completionEvents: 'onCommand:...'` */ readonly doneOn?: { command: string }; @@ -132,7 +133,7 @@ export interface IWalkthroughStep { } export interface IWalkthrough { - readonly id: string, + readonly id: string; readonly title: string; readonly description: string; readonly steps: IWalkthroughStep[]; @@ -159,6 +160,19 @@ export interface INotebookRendererContribution { readonly mimeTypes: string[]; } +export interface ITranslation { + id: string; + path: string; +} + +export interface ILocalizationContribution { + languageId: string; + languageName?: string; + localizedLanguageName?: string; + translations: ITranslation[]; + minimalTranslations?: { [key: string]: string }; +} + export interface IExtensionContributions { commands?: ICommand[]; configuration?: IConfiguration | IConfiguration[]; @@ -175,7 +189,7 @@ export interface IExtensionContributions { viewsContainers?: { [location: string]: IViewContainer[] }; views?: { [location: string]: IView[] }; colors?: IColor[]; - localizations?: ILocalization[]; + localizations?: ILocalizationContribution[]; readonly customEditors?: readonly IWebviewEditor[]; readonly codeActions?: readonly ICodeActionContribution[]; authentication?: IAuthenticationContribution[]; @@ -192,14 +206,13 @@ export interface IExtensionCapabilities { export const ALL_EXTENSION_KINDS: readonly ExtensionKind[] = ['ui', 'workspace', 'web']; -export type ExtensionKind = 'ui' | 'workspace' | 'web'; export type LimitedWorkspaceSupportType = 'limited'; export type ExtensionUntrustedWorkspaceSupportType = boolean | LimitedWorkspaceSupportType; -export type ExtensionUntrustedWorkspaceSupport = { supported: true; } | { supported: false, description: string } | { supported: LimitedWorkspaceSupportType, description: string, restrictedConfigurations?: string[] }; +export type ExtensionUntrustedWorkspaceSupport = { supported: true } | { supported: false; description: string } | { supported: LimitedWorkspaceSupportType; description: string; restrictedConfigurations?: string[] }; export type ExtensionVirtualWorkspaceSupportType = boolean | LimitedWorkspaceSupportType; -export type ExtensionVirtualWorkspaceSupport = boolean | { supported: true; } | { supported: false | LimitedWorkspaceSupportType, description: string }; +export type ExtensionVirtualWorkspaceSupport = boolean | { supported: true } | { supported: false | LimitedWorkspaceSupportType; description: string }; export function getWorkspaceSupportTypeMessage(supportType: ExtensionUntrustedWorkspaceSupport | ExtensionVirtualWorkspaceSupport | undefined): string | undefined { if (typeof supportType === 'object' && supportType !== null) { @@ -261,11 +274,11 @@ export interface IExtensionManifest { readonly extensionPack?: string[]; readonly extensionKind?: ExtensionKind | ExtensionKind[]; readonly contributes?: IExtensionContributions; - readonly repository?: { url: string; }; - readonly bugs?: { url: string; }; + readonly repository?: { url: string }; + readonly bugs?: { url: string }; readonly enabledApiProposals?: readonly string[]; readonly api?: string; - readonly scripts?: { [key: string]: string; }; + readonly scripts?: { [key: string]: string }; readonly capabilities?: IExtensionCapabilities; } diff --git a/src/vs/platform/extensions/electron-main/workerMainProcessExtensionHostStarter.ts b/src/vs/platform/extensions/electron-main/workerMainProcessExtensionHostStarter.ts index d7b4370b3f8..f78d3e2db1f 100644 --- a/src/vs/platform/extensions/electron-main/workerMainProcessExtensionHostStarter.ts +++ b/src/vs/platform/extensions/electron-main/workerMainProcessExtensionHostStarter.ts @@ -123,15 +123,15 @@ export class WorkerMainProcessExtensionHostStarter implements IDisposable, IExte return this._proxy!.onDynamicMessage(id); } - onDynamicError(id: string): Event<{ error: SerializedError; }> { + onDynamicError(id: string): Event<{ error: SerializedError }> { return this._proxy!.onDynamicError(id); } - onDynamicExit(id: string): Event<{ code: number; signal: string; }> { + onDynamicExit(id: string): Event<{ code: number; signal: string }> { return this._proxy!.onDynamicExit(id); } - async createExtensionHost(): Promise<{ id: string; }> { + async createExtensionHost(): Promise<{ id: string }> { const proxy = await this._worker.getProxyObject(); if (this._shutdown) { throw canceled(); @@ -139,7 +139,7 @@ export class WorkerMainProcessExtensionHostStarter implements IDisposable, IExte return proxy.createExtensionHost(); } - async start(id: string, opts: IExtensionHostProcessOptions): Promise<{ pid: number; }> { + async start(id: string, opts: IExtensionHostProcessOptions): Promise<{ pid: number }> { const sw = StopWatch.create(false); const proxy = await this._worker.getProxyObject(); if (this._shutdown) { diff --git a/src/vs/platform/extensions/node/extensionHostStarterWorker.ts b/src/vs/platform/extensions/node/extensionHostStarterWorker.ts index 9ea3bd7857a..e0f8d8b03e4 100644 --- a/src/vs/platform/extensions/node/extensionHostStarterWorker.ts +++ b/src/vs/platform/extensions/node/extensionHostStarterWorker.ts @@ -3,18 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SerializedError, transformErrorForSerialization } from 'vs/base/common/errors'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { IExtensionHostProcessOptions, IExtensionHostStarter } from 'vs/platform/extensions/common/extensionHostStarter'; -import { Emitter, Event } from 'vs/base/common/event'; import { ChildProcess, fork } from 'child_process'; -import { FileAccess } from 'vs/base/common/network'; import { StringDecoder } from 'string_decoder'; -import * as platform from 'vs/base/common/platform'; +import { Promises, timeout } from 'vs/base/common/async'; +import { SerializedError, transformErrorForSerialization } from 'vs/base/common/errors'; +import { Emitter, Event } from 'vs/base/common/event'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { FileAccess } from 'vs/base/common/network'; import { mixin } from 'vs/base/common/objects'; +import * as platform from 'vs/base/common/platform'; import { cwd } from 'vs/base/common/process'; import { StopWatch } from 'vs/base/common/stopwatch'; -import { Promises, timeout } from 'vs/base/common/async'; +import { IExtensionHostProcessOptions, IExtensionHostStarter } from 'vs/platform/extensions/common/extensionHostStarter'; export interface IExtensionHostStarterWorkerHost { logInfo(message: string): Promise; @@ -31,7 +31,7 @@ class ExtensionHostProcess extends Disposable { readonly _onMessage = this._register(new Emitter()); readonly onMessage = this._onMessage.event; - readonly _onError = this._register(new Emitter<{ error: SerializedError; }>()); + readonly _onError = this._register(new Emitter<{ error: SerializedError }>()); readonly onError = this._onError.event; readonly _onExit = this._register(new Emitter<{ pid: number; code: number; signal: string }>()); @@ -47,7 +47,10 @@ class ExtensionHostProcess extends Disposable { super(); } - start(opts: IExtensionHostProcessOptions): { pid: number; } { + start(opts: IExtensionHostProcessOptions): { pid: number } { + if (platform.isCI) { + this._host.logInfo(`Calling fork to start extension host...`); + } const sw = StopWatch.create(false); this._process = fork( FileAccess.asFileUri('bootstrap-fork', require).fsPath, @@ -55,7 +58,7 @@ class ExtensionHostProcess extends Disposable { mixin({ cwd: cwd() }, opts), ); const forkTime = sw.elapsed(); - const pid = this._process.pid; + const pid = this._process.pid!; this._host.logInfo(`Starting extension host with pid ${pid} (fork() took ${forkTime} ms).`); @@ -100,7 +103,7 @@ class ExtensionHostProcess extends Disposable { if (typeof (process)._debugProcess === 'function') { // use (undocumented) _debugProcess feature of node - (process)._debugProcess!(this._process.pid); + (process)._debugProcess!(this._process.pid!); return true; } else if (!platform.isWindows) { // use KILL USR1 on non-windows platforms (fallback) @@ -173,15 +176,15 @@ export class ExtensionHostStarter implements IDisposable, IExtensionHostStarter return this._getExtHost(id).onMessage; } - onDynamicError(id: string): Event<{ error: SerializedError; }> { + onDynamicError(id: string): Event<{ error: SerializedError }> { return this._getExtHost(id).onError; } - onDynamicExit(id: string): Event<{ code: number; signal: string; }> { + onDynamicExit(id: string): Event<{ code: number; signal: string }> { return this._getExtHost(id).onExit; } - async createExtensionHost(): Promise<{ id: string; }> { + async createExtensionHost(): Promise<{ id: string }> { const id = String(++ExtensionHostStarter._lastId); const extHost = new ExtensionHostProcess(id, this._host); this._extHosts.set(id, extHost); @@ -195,7 +198,7 @@ export class ExtensionHostStarter implements IDisposable, IExtensionHostStarter return { id }; } - async start(id: string, opts: IExtensionHostProcessOptions): Promise<{ pid: number; }> { + async start(id: string, opts: IExtensionHostProcessOptions): Promise<{ pid: number }> { return this._getExtHost(id).start(opts); } diff --git a/src/vs/platform/externalServices/common/marketplace.ts b/src/vs/platform/externalServices/common/marketplace.ts new file mode 100644 index 00000000000..6d2c25ab86d --- /dev/null +++ b/src/vs/platform/externalServices/common/marketplace.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 { IHeaders } from 'vs/base/parts/request/common/request'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { getServiceMachineId } from 'vs/platform/externalServices/common/serviceMachineId'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; +import { getTelemetryLevel, supportsTelemetry } from 'vs/platform/telemetry/common/telemetryUtils'; + +export async function resolveMarketplaceHeaders(version: string, productService: IProductService, environmentService: IEnvironmentService, configurationService: IConfigurationService, fileService: IFileService, storageService: IStorageService | undefined): Promise { + const headers: IHeaders = { + 'X-Market-Client-Id': `VSCode ${version}`, + 'User-Agent': `VSCode ${version} (${productService.nameShort})` + }; + const uuid = await getServiceMachineId(environmentService, fileService, storageService); + if (supportsTelemetry(productService, environmentService) && getTelemetryLevel(configurationService) === TelemetryLevel.USAGE) { + headers['X-Market-User-Id'] = uuid; + } + return headers; +} diff --git a/src/vs/platform/serviceMachineId/common/serviceMachineId.ts b/src/vs/platform/externalServices/common/serviceMachineId.ts similarity index 100% rename from src/vs/platform/serviceMachineId/common/serviceMachineId.ts rename to src/vs/platform/externalServices/common/serviceMachineId.ts diff --git a/src/vs/platform/externalTerminal/common/externalTerminal.ts b/src/vs/platform/externalTerminal/common/externalTerminal.ts index 34a0fdc34a2..822ccb24e37 100644 --- a/src/vs/platform/externalTerminal/common/externalTerminal.ts +++ b/src/vs/platform/externalTerminal/common/externalTerminal.ts @@ -15,9 +15,9 @@ export interface IExternalTerminalSettings { } export interface ITerminalForPlatform { - windows: string, - linux: string, - osx: string + windows: string; + linux: string; + osx: string; } export interface IExternalTerminalService { @@ -29,7 +29,7 @@ export interface IExternalTerminalService { export interface IExternalTerminalConfiguration { terminal: { - explorerKind: 'integrated' | 'external', + explorerKind: 'integrated' | 'external'; external: IExternalTerminalSettings; }; } diff --git a/src/vs/platform/externalTerminal/electron-main/externalTerminalService.test.ts b/src/vs/platform/externalTerminal/electron-main/externalTerminalService.test.ts index a831969a2ed..41a96448f98 100644 --- a/src/vs/platform/externalTerminal/electron-main/externalTerminalService.test.ts +++ b/src/vs/platform/externalTerminal/electron-main/externalTerminalService.test.ts @@ -3,63 +3,51 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { deepEqual, equal } from 'assert'; -import { DEFAULT_TERMINAL_OSX } from 'vs/platform/externalTerminal/common/externalTerminal'; +import { deepStrictEqual, strictEqual } from 'assert'; +import { DEFAULT_TERMINAL_OSX, IExternalTerminalConfiguration } from 'vs/platform/externalTerminal/common/externalTerminal'; import { LinuxExternalTerminalService, MacExternalTerminalService, WindowsExternalTerminalService } from 'vs/platform/externalTerminal/node/externalTerminalService'; +const mockConfig: IExternalTerminalConfiguration = Object.freeze({ + terminal: { + explorerKind: 'external', + external: { + windowsExec: 'testWindowsShell', + osxExec: 'testOSXShell', + linuxExec: 'testLinuxShell' + } + } +}); + suite('ExternalTerminalService', () => { - let mockOnExit: Function; - let mockOnError: Function; - let mockConfig: any; - - setup(() => { - mockConfig = { - terminal: { - explorerKind: 'external', - external: { - windowsExec: 'testWindowsShell', - osxExec: 'testOSXShell', - linuxExec: 'testLinuxShell' - } - } - }; - mockOnExit = (s: any) => s; - mockOnError = (e: any) => e; - }); - test(`WinTerminalService - uses terminal from configuration`, done => { - let testShell = 'cmd'; - let testCwd = 'path/to/workspace'; - let mockSpawner = { + const testShell = 'cmd'; + const testCwd = 'path/to/workspace'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - equal(command, testShell, 'shell should equal expected'); - equal(args[args.length - 1], mockConfig.terminal.external.windowsExec, 'terminal should equal expected'); - equal(opts.cwd, testCwd, 'opts.cwd should equal expected'); + strictEqual(command, testShell, 'shell should equal expected'); + strictEqual(args[args.length - 1], mockConfig.terminal.external.windowsExec); + strictEqual(opts.cwd, testCwd); done(); return { on: (evt: any) => evt }; } }; - let testService = new WindowsExternalTerminalService(); - (testService).spawnTerminal( + const testService = new WindowsExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, + mockConfig.terminal.external, testShell, - testCwd, - mockOnExit, - mockOnError + testCwd ); }); test(`WinTerminalService - uses default terminal when configuration.terminal.external.windowsExec is undefined`, done => { - let testShell = 'cmd'; - let testCwd = 'path/to/workspace'; - let mockSpawner = { + const testShell = 'cmd'; + const testCwd = 'path/to/workspace'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - equal(args[args.length - 1], WindowsExternalTerminalService.getDefaultTerminalWindows(), 'terminal should equal expected'); + strictEqual(args[args.length - 1], WindowsExternalTerminalService.getDefaultTerminalWindows()); done(); return { on: (evt: any) => evt @@ -67,162 +55,139 @@ suite('ExternalTerminalService', () => { } }; mockConfig.terminal.external.windowsExec = undefined; - let testService = new WindowsExternalTerminalService(); - (testService).spawnTerminal( + const testService = new WindowsExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, + mockConfig.terminal.external, testShell, - testCwd, - mockOnExit, - mockOnError + testCwd ); }); test(`WinTerminalService - uses default terminal when configuration.terminal.external.windowsExec is undefined`, done => { - let testShell = 'cmd'; - let testCwd = 'c:/foo'; - let mockSpawner = { + const testShell = 'cmd'; + const testCwd = 'c:/foo'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - equal(opts.cwd, 'C:/foo', 'cwd should be uppercase regardless of the case that\'s passed in'); + strictEqual(opts.cwd, 'C:/foo', 'cwd should be uppercase regardless of the case that\'s passed in'); done(); return { on: (evt: any) => evt }; } }; - let testService = new WindowsExternalTerminalService(); - (testService).spawnTerminal( + const testService = new WindowsExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, + mockConfig.terminal.external, testShell, - testCwd, - mockOnExit, - mockOnError + testCwd ); }); test(`WinTerminalService - cmder should be spawned differently`, done => { - let testShell = 'cmd'; - mockConfig.terminal.external.windowsExec = 'cmder'; - let testCwd = 'c:/foo'; - let mockSpawner = { + const testShell = 'cmd'; + const testCwd = 'c:/foo'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - deepEqual(args, ['C:/foo']); - equal(opts, undefined); + deepStrictEqual(args, ['C:/foo']); + strictEqual(opts, undefined); done(); return { on: (evt: any) => evt }; } }; - let testService = new WindowsExternalTerminalService(); - (testService).spawnTerminal( + const testService = new WindowsExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, + { windowsExec: 'cmder' }, testShell, - testCwd, - mockOnExit, - mockOnError + testCwd ); }); test(`WinTerminalService - windows terminal should open workspace directory`, done => { - let testShell = 'wt'; - let testCwd = 'c:/foo'; - let mockSpawner = { + const testShell = 'wt'; + const testCwd = 'c:/foo'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - equal(opts.cwd, 'C:/foo'); + strictEqual(opts.cwd, 'C:/foo'); done(); return { on: (evt: any) => evt }; } }; - let testService = new WindowsExternalTerminalService(); - (testService).spawnTerminal( + const testService = new WindowsExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, + mockConfig.terminal.external, testShell, - testCwd, - mockOnExit, - mockOnError + testCwd ); }); test(`MacTerminalService - uses terminal from configuration`, done => { - let testCwd = 'path/to/workspace'; - let mockSpawner = { + const testCwd = 'path/to/workspace'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - equal(args[1], mockConfig.terminal.external.osxExec, 'terminal should equal expected'); + strictEqual(args[1], mockConfig.terminal.external.osxExec); done(); return { on: (evt: any) => evt }; } }; - let testService = new MacExternalTerminalService(); - (testService).spawnTerminal( + const testService = new MacExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, - testCwd, - mockOnExit, - mockOnError + mockConfig.terminal.external, + testCwd ); }); test(`MacTerminalService - uses default terminal when configuration.terminal.external.osxExec is undefined`, done => { - let testCwd = 'path/to/workspace'; - let mockSpawner = { + const testCwd = 'path/to/workspace'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - equal(args[1], DEFAULT_TERMINAL_OSX, 'terminal should equal expected'); + strictEqual(args[1], DEFAULT_TERMINAL_OSX); done(); return { on: (evt: any) => evt }; } }; - mockConfig.terminal.external.osxExec = undefined; - let testService = new MacExternalTerminalService(); - (testService).spawnTerminal( + const testService = new MacExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, - testCwd, - mockOnExit, - mockOnError + { osxExec: undefined }, + testCwd ); }); test(`LinuxTerminalService - uses terminal from configuration`, done => { - let testCwd = 'path/to/workspace'; - let mockSpawner = { + const testCwd = 'path/to/workspace'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - equal(command, mockConfig.terminal.external.linuxExec, 'terminal should equal expected'); - equal(opts.cwd, testCwd, 'opts.cwd should equal expected'); + strictEqual(command, mockConfig.terminal.external.linuxExec); + strictEqual(opts.cwd, testCwd); done(); return { on: (evt: any) => evt }; } }; - let testService = new LinuxExternalTerminalService(); - (testService).spawnTerminal( + const testService = new LinuxExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, - testCwd, - mockOnExit, - mockOnError + mockConfig.terminal.external, + testCwd ); }); test(`LinuxTerminalService - uses default terminal when configuration.terminal.external.linuxExec is undefined`, done => { LinuxExternalTerminalService.getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { - let testCwd = 'path/to/workspace'; - let mockSpawner = { + const testCwd = 'path/to/workspace'; + const mockSpawner: any = { spawn: (command: any, args: any, opts: any) => { - // assert - equal(command, defaultTerminalLinux, 'terminal should equal expected'); + strictEqual(command, defaultTerminalLinux); done(); return { on: (evt: any) => evt @@ -230,13 +195,11 @@ suite('ExternalTerminalService', () => { } }; mockConfig.terminal.external.linuxExec = undefined; - let testService = new LinuxExternalTerminalService(); - (testService).spawnTerminal( + const testService = new LinuxExternalTerminalService(); + testService.spawnTerminal( mockSpawner, - mockConfig, - testCwd, - mockOnExit, - mockOnError + mockConfig.terminal.external, + testCwd ); }); }); diff --git a/src/vs/platform/externalTerminal/node/externalTerminalService.ts b/src/vs/platform/externalTerminal/node/externalTerminalService.ts index 344322eb4bc..0b37a5d84d8 100644 --- a/src/vs/platform/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/platform/externalTerminal/node/externalTerminalService.ts @@ -320,7 +320,7 @@ function getSanitizedEnvironment(process: NodeJS.Process) { /** * tries to turn OS errors into more meaningful error messages */ -function improveError(err: Error & { errno?: string, path?: string }): Error { +function improveError(err: Error & { errno?: string; path?: string }): Error { if ('errno' in err && err['errno'] === 'ENOENT' && 'path' in err && typeof err['path'] === 'string') { return new Error(nls.localize('ext.term.app.not.found', "can't find terminal application '{0}'", err['path'])); } diff --git a/src/vs/platform/files/browser/htmlFileSystemProvider.ts b/src/vs/platform/files/browser/htmlFileSystemProvider.ts index 3acc9fa2315..7ee315023b7 100644 --- a/src/vs/platform/files/browser/htmlFileSystemProvider.ts +++ b/src/vs/platform/files/browser/htmlFileSystemProvider.ts @@ -15,6 +15,7 @@ import { isLinux } from 'vs/base/common/platform'; import { extUri, extUriIgnorePathCase } from 'vs/base/common/resources'; import { newWriteableStream, ReadableStreamEvents } from 'vs/base/common/stream'; import { createFileSystemProviderError, FileDeleteOptions, FileOverwriteOptions, FileReadStreamOptions, FileSystemProviderCapabilities, FileSystemProviderError, FileSystemProviderErrorCode, FileType, FileWriteOptions, IFileSystemProviderWithFileReadStreamCapability, IFileSystemProviderWithFileReadWriteCapability, IStat, IWatchOptions } from 'vs/platform/files/common/files'; +import { WebFileSystemAccess } from 'vs/platform/files/browser/webFileSystemAccess'; export class HTMLFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithFileReadStreamCapability { @@ -55,7 +56,7 @@ export class HTMLFileSystemProvider implements IFileSystemProviderWithFileReadWr throw this.createFileSystemProviderError(resource, 'No such file or directory, stat', FileSystemProviderErrorCode.FileNotFound); } - if (handle.kind === 'file') { + if (WebFileSystemAccess.isFileSystemFileHandle(handle)) { const file = await handle.getFile(); return { @@ -87,7 +88,7 @@ export class HTMLFileSystemProvider implements IFileSystemProviderWithFileReadWr const result: [string, FileType][] = []; for await (const [name, child] of handle) { - result.push([name, child.kind === 'file' ? FileType.File : FileType.Directory]); + result.push([name, WebFileSystemAccess.isFileSystemFileHandle(child) ? FileType.File : FileType.Directory]); } return result; @@ -134,7 +135,8 @@ export class HTMLFileSystemProvider implements IFileSystemProviderWithFileReadWr // Entire file else { - const reader: ReadableStreamDefaultReader = file.stream().getReader(); + // TODO@electron: duplicate type definitions originate from `@types/node/stream/consumers.d.ts` + const reader: ReadableStreamDefaultReader = (file.stream() as unknown as ReadableStream).getReader(); let res = await reader.read(); while (!res.done) { diff --git a/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts b/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts index 466113c93bf..b1a6755d580 100644 --- a/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts +++ b/src/vs/platform/files/browser/indexedDBFileSystemProvider.ts @@ -28,14 +28,14 @@ type DirEntry = [string, FileType]; type IndexedDBFileSystemEntry = | { - path: string, - type: FileType.Directory, - children: Map, + path: string; + type: FileType.Directory; + children: Map; } | { - path: string, - type: FileType.File, - size: number | undefined, + path: string; + type: FileType.File; + size: number | undefined; }; class IndexedDBFileSystemNode { @@ -92,11 +92,11 @@ class IndexedDBFileSystemNode { } } - add(path: string, entry: { type: 'file', size?: number } | { type: 'dir' }) { + add(path: string, entry: { type: 'file'; size?: number } | { type: 'dir' }) { this.doAdd(path.split('/').filter(p => p.length), entry, path); } - private doAdd(pathParts: string[], entry: { type: 'file', size?: number } | { type: 'dir' }, originalPath: string) { + private doAdd(pathParts: string[], entry: { type: 'file'; size?: number } | { type: 'dir' }, originalPath: string) { if (pathParts.length === 0) { throw ERR_UNKNOWN_INTERNAL(`Internal error creating IndexedDBFSNode -- adding empty path (encountered while adding ${originalPath})`); } @@ -464,7 +464,7 @@ export class IndexedDBFileSystemProvider extends Disposable implements IFileSyst this.triggerChanges(files.map(([resource]) => ({ resource, type: FileChangeType.UPDATED }))); } - private fileWriteBatch: { resource: URI, content: Uint8Array }[] = []; + private fileWriteBatch: { resource: URI; content: Uint8Array }[] = []; private async writeMany() { if (this.fileWriteBatch.length) { const fileBatch = this.fileWriteBatch.splice(0, this.fileWriteBatch.length); diff --git a/src/vs/platform/files/browser/webFileSystemAccess.ts b/src/vs/platform/files/browser/webFileSystemAccess.ts new file mode 100644 index 00000000000..89c5fc217bf --- /dev/null +++ b/src/vs/platform/files/browser/webFileSystemAccess.ts @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** + * Typings for the https://wicg.github.io/file-system-access + * + * Use `supported(window)` to find out if the browser supports this kind of API. + */ +export namespace WebFileSystemAccess { + + export function supported(obj: any & Window): boolean { + if (typeof obj?.showDirectoryPicker === 'function') { + return true; + } + + return false; + } + + export function isFileSystemFileHandle(handle: FileSystemHandle): handle is FileSystemFileHandle { + return handle.kind === 'file'; + } + + export function isFileSystemDirectoryHandle(handle: FileSystemHandle): handle is FileSystemDirectoryHandle { + return handle.kind === 'directory'; + } +} diff --git a/src/vs/platform/files/common/diskFileSystemProviderClient.ts b/src/vs/platform/files/common/diskFileSystemProviderClient.ts index cf6479d8d4a..1980081887f 100644 --- a/src/vs/platform/files/common/diskFileSystemProviderClient.ts +++ b/src/vs/platform/files/common/diskFileSystemProviderClient.ts @@ -31,7 +31,7 @@ export class DiskFileSystemProviderClient extends Disposable implements constructor( private readonly channel: IChannel, - private readonly extraCapabilities: { trash?: boolean, pathCaseSensitive?: boolean } + private readonly extraCapabilities: { trash?: boolean; pathCaseSensitive?: boolean } ) { super(); @@ -210,7 +210,7 @@ export class DiskFileSystemProviderClient extends Disposable implements // for both events and errors from the watcher. So we need to // unwrap the event from the remote and emit through the proper // emitter. - this._register(this.channel.listen<{ resource: UriComponents; type: FileChangeType; }[] | string>('fileChange', [this.sessionId])(eventsOrError => { + this._register(this.channel.listen<{ resource: UriComponents; type: FileChangeType }[] | string>('fileChange', [this.sessionId])(eventsOrError => { if (Array.isArray(eventsOrError)) { const events = eventsOrError; this._onDidChange.fire(events.map(event => ({ resource: URI.revive(event.resource), type: event.type }))); diff --git a/src/vs/platform/files/common/fileService.ts b/src/vs/platform/files/common/fileService.ts index d2adec89ea3..f2c89c70901 100644 --- a/src/vs/platform/files/common/fileService.ts +++ b/src/vs/platform/files/common/fileService.ts @@ -119,7 +119,7 @@ export class FileService extends Disposable implements IFileService { return !!(provider && (provider.capabilities & capability)); } - listCapabilities(): Iterable<{ scheme: string, capabilities: FileSystemProviderCapabilities; }> { + listCapabilities(): Iterable<{ scheme: string; capabilities: FileSystemProviderCapabilities }> { return Iterable.map(this.provider, ([scheme, provider]) => ({ scheme, capabilities: provider.capabilities })); } @@ -233,9 +233,9 @@ export class FileService extends Disposable implements IFileService { }); } - private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType; } & Partial, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise; + private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType } & Partial, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise; private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat, siblings: number | undefined, resolveMetadata: true, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise; - private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType; } & Partial, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise { + private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType } & Partial, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise { const { providerExtUri } = this.getExtUri(provider); // convert to file stat @@ -283,9 +283,9 @@ export class FileService extends Disposable implements IFileService { return fileStat; } - async resolveAll(toResolve: { resource: URI, options?: IResolveFileOptions; }[]): Promise; - async resolveAll(toResolve: { resource: URI, options: IResolveMetadataFileOptions; }[]): Promise; - async resolveAll(toResolve: { resource: URI; options?: IResolveFileOptions; }[]): Promise { + async resolveAll(toResolve: { resource: URI; options?: IResolveFileOptions }[]): Promise; + async resolveAll(toResolve: { resource: URI; options: IResolveMetadataFileOptions }[]): Promise; + async resolveAll(toResolve: { resource: URI; options?: IResolveFileOptions }[]): Promise { return Promises.settled(toResolve.map(async entry => { try { return { stat: await this.doResolveFile(entry.resource, entry.options), success: true }; @@ -388,6 +388,9 @@ export class FileService extends Disposable implements IFileService { else { await this.doWriteBuffered(provider, resource, options, bufferOrReadableOrStreamOrBufferedStream instanceof VSBuffer ? bufferToReadable(bufferOrReadableOrStreamOrBufferedStream) : bufferOrReadableOrStreamOrBufferedStream); } + + // events + this._onDidRunOperation.fire(new FileOperationEvent(resource, FileOperation.WRITE)); } catch (error) { throw new FileOperationError(localize('err.write', "Unable to write file '{0}' ({1})", this.resourceForError(resource), ensureFileSystemProviderError(error).toString()), toFileOperationResult(error), options); } @@ -488,7 +491,7 @@ export class FileService extends Disposable implements IFileService { return this.doReadFileStream(provider, resource, options, token); } - private async doReadFileStream(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability, resource: URI, options?: IReadFileOptions & IReadFileStreamOptions & { preferUnbuffered?: boolean; }, token?: CancellationToken): Promise { + private async doReadFileStream(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability, resource: URI, options?: IReadFileOptions & IReadFileStreamOptions & { preferUnbuffered?: boolean }, token?: CancellationToken): Promise { // install a cancellation token that gets cancelled // when any error occurs. this allows us to resolve @@ -813,7 +816,7 @@ export class FileService extends Disposable implements IFileService { } } - private async doValidateMoveCopy(sourceProvider: IFileSystemProvider, source: URI, targetProvider: IFileSystemProvider, target: URI, mode: 'move' | 'copy', overwrite?: boolean): Promise<{ exists: boolean, isSameResourceWithDifferentPathCase: boolean; }> { + private async doValidateMoveCopy(sourceProvider: IFileSystemProvider, source: URI, targetProvider: IFileSystemProvider, target: URI, mode: 'move' | 'copy', overwrite?: boolean): Promise<{ exists: boolean; isSameResourceWithDifferentPathCase: boolean }> { let isSameResourceWithDifferentPathCase = false; // Check if source is equal or parent to target (requires providers to be the same) @@ -854,7 +857,7 @@ export class FileService extends Disposable implements IFileService { return { exists, isSameResourceWithDifferentPathCase }; } - private getExtUri(provider: IFileSystemProvider): { providerExtUri: IExtUri, isPathCaseSensitive: boolean; } { + private getExtUri(provider: IFileSystemProvider): { providerExtUri: IExtUri; isPathCaseSensitive: boolean } { const isPathCaseSensitive = this.isPathCaseSensitive(provider); return { @@ -998,7 +1001,7 @@ export class FileService extends Disposable implements IFileService { private readonly _onDidWatchError = this._register(new Emitter()); readonly onDidWatchError = this._onDidWatchError.event; - private readonly activeWatchers = new Map(); + private readonly activeWatchers = new Map(); watch(resource: URI, options: IWatchOptions = { recursive: false, excludes: [] }): IDisposable { const disposables = new DisposableStore(); diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 568a29a0648..57627e6b7fb 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -82,7 +82,7 @@ export interface IFileService { /** * List the schemes and capabilies for registered file system providers */ - listCapabilities(): Iterable<{ scheme: string, capabilities: FileSystemProviderCapabilities }> + listCapabilities(): Iterable<{ scheme: string; capabilities: FileSystemProviderCapabilities }>; /** * Allows to listen for file changes. The event will fire for every file within the opened workspace @@ -116,8 +116,8 @@ export interface IFileService { * Same as resolve() but supports resolving multiple resources in parallel. * If one of the resolve targets fails to resolve returns a fake IFileStat instead of making the whole call fail. */ - resolveAll(toResolve: { resource: URI, options: IResolveMetadataFileOptions }[]): Promise; - resolveAll(toResolve: { resource: URI, options?: IResolveFileOptions }[]): Promise; + resolveAll(toResolve: { resource: URI; options: IResolveMetadataFileOptions }[]): Promise; + resolveAll(toResolve: { resource: URI; options?: IResolveFileOptions }[]): Promise; /** * Finds out if a file/folder identified by the resource exists. @@ -654,17 +654,18 @@ export const enum FileOperation { CREATE, DELETE, MOVE, - COPY + COPY, + WRITE } export class FileOperationEvent { - constructor(resource: URI, operation: FileOperation.DELETE); + constructor(resource: URI, operation: FileOperation.DELETE | FileOperation.WRITE); constructor(resource: URI, operation: FileOperation.CREATE | FileOperation.MOVE | FileOperation.COPY, target: IFileStatWithMetadata); constructor(readonly resource: URI, readonly operation: FileOperation, readonly target?: IFileStatWithMetadata) { } - isOperation(operation: FileOperation.DELETE): boolean; - isOperation(operation: FileOperation.MOVE | FileOperation.COPY | FileOperation.CREATE): this is { readonly target: IFileStatWithMetadata }; + isOperation(operation: FileOperation.DELETE | FileOperation.WRITE): boolean; + isOperation(operation: FileOperation.CREATE | FileOperation.MOVE | FileOperation.COPY): this is { readonly target: IFileStatWithMetadata }; isOperation(operation: FileOperation): boolean { return this.operation === operation; } @@ -1171,9 +1172,9 @@ export enum FileKind { */ export const ETAG_DISABLED = ''; -export function etag(stat: { mtime: number, size: number }): string; -export function etag(stat: { mtime: number | undefined, size: number | undefined }): string | undefined; -export function etag(stat: { mtime: number | undefined, size: number | undefined }): string | undefined { +export function etag(stat: { mtime: number; size: number }): string; +export function etag(stat: { mtime: number | undefined; size: number | undefined }): string | undefined; +export function etag(stat: { mtime: number | undefined; size: number | undefined }): string | undefined { if (typeof stat.size !== 'number' || typeof stat.mtime !== 'number') { return undefined; } diff --git a/src/vs/platform/files/common/watcher.ts b/src/vs/platform/files/common/watcher.ts index ae04e5dae49..d4dd3e52802 100644 --- a/src/vs/platform/files/common/watcher.ts +++ b/src/vs/platform/files/common/watcher.ts @@ -143,8 +143,8 @@ export abstract class AbstractWatcherClient extends Disposable { private readonly onLogMessage: (msg: ILogMessage) => void, private verboseLogging: boolean, private options: { - type: string, - restartOnError: boolean + type: string; + restartOnError: boolean; } ) { super(); diff --git a/src/vs/platform/files/node/diskFileSystemProvider.ts b/src/vs/platform/files/node/diskFileSystemProvider.ts index 1dc0cdaa287..0df68750e10 100644 --- a/src/vs/platform/files/node/diskFileSystemProvider.ts +++ b/src/vs/platform/files/node/diskFileSystemProvider.ts @@ -385,14 +385,14 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple let bytesRead: number | null = null; try { - const { bytesRead } = await Promises.read(fd, data, offset, length, normalizedPos); - - return bytesRead; + bytesRead = (await Promises.read(fd, data, offset, length, normalizedPos)).bytesRead; } catch (error) { throw this.toFileSystemProviderError(error); } finally { this.updatePos(fd, normalizedPos, bytesRead); } + + return bytesRead; } private normalizePos(fd: number, pos: number): number | null { @@ -465,14 +465,14 @@ export class DiskFileSystemProvider extends AbstractDiskFileSystemProvider imple let bytesWritten: number | null = null; try { - const { bytesWritten } = await Promises.write(fd, data, offset, length, normalizedPos); - - return bytesWritten; + bytesWritten = (await Promises.write(fd, data, offset, length, normalizedPos)).bytesWritten; } catch (error) { throw await this.toFileSystemProviderWriteError(this.writeHandles.get(fd), error); } finally { this.updatePos(fd, normalizedPos, bytesWritten); } + + return bytesWritten; } //#endregion diff --git a/src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts b/src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts index 905ee57e7b5..2bf8f9ecea7 100644 --- a/src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts +++ b/src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts @@ -115,7 +115,7 @@ export class NodeJSFileWatcherLibrary extends Disposable { // (https://github.com/microsoft/vscode/issues/106879) // TODO@electron this needs a revisit when the crash is // fixed or mitigated upstream. - if (isMacintosh && isEqualOrParent(path, '/Volumes/')) { + if (isMacintosh && isEqualOrParent(path, '/Volumes/', true)) { this.error(`Refusing to watch ${path} for changes using fs.watch() for possibly being a network share where watching is unreliable and unstable.`); return Disposable.None; diff --git a/src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts b/src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts index 692cd03586b..4fdec47ca5f 100644 --- a/src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts +++ b/src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts @@ -457,7 +457,7 @@ export class ParcelWatcher extends Disposable implements IRecursiveWatcher { } } - private normalizePath(request: IRecursiveWatchRequest): { realPath: string, realPathDiffers: boolean, realPathLength: number } { + private normalizePath(request: IRecursiveWatchRequest): { realPath: string; realPathDiffers: boolean; realPathLength: number } { let realPath = request.path; let realPathDiffers = false; let realPathLength = request.path.length; @@ -487,7 +487,7 @@ export class ParcelWatcher extends Disposable implements IRecursiveWatcher { return { realPath, realPathDiffers, realPathLength }; } - private normalizeEvents(events: IDiskFileChange[], request: IRecursiveWatchRequest, realPathDiffers: boolean, realPathLength: number): { events: IDiskFileChange[], rootDeleted: boolean } { + private normalizeEvents(events: IDiskFileChange[], request: IRecursiveWatchRequest, realPathDiffers: boolean, realPathLength: number): { events: IDiskFileChange[]; rootDeleted: boolean } { let rootDeleted = false; for (const event of events) { @@ -497,7 +497,7 @@ export class ParcelWatcher extends Disposable implements IRecursiveWatcher { event.path = normalizeNFC(event.path); } - // TODO@bpasero workaround for https://github.com/parcel-bundler/watcher/issues/68 + // Workaround for https://github.com/parcel-bundler/watcher/issues/68 // where watching root drive letter adds extra backslashes. if (isWindows) { if (request.path.length <= 3) { // for ex. c:, C:\ diff --git a/src/vs/platform/files/test/node/diskFileService.test.ts b/src/vs/platform/files/test/node/diskFileService.test.ts index bae2ef6735b..8b7ce03f59f 100644 --- a/src/vs/platform/files/test/node/diskFileService.test.ts +++ b/src/vs/platform/files/test/node/diskFileService.test.ts @@ -1717,6 +1717,9 @@ flakySuite('Disk File Service', function () { }); async function testWriteFile() { + let event: FileOperationEvent; + disposables.add(service.onDidRunOperation(e => event = e)); + const resource = URI.file(join(testDir, 'small.txt')); const content = readFileSync(resource.fsPath).toString(); @@ -1725,6 +1728,10 @@ flakySuite('Disk File Service', function () { const newContent = 'Updates to the small file'; await service.writeFile(resource, VSBuffer.fromString(newContent)); + assert.ok(event!); + assert.strictEqual(event!.resource.fsPath, resource.fsPath); + assert.strictEqual(event!.operation, FileOperation.WRITE); + assert.strictEqual(readFileSync(resource.fsPath).toString(), newContent); } diff --git a/src/vs/platform/files/test/node/watcherCoalescer.test.ts b/src/vs/platform/files/test/node/watcherCoalescer.test.ts index 7853f6ce565..e6bef2015b5 100644 --- a/src/vs/platform/files/test/node/watcherCoalescer.test.ts +++ b/src/vs/platform/files/test/node/watcherCoalescer.test.ts @@ -12,13 +12,13 @@ import { FileChangesEvent, FileChangeType, IFileChange } from 'vs/platform/files import { IDiskFileChange, coalesceEvents, toFileChanges } from 'vs/platform/files/common/watcher'; class TestFileWatcher { - private readonly _onDidFilesChange: Emitter<{ raw: IFileChange[], event: FileChangesEvent }>; + private readonly _onDidFilesChange: Emitter<{ raw: IFileChange[]; event: FileChangesEvent }>; constructor() { - this._onDidFilesChange = new Emitter<{ raw: IFileChange[], event: FileChangesEvent }>(); + this._onDidFilesChange = new Emitter<{ raw: IFileChange[]; event: FileChangesEvent }>(); } - get onDidFilesChange(): Event<{ raw: IFileChange[], event: FileChangesEvent }> { + get onDidFilesChange(): Event<{ raw: IFileChange[]; event: FileChangesEvent }> { return this._onDidFilesChange.event; } diff --git a/src/vs/platform/history/browser/contextScopedHistoryWidget.ts b/src/vs/platform/history/browser/contextScopedHistoryWidget.ts index c4885858644..ed00f1b0063 100644 --- a/src/vs/platform/history/browser/contextScopedHistoryWidget.ts +++ b/src/vs/platform/history/browser/contextScopedHistoryWidget.ts @@ -11,8 +11,9 @@ import { HistoryInputBox, IHistoryInputOptions } from 'vs/base/browser/ui/inputb import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ContextKeyExpr, IContextKey, IContextKeyService, IContextKeyServiceTarget, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -// eslint-disable-next-line code-import-patterns -import { Context as SuggestContext } from 'vs/editor/contrib/suggest/suggest'; +import { localize } from 'vs/nls'; + +export const historyNavigationVisible = new RawContextKey('suggestWidgetVisible', false, localize('suggestWidgetVisible', "Whether suggestion are visible")); export const HistoryNavigationWidgetContext = 'historyNavigationWidget'; const HistoryNavigationForwardsEnablementContext = 'historyNavigationForwardsEnabled'; @@ -39,9 +40,9 @@ export interface IContextScopedHistoryNavigationWidget extends IContextScopedWid } export interface IHistoryNavigationContext { - scopedContextKeyService: IContextKeyService, - historyNavigationForwardsEnablement: IContextKey, - historyNavigationBackwardsEnablement: IContextKey, + scopedContextKeyService: IContextKeyService; + historyNavigationForwardsEnablement: IContextKey; + historyNavigationBackwardsEnablement: IContextKey; } export function createAndBindHistoryNavigationWidgetScopedContextKeyService(contextKeyService: IContextKeyService, widget: IContextScopedHistoryNavigationWidget): IHistoryNavigationContext { @@ -94,7 +95,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ when: ContextKeyExpr.and( ContextKeyExpr.has(HistoryNavigationWidgetContext), ContextKeyExpr.equals(HistoryNavigationBackwardsEnablementContext, true), - SuggestContext.Visible.isEqualTo(false), + historyNavigationVisible.isEqualTo(false), ), primary: KeyCode.UpArrow, secondary: [KeyMod.Alt | KeyCode.UpArrow], @@ -113,7 +114,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ when: ContextKeyExpr.and( ContextKeyExpr.has(HistoryNavigationWidgetContext), ContextKeyExpr.equals(HistoryNavigationForwardsEnablementContext, true), - SuggestContext.Visible.isEqualTo(false), + historyNavigationVisible.isEqualTo(false), ), primary: KeyCode.DownArrow, secondary: [KeyMod.Alt | KeyCode.DownArrow], diff --git a/src/vs/platform/instantiation/common/descriptors.ts b/src/vs/platform/instantiation/common/descriptors.ts index 3308907e08f..cd758ffe6a5 100644 --- a/src/vs/platform/instantiation/common/descriptors.ts +++ b/src/vs/platform/instantiation/common/descriptors.ts @@ -17,66 +17,5 @@ export class SyncDescriptor { } export interface SyncDescriptor0 { - ctor: any; - bind(): SyncDescriptor0; -} -export interface SyncDescriptor1 { - ctor: any; - bind(a1: A1): SyncDescriptor0; -} -export interface SyncDescriptor2 { - ctor: any; - bind(a1: A1): SyncDescriptor1; - bind(a1: A1, a2: A2): SyncDescriptor0; -} -export interface SyncDescriptor3 { - ctor: any; - bind(a1: A1): SyncDescriptor2; - bind(a1: A1, a2: A2): SyncDescriptor1; - bind(a1: A1, a2: A2, a3: A3): SyncDescriptor0; -} -export interface SyncDescriptor4 { - ctor: any; - bind(a1: A1): SyncDescriptor3; - bind(a1: A1, a2: A2): SyncDescriptor2; - bind(a1: A1, a2: A2, a3: A3): SyncDescriptor1; - bind(a1: A1, a2: A2, a3: A3, a4: A4): SyncDescriptor0; -} -export interface SyncDescriptor5 { - ctor: any; - bind(a1: A1): SyncDescriptor4; - bind(a1: A1, a2: A2): SyncDescriptor3; - bind(a1: A1, a2: A2, a3: A3): SyncDescriptor2; - bind(a1: A1, a2: A2, a3: A3, a4: A4): SyncDescriptor1; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): SyncDescriptor0; -} -export interface SyncDescriptor6 { - ctor: any; - bind(a1: A1): SyncDescriptor5; - bind(a1: A1, a2: A2): SyncDescriptor4; - bind(a1: A1, a2: A2, a3: A3): SyncDescriptor3; - bind(a1: A1, a2: A2, a3: A3, a4: A4): SyncDescriptor2; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): SyncDescriptor1; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): SyncDescriptor0; -} -export interface SyncDescriptor7 { - ctor: any; - bind(a1: A1): SyncDescriptor6; - bind(a1: A1, a2: A2): SyncDescriptor5; - bind(a1: A1, a2: A2, a3: A3): SyncDescriptor4; - bind(a1: A1, a2: A2, a3: A3, a4: A4): SyncDescriptor3; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): SyncDescriptor2; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): SyncDescriptor1; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): SyncDescriptor0; -} -export interface SyncDescriptor8 { - ctor: any; - bind(a1: A1): SyncDescriptor7; - bind(a1: A1, a2: A2): SyncDescriptor6; - bind(a1: A1, a2: A2, a3: A3): SyncDescriptor5; - bind(a1: A1, a2: A2, a3: A3, a4: A4): SyncDescriptor4; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): SyncDescriptor3; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): SyncDescriptor2; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): SyncDescriptor1; - bind(a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): SyncDescriptor0; + readonly ctor: new () => T; } diff --git a/src/vs/platform/instantiation/common/instantiation.ts b/src/vs/platform/instantiation/common/instantiation.ts index 74bf1e8a72f..5dba1522f24 100644 --- a/src/vs/platform/instantiation/common/instantiation.ts +++ b/src/vs/platform/instantiation/common/instantiation.ts @@ -15,7 +15,7 @@ export namespace _util { export const DI_TARGET = '$di$target'; export const DI_DEPENDENCIES = '$di$dependencies'; - export function getServiceDependencies(ctor: any): { id: ServiceIdentifier, index: number, optional: boolean }[] { + export function getServiceDependencies(ctor: any): { id: ServiceIdentifier; index: number; optional: boolean }[] { return ctor[DI_DEPENDENCIES] || []; } } @@ -24,40 +24,8 @@ export namespace _util { export type BrandedService = { _serviceBrand: undefined }; -export interface IConstructorSignature0 { - new(...services: BrandedService[]): T; -} - -export interface IConstructorSignature1 { - new (first: A1, ...services: Services): T; -} - -export interface IConstructorSignature2 { - new(first: A1, second: A2, ...services: BrandedService[]): T; -} - -export interface IConstructorSignature3 { - new(first: A1, second: A2, third: A3, ...services: BrandedService[]): T; -} - -export interface IConstructorSignature4 { - new(first: A1, second: A2, third: A3, fourth: A4, ...services: BrandedService[]): T; -} - -export interface IConstructorSignature5 { - new(first: A1, second: A2, third: A3, fourth: A4, fifth: A5, ...services: BrandedService[]): T; -} - -export interface IConstructorSignature6 { - new(first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6, ...services: BrandedService[]): T; -} - -export interface IConstructorSignature7 { - new(first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6, seventh: A7, ...services: BrandedService[]): T; -} - -export interface IConstructorSignature8 { - new(first: A1, second: A2, third: A3, fourth: A4, fifth: A5, sixth: A6, seventh: A7, eigth: A8, ...services: BrandedService[]): T; +export interface IConstructorSignature { + new (...args: [...Args, ...Services]): T; } export interface ServicesAccessor { @@ -72,14 +40,8 @@ export const IInstantiationService = createDecorator('ins */ type GetLeadingNonServiceArgs = Args extends [...BrandedService[]] ? [] - : Args extends [infer A1, ...BrandedService[]] ? [A1] - : Args extends [infer A1, infer A2, ...BrandedService[]] ? [A1, A2] - : Args extends [infer A1, infer A2, infer A3, ...BrandedService[]] ? [A1, A2, A3] - : Args extends [infer A1, infer A2, infer A3, infer A4, ...BrandedService[]] ? [A1, A2, A3, A4] - : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, ...BrandedService[]] ? [A1, A2, A3, A4, A5] - : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, ...BrandedService[]] ? [A1, A2, A3, A4, A5, A6] - : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, ...BrandedService[]] ? [A1, A2, A3, A4, A5, A6, A7] - : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, infer A8, ...BrandedService[]] ? [A1, A2, A3, A4, A5, A6, A7, A8] + : Args extends [infer A, ...BrandedService[]] ? [A] + : Args extends [infer A, ...infer R] ? [A, ...GetLeadingNonServiceArgs] : never; export interface IInstantiationService { @@ -87,36 +49,26 @@ export interface IInstantiationService { readonly _serviceBrand: undefined; /** - * Synchronously creates an instance that is denoted by - * the descriptor + * Synchronously creates an instance that is denoted by the descriptor */ createInstance(descriptor: descriptors.SyncDescriptor0): T; - createInstance(descriptor: descriptors.SyncDescriptor1, a1: A1): T; - createInstance(descriptor: descriptors.SyncDescriptor2, a1: A1, a2: A2): T; - createInstance(descriptor: descriptors.SyncDescriptor3, a1: A1, a2: A2, a3: A3): T; - createInstance(descriptor: descriptors.SyncDescriptor4, a1: A1, a2: A2, a3: A3, a4: A4): T; - createInstance(descriptor: descriptors.SyncDescriptor5, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): T; - createInstance(descriptor: descriptors.SyncDescriptor6, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): T; - createInstance(descriptor: descriptors.SyncDescriptor7, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): T; - createInstance(descriptor: descriptors.SyncDescriptor8, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): T; - - createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R; + createInstance any, R extends InstanceType>(ctor: Ctor, ...args: GetLeadingNonServiceArgs>): R; /** - * + * Calls a function with a service accessor. */ invokeFunction(fn: (accessor: ServicesAccessor, ...args: TS) => R, ...args: TS): R; /** - * Creates a child of this service which inherts all current services - * and adds/overwrites the given services + * Creates a child of this service which inherits all current services + * and adds/overwrites the given services. */ createChild(services: ServiceCollection): IInstantiationService; } /** - * Identifies a service of type T + * Identifies a service of type `T`. */ export interface ServiceIdentifier { (...args: any[]): void; diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 69cb2fe3857..7844e04fa0f 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -156,7 +156,7 @@ export class InstantiationService implements IInstantiationService { private _createAndCacheServiceInstance(id: ServiceIdentifier, desc: SyncDescriptor, _trace: Trace): T { - type Triple = { id: ServiceIdentifier, desc: SyncDescriptor, _trace: Trace; }; + type Triple = { id: ServiceIdentifier; desc: SyncDescriptor; _trace: Trace }; const graph = new Graph(data => data.id.toString()); let cycleCount = 0; diff --git a/src/vs/platform/ipc/electron-sandbox/services.ts b/src/vs/platform/ipc/electron-sandbox/services.ts index eb62cfa728a..8c78c98f03b 100644 --- a/src/vs/platform/ipc/electron-sandbox/services.ts +++ b/src/vs/platform/ipc/electron-sandbox/services.ts @@ -9,7 +9,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; type ChannelClientCtor = { new(channel: IChannel): T }; -type Remote = { getChannel(channelName: string): IChannel; }; +type Remote = { getChannel(channelName: string): IChannel }; abstract class RemoteServiceStub { constructor( diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts index 0f398932e6d..550c83be0d9 100644 --- a/src/vs/platform/issue/common/issue.ts +++ b/src/vs/platform/issue/common/issue.ts @@ -102,7 +102,7 @@ export interface IssueReporterWindowConfiguration extends ISandboxConfiguration type: string; arch: string; release: string; - } + }; } export interface ProcessExplorerWindowConfiguration extends ISandboxConfiguration { diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 741cdb98fd3..4411fa6698e 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { BrowserWindow, Display, ipcMain, IpcMainEvent, screen } from 'electron'; +import { BrowserWindow, BrowserWindowConstructorOptions, Display, ipcMain, IpcMainEvent, screen } from 'electron'; import { arch, release, type } from 'os'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { DisposableStore } from 'vs/base/common/lifecycle'; @@ -12,6 +12,7 @@ import { IProcessEnvironment, isMacintosh } from 'vs/base/common/platform'; import { listProcesses } from 'vs/base/node/ps'; import { localize } from 'vs/nls'; import { IDiagnosticsService, isRemoteDiagnosticError, PerformanceInfo } from 'vs/platform/diagnostics/common/diagnostics'; +import { IDiagnosticsMainService } from 'vs/platform/diagnostics/electron-main/diagnosticsMainService'; import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogMainService'; import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -54,6 +55,7 @@ export class IssueMainService implements ICommonIssueService { @ILaunchMainService private readonly launchMainService: ILaunchMainService, @ILogService private readonly logService: ILogService, @IDiagnosticsService private readonly diagnosticsService: IDiagnosticsService, + @IDiagnosticsMainService private readonly diagnosticsMainService: IDiagnosticsMainService, @IDialogMainService private readonly dialogMainService: IDialogMainService, @INativeHostMainService private readonly nativeHostMainService: INativeHostMainService, @IProtocolMainService private readonly protocolMainService: IProtocolMainService, @@ -64,7 +66,7 @@ export class IssueMainService implements ICommonIssueService { private registerListeners(): void { ipcMain.on('vscode:issueSystemInfoRequest', async event => { - const [info, remoteData] = await Promise.all([this.launchMainService.getMainProcessInfo(), this.launchMainService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]); + const [info, remoteData] = await Promise.all([this.launchMainService.getMainProcessInfo(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]); const msg = await this.diagnosticsService.getSystemInfo(info, remoteData); this.safeSend(event, 'vscode:issueSystemInfoResponse', msg); @@ -77,7 +79,7 @@ export class IssueMainService implements ICommonIssueService { const mainPid = await this.launchMainService.getMainProcessId(); processes.push({ name: localize('local', "Local"), rootProcess: await listProcesses(mainPid) }); - const remoteDiagnostics = await this.launchMainService.getRemoteDiagnostics({ includeProcesses: true }); + const remoteDiagnostics = await this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: true }); remoteDiagnostics.forEach(data => { if (isRemoteDiagnosticError(data)) { processes.push({ @@ -150,7 +152,7 @@ export class IssueMainService implements ICommonIssueService { } }); - ipcMain.on('vscode:workbenchCommand', (_: unknown, commandInfo: { id: any; from: any; args: any; }) => { + ipcMain.on('vscode:workbenchCommand', (_: unknown, commandInfo: { id: any; from: any; args: any }) => { const { id, from, args } = commandInfo; let parentWindow: BrowserWindow | null; @@ -335,10 +337,11 @@ export class IssueMainService implements ICommonIssueService { nativeWindowOpen: true, zoomFactor: zoomLevelToZoomFactor(options.zoomLevel), sandbox: true, - contextIsolation: true, + contextIsolation: true }, - alwaysOnTop: options.alwaysOnTop - }); + alwaysOnTop: options.alwaysOnTop, + experimentalDarkMode: true + } as BrowserWindowConstructorOptions & { experimentalDarkMode: boolean }); window.setMenuBarVisibility(false); @@ -346,7 +349,7 @@ export class IssueMainService implements ICommonIssueService { } async getSystemStatus(): Promise { - const [info, remoteData] = await Promise.all([this.launchMainService.getMainProcessInfo(), this.launchMainService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]); + const [info, remoteData] = await Promise.all([this.launchMainService.getMainProcessInfo(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: false, includeWorkspaceMetadata: false })]); return this.diagnosticsService.getDiagnostics(info, remoteData); } @@ -422,7 +425,7 @@ export class IssueMainService implements ICommonIssueService { private async getPerformanceInfo(): Promise { try { - const [info, remoteData] = await Promise.all([this.launchMainService.getMainProcessInfo(), this.launchMainService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true })]); + const [info, remoteData] = await Promise.all([this.launchMainService.getMainProcessInfo(), this.diagnosticsMainService.getRemoteDiagnostics({ includeProcesses: true, includeWorkspaceMetadata: true })]); return await this.diagnosticsService.getPerformanceInfo(info, remoteData); } catch (error) { this.logService.warn('issueService#getPerformanceInfo ', error.message); diff --git a/src/vs/platform/keybinding/common/keybindingResolver.ts b/src/vs/platform/keybinding/common/keybindingResolver.ts index a5da8c24c8a..8f13c5e878a 100644 --- a/src/vs/platform/keybinding/common/keybindingResolver.ts +++ b/src/vs/platform/keybinding/common/keybindingResolver.ts @@ -88,7 +88,8 @@ export class KeybindingResolver { public static handleRemovals(rules: ResolvedKeybindingItem[]): ResolvedKeybindingItem[] { // Do a first pass and construct a hash-map for removals const removals = new Map(); - for (const rule of rules) { + for (let i = 0, len = rules.length; i < len; i++) { + const rule = rules[i]; if (rule.command && rule.command.charAt(0) === '-') { const command = rule.command.substring(1); if (!removals.has(command)) { @@ -106,7 +107,9 @@ export class KeybindingResolver { // Do a second pass and keep only non-removed keybindings const result: ResolvedKeybindingItem[] = []; - for (const rule of rules) { + for (let i = 0, len = rules.length; i < len; i++) { + const rule = rules[i]; + if (!rule.command || rule.command.length === 0) { result.push(rule); continue; @@ -115,7 +118,7 @@ export class KeybindingResolver { continue; } const commandRemovals = removals.get(rule.command); - if (!commandRemovals) { + if (!commandRemovals || !rule.isDefault) { result.push(rule); continue; } @@ -330,7 +333,7 @@ export class KeybindingResolver { for (let i = matches.length - 1; i >= 0; i--) { let k = matches[i]; - if (!KeybindingResolver.contextMatchesRules(context, k.when)) { + if (!KeybindingResolver._contextMatchesRules(context, k.when)) { continue; } @@ -340,7 +343,7 @@ export class KeybindingResolver { return null; } - public static contextMatchesRules(context: IContext, rules: ContextKeyExpression | null | undefined): boolean { + private static _contextMatchesRules(context: IContext, rules: ContextKeyExpression | null | undefined): boolean { if (!rules) { return true; } diff --git a/src/vs/platform/keybinding/common/keybindingsRegistry.ts b/src/vs/platform/keybinding/common/keybindingsRegistry.ts index e8f7a8daa75..75c0bd4dec2 100644 --- a/src/vs/platform/keybinding/common/keybindingsRegistry.ts +++ b/src/vs/platform/keybinding/common/keybindingsRegistry.ts @@ -90,7 +90,7 @@ class KeybindingsRegistryImpl implements IKeybindingsRegistry { /** * Take current platform into account and reduce to primary & secondary. */ - private static bindToCurrentPlatform(kb: IKeybindings): { primary?: number; secondary?: number[]; } { + private static bindToCurrentPlatform(kb: IKeybindings): { primary?: number; secondary?: number[] } { if (OS === OperatingSystem.Windows) { if (kb && kb.win) { return kb.win; diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index b38e330aba6..ed30931fd88 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -97,8 +97,8 @@ suite('AbstractKeybindingService', () => { let createTestKeybindingService: (items: ResolvedKeybindingItem[], contextValue?: any) => TestKeybindingService = null!; let currentContextValue: IContext | null = null; - let executeCommandCalls: { commandId: string; args: any[]; }[] = null!; - let showMessageCalls: { sev: Severity, message: any; }[] = null!; + let executeCommandCalls: { commandId: string; args: any[] }[] = null!; + let showMessageCalls: { sev: Severity; message: any }[] = null!; let statusMessageCalls: string[] | null = null; let statusMessageCallsDisposed: string[] | null = null; diff --git a/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts b/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts index 83f84dbd4fe..77935d73c2c 100644 --- a/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts +++ b/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts @@ -45,8 +45,8 @@ suite('KeybindingResolver', () => { const contextRules = ContextKeyExpr.equals('bar', 'baz'); const keybindingItem = kbItem(keybinding, 'yes', null, contextRules, true); - assert.strictEqual(KeybindingResolver.contextMatchesRules(createContext({ bar: 'baz' }), contextRules), true); - assert.strictEqual(KeybindingResolver.contextMatchesRules(createContext({ bar: 'bz' }), contextRules), false); + assert.strictEqual(contextRules.evaluate(createContext({ bar: 'baz' })), true); + assert.strictEqual(contextRules.evaluate(createContext({ bar: 'bz' })), false); const resolver = new KeybindingResolver([keybindingItem], [], () => { }); assert.strictEqual(resolver.resolve(createContext({ bar: 'baz' }), null, getDispatchStr(runtimeKeybinding))!.commandId, 'yes'); @@ -158,7 +158,7 @@ suite('KeybindingResolver', () => { kbItem(KeyCode.KeyB, 'yes2', null, ContextKeyExpr.equals('2', 'b'), true) ]; const overrides = [ - kbItem(KeyCode.KeyA, '-yes1', null, null!, false) + kbItem(KeyCode.KeyA, '-yes1', null, undefined, false) ]; const actual = KeybindingResolver.handleRemovals([...defaults, ...overrides]); assert.deepStrictEqual(actual, [ @@ -172,7 +172,7 @@ suite('KeybindingResolver', () => { kbItem(KeyCode.KeyB, 'yes2', null, ContextKeyExpr.equals('2', 'b'), true) ]; const overrides = [ - kbItem(0, '-yes1', null, null!, false) + kbItem(0, '-yes1', null, undefined, false) ]; const actual = KeybindingResolver.handleRemovals([...defaults, ...overrides]); assert.deepStrictEqual(actual, [ @@ -199,7 +199,7 @@ suite('KeybindingResolver', () => { kbItem(KeyCode.KeyB, 'yes2', null, ContextKeyExpr.equals('2', 'b'), true) ]; const overrides = [ - kbItem(KeyCode.KeyA, '-yes1', null, null!, false) + kbItem(KeyCode.KeyA, '-yes1', null, undefined, false) ]; const actual = KeybindingResolver.handleRemovals([...defaults, ...overrides]); assert.deepStrictEqual(actual, [ @@ -207,6 +207,34 @@ suite('KeybindingResolver', () => { ]); }); + test('issue #140884 Unable to reassign F1 as keybinding for Show All Commands', () => { + const defaults = [ + kbItem(KeyCode.KeyA, 'command1', null, undefined, true), + ]; + const overrides = [ + kbItem(KeyCode.KeyA, '-command1', null, undefined, false), + kbItem(KeyCode.KeyA, 'command1', null, undefined, false), + ]; + const actual = KeybindingResolver.handleRemovals([...defaults, ...overrides]); + assert.deepStrictEqual(actual, [ + kbItem(KeyCode.KeyA, 'command1', null, undefined, false) + ]); + }); + + test('issue #141638: Keyboard Shortcuts: Change When Expression might actually remove keybinding in Insiders', () => { + const defaults = [ + kbItem(KeyCode.KeyA, 'command1', null, undefined, true), + ]; + const overrides = [ + kbItem(KeyCode.KeyA, 'command1', null, ContextKeyExpr.equals('a', '1'), false), + kbItem(KeyCode.KeyA, '-command1', null, undefined, false), + ]; + const actual = KeybindingResolver.handleRemovals([...defaults, ...overrides]); + assert.deepStrictEqual(actual, [ + kbItem(KeyCode.KeyA, 'command1', null, ContextKeyExpr.equals('a', '1'), false) + ]); + }); + test('contextIsEntirelyIncluded', () => { const toContextKeyExpression = (expr: ContextKeyExpression | string | null) => { if (typeof expr === 'string' || !expr) { @@ -277,7 +305,7 @@ suite('KeybindingResolver', () => { _kbItem( KeyCode.KeyZ, 'second', - null! + undefined ), // This one sometimes overwrites first _kbItem( @@ -295,43 +323,43 @@ suite('KeybindingResolver', () => { _kbItem( KeyChord(KeyMod.CtrlCmd | KeyCode.KeyY, KeyCode.KeyZ), 'fifth', - null! + undefined ), // This one has no keybinding _kbItem( 0, 'sixth', - null! + undefined ), _kbItem( KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.KeyU), 'seventh', - null! + undefined ), _kbItem( KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.KeyK), 'seventh', - null! + undefined ), _kbItem( KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.KeyU), 'uncomment lines', - null! + undefined ), _kbItem( KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.KeyC), 'comment lines', - null! + undefined ), _kbItem( KeyChord(KeyMod.CtrlCmd | KeyCode.KeyG, KeyMod.CtrlCmd | KeyCode.KeyC), 'unreachablechord', - null! + undefined ), _kbItem( KeyMod.CtrlCmd | KeyCode.KeyG, 'eleven', - null! + undefined ) ]; diff --git a/src/vs/platform/keyboardLayout/common/keyboardLayout.ts b/src/vs/platform/keyboardLayout/common/keyboardLayout.ts index c0e70e5bea5..ab93738d115 100644 --- a/src/vs/platform/keyboardLayout/common/keyboardLayout.ts +++ b/src/vs/platform/keyboardLayout/common/keyboardLayout.ts @@ -49,28 +49,12 @@ export type IMacLinuxKeyMapping = IMacKeyMapping | ILinuxKeyMapping; export type IMacLinuxKeyboardMapping = IMacKeyboardMapping | ILinuxKeyboardMapping; export type IKeyboardMapping = IWindowsKeyboardMapping | ILinuxKeyboardMapping | IMacKeyboardMapping; -/* __GDPR__FRAGMENT__ - "IKeyboardLayoutInfo" : { - "name" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "id": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "text": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } -*/ export interface IWindowsKeyboardLayoutInfo { name: string; id: string; text: string; } -/* __GDPR__FRAGMENT__ - "IKeyboardLayoutInfo" : { - "model" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "layout": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "variant": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "options": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "rules": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } -*/ export interface ILinuxKeyboardLayoutInfo { model: string; group: number; @@ -80,13 +64,6 @@ export interface ILinuxKeyboardLayoutInfo { rules: string; } -/* __GDPR__FRAGMENT__ - "IKeyboardLayoutInfo" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "lang": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "localizedName": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } -*/ export interface IMacKeyboardLayoutInfo { id: string; lang: string; @@ -131,7 +108,7 @@ export function areKeyboardLayoutsEqual(a: IKeyboardLayoutInfo | null, b: IKeybo return false; } -export function parseKeyboardLayoutDescription(layout: IKeyboardLayoutInfo | null): { label: string, description: string } { +export function parseKeyboardLayoutDescription(layout: IKeyboardLayoutInfo | null): { label: string; description: string } { if (!layout) { return { label: '', description: '' }; } diff --git a/src/vs/platform/label/common/label.ts b/src/vs/platform/label/common/label.ts index 4b484c379d1..df4c1c91bc2 100644 --- a/src/vs/platform/label/common/label.ts +++ b/src/vs/platform/label/common/label.ts @@ -7,8 +7,7 @@ import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkspace } from 'vs/platform/workspace/common/workspace'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspace, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export const ILabelService = createDecorator('labelService'); @@ -22,7 +21,7 @@ export interface ILabelService { * If `noPrefix` is passed does not tildify the label and also does not prepand the root name for relative labels in a multi root scenario. * If `separator` is passed, will use that over the defined path separator of the formatter. */ - getUriLabel(resource: URI, options?: { relative?: boolean, noPrefix?: boolean, endWithSeparator?: boolean, separator?: '/' | '\\' }): string; + getUriLabel(resource: URI, options?: { relative?: boolean; noPrefix?: boolean; endWithSeparator?: boolean; separator?: '/' | '\\' }): string; getUriBasenameLabel(resource: URI): string; getWorkspaceLabel(workspace: (IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace), options?: { verbose: boolean }): string; getHostLabel(scheme: string, authority?: string): string; diff --git a/src/vs/platform/launch/electron-main/launchMainService.ts b/src/vs/platform/launch/electron-main/launchMainService.ts index 55fd15b3099..90ebc6fa740 100644 --- a/src/vs/platform/launch/electron-main/launchMainService.ts +++ b/src/vs/platform/launch/electron-main/launchMainService.ts @@ -3,15 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, BrowserWindow, Event as IpcEvent, ipcMain } from 'electron'; +import { app, BrowserWindow } from 'electron'; import { coalesce } from 'vs/base/common/arrays'; -import { CancellationToken } from 'vs/base/common/cancellation'; import { IProcessEnvironment, isMacintosh } from 'vs/base/common/platform'; import { assertIsDefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { whenDeleted } from 'vs/base/node/pfs'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IDiagnosticInfo, IDiagnosticInfoOptions, IRemoteDiagnosticError, IRemoteDiagnosticInfo } from 'vs/platform/diagnostics/common/diagnostics'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; import { isLaunchedFromCli } from 'vs/platform/environment/node/argvHelper'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -20,7 +18,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IURLService } from 'vs/platform/url/common/url'; import { IWindowSettings } from 'vs/platform/windows/common/windows'; import { ICodeWindow, IOpenConfiguration, IWindowsMainService, OpenContext } from 'vs/platform/windows/electron-main/windows'; -import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { IWorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; export const ID = 'launchMainService'; @@ -31,17 +29,11 @@ export interface IStartArguments { userEnv: IProcessEnvironment; } -export interface IRemoteDiagnosticOptions { - includeProcesses?: boolean; - includeWorkspaceMetadata?: boolean; -} - export interface ILaunchMainService { readonly _serviceBrand: undefined; start(args: NativeParsedArgs, userEnv: IProcessEnvironment): Promise; getMainProcessId(): Promise; getMainProcessInfo(): Promise; - getRemoteDiagnostics(options: IRemoteDiagnosticOptions): Promise<(IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]>; } export class LaunchMainService implements ILaunchMainService { @@ -97,7 +89,7 @@ export class LaunchMainService implements ILaunchMainService { } } - private parseOpenUrl(args: NativeParsedArgs): { uri: URI, url: string }[] { + private parseOpenUrl(args: NativeParsedArgs): { uri: URI; url: string }[] { if (args['open-url'] && args._urls && args._urls.length > 0) { // --open-url must contain -- followed by the url(s) // process.argv is used over args._ as args._ are resolved to file paths at this point @@ -242,41 +234,6 @@ export class LaunchMainService implements ILaunchMainService { }; } - async getRemoteDiagnostics(options: IRemoteDiagnosticOptions): Promise<(IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]> { - const windows = this.windowsMainService.getWindows(); - const diagnostics: Array = await Promise.all(windows.map(window => { - return new Promise((resolve) => { - const remoteAuthority = window.remoteAuthority; - if (remoteAuthority) { - const replyChannel = `vscode:getDiagnosticInfoResponse${window.id}`; - const args: IDiagnosticInfoOptions = { - includeProcesses: options.includeProcesses, - folders: options.includeWorkspaceMetadata ? this.getFolderURIs(window) : undefined - }; - - window.sendWhenReady('vscode:getDiagnosticInfo', CancellationToken.None, { replyChannel, args }); - - ipcMain.once(replyChannel, (_: IpcEvent, data: IRemoteDiagnosticInfo) => { - // No data is returned if getting the connection fails. - if (!data) { - resolve({ hostName: remoteAuthority, errorMessage: `Unable to resolve connection to '${remoteAuthority}'.` }); - } - - resolve(data); - }); - - setTimeout(() => { - resolve({ hostName: remoteAuthority, errorMessage: `Connection to '${remoteAuthority}' could not be established` }); - }, 5000); - } else { - resolve(undefined); - } - }); - })); - - return diagnostics.filter((x): x is IRemoteDiagnosticInfo | IRemoteDiagnosticError => !!x); - } - private getFolderURIs(window: ICodeWindow): URI[] { const folderURIs: URI[] = []; diff --git a/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts b/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts index fc9c0fe9e9a..b4a7fdb0f88 100644 --- a/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts +++ b/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts @@ -16,7 +16,7 @@ import { handleVetos } from 'vs/platform/lifecycle/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; import { IStateMainService } from 'vs/platform/state/electron-main/state'; import { ICodeWindow, LoadReason, UnloadReason } from 'vs/platform/windows/electron-main/windows'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export const ILifecycleMainService = createDecorator('lifecycleMainService'); @@ -109,7 +109,7 @@ export interface ILifecycleMainService { /** * Restart the application with optional arguments (CLI). All lifecycle event handlers are triggered. */ - relaunch(options?: { addArgs?: string[], removeArgs?: string[] }): Promise; + relaunch(options?: { addArgs?: string[]; removeArgs?: string[] }): Promise; /** * Shutdown the application normally. All lifecycle event handlers are triggered. @@ -548,7 +548,7 @@ export class LifecycleMainService extends Disposable implements ILifecycleMainSe return this.pendingQuitPromise; } - async relaunch(options?: { addArgs?: string[], removeArgs?: string[] }): Promise { + async relaunch(options?: { addArgs?: string[]; removeArgs?: string[] }): Promise { this.logService.trace('Lifecycle#relaunch()'); const args = process.argv.slice(1); diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 4482fc5f083..8a0aceeab5a 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -661,8 +661,8 @@ abstract class ResourceNavigator extends Disposable { super(); this._register(Event.filter(this.widget.onDidChangeSelection, e => e.browserEvent instanceof KeyboardEvent)(e => this.onSelectionFromKeyboard(e))); - this._register(this.widget.onPointer((e: { browserEvent: MouseEvent, element: T | undefined }) => this.onPointer(e.element, e.browserEvent))); - this._register(this.widget.onMouseDblClick((e: { browserEvent: MouseEvent, element: T | undefined }) => this.onMouseDblClick(e.element, e.browserEvent))); + this._register(this.widget.onPointer((e: { browserEvent: MouseEvent; element: T | undefined }) => this.onPointer(e.element, e.browserEvent))); + this._register(this.widget.onMouseDblClick((e: { browserEvent: MouseEvent; element: T | undefined }) => this.onMouseDblClick(e.element, e.browserEvent))); if (typeof options?.openOnSingleClick !== 'boolean' && options?.configurationService) { this.openOnSingleClick = options?.configurationService!.getValue(openModeSettingKey) !== 'doubleClick'; @@ -1051,7 +1051,7 @@ function workbenchTreeDataPreamble boolean | undefined, disposable: IDisposable } { +): { options: TOptions; getAutomaticKeyboardNavigation: () => boolean | undefined; disposable: IDisposable } { const getAutomaticKeyboardNavigation = () => { // give priority to the context key value to disable this completely let automaticKeyboardNavigation = Boolean(contextKeyService.getContextKeyValue(WorkbenchListAutomaticKeyboardNavigationKey)); @@ -1309,7 +1309,7 @@ configurationRegistry.registerConfiguration({ [treeIndentKey]: { type: 'number', default: 8, - minimum: 0, + minimum: 4, maximum: 40, description: localize('tree indent setting', "Controls tree indentation in pixels.") }, diff --git a/src/vs/platform/localizations/common/localizations.ts b/src/vs/platform/localizations/common/localizations.ts index 65e2dd9d4c4..6792440125c 100644 --- a/src/vs/platform/localizations/common/localizations.ts +++ b/src/vs/platform/localizations/common/localizations.ts @@ -3,28 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { ILocalizationContribution } from 'vs/platform/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -export interface ILocalization { - languageId: string; - languageName?: string; - localizedLanguageName?: string; - translations: ITranslation[]; - minimalTranslations?: { [key: string]: string }; -} - -export interface ITranslation { - id: string; - path: string; -} - export const ILocalizationsService = createDecorator('localizationsService'); export interface ILocalizationsService { readonly _serviceBrand: undefined; getLanguageIds(): Promise; } -export function isValidLocalization(localization: ILocalization): boolean { +export function isValidLocalization(localization: ILocalizationContribution): boolean { if (typeof localization.languageId !== 'string') { return false; } diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index 88cc084a202..d933ab2b8ce 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -286,37 +286,37 @@ export class ConsoleLogger extends AbstractLogger implements ILogger { trace(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Trace) { - console.log('%cTRACE', 'color: #888', message, ...args); + console.log(`%cTRACE %c${message}`, 'color: #888', 'color: #000', ...args); } } debug(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Debug) { - console.log('%cDEBUG', 'background: #eee; color: #888', message, ...args); + console.log(`%cDEBUG %c${message}`, 'background: #eee; color: #888', 'color: #000', ...args); } } info(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Info) { - console.log('%c INFO', 'color: #33f', message, ...args); + console.log(`%c INFO %c${message}`, 'color: #33f', 'color: #000', ...args); } } warn(message: string | Error, ...args: any[]): void { if (this.getLevel() <= LogLevel.Warning) { - console.log('%c WARN', 'color: #993', message, ...args); + console.log(`%c WARN %c${message}`, 'color: #993', 'color: #000', ...args); } } error(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Error) { - console.log('%c ERR', 'color: #f33', message, ...args); + console.log(`%c ERR %c${message}`, 'color: #f33', 'color: #000', ...args); } } critical(message: string, ...args: any[]): void { if (this.getLevel() <= LogLevel.Critical) { - console.log('%cCRITI', 'background: #f33; color: white', message, ...args); + console.log(`%cCRITI %c${message}`, 'background: #f33; color: white', 'color: #000', ...args); } } diff --git a/src/vs/platform/markers/common/markerService.ts b/src/vs/platform/markers/common/markerService.ts index 12b87603878..67959b38db0 100644 --- a/src/vs/platform/markers/common/markerService.ts +++ b/src/vs/platform/markers/common/markerService.ts @@ -270,7 +270,7 @@ export class MarkerService implements IMarkerService { } } - read(filter: { owner?: string; resource?: URI; severities?: number, take?: number; } = Object.create(null)): IMarker[] { + read(filter: { owner?: string; resource?: URI; severities?: number; take?: number } = Object.create(null)): IMarker[] { let { owner, resource, severities, take } = filter; diff --git a/src/vs/platform/markers/common/markers.ts b/src/vs/platform/markers/common/markers.ts index 68841243fca..a4accd2d834 100644 --- a/src/vs/platform/markers/common/markers.ts +++ b/src/vs/platform/markers/common/markers.ts @@ -20,7 +20,7 @@ export interface IMarkerService { remove(owner: string, resources: URI[]): void; - read(filter?: { owner?: string; resource?: URI; severities?: number, take?: number; }): IMarker[]; + read(filter?: { owner?: string; resource?: URI; severities?: number; take?: number }): IMarker[]; readonly onMarkerChanged: Event; } @@ -55,7 +55,7 @@ export namespace MarkerSeverity { return b - a; } - const _displayStrings: { [value: number]: string; } = Object.create(null); + const _displayStrings: { [value: number]: string } = Object.create(null); _displayStrings[MarkerSeverity.Error] = localize('sev.error', "Error"); _displayStrings[MarkerSeverity.Warning] = localize('sev.warning', "Warning"); _displayStrings[MarkerSeverity.Info] = localize('sev.info', "Info"); diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index 2c97abb700a..977325f1185 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -33,8 +33,8 @@ interface IMenuItemClickHandler { } type IMenuItemInvocation = ( - { type: 'commandId'; commandId: string; } - | { type: 'keybinding'; userSettingsLabel: string; } + { type: 'commandId'; commandId: string } + | { type: 'keybinding'; userSettingsLabel: string } ); interface IMenuItemWithKeybinding { diff --git a/src/vs/platform/native/common/native.ts b/src/vs/platform/native/common/native.ts index a92cbd3d336..9a825948984 100644 --- a/src/vs/platform/native/common/native.ts +++ b/src/vs/platform/native/common/native.ts @@ -8,7 +8,8 @@ import { URI } from 'vs/base/common/uri'; import { MessageBoxOptions, MessageBoxReturnValue, MouseInputEvent, OpenDevToolsOptions, OpenDialogOptions, OpenDialogReturnValue, SaveDialogOptions, SaveDialogReturnValue } from 'vs/base/parts/sandbox/common/electronTypes'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; -import { IColorScheme, IOpenedWindow, IOpenEmptyWindowOptions, IOpenWindowOptions, IPartsSplash, IWindowOpenable } from 'vs/platform/windows/common/windows'; +import { IPartsSplash } from 'vs/platform/theme/common/themeService'; +import { IColorScheme, IOpenedWindow, IOpenEmptyWindowOptions, IOpenWindowOptions, IWindowOpenable } from 'vs/platform/windows/common/windows'; export interface ICPUProperties { model: string; @@ -51,7 +52,7 @@ export interface ICommonNativeHostService { readonly onDidChangeColorScheme: Event; - readonly onDidChangePassword: Event<{ service: string, account: string }>; + readonly onDidChangePassword: Event<{ service: string; account: string }>; // Window getWindows(): Promise; @@ -82,7 +83,7 @@ export interface ICommonNativeHostService { * should only be used if it is necessary to steal focus from the current * focused application which may not be VSCode. */ - focusWindow(options?: { windowId?: number, force?: boolean }): Promise; + focusWindow(options?: { windowId?: number; force?: boolean }): Promise; // Dialogs showMessageBox(options: MessageBoxOptions): Promise; @@ -136,8 +137,8 @@ export interface ICommonNativeHostService { uninstallShellCommand(): Promise; // Lifecycle - notifyReady(): Promise - relaunch(options?: { addArgs?: string[], removeArgs?: string[] }): Promise; + notifyReady(): Promise; + relaunch(options?: { addArgs?: string[]; removeArgs?: string[] }): Promise; reload(options?: { disableExtensions?: boolean }): Promise; closeWindow(): Promise; closeWindowById(windowId: number): Promise; diff --git a/src/vs/platform/native/electron-main/nativeHostMainService.ts b/src/vs/platform/native/electron-main/nativeHostMainService.ts index bbf4ce0abbb..9068051b882 100644 --- a/src/vs/platform/native/electron-main/nativeHostMainService.ts +++ b/src/vs/platform/native/electron-main/nativeHostMainService.ts @@ -32,10 +32,11 @@ import { ICommonNativeHostService, IOSProperties, IOSStatistics } from 'vs/platf import { IProductService } from 'vs/platform/product/common/productService'; import { ISharedProcess } from 'vs/platform/sharedProcess/node/sharedProcess'; import { ITelemetryData, ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IPartsSplash } from 'vs/platform/theme/common/themeService'; import { IThemeMainService } from 'vs/platform/theme/electron-main/themeMainService'; -import { IColorScheme, IOpenedWindow, IOpenEmptyWindowOptions, IOpenWindowOptions, IPartsSplash, IWindowOpenable } from 'vs/platform/windows/common/windows'; +import { IColorScheme, IOpenedWindow, IOpenEmptyWindowOptions, IOpenWindowOptions, IWindowOpenable } from 'vs/platform/windows/common/windows'; import { ICodeWindow, IWindowsMainService, OpenContext } from 'vs/platform/windows/electron-main/windows'; -import { isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { isWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { IWorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; export interface INativeHostMainService extends AddFirstParameterToFunctions /* only methods, not events */, number | undefined /* window ID */> { } @@ -97,7 +98,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain private readonly _onDidChangeColorScheme = this._register(new Emitter()); readonly onDidChangeColorScheme = this._onDidChangeColorScheme.event; - private readonly _onDidChangePassword = this._register(new Emitter<{ account: string, service: string }>()); + private readonly _onDidChangePassword = this._register(new Emitter<{ account: string; service: string }>()); readonly onDidChangePassword = this._onDidChangePassword.event; readonly onDidChangeDisplay = Event.debounce(Event.any( @@ -222,7 +223,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain } } - async focusWindow(windowId: number | undefined, options?: { windowId?: number; force?: boolean; }): Promise { + async focusWindow(windowId: number | undefined, options?: { windowId?: number; force?: boolean }): Promise { if (options && typeof options.windowId === 'number') { windowId = options.windowId; } @@ -350,7 +351,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain } } - private async getShellCommandLink(): Promise<{ readonly source: string, readonly target: string }> { + private async getShellCommandLink(): Promise<{ readonly source: string; readonly target: string }> { const target = resolve(this.environmentMainService.appRoot, 'bin', 'code'); const source = `/usr/local/bin/${this.productService.applicationName}`; @@ -697,7 +698,7 @@ export class NativeHostMainService extends Disposable implements INativeHostMain } } - async relaunch(windowId: number | undefined, options?: { addArgs?: string[], removeArgs?: string[] }): Promise { + async relaunch(windowId: number | undefined, options?: { addArgs?: string[]; removeArgs?: string[] }): Promise { return this.lifecycleMainService.relaunch(options); } diff --git a/src/vs/platform/notification/common/notification.ts b/src/vs/platform/notification/common/notification.ts index c53b0e30556..99e8716173c 100644 --- a/src/vs/platform/notification/common/notification.ts +++ b/src/vs/platform/notification/common/notification.ts @@ -93,7 +93,7 @@ export interface INotification extends INotificationProperties { /** * The source of the notification appears as additional information. */ - readonly source?: string | { label: string; id: string; }; + readonly source?: string | { label: string; id: string }; /** * Actions to show as part of the notification. Primary actions show up as @@ -357,7 +357,7 @@ export interface INotificationService { * * @param severity the severity of the notification. Either `Info`, `Warning` or `Error`. * @param message the message to show as status. - * @param choices options to be choosen from. + * @param choices options to be chosen from. * @param options provides some optional configuration options. * * @returns a handle on the notification to e.g. hide it or update message, buttons, etc. diff --git a/src/vs/platform/opener/common/opener.ts b/src/vs/platform/opener/common/opener.ts index ea79903e8a9..81605121202 100644 --- a/src/vs/platform/opener/common/opener.ts +++ b/src/vs/platform/opener/common/opener.ts @@ -7,7 +7,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { equalsIgnoreCase, startsWithIgnoreCase } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; -import { IEditorOptions } from 'vs/platform/editor/common/editor'; +import { IEditorOptions, ITextEditorSelection } from 'vs/platform/editor/common/editor'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export const IOpenerService = createDecorator('openerService'); @@ -56,7 +56,7 @@ export interface IOpener { } export interface IExternalOpener { - openExternal(href: string, ctx: { sourceUri: URI, preferredOpenerId?: string }, token: CancellationToken): Promise; + openExternal(href: string, ctx: { sourceUri: URI; preferredOpenerId?: string }, token: CancellationToken): Promise; dispose?(): void; } @@ -65,7 +65,7 @@ export interface IValidator { } export interface IExternalUriResolver { - resolveExternalUri(resource: URI, options?: OpenOptions): Promise<{ resolved: URI, dispose(): void } | undefined>; + resolveExternalUri(resource: URI, options?: OpenOptions): Promise<{ resolved: URI; dispose(): void } | undefined>; } export interface IOpenerService { @@ -136,3 +136,31 @@ export function matchesScheme(target: URI | string, scheme: string): boolean { export function matchesSomeScheme(target: URI | string, ...schemes: string[]): boolean { return schemes.some(scheme => matchesScheme(target, scheme)); } + +export function withSelectionFragment(uri: URI, selection: ITextEditorSelection): URI { + return uri.with({ fragment: `${selection.startLineNumber},${selection.startColumn}${selection.endLineNumber ? `-${selection.endLineNumber}${selection.endColumn ? `,${selection.endColumn}` : ''}` : ''}` }); +} + +/** + * file:///some/file.js#73 + * file:///some/file.js#L73 + * file:///some/file.js#73,84 + * file:///some/file.js#L73,84 + * file:///some/file.js#73-83 + * file:///some/file.js#L73-L83 + * file:///some/file.js#73,84-83,52 + * file:///some/file.js#L73,84-L83,52 + */ +export function selectionFragment(target: URI): ITextEditorSelection | undefined { + let selection: ITextEditorSelection | undefined = undefined; + const match = /^L?(\d+)(?:,(\d+))?(-L?(\d+)(?:,(\d+))?)?/.exec(target.fragment); + if (match) { + selection = { + startLineNumber: parseInt(match[1]), + startColumn: match[2] ? parseInt(match[2]) : 1, + endLineNumber: match[4] ? parseInt(match[4]) : undefined, + endColumn: match[4] ? (match[5] ? parseInt(match[5]) : 1) : undefined + }; + } + return selection; +} diff --git a/src/vs/platform/opener/test/common/opener.test.ts b/src/vs/platform/opener/test/common/opener.test.ts new file mode 100644 index 00000000000..25e77978614 --- /dev/null +++ b/src/vs/platform/opener/test/common/opener.test.ts @@ -0,0 +1,74 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { URI } from 'vs/base/common/uri'; +import { selectionFragment, withSelectionFragment } from 'vs/platform/opener/common/opener'; + +suite('selectionFragment', () => { + + test('get selectionFragment with only startLineNumber', async () => { + const uri = URI.parse('file:///some/file.js#73'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 1, endLineNumber: undefined, endColumn: undefined }); + }); + + test('get selectionFragment with only startLineNumber in L format', async () => { + const uri = URI.parse('file:///some/file.js#L73'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 1, endLineNumber: undefined, endColumn: undefined }); + }); + + test('get selectionFragment with startLineNumber and startColumn', async () => { + const uri = URI.parse('file:///some/file.js#73,84'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 84, endLineNumber: undefined, endColumn: undefined }); + }); + + test('get selectionFragment with startLineNumber and startColumn in L format', async () => { + const uri = URI.parse('file:///some/file.js#L73,84'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 84, endLineNumber: undefined, endColumn: undefined }); + }); + + test('get selectionFragment with range and no column number', async () => { + const uri = URI.parse('file:///some/file.js#73-83'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 1, endLineNumber: 83, endColumn: 1 }); + }); + + test('get selectionFragment with range and no column number in L format', async () => { + const uri = URI.parse('file:///some/file.js#L73-L83'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 1, endLineNumber: 83, endColumn: 1 }); + }); + + test('get selectionFragment with range and no column number in L format only for start', async () => { + const uri = URI.parse('file:///some/file.js#L73-83'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 1, endLineNumber: 83, endColumn: 1 }); + }); + + test('get selectionFragment with range and no column number in L format only for end', async () => { + const uri = URI.parse('file:///some/file.js#73-L83'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 1, endLineNumber: 83, endColumn: 1 }); + }); + + test('get selectionFragment with complete range', async () => { + const uri = URI.parse('file:///some/file.js#73,84-83,52'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 84, endLineNumber: 83, endColumn: 52 }); + }); + + test('get selectionFragment with complete range in L format', async () => { + const uri = URI.parse('file:///some/file.js#L73,84-L83,52'); + assert.deepStrictEqual(selectionFragment(uri), { startLineNumber: 73, startColumn: 84, endLineNumber: 83, endColumn: 52 }); + }); + + test('withSelectionFragment with startLineNumber and startColumn', async () => { + assert.deepStrictEqual(withSelectionFragment(URI.parse('file:///some/file.js'), { startLineNumber: 73, startColumn: 84 }).toString(), 'file:///some/file.js#73%2C84'); + }); + + test('withSelectionFragment with startLineNumber, startColumn and endLineNumber', async () => { + assert.deepStrictEqual(withSelectionFragment(URI.parse('file:///some/file.js'), { startLineNumber: 73, startColumn: 84, endLineNumber: 83 }).toString(), 'file:///some/file.js#73%2C84-83'); + }); + + test('withSelectionFragment with startLineNumber, startColumn and endLineNumber, endColumn', async () => { + assert.deepStrictEqual(withSelectionFragment(URI.parse('file:///some/file.js'), { startLineNumber: 73, startColumn: 84, endLineNumber: 83, endColumn: 52 }).toString(), 'file:///some/file.js#73%2C84-83%2C52'); + }); + +}); diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index a88e316edb7..e22b33e6dcb 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -32,14 +32,15 @@ else if (typeof require?.__$__nodeRequire === 'function') { const rootPath = dirname(FileAccess.asFileUri('', require)); product = require.__$__nodeRequire(joinPath(rootPath, 'product.json').fsPath); - const pkg = require.__$__nodeRequire(joinPath(rootPath, 'package.json').fsPath) as { version: string; }; + const pkg = require.__$__nodeRequire(joinPath(rootPath, 'package.json').fsPath) as { version: string }; // Running out of sources if (env['VSCODE_DEV']) { Object.assign(product, { nameShort: `${product.nameShort} Dev`, nameLong: `${product.nameLong} Dev`, - dataFolderName: `${product.dataFolderName}-dev` + dataFolderName: `${product.dataFolderName}-dev`, + serverDataFolderName: product.serverDataFolderName ? `${product.serverDataFolderName}-dev` : undefined }); } @@ -57,7 +58,7 @@ else { // Running out of sources if (Object.keys(product).length === 0) { Object.assign(product, { - version: '1.64.0-dev', + version: '1.65.0-dev', nameShort: 'Code - OSS Dev', nameLong: 'Code - OSS Dev', applicationName: 'code-oss', diff --git a/src/vs/platform/product/common/productService.ts b/src/vs/platform/product/common/productService.ts index c819c5caa1d..4e8561e3b2e 100644 --- a/src/vs/platform/product/common/productService.ts +++ b/src/vs/platform/product/common/productService.ts @@ -14,5 +14,4 @@ export interface IProductService extends Readonly { } - export const productSchemaId = 'vscode://schemas/vscode-product'; diff --git a/src/vs/platform/profiling/common/profiling.ts b/src/vs/platform/profiling/common/profiling.ts index 99f99522f35..7c3e9bf142c 100644 --- a/src/vs/platform/profiling/common/profiling.ts +++ b/src/vs/platform/profiling/common/profiling.ts @@ -37,9 +37,9 @@ export interface IV8InspectProfilingService { _serviceBrand: undefined; - startProfiling(options: { port: number }): Promise + startProfiling(options: { port: number }): Promise; - stopProfiling(sessionId: string): Promise + stopProfiling(sessionId: string): Promise; } diff --git a/src/vs/platform/profiling/node/profilingService.ts b/src/vs/platform/profiling/node/profilingService.ts index ab207607d0a..6187edd76c3 100644 --- a/src/vs/platform/profiling/node/profilingService.ts +++ b/src/vs/platform/profiling/node/profilingService.ts @@ -13,7 +13,7 @@ export class InspectProfilingService implements IV8InspectProfilingService { private readonly _sessions = new Map(); - async startProfiling(options: { port: number; }): Promise { + async startProfiling(options: { port: number }): Promise { const prof = await import('v8-inspect-profiler'); const session = await prof.startProfiling({ port: options.port, checkForPaused: true }); const id = generateUuid(); diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index 5334563dfa0..17b66a65362 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -52,7 +52,7 @@ export const enum ProgressLocation { export interface IProgressOptions { readonly location: ProgressLocation | string; readonly title?: string; - readonly source?: string | { label: string; id: string; }; + readonly source?: string | { label: string; id: string }; readonly total?: number; readonly cancellable?: boolean; readonly buttons?: string[]; diff --git a/src/vs/platform/protocol/electron-main/protocol.ts b/src/vs/platform/protocol/electron-main/protocol.ts index 85a213cfa07..eaf83cbdfff 100644 --- a/src/vs/platform/protocol/electron-main/protocol.ts +++ b/src/vs/platform/protocol/electron-main/protocol.ts @@ -38,10 +38,10 @@ export interface IProtocolMainService { createIPCObjectUrl(): IIPCObjectUrl; /** - * Adds a `URI` as root to the list of allowed + * Adds a path as root to the list of allowed * resources for file access. * - * @param root the URI to allow for file access + * @param root the path to allow for file access */ - addValidFileRoot(root: URI): IDisposable; + addValidFileRoot(root: string): IDisposable; } diff --git a/src/vs/platform/protocol/electron-main/protocolMainService.ts b/src/vs/platform/protocol/electron-main/protocolMainService.ts index bde08d81abd..05e18924db4 100644 --- a/src/vs/platform/protocol/electron-main/protocolMainService.ts +++ b/src/vs/platform/protocol/electron-main/protocolMainService.ts @@ -7,8 +7,8 @@ import { ipcMain, session } from 'electron'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { TernarySearchTree } from 'vs/base/common/map'; import { FileAccess, Schemas } from 'vs/base/common/network'; +import { extname, normalize } from 'vs/base/common/path'; import { isLinux } from 'vs/base/common/platform'; -import { extname } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -21,7 +21,7 @@ export class ProtocolMainService extends Disposable implements IProtocolMainServ declare readonly _serviceBrand: undefined; - private readonly validRoots = TernarySearchTree.forUris(() => !isLinux); + private readonly validRoots = TernarySearchTree.forPaths(!isLinux); private readonly validExtensions = new Set(['.svg', '.png', '.jpg', '.jpeg', '.gif', '.bmp']); // https://github.com/microsoft/vscode/issues/119384 constructor( @@ -34,10 +34,10 @@ export class ProtocolMainService extends Disposable implements IProtocolMainServ // - appRoot : all files installed as part of the app // - extensions : all files shipped from extensions // - storage : all files in global and workspace storage (https://github.com/microsoft/vscode/issues/116735) - this.addValidFileRoot(URI.file(environmentService.appRoot)); - this.addValidFileRoot(URI.file(environmentService.extensionsPath)); - this.addValidFileRoot(environmentService.globalStorageHome); - this.addValidFileRoot(environmentService.workspaceStorageHome); + this.addValidFileRoot(environmentService.appRoot); + this.addValidFileRoot(environmentService.extensionsPath); + this.addValidFileRoot(environmentService.globalStorageHome.fsPath); + this.addValidFileRoot(environmentService.workspaceStorageHome.fsPath); // Handle protocols this.handleProtocols(); @@ -59,11 +59,16 @@ export class ProtocolMainService extends Disposable implements IProtocolMainServ })); } - addValidFileRoot(root: URI): IDisposable { - if (!this.validRoots.get(root)) { - this.validRoots.set(root, true); + addValidFileRoot(root: string): IDisposable { - return toDisposable(() => this.validRoots.delete(root)); + // Pass to `normalize` because we later also do the + // same for all paths to check against. + const normalizedRoot = normalize(root); + + if (!this.validRoots.get(normalizedRoot)) { + this.validRoots.set(normalizedRoot, true); + + return toDisposable(() => this.validRoots.delete(normalizedRoot)); } return Disposable.None; @@ -84,33 +89,39 @@ export class ProtocolMainService extends Disposable implements IProtocolMainServ //#region vscode-file:// private handleResourceRequest(request: Electron.ProtocolRequest, callback: ProtocolCallback): void { - const uri = URI.parse(request.url); - - // Restore the `vscode-file` URI to a `file` URI so that we can - // ensure the root is valid and properly tell Chrome where the - // resource is at. - const fileUri = FileAccess.asFileUri(uri); + const path = this.requestToNormalizedFilePath(request); // first check by validRoots - if (this.validRoots.findSubstr(fileUri)) { - return callback({ - path: fileUri.fsPath - }); + if (this.validRoots.findSubstr(path)) { + return callback({ path }); } // then check by validExtensions - if (this.validExtensions.has(extname(fileUri))) { - return callback({ - path: fileUri.fsPath - }); + if (this.validExtensions.has(extname(path))) { + return callback({ path }); } // finally block to load the resource - this.logService.error(`${Schemas.vscodeFileResource}: Refused to load resource ${fileUri.fsPath} from ${Schemas.vscodeFileResource}: protocol (original URL: ${request.url})`); + this.logService.error(`${Schemas.vscodeFileResource}: Refused to load resource ${path} from ${Schemas.vscodeFileResource}: protocol (original URL: ${request.url})`); return callback({ error: -3 /* ABORTED */ }); } + private requestToNormalizedFilePath(request: Electron.ProtocolRequest): string { + + // 1.) Use `URI.parse()` util from us to convert the raw + // URL into our URI. + const requestUri = URI.parse(request.url); + + // 2.) Use `FileAccess.asFileUri` to convert back from a + // `vscode-file:` URI to a `file:` URI. + const unnormalizedFileUri = FileAccess.asFileUri(requestUri); + + // 3.) Strip anything from the URI that could result in + // relative paths (such as "..") by using `normalize` + return normalize(unnormalizedFileUri.fsPath); + } + //#endregion //#region IPC Object URLs diff --git a/src/vs/platform/quickinput/browser/commandsQuickAccess.ts b/src/vs/platform/quickinput/browser/commandsQuickAccess.ts index 7a10abeb9f3..da1810c841c 100644 --- a/src/vs/platform/quickinput/browser/commandsQuickAccess.ts +++ b/src/vs/platform/quickinput/browser/commandsQuickAccess.ts @@ -181,7 +181,7 @@ export abstract class AbstractCommandsQuickAccessProvider extends PickerQuickAcc interface ISerializedCommandHistory { usesLRU?: boolean; - entries: { key: string; value: number; }[]; + entries: { key: string; value: number }[]; } interface ICommandsQuickAccessConfiguration { @@ -244,7 +244,7 @@ export class CommandsHistory extends Disposable { const cache = CommandsHistory.cache = new LRUCache(this.configuredCommandsHistoryLength, 1); if (serializedCache) { - let entries: { key: string; value: number; }[]; + let entries: { key: string; value: number }[]; if (serializedCache.usesLRU) { entries = serializedCache.entries; } else { diff --git a/src/vs/platform/quickinput/browser/helpQuickAccess.ts b/src/vs/platform/quickinput/browser/helpQuickAccess.ts index f113c7b743f..8b80289ac66 100644 --- a/src/vs/platform/quickinput/browser/helpQuickAccess.ts +++ b/src/vs/platform/quickinput/browser/helpQuickAccess.ts @@ -61,7 +61,7 @@ export class HelpQuickAccessProvider implements IQuickAccessProvider { return disposables; } - private getQuickAccessProviders(): { editorProviders: IHelpQuickAccessPickItem[], globalProviders: IHelpQuickAccessPickItem[] } { + private getQuickAccessProviders(): { editorProviders: IHelpQuickAccessPickItem[]; globalProviders: IHelpQuickAccessPickItem[] } { const globalProviders: IHelpQuickAccessPickItem[] = []; const editorProviders: IHelpQuickAccessPickItem[] = []; diff --git a/src/vs/platform/quickinput/browser/pickerQuickAccess.ts b/src/vs/platform/quickinput/browser/pickerQuickAccess.ts index ddbed66b0bb..bba15d63cfc 100644 --- a/src/vs/platform/quickinput/browser/pickerQuickAccess.ts +++ b/src/vs/platform/quickinput/browser/pickerQuickAccess.ts @@ -73,9 +73,9 @@ export interface IPickerQuickAccessProviderOptions = T | IQuickPickSeparator; -export type PicksWithActive = { items: readonly Pick[], active?: T }; +export type PicksWithActive = { items: readonly Pick[]; active?: T }; export type Picks = readonly Pick[] | PicksWithActive; -export type FastAndSlowPicks = { picks: Picks, additionalPicks: Promise> }; +export type FastAndSlowPicks = { picks: Picks; additionalPicks: Promise> }; function isPicksWithActive(obj: unknown): obj is PicksWithActive { const candidate = obj as PicksWithActive; diff --git a/src/vs/platform/quickinput/browser/quickAccess.ts b/src/vs/platform/quickinput/browser/quickAccess.ts index cf29d5ae602..b2ed573cc72 100644 --- a/src/vs/platform/quickinput/browser/quickAccess.ts +++ b/src/vs/platform/quickinput/browser/quickAccess.ts @@ -20,9 +20,9 @@ export class QuickAccessController extends Disposable implements IQuickAccessCon private readonly lastAcceptedPickerValues = new Map(); private visibleQuickAccess: { - picker: IQuickPick, - descriptor: IQuickAccessProviderDescriptor | undefined, - value: string + picker: IQuickPick; + descriptor: IQuickAccessProviderDescriptor | undefined; + value: string; } | undefined = undefined; constructor( diff --git a/src/vs/platform/remote/common/remoteAgentConnection.ts b/src/vs/platform/remote/common/remoteAgentConnection.ts index ea36807a8ee..2f35bafb7dc 100644 --- a/src/vs/platform/remote/common/remoteAgentConnection.ts +++ b/src/vs/platform/remote/common/remoteAgentConnection.ts @@ -224,7 +224,7 @@ function raceWithTimeoutCancellation(promise: Promise, timeoutCancellation return result.promise; } -async function connectToRemoteExtensionHostAgent(options: ISimpleConnectionOptions, connectionType: ConnectionType, args: any | undefined, timeoutCancellationToken: CancellationToken): Promise<{ protocol: PersistentProtocol; ownsProtocol: boolean; }> { +async function connectToRemoteExtensionHostAgent(options: ISimpleConnectionOptions, connectionType: ConnectionType, args: any | undefined, timeoutCancellationToken: CancellationToken): Promise<{ protocol: PersistentProtocol; ownsProtocol: boolean }> { const logPrefix = connectLogPrefix(options, connectionType); options.logService.trace(`${logPrefix} 1/6. invoking socketFactory.connect().`); @@ -315,11 +315,11 @@ interface IManagementConnectionResult { protocol: PersistentProtocol; } -async function connectToRemoteExtensionHostAgentAndReadOneMessage(options: ISimpleConnectionOptions, connectionType: ConnectionType, args: any | undefined, timeoutCancellationToken: CancellationToken): Promise<{ protocol: PersistentProtocol; firstMessage: T; }> { +async function connectToRemoteExtensionHostAgentAndReadOneMessage(options: ISimpleConnectionOptions, connectionType: ConnectionType, args: any | undefined, timeoutCancellationToken: CancellationToken): Promise<{ protocol: PersistentProtocol; firstMessage: T }> { const startTime = Date.now(); const logPrefix = connectLogPrefix(options, connectionType); const { protocol, ownsProtocol } = await connectToRemoteExtensionHostAgent(options, connectionType, args, timeoutCancellationToken); - const result = new PromiseWithTimeout<{ protocol: PersistentProtocol; firstMessage: T; }>(timeoutCancellationToken); + const result = new PromiseWithTimeout<{ protocol: PersistentProtocol; firstMessage: T }>(timeoutCancellationToken); result.registerDisposable(protocol.onControlMessage(raw => { const msg: T = JSON.parse(raw.toString()); const error = getErrorFromMessage(msg); @@ -351,7 +351,7 @@ export interface IRemoteExtensionHostStartParams { debugId?: string; break?: boolean; port?: number | null; - env?: { [key: string]: string | null; }; + env?: { [key: string]: string | null }; } interface IExtensionHostConnectionResult { @@ -360,7 +360,7 @@ interface IExtensionHostConnectionResult { } async function doConnectRemoteAgentExtensionHost(options: ISimpleConnectionOptions, startArguments: IRemoteExtensionHostStartParams, timeoutCancellationToken: CancellationToken): Promise { - const { protocol, firstMessage } = await connectToRemoteExtensionHostAgentAndReadOneMessage<{ debugPort?: number; }>(options, ConnectionType.ExtensionHost, startArguments, timeoutCancellationToken); + const { protocol, firstMessage } = await connectToRemoteExtensionHostAgentAndReadOneMessage<{ debugPort?: number }>(options, ConnectionType.ExtensionHost, startArguments, timeoutCancellationToken); const debugPort = firstMessage && firstMessage.debugPort; return { protocol, debugPort }; } diff --git a/src/vs/platform/remote/common/remoteAuthorityResolver.ts b/src/vs/platform/remote/common/remoteAuthorityResolver.ts index 570c9072e3b..f394d3bbbec 100644 --- a/src/vs/platform/remote/common/remoteAuthorityResolver.ts +++ b/src/vs/platform/remote/common/remoteAuthorityResolver.ts @@ -6,7 +6,6 @@ import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { TunnelPrivacy } from 'vs/platform/remote/common/tunnel'; export const IRemoteAuthorityResolverService = createDecorator('remoteAuthorityResolverService'); @@ -20,22 +19,27 @@ export interface ResolvedAuthority { export interface ResolvedOptions { readonly extensionHostEnv?: { [key: string]: string | null }; readonly isTrusted?: boolean; - readonly authenticationSession?: { id: string, providerId: string }; + readonly authenticationSession?: { id: string; providerId: string }; } export interface TunnelDescription { - remoteAddress: { port: number, host: string }; - localAddress: { port: number, host: string } | string; + remoteAddress: { port: number; host: string }; + localAddress: { port: number; host: string } | string; privacy?: string; protocol?: string; } +export interface TunnelPrivacy { + themeIcon: string; + id: string; + label: string; +} export interface TunnelInformation { environmentTunnels?: TunnelDescription[]; features?: { elevation: boolean; public?: boolean; privacyOptions: TunnelPrivacy[]; - } + }; } export interface ResolverResult { diff --git a/src/vs/platform/remote/common/remoteHosts.ts b/src/vs/platform/remote/common/remoteHosts.ts index 36675b64b39..c24b5295b2c 100644 --- a/src/vs/platform/remote/common/remoteHosts.ts +++ b/src/vs/platform/remote/common/remoteHosts.ts @@ -5,7 +5,6 @@ import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import { IWorkspace } from 'vs/platform/workspace/common/workspace'; export function getRemoteAuthority(uri: URI): string | undefined { return uri.scheme === Schemas.vscodeRemote ? uri.authority : undefined; @@ -25,24 +24,3 @@ export function getRemoteName(authority: string | undefined): string | undefined } return authority.substr(0, pos); } - -export function isVirtualResource(resource: URI) { - return resource.scheme !== Schemas.file && resource.scheme !== Schemas.vscodeRemote; -} - -export function getVirtualWorkspaceLocation(workspace: IWorkspace): { scheme: string, authority: string } | undefined { - if (workspace.folders.length) { - return workspace.folders.every(f => isVirtualResource(f.uri)) ? workspace.folders[0].uri : undefined; - } else if (workspace.configuration && isVirtualResource(workspace.configuration)) { - return workspace.configuration; - } - return undefined; -} - -export function getVirtualWorkspaceScheme(workspace: IWorkspace): string | undefined { - return getVirtualWorkspaceLocation(workspace)?.scheme; -} - -export function isVirtualWorkspace(workspace: IWorkspace): boolean { - return getVirtualWorkspaceLocation(workspace) !== undefined; -} diff --git a/src/vs/platform/request/node/requestService.ts b/src/vs/platform/request/node/requestService.ts index 545b7cee58a..f9780c42410 100644 --- a/src/vs/platform/request/node/requestService.ts +++ b/src/vs/platform/request/node/requestService.ts @@ -16,7 +16,7 @@ import { isBoolean, isNumber } from 'vs/base/common/types'; import { IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { getResolvedShellEnv } from 'vs/platform/environment/node/shellEnv'; +import { getResolvedShellEnv } from 'vs/platform/terminal/node/shellEnv'; import { ILogService } from 'vs/platform/log/common/log'; import { IHTTPConfiguration, IRequestService } from 'vs/platform/request/common/request'; import { Agent, getProxyAgent } from 'vs/platform/request/node/proxy'; diff --git a/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorker.ts b/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorker.ts index 10f79216764..ccb67d7032f 100644 --- a/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorker.ts +++ b/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorker.ts @@ -29,11 +29,6 @@ export interface ISharedProcessWorkerEnvironment { * Full absolute path to our `bootstrap-fork.js` file. */ bootstrapPath: string; - - /** - * Extra environment to use for the process to fork. - */ - env: NodeJS.ProcessEnv; } interface IBaseMessage { diff --git a/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorkerMain.ts b/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorkerMain.ts index 219eca7dc3f..f0af8c6648e 100644 --- a/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorkerMain.ts +++ b/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorkerMain.ts @@ -124,7 +124,7 @@ class SharedProcessWorkerProcess extends Disposable { } spawn(): void { - Logger.trace(`Forking worker process (env: ${JSON.stringify(this.environment.env)})`); + Logger.trace('Forking worker process'); // Fork module via bootstrap-fork for AMD support this.child = fork( @@ -142,7 +142,7 @@ class SharedProcessWorkerProcess extends Disposable { // Handle termination that happens from the process // itself. This can either be a crash or the process // not being long running. - const onExit = Event.fromNodeEventEmitter<{ code: number | null, signal: NodeJS.Signals | null }>(this.child, 'exit', (code: number | null, signal: NodeJS.Signals | null) => ({ code, signal })); + const onExit = Event.fromNodeEventEmitter<{ code: number | null; signal: NodeJS.Signals | null }>(this.child, 'exit', (code: number | null, signal: NodeJS.Signals | null) => ({ code, signal })); this._register(onExit(({ code, signal }) => { const logMsg = `Worker process with pid ${this.child?.pid} terminated by itself with code ${code}, signal: ${signal} (type: ${this.configuration.process.type}, window: ${this.configuration.reply.windowId})`; if (code !== 0 && signal !== 'SIGTERM') { @@ -194,7 +194,6 @@ class SharedProcessWorkerProcess extends Disposable { private getEnv(): NodeJS.ProcessEnv { const env: NodeJS.ProcessEnv = { ...deepClone(process.env), - ...this.environment.env, VSCODE_AMD_ENTRYPOINT: this.configuration.process.moduleId, VSCODE_PIPE_LOGGING: 'true', VSCODE_VERBOSE_LOGGING: 'true', diff --git a/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorkerService.ts b/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorkerService.ts index 39d09c554ca..15eba30ae44 100644 --- a/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorkerService.ts +++ b/src/vs/platform/sharedProcess/electron-browser/sharedProcessWorkerService.ts @@ -3,20 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CrashReporterStartOptions, ipcRenderer } from 'electron'; -import { join } from 'path'; +import { ipcRenderer } from 'electron'; import { DeferredPromise } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { FileAccess } from 'vs/base/common/network'; -import { isLinux } from 'vs/base/common/platform'; -import { generateUuid, isUUID } from 'vs/base/common/uuid'; -import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; +import { generateUuid } from 'vs/base/common/uuid'; import { ILogService } from 'vs/platform/log/common/log'; -import { IProductService } from 'vs/platform/product/common/productService'; import { hash, IOnDidTerminateSharedProcessWorkerProcess, ISharedProcessWorkerConfiguration, ISharedProcessWorkerProcessExit, ISharedProcessWorkerService } from 'vs/platform/sharedProcess/common/sharedProcessWorkerService'; -import { SharedProcessWorkerMessages, ISharedProcessToWorkerMessage, IWorkerToSharedProcessMessage, ISharedProcessWorkerEnvironment } from 'vs/platform/sharedProcess/electron-browser/sharedProcessWorker'; +import { SharedProcessWorkerMessages, ISharedProcessToWorkerMessage, IWorkerToSharedProcessMessage } from 'vs/platform/sharedProcess/electron-browser/sharedProcessWorker'; export class SharedProcessWorkerService implements ISharedProcessWorkerService { @@ -28,9 +24,7 @@ export class SharedProcessWorkerService implements ISharedProcessWorkerService { private readonly processResolvers = new Map void>(); constructor( - @ILogService private readonly logService: ILogService, - @IProductService private readonly productService: IProductService, - @INativeEnvironmentService private readonly environmentService: INativeEnvironmentService + @ILogService private readonly logService: ILogService ) { } @@ -124,7 +118,7 @@ export class SharedProcessWorkerService implements ISharedProcessWorkerService { if (!webWorkerPromise) { this.logService.trace(`SharedProcess: creating new web worker (${configuration.process.moduleId})`); - const sharedProcessWorker = new SharedProcessWebWorker(configuration.process.type, this.logService, this.productService, this.environmentService); + const sharedProcessWorker = new SharedProcessWebWorker(configuration.process.type, this.logService); webWorkerPromise = sharedProcessWorker.init(); // Make sure to run through our normal `disposeWorker` call @@ -155,7 +149,7 @@ export class SharedProcessWorkerService implements ISharedProcessWorkerService { class SharedProcessWebWorker extends Disposable { - private readonly _onDidProcessSelfTerminate = this._register(new Emitter<{ configuration: ISharedProcessWorkerConfiguration, reason: ISharedProcessWorkerProcessExit }>()); + private readonly _onDidProcessSelfTerminate = this._register(new Emitter<{ configuration: ISharedProcessWorkerConfiguration; reason: ISharedProcessWorkerProcessExit }>()); readonly onDidProcessSelfTerminate = this._onDidProcessSelfTerminate.event; private readonly workerReady: Promise = this.doInit(); @@ -163,9 +157,7 @@ class SharedProcessWebWorker extends Disposable { constructor( private readonly type: string, - private readonly logService: ILogService, - private readonly productService: IProductService, - private readonly environmentService: INativeEnvironmentService + private readonly logService: ILogService ) { super(); } @@ -288,47 +280,14 @@ class SharedProcessWebWorker extends Disposable { const workerMessage: ISharedProcessToWorkerMessage = { id: SharedProcessWorkerMessages.Spawn, configuration, - environment: this.getSharedProcessWorkerEnvironment() + environment: { + bootstrapPath: FileAccess.asFileUri('bootstrap-fork', require).fsPath + } }; return this.send(workerMessage, token, port); } - private getSharedProcessWorkerEnvironment(): ISharedProcessWorkerEnvironment { - const sharedProcessWorkerEnvironment = { - bootstrapPath: FileAccess.asFileUri('bootstrap-fork', require).fsPath, - env: Object.create(null) - }; - - // Crash reporter support - // TODO@bpasero TODO@deepak1556 remove once we updated to Electron 15 - if (isLinux) { - const crashReporterStartOptions: CrashReporterStartOptions = { - companyName: this.productService.crashReporter?.companyName || 'Microsoft', - productName: this.productService.crashReporter?.productName || this.productService.nameShort, - submitURL: '', - uploadToServer: false - }; - - const crashReporterId = this.environmentService.args['crash-reporter-id']; // crashReporterId is set by the main process only when crash reporting is enabled by the user. - const appcenter = this.productService.appCenter; - const uploadCrashesToServer = !this.environmentService.args['crash-reporter-directory']; // only upload unless --crash-reporter-directory is provided - if (uploadCrashesToServer && appcenter && crashReporterId && isUUID(crashReporterId)) { - const submitURL = appcenter[`linux-x64`]; - crashReporterStartOptions.submitURL = submitURL.concat('&uid=', crashReporterId, '&iid=', crashReporterId, '&sid=', crashReporterId); - crashReporterStartOptions.uploadToServer = true; - } - // In the upload to server case, there is a bug in electron that creates client_id file in the current - // working directory. Setting the env BREAKPAD_DUMP_LOCATION will force electron to create the file in that location, - // For https://github.com/microsoft/vscode/issues/105743 - const extHostCrashDirectory = this.environmentService.args['crash-reporter-directory'] || this.environmentService.userDataPath; - sharedProcessWorkerEnvironment.env.BREAKPAD_DUMP_LOCATION = join(extHostCrashDirectory, this.type); - sharedProcessWorkerEnvironment.env.VSCODE_CRASH_REPORTER_START_OPTIONS = JSON.stringify(crashReporterStartOptions); - } - - return sharedProcessWorkerEnvironment; - } - terminate(configuration: ISharedProcessWorkerConfiguration, token: CancellationToken): Promise { const workerMessage: ISharedProcessToWorkerMessage = { id: SharedProcessWorkerMessages.Terminate, diff --git a/src/vs/platform/sharedProcess/electron-main/sharedProcess.ts b/src/vs/platform/sharedProcess/electron-main/sharedProcess.ts index 1f75cf92d18..fc7f4bf0b58 100644 --- a/src/vs/platform/sharedProcess/electron-main/sharedProcess.ts +++ b/src/vs/platform/sharedProcess/electron-main/sharedProcess.ts @@ -29,7 +29,7 @@ export class SharedProcess extends Disposable implements ISharedProcess { private window: BrowserWindow | undefined = undefined; private windowCloseListener: ((event: ElectronEvent) => void) | undefined = undefined; - private readonly _onDidError = this._register(new Emitter<{ type: WindowError, details?: { reason: string, exitCode: number } }>()); + private readonly _onDidError = this._register(new Emitter<{ type: WindowError; details?: { reason: string; exitCode: number } }>()); readonly onDidError = Event.buffer(this._onDidError.event); // buffer until we have a listener! constructor( diff --git a/src/vs/platform/state/electron-main/state.ts b/src/vs/platform/state/electron-main/state.ts index 8d498194eb6..d50e7888a41 100644 --- a/src/vs/platform/state/electron-main/state.ts +++ b/src/vs/platform/state/electron-main/state.ts @@ -15,7 +15,7 @@ export interface IStateMainService { getItem(key: string, defaultValue?: T): T | undefined; setItem(key: string, data?: object | string | number | boolean | undefined | null): void; - setItems(items: readonly { key: string, data?: object | string | number | boolean | undefined | null }[]): void; + setItems(items: readonly { key: string; data?: object | string | number | boolean | undefined | null }[]): void; removeItem(key: string): void; diff --git a/src/vs/platform/state/electron-main/stateMainService.ts b/src/vs/platform/state/electron-main/stateMainService.ts index 5fe2d26a2c6..3b3d0ea7557 100644 --- a/src/vs/platform/state/electron-main/stateMainService.ts +++ b/src/vs/platform/state/electron-main/stateMainService.ts @@ -13,7 +13,7 @@ import { FileOperationError, FileOperationResult, IFileService } from 'vs/platfo import { ILogService } from 'vs/platform/log/common/log'; import { IStateMainService } from 'vs/platform/state/electron-main/state'; -type StorageDatabase = { [key: string]: unknown; }; +type StorageDatabase = { [key: string]: unknown }; export class FileStorage { @@ -66,7 +66,7 @@ export class FileStorage { this.setItems([{ key, data }]); } - setItems(items: readonly { key: string, data?: object | string | number | boolean | undefined | null }[]): void { + setItems(items: readonly { key: string; data?: object | string | number | boolean | undefined | null }[]): void { let save = false; for (const { key, data } of items) { @@ -175,7 +175,7 @@ export class StateMainService implements IStateMainService { this.fileStorage.setItem(key, data); } - setItems(items: readonly { key: string, data?: object | string | number | boolean | undefined | null }[]): void { + setItems(items: readonly { key: string; data?: object | string | number | boolean | undefined | null }[]): void { this.fileStorage.setItems(items); } diff --git a/src/vs/platform/storage/browser/storageService.ts b/src/vs/platform/storage/browser/storageService.ts index 014c9ef4e1c..645049cb7c2 100644 --- a/src/vs/platform/storage/browser/storageService.ts +++ b/src/vs/platform/storage/browser/storageService.ts @@ -12,7 +12,7 @@ import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle' import { InMemoryStorageDatabase, isStorageItemsChangeEvent, IStorage, IStorageDatabase, IStorageItemsChangeEvent, IUpdateRequest, Storage } from 'vs/base/parts/storage/common/storage'; import { ILogService } from 'vs/platform/log/common/log'; import { AbstractStorageService, IS_NEW_KEY, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; +import { IAnyWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export class BrowserStorageService extends AbstractStorageService { @@ -29,7 +29,7 @@ export class BrowserStorageService extends AbstractStorageService { } constructor( - private readonly payload: IWorkspaceInitializationPayload, + private readonly payload: IAnyWorkspaceIdentifier, @ILogService private readonly logService: ILogService ) { super({ flushInterval: BrowserStorageService.BROWSER_DEFAULT_FLUSH_INTERVAL }); @@ -88,7 +88,7 @@ export class BrowserStorageService extends AbstractStorageService { return this.getId(scope); } - async migrate(toWorkspace: IWorkspaceInitializationPayload): Promise { + async migrate(toWorkspace: IAnyWorkspaceIdentifier): Promise { throw new Error('Migrating storage is currently unsupported in Web'); } diff --git a/src/vs/platform/storage/common/storage.ts b/src/vs/platform/storage/common/storage.ts index a36597555f9..1f83d5ed3db 100644 --- a/src/vs/platform/storage/common/storage.ts +++ b/src/vs/platform/storage/common/storage.ts @@ -10,7 +10,7 @@ import { mark } from 'vs/base/common/performance'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { InMemoryStorageDatabase, IStorage, Storage } from 'vs/base/parts/storage/common/storage'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; +import { IAnyWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export const IS_NEW_KEY = '__$__isNewStorageMarker'; const TARGET_KEY = '__$__targetStorageMarker'; @@ -141,7 +141,7 @@ export interface IStorageService { /** * Migrate the storage contents to another workspace. */ - migrate(toWorkspace: IWorkspaceInitializationPayload): Promise; + migrate(toWorkspace: IAnyWorkspaceIdentifier): Promise; /** * Whether the storage for the given scope was created during this session or @@ -218,7 +218,7 @@ export interface IStorageTargetChangeEvent { } interface IKeyTargets { - [key: string]: StorageTarget + [key: string]: StorageTarget; } export interface IStorageServiceOptions { @@ -510,7 +510,7 @@ export abstract class AbstractStorageService extends Disposable implements IStor protected abstract getLogDetails(scope: StorageScope): string | undefined; - abstract migrate(toWorkspace: IWorkspaceInitializationPayload): Promise; + abstract migrate(toWorkspace: IAnyWorkspaceIdentifier): Promise; } export class InMemoryStorageService extends AbstractStorageService { @@ -535,7 +535,7 @@ export class InMemoryStorageService extends AbstractStorageService { protected async doInitialize(): Promise { } - async migrate(toWorkspace: IWorkspaceInitializationPayload): Promise { + async migrate(toWorkspace: IAnyWorkspaceIdentifier): Promise { // not supported } } @@ -564,7 +564,7 @@ export async function logStorage(global: Map, workspace: Map { globalValues.push({ key, value }); }); @@ -574,7 +574,7 @@ export async function logStorage(global: Map, workspace: Map { workspaceValues.push({ key, value }); }); diff --git a/src/vs/platform/storage/common/storageIpc.ts b/src/vs/platform/storage/common/storageIpc.ts index a95938a3ae5..e6916d0c230 100644 --- a/src/vs/platform/storage/common/storageIpc.ts +++ b/src/vs/platform/storage/common/storageIpc.ts @@ -7,14 +7,14 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { IStorageDatabase, IStorageItemsChangeEvent, IUpdateRequest } from 'vs/base/parts/storage/common/storage'; -import { IEmptyWorkspaceIdentifier, ISerializedSingleFolderWorkspaceIdentifier, ISerializedWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISerializedSingleFolderWorkspaceIdentifier, ISerializedWorkspaceIdentifier, IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export type Key = string; export type Value = string; export type Item = [Key, Value]; export interface IBaseSerializableStorageRequest { - readonly workspace: ISerializedWorkspaceIdentifier | ISerializedSingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined + readonly workspace: ISerializedWorkspaceIdentifier | ISerializedSingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined; } export interface ISerializableUpdateRequest extends IBaseSerializableStorageRequest { diff --git a/src/vs/platform/storage/electron-main/storageIpc.ts b/src/vs/platform/storage/electron-main/storageIpc.ts index 4488e1dd2df..87c392c46fd 100644 --- a/src/vs/platform/storage/electron-main/storageIpc.ts +++ b/src/vs/platform/storage/electron-main/storageIpc.ts @@ -10,7 +10,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IBaseSerializableStorageRequest, ISerializableItemsChangeEvent, ISerializableUpdateRequest, Key, Value } from 'vs/platform/storage/common/storageIpc'; import { IStorageChangeEvent, IStorageMain } from 'vs/platform/storage/electron-main/storageMain'; import { IStorageMainService } from 'vs/platform/storage/electron-main/storageMainService'; -import { IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, reviveIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { reviveIdentifier, IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export class StorageDatabaseChannel extends Disposable implements IServerChannel { diff --git a/src/vs/platform/storage/electron-main/storageMain.ts b/src/vs/platform/storage/electron-main/storageMain.ts index 21bf291b5e9..e7c65d7c77d 100644 --- a/src/vs/platform/storage/electron-main/storageMain.ts +++ b/src/vs/platform/storage/electron-main/storageMain.ts @@ -14,7 +14,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { ILogService, LogLevel } from 'vs/platform/log/common/log'; import { IS_NEW_KEY } from 'vs/platform/storage/common/storage'; import { currentSessionDateStorageKey, firstSessionDateStorageKey, lastSessionDateStorageKey } from 'vs/platform/telemetry/common/telemetry'; -import { IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export interface IStorageMainOptions { @@ -270,7 +270,7 @@ export class WorkspaceStorageMain extends BaseStorageMain implements IStorageMai }), { hint: wasCreated ? StorageHint.STORAGE_DOES_NOT_EXIST : undefined }); } - private async prepareWorkspaceStorageFolder(): Promise<{ storageFilePath: string, wasCreated: boolean }> { + private async prepareWorkspaceStorageFolder(): Promise<{ storageFilePath: string; wasCreated: boolean }> { // Return early if using inMemory storage if (this.options.useInMemoryStorage) { diff --git a/src/vs/platform/storage/electron-main/storageMainService.ts b/src/vs/platform/storage/electron-main/storageMainService.ts index 202c8308058..b42f7777d60 100644 --- a/src/vs/platform/storage/electron-main/storageMainService.ts +++ b/src/vs/platform/storage/electron-main/storageMainService.ts @@ -13,7 +13,7 @@ import { ILifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle import { ILogService } from 'vs/platform/log/common/log'; import { AbstractStorageService, IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { GlobalStorageMain, IStorageMain, IStorageMainOptions, WorkspaceStorageMain } from 'vs/platform/storage/electron-main/storageMain'; -import { IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; +import { IAnyWorkspaceIdentifier, IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; //#region Storage Main Service (intent: make global and workspace storage accessible to windows from main process) @@ -184,7 +184,7 @@ export interface IGlobalStorageMainService extends IStorageService { keys(scope: StorageScope.GLOBAL, target: StorageTarget): string[]; - migrate(toWorkspace: IWorkspaceInitializationPayload): never; + migrate(toWorkspace: IAnyWorkspaceIdentifier): never; isNew(scope: StorageScope.GLOBAL): boolean; } diff --git a/src/vs/platform/storage/electron-sandbox/storageService.ts b/src/vs/platform/storage/electron-sandbox/storageService.ts index 424b5dafc1f..2eea47208b3 100644 --- a/src/vs/platform/storage/electron-sandbox/storageService.ts +++ b/src/vs/platform/storage/electron-sandbox/storageService.ts @@ -11,7 +11,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/services'; import { AbstractStorageService, StorageScope, WillSaveStateReason } from 'vs/platform/storage/common/storage'; import { StorageDatabaseChannelClient } from 'vs/platform/storage/common/storageIpc'; -import { IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; +import { IAnyWorkspaceIdentifier, IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export class NativeStorageService extends AbstractStorageService { @@ -66,7 +66,7 @@ export class NativeStorageService extends AbstractStorageService { } protected async doInitialize(): Promise { - + // Init all storage locations await Promises.settled([ this.globalStorage.init(), @@ -97,7 +97,7 @@ export class NativeStorageService extends AbstractStorageService { ]); } - async migrate(toWorkspace: IWorkspaceInitializationPayload): Promise { + async migrate(toWorkspace: IAnyWorkspaceIdentifier): Promise { // Keep current workspace storage items around to restore const oldWorkspaceStorage = this.workspaceStorage; diff --git a/src/vs/platform/storage/test/common/storageService.test.ts b/src/vs/platform/storage/test/common/storageService.test.ts index 6406c6ff610..553bf7bdf63 100644 --- a/src/vs/platform/storage/test/common/storageService.test.ts +++ b/src/vs/platform/storage/test/common/storageService.test.ts @@ -6,7 +6,7 @@ import { ok, strictEqual } from 'assert'; import { InMemoryStorageService, IStorageService, IStorageTargetChangeEvent, IStorageValueChangeEvent, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -export function createSuite(params: { setup: () => Promise, teardown: (service: T) => Promise }): void { +export function createSuite(params: { setup: () => Promise; teardown: (service: T) => Promise }): void { let storageService: T; diff --git a/src/vs/platform/storage/test/electron-main/storageMainService.test.ts b/src/vs/platform/storage/test/electron-main/storageMainService.test.ts index 782140d4e99..2788312de19 100644 --- a/src/vs/platform/storage/test/electron-main/storageMainService.test.ts +++ b/src/vs/platform/storage/test/electron-main/storageMainService.test.ts @@ -66,7 +66,7 @@ suite('StorageMainService', function () { registerWindow(window: ICodeWindow): void { } async reload(window: ICodeWindow, cli?: NativeParsedArgs): Promise { } async unload(window: ICodeWindow, reason: UnloadReason): Promise { return true; } - async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined; }): Promise { } + async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined }): Promise { } async quit(willRestart?: boolean): Promise { return true; } async kill(code?: number): Promise { } async when(phase: LifecycleMainPhase): Promise { } diff --git a/src/vs/platform/telemetry/common/commonProperties.ts b/src/vs/platform/telemetry/common/commonProperties.ts index 4a704e9c628..06bd318a5eb 100644 --- a/src/vs/platform/telemetry/common/commonProperties.ts +++ b/src/vs/platform/telemetry/common/commonProperties.ts @@ -28,8 +28,8 @@ export async function resolveCommonProperties( msftInternalDomains: string[] | undefined, installSourcePath: string, product?: string -): Promise<{ [name: string]: string | boolean | undefined; }> { - const result: { [name: string]: string | boolean | undefined; } = Object.create(null); +): Promise<{ [name: string]: string | boolean | undefined }> { + const result: { [name: string]: string | boolean | undefined } = Object.create(null); // __GDPR__COMMON__ "common.machineId" : { "endPoint": "MacAddressHash", "classification": "EndUserPseudonymizedInformation", "purpose": "FeatureInsight" } result['common.machineId'] = machineId; diff --git a/src/vs/platform/telemetry/common/errorTelemetry.ts b/src/vs/platform/telemetry/common/errorTelemetry.ts index 78d3e442a47..75af33cb150 100644 --- a/src/vs/platform/telemetry/common/errorTelemetry.ts +++ b/src/vs/platform/telemetry/common/errorTelemetry.ts @@ -10,14 +10,14 @@ import { safeStringify } from 'vs/base/common/objects'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; type ErrorEventFragment = { - callstack: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; - msg?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; - file?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; - line?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth', isMeasurement: true }; - column?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth', isMeasurement: true }; - uncaught_error_name?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; - uncaught_error_msg?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; - count?: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth', isMeasurement: true }; + callstack: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth' }; + msg?: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth' }; + file?: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth' }; + line?: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + column?: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + uncaught_error_name?: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth' }; + uncaught_error_msg?: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth' }; + count?: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; }; export interface ErrorEvent { callstack: string; diff --git a/src/vs/server/remoteTelemetryChannel.ts b/src/vs/platform/telemetry/common/remoteTelemetryChannel.ts similarity index 90% rename from src/vs/server/remoteTelemetryChannel.ts rename to src/vs/platform/telemetry/common/remoteTelemetryChannel.ts index 65c36eac43f..66bd712a808 100644 --- a/src/vs/server/remoteTelemetryChannel.ts +++ b/src/vs/platform/telemetry/common/remoteTelemetryChannel.ts @@ -8,11 +8,11 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryAppender } from 'vs/platform/telemetry/common/telemetryUtils'; -import { IRemoteTelemetryService } from 'vs/server/remoteTelemetryService'; +import { IServerTelemetryService } from 'vs/platform/telemetry/common/serverTelemetryService'; -export class RemoteTelemetryChannel extends Disposable implements IServerChannel { +export class ServerTelemetryChannel extends Disposable implements IServerChannel { constructor( - private readonly telemetryService: IRemoteTelemetryService, + private readonly telemetryService: IServerTelemetryService, private readonly telemetryAppender: ITelemetryAppender | null ) { super(); diff --git a/src/vs/server/remoteTelemetryService.ts b/src/vs/platform/telemetry/common/serverTelemetryService.ts similarity index 88% rename from src/vs/server/remoteTelemetryService.ts rename to src/vs/platform/telemetry/common/serverTelemetryService.ts index 4760ceb2947..4a0e58636a5 100644 --- a/src/vs/server/remoteTelemetryService.ts +++ b/src/vs/platform/telemetry/common/serverTelemetryService.ts @@ -10,8 +10,8 @@ import { ITelemetryData, ITelemetryService, TelemetryLevel } from 'vs/platform/t import { ITelemetryServiceConfig, TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { NullTelemetryServiceShape } from 'vs/platform/telemetry/common/telemetryUtils'; -export interface IRemoteTelemetryService extends ITelemetryService { - updateInjectedTelemetryLevel(telemetryLevel: TelemetryLevel): Promise +export interface IServerTelemetryService extends ITelemetryService { + updateInjectedTelemetryLevel(telemetryLevel: TelemetryLevel): Promise; } interface CachedTelemetryEvent { @@ -21,10 +21,10 @@ interface CachedTelemetryEvent { eventType: 'usage' | 'error'; } -export class RemoteTelemetryService extends TelemetryService implements IRemoteTelemetryService { +export class ServerTelemetryService extends TelemetryService implements IServerTelemetryService { private _telemetryCache: CachedTelemetryEvent[] = []; // Because we cannot read the workspace config on the remote site - // the RemoteTeelemtryService is respeonsible for knowing its telemetry level + // the ServerTelemetryService is responsible for knowing its telemetry level // this is done through IPC calls and initial value injections private _injectedTelemetryLevel: TelemetryLevel | undefined; constructor( @@ -45,7 +45,6 @@ export class RemoteTelemetryService extends TelemetryService implements IRemoteT if (this._injectedTelemetryLevel < TelemetryLevel.USAGE) { return Promise.resolve(undefined); } - console.log(`Logging telemetry: ${eventName}`); return super.publicLog(eventName, data, anonymizeFilePaths); } @@ -62,7 +61,6 @@ export class RemoteTelemetryService extends TelemetryService implements IRemoteT if (this._injectedTelemetryLevel < TelemetryLevel.ERROR) { return Promise.resolve(undefined); } - console.log(`Logging telemetry: ${errorEventName}`); return super.publicLogError(errorEventName, data); } @@ -102,8 +100,8 @@ export class RemoteTelemetryService extends TelemetryService implements IRemoteT } } -export const RemoteNullTelemetryService = new class extends NullTelemetryServiceShape implements IRemoteTelemetryService { +export const ServerNullTelemetryService = new class extends NullTelemetryServiceShape implements IServerTelemetryService { async updateInjectedTelemetryLevel(): Promise { return; } // No-op, telemetry is already disabled }; -export const IRemoteTelemetryService = refineServiceDecorator(ITelemetryService); +export const IServerTelemetryService = refineServiceDecorator(ITelemetryService); diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index cbdd9494f57..8b4d12a49ba 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -31,7 +31,7 @@ export class TelemetryService implements ITelemetryService { declare readonly _serviceBrand: undefined; private _appenders: ITelemetryAppender[]; - private _commonProperties: Promise<{ [name: string]: any; }>; + private _commonProperties: Promise<{ [name: string]: any }>; private _experimentProperties: { [name: string]: string } = {}; private _piiPaths: string[]; private _telemetryLevel: TelemetryLevel; @@ -60,22 +60,6 @@ export class TelemetryService implements ITelemetryService { this._updateTelemetryLevel(); this._configurationService.onDidChangeConfiguration(this._updateTelemetryLevel, this, this._disposables); - type OptInClassification = { - optIn: { classification: 'SystemMetaData', purpose: 'BusinessInsight', isMeasurement: true }; - }; - type OptInEvent = { - optIn: boolean; - }; - this.publicLog2('optInStatus', { optIn: this._telemetryLevel === TelemetryLevel.USAGE }); - - this._commonProperties.then(values => { - const isHashedId = /^[a-f0-9]+$/i.test(values['common.machineId']); - - type MachineIdFallbackClassification = { - usingFallbackGuid: { classification: 'SystemMetaData', purpose: 'BusinessInsight', isMeasurement: true }; - }; - this.publicLog2<{ usingFallbackGuid: boolean }, MachineIdFallbackClassification>('machineIdFallback', { usingFallbackGuid: !isHashedId }); - }); } setExperimentProperty(name: string, value: string): void { @@ -204,7 +188,7 @@ export class TelemetryService implements ITelemetryService { const value = property.toLowerCase(); const emailRegex = /@[a-zA-Z0-9-.]+/; // Regex which matches @*.site - const secretRegex = /(key|token|sig|signature|password|passwd|pwd)[="':\s]/; + const secretRegex = /(key|token|sig|signature|password|passwd|pwd|android:value)[^a-zA-Z0-9]/; const tokenRegex = /xox[pbaors]\-[a-zA-Z0-9]+\-[a-zA-Z0-9\-]+?/; // last +? is lazy as a microoptimization since we don't care about the full value // Check for common user data in the telemetry events diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index 7c5777a2528..41aa8481812 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -82,8 +82,8 @@ export function configurationTelemetry(telemetryService: ITelemetryService, conf return configurationService.onDidChangeConfiguration(event => { if (event.source !== ConfigurationTarget.DEFAULT) { type UpdateConfigurationClassification = { - configurationSource: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - configurationKeys: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + configurationSource: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + configurationKeys: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type UpdateConfigurationEvent = { configurationSource: string; @@ -148,7 +148,7 @@ export interface Measurements { [key: string]: number; } -export function validateTelemetryData(data?: any): { properties: Properties, measurements: Measurements } { +export function validateTelemetryData(data?: any): { properties: Properties; measurements: Measurements } { const properties: Properties = Object.create(null); const measurements: Measurements = Object.create(null); diff --git a/src/vs/platform/telemetry/node/appInsightsAppender.ts b/src/vs/platform/telemetry/node/appInsightsAppender.ts index 32eda54fc0d..0b5554ce5b7 100644 --- a/src/vs/platform/telemetry/node/appInsightsAppender.ts +++ b/src/vs/platform/telemetry/node/appInsightsAppender.ts @@ -95,24 +95,30 @@ export class AppInsightsAppender implements ITelemetryAppender { data.properties['common.useragent'] = this.mirrored ? 'mirror-collector++' : 'collector++'; } - this._withAIClient((aiClient) => aiClient.trackEvent({ - name: this._eventPrefix + '/' + eventName, - properties: data.properties, - measurements: data.measurements - })); + // Attemps to suppress https://github.com/microsoft/vscode/issues/140624 + try { + this._withAIClient((aiClient) => aiClient.trackEvent({ + name: this._eventPrefix + '/' + eventName, + properties: data.properties, + measurements: data.measurements + })); + } catch { } } flush(): Promise { if (this._aiClient) { return new Promise(resolve => { this._withAIClient((aiClient) => { - aiClient.flush({ - callback: () => { - // all data flushed - this._aiClient = undefined; - resolve(undefined); - } - }); + // Attempts to suppress https://github.com/microsoft/vscode/issues/140624 + try { + aiClient.flush({ + callback: () => { + // all data flushed + this._aiClient = undefined; + resolve(undefined); + } + }); + } catch { } }); }); } diff --git a/src/vs/platform/telemetry/test/browser/telemetryService.test.ts b/src/vs/platform/telemetry/test/browser/telemetryService.test.ts index 66cccfc61d7..63e9486ad99 100644 --- a/src/vs/platform/telemetry/test/browser/telemetryService.test.ts +++ b/src/vs/platform/telemetry/test/browser/telemetryService.test.ts @@ -93,7 +93,7 @@ suite('TelemetryService', () => { let service = new TelemetryService({ appenders: [testAppender] }, new TestConfigurationService()); return service.publicLog('testPrivateEvent').then(() => { - assert.strictEqual(testAppender.getEventsCount(), 3); + assert.strictEqual(testAppender.getEventsCount(), 1); service.dispose(); assert.strictEqual(!testAppender.isDisposed, true); @@ -106,11 +106,9 @@ suite('TelemetryService', () => { let service = new TelemetryService({ appenders: [testAppender] }, new TestConfigurationService()); return service.publicLog('testEvent').then(_ => { - assert.strictEqual(testAppender.getEventsCount(), 3); - assert.strictEqual(testAppender.events[0].eventName, 'optInStatus'); - assert.strictEqual(testAppender.events[1].eventName, 'testEvent'); - assert.notStrictEqual(testAppender.events[1].data, null); - assert.strictEqual(testAppender.events[2].eventName, 'machineIdFallback'); + assert.strictEqual(testAppender.getEventsCount(), 1); + assert.strictEqual(testAppender.events[0].eventName, 'testEvent'); + assert.notStrictEqual(testAppender.events[0].data, null); service.dispose(); }); @@ -128,14 +126,13 @@ suite('TelemetryService', () => { 'value': 0 } }).then(() => { - assert.strictEqual(testAppender.getEventsCount(), 3); - assert.strictEqual(testAppender.events[0].eventName, 'optInStatus'); - assert.strictEqual(testAppender.events[1].eventName, 'testEvent'); - assert.notStrictEqual(testAppender.events[1].data, null); - assert.strictEqual(testAppender.events[1].data['stringProp'], 'property'); - assert.strictEqual(testAppender.events[1].data['numberProp'], 1); - assert.strictEqual(testAppender.events[1].data['booleanProp'], true); - assert.strictEqual(testAppender.events[1].data['complexProp'].value, 0); + assert.strictEqual(testAppender.getEventsCount(), 1); + assert.strictEqual(testAppender.events[0].eventName, 'testEvent'); + assert.notStrictEqual(testAppender.events[0].data, null); + assert.strictEqual(testAppender.events[0].data['stringProp'], 'property'); + assert.strictEqual(testAppender.events[0].data['numberProp'], 1); + assert.strictEqual(testAppender.events[0].data['booleanProp'], true); + assert.strictEqual(testAppender.events[0].data['complexProp'].value, 0); service.dispose(); }); @@ -150,11 +147,11 @@ suite('TelemetryService', () => { }, new TestConfigurationService()); return service.publicLog('testEvent').then(_ => { - let [, second] = testAppender.events; // first is optInStatus-event + let [first] = testAppender.events; - assert.strictEqual(Object.keys(second.data).length, 2); - assert.strictEqual(typeof second.data['foo'], 'string'); - assert.strictEqual(typeof second.data['bar'], 'number'); + assert.strictEqual(Object.keys(first.data).length, 2); + assert.strictEqual(typeof first.data['foo'], 'string'); + assert.strictEqual(typeof first.data['bar'], 'number'); service.dispose(); }); @@ -168,13 +165,13 @@ suite('TelemetryService', () => { }, new TestConfigurationService()); return service.publicLog('testEvent', { hightower: 'xl', price: 8000 }).then(_ => { - let [, second] = testAppender.events; // first is optInStatus-event + let [first] = testAppender.events; - assert.strictEqual(Object.keys(second.data).length, 4); - assert.strictEqual(typeof second.data['foo'], 'string'); - assert.strictEqual(typeof second.data['bar'], 'number'); - assert.strictEqual(typeof second.data['hightower'], 'string'); - assert.strictEqual(typeof second.data['price'], 'number'); + assert.strictEqual(Object.keys(first.data).length, 4); + assert.strictEqual(typeof first.data['foo'], 'string'); + assert.strictEqual(typeof first.data['bar'], 'number'); + assert.strictEqual(typeof first.data['hightower'], 'string'); + assert.strictEqual(typeof first.data['price'], 'number'); service.dispose(); }); @@ -202,9 +199,8 @@ suite('TelemetryService', () => { let service = new TelemetryService({ appenders: [testAppender] }, new TestConfigurationService()); return service.publicLog('testEvent').then(() => { - assert.strictEqual(testAppender.getEventsCount(), 3); - assert.strictEqual(testAppender.events[0].eventName, 'optInStatus'); - assert.strictEqual(testAppender.events[1].eventName, 'testEvent'); + assert.strictEqual(testAppender.getEventsCount(), 1); + assert.strictEqual(testAppender.events[0].eventName, 'testEvent'); service.dispose(); }); @@ -266,10 +262,9 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); await service.join(); - assert.strictEqual(testAppender.getEventsCount(), 3); - assert.strictEqual(testAppender.events[0].eventName, 'optInStatus'); - assert.strictEqual(testAppender.events[1].eventName, 'UnhandledError'); - assert.strictEqual(testAppender.events[1].data.msg, 'This is a test.'); + assert.strictEqual(testAppender.getEventsCount(), 1); + assert.strictEqual(testAppender.events[0].eventName, 'UnhandledError'); + assert.strictEqual(testAppender.events[0].data.msg, 'This is a test.'); errorTelemetry.dispose(); service.dispose(); @@ -323,14 +318,13 @@ suite('TelemetryService', () => { assert.strictEqual(errorStub.alwaysCalledWithExactly('Error Message', 'file.js', 2, 42, testError), true); assert.strictEqual(errorStub.callCount, 1); - assert.strictEqual(testAppender.getEventsCount(), 3); - assert.strictEqual(testAppender.events[0].eventName, 'optInStatus'); - assert.strictEqual(testAppender.events[1].eventName, 'UnhandledError'); - assert.strictEqual(testAppender.events[1].data.msg, 'Error Message'); - assert.strictEqual(testAppender.events[1].data.file, 'file.js'); - assert.strictEqual(testAppender.events[1].data.line, 2); - assert.strictEqual(testAppender.events[1].data.column, 42); - assert.strictEqual(testAppender.events[1].data.uncaught_error_msg, 'test'); + assert.strictEqual(testAppender.getEventsCount(), 1); + assert.strictEqual(testAppender.events[0].eventName, 'UnhandledError'); + assert.strictEqual(testAppender.events[0].data.msg, 'Error Message'); + assert.strictEqual(testAppender.events[0].data.file, 'file.js'); + assert.strictEqual(testAppender.events[0].data.line, 2); + assert.strictEqual(testAppender.events[0].data.column, 42); + assert.strictEqual(testAppender.events[0].data.uncaught_error_msg, 'test'); errorTelemetry.dispose(); service.dispose(); @@ -352,8 +346,8 @@ suite('TelemetryService', () => { await service.join(); assert.strictEqual(errorStub.callCount, 1); - assert.strictEqual(testAppender.events[1].data.file.indexOf(settings.dangerousPathWithImportantInfo.replace(settings.personalInfo, personInfoWithSpaces)), -1); - assert.strictEqual(testAppender.events[1].data.file, settings.importantInfo + '/test.js'); + assert.strictEqual(testAppender.events[0].data.file.indexOf(settings.dangerousPathWithImportantInfo.replace(settings.personalInfo, personInfoWithSpaces)), -1); + assert.strictEqual(testAppender.events[0].data.file, settings.importantInfo + '/test.js'); errorTelemetry.dispose(); service.dispose(); @@ -374,7 +368,7 @@ suite('TelemetryService', () => { clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); return service.join().then(() => { assert.strictEqual(errorStub.callCount, 1); - assert.strictEqual(testAppender.events[1].data.file.indexOf(settings.dangerousPathWithImportantInfo), -1); + assert.strictEqual(testAppender.events[0].data.file.indexOf(settings.dangerousPathWithImportantInfo), -1); dangerousFilenameError = new Error('dangerousFilename'); dangerousFilenameError.stack = settings.stack; @@ -383,8 +377,8 @@ suite('TelemetryService', () => { return service.join(); }).then(() => { assert.strictEqual(errorStub.callCount, 2); - assert.strictEqual(testAppender.events[1].data.file.indexOf(settings.dangerousPathWithImportantInfo), -1); - assert.strictEqual(testAppender.events[1].data.file, settings.importantInfo + '/test.js'); + assert.strictEqual(testAppender.events[0].data.file.indexOf(settings.dangerousPathWithImportantInfo), -1); + assert.strictEqual(testAppender.events[0].data.file, settings.importantInfo + '/test.js'); errorTelemetry.dispose(); service.dispose(); @@ -406,13 +400,13 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); await service.join(); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -438,12 +432,12 @@ suite('TelemetryService', () => { assert.strictEqual(errorStub.callCount, 1); // Test that no file information remains, esp. personal info - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -468,14 +462,14 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); await service.join(); - assert.notStrictEqual(testAppender.events[1].data.msg.indexOf(settings.importantInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.importantInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.notStrictEqual(testAppender.events[0].data.msg.indexOf(settings.importantInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.importantInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -501,14 +495,14 @@ suite('TelemetryService', () => { assert.strictEqual(errorStub.callCount, 1); // Test that important information remains but personal info does not - assert.notStrictEqual(testAppender.events[1].data.msg.indexOf(settings.importantInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.importantInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.notStrictEqual(testAppender.events[0].data.msg.indexOf(settings.importantInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.importantInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -533,10 +527,10 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); await service.join(); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf('(' + settings.nodeModuleAsarPathToRetain), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf('(' + settings.nodeModulePathToRetain), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf('(/' + settings.nodeModuleAsarPathToRetain), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf('(/' + settings.nodeModulePathToRetain), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf('(' + settings.nodeModuleAsarPathToRetain), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf('(' + settings.nodeModulePathToRetain), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf('(/' + settings.nodeModuleAsarPathToRetain), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf('(/' + settings.nodeModulePathToRetain), -1); errorTelemetry.dispose(); service.dispose(); @@ -562,10 +556,10 @@ suite('TelemetryService', () => { assert.strictEqual(errorStub.callCount, 1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf('(' + settings.nodeModuleAsarPathToRetain), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf('(' + settings.nodeModulePathToRetain), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf('(/' + settings.nodeModuleAsarPathToRetain), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf('(/' + settings.nodeModulePathToRetain), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf('(' + settings.nodeModuleAsarPathToRetain), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf('(' + settings.nodeModulePathToRetain), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf('(/' + settings.nodeModuleAsarPathToRetain), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf('(/' + settings.nodeModulePathToRetain), -1); errorTelemetry.dispose(); service.dispose(); @@ -591,14 +585,14 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); await service.join(); - assert.notStrictEqual(testAppender.events[1].data.msg.indexOf(settings.importantInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.importantInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.notStrictEqual(testAppender.events[0].data.msg.indexOf(settings.importantInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.importantInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -624,14 +618,14 @@ suite('TelemetryService', () => { assert.strictEqual(errorStub.callCount, 1); // Test that important information remains but personal info does not - assert.notStrictEqual(testAppender.events[1].data.msg.indexOf(settings.importantInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.importantInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.notStrictEqual(testAppender.events[0].data.msg.indexOf(settings.importantInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.importantInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -657,14 +651,14 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); await service.join(); - assert.notStrictEqual(testAppender.events[1].data.msg.indexOf(settings.missingModelPrefix), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.missingModelPrefix), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.notStrictEqual(testAppender.events[0].data.msg.indexOf(settings.missingModelPrefix), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.missingModelPrefix), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -690,14 +684,14 @@ suite('TelemetryService', () => { assert.strictEqual(errorStub.callCount, 1); // Test that no file information remains, but this particular // error message does (Received model events for missing model) - assert.notStrictEqual(testAppender.events[1].data.msg.indexOf(settings.missingModelPrefix), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.missingModelPrefix), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.notStrictEqual(testAppender.events[0].data.msg.indexOf(settings.missingModelPrefix), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.missingModelPrefix), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -723,14 +717,14 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); await service.join(); - assert.notStrictEqual(testAppender.events[1].data.msg.indexOf(settings.noSuchFilePrefix), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.noSuchFilePrefix), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.notStrictEqual(testAppender.events[0].data.msg.indexOf(settings.noSuchFilePrefix), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.noSuchFilePrefix), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -761,14 +755,14 @@ suite('TelemetryService', () => { // Test that no file information remains, but this particular // error message does (ENOENT: no such file or directory) Errors.onUnexpectedError(noSuchFileError); - assert.notStrictEqual(testAppender.events[1].data.msg.indexOf(settings.noSuchFilePrefix), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.msg.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.noSuchFilePrefix), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.personalInfo), -1); - assert.strictEqual(testAppender.events[1].data.callstack.indexOf(settings.filePrefix), -1); - assert.notStrictEqual(testAppender.events[1].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.strictEqual(testAppender.events[1].data.callstack.split('\n').length, settings.stack.length); + assert.notStrictEqual(testAppender.events[0].data.msg.indexOf(settings.noSuchFilePrefix), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.noSuchFilePrefix), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.strictEqual(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notStrictEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.strictEqual(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -782,7 +776,7 @@ suite('TelemetryService', () => { let service = new TelemetryService({ appenders: [testAppender] }, new TestConfigurationService()); return service.publicLog('testEvent').then(() => { - assert.strictEqual(testAppender.getEventsCount(), 3); + assert.strictEqual(testAppender.getEventsCount(), 1); service.dispose(); }); })); diff --git a/src/vs/platform/terminal/common/terminal.ts b/src/vs/platform/terminal/common/terminal.ts index f95e2895f56..fdd32866338 100644 --- a/src/vs/platform/terminal/common/terminal.ts +++ b/src/vs/platform/terminal/common/terminal.ts @@ -49,6 +49,7 @@ export const enum TerminalSettingId { MacOptionClickForcesSelection = 'terminal.integrated.macOptionClickForcesSelection', AltClickMovesCursor = 'terminal.integrated.altClickMovesCursor', CopyOnSelection = 'terminal.integrated.copyOnSelection', + EnableMultiLinePasteWarning = 'terminal.integrated.enableMultiLinePasteWarning', DrawBoldTextInBrightColors = 'terminal.integrated.drawBoldTextInBrightColors', FontFamily = 'terminal.integrated.fontFamily', FontSize = 'terminal.integrated.fontSize', @@ -89,7 +90,6 @@ export const enum TerminalSettingId { WordSeparators = 'terminal.integrated.wordSeparators', EnableFileLinks = 'terminal.integrated.enableFileLinks', UnicodeVersion = 'terminal.integrated.unicodeVersion', - ExperimentalLinkProvider = 'terminal.integrated.experimentalLinkProvider', LocalEchoLatencyThreshold = 'terminal.integrated.localEchoLatencyThreshold', LocalEchoEnabled = 'terminal.integrated.localEchoEnabled', LocalEchoExcludePrograms = 'terminal.integrated.localEchoExcludePrograms', @@ -102,7 +102,8 @@ export const enum TerminalSettingId { ShowLinkHover = 'terminal.integrated.showLinkHover', IgnoreProcessNames = 'terminal.integrated.ignoreProcessNames', AutoReplies = 'terminal.integrated.autoReplies', - EnableShellIntegration = 'terminal.integrated.enableShellIntegration' + EnableShellIntegration = 'terminal.integrated.enableShellIntegration', + ShowShellIntegrationWelcome = 'terminal.integrated.showShellIntegrationWelcome' } export enum WindowsShellType { @@ -196,19 +197,19 @@ export const enum ProcessPropertyType { } export interface IProcessProperty { - type: T, - value: IProcessPropertyMap[T] + type: T; + value: IProcessPropertyMap[T]; } export interface IProcessPropertyMap { - [ProcessPropertyType.Cwd]: string, - [ProcessPropertyType.InitialCwd]: string, - [ProcessPropertyType.FixedDimensions]: IFixedTerminalDimensions, - [ProcessPropertyType.Title]: string - [ProcessPropertyType.ShellType]: TerminalShellType | undefined, - [ProcessPropertyType.HasChildProcesses]: boolean, - [ProcessPropertyType.ResolvedShellLaunchConfig]: IShellLaunchConfig, - [ProcessPropertyType.OverrideDimensions]: ITerminalDimensionsOverride | undefined + [ProcessPropertyType.Cwd]: string; + [ProcessPropertyType.InitialCwd]: string; + [ProcessPropertyType.FixedDimensions]: IFixedTerminalDimensions; + [ProcessPropertyType.Title]: string; + [ProcessPropertyType.ShellType]: TerminalShellType | undefined; + [ProcessPropertyType.HasChildProcesses]: boolean; + [ProcessPropertyType.ResolvedShellLaunchConfig]: IShellLaunchConfig; + [ProcessPropertyType.OverrideDimensions]: ITerminalDimensionsOverride | undefined; } export interface IFixedTerminalDimensions { @@ -237,13 +238,13 @@ export interface IPtyHostController { export interface IPtyService extends IPtyHostController { readonly _serviceBrand: undefined; - readonly onProcessData: Event<{ id: number, event: IProcessDataEvent | string }>; - readonly onProcessReady: Event<{ id: number, event: IProcessReadyEvent }>; - readonly onProcessReplay: Event<{ id: number, event: IPtyHostProcessReplayEvent }>; + readonly onProcessData: Event<{ id: number; event: IProcessDataEvent | string }>; + readonly onProcessReady: Event<{ id: number; event: IProcessReadyEvent }>; + readonly onProcessReplay: Event<{ id: number; event: IPtyHostProcessReplayEvent }>; readonly onProcessOrphanQuestion: Event<{ id: number }>; - readonly onDidRequestDetach: Event<{ requestId: number, workspaceId: string, instanceId: number }>; - readonly onDidChangeProperty: Event<{ id: number, property: IProcessProperty }> - readonly onProcessExit: Event<{ id: number, event: number | undefined }>; + readonly onDidRequestDetach: Event<{ requestId: number; workspaceId: string; instanceId: number }>; + readonly onDidChangeProperty: Event<{ id: number; property: IProcessProperty }>; + readonly onProcessExit: Event<{ id: number; event: number | undefined }>; restartPtyHost?(): Promise; shutdownAll?(): Promise; @@ -379,9 +380,9 @@ export interface IShellLaunchConfig { name?: string; /** - * An string to follow the name of the terminal with, indicating a special kind of terminal + * A string to follow the name of the terminal with, indicating the type of terminal */ - description?: string; + type?: 'Task' | 'Local'; /** * The shell executable (bash, cmd, etc.). @@ -437,7 +438,7 @@ export interface IShellLaunchConfig { /** * This is a terminal that attaches to an already running terminal. */ - attachPersistentProcess?: { id: number; pid: number; title: string; titleSource: TitleEventSource; cwd: string; icon?: TerminalIcon; color?: string, hasChildProcesses?: boolean, fixedDimensions?: IFixedTerminalDimensions }; + attachPersistentProcess?: { id: number; pid: number; title: string; titleSource: TitleEventSource; cwd: string; icon?: TerminalIcon; color?: string; hasChildProcesses?: boolean; fixedDimensions?: IFixedTerminalDimensions }; /** * Whether the terminal process environment should be exactly as provided in @@ -502,13 +503,13 @@ export interface IShellLaunchConfig { /** * Opt-out of the default terminal persistence on restart and reload */ - disablePersistence?: boolean; + isTransient?: boolean; } export interface ICreateContributedTerminalProfileOptions { - icon?: URI | string | { light: URI, dark: URI }; + icon?: URI | string | { light: URI; dark: URI }; color?: string; - location?: TerminalLocation | { viewColumn: number, preserveState?: boolean } | { splitActiveTerminal: boolean }; + location?: TerminalLocation | { viewColumn: number; preserveState?: boolean } | { splitActiveTerminal: boolean }; } export enum TerminalLocation { @@ -543,35 +544,9 @@ export interface ITerminalLaunchError { } export interface IProcessReadyEvent { - pid: number, - cwd: string, - requiresWindowsMode?: boolean -} - -/** - * Primarily driven by the shell integration feature, a terminal capability is the mechanism for - * progressively enhancing various features that may not be supported in all terminals/shells. - */ -export const enum TerminalCapability { - /** - * The terminal can reliably detect the current working directory as soon as the change happens - * within the buffer. - */ - CwdDetection, - /** - * The terminal can reliably detect the current working directory when requested. - */ - NaiveCwdDetection, - /** - * The terminal can reliably identify prompts, commands and command outputs within the buffer. - */ - CommandDetection, - /** - * The terminal can often identify prompts, commands and command outputs within the buffer. It - * may not be so good at remembering the position of commands that ran in the past. This state - * may be enabled when something goes wrong or when using conpty for example. - */ - PartialCommandDetection + pid: number; + cwd: string; + requiresWindowsMode?: boolean; } /** @@ -716,7 +691,7 @@ export interface ITerminalProfile { env?: ITerminalEnvironment; overrideName?: boolean; color?: string; - icon?: ThemeIcon | URI | { light: URI, dark: URI }; + icon?: ThemeIcon | URI | { light: URI; dark: URI }; } export interface ITerminalDimensionsOverride extends Readonly { @@ -735,7 +710,7 @@ export interface IBaseUnresolvedTerminalProfile { args?: string | string[] | undefined; isAutoDetected?: boolean; overrideName?: boolean; - icon?: string | ThemeIcon | URI | { light: URI, dark: URI }; + icon?: string | ThemeIcon | URI | { light: URI; dark: URI }; color?: string; env?: ITerminalEnvironment; } @@ -756,7 +731,7 @@ export interface ITerminalContributions { export interface ITerminalProfileContribution { title: string; id: string; - icon?: URI | { light: URI, dark: URI } | string; + icon?: URI | { light: URI; dark: URI } | string; color?: string; } diff --git a/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts b/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts index eeb4bcbe569..25e0f2b934f 100644 --- a/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts +++ b/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts @@ -475,7 +475,7 @@ export function registerTerminalPlatformConfiguration() { } let defaultProfilesConfiguration: IConfigurationNode | undefined; -export function registerTerminalDefaultProfileConfiguration(detectedProfiles?: { os: OperatingSystem, profiles: ITerminalProfile[] }, extensionContributedProfiles?: readonly IExtensionTerminalProfile[]) { +export function registerTerminalDefaultProfileConfiguration(detectedProfiles?: { os: OperatingSystem; profiles: ITerminalProfile[] }, extensionContributedProfiles?: readonly IExtensionTerminalProfile[]) { const registry = Registry.as(Extensions.Configuration); let profileEnum; if (detectedProfiles) { diff --git a/src/vs/platform/terminal/common/terminalProcess.ts b/src/vs/platform/terminal/common/terminalProcess.ts index 8c5eeedfb82..d32d309235b 100644 --- a/src/vs/platform/terminal/common/terminalProcess.ts +++ b/src/vs/platform/terminal/common/terminalProcess.ts @@ -63,7 +63,7 @@ export interface IProcessDetails { export type ITerminalTabLayoutInfoDto = IRawTerminalTabLayoutInfo; -export interface ReplayEntry { cols: number; rows: number; data: string; } +export interface ReplayEntry { cols: number; rows: number; data: string } export interface IPtyHostProcessReplayEvent { events: ReplayEntry[]; } diff --git a/src/vs/platform/terminal/common/terminalProfiles.ts b/src/vs/platform/terminal/common/terminalProfiles.ts index 970db1c3b28..1b4d411e501 100644 --- a/src/vs/platform/terminal/common/terminalProfiles.ts +++ b/src/vs/platform/terminal/common/terminalProfiles.ts @@ -9,8 +9,8 @@ import { IExtensionTerminalProfile, ITerminalProfile, TerminalIcon } from 'vs/pl import { ThemeIcon } from 'vs/platform/theme/common/themeService'; export function createProfileSchemaEnums(detectedProfiles: ITerminalProfile[], extensionProfiles?: readonly IExtensionTerminalProfile[]): { - values: string[] | undefined, - markdownDescriptions: string[] | undefined + values: string[] | undefined; + markdownDescriptions: string[] | undefined; } { const result = detectedProfiles.map(e => { return { @@ -90,16 +90,16 @@ export function terminalIconsEqual(iconOne?: TerminalIcon, iconTwo?: TerminalIco } if (typeof iconOne === 'object' && iconOne && 'light' in iconOne && 'dark' in iconOne && typeof iconTwo === 'object' && iconTwo && 'light' in iconTwo && 'dark' in iconTwo) { - const castedIcon = (iconOne as { light: unknown, dark: unknown }); - const castedIconTwo = (iconTwo as { light: unknown, dark: unknown }); + const castedIcon = (iconOne as { light: unknown; dark: unknown }); + const castedIconTwo = (iconTwo as { light: unknown; dark: unknown }); if ((URI.isUri(castedIcon.light) || isUriComponents(castedIcon.light)) && (URI.isUri(castedIcon.dark) || isUriComponents(castedIcon.dark)) && (URI.isUri(castedIconTwo.light) || isUriComponents(castedIconTwo.light)) && (URI.isUri(castedIconTwo.dark) || isUriComponents(castedIconTwo.dark))) { return castedIcon.light.path === castedIconTwo.light.path && castedIcon.dark.path === castedIconTwo.dark.path; } } if ((URI.isUri(iconOne) && URI.isUri(iconTwo)) || (isUriComponents(iconOne) || isUriComponents(iconTwo))) { - const castedIcon = (iconOne as { scheme: unknown, path: unknown }); - const castedIconTwo = (iconTwo as { scheme: unknown, path: unknown }); + const castedIcon = (iconOne as { scheme: unknown; path: unknown }); + const castedIconTwo = (iconTwo as { scheme: unknown; path: unknown }); return castedIcon.path === castedIconTwo.path && castedIcon.scheme === castedIconTwo.scheme; } diff --git a/src/vs/platform/terminal/node/ptyHostService.ts b/src/vs/platform/terminal/node/ptyHostService.ts index e64e1f5ec2e..911f3257aaf 100644 --- a/src/vs/platform/terminal/node/ptyHostService.ts +++ b/src/vs/platform/terminal/node/ptyHostService.ts @@ -12,10 +12,9 @@ import { Client, IIPCOptions } from 'vs/base/parts/ipc/node/ipc.cp'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; import { parsePtyHostPort } from 'vs/platform/environment/common/environmentService'; -import { getResolvedShellEnv } from 'vs/platform/environment/node/shellEnv'; +import { getResolvedShellEnv } from 'vs/platform/terminal/node/shellEnv'; import { ILogService } from 'vs/platform/log/common/log'; import { LogLevelChannelClient } from 'vs/platform/log/common/logIpc'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { RequestStore } from 'vs/platform/terminal/common/requestStore'; import { HeartbeatConstants, IHeartbeatService, IProcessDataEvent, IPtyService, IReconnectConstants, IRequestResolveVariablesEvent, IShellLaunchConfig, ITerminalLaunchError, ITerminalProfile, ITerminalsLayoutInfo, TerminalIcon, TerminalIpcChannels, IProcessProperty, TitleEventSource, ProcessPropertyType, IProcessPropertyMap, TerminalSettingId, ISerializedTerminalState } from 'vs/platform/terminal/common/terminal'; import { registerTerminalPlatformConfiguration } from 'vs/platform/terminal/common/terminalPlatformConfiguration'; @@ -44,7 +43,7 @@ export class PtyHostService extends Disposable implements IPtyService { private _proxy: IPtyService; private readonly _shellEnv: Promise; - private readonly _resolveVariablesRequestStore: RequestStore; + private readonly _resolveVariablesRequestStore: RequestStore; private _restartCount = 0; private _isResponsive = true; private _isDisposed = false; @@ -62,19 +61,19 @@ export class PtyHostService extends Disposable implements IPtyService { private readonly _onPtyHostRequestResolveVariables = this._register(new Emitter()); readonly onPtyHostRequestResolveVariables = this._onPtyHostRequestResolveVariables.event; - private readonly _onProcessData = this._register(new Emitter<{ id: number, event: IProcessDataEvent | string }>()); + private readonly _onProcessData = this._register(new Emitter<{ id: number; event: IProcessDataEvent | string }>()); readonly onProcessData = this._onProcessData.event; - private readonly _onProcessReady = this._register(new Emitter<{ id: number, event: { pid: number, cwd: string } }>()); + private readonly _onProcessReady = this._register(new Emitter<{ id: number; event: { pid: number; cwd: string } }>()); readonly onProcessReady = this._onProcessReady.event; - private readonly _onProcessReplay = this._register(new Emitter<{ id: number, event: IPtyHostProcessReplayEvent }>()); + private readonly _onProcessReplay = this._register(new Emitter<{ id: number; event: IPtyHostProcessReplayEvent }>()); readonly onProcessReplay = this._onProcessReplay.event; private readonly _onProcessOrphanQuestion = this._register(new Emitter<{ id: number }>()); readonly onProcessOrphanQuestion = this._onProcessOrphanQuestion.event; - private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number, workspaceId: string, instanceId: number }>()); + private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number; workspaceId: string; instanceId: number }>()); readonly onDidRequestDetach = this._onDidRequestDetach.event; - private readonly _onDidChangeProperty = this._register(new Emitter<{ id: number, property: IProcessProperty }>()); + private readonly _onDidChangeProperty = this._register(new Emitter<{ id: number; property: IProcessProperty }>()); readonly onDidChangeProperty = this._onDidChangeProperty.event; - private readonly _onProcessExit = this._register(new Emitter<{ id: number, event: number | undefined }>()); + private readonly _onProcessExit = this._register(new Emitter<{ id: number; event: number | undefined }>()); readonly onProcessExit = this._onProcessExit.event; constructor( @@ -82,7 +81,6 @@ export class PtyHostService extends Disposable implements IPtyService { @IConfigurationService private readonly _configurationService: IConfigurationService, @IEnvironmentService private readonly _environmentService: INativeEnvironmentService, @ILogService private readonly _logService: ILogService, - @ITelemetryService private readonly _telemetryService: ITelemetryService ) { super(); @@ -166,10 +164,6 @@ export class PtyHostService extends Disposable implements IPtyService { // Handle exit this._register(client.onDidProcessExit(e => { - /* __GDPR__ - "ptyHost/exit" : {} - */ - this._telemetryService.publicLog('ptyHost/exit'); this._onPtyHostExit.fire(e.code); if (!this._isDisposed) { if (this._restartCount <= Constants.MaxRestarts) { @@ -322,10 +316,6 @@ export class PtyHostService extends Disposable implements IPtyService { } async restartPtyHost(): Promise { - /* __GDPR__ - "ptyHost/restart" : {} - */ - this._telemetryService.publicLog('ptyHost/restart'); this._isResponsive = true; this._disposePtyHost(); [this._client, this._proxy] = this._startPtyHost(); @@ -340,10 +330,6 @@ export class PtyHostService extends Disposable implements IPtyService { this._clearHeartbeatTimeouts(); this._heartbeatFirstTimeout = setTimeout(() => this._handleHeartbeatFirstTimeout(), HeartbeatConstants.BeatInterval * HeartbeatConstants.FirstWaitMultiplier); if (!this._isResponsive) { - /* __GDPR__ - "ptyHost/responsive" : {} - */ - this._telemetryService.publicLog('ptyHost/responsive'); this._isResponsive = true; } this._onPtyHostResponsive.fire(); @@ -359,10 +345,6 @@ export class PtyHostService extends Disposable implements IPtyService { this._logService.error(`No ptyHost heartbeat after ${(HeartbeatConstants.BeatInterval * HeartbeatConstants.FirstWaitMultiplier + HeartbeatConstants.BeatInterval * HeartbeatConstants.FirstWaitMultiplier) / 1000} seconds`); this._heartbeatSecondTimeout = undefined; if (this._isResponsive) { - /* __GDPR__ - "ptyHost/responsive" : {} - */ - this._telemetryService.publicLog('ptyHost/unresponsive'); this._isResponsive = false; } this._onPtyHostUnresponsive.fire(); @@ -371,10 +353,6 @@ export class PtyHostService extends Disposable implements IPtyService { private _handleUnresponsiveCreateProcess() { this._clearHeartbeatTimeouts(); this._logService.error(`No ptyHost response to createProcess after ${HeartbeatConstants.CreateProcessTimeout / 1000} seconds`); - /* __GDPR__ - "ptyHost/responsive" : {} - */ - this._telemetryService.publicLog('ptyHost/responsive'); this._onPtyHostUnresponsive.fire(); } diff --git a/src/vs/platform/terminal/node/ptyService.ts b/src/vs/platform/terminal/node/ptyService.ts index ad34064144c..874a0184c81 100644 --- a/src/vs/platform/terminal/node/ptyService.ts +++ b/src/vs/platform/terminal/node/ptyService.ts @@ -35,26 +35,26 @@ export class PtyService extends Disposable implements IPtyService { private readonly _ptys: Map = new Map(); private readonly _workspaceLayoutInfos = new Map(); - private readonly _detachInstanceRequestStore: RequestStore; - private readonly _revivedPtyIdMap: Map = new Map(); + private readonly _detachInstanceRequestStore: RequestStore; + private readonly _revivedPtyIdMap: Map = new Map(); private readonly _autoReplies: Map = new Map(); private readonly _onHeartbeat = this._register(new Emitter()); readonly onHeartbeat = this._onHeartbeat.event; - private readonly _onProcessData = this._register(new Emitter<{ id: number, event: IProcessDataEvent | string }>()); + private readonly _onProcessData = this._register(new Emitter<{ id: number; event: IProcessDataEvent | string }>()); readonly onProcessData = this._onProcessData.event; - private readonly _onProcessReplay = this._register(new Emitter<{ id: number, event: IPtyHostProcessReplayEvent }>()); + private readonly _onProcessReplay = this._register(new Emitter<{ id: number; event: IPtyHostProcessReplayEvent }>()); readonly onProcessReplay = this._onProcessReplay.event; - private readonly _onProcessReady = this._register(new Emitter<{ id: number, event: { pid: number, cwd: string } }>()); + private readonly _onProcessReady = this._register(new Emitter<{ id: number; event: { pid: number; cwd: string } }>()); readonly onProcessReady = this._onProcessReady.event; - private readonly _onProcessExit = this._register(new Emitter<{ id: number, event: number | undefined }>()); + private readonly _onProcessExit = this._register(new Emitter<{ id: number; event: number | undefined }>()); readonly onProcessExit = this._onProcessExit.event; private readonly _onProcessOrphanQuestion = this._register(new Emitter<{ id: number }>()); readonly onProcessOrphanQuestion = this._onProcessOrphanQuestion.event; - private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number, workspaceId: string, instanceId: number }>()); + private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number; workspaceId: string; instanceId: number }>()); readonly onDidRequestDetach = this._onDidRequestDetach.event; - private readonly _onDidChangeProperty = this._register(new Emitter<{ id: number, property: IProcessProperty }>()); + private readonly _onDidChangeProperty = this._register(new Emitter<{ id: number; property: IProcessProperty }>()); readonly onDidChangeProperty = this._onDidChangeProperty.event; constructor( @@ -218,7 +218,7 @@ export class PtyService extends Disposable implements IPtyService { this._throwIfNoPty(id).setTitle(title, titleSource); } - async updateIcon(id: number, icon: URI | { light: URI; dark: URI } | { id: string, color?: { id: string } }, color?: string): Promise { + async updateIcon(id: number, icon: URI | { light: URI; dark: URI } | { id: string; color?: { id: string } }, color?: string): Promise { this._throwIfNoPty(id).setIcon(icon, color); } @@ -399,7 +399,7 @@ export class PtyService extends Disposable implements IPtyService { private _throwIfNoPty(id: number): PersistentTerminalProcess { const pty = this._ptys.get(id); if (!pty) { - throw new Error(`Could not find pty with id "${id}"`); + throw new Error(`Could not find pty on pty host`); } return pty; } @@ -410,7 +410,7 @@ export class PersistentTerminalProcess extends Disposable { private readonly _bufferer: TerminalDataBufferer; private readonly _autoReplies: Map = new Map(); - private readonly _pendingCommands = new Map void; reject: (err: any) => void; }>(); + private readonly _pendingCommands = new Map void; reject: (err: any) => void }>(); private _isStarted: boolean = false; private _hasWrittenData: boolean = false; diff --git a/src/vs/platform/environment/node/shellEnv.ts b/src/vs/platform/terminal/node/shellEnv.ts similarity index 100% rename from src/vs/platform/environment/node/shellEnv.ts rename to src/vs/platform/terminal/node/shellEnv.ts diff --git a/src/vs/platform/terminal/node/terminalProcess.ts b/src/vs/platform/terminal/node/terminalProcess.ts index 8c37020f6b5..b30e5c07374 100644 --- a/src/vs/platform/terminal/node/terminalProcess.ts +++ b/src/vs/platform/terminal/node/terminalProcess.ts @@ -68,8 +68,8 @@ const enum Constants { } interface IWriteObject { - data: string, - isBinary: boolean + data: string; + isBinary: boolean; } export class TerminalProcess extends Disposable implements ITerminalChildProcess { @@ -149,7 +149,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess name, cwd, // TODO: When node-pty is updated this cast can be removed - env: env as { [key: string]: string; }, + env: env as { [key: string]: string }, cols, rows, useConpty, @@ -565,8 +565,8 @@ class DelayedResizer extends Disposable { cols: number | undefined; private _timeout: NodeJS.Timeout; - private readonly _onTrigger = this._register(new Emitter<{ rows?: number, cols?: number }>()); - get onTrigger(): Event<{ rows?: number, cols?: number }> { return this._onTrigger.event; } + private readonly _onTrigger = this._register(new Emitter<{ rows?: number; cols?: number }>()); + get onTrigger(): Event<{ rows?: number; cols?: number }> { return this._onTrigger.event; } constructor() { super(); diff --git a/src/vs/platform/terminal/node/terminalProfiles.ts b/src/vs/platform/terminal/node/terminalProfiles.ts index dce492a549b..2c44f2358a6 100644 --- a/src/vs/platform/terminal/node/terminalProfiles.ts +++ b/src/vs/platform/terminal/node/terminalProfiles.ts @@ -154,7 +154,7 @@ async function transformToTerminalProfiles( if (profile === null) { continue; } let originalPaths: string[]; let args: string[] | string | undefined; - let icon: ThemeIcon | URI | { light: URI, dark: URI } | undefined = undefined; + let icon: ThemeIcon | URI | { light: URI; dark: URI } | undefined = undefined; if ('source' in profile) { const source = profileSources?.get(profile.source); if (!source) { @@ -367,7 +367,7 @@ async function validateProfilePaths(profileName: string, defaultProfileName: str } export interface IFsProvider { - existsFile(path: string): Promise, + existsFile(path: string): Promise; readFile(path: string): Promise; } @@ -379,7 +379,7 @@ interface IPotentialTerminalProfile { profileName: string; paths: string[]; args?: string[]; - icon?: ThemeIcon | URI | { light: URI, dark: URI }; + icon?: ThemeIcon | URI | { light: URI; dark: URI }; } export type IUnresolvedTerminalProfile = ITerminalExecutable | ITerminalProfileSource | null; diff --git a/src/vs/platform/terminal/test/common/requestStore.test.ts b/src/vs/platform/terminal/test/common/requestStore.test.ts index 369e32adeb5..4c6d04adefa 100644 --- a/src/vs/platform/terminal/test/common/requestStore.test.ts +++ b/src/vs/platform/terminal/test/common/requestStore.test.ts @@ -18,7 +18,7 @@ suite('RequestStore', () => { test('should resolve requests', async () => { const store: RequestStore<{ data: string }, { arg: string }> = instantiationService.createInstance(RequestStore, undefined); - let eventArgs: { requestId: number, arg: string } | undefined; + let eventArgs: { requestId: number; arg: string } | undefined; store.onCreateRequest(e => eventArgs = e); const request = store.createRequest({ arg: 'foo' }); strictEqual(typeof eventArgs?.requestId, 'number'); diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index fce3fed88f6..75f4eb771a9 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -50,7 +50,7 @@ export type ColorTransform = | { op: ColorTransformType.Transparent; value: ColorValue; factor: number } | { op: ColorTransformType.OneOf; values: readonly ColorValue[] } | { op: ColorTransformType.LessProminent; value: ColorValue; background: ColorValue; factor: number; transparency: number } - | { op: ColorTransformType.IfDefinedThenElse; if: ColorIdentifier; then: ColorValue, else: ColorValue }; + | { op: ColorTransformType.IfDefinedThenElse; if: ColorIdentifier; then: ColorValue; else: ColorValue }; export interface ColorDefaults { light: ColorValue | null; @@ -114,7 +114,7 @@ class ColorRegistry implements IColorRegistry { private colorsById: { [key: string]: ColorContribution }; private colorSchema: IJSONSchema & { properties: IJSONSchemaMap } = { type: 'object', properties: {} }; - private colorReferenceSchema: IJSONSchema & { enum: string[], enumDescriptions: string[] } = { type: 'string', enum: [], enumDescriptions: [] }; + private colorReferenceSchema: IJSONSchema & { enum: string[]; enumDescriptions: string[] } = { type: 'string', enum: [], enumDescriptions: [] }; constructor() { this.colorsById = {}; @@ -499,7 +499,6 @@ export const overviewRulerFindMatchForeground = registerColor('editorOverviewRul export const overviewRulerSelectionHighlightForeground = registerColor('editorOverviewRuler.selectionHighlightForeground', { dark: '#A0A0A0CC', light: '#A0A0A0CC', hc: '#A0A0A0CC' }, nls.localize('overviewRulerSelectionHighlightForeground', 'Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.'), true); -export const overviewRulerUnicodeHighlightForeground = registerColor('editorOverviewRuler.unicodeForeground', { dark: '#d186167e', light: '#d186167e', hc: '#AB5A00' }, nls.localize('overviewRulerUnicodeForeground', 'Overview ruler marker color for highlighted unicode characters. The color must not be opaque so as not to hide underlying decorations.'), true); export const minimapFindMatch = registerColor('minimap.findMatchHighlight', { light: '#d18616', dark: '#d18616', hc: '#AB5A00' }, nls.localize('minimapFindMatchHighlight', 'Minimap marker color for find matches.'), true); export const minimapSelectionOccurrenceHighlight = registerColor('minimap.selectionOccurrenceHighlight', { light: '#c9c9c9', dark: '#676767', hc: '#ffffff' }, nls.localize('minimapSelectionOccurrenceHighlight', 'Minimap marker color for repeating editor selections.'), true); @@ -508,7 +507,6 @@ export const minimapError = registerColor('minimap.errorHighlight', { dark: new export const minimapWarning = registerColor('minimap.warningHighlight', { dark: editorWarningForeground, light: editorWarningForeground, hc: editorWarningBorder }, nls.localize('overviewRuleWarning', 'Minimap marker color for warnings.')); export const minimapBackground = registerColor('minimap.background', { dark: null, light: null, hc: null }, nls.localize('minimapBackground', "Minimap background color.")); export const minimapForegroundOpacity = registerColor('minimap.foregroundOpacity', { dark: Color.fromHex('#000f'), light: Color.fromHex('#000f'), hc: Color.fromHex('#000f') }, nls.localize('minimapForegroundOpacity', 'Opacity of foreground elements rendered in the minimap. For example, "#000000c0" will render the elements with 75% opacity.')); -export const minimapUnicodeHighlight = registerColor('minimap.unicodeHighlight', { light: '#d18616', dark: '#d18616', hc: '#AB5A00' }, nls.localize('minimapUnicodeHighlight', 'Minimap marker color for highlighted unicode characters.')); export const minimapSliderBackground = registerColor('minimapSlider.background', { light: transparent(scrollbarSliderBackground, 0.5), dark: transparent(scrollbarSliderBackground, 0.5), hc: transparent(scrollbarSliderBackground, 0.5) }, nls.localize('minimapSliderBackground', "Minimap slider background color.")); export const minimapSliderHoverBackground = registerColor('minimapSlider.hoverBackground', { light: transparent(scrollbarSliderHoverBackground, 0.5), dark: transparent(scrollbarSliderHoverBackground, 0.5), hc: transparent(scrollbarSliderHoverBackground, 0.5) }, nls.localize('minimapSliderHoverBackground', "Minimap slider background color when hovering.")); diff --git a/src/vs/platform/theme/common/iconRegistry.ts b/src/vs/platform/theme/common/iconRegistry.ts index 05ef97f1e8a..be499ee32fb 100644 --- a/src/vs/platform/theme/common/iconRegistry.ts +++ b/src/vs/platform/theme/common/iconRegistry.ts @@ -63,7 +63,7 @@ export interface IconFontDefinition { } export interface IconFontSource { - readonly location: URI, + readonly location: URI; readonly format: string; } @@ -133,8 +133,8 @@ class IconRegistry implements IIconRegistry { icons: { type: 'object', properties: { - fontId: { type: 'string', description: localize('iconDefintion.fontId', 'The id of the font to use. If not set, the font that is defined first is used.') }, - fontCharacter: { type: 'string', description: localize('iconDefintion.fontCharacter', 'The font character associated with the icon definition.') } + fontId: { type: 'string', description: localize('iconDefinition.fontId', 'The id of the font to use. If not set, the font that is defined first is used.') }, + fontCharacter: { type: 'string', description: localize('iconDefinition.fontCharacter', 'The font character associated with the icon definition.') } }, additionalProperties: false, defaultSnippets: [{ body: { fontCharacter: '\\\\e030' } }] @@ -143,7 +143,7 @@ class IconRegistry implements IIconRegistry { type: 'object', properties: {} }; - private iconReferenceSchema: IJSONSchema & { enum: string[], enumDescriptions: string[] } = { type: 'string', pattern: `^${CSSIcon.iconNameExpression}$`, enum: [], enumDescriptions: [] }; + private iconReferenceSchema: IJSONSchema & { enum: string[]; enumDescriptions: string[] } = { type: 'string', pattern: `^${CSSIcon.iconNameExpression}$`, enum: [], enumDescriptions: [] }; private iconFontsById: { [key: string]: IconFontDefinition }; diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index 691ff19c4ec..e606f3dac6c 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -273,3 +273,28 @@ export class Themable extends Disposable { return color ? color.toString() : null; } } + +export interface IPartsSplash { + baseTheme: string; + colorInfo: { + background: string; + foreground: string | undefined; + editorBackground: string | undefined; + titleBarBackground: string | undefined; + activityBarBackground: string | undefined; + sideBarBackground: string | undefined; + statusBarBackground: string | undefined; + statusBarNoFolderBackground: string | undefined; + windowBorder: string | undefined; + }; + layoutInfo: { + sideBarSide: string; + editorPartMinWidth: number; + titleBarHeight: number; + activityBarWidth: number; + sideBarWidth: number; + statusBarHeight: number; + windowBorder: boolean; + windowBorderRadius: string | undefined; + } | undefined; +} diff --git a/src/vs/platform/theme/common/tokenClassificationRegistry.ts b/src/vs/platform/theme/common/tokenClassificationRegistry.ts index b171d0186a4..dad1375e27b 100644 --- a/src/vs/platform/theme/common/tokenClassificationRegistry.ts +++ b/src/vs/platform/theme/common/tokenClassificationRegistry.ts @@ -97,7 +97,7 @@ export namespace TokenStyle { export function is(s: any): s is TokenStyle { return s instanceof TokenStyle; } - export function fromData(data: { foreground: Color | undefined, bold: boolean | undefined, underline: boolean | undefined, strikethrough: boolean | undefined, italic: boolean | undefined }): TokenStyle { + export function fromData(data: { foreground: Color | undefined; bold: boolean | undefined; underline: boolean | undefined; strikethrough: boolean | undefined; italic: boolean | undefined }): TokenStyle { return new TokenStyle(data.foreground, data.bold, data.underline, data.strikethrough, data.italic); } export function fromSettings(foreground: string | undefined, fontStyle: string | undefined): TokenStyle; @@ -275,7 +275,7 @@ class TokenClassificationRegistry implements ITokenClassificationRegistry { private typeHierarchy: { [id: string]: string[] }; - private tokenStylingSchema: IJSONSchema & { properties: IJSONSchemaMap, patternProperties: IJSONSchemaMap } = { + private tokenStylingSchema: IJSONSchema & { properties: IJSONSchemaMap; patternProperties: IJSONSchemaMap } = { type: 'object', properties: {}, patternProperties: { @@ -488,9 +488,9 @@ class TokenClassificationRegistry implements ITokenClassificationRegistry { const CHAR_LANGUAGE = TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR.charCodeAt(0); const CHAR_MODIFIER = CLASSIFIER_MODIFIER_SEPARATOR.charCodeAt(0); -export function parseClassifierString(s: string, defaultLanguage: string): { type: string, modifiers: string[], language: string; }; -export function parseClassifierString(s: string, defaultLanguage?: string): { type: string, modifiers: string[], language: string | undefined; }; -export function parseClassifierString(s: string, defaultLanguage: string | undefined): { type: string, modifiers: string[], language: string | undefined; } { +export function parseClassifierString(s: string, defaultLanguage: string): { type: string; modifiers: string[]; language: string }; +export function parseClassifierString(s: string, defaultLanguage?: string): { type: string; modifiers: string[]; language: string | undefined }; +export function parseClassifierString(s: string, defaultLanguage: string | undefined): { type: string; modifiers: string[]; language: string | undefined } { let k = s.length; let language: string | undefined = defaultLanguage; const modifiers = []; diff --git a/src/vs/platform/theme/electron-main/themeMainService.ts b/src/vs/platform/theme/electron-main/themeMainService.ts index f16ccd82cee..b9dfdff4761 100644 --- a/src/vs/platform/theme/electron-main/themeMainService.ts +++ b/src/vs/platform/theme/electron-main/themeMainService.ts @@ -7,7 +7,7 @@ import { BrowserWindow, nativeTheme } from 'electron'; import { isMacintosh, isWindows } from 'vs/base/common/platform'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IStateMainService } from 'vs/platform/state/electron-main/state'; -import { IPartsSplash } from 'vs/platform/windows/common/windows'; +import { IPartsSplash } from 'vs/platform/theme/common/themeService'; const DEFAULT_BG_LIGHT = '#FFFFFF'; const DEFAULT_BG_DARK = '#1E1E1E'; diff --git a/src/vs/platform/theme/test/common/testThemeService.ts b/src/vs/platform/theme/test/common/testThemeService.ts index 4e317bbe7cf..6655be6e360 100644 --- a/src/vs/platform/theme/test/common/testThemeService.ts +++ b/src/vs/platform/theme/test/common/testThemeService.ts @@ -14,7 +14,7 @@ export class TestColorTheme implements IColorTheme { public readonly label = 'test'; constructor( - private colors: { [id: string]: string; } = {}, + private colors: { [id: string]: string } = {}, public type = ColorScheme.DARK, public readonly semanticHighlighting = false ) { } diff --git a/src/vs/platform/remote/common/tunnel.ts b/src/vs/platform/tunnel/common/tunnel.ts similarity index 95% rename from src/vs/platform/remote/common/tunnel.ts rename to src/vs/platform/tunnel/common/tunnel.ts index adb97ae8cf2..c50a1195d3e 100644 --- a/src/vs/platform/remote/common/tunnel.ts +++ b/src/vs/platform/tunnel/common/tunnel.ts @@ -11,6 +11,7 @@ import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection'; +import { TunnelPrivacy } from 'vs/platform/remote/common/remoteAuthorityResolver'; export const ITunnelService = createDecorator('tunnelService'); export const ISharedTunnelsService = createDecorator('sharedTunnelsService'); @@ -26,7 +27,7 @@ export interface RemoteTunnel { } export interface TunnelOptions { - remoteAddress: { port: number, host: string; }; + remoteAddress: { port: number; host: string }; localAddressPort?: number; label?: string; public?: boolean; @@ -49,12 +50,6 @@ export interface TunnelCreationOptions { elevationRequired?: boolean; } -export interface TunnelPrivacy { - themeIcon: string; - id: string; - label: string; -} - export interface TunnelProviderFeatures { elevation: boolean; /** @@ -87,7 +82,7 @@ export interface PortAttributesProvider { } export interface ITunnel { - remoteAddress: { port: number, host: string }; + remoteAddress: { port: number; host: string }; /** * The complete local address(ex. localhost:1234) @@ -124,7 +119,7 @@ export interface ITunnelService { readonly canChangePrivacy: boolean; readonly privacyOptions: TunnelPrivacy[]; readonly onTunnelOpened: Event; - readonly onTunnelClosed: Event<{ host: string, port: number; }>; + readonly onTunnelClosed: Event<{ host: string; port: number }>; readonly canElevate: boolean; readonly hasTunnelProvider: boolean; readonly onAddedTunnelProvider: Event; @@ -136,7 +131,7 @@ export interface ITunnelService { setTunnelFeatures(features: TunnelProviderFeatures): void; } -export function extractLocalHostUriMetaDataForPortMapping(uri: URI): { address: string, port: number; } | undefined { +export function extractLocalHostUriMetaDataForPortMapping(uri: URI): { address: string; port: number } | undefined { if (uri.scheme !== 'http' && uri.scheme !== 'https') { return undefined; } @@ -173,11 +168,11 @@ export abstract class AbstractTunnelService implements ITunnelService { private _onTunnelOpened: Emitter = new Emitter(); public onTunnelOpened: Event = this._onTunnelOpened.event; - private _onTunnelClosed: Emitter<{ host: string, port: number; }> = new Emitter(); - public onTunnelClosed: Event<{ host: string, port: number; }> = this._onTunnelClosed.event; + private _onTunnelClosed: Emitter<{ host: string; port: number }> = new Emitter(); + public onTunnelClosed: Event<{ host: string; port: number }> = this._onTunnelClosed.event; private _onAddedTunnelProvider: Emitter = new Emitter(); public onAddedTunnelProvider: Event = this._onAddedTunnelProvider.event; - protected readonly _tunnels = new Map; }>>(); + protected readonly _tunnels = new Map }>>(); protected _tunnelProvider: ITunnelProvider | undefined; protected _canElevate: boolean = false; private _privacyOptions: TunnelPrivacy[] = []; @@ -312,7 +307,7 @@ export abstract class AbstractTunnelService implements ITunnelService { }; } - private async tryDisposeTunnel(remoteHost: string, remotePort: number, tunnel: { refcount: number, readonly value: Promise }): Promise { + private async tryDisposeTunnel(remoteHost: string, remotePort: number, tunnel: { refcount: number; readonly value: Promise }): Promise { if (tunnel.refcount <= 0) { this.logService.trace(`ForwardedPorts: (TunnelService) Tunnel is being disposed ${remoteHost}:${remotePort}.`); const disposePromise: Promise = tunnel.value.then(async (tunnel) => { @@ -359,7 +354,7 @@ export abstract class AbstractTunnelService implements ITunnelService { } } - protected getTunnelFromMap(remoteHost: string, remotePort: number): { refcount: number, readonly value: Promise } | undefined { + protected getTunnelFromMap(remoteHost: string, remotePort: number): { refcount: number; readonly value: Promise } | undefined { let hosts = [remoteHost]; // Order matters. We want the original host to be first. if (isLocalhost(remoteHost)) { diff --git a/src/vs/platform/remote/node/sharedProcessTunnelService.ts b/src/vs/platform/tunnel/node/sharedProcessTunnelService.ts similarity index 99% rename from src/vs/platform/remote/node/sharedProcessTunnelService.ts rename to src/vs/platform/tunnel/node/sharedProcessTunnelService.ts index fa7975c1891..ddea6ea6cdf 100644 --- a/src/vs/platform/remote/node/sharedProcessTunnelService.ts +++ b/src/vs/platform/tunnel/node/sharedProcessTunnelService.ts @@ -5,7 +5,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { ISharedProcessTunnel, ISharedProcessTunnelService } from 'vs/platform/remote/common/sharedProcessTunnelService'; -import { ISharedTunnelsService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; +import { ISharedTunnelsService, RemoteTunnel } from 'vs/platform/tunnel/common/tunnel'; import { IAddress, IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection'; import { Disposable } from 'vs/base/common/lifecycle'; import { canceled } from 'vs/base/common/errors'; diff --git a/src/vs/platform/remote/node/tunnelService.ts b/src/vs/platform/tunnel/node/tunnelService.ts similarity index 94% rename from src/vs/platform/remote/node/tunnelService.ts rename to src/vs/platform/tunnel/node/tunnelService.ts index 322b743d2c9..d5ace0bcdf0 100644 --- a/src/vs/platform/remote/node/tunnelService.ts +++ b/src/vs/platform/tunnel/node/tunnelService.ts @@ -14,7 +14,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; import { connectRemoteAgentTunnel, IAddressProvider, IConnectionOptions, ISocketFactory } from 'vs/platform/remote/common/remoteAgentConnection'; -import { AbstractTunnelService, isAllInterfaces, ISharedTunnelsService as ISharedTunnelsService, isLocalhost, ITunnelService, RemoteTunnel, TunnelPrivacyId } from 'vs/platform/remote/common/tunnel'; +import { AbstractTunnelService, isAllInterfaces, ISharedTunnelsService as ISharedTunnelsService, isLocalhost, ITunnelService, RemoteTunnel, TunnelPrivacyId } from 'vs/platform/tunnel/common/tunnel'; import { ISignService } from 'vs/platform/sign/common/sign'; async function createRemoteTunnel(options: IConnectionOptions, defaultTunnelHost: string, tunnelRemoteHost: string, tunnelRemotePort: number, tunnelLocalPort?: number): Promise { @@ -120,12 +120,16 @@ class NodeRemoteTunnel extends Disposable implements RemoteTunnel { } localSocket.on('end', () => { - this._socketsDispose.delete(localSocket.localAddress); + if (localSocket.localAddress) { + this._socketsDispose.delete(localSocket.localAddress); + } remoteSocket.end(); }); localSocket.on('close', () => remoteSocket.end()); localSocket.on('error', () => { - this._socketsDispose.delete(localSocket.localAddress); + if (localSocket.localAddress) { + this._socketsDispose.delete(localSocket.localAddress); + } remoteSocket.destroy(); }); @@ -137,11 +141,13 @@ class NodeRemoteTunnel extends Disposable implements RemoteTunnel { localSocket.pipe(remoteSocket); remoteSocket.pipe(localSocket); - this._socketsDispose.set(localSocket.localAddress, () => { - // Need to end instead of unpipe, otherwise whatever is connected locally could end up "stuck" with whatever state it had until manually exited. - localSocket.end(); - remoteSocket.end(); - }); + if (localSocket.localAddress) { + this._socketsDispose.set(localSocket.localAddress, () => { + // Need to end instead of unpipe, otherwise whatever is connected locally could end up "stuck" with whatever state it had until manually exited. + localSocket.end(); + remoteSocket.end(); + }); + } } } diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index ee51c466b0a..1dc749a9226 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -156,7 +156,7 @@ class WorkspaceStackElement { this.invalidatedResources = null; } - public canSplit(): this is WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[]; } } { + public canSplit(): this is WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[] } } { return (typeof this.actual.split === 'function'); } @@ -564,7 +564,7 @@ export class UndoRedoService implements IUndoRedoService { return null; } - private _splitPastWorkspaceElement(toRemove: WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[]; } }, ignoreResources: RemovedResources | null): void { + private _splitPastWorkspaceElement(toRemove: WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[] } }, ignoreResources: RemovedResources | null): void { const individualArr = toRemove.actual.split(); const individualMap = new Map(); for (const _element of individualArr) { @@ -583,7 +583,7 @@ export class UndoRedoService implements IUndoRedoService { } } - private _splitFutureWorkspaceElement(toRemove: WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[]; } }, ignoreResources: RemovedResources | null): void { + private _splitFutureWorkspaceElement(toRemove: WorkspaceStackElement & { actual: { split(): IResourceUndoRedoElement[] } }, ignoreResources: RemovedResources | null): void { const individualArr = toRemove.actual.split(); const individualMap = new Map(); for (const _element of individualArr) { @@ -1110,7 +1110,7 @@ export class UndoRedoService implements IUndoRedoService { nls.localize('confirmDifferentSource', "Would you like to undo '{0}'?", element.label), [ nls.localize('confirmDifferentSource.yes', "Yes"), - nls.localize('cancel', "Cancel"), + nls.localize('confirmDifferentSource.no', "No"), ], { cancelId: 1 diff --git a/src/vs/platform/update/common/update.ts b/src/vs/platform/update/common/update.ts index ae027c2109a..9d8a09a7e89 100644 --- a/src/vs/platform/update/common/update.ts +++ b/src/vs/platform/update/common/update.ts @@ -50,13 +50,13 @@ export const enum UpdateType { } export type Uninitialized = { type: StateType.Uninitialized }; -export type Idle = { type: StateType.Idle, updateType: UpdateType, error?: string }; -export type CheckingForUpdates = { type: StateType.CheckingForUpdates, explicit: boolean }; -export type AvailableForDownload = { type: StateType.AvailableForDownload, update: IUpdate }; -export type Downloading = { type: StateType.Downloading, update: IUpdate }; -export type Downloaded = { type: StateType.Downloaded, update: IUpdate }; -export type Updating = { type: StateType.Updating, update: IUpdate }; -export type Ready = { type: StateType.Ready, update: IUpdate }; +export type Idle = { type: StateType.Idle; updateType: UpdateType; error?: string }; +export type CheckingForUpdates = { type: StateType.CheckingForUpdates; explicit: boolean }; +export type AvailableForDownload = { type: StateType.AvailableForDownload; update: IUpdate }; +export type Downloading = { type: StateType.Downloading; update: IUpdate }; +export type Downloaded = { type: StateType.Downloaded; update: IUpdate }; +export type Updating = { type: StateType.Updating; update: IUpdate }; +export type Ready = { type: StateType.Ready; update: IUpdate }; export type State = Uninitialized | Idle | CheckingForUpdates | AvailableForDownload | Downloading | Downloaded | Updating | Ready; diff --git a/src/vs/platform/update/electron-main/abstractUpdateService.ts b/src/vs/platform/update/electron-main/abstractUpdateService.ts index e0696f7bfaf..5adf20c74e4 100644 --- a/src/vs/platform/update/electron-main/abstractUpdateService.ts +++ b/src/vs/platform/update/electron-main/abstractUpdateService.ts @@ -19,7 +19,7 @@ export function createUpdateURL(platform: string, quality: string, productServic } export type UpdateNotAvailableClassification = { - explicit: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + explicit: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; export abstract class AbstractUpdateService implements IUpdateService { diff --git a/src/vs/platform/update/electron-main/updateService.darwin.ts b/src/vs/platform/update/electron-main/updateService.darwin.ts index de874dc75f5..0c008ea8504 100644 --- a/src/vs/platform/update/electron-main/updateService.darwin.ts +++ b/src/vs/platform/update/electron-main/updateService.darwin.ts @@ -92,7 +92,7 @@ export class DarwinUpdateService extends AbstractUpdateService { } type UpdateDownloadedClassification = { - version: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + version: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; this.telemetryService.publicLog2<{ version: String }, UpdateDownloadedClassification>('update:downloaded', { version: update.version }); diff --git a/src/vs/platform/update/electron-main/updateService.win32.ts b/src/vs/platform/update/electron-main/updateService.win32.ts index c634a7225a9..781e766b7f7 100644 --- a/src/vs/platform/update/electron-main/updateService.win32.ts +++ b/src/vs/platform/update/electron-main/updateService.win32.ts @@ -73,20 +73,6 @@ export class Win32UpdateService extends AbstractUpdateService { override initialize(): void { super.initialize(); - - if (getUpdateType() === UpdateType.Setup) { - /* __GDPR__ - "update:win32SetupTarget" : { - "target" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - /* __GDPR__ - "update:winSetupTarget" : { - "target" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('update:win32SetupTarget', { target: this.productService.target }); - } } protected buildUpdateFeedUrl(quality: string): string | undefined { diff --git a/src/vs/platform/url/electron-main/electronUrlListener.ts b/src/vs/platform/url/electron-main/electronUrlListener.ts index 97ce0a05e93..521063b156c 100644 --- a/src/vs/platform/url/electron-main/electronUrlListener.ts +++ b/src/vs/platform/url/electron-main/electronUrlListener.ts @@ -34,13 +34,13 @@ function uriFromRawUrl(url: string): URI | null { */ export class ElectronURLListener { - private uris: { uri: URI, url: string }[] = []; + private uris: { uri: URI; url: string }[] = []; private retryCount = 0; private flushDisposable: IDisposable = Disposable.None; private disposables = new DisposableStore(); constructor( - initialUrisToHandle: { uri: URI, url: string }[], + initialUrisToHandle: { uri: URI; url: string }[], private readonly urlService: IURLService, windowsMainService: IWindowsMainService, environmentMainService: IEnvironmentMainService, @@ -92,7 +92,7 @@ export class ElectronURLListener { return; } - const uris: { uri: URI, url: string }[] = []; + const uris: { uri: URI; url: string }[] = []; for (const obj of this.uris) { const handled = await this.urlService.open(obj.uri, { originalUrl: obj.url }); diff --git a/src/vs/platform/userData/common/fileUserDataProvider.ts b/src/vs/platform/userData/common/fileUserDataProvider.ts index 5f37f135180..88fa1638529 100644 --- a/src/vs/platform/userData/common/fileUserDataProvider.ts +++ b/src/vs/platform/userData/common/fileUserDataProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IFileSystemProviderWithFileReadWriteCapability, IFileChange, IWatchOptions, IStat, FileOverwriteOptions, FileType, FileWriteOptions, FileDeleteOptions, FileSystemProviderCapabilities, IFileSystemProviderWithFileReadStreamCapability, FileReadStreamOptions, IFileSystemProviderWithFileAtomicReadCapability, IFileService, FileChangesEvent } from 'vs/platform/files/common/files'; +import { IFileSystemProviderWithFileReadWriteCapability, IFileChange, IWatchOptions, IStat, FileOverwriteOptions, FileType, FileWriteOptions, FileDeleteOptions, FileSystemProviderCapabilities, IFileSystemProviderWithFileReadStreamCapability, FileReadStreamOptions, IFileSystemProviderWithFileAtomicReadCapability } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import { CancellationToken } from 'vs/base/common/cancellation'; import { newWriteableStream, ReadableStreamEvents } from 'vs/base/common/stream'; @@ -34,11 +34,10 @@ export class FileUserDataProvider extends Disposable implements private readonly fileSystemScheme: string, private readonly fileSystemProvider: IFileSystemProviderWithFileReadWriteCapability & (IFileSystemProviderWithFileReadStreamCapability | IFileSystemProviderWithFileAtomicReadCapability), private readonly userDataScheme: string, - fileService: IFileService, - private readonly logService: ILogService + private readonly logService: ILogService, ) { super(); - this._register(fileService.onDidFilesChange(e => this.handleFileChanges(e))); + this._register(this.fileSystemProvider.onDidChangeFile(e => this.handleFileChanges(e))); } watch(resource: URI, opts: IWatchOptions): IDisposable { @@ -92,9 +91,9 @@ export class FileUserDataProvider extends Disposable implements return this.fileSystemProvider.delete(this.toFileSystemResource(resource), opts); } - private handleFileChanges(e: FileChangesEvent): void { + private handleFileChanges(changes: readonly IFileChange[]): void { const userDataChanges: IFileChange[] = []; - for (const change of e.rawChanges) { + for (const change of changes) { if (change.resource.scheme !== this.fileSystemScheme) { continue; // only interested in file schemes } diff --git a/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts b/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts index 7802cc25d9e..775fd04c1d3 100644 --- a/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts +++ b/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IFileService, FileChangeType, IFileChange, IFileSystemProviderWithFileReadWriteCapability, IStat, FileType, FileSystemProviderCapabilities, FileChangesEvent } from 'vs/platform/files/common/files'; +import { IFileService, FileChangeType, IFileChange, IFileSystemProviderWithFileReadWriteCapability, IStat, FileType, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { FileService } from 'vs/platform/files/common/fileService'; import { NullLogService } from 'vs/platform/log/common/log'; import { Schemas } from 'vs/base/common/network'; @@ -18,7 +18,6 @@ import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFil import { AbstractNativeEnvironmentService } from 'vs/platform/environment/common/environmentService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import product from 'vs/platform/product/common/product'; -import { isLinux } from 'vs/base/common/platform'; const ROOT = URI.file('tests').with({ scheme: 'vscode-tests' }); @@ -52,7 +51,7 @@ suite('FileUserDataProvider', () => { environmentService = new TestEnvironmentService(userDataHomeOnDisk); - fileUserDataProvider = new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new FileService(logService), logService); + fileUserDataProvider = new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, logService); disposables.add(fileUserDataProvider); disposables.add(testObject.registerProvider(Schemas.userData, fileUserDataProvider)); }); @@ -300,18 +299,6 @@ class TestFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapa } -class TestFileService extends FileService { - - private readonly _onDidFilesChange2 = this._register(new Emitter()); - override readonly onDidFilesChange = this._onDidFilesChange2.event; - - constructor(fileEventEmitter: Emitter) { - super(new NullLogService()); - - fileEventEmitter.event(changes => this._onDidFilesChange2.fire(new FileChangesEvent(changes, !isLinux))); - } -} - suite('FileUserDataProvider - Watching', () => { let testObject: FileUserDataProvider; @@ -323,8 +310,7 @@ suite('FileUserDataProvider - Watching', () => { disposables.add(fileEventEmitter); setup(() => { - const logService = new NullLogService(); - testObject = disposables.add(new FileUserDataProvider(rootFileResource.scheme, new TestFileSystemProvider(fileEventEmitter.event), Schemas.userData, new TestFileService(fileEventEmitter), logService)); + testObject = disposables.add(new FileUserDataProvider(rootFileResource.scheme, new TestFileSystemProvider(fileEventEmitter.event), Schemas.userData, new NullLogService())); }); teardown(() => disposables.clear()); diff --git a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts index 923da78af6c..cfc9a5bad3a 100644 --- a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts +++ b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts @@ -22,14 +22,14 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { FileChangesEvent, FileOperationError, FileOperationResult, IFileContent, IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; -import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; +import { getServiceMachineId } from 'vs/platform/externalServices/common/serviceMachineId'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { Change, getLastSyncResourceUri, IRemoteUserData, IResourcePreview as IBaseResourcePreview, ISyncData, ISyncResourceHandle, ISyncResourcePreview as IBaseSyncResourcePreview, IUserData, IUserDataInitializer, IUserDataManifest, IUserDataSyncBackupStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, MergeState, PREVIEW_DIR_NAME, SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_CONFIGURATION_SCOPE, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync'; type SyncSourceClassification = { - source?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + source?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; export function isSyncData(thing: any): thing is ISyncData { @@ -713,7 +713,7 @@ export abstract class AbstractSynchroniser extends Disposable implements IUserDa protected abstract hasRemoteChanged(lastSyncUserData: IRemoteUserData): Promise; abstract hasLocalData(): Promise; - abstract getAssociatedResources(syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]>; + abstract getAssociatedResources(syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]>; } export interface IFileResourcePreview extends IResourcePreview { diff --git a/src/vs/platform/userDataSync/common/extensionsMerge.ts b/src/vs/platform/userDataSync/common/extensionsMerge.ts index 5ea8f70a852..8236bb281b3 100644 --- a/src/vs/platform/userDataSync/common/extensionsMerge.ts +++ b/src/vs/platform/userDataSync/common/extensionsMerge.ts @@ -11,8 +11,8 @@ import { IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ISyncExtension, ISyncExtensionWithVersion } from 'vs/platform/userDataSync/common/userDataSync'; export interface IMergeResult { - readonly local: { added: ISyncExtension[], removed: IExtensionIdentifier[], updated: ISyncExtension[] }; - readonly remote: { added: ISyncExtension[], removed: ISyncExtension[], updated: ISyncExtension[], all: ISyncExtension[] } | null; + readonly local: { added: ISyncExtension[]; removed: IExtensionIdentifier[]; updated: ISyncExtension[] }; + readonly remote: { added: ISyncExtension[]; removed: ISyncExtension[]; updated: ISyncExtension[]; all: ISyncExtension[] } | null; } export function merge(localExtensions: ISyncExtensionWithVersion[], remoteExtensions: ISyncExtension[] | null, lastSyncExtensions: ISyncExtension[] | null, skippedExtensions: ISyncExtension[], ignoredExtensions: string[]): IMergeResult { @@ -93,9 +93,10 @@ export function merge(localExtensions: ISyncExtensionWithVersion[], remoteExtens const mergedExtension = updatedInRemote ? remoteExtension : localExtension; return { ...mergedExtension, - version: remoteExtension.version && semver.gt(remoteExtension.version, localExtension.version) ? localExtension.version : localExtension.version, + version: remoteExtension.version && (!localExtension.installed || semver.gt(remoteExtension.version, localExtension.version)) ? remoteExtension.version : localExtension.version, state: mergeExtensionState(localExtension, remoteExtension, lastSyncExtensionsMap?.get(key)), - preRelease: isUndefined(mergedExtension.preRelease) /* from older client*/ ? localExtension.preRelease : mergedExtension.preRelease + preRelease: isUndefined(mergedExtension.preRelease) /* from older client*/ ? localExtension.preRelease + : (localExtension.installed ? mergedExtension.preRelease : remoteExtension.preRelease) }; } @@ -198,7 +199,7 @@ export function merge(localExtensions: ISyncExtensionWithVersion[], remoteExtens }; } -function compare(from: Map | null, to: Map, ignoredExtensions: Set, { checkInstalledProperty, checkVersionProperty }: { checkInstalledProperty: boolean, checkVersionProperty: boolean } = { checkInstalledProperty: false, checkVersionProperty: false }): { added: Set, removed: Set, updated: Set } { +function compare(from: Map | null, to: Map, ignoredExtensions: Set, { checkInstalledProperty, checkVersionProperty }: { checkInstalledProperty: boolean; checkVersionProperty: boolean } = { checkInstalledProperty: false, checkVersionProperty: false }): { added: Set; removed: Set; updated: Set } { const fromKeys = from ? [...from.keys()].filter(key => !ignoredExtensions.has(key)) : []; const toKeys = [...to.keys()].filter(key => !ignoredExtensions.has(key)); const added = toKeys.filter(key => fromKeys.indexOf(key) === -1).reduce((r, key) => { r.add(key); return r; }, new Set()); @@ -213,7 +214,7 @@ function compare(from: Map | null, to: Map, to: IStringDictionary): { added: Set, removed: Set, updated: Set } { +function compareExtensionState(from: IStringDictionary, to: IStringDictionary): { added: Set; removed: Set; updated: Set } { const fromKeys = Object.keys(from); const toKeys = Object.keys(to); const added = toKeys.filter(key => fromKeys.indexOf(key) === -1).reduce((r, key) => { r.add(key); return r; }, new Set()); diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 43041e11c0e..d3411d42879 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -103,13 +103,11 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse ) { super(SyncResource.Extensions, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService, uriIdentityService); this._register( - Event.debounce( - Event.any( - Event.filter(this.extensionManagementService.onDidInstallExtensions, (e => e.some(({ local }) => !!local))), - Event.filter(this.extensionManagementService.onDidUninstallExtension, (e => !e.error)), - this.extensionEnablementService.onDidChangeEnablement, - this.extensionStorageService.onDidChangeExtensionStorageToSync), - () => undefined, 500)(() => this.triggerLocalChange())); + Event.any( + Event.filter(this.extensionManagementService.onDidInstallExtensions, (e => e.some(({ local }) => !!local))), + Event.filter(this.extensionManagementService.onDidUninstallExtension, (e => !e.error)), + this.extensionEnablementService.onDidChangeEnablement, + this.extensionStorageService.onDidChangeExtensionStorageToSync)(() => this.triggerLocalChange())); } protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { @@ -275,7 +273,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse } } - async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> { + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]> { return [{ resource: this.extUri.joinPath(uri, 'extensions.json'), comparableResource: ExtensionsSynchroniser.EXTENSIONS_DATA_URI }]; } @@ -499,7 +497,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse export interface IExtensionsInitializerPreviewResult { readonly installedExtensions: ILocalExtension[]; readonly disabledExtensions: IExtensionIdentifier[]; - readonly newExtensions: IExtensionIdentifier[]; + readonly newExtensions: (IExtensionIdentifier & { preRelease: boolean })[]; readonly remoteExtensions: ISyncExtension[]; } @@ -522,7 +520,7 @@ export abstract class AbstractExtensionsInitializer extends AbstractInitializer protected generatePreview(remoteExtensions: ISyncExtension[], localExtensions: ILocalExtension[]): IExtensionsInitializerPreviewResult { const installedExtensions: ILocalExtension[] = []; - const newExtensions: IExtensionIdentifier[] = []; + const newExtensions: (IExtensionIdentifier & { preRelease: boolean })[] = []; const disabledExtensions: IExtensionIdentifier[] = []; for (const extension of remoteExtensions) { if (this.ignoredExtensionsManagementService.hasToNeverSyncExtension(extension.identifier.id)) { @@ -537,7 +535,7 @@ export abstract class AbstractExtensionsInitializer extends AbstractInitializer disabledExtensions.push(extension.identifier); } } else if (extension.installed) { - newExtensions.push(extension.identifier); + newExtensions.push({ ...extension.identifier, preRelease: !!extension.preRelease }); if (extension.disabled) { disabledExtensions.push(extension.identifier); } diff --git a/src/vs/platform/userDataSync/common/globalStateMerge.ts b/src/vs/platform/userDataSync/common/globalStateMerge.ts index 1accab52ec2..8f2e51bb67d 100644 --- a/src/vs/platform/userDataSync/common/globalStateMerge.ts +++ b/src/vs/platform/userDataSync/common/globalStateMerge.ts @@ -9,11 +9,11 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IStorageValue, SYNC_SERVICE_URL_TYPE } from 'vs/platform/userDataSync/common/userDataSync'; export interface IMergeResult { - local: { added: IStringDictionary, removed: string[], updated: IStringDictionary }; + local: { added: IStringDictionary; removed: string[]; updated: IStringDictionary }; remote: IStringDictionary | null; } -export function merge(localStorage: IStringDictionary, remoteStorage: IStringDictionary | null, baseStorage: IStringDictionary | null, storageKeys: { machine: ReadonlyArray, unregistered: ReadonlyArray }, logService: ILogService): IMergeResult { +export function merge(localStorage: IStringDictionary, remoteStorage: IStringDictionary | null, baseStorage: IStringDictionary | null, storageKeys: { machine: ReadonlyArray; unregistered: ReadonlyArray }, logService: ILogService): IMergeResult { if (!remoteStorage) { return { remote: Object.keys(localStorage).length > 0 ? localStorage : null, local: { added: {}, removed: [], updated: {} } }; } @@ -27,7 +27,7 @@ export function merge(localStorage: IStringDictionary, remoteStor const baseToRemote = baseStorage ? compare(baseStorage, remoteStorage) : { added: Object.keys(remoteStorage).reduce((r, k) => { r.add(k); return r; }, new Set()), removed: new Set(), updated: new Set() }; const baseToLocal = baseStorage ? compare(baseStorage, localStorage) : { added: Object.keys(localStorage).reduce((r, k) => { r.add(k); return r; }, new Set()), removed: new Set(), updated: new Set() }; - const local: { added: IStringDictionary, removed: string[], updated: IStringDictionary } = { added: {}, removed: [], updated: {} }; + const local: { added: IStringDictionary; removed: string[]; updated: IStringDictionary } = { added: {}, removed: [], updated: {} }; const remote: IStringDictionary = objects.deepClone(remoteStorage); const isFirstTimeSync = !baseStorage; @@ -119,7 +119,7 @@ export function merge(localStorage: IStringDictionary, remoteStor return { local, remote: areSame(remote, remoteStorage) ? null : remote }; } -function compare(from: IStringDictionary, to: IStringDictionary): { added: Set, removed: Set, updated: Set } { +function compare(from: IStringDictionary, to: IStringDictionary): { added: Set; removed: Set; updated: Set } { const fromKeys = Object.keys(from); const toKeys = Object.keys(to); const added = toKeys.filter(key => fromKeys.indexOf(key) === -1).reduce((r, key) => { r.add(key); return r; }, new Set()); diff --git a/src/vs/platform/userDataSync/common/globalStateSync.ts b/src/vs/platform/userDataSync/common/globalStateSync.ts index ce296088cfa..e44eda9ed5e 100644 --- a/src/vs/platform/userDataSync/common/globalStateSync.ts +++ b/src/vs/platform/userDataSync/common/globalStateSync.ts @@ -18,7 +18,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; -import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; +import { getServiceMachineId } from 'vs/platform/externalServices/common/serviceMachineId'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; @@ -31,10 +31,10 @@ import { UserDataSyncStoreClient } from 'vs/platform/userDataSync/common/userDat const argvStoragePrefx = 'globalState.argv.'; const argvProperties: string[] = ['locale']; -type StorageKeys = { machine: string[], user: string[], unregistered: string[] }; +type StorageKeys = { machine: string[]; user: string[]; unregistered: string[] }; interface IGlobalStateResourceMergeResult extends IAcceptResult { - readonly local: { added: IStringDictionary, removed: string[], updated: IStringDictionary }; + readonly local: { added: IStringDictionary; removed: string[]; updated: IStringDictionary }; readonly remote: IStringDictionary | null; } @@ -237,7 +237,7 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs } } - async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> { + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]> { return [{ resource: this.extUri.joinPath(uri, 'globalState.json'), comparableResource: GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI }]; } @@ -313,7 +313,7 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs return '{}'; } - private async writeLocalGlobalState({ added, removed, updated }: { added: IStringDictionary, updated: IStringDictionary, removed: string[] }): Promise { + private async writeLocalGlobalState({ added, removed, updated }: { added: IStringDictionary; updated: IStringDictionary; removed: string[] }): Promise { const argv: IStringDictionary = {}; const updatedStorage: IStringDictionary = {}; const handleUpdatedStorage = (keys: string[], storage?: IStringDictionary): void => { diff --git a/src/vs/platform/userDataSync/common/keybindingsMerge.ts b/src/vs/platform/userDataSync/common/keybindingsMerge.ts index 4a1eb3af659..45d598e3938 100644 --- a/src/vs/platform/userDataSync/common/keybindingsMerge.ts +++ b/src/vs/platform/userDataSync/common/keybindingsMerge.ts @@ -32,7 +32,7 @@ export function parseKeybindings(content: string): IUserFriendlyKeybinding[] { return parse(content) || []; } -export async function merge(localContent: string, remoteContent: string, baseContent: string | null, formattingOptions: FormattingOptions, userDataSyncUtilService: IUserDataSyncUtilService): Promise<{ mergeContent: string, hasChanges: boolean, hasConflicts: boolean }> { +export async function merge(localContent: string, remoteContent: string, baseContent: string | null, formattingOptions: FormattingOptions, userDataSyncUtilService: IUserDataSyncUtilService): Promise<{ mergeContent: string; hasChanges: boolean; hasConflicts: boolean }> { const local = parseKeybindings(localContent); const remote = parseKeybindings(remoteContent); const base = baseContent ? parseKeybindings(baseContent) : null; @@ -105,7 +105,7 @@ export async function merge(localContent: string, remoteContent: string, baseCon return { mergeContent, hasChanges: true, hasConflicts: commandsMergeResult.conflicts.size > 0 }; } -function computeMergeResult(localToRemote: ICompareResult, baseToLocal: ICompareResult, baseToRemote: ICompareResult): { added: Set, removed: Set, updated: Set, conflicts: Set } { +function computeMergeResult(localToRemote: ICompareResult, baseToLocal: ICompareResult, baseToRemote: ICompareResult): { added: Set; removed: Set; updated: Set; conflicts: Set } { const added: Set = new Set(); const removed: Set = new Set(); const updated: Set = new Set(); diff --git a/src/vs/platform/userDataSync/common/keybindingsSync.ts b/src/vs/platform/userDataSync/common/keybindingsSync.ts index 8c8dd86f0d9..29839dbcfb2 100644 --- a/src/vs/platform/userDataSync/common/keybindingsSync.ts +++ b/src/vs/platform/userDataSync/common/keybindingsSync.ts @@ -273,7 +273,7 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem return false; } - async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> { + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]> { const comparableResource = (await this.fileService.exists(this.file)) ? this.file : this.localResource; return [{ resource: this.extUri.joinPath(uri, 'keybindings.json'), comparableResource }]; } diff --git a/src/vs/platform/userDataSync/common/settingsMerge.ts b/src/vs/platform/userDataSync/common/settingsMerge.ts index 7e35a6a68d7..33941721e94 100644 --- a/src/vs/platform/userDataSync/common/settingsMerge.ts +++ b/src/vs/platform/userDataSync/common/settingsMerge.ts @@ -88,7 +88,7 @@ export function updateIgnoredSettings(targetContent: string, sourceContent: stri return targetContent; } -export function merge(originalLocalContent: string, originalRemoteContent: string, baseContent: string | null, ignoredSettings: string[], resolvedConflicts: { key: string, value: any | undefined }[], formattingOptions: FormattingOptions): IMergeResult { +export function merge(originalLocalContent: string, originalRemoteContent: string, baseContent: string | null, ignoredSettings: string[], resolvedConflicts: { key: string; value: any | undefined }[], formattingOptions: FormattingOptions): IMergeResult { const localContentWithoutIgnoredSettings = updateIgnoredSettings(originalLocalContent, originalRemoteContent, ignoredSettings, formattingOptions); const localForwarded = baseContent !== localContentWithoutIgnoredSettings; @@ -282,7 +282,7 @@ export function isEmpty(content: string): boolean { return true; } -function compare(from: IStringDictionary | null, to: IStringDictionary, ignored: Set): { added: Set, removed: Set, updated: Set } { +function compare(from: IStringDictionary | null, to: IStringDictionary, ignored: Set): { added: Set; removed: Set; updated: Set } { const fromKeys = from ? Object.keys(from).filter(key => !ignored.has(key)) : []; const toKeys = Object.keys(to).filter(key => !ignored.has(key)); const added = toKeys.filter(key => fromKeys.indexOf(key) === -1).reduce((r, key) => { r.add(key); return r; }, new Set()); @@ -314,7 +314,7 @@ export function addSetting(key: string, sourceContent: string, targetContent: st } interface InsertLocation { - index: number, + index: number; insertAfter: boolean; } diff --git a/src/vs/platform/userDataSync/common/settingsSync.ts b/src/vs/platform/userDataSync/common/settingsSync.ts index 1ec503c1420..a7c77e99f5a 100644 --- a/src/vs/platform/userDataSync/common/settingsSync.ts +++ b/src/vs/platform/userDataSync/common/settingsSync.ts @@ -267,7 +267,7 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implement return false; } - async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> { + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]> { const comparableResource = (await this.fileService.exists(this.file)) ? this.file : this.localResource; return [{ resource: this.extUri.joinPath(uri, 'settings.json'), comparableResource }]; } diff --git a/src/vs/platform/userDataSync/common/snippetsMerge.ts b/src/vs/platform/userDataSync/common/snippetsMerge.ts index 7f8e3e486d2..43ed2f8c34b 100644 --- a/src/vs/platform/userDataSync/common/snippetsMerge.ts +++ b/src/vs/platform/userDataSync/common/snippetsMerge.ts @@ -150,7 +150,7 @@ export function merge(local: IStringDictionary, remote: IStringDictionar }; } -function compare(from: IStringDictionary | null, to: IStringDictionary | null): { added: Set, removed: Set, updated: Set } { +function compare(from: IStringDictionary | null, to: IStringDictionary | null): { added: Set; removed: Set; updated: Set } { const fromKeys = from ? Object.keys(from) : []; const toKeys = to ? Object.keys(to) : []; const added = toKeys.filter(key => fromKeys.indexOf(key) === -1).reduce((r, key) => { r.add(key); return r; }, new Set()); diff --git a/src/vs/platform/userDataSync/common/snippetsSync.ts b/src/vs/platform/userDataSync/common/snippetsSync.ts index 483ed74f4e9..b0b2bb48d8b 100644 --- a/src/vs/platform/userDataSync/common/snippetsSync.ts +++ b/src/vs/platform/userDataSync/common/snippetsSync.ts @@ -349,7 +349,7 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD return [...resourcePreviews.values()]; } - async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> { + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]> { let content = await super.resolveContent(uri); if (content) { const syncData = this.parseSyncData(content); diff --git a/src/vs/platform/userDataSync/common/tasksMerge.ts b/src/vs/platform/userDataSync/common/tasksMerge.ts new file mode 100644 index 00000000000..fd492e1a0e8 --- /dev/null +++ b/src/vs/platform/userDataSync/common/tasksMerge.ts @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface IMergeResult { + localContent: string | null; + remoteContent: string | null; + hasConflicts: boolean; +} + +export function merge(originalLocalContent: string, originalRemoteContent: string, baseContent: string | null): IMergeResult { + + const localForwarded = baseContent !== originalLocalContent; + const remoteForwarded = baseContent !== originalRemoteContent; + + /* no changes */ + if (!localForwarded && !remoteForwarded) { + return { localContent: null, remoteContent: null, hasConflicts: false }; + } + + /* local has changed and remote has not */ + if (localForwarded && !remoteForwarded) { + return { localContent: null, remoteContent: originalLocalContent, hasConflicts: false }; + } + + /* remote has changed and local has not */ + if (remoteForwarded && !localForwarded) { + return { localContent: originalRemoteContent, remoteContent: null, hasConflicts: false }; + } + + return { localContent: originalLocalContent, remoteContent: originalRemoteContent, hasConflicts: true }; +} + diff --git a/src/vs/platform/userDataSync/common/tasksSync.ts b/src/vs/platform/userDataSync/common/tasksSync.ts new file mode 100644 index 00000000000..b5680e31cce --- /dev/null +++ b/src/vs/platform/userDataSync/common/tasksSync.ts @@ -0,0 +1,323 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { VSBuffer } from 'vs/base/common/buffer'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { URI } from 'vs/base/common/uri'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IFileService } from 'vs/platform/files/common/files'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { AbstractFileSynchroniser, AbstractInitializer, IAcceptResult, IFileResourcePreview, IMergeResult } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { Change, IRemoteUserData, ISyncResourceHandle, IUserDataSyncBackupStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncStoreService, SyncResource, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync'; + +interface ITasksSyncContent { + tasks: string; +} + +interface ITasksResourcePreview extends IFileResourcePreview { + previewResult: IMergeResult; +} + +export function getTasksContentFromSyncContent(syncContent: string, logService: ILogService): string | null { + try { + const parsed = JSON.parse(syncContent); + return parsed.tasks; + } catch (e) { + logService.error(e); + return null; + } +} + +export class TasksSynchroniser extends AbstractFileSynchroniser implements IUserDataSynchroniser { + + protected readonly version: number = 1; + private readonly previewResource: URI = this.extUri.joinPath(this.syncPreviewFolder, 'tasks.json'); + private readonly localResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'local' }); + private readonly remoteResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'remote' }); + private readonly acceptedResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'accepted' }); + + constructor( + @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, + @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, + @IUserDataSyncLogService logService: IUserDataSyncLogService, + @IConfigurationService configurationService: IConfigurationService, + @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IFileService fileService: IFileService, + @IEnvironmentService environmentService: IEnvironmentService, + @IStorageService storageService: IStorageService, + @ITelemetryService telemetryService: ITelemetryService, + @IUriIdentityService uriIdentityService: IUriIdentityService, + ) { + super(uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(environmentService.settingsResource), 'tasks.json'), SyncResource.Tasks, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService, uriIdentityService); + } + + protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration): Promise { + const remoteContent = remoteUserData.syncData ? getTasksContentFromSyncContent(remoteUserData.syncData.content, this.logService) : null; + + // Use remote data as last sync data if last sync data does not exist and remote data is from same machine + lastSyncUserData = lastSyncUserData === null && isRemoteDataFromCurrentMachine ? remoteUserData : lastSyncUserData; + const lastSyncContent: string | null = lastSyncUserData?.syncData ? getTasksContentFromSyncContent(lastSyncUserData.syncData.content, this.logService) : null; + + // Get file content last to get the latest + const fileContent = await this.getLocalFileContent(); + + let content: string | null = null; + let hasLocalChanged: boolean = false; + let hasRemoteChanged: boolean = false; + let hasConflicts: boolean = false; + + if (remoteContent) { + const localContent = fileContent ? fileContent.value.toString() : null; + if (!lastSyncContent // First time sync + || lastSyncContent !== localContent // Local has forwarded + || lastSyncContent !== remoteContent // Remote has forwarded + ) { + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote tasks with local tasks...`); + const result = merge(localContent, remoteContent, lastSyncContent); + content = result.content; + hasConflicts = result.hasConflicts; + hasLocalChanged = result.hasLocalChanged; + hasRemoteChanged = result.hasRemoteChanged; + } + } + + // First time syncing to remote + else if (fileContent) { + this.logService.trace(`${this.syncResourceLogLabel}: Remote tasks does not exist. Synchronizing tasks for the first time.`); + content = fileContent.value.toString(); + hasRemoteChanged = true; + } + + const previewResult: IMergeResult = { + content, + localChange: hasLocalChanged ? fileContent ? Change.Modified : Change.Added : Change.None, + remoteChange: hasRemoteChanged ? Change.Modified : Change.None, + hasConflicts + }; + + return [{ + fileContent, + localResource: this.localResource, + localContent: fileContent ? fileContent.value.toString() : null, + localChange: previewResult.localChange, + + remoteResource: this.remoteResource, + remoteContent, + remoteChange: previewResult.remoteChange, + + previewResource: this.previewResource, + previewResult, + acceptedResource: this.acceptedResource, + }]; + + } + + protected async hasRemoteChanged(lastSyncUserData: IRemoteUserData): Promise { + const lastSyncContent: string | null = lastSyncUserData?.syncData ? getTasksContentFromSyncContent(lastSyncUserData.syncData.content, this.logService) : null; + if (lastSyncContent === null) { + return true; + } + + const fileContent = await this.getLocalFileContent(); + const localContent = fileContent ? fileContent.value.toString() : null; + const result = merge(localContent, lastSyncContent, lastSyncContent); + return result.hasLocalChanged || result.hasRemoteChanged; + } + + protected async getMergeResult(resourcePreview: ITasksResourcePreview, token: CancellationToken): Promise { + return resourcePreview.previewResult; + } + + protected async getAcceptResult(resourcePreview: ITasksResourcePreview, resource: URI, content: string | null | undefined, token: CancellationToken): Promise { + + /* Accept local resource */ + if (this.extUri.isEqual(resource, this.localResource)) { + return { + content: resourcePreview.fileContent ? resourcePreview.fileContent.value.toString() : null, + localChange: Change.None, + remoteChange: Change.Modified, + }; + } + + /* Accept remote resource */ + if (this.extUri.isEqual(resource, this.remoteResource)) { + return { + content: resourcePreview.remoteContent, + localChange: Change.Modified, + remoteChange: Change.None, + }; + } + + /* Accept preview resource */ + if (this.extUri.isEqual(resource, this.previewResource)) { + if (content === undefined) { + return { + content: resourcePreview.previewResult.content, + localChange: resourcePreview.previewResult.localChange, + remoteChange: resourcePreview.previewResult.remoteChange, + }; + } else { + return { + content, + localChange: Change.Modified, + remoteChange: Change.Modified, + }; + } + } + + throw new Error(`Invalid Resource: ${resource.toString()}`); + } + + protected async applyResult(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resourcePreviews: [ITasksResourcePreview, IAcceptResult][], force: boolean): Promise { + const { fileContent } = resourcePreviews[0][0]; + let { content, localChange, remoteChange } = resourcePreviews[0][1]; + + if (localChange === Change.None && remoteChange === Change.None) { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing tasks.`); + } + + if (localChange !== Change.None) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating local tasks...`); + if (fileContent) { + await this.backupLocal(JSON.stringify(this.toTasksSyncContent(fileContent.value.toString()))); + } + await this.updateLocalFileContent(content || '{}', fileContent, force); + this.logService.info(`${this.syncResourceLogLabel}: Updated local tasks`); + } + + if (remoteChange !== Change.None) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote tasks...`); + const remoteContents = JSON.stringify(this.toTasksSyncContent(content || '{}')); + remoteUserData = await this.updateRemoteUserData(remoteContents, force ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote tasks`); + } + + // Delete the preview + try { + await this.fileService.del(this.previewResource); + } catch (e) { /* ignore */ } + + if (lastSyncUserData?.ref !== remoteUserData.ref) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized tasks...`); + await this.updateLastSyncUserData(remoteUserData); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized tasks`); + } + + } + + async hasLocalData(): Promise { + return this.fileService.exists(this.file); + } + + async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]> { + const comparableResource = (await this.fileService.exists(this.file)) ? this.file : this.localResource; + return [{ resource: this.extUri.joinPath(uri, 'tasks.json'), comparableResource }]; + } + + override async resolveContent(uri: URI): Promise { + if (this.extUri.isEqual(this.remoteResource, uri) || this.extUri.isEqual(this.localResource, uri) || this.extUri.isEqual(this.acceptedResource, uri)) { + return this.resolvePreviewContent(uri); + } + let content = await super.resolveContent(uri); + if (content) { + return content; + } + content = await super.resolveContent(this.extUri.dirname(uri)); + if (content) { + const syncData = this.parseSyncData(content); + if (syncData) { + switch (this.extUri.basename(uri)) { + case 'tasks.json': + return getTasksContentFromSyncContent(syncData.content, this.logService); + } + } + } + return null; + } + + private toTasksSyncContent(tasks: string): ITasksSyncContent { + return { tasks }; + } + +} + +export class TasksInitializer extends AbstractInitializer { + + private tasksResource = this.uriIdentityService.extUri.joinPath(this.uriIdentityService.extUri.dirname(this.environmentService.settingsResource), 'tasks.json'); + + constructor( + @IFileService fileService: IFileService, + @IEnvironmentService environmentService: IEnvironmentService, + @IUserDataSyncLogService logService: IUserDataSyncLogService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + ) { + super(SyncResource.Tasks, environmentService, logService, fileService, uriIdentityService); + } + + async doInitialize(remoteUserData: IRemoteUserData): Promise { + const tasksContent = remoteUserData.syncData ? getTasksContentFromSyncContent(remoteUserData.syncData.content, this.logService) : null; + if (!tasksContent) { + this.logService.info('Skipping initializing tasks because remote tasks does not exist.'); + return; + } + + const isEmpty = await this.isEmpty(); + if (!isEmpty) { + this.logService.info('Skipping initializing tasks because local tasks exist.'); + return; + } + + await this.fileService.writeFile(this.tasksResource, VSBuffer.fromString(tasksContent)); + + await this.updateLastSyncUserData(remoteUserData); + } + + private async isEmpty(): Promise { + return this.fileService.exists(this.tasksResource); + } + +} + +function merge(originalLocalContent: string | null, originalRemoteContent: string | null, baseContent: string | null): { + content: string | null; + hasLocalChanged: boolean; + hasRemoteChanged: boolean; + hasConflicts: boolean; +} { + + /* no changes */ + if (originalLocalContent === null && originalRemoteContent === null && baseContent === null) { + return { content: null, hasLocalChanged: false, hasRemoteChanged: false, hasConflicts: false }; + } + + /* no changes */ + if (originalLocalContent === originalRemoteContent) { + return { content: null, hasLocalChanged: false, hasRemoteChanged: false, hasConflicts: false }; + } + + const localForwarded = baseContent !== originalLocalContent; + const remoteForwarded = baseContent !== originalRemoteContent; + + /* no changes */ + if (!localForwarded && !remoteForwarded) { + return { content: null, hasLocalChanged: false, hasRemoteChanged: false, hasConflicts: false }; + } + + /* local has changed and remote has not */ + if (localForwarded && !remoteForwarded) { + return { content: originalLocalContent, hasRemoteChanged: true, hasLocalChanged: false, hasConflicts: false }; + } + + /* remote has changed and local has not */ + if (remoteForwarded && !localForwarded) { + return { content: originalRemoteContent, hasLocalChanged: true, hasRemoteChanged: false, hasConflicts: false }; + } + + return { content: originalLocalContent, hasLocalChanged: true, hasRemoteChanged: true, hasConflicts: true }; +} diff --git a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts index 92520f9e7b3..bea7313f0b3 100644 --- a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CancelablePromise, createCancelablePromise, Delayer, disposableTimeout, timeout } from 'vs/base/common/async'; +import { CancelablePromise, createCancelablePromise, disposableTimeout, ThrottledDelayer, timeout } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { toLocalISOString } from 'vs/base/common/date'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -22,12 +22,12 @@ import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/use import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; type AutoSyncClassification = { - sources: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true; }; + sources: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; type AutoSyncErrorClassification = { - code: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true; }; - service: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true; }; + code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; const disableMachineEventuallyKey = 'sync.disableMachineEventually'; @@ -42,7 +42,8 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto private readonly autoSync = this._register(new MutableDisposable()); private successiveFailures: number = 0; private lastSyncTriggerTime: number | undefined = undefined; - private readonly syncTriggerDelayer: Delayer; + private readonly syncTriggerDelayer: ThrottledDelayer; + private suspendUntilRestart: boolean = false; private readonly _onError: Emitter = this._register(new Emitter()); readonly onError: Event = this._onError.event; @@ -85,7 +86,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto @IStorageService private readonly storageService: IStorageService, ) { super(); - this.syncTriggerDelayer = this._register(new Delayer(0)); + this.syncTriggerDelayer = this._register(new ThrottledDelayer(this.getSyncTriggerDelayTime())); this.lastSyncUrl = this.syncUrl; this.syncUrl = userDataSyncStoreManagementService.userDataSyncStore?.url; @@ -119,7 +120,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto this._register(userDataSyncAccountService.onDidChangeAccount(() => this.updateAutoSync())); this._register(userDataSyncStoreService.onDidChangeDonotMakeRequestsUntil(() => this.updateAutoSync())); - this._register(Event.debounce(userDataSyncService.onDidChangeLocal, (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerSync(sources, false, false))); + this._register(userDataSyncService.onDidChangeLocal(source => this.triggerSync([source], false, false))); this._register(Event.filter(this.userDataSyncEnablementService.onDidChangeResourceEnablement, ([, enabled]) => enabled)(() => this.triggerSync(['resourceEnablement'], false, false))); this._register(this.userDataSyncStoreManagementService.onDidChangeUserDataSyncStore(() => this.triggerSync(['userDataSyncStoreChanged'], false, false))); } @@ -155,7 +156,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto // For tests purpose only protected startAutoSync(): boolean { return true; } - private isAutoSyncEnabled(): { enabled: boolean, message?: string; } { + private isAutoSyncEnabled(): { enabled: boolean; message?: string } { if (!this.userDataSyncEnablementService.isEnabled()) { return { enabled: false, message: 'Auto Sync: Disabled.' }; } @@ -165,6 +166,9 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto if (this.userDataSyncStoreService.donotMakeRequestsUntil) { return { enabled: false, message: `Auto Sync: Suspended until ${toLocalISOString(this.userDataSyncStoreService.donotMakeRequestsUntil)} because server is not accepting requests until then.` }; } + if (this.suspendUntilRestart) { + return { enabled: false, message: 'Auto Sync: Suspended until restart.' }; + } return { enabled: true }; } @@ -228,7 +232,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto // Log to telemetry if (userDataSyncError instanceof UserDataAutoSyncError) { - this.telemetryService.publicLog2<{ code: string, service: string; }, AutoSyncErrorClassification>(`autosync/error`, { code: userDataSyncError.code, service: this.userDataSyncStoreManagementService.userDataSyncStore!.url.toString() }); + this.telemetryService.publicLog2<{ code: string; service: string }, AutoSyncErrorClassification>(`autosync/error`, { code: userDataSyncError.code, service: this.userDataSyncStoreManagementService.userDataSyncStore!.url.toString() }); } // Session got expired @@ -243,8 +247,15 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto this.logService.info('Auto Sync: Turned off sync because sync is turned off in the cloud'); } - // Exceeded Rate Limit - else if (userDataSyncError.code === UserDataSyncErrorCode.LocalTooManyRequests || userDataSyncError.code === UserDataSyncErrorCode.TooManyRequests) { + // Exceeded Rate Limit on Client + else if (userDataSyncError.code === UserDataSyncErrorCode.LocalTooManyRequests) { + this.suspendUntilRestart = true; + this.logService.info('Auto Sync: Suspended sync because of making too many requests to server'); + this.updateAutoSync(); + } + + // Exceeded Rate Limit on Server + else if (userDataSyncError.code === UserDataSyncErrorCode.TooManyRequests) { await this.turnOff(false, true /* force soft turnoff on error */, true /* do not disable machine because disabling a machine makes request to server and can fail with TooManyRequests */); this.disableMachineEventually(); @@ -339,7 +350,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto this.sources.push(...sources); return this.syncTriggerDelayer.trigger(async () => { this.logService.trace('activity sources', ...this.sources); - this.telemetryService.publicLog2<{ sources: string[]; }, AutoSyncClassification>('sync/triggered', { sources: this.sources }); + this.telemetryService.publicLog2<{ sources: string[] }, AutoSyncClassification>('sync/triggered', { sources: this.sources }); this.sources = []; if (this.autoSync.value) { await this.autoSync.value.sync('Activity', disableCache); @@ -351,7 +362,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto } protected getSyncTriggerDelayTime(): number { - return 1000; /* Debounce for a second if there are no failures */ + return 2000; /* Debounce for 2 seconds if there are no failures */ } } diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index 9db405d5e18..f7c41f62201 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -112,7 +112,7 @@ export interface IUserData { content: string | null; } -export type IAuthenticationProvider = { id: string, scopes: string[] }; +export type IAuthenticationProvider = { id: string; scopes: string[] }; export interface IUserDataSyncStore { readonly url: URI; @@ -135,17 +135,18 @@ export const enum SyncResource { Settings = 'settings', Keybindings = 'keybindings', Snippets = 'snippets', + Tasks = 'tasks', Extensions = 'extensions', - GlobalState = 'globalState' + GlobalState = 'globalState', } -export const ALL_SYNC_RESOURCES: SyncResource[] = [SyncResource.Settings, SyncResource.Keybindings, SyncResource.Snippets, SyncResource.Extensions, SyncResource.GlobalState]; +export const ALL_SYNC_RESOURCES: SyncResource[] = [SyncResource.Settings, SyncResource.Keybindings, SyncResource.Snippets, SyncResource.Tasks, SyncResource.Extensions, SyncResource.GlobalState]; export function getLastSyncResourceUri(syncResource: SyncResource, environmentService: IEnvironmentService, extUri: IExtUri): URI { return extUri.joinPath(environmentService.userDataSyncHome, syncResource, `lastSync${syncResource}.json`); } export interface IUserDataManifest { - readonly latest?: Record + readonly latest?: Record; readonly session: string; readonly ref: string; } @@ -404,7 +405,7 @@ export interface IUserDataSynchroniser { resolveContent(resource: URI): Promise; getRemoteSyncResourceHandles(): Promise; getLocalSyncResourceHandles(): Promise; - getAssociatedResources(syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]>; + getAssociatedResources(syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]>; getMachineId(syncResourceHandle: ISyncResourceHandle): Promise; } @@ -490,7 +491,7 @@ export interface IUserDataSyncService { getLocalSyncResourceHandles(resource: SyncResource): Promise; getRemoteSyncResourceHandles(resource: SyncResource): Promise; - getAssociatedResources(resource: SyncResource, syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]>; + getAssociatedResources(resource: SyncResource, syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]>; getMachineId(resource: SyncResource, syncResourceHandle: ISyncResourceHandle): Promise; } diff --git a/src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts b/src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts index 0ff204208bc..adce0d48d63 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts @@ -12,7 +12,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ALL_SYNC_RESOURCES, getEnablementKey, IUserDataSyncEnablementService, IUserDataSyncStoreManagementService, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; type SyncEnablementClassification = { - enabled?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + enabled?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; const enablementKey = 'sync.enable'; diff --git a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts index ef9111d9a8b..9ee868cf0fe 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts @@ -90,7 +90,7 @@ export class UserDataSyncMachinesServiceChannel implements IServerChannel { case 'addCurrentMachine': return this.service.addCurrentMachine(); case 'removeCurrentMachine': return this.service.removeCurrentMachine(); case 'renameMachine': return this.service.renameMachine(args[0], args[1]); - case 'setEnablement': return this.service.setEnablement(args[0], args[1]); + case 'setEnablements': return this.service.setEnablements(args); } throw new Error('Invalid call'); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncMachines.ts b/src/vs/platform/userDataSync/common/userDataSyncMachines.ts index 6f42385baec..43b71b2ab05 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncMachines.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncMachines.ts @@ -5,14 +5,14 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { isWeb, Platform, platform, PlatformToString } from 'vs/base/common/platform'; +import { isAndroid, isChrome, isEdge, isFirefox, isSafari, isWeb, Platform, platform, PlatformToString } from 'vs/base/common/platform'; import { escapeRegExpCharacters } from 'vs/base/common/strings'; import { localize } from 'vs/nls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProductService } from 'vs/platform/product/common/productService'; -import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; +import { getServiceMachineId } from 'vs/platform/externalServices/common/serviceMachineId'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IUserData, IUserDataManifest, IUserDataSyncLogService, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; @@ -20,6 +20,7 @@ interface IMachineData { id: string; name: string; disabled?: boolean; + platform?: string; } interface IMachinesData { @@ -40,11 +41,39 @@ export interface IUserDataSyncMachinesService { addCurrentMachine(manifest?: IUserDataManifest): Promise; removeCurrentMachine(manifest?: IUserDataManifest): Promise; renameMachine(machineId: string, name: string): Promise; - setEnablement(machineId: string, enabled: boolean): Promise; + setEnablements(enbalements: [string, boolean][]): Promise; } const currentMachineNameKey = 'sync.currentMachineName'; +const Safari = 'Safari'; +const Chrome = 'Chrome'; +const Edge = 'Edge'; +const Firefox = 'Firefox'; +const Android = 'Android'; + +export function isWebPlatform(platform: string) { + switch (platform) { + case Safari: + case Chrome: + case Edge: + case Firefox: + case Android: + case PlatformToString(Platform.Web): + return true; + } + return false; +} + +function getPlatformName(): string { + if (isSafari) { return Safari; } + if (isChrome) { return Chrome; } + if (isEdge) { return Edge; } + if (isFirefox) { return Firefox; } + if (isAndroid) { return Android; } + return PlatformToString(isWeb ? Platform.Web : platform); +} + export class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMachinesService { private static readonly VERSION = 1; @@ -80,7 +109,7 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData const currentMachineId = await this.currentMachineIdPromise; const machineData = await this.readMachinesData(manifest); if (!machineData.machines.some(({ id }) => id === currentMachineId)) { - machineData.machines.push({ id: currentMachineId, name: this.computeCurrentMachineName(machineData.machines) }); + machineData.machines.push({ id: currentMachineId, name: this.computeCurrentMachineName(machineData.machines), platform: getPlatformName() }); await this.writeMachinesData(machineData); } } @@ -96,25 +125,27 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData } async renameMachine(machineId: string, name: string, manifest?: IUserDataManifest): Promise { - const currentMachineId = await this.currentMachineIdPromise; const machineData = await this.readMachinesData(manifest); const machine = machineData.machines.find(({ id }) => id === machineId); if (machine) { machine.name = name; await this.writeMachinesData(machineData); - if (machineData.machines.some(({ id }) => id === currentMachineId)) { + const currentMachineId = await this.currentMachineIdPromise; + if (machineId === currentMachineId) { this.storageService.store(currentMachineNameKey, name, StorageScope.GLOBAL, StorageTarget.MACHINE); } } } - async setEnablement(machineId: string, enabled: boolean): Promise { + async setEnablements(enablements: [string, boolean][]): Promise { const machineData = await this.readMachinesData(); - const machine = machineData.machines.find(({ id }) => id === machineId); - if (machine) { - machine.disabled = enabled ? undefined : true; - await this.writeMachinesData(machineData); + for (const [machineId, enabled] of enablements) { + const machine = machineData.machines.find(machine => machine.id === machineId); + if (machine) { + machine.disabled = enabled ? undefined : true; + } } + await this.writeMachinesData(machineData); } private computeCurrentMachineName(machines: IMachineData[]): string { @@ -123,7 +154,7 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData return previousName; } - const namePrefix = `${this.productService.nameLong} (${PlatformToString(isWeb ? Platform.Web : platform)})`; + const namePrefix = `${this.productService.embedderIdentifier ? `${this.productService.embedderIdentifier} - ` : ''}${getPlatformName()} (${this.productService.nameShort})`; const nameRegEx = new RegExp(`${escapeRegExpCharacters(namePrefix)}\\s#(\\d+)`); let nameIndex = 0; for (const machine of machines) { diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index fd3b6f17b7a..3d38184f410 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -24,15 +24,16 @@ import { GlobalStateSynchroniser } from 'vs/platform/userDataSync/common/globalS import { KeybindingsSynchroniser } from 'vs/platform/userDataSync/common/keybindingsSync'; import { SettingsSynchroniser } from 'vs/platform/userDataSync/common/settingsSync'; import { SnippetsSynchroniser } from 'vs/platform/userDataSync/common/snippetsSync'; +import { TasksSynchroniser } from 'vs/platform/userDataSync/common/tasksSync'; import { ALL_SYNC_RESOURCES, Change, createSyncHeaders, IManualSyncTask, IResourcePreview, ISyncResourceHandle, ISyncResourcePreview, ISyncTask, IUserDataManifest, IUserDataSyncConfiguration, IUserDataSyncEnablementService, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncService, IUserDataSyncStoreManagementService, IUserDataSyncStoreService, MergeState, SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, UserDataSyncStoreError, USER_DATA_SYNC_CONFIGURATION_SCOPE } from 'vs/platform/userDataSync/common/userDataSync'; type SyncErrorClassification = { - code: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - service: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - serverCode?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - url?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - resource?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - executionId?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + code: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + service: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + serverCode?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + url?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + resource?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + executionId?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; const LAST_SYNC_TIME_KEY = 'sync.lastSyncTime'; @@ -148,7 +149,11 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ await this.resetLocal(); const enabledSynchronizers = this.getEnabledSynchronizers(); - return new ManualSyncTask(executionId, manifest, syncHeaders, enabledSynchronizers, () => this.resetLocal(), this.configurationService, this.logService); + const onstop = async () => { + await this.stop(enabledSynchronizers); + await this.resetLocal(); + }; + return new ManualSyncTask(executionId, manifest, syncHeaders, enabledSynchronizers, onstop, this.configurationService, this.logService); } private async sync(synchronizers: IUserDataSynchroniser[], manifest: IUserDataManifest | null, executionId: string, token: CancellationToken): Promise { @@ -304,7 +309,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return result || []; } - async getAssociatedResources(resource: SyncResource, syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> { + async getAssociatedResources(resource: SyncResource, syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]> { const result = await this.performSynchronizerAction(async synchronizer => { if (synchronizer.resource === resource) { return synchronizer.getAssociatedResources(syncResourceHandle); @@ -450,7 +455,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ } private reportUserDataSyncError(userDataSyncError: UserDataSyncError, executionId: string) { - this.telemetryService.publicLog2<{ code: string, service: string, serverCode?: string, url?: string, resource?: string, executionId?: string }, SyncErrorClassification>('sync/error', + this.telemetryService.publicLog2<{ code: string; service: string; serverCode?: string; url?: string; resource?: string; executionId?: string }, SyncErrorClassification>('sync/error', { code: userDataSyncError.code, serverCode: userDataSyncError instanceof UserDataSyncStoreError ? String(userDataSyncError.serverCode) : undefined, @@ -877,6 +882,7 @@ class Synchronizers extends Disposable { case SyncResource.Settings: return this.instantiationService.createInstance(SettingsSynchroniser); case SyncResource.Keybindings: return this.instantiationService.createInstance(KeybindingsSynchroniser); case SyncResource.Snippets: return this.instantiationService.createInstance(SnippetsSynchroniser); + case SyncResource.Tasks: return this.instantiationService.createInstance(TasksSynchroniser); case SyncResource.GlobalState: return this.instantiationService.createInstance(GlobalStateSynchroniser); case SyncResource.Extensions: return this.instantiationService.createInstance(ExtensionsSynchroniser); } @@ -887,8 +893,9 @@ class Synchronizers extends Disposable { case SyncResource.Settings: return 0; case SyncResource.Keybindings: return 1; case SyncResource.Snippets: return 2; - case SyncResource.GlobalState: return 3; - case SyncResource.Extensions: return 4; + case SyncResource.Tasks: return 3; + case SyncResource.GlobalState: return 4; + case SyncResource.Extensions: return 5; } } diff --git a/src/vs/platform/userDataSync/common/userDataSyncServiceIpc.ts b/src/vs/platform/userDataSync/common/userDataSyncServiceIpc.ts index eea41e2175d..4a190dfd8e6 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncServiceIpc.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncServiceIpc.ts @@ -12,11 +12,11 @@ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { ILogService } from 'vs/platform/log/common/log'; import { IManualSyncTask, IResourcePreview, ISyncResourceHandle, ISyncResourcePreview, ISyncTask, IUserDataManifest, IUserDataSyncService, SyncResource, SyncStatus, UserDataSyncError } from 'vs/platform/userDataSync/common/userDataSync'; -type ManualSyncTaskEvent = { manualSyncTaskId: string, data: T }; +type ManualSyncTaskEvent = { manualSyncTaskId: string; data: T }; export class UserDataSyncChannel implements IServerChannel { - private readonly manualSyncTasks = new Map(); + private readonly manualSyncTasks = new Map(); private readonly onManualSynchronizeResources = new Emitter>(); constructor(private readonly service: IUserDataSyncService, private readonly logService: ILogService) { } @@ -103,7 +103,7 @@ export class UserDataSyncChannel implements IServerChannel { return value.manualSyncTask; } - private async createManualSyncTask(): Promise<{ id: string, manifest: IUserDataManifest | null, status: SyncStatus }> { + private async createManualSyncTask(): Promise<{ id: string; manifest: IUserDataManifest | null; status: SyncStatus }> { const disposables = new DisposableStore(); const manualSyncTask = disposables.add(await this.service.createManualSyncTask()); disposables.add(manualSyncTask.onSynchronizeResources(synchronizeResources => this.onManualSynchronizeResources.fire({ manualSyncTaskId: manualSyncTask.id, data: synchronizeResources }))); @@ -180,7 +180,7 @@ export class UserDataSyncChannelClient extends Disposable implements IUserDataSy } async createManualSyncTask(): Promise { - const { id, manifest, status } = await this.channel.call<{ id: string, manifest: IUserDataManifest | null, status: SyncStatus }>('createManualSyncTask'); + const { id, manifest, status } = await this.channel.call<{ id: string; manifest: IUserDataManifest | null; status: SyncStatus }>('createManualSyncTask'); const that = this; const manualSyncTaskChannelClient = new ManualSyncTaskChannelClient(id, manifest, status, { async call(command: string, arg?: any, cancellationToken?: CancellationToken): Promise { @@ -188,7 +188,7 @@ export class UserDataSyncChannelClient extends Disposable implements IUserDataSy }, listen(event: string, arg?: any): Event { return Event.map( - Event.filter(that.channel.listen<{ manualSyncTaskId: string, data: T }>(`manualSync/${event}`, arg), e => !manualSyncTaskChannelClient.isDiposed() && e.manualSyncTaskId === id), + Event.filter(that.channel.listen<{ manualSyncTaskId: string; data: T }>(`manualSync/${event}`, arg), e => !manualSyncTaskChannelClient.isDiposed() && e.manualSyncTaskId === id), e => e.data); } }); @@ -237,8 +237,8 @@ export class UserDataSyncChannelClient extends Disposable implements IUserDataSy return handles.map(({ created, uri }) => ({ created, uri: URI.revive(uri) })); } - async getAssociatedResources(resource: SyncResource, syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> { - const result = await this.channel.call<{ resource: URI, comparableResource: URI }[]>('getAssociatedResources', [resource, syncResourceHandle]); + async getAssociatedResources(resource: SyncResource, syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI; comparableResource: URI }[]> { + const result = await this.channel.call<{ resource: URI; comparableResource: URI }[]>('getAssociatedResources', [resource, syncResourceHandle]); return result.map(({ resource, comparableResource }) => ({ resource: URI.revive(resource), comparableResource: URI.revive(comparableResource) })); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts index 86ce8444aef..f498de36c89 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts @@ -21,7 +21,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IFileService } from 'vs/platform/files/common/files'; import { IProductService } from 'vs/platform/product/common/productService'; import { asJson, asText, IRequestService, isSuccess as isSuccessContext } from 'vs/platform/request/common/request'; -import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; +import { getServiceMachineId } from 'vs/platform/externalServices/common/serviceMachineId'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { CONFIGURATION_SYNC_STORE_KEY, HEADER_EXECUTION_ID, HEADER_OPERATION_ID, IAuthenticationProvider, IResourceRefHandle, IUserData, IUserDataManifest, IUserDataSyncLogService, IUserDataSyncStore, IUserDataSyncStoreClient, IUserDataSyncStoreManagementService, IUserDataSyncStoreService, ServerResource, SYNC_SERVICE_URL_TYPE, UserDataSyncErrorCode, UserDataSyncStoreError, UserDataSyncStoreType } from 'vs/platform/userDataSync/common/userDataSync'; @@ -32,7 +32,7 @@ const MACHINE_SESSION_ID_KEY = 'sync.machine-session-id'; const REQUEST_SESSION_LIMIT = 100; const REQUEST_SESSION_INTERVAL = 1000 * 60 * 5; /* 5 minutes */ -type UserDataSyncStore = IUserDataSyncStore & { defaultType: UserDataSyncStoreType; }; +type UserDataSyncStore = IUserDataSyncStore & { defaultType: UserDataSyncStoreType }; export abstract class AbstractUserDataSyncStoreManagementService extends Disposable implements IUserDataSyncStoreManagementService { @@ -65,7 +65,7 @@ export abstract class AbstractUserDataSyncStoreManagementService extends Disposa this._onDidChangeUserDataSyncStore.fire(); } - protected toUserDataSyncStore(productStore: ConfigurationSyncStore & { web?: ConfigurationSyncStore; } | undefined, configuredStore?: ConfigurationSyncStore): UserDataSyncStore | undefined { + protected toUserDataSyncStore(productStore: ConfigurationSyncStore & { web?: ConfigurationSyncStore } | undefined, configuredStore?: ConfigurationSyncStore): UserDataSyncStore | undefined { // Check for web overrides for backward compatibility while reading previous store productStore = isWeb && productStore?.web ? { ...productStore, ...productStore.web } : productStore; const value: Partial = { ...(productStore || {}), ...(configuredStore || {}) }; @@ -144,8 +144,8 @@ export class UserDataSyncStoreClient extends Disposable implements IUserDataSync private userDataSyncStoreUrl: URI | undefined; - private authToken: { token: string, type: string; } | undefined; - private readonly commonHeadersPromise: Promise<{ [key: string]: string; }>; + private authToken: { token: string; type: string } | undefined; + private readonly commonHeadersPromise: Promise<{ [key: string]: string }>; private readonly session: RequestsSession; private _onTokenFailed: Emitter = this._register(new Emitter()); @@ -240,7 +240,7 @@ export class UserDataSyncStoreClient extends Disposable implements IUserDataSync const context = await this.request(uri.toString(), { type: 'GET', headers }, [], CancellationToken.None); - const result = await asJson<{ url: string, created: number; }[]>(context) || []; + const result = await asJson<{ url: string; created: number }[]>(context) || []; return result.map(({ url, created }) => ({ ref: relativePath(uri, uri.with({ path: url }))!, created: created * 1000 /* Server returns in seconds */ })); } diff --git a/src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts b/src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts index 356acd8c4cd..5d3ec0c49f3 100644 --- a/src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts +++ b/src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts @@ -785,4 +785,106 @@ suite('ExtensionsMerge', () => { assert.deepStrictEqual(actual.remote?.all, [{ identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: true, preRelease: false }]); }); + test('merge: local extension not an installed extension - remote preRelease property is taken precedence when there are no updates', () => { + const localExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: false, preRelease: false }, + ]; + const remoteExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: true, preRelease: true }, + ]; + + const actual = merge(localExtensions, remoteExtensions, remoteExtensions, [], []); + + assert.deepStrictEqual(actual.local.added, []); + assert.deepStrictEqual(actual.local.removed, []); + assert.deepStrictEqual(actual.local.updated, []); + assert.deepStrictEqual(actual.remote, null); + }); + + test('merge: local extension not an installed extension - remote preRelease property is taken precedence when there are updates locally', () => { + const localExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: false, preRelease: false, disabled: true }, + ]; + const remoteExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: true, preRelease: true }, + ]; + + const actual = merge(localExtensions, remoteExtensions, remoteExtensions, [], []); + + assert.deepStrictEqual(actual.local.added, []); + assert.deepStrictEqual(actual.local.removed, []); + assert.deepStrictEqual(actual.local.updated, []); + assert.deepStrictEqual(actual.remote?.all, [{ identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: true, preRelease: true, disabled: true }]); + }); + + test('merge: local extension not an installed extension - remote preRelease property is taken precedence when there are updates remotely', () => { + const localExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: false, preRelease: false }, + ]; + const baseExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: true, preRelease: true }, + ]; + const remoteExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: true, preRelease: true, disabled: true }, + ]; + + const actual = merge(localExtensions, remoteExtensions, baseExtensions, [], []); + + assert.deepStrictEqual(actual.local.added, []); + assert.deepStrictEqual(actual.local.removed, []); + assert.deepStrictEqual(actual.local.updated, [{ identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: true, preRelease: true, disabled: true }]); + assert.deepStrictEqual(actual.remote, null); + }); + + test('merge: local extension not an installed extension - remote version is taken precedence when there are no updates', () => { + const localExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: false, preRelease: false }, + ]; + const remoteExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.1.0', installed: true, preRelease: false }, + ]; + + const actual = merge(localExtensions, remoteExtensions, remoteExtensions, [], []); + + assert.deepStrictEqual(actual.local.added, []); + assert.deepStrictEqual(actual.local.removed, []); + assert.deepStrictEqual(actual.local.updated, []); + assert.deepStrictEqual(actual.remote, null); + }); + + test('merge: local extension not an installed extension - remote version is taken precedence when there are updates locally', () => { + const localExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: false, preRelease: false, disabled: true }, + ]; + const remoteExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.1.0', installed: true, preRelease: false }, + ]; + + const actual = merge(localExtensions, remoteExtensions, remoteExtensions, [], []); + + assert.deepStrictEqual(actual.local.added, []); + assert.deepStrictEqual(actual.local.removed, []); + assert.deepStrictEqual(actual.local.updated, []); + assert.deepStrictEqual(actual.remote?.all, [{ identifier: { id: 'a', uuid: 'a' }, version: '1.1.0', installed: true, preRelease: false, disabled: true }]); + }); + + test('merge: local extension not an installed extension - remote version property is taken precedence when there are updates remotely', () => { + const localExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.0.0', installed: false, preRelease: false }, + ]; + const baseExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.1.0', installed: true, preRelease: false }, + ]; + const remoteExtensions: ISyncExtensionWithVersion[] = [ + { identifier: { id: 'a', uuid: 'a' }, version: '1.1.0', installed: true, preRelease: false, disabled: true }, + ]; + + const actual = merge(localExtensions, remoteExtensions, baseExtensions, [], []); + + assert.deepStrictEqual(actual.local.added, []); + assert.deepStrictEqual(actual.local.removed, []); + assert.deepStrictEqual(actual.local.updated, [{ identifier: { id: 'a', uuid: 'a' }, version: '1.1.0', installed: true, preRelease: false, disabled: true }]); + assert.deepStrictEqual(actual.remote, null); + }); + }); diff --git a/src/vs/platform/userDataSync/test/common/synchronizer.test.ts b/src/vs/platform/userDataSync/test/common/synchronizer.test.ts index 01b44d101f3..71724a85a0f 100644 --- a/src/vs/platform/userDataSync/test/common/synchronizer.test.ts +++ b/src/vs/platform/userDataSync/test/common/synchronizer.test.ts @@ -24,7 +24,7 @@ interface ITestResourcePreview extends IResourcePreview { class TestSynchroniser extends AbstractSynchroniser { syncBarrier: Barrier = new Barrier(); - syncResult: { hasConflicts: boolean, hasError: boolean } = { hasConflicts: false, hasError: false }; + syncResult: { hasConflicts: boolean; hasError: boolean } = { hasConflicts: false, hasError: false }; onDoSyncCall: Emitter = this._register(new Emitter()); failWhenGettingLatestRemoteUserData: boolean = false; @@ -166,7 +166,7 @@ class TestSynchroniser extends AbstractSynchroniser { } hasLocalData(): Promise { throw new Error('not implemented'); } - getAssociatedResources(): Promise<{ resource: URI, comparableResource: URI }[]> { throw new Error('not implemented'); } + getAssociatedResources(): Promise<{ resource: URI; comparableResource: URI }[]> { throw new Error('not implemented'); } } suite('TestSynchronizer - Auto Sync', () => { diff --git a/src/vs/platform/userDataSync/test/common/tasksSync.test.ts b/src/vs/platform/userDataSync/test/common/tasksSync.test.ts new file mode 100644 index 00000000000..f02606d0a5d --- /dev/null +++ b/src/vs/platform/userDataSync/test/common/tasksSync.test.ts @@ -0,0 +1,516 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IFileService } from 'vs/platform/files/common/files'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { getTasksContentFromSyncContent, TasksSynchroniser } from 'vs/platform/userDataSync/common/tasksSync'; +import { Change, IUserDataSyncStoreService, MergeState, SyncResource, SyncStatus } from 'vs/platform/userDataSync/common/userDataSync'; +import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; + +suite('TasksSync', () => { + + const disposableStore = new DisposableStore(); + const server = new UserDataSyncTestServer(); + let client: UserDataSyncClient; + + let testObject: TasksSynchroniser; + + setup(async () => { + client = disposableStore.add(new UserDataSyncClient(server)); + await client.setUp(true); + testObject = client.getSynchronizer(SyncResource.Tasks) as TasksSynchroniser; + disposableStore.add(toDisposable(() => client.instantiationService.get(IUserDataSyncStoreService).clear())); + }); + + teardown(() => disposableStore.clear()); + + test('when tasks file does not exist', async () => { + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + + assert.deepStrictEqual(await testObject.getLastSyncUserData(), null); + let manifest = await client.manifest(); + server.reset(); + await testObject.sync(manifest); + + assert.deepStrictEqual(server.requests, [ + { type: 'GET', url: `${server.url}/v1/resource/${testObject.resource}/latest`, headers: {} }, + ]); + assert.ok(!await fileService.exists(tasksResource)); + + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.deepStrictEqual(lastSyncUserData!.ref, remoteUserData.ref); + assert.deepStrictEqual(lastSyncUserData!.syncData, remoteUserData.syncData); + assert.strictEqual(lastSyncUserData!.syncData, null); + + manifest = await client.manifest(); + server.reset(); + await testObject.sync(manifest); + assert.deepStrictEqual(server.requests, []); + + manifest = await client.manifest(); + server.reset(); + await testObject.sync(manifest); + assert.deepStrictEqual(server.requests, []); + }); + + test('when tasks file does not exist and remote has changes', async () => { + const client2 = disposableStore.add(new UserDataSyncClient(server)); + await client2.setUp(true); + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + const uriIdentityService2 = client2.instantiationService.get(IUriIdentityService); + const tasksResource2 = uriIdentityService2.extUri.joinPath(uriIdentityService2.extUri.dirname(client2.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + await client2.instantiationService.get(IFileService).writeFile(tasksResource2, VSBuffer.fromString(content)); + await client2.sync(); + + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + + await testObject.sync(await client.manifest()); + + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual((await fileService.readFile(tasksResource)).value.toString(), content); + }); + + test('when tasks file exists locally and remote has no tasks', async () => { + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + fileService.writeFile(tasksResource, VSBuffer.fromString(content)); + + await testObject.sync(await client.manifest()); + + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + }); + + test('first time sync: when tasks file exists locally with same content as remote', async () => { + const client2 = disposableStore.add(new UserDataSyncClient(server)); + await client2.setUp(true); + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + const uriIdentityService2 = client2.instantiationService.get(IUriIdentityService); + const tasksResource2 = uriIdentityService2.extUri.joinPath(uriIdentityService2.extUri.dirname(client2.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + await client2.instantiationService.get(IFileService).writeFile(tasksResource2, VSBuffer.fromString(content)); + await client2.sync(); + + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + await fileService.writeFile(tasksResource, VSBuffer.fromString(content)); + + await testObject.sync(await client.manifest()); + + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual((await fileService.readFile(tasksResource)).value.toString(), content); + }); + + test('when tasks file locally has moved forward', async () => { + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + fileService.writeFile(tasksResource, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [] + }))); + + await testObject.sync(await client.manifest()); + + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + fileService.writeFile(tasksResource, VSBuffer.fromString(content)); + + await testObject.sync(await client.manifest()); + + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + }); + + test('when tasks file remotely has moved forward', async () => { + const client2 = disposableStore.add(new UserDataSyncClient(server)); + await client2.setUp(true); + const uriIdentityService2 = client2.instantiationService.get(IUriIdentityService); + const tasksResource2 = uriIdentityService2.extUri.joinPath(uriIdentityService2.extUri.dirname(client2.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + const fileService2 = client2.instantiationService.get(IFileService); + await fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [] + }))); + + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + + await client2.sync(); + await testObject.sync(await client.manifest()); + + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + fileService2.writeFile(tasksResource2, VSBuffer.fromString(content)); + + await client2.sync(); + await testObject.sync(await client.manifest()); + + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual((await fileService.readFile(tasksResource)).value.toString(), content); + }); + + test('when tasks file has moved forward locally and remotely with same changes', async () => { + const client2 = disposableStore.add(new UserDataSyncClient(server)); + await client2.setUp(true); + const uriIdentityService2 = client2.instantiationService.get(IUriIdentityService); + const tasksResource2 = uriIdentityService2.extUri.joinPath(uriIdentityService2.extUri.dirname(client2.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + const fileService2 = client2.instantiationService.get(IFileService); + await fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [] + }))); + + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + + await client2.sync(); + await testObject.sync(await client.manifest()); + + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + fileService2.writeFile(tasksResource2, VSBuffer.fromString(content)); + await client2.sync(); + + fileService.writeFile(tasksResource, VSBuffer.fromString(content)); + await testObject.sync(await client.manifest()); + + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual((await fileService.readFile(tasksResource)).value.toString(), content); + }); + + test('when tasks file has moved forward locally and remotely - accept preview', async () => { + const client2 = disposableStore.add(new UserDataSyncClient(server)); + await client2.setUp(true); + const uriIdentityService2 = client2.instantiationService.get(IUriIdentityService); + const tasksResource2 = uriIdentityService2.extUri.joinPath(uriIdentityService2.extUri.dirname(client2.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + const fileService2 = client2.instantiationService.get(IFileService); + await fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [] + }))); + + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + + await client2.sync(); + await testObject.sync(await client.manifest()); + + fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + }] + }))); + await client2.sync(); + + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + fileService.writeFile(tasksResource, VSBuffer.fromString(content)); + await testObject.sync(await client.manifest()); + + assert.deepStrictEqual(testObject.status, SyncStatus.HasConflicts); + assert.deepStrictEqual(testObject.conflicts.length, 1); + assert.deepStrictEqual(testObject.conflicts[0].mergeState, MergeState.Conflict); + assert.deepStrictEqual(testObject.conflicts[0].localChange, Change.Modified); + assert.deepStrictEqual(testObject.conflicts[0].remoteChange, Change.Modified); + assert.deepStrictEqual((await fileService.readFile(testObject.conflicts[0].previewResource)).value.toString(), content); + + await testObject.accept(testObject.conflicts[0].previewResource); + await testObject.apply(false); + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual((await fileService.readFile(tasksResource)).value.toString(), content); + }); + + test('when tasks file has moved forward locally and remotely - accept modified preview', async () => { + const client2 = disposableStore.add(new UserDataSyncClient(server)); + await client2.setUp(true); + const uriIdentityService2 = client2.instantiationService.get(IUriIdentityService); + const tasksResource2 = uriIdentityService2.extUri.joinPath(uriIdentityService2.extUri.dirname(client2.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + const fileService2 = client2.instantiationService.get(IFileService); + await fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [] + }))); + + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + + await client2.sync(); + await testObject.sync(await client.manifest()); + + fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + }] + }))); + await client2.sync(); + + fileService.writeFile(tasksResource, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }))); + await testObject.sync(await client.manifest()); + + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch 2' + }] + }); + await testObject.accept(testObject.conflicts[0].previewResource, content); + await testObject.apply(false); + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual((await fileService.readFile(tasksResource)).value.toString(), content); + }); + + test('when tasks file has moved forward locally and remotely - accept remote', async () => { + const client2 = disposableStore.add(new UserDataSyncClient(server)); + await client2.setUp(true); + const uriIdentityService2 = client2.instantiationService.get(IUriIdentityService); + const tasksResource2 = uriIdentityService2.extUri.joinPath(uriIdentityService2.extUri.dirname(client2.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + const fileService2 = client2.instantiationService.get(IFileService); + await fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [] + }))); + + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + + await client2.sync(); + await testObject.sync(await client.manifest()); + + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + }] + }); + fileService2.writeFile(tasksResource2, VSBuffer.fromString(content)); + await client2.sync(); + + fileService.writeFile(tasksResource, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }))); + await testObject.sync(await client.manifest()); + assert.deepStrictEqual(testObject.status, SyncStatus.HasConflicts); + + await testObject.accept(testObject.conflicts[0].remoteResource); + await testObject.apply(false); + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual((await fileService.readFile(tasksResource)).value.toString(), content); + }); + + test('when tasks file has moved forward locally and remotely - accept local', async () => { + const client2 = disposableStore.add(new UserDataSyncClient(server)); + await client2.setUp(true); + const uriIdentityService2 = client2.instantiationService.get(IUriIdentityService); + const tasksResource2 = uriIdentityService2.extUri.joinPath(uriIdentityService2.extUri.dirname(client2.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + const fileService2 = client2.instantiationService.get(IFileService); + await fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [] + }))); + + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + + await client2.sync(); + await testObject.sync(await client.manifest()); + + fileService2.writeFile(tasksResource2, VSBuffer.fromString(JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + }] + }))); + await client2.sync(); + + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + fileService.writeFile(tasksResource, VSBuffer.fromString(content)); + await testObject.sync(await client.manifest()); + assert.deepStrictEqual(testObject.status, SyncStatus.HasConflicts); + + await testObject.accept(testObject.conflicts[0].localResource); + await testObject.apply(false); + assert.deepStrictEqual(testObject.status, SyncStatus.Idle); + const lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual(getTasksContentFromSyncContent(remoteUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + assert.strictEqual((await fileService.readFile(tasksResource)).value.toString(), content); + }); + + test('when tasks file is created after first sync', async () => { + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + await testObject.sync(await client.manifest()); + + const content = JSON.stringify({ + 'version': '2.0.0', + 'tasks': [{ + 'type': 'npm', + 'script': 'watch', + 'label': 'Watch' + }] + }); + await fileService.createFile(tasksResource, VSBuffer.fromString(content)); + + let lastSyncUserData = await testObject.getLastSyncUserData(); + const manifest = await client.manifest(); + server.reset(); + await testObject.sync(manifest); + + assert.deepStrictEqual(server.requests, [ + { type: 'POST', url: `${server.url}/v1/resource/${testObject.resource}`, headers: { 'If-Match': lastSyncUserData?.ref } }, + ]); + + lastSyncUserData = await testObject.getLastSyncUserData(); + const remoteUserData = await testObject.getRemoteUserData(null); + assert.deepStrictEqual(lastSyncUserData!.ref, remoteUserData.ref); + assert.deepStrictEqual(lastSyncUserData!.syncData, remoteUserData.syncData); + assert.strictEqual(getTasksContentFromSyncContent(lastSyncUserData!.syncData!.content!, client.instantiationService.get(ILogService)), content); + }); + + test('apply remote when tasks file does not exist', async () => { + const fileService = client.instantiationService.get(IFileService); + const uriIdentityService = client.instantiationService.get(IUriIdentityService); + const tasksResource = uriIdentityService.extUri.joinPath(uriIdentityService.extUri.dirname(client.instantiationService.get(IEnvironmentService).settingsResource), 'tasks.json'); + if (await fileService.exists(tasksResource)) { + await fileService.del(tasksResource); + } + + const preview = (await testObject.preview(await client.manifest(), {}))!; + + server.reset(); + const content = await testObject.resolveContent(preview.resourcePreviews[0].remoteResource); + await testObject.accept(preview.resourcePreviews[0].remoteResource, content); + await testObject.apply(false); + assert.deepStrictEqual(server.requests, []); + }); + +}); diff --git a/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts b/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts index c30183ac9b3..6657810f7d6 100644 --- a/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts @@ -147,6 +147,9 @@ suite('UserDataAutoSyncService', () => { // Snippets { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '0' } }, + // Tasks + { type: 'GET', url: `${target.url}/v1/resource/tasks/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/tasks`, headers: { 'If-Match': '0' } }, // Global state { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, @@ -286,7 +289,7 @@ suite('UserDataAutoSyncService', () => { const userDataSyncMachinesService = testClient.instantiationService.get(IUserDataSyncMachinesService); const machines = await userDataSyncMachinesService.getMachines(); const currentMachine = machines.find(m => m.isCurrent)!; - await userDataSyncMachinesService.setEnablement(currentMachine.id, false); + await userDataSyncMachinesService.setEnablements([[currentMachine.id, false]]); target.reset(); diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts index 02729fc3378..293324b83c5 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts @@ -10,7 +10,7 @@ import { Emitter } from 'vs/base/common/event'; import { FormattingOptions } from 'vs/base/common/jsonFormatter'; import { Disposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; -import { joinPath } from 'vs/base/common/resources'; +import { joinPath, dirname } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { IHeaders, IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request'; @@ -126,6 +126,7 @@ export class UserDataSyncClient extends Disposable { await fileService.writeFile(environmentService.settingsResource, VSBuffer.fromString(JSON.stringify({}))); await fileService.writeFile(environmentService.keybindingsResource, VSBuffer.fromString(JSON.stringify([]))); await fileService.writeFile(joinPath(environmentService.snippetsHome, 'c.json'), VSBuffer.fromString(`{}`)); + await fileService.writeFile(joinPath(dirname(environmentService.settingsResource), 'tasks.json'), VSBuffer.fromString(`{}`)); await fileService.writeFile(environmentService.argvResource, VSBuffer.fromString(JSON.stringify({ 'locale': 'en' }))); } await configurationService.reloadConfiguration(); @@ -159,11 +160,11 @@ export class UserDataSyncTestServer implements IRequestService { private session: string | null = null; private readonly data: Map = new Map(); - private _requests: { url: string, type: string, headers?: IHeaders }[] = []; - get requests(): { url: string, type: string, headers?: IHeaders }[] { return this._requests; } + private _requests: { url: string; type: string; headers?: IHeaders }[] = []; + get requests(): { url: string; type: string; headers?: IHeaders }[] { return this._requests; } - private _requestsWithAllHeaders: { url: string, type: string, headers?: IHeaders }[] = []; - get requestsWithAllHeaders(): { url: string, type: string, headers?: IHeaders }[] { return this._requestsWithAllHeaders; } + private _requestsWithAllHeaders: { url: string; type: string; headers?: IHeaders }[] = []; + get requestsWithAllHeaders(): { url: string; type: string; headers?: IHeaders }[] { return this._requestsWithAllHeaders; } private _responses: { status: number }[] = []; get responses(): { status: number }[] { return this._responses; } diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts b/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts index 70bdb7fe22b..80c99c789c2 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { joinPath } from 'vs/base/common/resources'; +import { dirname, joinPath } from 'vs/base/common/resources'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { IUserDataSyncEnablementService, IUserDataSyncService, SyncResource, SyncStatus } from 'vs/platform/userDataSync/common/userDataSync'; @@ -40,6 +40,9 @@ suite('UserDataSyncService', () => { // Snippets { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '0' } }, + // Tasks + { type: 'GET', url: `${target.url}/v1/resource/tasks/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/tasks`, headers: { 'If-Match': '0' } }, // Global state { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, @@ -69,6 +72,9 @@ suite('UserDataSyncService', () => { // Snippets { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '0' } }, + // Snippets + { type: 'GET', url: `${target.url}/v1/resource/tasks/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/tasks`, headers: { 'If-Match': '0' } }, // Global state { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, @@ -97,6 +103,8 @@ suite('UserDataSyncService', () => { { type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} }, // Snippets { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, + // Tasks + { type: 'GET', url: `${target.url}/v1/resource/tasks/latest`, headers: {} }, // Global state { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, // Extensions @@ -127,6 +135,7 @@ suite('UserDataSyncService', () => { { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, + { type: 'GET', url: `${target.url}/v1/resource/tasks/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, ]); @@ -150,6 +159,7 @@ suite('UserDataSyncService', () => { await fileService.writeFile(environmentService.keybindingsResource, VSBuffer.fromString(JSON.stringify([{ 'command': 'abcd', 'key': 'cmd+c' }]))); await fileService.writeFile(environmentService.argvResource, VSBuffer.fromString(JSON.stringify({ 'locale': 'de' }))); await fileService.writeFile(joinPath(environmentService.snippetsHome, 'html.json'), VSBuffer.fromString(`{}`)); + await fileService.writeFile(joinPath(dirname(environmentService.settingsResource), 'tasks.json'), VSBuffer.fromString(JSON.stringify({}))); const testObject = testClient.instantiationService.get(IUserDataSyncService); // Sync (merge) from the test client @@ -164,6 +174,7 @@ suite('UserDataSyncService', () => { { type: 'POST', url: `${target.url}/v1/resource/keybindings`, headers: { 'If-Match': '1' } }, { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '1' } }, + { type: 'GET', url: `${target.url}/v1/resource/tasks/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, ]); @@ -348,6 +359,9 @@ suite('UserDataSyncService', () => { // Snippets { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '0' } }, + // Tasks + { type: 'GET', url: `${target.url}/v1/resource/tasks/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/tasks`, headers: { 'If-Match': '0' } }, // Global state { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, @@ -371,7 +385,7 @@ suite('UserDataSyncService', () => { await (await testObject.createSyncTask(null)).run(); disposable.dispose(); - assert.deepStrictEqual(actualStatuses, [SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle]); + assert.deepStrictEqual(actualStatuses, [SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle, SyncStatus.Syncing, SyncStatus.Idle]); }); test('test sync conflicts status', async () => { diff --git a/src/vs/platform/webview/common/webviewManagerService.ts b/src/vs/platform/webview/common/webviewManagerService.ts index d45d0c33215..78f44d0e814 100644 --- a/src/vs/platform/webview/common/webviewManagerService.ts +++ b/src/vs/platform/webview/common/webviewManagerService.ts @@ -17,17 +17,17 @@ export interface WebviewWindowId { } export interface FindInFrameOptions { - forward?: boolean; - findNext?: boolean; - matchCase?: boolean; + readonly forward?: boolean; + readonly findNext?: boolean; + readonly matchCase?: boolean; } export interface FoundInFrameResult { - requestId: number; - activeMatchOrdinal: number; - matches: number; - selectionArea: any; - finalUpdate: boolean; + readonly requestId: number; + readonly activeMatchOrdinal: number; + readonly matches: number; + readonly selectionArea: any; + readonly finalUpdate: boolean; } export interface IWebviewManagerService { diff --git a/src/vs/platform/webview/common/webviewPortMapping.ts b/src/vs/platform/webview/common/webviewPortMapping.ts index 5f7fafd3371..ee1014f7cce 100644 --- a/src/vs/platform/webview/common/webviewPortMapping.ts +++ b/src/vs/platform/webview/common/webviewPortMapping.ts @@ -7,7 +7,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; import { IAddress } from 'vs/platform/remote/common/remoteAgentConnection'; -import { extractLocalHostUriMetaDataForPortMapping, ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; +import { extractLocalHostUriMetaDataForPortMapping, ITunnelService, RemoteTunnel } from 'vs/platform/tunnel/common/tunnel'; export interface IWebviewPortMapping { readonly webviewPort: number; diff --git a/src/vs/platform/webview/electron-main/webviewMainService.ts b/src/vs/platform/webview/electron-main/webviewMainService.ts index 45c92dd7d12..9b51a3a8b37 100644 --- a/src/vs/platform/webview/electron-main/webviewMainService.ts +++ b/src/vs/platform/webview/electron-main/webviewMainService.ts @@ -47,11 +47,13 @@ export class WebviewMainService extends Disposable implements IWebviewManagerSer } } - public async findInFrame(windowId: WebviewWindowId, frameName: string, text: string, options: { findNext?: boolean, forward?: boolean }): Promise { + public async findInFrame(windowId: WebviewWindowId, frameName: string, text: string, options: { findNext?: boolean; forward?: boolean }): Promise { const initialFrame = this.getFrameByName(windowId, frameName); - type WebFrameMainWithFindSupport = typeof WebFrameMain & { + type WebFrameMainWithFindSupport = WebFrameMain & { findInFrame?(text: string, findOptions: FindInFrameOptions): void; + on(event: 'found-in-frame', listener: Function): WebFrameMain; + removeListener(event: 'found-in-frame', listener: Function): WebFrameMain; }; const frame = initialFrame as unknown as WebFrameMainWithFindSupport; if (typeof frame.findInFrame === 'function') { @@ -62,17 +64,17 @@ export class WebviewMainService extends Disposable implements IWebviewManagerSer const foundInFrameHandler = (_: unknown, result: FoundInFrameResult) => { if (result.finalUpdate) { this._onFoundInFrame.fire(result); - initialFrame.removeListener('found-in-frame', foundInFrameHandler); + frame.removeListener('found-in-frame', foundInFrameHandler); } }; - initialFrame.on('found-in-frame', foundInFrameHandler); + frame.on('found-in-frame', foundInFrameHandler); } } public async stopFindInFrame(windowId: WebviewWindowId, frameName: string, options: { keepSelection?: boolean }): Promise { const initialFrame = this.getFrameByName(windowId, frameName); - type WebFrameMainWithFindSupport = typeof WebFrameMain & { + type WebFrameMainWithFindSupport = WebFrameMain & { stopFindInFrame?(stopOption: 'keepSelection' | 'clearSelection'): void; }; diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 6256c02727d..88f1ae4ba17 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -11,7 +11,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; import { FileType } from 'vs/platform/files/common/files'; import { LogLevel } from 'vs/platform/log/common/log'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IPartsSplash } from 'vs/platform/theme/common/themeService'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export const WindowMinimumSize = { WIDTH: 400, @@ -184,7 +185,7 @@ export interface IPathData { readonly startColumn: number; readonly endLineNumber?: number; readonly endColumn?: number; - } + }; // a hint that the file exists. if true, the // file exists, if false it does not. with @@ -254,31 +255,6 @@ export interface IOSConfiguration { readonly hostname: string; } -export interface IPartsSplash { - baseTheme: string; - colorInfo: { - background: string; - foreground: string | undefined; - editorBackground: string | undefined; - titleBarBackground: string | undefined; - activityBarBackground: string | undefined; - sideBarBackground: string | undefined; - statusBarBackground: string | undefined; - statusBarNoFolderBackground: string | undefined; - windowBorder: string | undefined; - } - layoutInfo: { - sideBarSide: string; - editorPartMinWidth: number; - titleBarHeight: number; - activityBarWidth: number; - sideBarWidth: number; - statusBarHeight: number; - windowBorder: boolean; - windowBorderRadius: string | undefined; - } | undefined -} - export interface INativeWindowConfiguration extends IWindowConfiguration, NativeParsedArgs, ISandboxConfiguration { mainPid: number; diff --git a/src/vs/platform/windows/electron-main/window.ts b/src/vs/platform/windows/electron-main/window.ts index ecb406a77da..3b0a142dc36 100644 --- a/src/vs/platform/windows/electron-main/window.ts +++ b/src/vs/platform/windows/electron-main/window.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, BrowserWindow, BrowserWindowConstructorOptions, Display, Event, nativeImage, NativeImage, Rectangle, screen, SegmentedControlSegment, systemPreferences, TouchBar, TouchBarSegmentedControl, WebFrameMain } from 'electron'; +import { app, BrowserWindow, BrowserWindowConstructorOptions, Display, Event, nativeImage, NativeImage, Rectangle, screen, SegmentedControlSegment, systemPreferences, TouchBar, TouchBarSegmentedControl } from 'electron'; import { RunOnceScheduler } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -23,19 +23,19 @@ import { IDialogMainService } from 'vs/platform/dialogs/electron-main/dialogMain import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import { isLaunchedFromCli } from 'vs/platform/environment/node/argvHelper'; -import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/common/extensionGalleryService'; import { IFileService } from 'vs/platform/files/common/files'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; import { IProtocolMainService } from 'vs/platform/protocol/electron-main/protocol'; +import { resolveMarketplaceHeaders } from 'vs/platform/externalServices/common/marketplace'; import { IGlobalStorageMainService } from 'vs/platform/storage/electron-main/storageMainService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IThemeMainService } from 'vs/platform/theme/electron-main/themeMainService'; import { getMenuBarVisibility, getTitleBarStyle, IFolderToOpen, INativeWindowConfiguration, IWindowSettings, IWorkspaceToOpen, MenuBarVisibility, WindowMinimumSize, zoomLevelToZoomFactor } from 'vs/platform/windows/common/windows'; import { defaultWindowState, ICodeWindow, ILoadEvent, IWindowsMainService, IWindowState, LoadReason, OpenContext, WindowError, WindowMode } from 'vs/platform/windows/electron-main/windows'; -import { ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { IWorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; export interface IWindowCreationOptions { @@ -174,7 +174,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { const windowSettings = this.configurationService.getValue('window'); - const options: BrowserWindowConstructorOptions = { + const options: BrowserWindowConstructorOptions & { experimentalDarkMode: boolean } = { width: this.windowState.width, height: this.windowState.height, x: this.windowState.x, @@ -192,6 +192,9 @@ export class CodeWindow extends Disposable implements ICodeWindow { spellcheck: false, nativeWindowOpen: true, zoomFactor: zoomLevelToZoomFactor(windowSettings?.zoomLevel), + // Enable experimental css highlight api https://chromestatus.com/feature/5436441440026624 + // Refs https://github.com/microsoft/vscode/issues/140098 + enableBlinkFeatures: 'HighlightAPI', ...this.environmentMainService.sandbox ? // Sandbox @@ -204,7 +207,8 @@ export class CodeWindow extends Disposable implements ICodeWindow { nodeIntegration: true, contextIsolation: false } - } + }, + experimentalDarkMode: true }; // Apply icon to window @@ -363,6 +367,8 @@ export class CodeWindow extends Disposable implements ICodeWindow { private readyState = ReadyState.NONE; setReady(): void { + this.logService.info(`window#load: window reported ready (id: ${this._id})`); + this.readyState = ReadyState.READY; // inform all waiting promises that we are ready now @@ -427,61 +433,6 @@ export class CodeWindow extends Disposable implements ICodeWindow { this.dispose(); }); - // Block all SVG requests from unsupported origins - const supportedSvgSchemes = new Set([Schemas.file, Schemas.vscodeFileResource, Schemas.vscodeRemoteResource, 'devtools']); - - // But allow them if the are made from inside an webview - const isSafeFrame = (requestFrame: WebFrameMain | undefined): boolean => { - for (let frame: WebFrameMain | null | undefined = requestFrame; frame; frame = frame.parent) { - if (frame.url.startsWith(`${Schemas.vscodeWebview}://`)) { - return true; - } - } - return false; - }; - - const isRequestFromSafeContext = (details: Electron.OnBeforeRequestListenerDetails | Electron.OnHeadersReceivedListenerDetails): boolean => { - return details.resourceType === 'xhr' || isSafeFrame(details.frame); - }; - - this._win.webContents.session.webRequest.onBeforeRequest((details, callback) => { - const uri = URI.parse(details.url); - if (uri.path.endsWith('.svg')) { - const isSafeResourceUrl = supportedSvgSchemes.has(uri.scheme); - if (!isSafeResourceUrl) { - return callback({ cancel: !isRequestFromSafeContext(details) }); - } - } - - return callback({ cancel: false }); - }); - - // Configure SVG header content type properly - // https://github.com/microsoft/vscode/issues/97564 - this._win.webContents.session.webRequest.onHeadersReceived((details, callback) => { - const responseHeaders = details.responseHeaders as Record; - const contentTypes = (responseHeaders['content-type'] || responseHeaders['Content-Type']); - - if (contentTypes && Array.isArray(contentTypes)) { - const uri = URI.parse(details.url); - if (uri.path.endsWith('.svg')) { - if (supportedSvgSchemes.has(uri.scheme)) { - responseHeaders['Content-Type'] = ['image/svg+xml']; - - return callback({ cancel: false, responseHeaders }); - } - } - - // remote extension schemes have the following format - // http://127.0.0.1:/vscode-remote-resource?path= - if (!uri.path.includes(Schemas.vscodeRemoteResource) && contentTypes.some(contentType => contentType.toLowerCase().includes('image/svg'))) { - return callback({ cancel: !isRequestFromSafeContext(details) }); - } - } - - return callback({ cancel: false }); - }); - // Remember that we loaded this._win.webContents.on('did-finish-load', () => { @@ -548,9 +499,9 @@ export class CodeWindow extends Disposable implements ICodeWindow { } private async onWindowError(error: WindowError.UNRESPONSIVE): Promise; - private async onWindowError(error: WindowError.CRASHED, details: { reason: string, exitCode: number }): Promise; - private async onWindowError(error: WindowError.LOAD, details: { reason: string, exitCode: number }): Promise; - private async onWindowError(type: WindowError, details?: { reason: string, exitCode: number }): Promise { + private async onWindowError(error: WindowError.CRASHED, details: { reason: string; exitCode: number }): Promise; + private async onWindowError(error: WindowError.LOAD, details: { reason: string; exitCode: number }): Promise; + private async onWindowError(type: WindowError, details?: { reason: string; exitCode: number }): Promise { switch (type) { case WindowError.CRASHED: @@ -566,9 +517,9 @@ export class CodeWindow extends Disposable implements ICodeWindow { // Telemetry type WindowErrorClassification = { - type: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - reason: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - code: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; + type: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + reason: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + code: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; }; type WindowErrorEvent = { type: WindowError; @@ -747,6 +698,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { } load(configuration: INativeWindowConfiguration, options: ILoadOptions = Object.create(null)): void { + this.logService.info(`window#load: attempt to load window (id: ${this._id})`); // Clear Document Edited if needed if (this.isDocumentEdited()) { diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index 6944296ce35..596d137e12d 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -13,7 +13,7 @@ import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { INativeWindowConfiguration, IOpenEmptyWindowOptions, IWindowOpenable } from 'vs/platform/windows/common/windows'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export const enum LoadReason { diff --git a/src/vs/platform/windows/electron-main/windowsFinder.ts b/src/vs/platform/windows/electron-main/windowsFinder.ts index 3e413723890..5d4d5d64fef 100644 --- a/src/vs/platform/windows/electron-main/windowsFinder.ts +++ b/src/vs/platform/windows/electron-main/windowsFinder.ts @@ -6,7 +6,7 @@ import { extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { ICodeWindow } from 'vs/platform/windows/electron-main/windows'; -import { IResolvedWorkspace, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IResolvedWorkspace, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export function findWindowOnFile(windows: ICodeWindow[], fileUri: URI, localWorkspaceResolver: (workspace: IWorkspaceIdentifier) => IResolvedWorkspace | undefined): ICodeWindow | undefined { diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts index 44f23baab47..978647e9a90 100644 --- a/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -43,7 +43,8 @@ import { CodeWindow } from 'vs/platform/windows/electron-main/window'; import { ICodeWindow, IOpenConfiguration, IOpenEmptyConfiguration, IWindowsCountChangedEvent, IWindowsMainService, OpenContext, UnloadReason } from 'vs/platform/windows/electron-main/windows'; import { findWindowOnExtensionDevelopmentPath, findWindowOnFile, findWindowOnWorkspaceOrFolder } from 'vs/platform/windows/electron-main/windowsFinder'; import { IWindowState, WindowsStateHandler } from 'vs/platform/windows/electron-main/windowsStateHandler'; -import { hasWorkspaceFileExtension, IRecent, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IRecent } from 'vs/platform/workspaces/common/workspaces'; +import { hasWorkspaceFileExtension, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { getSingleFolderWorkspaceIdentifier, getWorkspaceIdentifier } from 'vs/platform/workspaces/electron-main/workspaces'; import { IWorkspacesHistoryMainService } from 'vs/platform/workspaces/electron-main/workspacesHistoryMainService'; import { IWorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; @@ -209,13 +210,13 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic // Allow access to extension development path if (window.config.extensionDevelopmentPath) { for (const extensionDevelopmentPath of window.config.extensionDevelopmentPath) { - disposables.add(this.protocolMainService.addValidFileRoot(URI.file(extensionDevelopmentPath))); + disposables.add(this.protocolMainService.addValidFileRoot(extensionDevelopmentPath)); } } // Allow access to extension tests path if (window.config.extensionTestsPath) { - disposables.add(this.protocolMainService.addValidFileRoot(URI.file(window.config.extensionTestsPath))); + disposables.add(this.protocolMainService.addValidFileRoot(window.config.extensionTestsPath)); } } })); @@ -412,7 +413,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic emptyToOpen: number, filesToOpen: IFilesToOpen | undefined, foldersToAdd: ISingleFolderWorkspacePathToOpen[] - ): { windows: ICodeWindow[], filesOpenedInWindow: ICodeWindow | undefined } { + ): { windows: ICodeWindow[]; filesOpenedInWindow: ICodeWindow | undefined } { // Keep track of used windows and remember // if files have been opened in one of them @@ -1098,7 +1099,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic return { workspace: getSingleFolderWorkspaceIdentifier(uri), remoteAuthority }; } - private shouldOpenNewWindow(openConfig: IOpenConfiguration): { openFolderInNewWindow: boolean; openFilesInNewWindow: boolean; } { + private shouldOpenNewWindow(openConfig: IOpenConfiguration): { openFolderInNewWindow: boolean; openFilesInNewWindow: boolean } { // let the user settings override how folders are open in a new window or same window unless we are forced const windowConfig = this.configurationService.getValue('window'); diff --git a/src/vs/platform/windows/electron-main/windowsStateHandler.ts b/src/vs/platform/windows/electron-main/windowsStateHandler.ts index 1bdadb12610..fe513f1448c 100644 --- a/src/vs/platform/windows/electron-main/windowsStateHandler.ts +++ b/src/vs/platform/windows/electron-main/windowsStateHandler.ts @@ -14,7 +14,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IStateMainService } from 'vs/platform/state/electron-main/state'; import { INativeWindowConfiguration, IWindowSettings } from 'vs/platform/windows/common/windows'; import { defaultWindowState, ICodeWindow, IWindowsMainService, IWindowState as IWindowUIState, WindowMode } from 'vs/platform/windows/electron-main/windows'; -import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export interface IWindowState { workspace?: IWorkspaceIdentifier; diff --git a/src/vs/platform/windows/node/windowTracker.ts b/src/vs/platform/windows/node/windowTracker.ts index 2c5ea6fb24b..062722f7f6f 100644 --- a/src/vs/platform/windows/node/windowTracker.ts +++ b/src/vs/platform/windows/node/windowTracker.ts @@ -15,9 +15,9 @@ export class ActiveWindowManager extends Disposable { private activeWindowId: number | undefined; constructor({ onDidOpenWindow, onDidFocusWindow, getActiveWindowId }: { - onDidOpenWindow: Event, - onDidFocusWindow: Event, - getActiveWindowId(): Promise + onDidOpenWindow: Event; + onDidFocusWindow: Event; + getActiveWindowId(): Promise; }) { super(); diff --git a/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts b/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts index dd786500cfd..c48dc0e6dfb 100644 --- a/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts +++ b/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts @@ -16,7 +16,8 @@ import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; import { INativeWindowConfiguration } from 'vs/platform/windows/common/windows'; import { ICodeWindow, ILoadEvent, IWindowState } from 'vs/platform/windows/electron-main/windows'; import { findWindowOnFile } from 'vs/platform/windows/electron-main/windowsFinder'; -import { IWorkspaceIdentifier, toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; +import { toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; suite('WindowsFinder', () => { @@ -30,7 +31,7 @@ suite('WindowsFinder', () => { const testWorkspaceFolders = toWorkspaceFolders([{ path: join(fixturesFolder, 'vscode_workspace_1_folder') }, { path: join(fixturesFolder, 'vscode_workspace_2_folder') }], testWorkspace.configPath, extUriBiasedIgnorePathCase); const localWorkspaceResolver = (workspace: any) => { return workspace === testWorkspace ? { id: testWorkspace.id, configPath: workspace.configPath, folders: testWorkspaceFolders } : undefined; }; - function createTestCodeWindow(options: { lastFocusTime: number, openedFolderUri?: URI, openedWorkspace?: IWorkspaceIdentifier }): ICodeWindow { + function createTestCodeWindow(options: { lastFocusTime: number; openedFolderUri?: URI; openedWorkspace?: IWorkspaceIdentifier }): ICodeWindow { return new class implements ICodeWindow { onWillLoad: Event = Event.None; onDidSignalReady: Event = Event.None; @@ -55,7 +56,7 @@ suite('WindowsFinder', () => { addTabbedWindow(window: ICodeWindow): void { throw new Error('Method not implemented.'); } load(config: INativeWindowConfiguration, options: { isReload?: boolean }): void { throw new Error('Method not implemented.'); } reload(cli?: NativeParsedArgs): void { throw new Error('Method not implemented.'); } - focus(options?: { force: boolean; }): void { throw new Error('Method not implemented.'); } + focus(options?: { force: boolean }): void { throw new Error('Method not implemented.'); } close(): void { throw new Error('Method not implemented.'); } getBounds(): Electron.Rectangle { throw new Error('Method not implemented.'); } send(channel: string, ...args: any[]): void { throw new Error('Method not implemented.'); } diff --git a/src/vs/platform/windows/test/electron-main/windowsStateHandler.test.ts b/src/vs/platform/windows/test/electron-main/windowsStateHandler.test.ts index ce5ddb9fd21..8038fe6ad93 100644 --- a/src/vs/platform/windows/test/electron-main/windowsStateHandler.test.ts +++ b/src/vs/platform/windows/test/electron-main/windowsStateHandler.test.ts @@ -9,7 +9,7 @@ import { join } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import { IWindowState as IWindowUIState, WindowMode } from 'vs/platform/windows/electron-main/windows'; import { getWindowsStateStoreData, IWindowsState, IWindowState, restoreWindowsState } from 'vs/platform/windows/electron-main/windowsStateHandler'; -import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; suite('Windows State Storing', () => { diff --git a/src/vs/platform/workspace/common/virtualWorkspace.ts b/src/vs/platform/workspace/common/virtualWorkspace.ts new file mode 100644 index 00000000000..77ccb98eaf2 --- /dev/null +++ b/src/vs/platform/workspace/common/virtualWorkspace.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Schemas } from 'vs/base/common/network'; +import { URI } from 'vs/base/common/uri'; +import { IWorkspace } from 'vs/platform/workspace/common/workspace'; + +export function isVirtualResource(resource: URI) { + return resource.scheme !== Schemas.file && resource.scheme !== Schemas.vscodeRemote; +} + +export function getVirtualWorkspaceLocation(workspace: IWorkspace): { scheme: string; authority: string } | undefined { + if (workspace.folders.length) { + return workspace.folders.every(f => isVirtualResource(f.uri)) ? workspace.folders[0].uri : undefined; + } else if (workspace.configuration && isVirtualResource(workspace.configuration)) { + return workspace.configuration; + } + return undefined; +} + +export function getVirtualWorkspaceScheme(workspace: IWorkspace): string | undefined { + return getVirtualWorkspaceLocation(workspace)?.scheme; +} + +export function isVirtualWorkspace(workspace: IWorkspace): boolean { + return getVirtualWorkspaceLocation(workspace) !== undefined; +} diff --git a/src/vs/platform/workspace/common/workspace.ts b/src/vs/platform/workspace/common/workspace.ts index 172105b80b2..ec67e73252d 100644 --- a/src/vs/platform/workspace/common/workspace.ts +++ b/src/vs/platform/workspace/common/workspace.ts @@ -3,13 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { localize } from 'vs/nls'; import { Event } from 'vs/base/common/event'; +import { extname } from 'vs/base/common/path'; import { IWorkspaceFolderProvider } from 'vs/base/common/labels'; import { TernarySearchTree } from 'vs/base/common/map'; -import { basenameOrAuthority, joinPath } from 'vs/base/common/resources'; -import { URI } from 'vs/base/common/uri'; +import { extname as resourceExtname, basenameOrAuthority, joinPath, extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; +import { URI, UriComponents } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { ISingleFolderWorkspaceIdentifier, IStoredWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; export const IWorkspaceContextService = createDecorator('contextService'); @@ -74,6 +76,133 @@ export interface IWorkspaceContextService extends IWorkspaceFolderProvider { isInsideWorkspace(resource: URI): boolean; } +export interface IResolvedWorkspace extends IWorkspaceIdentifier, IBaseWorkspace { + readonly folders: IWorkspaceFolder[]; +} + +export interface IBaseWorkspace { + + /** + * If present, marks the window that opens the workspace + * as a remote window with the given authority. + */ + readonly remoteAuthority?: string; + + /** + * Transient workspaces are meant to go away after being used + * once, e.g. a window reload of a transient workspace will + * open an empty window. + * + * See: https://github.com/microsoft/vscode/issues/119695 + */ + readonly transient?: boolean; +} + +export interface IBaseWorkspaceIdentifier { + + /** + * Every workspace (multi-root, single folder or empty) + * has a unique identifier. It is not possible to open + * a workspace with the same `id` in multiple windows + */ + readonly id: string; +} + +/** + * A single folder workspace identifier is a path to a folder + id. + */ +export interface ISingleFolderWorkspaceIdentifier extends IBaseWorkspaceIdentifier { + + /** + * Folder path as `URI`. + */ + readonly uri: URI; +} + +/** + * A multi-root workspace identifier is a path to a workspace file + id. + */ +export interface IWorkspaceIdentifier extends IBaseWorkspaceIdentifier { + + /** + * Workspace config file path as `URI`. + */ + configPath: URI; +} + +export interface IEmptyWorkspaceIdentifier extends IBaseWorkspaceIdentifier { } + +export type IAnyWorkspaceIdentifier = IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier; + +export function isSingleFolderWorkspaceIdentifier(obj: unknown): obj is ISingleFolderWorkspaceIdentifier { + const singleFolderIdentifier = obj as ISingleFolderWorkspaceIdentifier | undefined; + + return typeof singleFolderIdentifier?.id === 'string' && URI.isUri(singleFolderIdentifier.uri); +} + +export function toWorkspaceIdentifier(workspace: IWorkspace): IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | undefined { + + // Multi root + if (workspace.configuration) { + return { + id: workspace.id, + configPath: workspace.configuration + }; + } + + // Single folder + if (workspace.folders.length === 1) { + return { + id: workspace.id, + uri: workspace.folders[0].uri + }; + } + + // Empty workspace + return undefined; +} + +export function isWorkspaceIdentifier(obj: unknown): obj is IWorkspaceIdentifier { + const workspaceIdentifier = obj as IWorkspaceIdentifier | undefined; + + return typeof workspaceIdentifier?.id === 'string' && URI.isUri(workspaceIdentifier.configPath); +} + +export interface ISerializedSingleFolderWorkspaceIdentifier extends IBaseWorkspaceIdentifier { + readonly uri: UriComponents; +} + +export interface ISerializedWorkspaceIdentifier extends IBaseWorkspaceIdentifier { + readonly configPath: UriComponents; +} + +export function reviveIdentifier(identifier: undefined): undefined; +export function reviveIdentifier(identifier: ISerializedWorkspaceIdentifier): IWorkspaceIdentifier; +export function reviveIdentifier(identifier: ISerializedSingleFolderWorkspaceIdentifier): ISingleFolderWorkspaceIdentifier; +export function reviveIdentifier(identifier: IEmptyWorkspaceIdentifier): IEmptyWorkspaceIdentifier; +export function reviveIdentifier(identifier: ISerializedWorkspaceIdentifier | ISerializedSingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined): IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined; +export function reviveIdentifier(identifier: ISerializedWorkspaceIdentifier | ISerializedSingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined): IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined { + + // Single Folder + const singleFolderIdentifierCandidate = identifier as ISerializedSingleFolderWorkspaceIdentifier | undefined; + if (singleFolderIdentifierCandidate?.uri) { + return { id: singleFolderIdentifierCandidate.id, uri: URI.revive(singleFolderIdentifierCandidate.uri) }; + } + + // Multi folder + const workspaceIdentifierCandidate = identifier as ISerializedWorkspaceIdentifier | undefined; + if (workspaceIdentifierCandidate?.configPath) { + return { id: workspaceIdentifierCandidate.id, configPath: URI.revive(workspaceIdentifierCandidate.configPath) }; + } + + // Empty + if (identifier?.id) { + return { id: identifier.id }; + } + + return undefined; +} + export const enum WorkbenchState { EMPTY = 1, FOLDER, @@ -81,9 +210,11 @@ export const enum WorkbenchState { } export interface IWorkspaceFoldersWillChangeEvent { - join(promise: Promise): void; + readonly changes: IWorkspaceFoldersChangeEvent; readonly fromCache: boolean; + + join(promise: Promise): void; } export interface IWorkspaceFoldersChangeEvent { @@ -233,14 +364,26 @@ export class Workspace implements IWorkspace { } } +export interface IRawFileWorkspaceFolder { + readonly path: string; + name?: string; +} + +export interface IRawUriWorkspaceFolder { + readonly uri: string; + name?: string; +} + export class WorkspaceFolder implements IWorkspaceFolder { readonly uri: URI; - name: string; - index: number; + readonly name: string; + readonly index: number; - constructor(data: IWorkspaceFolderData, - readonly raw?: IStoredWorkspaceFolder) { + constructor( + data: IWorkspaceFolderData, + readonly raw?: IRawFileWorkspaceFolder | IRawUriWorkspaceFolder + ) { this.uri = data.uri; this.index = data.index; this.name = data.name; @@ -258,3 +401,18 @@ export class WorkspaceFolder implements IWorkspaceFolder { export function toWorkspaceFolder(resource: URI): WorkspaceFolder { return new WorkspaceFolder({ uri: resource, index: 0, name: basenameOrAuthority(resource) }, { uri: resource.toString() }); } + +export const WORKSPACE_EXTENSION = 'code-workspace'; +const WORKSPACE_SUFFIX = `.${WORKSPACE_EXTENSION}`; +export const WORKSPACE_FILTER = [{ name: localize('codeWorkspace', "Code Workspace"), extensions: [WORKSPACE_EXTENSION] }]; +export const UNTITLED_WORKSPACE_NAME = 'workspace.json'; + +export function isUntitledWorkspace(path: URI, environmentService: IEnvironmentService): boolean { + return extUriBiasedIgnorePathCase.isEqualOrParent(path, environmentService.untitledWorkspacesHome); +} + +export function hasWorkspaceFileExtension(path: string | URI) { + const ext = (typeof path === 'string') ? extname(path) : resourceExtname(path); + + return ext === WORKSPACE_SUFFIX; +} diff --git a/src/vs/platform/workspace/common/workspaceTrust.ts b/src/vs/platform/workspace/common/workspaceTrust.ts index 3a0803a5e28..805e36a654f 100644 --- a/src/vs/platform/workspace/common/workspaceTrust.ts +++ b/src/vs/platform/workspace/common/workspaceTrust.ts @@ -24,7 +24,7 @@ export function workspaceTrustToString(trustState: boolean) { export interface WorkspaceTrustRequestButton { readonly label: string; - readonly type: 'ContinueWithTrust' | 'ContinueWithoutTrust' | 'Manage' | 'Cancel' + readonly type: 'ContinueWithTrust' | 'ContinueWithoutTrust' | 'Manage' | 'Cancel'; } export interface WorkspaceTrustRequestOptions { @@ -83,6 +83,7 @@ export interface IWorkspaceTrustRequestService { readonly onDidInitiateOpenFilesTrustRequest: Event; readonly onDidInitiateWorkspaceTrustRequest: Event; + readonly onDidInitiateWorkspaceTrustRequestOnStartup: Event; completeOpenFilesTrustRequest(result: WorkspaceTrustUriResponse, saveResponse?: boolean): Promise; requestOpenFilesTrust(openFiles: URI[]): Promise; @@ -90,6 +91,7 @@ export interface IWorkspaceTrustRequestService { cancelWorkspaceTrustRequest(): void; completeWorkspaceTrustRequest(trusted?: boolean): Promise; requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise; + requestWorkspaceTrustOnStartup(): void; } export interface IWorkspaceTrustTransitionParticipant { @@ -97,10 +99,10 @@ export interface IWorkspaceTrustTransitionParticipant { } export interface IWorkspaceTrustUriInfo { - uri: URI, - trusted: boolean + uri: URI; + trusted: boolean; } export interface IWorkspaceTrustInfo { - uriTrustInfo: IWorkspaceTrustUriInfo[] + uriTrustInfo: IWorkspaceTrustUriInfo[]; } diff --git a/src/vs/platform/workspace/test/common/workspace.test.ts b/src/vs/platform/workspace/test/common/workspace.test.ts index 8138ab1a2cb..f7e4b4f9222 100644 --- a/src/vs/platform/workspace/test/common/workspace.test.ts +++ b/src/vs/platform/workspace/test/common/workspace.test.ts @@ -8,8 +8,8 @@ import { join } from 'vs/base/common/path'; import { isLinux, isWindows } from 'vs/base/common/platform'; import { extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { IRawFileWorkspaceFolder, toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; +import { IRawFileWorkspaceFolder, Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; suite('Workspace', () => { diff --git a/src/vs/platform/workspaces/common/workspaces.ts b/src/vs/platform/workspaces/common/workspaces.ts index c1196f9b366..a17fb237b4b 100644 --- a/src/vs/platform/workspaces/common/workspaces.ts +++ b/src/vs/platform/workspaces/common/workspaces.ts @@ -10,27 +10,14 @@ import * as jsonEdit from 'vs/base/common/jsonEdit'; import { FormattingOptions } from 'vs/base/common/jsonFormatter'; import { normalizeDriveLetter } from 'vs/base/common/labels'; import { Schemas } from 'vs/base/common/network'; -import { extname, isAbsolute } from 'vs/base/common/path'; +import { isAbsolute } from 'vs/base/common/path'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; -import { extname as resourceExtname, extUriBiasedIgnorePathCase, IExtUri, isEqualAuthority } from 'vs/base/common/resources'; -import { URI, UriComponents } from 'vs/base/common/uri'; -import { localize } from 'vs/nls'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IExtUri, isEqualAuthority } from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { getRemoteAuthority } from 'vs/platform/remote/common/remoteHosts'; -import { IWorkspace, IWorkspaceFolder, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; - -export const WORKSPACE_EXTENSION = 'code-workspace'; -const WORKSPACE_SUFFIX = `.${WORKSPACE_EXTENSION}`; -export const WORKSPACE_FILTER = [{ name: localize('codeWorkspace', "Code Workspace"), extensions: [WORKSPACE_EXTENSION] }]; -export const UNTITLED_WORKSPACE_NAME = 'workspace.json'; - -export function hasWorkspaceFileExtension(path: string | URI) { - const ext = (typeof path === 'string') ? extname(path) : resourceExtname(path); - - return ext === WORKSPACE_SUFFIX; -} +import { IBaseWorkspace, IRawFileWorkspaceFolder, IRawUriWorkspaceFolder, IWorkspaceIdentifier, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; export const IWorkspacesService = createDecorator('workspacesService'); @@ -65,21 +52,21 @@ export interface IRecentlyOpened { export type IRecent = IRecentWorkspace | IRecentFolder | IRecentFile; export interface IRecentWorkspace { - workspace: IWorkspaceIdentifier; + readonly workspace: IWorkspaceIdentifier; label?: string; - remoteAuthority?: string; + readonly remoteAuthority?: string; } export interface IRecentFolder { - folderUri: URI; + readonly folderUri: URI; label?: string; - remoteAuthority?: string; + readonly remoteAuthority?: string; } export interface IRecentFile { - fileUri: URI; + readonly fileUri: URI; label?: string; - remoteAuthority?: string; + readonly remoteAuthority?: string; } export function isRecentWorkspace(curr: IRecent): curr is IRecentWorkspace { @@ -99,13 +86,13 @@ export function isRecentFile(curr: IRecent): curr is IRecentFile { //#region Backups export interface IWorkspaceBackupInfo { - workspace: IWorkspaceIdentifier; - remoteAuthority?: string; + readonly workspace: IWorkspaceIdentifier; + readonly remoteAuthority?: string; } export interface IFolderBackupInfo { - folderUri: URI; - remoteAuthority?: string; + readonly folderUri: URI; + readonly remoteAuthority?: string; } export function isFolderBackupInfo(curr: IWorkspaceBackupInfo | IFolderBackupInfo): curr is IFolderBackupInfo { @@ -116,120 +103,6 @@ export function isWorkspaceBackupInfo(curr: IWorkspaceBackupInfo | IFolderBackup return curr && curr.hasOwnProperty('workspace'); } - -//#endregion - -//#region Identifiers / Payload - -export interface IBaseWorkspaceIdentifier { - - /** - * Every workspace (multi-root, single folder or empty) - * has a unique identifier. It is not possible to open - * a workspace with the same `id` in multiple windows - */ - id: string; -} - -/** - * A single folder workspace identifier is a path to a folder + id. - */ -export interface ISingleFolderWorkspaceIdentifier extends IBaseWorkspaceIdentifier { - - /** - * Folder path as `URI`. - */ - uri: URI; -} - -export interface ISerializedSingleFolderWorkspaceIdentifier extends IBaseWorkspaceIdentifier { - uri: UriComponents; -} - -export function isSingleFolderWorkspaceIdentifier(obj: unknown): obj is ISingleFolderWorkspaceIdentifier { - const singleFolderIdentifier = obj as ISingleFolderWorkspaceIdentifier | undefined; - - return typeof singleFolderIdentifier?.id === 'string' && URI.isUri(singleFolderIdentifier.uri); -} - -/** - * A multi-root workspace identifier is a path to a workspace file + id. - */ -export interface IWorkspaceIdentifier extends IBaseWorkspaceIdentifier { - - /** - * Workspace config file path as `URI`. - */ - configPath: URI; -} - -export interface ISerializedWorkspaceIdentifier extends IBaseWorkspaceIdentifier { - configPath: UriComponents; -} - -export function toWorkspaceIdentifier(workspace: IWorkspace): IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | undefined { - - // Multi root - if (workspace.configuration) { - return { - id: workspace.id, - configPath: workspace.configuration - }; - } - - // Single folder - if (workspace.folders.length === 1) { - return { - id: workspace.id, - uri: workspace.folders[0].uri - }; - } - - // Empty workspace - return undefined; -} - -export function isWorkspaceIdentifier(obj: unknown): obj is IWorkspaceIdentifier { - const workspaceIdentifier = obj as IWorkspaceIdentifier | undefined; - - return typeof workspaceIdentifier?.id === 'string' && URI.isUri(workspaceIdentifier.configPath); -} - -export function reviveIdentifier(identifier: undefined): undefined; -export function reviveIdentifier(identifier: ISerializedWorkspaceIdentifier): IWorkspaceIdentifier; -export function reviveIdentifier(identifier: ISerializedSingleFolderWorkspaceIdentifier): ISingleFolderWorkspaceIdentifier; -export function reviveIdentifier(identifier: IEmptyWorkspaceIdentifier): IEmptyWorkspaceIdentifier; -export function reviveIdentifier(identifier: ISerializedWorkspaceIdentifier | ISerializedSingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined): IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined; -export function reviveIdentifier(identifier: ISerializedWorkspaceIdentifier | ISerializedSingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined): IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier | undefined { - - // Single Folder - const singleFolderIdentifierCandidate = identifier as ISerializedSingleFolderWorkspaceIdentifier | undefined; - if (singleFolderIdentifierCandidate?.uri) { - return { id: singleFolderIdentifierCandidate.id, uri: URI.revive(singleFolderIdentifierCandidate.uri) }; - } - - // Multi folder - const workspaceIdentifierCandidate = identifier as ISerializedWorkspaceIdentifier | undefined; - if (workspaceIdentifierCandidate?.configPath) { - return { id: workspaceIdentifierCandidate.id, configPath: URI.revive(workspaceIdentifierCandidate.configPath) }; - } - - // Empty - if (identifier?.id) { - return { id: identifier.id }; - } - - return undefined; -} - -export function isUntitledWorkspace(path: URI, environmentService: IEnvironmentService): boolean { - return extUriBiasedIgnorePathCase.isEqualOrParent(path, environmentService.untitledWorkspacesHome); -} - -export interface IEmptyWorkspaceIdentifier extends IBaseWorkspaceIdentifier { } - -export type IWorkspaceInitializationPayload = IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IEmptyWorkspaceIdentifier; - //#endregion //#region Workspace File Utilities @@ -238,69 +111,37 @@ export function isStoredWorkspaceFolder(obj: unknown): obj is IStoredWorkspaceFo return isRawFileWorkspaceFolder(obj) || isRawUriWorkspaceFolder(obj); } -export function isRawFileWorkspaceFolder(obj: unknown): obj is IRawFileWorkspaceFolder { +function isRawFileWorkspaceFolder(obj: unknown): obj is IRawFileWorkspaceFolder { const candidate = obj as IRawFileWorkspaceFolder | undefined; return typeof candidate?.path === 'string' && (!candidate.name || typeof candidate.name === 'string'); } -export function isRawUriWorkspaceFolder(obj: unknown): obj is IRawUriWorkspaceFolder { +function isRawUriWorkspaceFolder(obj: unknown): obj is IRawUriWorkspaceFolder { const candidate = obj as IRawUriWorkspaceFolder | undefined; return typeof candidate?.uri === 'string' && (!candidate.name || typeof candidate.name === 'string'); } -export interface IRawFileWorkspaceFolder { - path: string; - name?: string; -} - -export interface IRawUriWorkspaceFolder { - uri: string; - name?: string; -} - export type IStoredWorkspaceFolder = IRawFileWorkspaceFolder | IRawUriWorkspaceFolder; -interface IBaseWorkspace { - - /** - * If present, marks the window that opens the workspace - * as a remote window with the given authority. - */ - remoteAuthority?: string; - - /** - * Transient workspaces are meant to go away after being used - * once, e.g. a window reload of a transient workspace will - * open an empty window. - * - * See: https://github.com/microsoft/vscode/issues/119695 - */ - transient?: boolean; -} - -export interface IResolvedWorkspace extends IWorkspaceIdentifier, IBaseWorkspace { - folders: IWorkspaceFolder[]; -} - export interface IStoredWorkspace extends IBaseWorkspace { folders: IStoredWorkspaceFolder[]; } export interface IWorkspaceFolderCreationData { - uri: URI; - name?: string; + readonly uri: URI; + readonly name?: string; } export interface IUntitledWorkspaceInfo { - workspace: IWorkspaceIdentifier; - remoteAuthority?: string; + readonly workspace: IWorkspaceIdentifier; + readonly remoteAuthority?: string; } export interface IEnterWorkspaceResult { - workspace: IWorkspaceIdentifier; - backupPath?: string; + readonly workspace: IWorkspaceIdentifier; + readonly backupPath?: string; } /** @@ -457,35 +298,35 @@ export function useSlashForPath(storedFolders: IStoredWorkspaceFolder[]): boolea //#region Workspace Storage interface ISerializedRecentWorkspace { - workspace: { + readonly workspace: { id: string; configPath: string; - } - label?: string; - remoteAuthority?: string; + }; + readonly label?: string; + readonly remoteAuthority?: string; } interface ISerializedRecentFolder { - folderUri: string; - label?: string; - remoteAuthority?: string; + readonly folderUri: string; + readonly label?: string; + readonly remoteAuthority?: string; } interface ISerializedRecentFile { - fileUri: string; - label?: string; - remoteAuthority?: string; + readonly fileUri: string; + readonly label?: string; + readonly remoteAuthority?: string; } interface ISerializedRecentlyOpenedLegacy { - workspaces3: Array<{ id: string; configURIPath: string; } | string>; // workspace or URI.toString() // added in 1.32 - workspaceLabels?: Array; // added in 1.33 - files2: string[]; // files as URI.toString() // added in 1.32 - fileLabels?: Array; // added in 1.33 + readonly workspaces3: Array<{ id: string; configURIPath: string } | string>; // workspace or URI.toString() // added in 1.32 + readonly workspaceLabels?: Array; // added in 1.33 + readonly files2: string[]; // files as URI.toString() // added in 1.32 + readonly fileLabels?: Array; // added in 1.33 } interface ISerializedRecentlyOpened { - entries: Array; // since 1.55 + readonly entries: Array; // since 1.55 } export type RecentlyOpenedStorageData = object; @@ -502,7 +343,6 @@ function isSerializedRecentFile(data: any): data is ISerializedRecentFile { return typeof data.fileUri === 'string'; } - export function restoreRecentlyOpened(data: RecentlyOpenedStorageData | undefined, logService: ILogService): IRecentlyOpened { const result: IRecentlyOpened = { workspaces: [], files: [] }; if (data) { diff --git a/src/vs/platform/workspaces/electron-main/workspaces.ts b/src/vs/platform/workspaces/electron-main/workspaces.ts index b63addbbc68..4b303f31bc3 100644 --- a/src/vs/platform/workspaces/electron-main/workspaces.ts +++ b/src/vs/platform/workspaces/electron-main/workspaces.ts @@ -9,7 +9,7 @@ import { Schemas } from 'vs/base/common/network'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { originalFSPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! diff --git a/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService.ts index 1efe127b9ca..63d673e671a 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService.ts @@ -22,7 +22,8 @@ import { IStateMainService } from 'vs/platform/state/electron-main/state'; import { StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IGlobalStorageMainService } from 'vs/platform/storage/electron-main/storageMainService'; import { ICodeWindow } from 'vs/platform/windows/electron-main/windows'; -import { IRecent, IRecentFile, IRecentFolder, IRecentlyOpened, IRecentWorkspace, isRecentFile, isRecentFolder, isRecentWorkspace, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier, RecentlyOpenedStorageData, restoreRecentlyOpened, toStoreData, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; +import { IRecent, IRecentFile, IRecentFolder, IRecentlyOpened, IRecentWorkspace, isRecentFile, isRecentFolder, isRecentWorkspace, RecentlyOpenedStorageData, restoreRecentlyOpened, toStoreData } from 'vs/platform/workspaces/common/workspaces'; +import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspace/common/workspace'; import { IWorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; export const IWorkspacesHistoryMainService = createDecorator('workspacesHistoryMainService'); diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index 2642483d390..596e727819b 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -7,7 +7,8 @@ import { AddFirstParameterToFunctions } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IBackupMainService } from 'vs/platform/backup/electron-main/backup'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; -import { IEnterWorkspaceResult, IRecent, IRecentlyOpened, IWorkspaceBackupInfo, IFolderBackupInfo, IWorkspaceFolderCreationData, IWorkspaceIdentifier, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { IEnterWorkspaceResult, IRecent, IRecentlyOpened, IWorkspaceBackupInfo, IFolderBackupInfo, IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { IWorkspacesHistoryMainService } from 'vs/platform/workspaces/electron-main/workspacesHistoryMainService'; import { IWorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; @@ -52,19 +53,19 @@ export class WorkspacesMainService implements AddFirstParameterToFunctions { + getRecentlyOpened(windowId: number): Promise { return this.workspacesHistoryMainService.getRecentlyOpened(this.windowsMainService.getWindowById(windowId)); } - addRecentlyOpened(windowId: number, recents: IRecent[]): Promise { + addRecentlyOpened(windowId: number, recents: IRecent[]): Promise { return this.workspacesHistoryMainService.addRecentlyOpened(recents); } - removeRecentlyOpened(windowId: number, paths: URI[]): Promise { + removeRecentlyOpened(windowId: number, paths: URI[]): Promise { return this.workspacesHistoryMainService.removeRecentlyOpened(paths); } - clearRecentlyOpened(windowId: number): Promise { + clearRecentlyOpened(windowId: number): Promise { return this.workspacesHistoryMainService.clearRecentlyOpened(); } diff --git a/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts index 232e3dbab8a..87d8224f0f3 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesManagementMainService.ts @@ -25,7 +25,8 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; import { ICodeWindow } from 'vs/platform/windows/electron-main/windows'; import { findWindowOnWorkspaceOrFolder } from 'vs/platform/windows/electron-main/windowsFinder'; -import { getStoredWorkspaceFolder, hasWorkspaceFileExtension, IEnterWorkspaceResult, IResolvedWorkspace, isStoredWorkspaceFolder, IStoredWorkspace, IStoredWorkspaceFolder, isUntitledWorkspace, isWorkspaceIdentifier, IUntitledWorkspaceInfo, IWorkspaceFolderCreationData, IWorkspaceIdentifier, toWorkspaceFolders, UNTITLED_WORKSPACE_NAME } from 'vs/platform/workspaces/common/workspaces'; +import { isWorkspaceIdentifier, IWorkspaceIdentifier, IResolvedWorkspace, hasWorkspaceFileExtension, UNTITLED_WORKSPACE_NAME, isUntitledWorkspace } from 'vs/platform/workspace/common/workspace'; +import { getStoredWorkspaceFolder, IEnterWorkspaceResult, isStoredWorkspaceFolder, IStoredWorkspace, IStoredWorkspaceFolder, IUntitledWorkspaceInfo, IWorkspaceFolderCreationData, toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; import { getWorkspaceIdentifier } from 'vs/platform/workspaces/electron-main/workspaces'; export const IWorkspacesManagementMainService = createDecorator('workspacesManagementMainService'); @@ -169,7 +170,7 @@ export class WorkspacesManagementMainService extends Disposable implements IWork return workspace; } - private newUntitledWorkspace(folders: IWorkspaceFolderCreationData[] = [], remoteAuthority?: string): { workspace: IWorkspaceIdentifier, storedWorkspace: IStoredWorkspace } { + private newUntitledWorkspace(folders: IWorkspaceFolderCreationData[] = [], remoteAuthority?: string): { workspace: IWorkspaceIdentifier; storedWorkspace: IStoredWorkspace } { const randomId = (Date.now() + Math.round(Math.random() * 1000)).toString(); const untitledWorkspaceConfigFolder = joinPath(this.untitledWorkspacesHome, randomId); const untitledWorkspaceConfigPath = joinPath(untitledWorkspaceConfigFolder, UNTITLED_WORKSPACE_NAME); diff --git a/src/vs/platform/workspaces/test/common/workspaces.test.ts b/src/vs/platform/workspaces/test/common/workspaces.test.ts index 2973500aa2c..9f6e9f99311 100644 --- a/src/vs/platform/workspaces/test/common/workspaces.test.ts +++ b/src/vs/platform/workspaces/test/common/workspaces.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; -import { hasWorkspaceFileExtension, IEmptyWorkspaceIdentifier, ISerializedSingleFolderWorkspaceIdentifier, ISerializedWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, reviveIdentifier, toWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISerializedSingleFolderWorkspaceIdentifier, ISerializedWorkspaceIdentifier, reviveIdentifier, hasWorkspaceFileExtension, isWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IEmptyWorkspaceIdentifier, toWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; suite('Workspaces', () => { diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts index 3d7f8d970c3..a256666e45c 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesHistoryStorage.test.ts @@ -8,7 +8,8 @@ import { tmpdir } from 'os'; import { join } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import { NullLogService } from 'vs/platform/log/common/log'; -import { IRecentFolder, IRecentlyOpened, IRecentWorkspace, isRecentFolder, IWorkspaceIdentifier, restoreRecentlyOpened, toStoreData } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; +import { IRecentFolder, IRecentlyOpened, IRecentWorkspace, isRecentFolder, restoreRecentlyOpened, toStoreData } from 'vs/platform/workspaces/common/workspaces'; suite('History Storage', () => { diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts index 28af06567b6..9ddd22ead4c 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesManagementMainService.test.ts @@ -22,7 +22,8 @@ import { OPTIONS, parseArgs } from 'vs/platform/environment/node/argv'; import { NullLogService } from 'vs/platform/log/common/log'; import product from 'vs/platform/product/common/product'; import { IProductService } from 'vs/platform/product/common/productService'; -import { IFolderBackupInfo, IRawFileWorkspaceFolder, IRawUriWorkspaceFolder, IStoredWorkspace, IStoredWorkspaceFolder, IWorkspaceBackupInfo, IWorkspaceFolderCreationData, IWorkspaceIdentifier, rewriteWorkspaceFileForNewLocation, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; +import { IRawFileWorkspaceFolder, IRawUriWorkspaceFolder, IWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspace/common/workspace'; +import { IFolderBackupInfo, IStoredWorkspace, IStoredWorkspaceFolder, IWorkspaceBackupInfo, IWorkspaceFolderCreationData, rewriteWorkspaceFileForNewLocation } from 'vs/platform/workspaces/common/workspaces'; import { WorkspacesManagementMainService } from 'vs/platform/workspaces/electron-main/workspacesManagementMainService'; flakySuite('WorkspacesManagementMainService', () => { diff --git a/src/vs/server/extensionHostConnection.ts b/src/vs/server/node/extensionHostConnection.ts similarity index 94% rename from src/vs/server/extensionHostConnection.ts rename to src/vs/server/node/extensionHostConnection.ts index 864c1fba3db..505d619f9cf 100644 --- a/src/vs/server/extensionHostConnection.ts +++ b/src/vs/server/node/extensionHostConnection.ts @@ -5,19 +5,18 @@ import * as cp from 'child_process'; import * as net from 'net'; -import { getNLSConfiguration } from 'vs/server/remoteLanguagePacks'; -import { uriTransformerPath } from 'vs/server/remoteUriTransformer'; +import { getNLSConfiguration } from 'vs/server/node/remoteLanguagePacks'; import { FileAccess } from 'vs/base/common/network'; import { join, delimiter } from 'vs/base/common/path'; import { VSBuffer } from 'vs/base/common/buffer'; import { IRemoteConsoleLog } from 'vs/base/common/console'; import { Emitter, Event } from 'vs/base/common/event'; import { NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; -import { getResolvedShellEnv } from 'vs/platform/environment/node/shellEnv'; +import { getResolvedShellEnv } from 'vs/platform/terminal/node/shellEnv'; import { ILogService } from 'vs/platform/log/common/log'; import { IRemoteExtensionHostStartParams } from 'vs/platform/remote/common/remoteAgentConnection'; import { IExtHostReadyMessage, IExtHostSocketMessage, IExtHostReduceGraceTimeMessage } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; -import { IServerEnvironmentService } from 'vs/server/serverEnvironmentService'; +import { IServerEnvironmentService } from 'vs/server/node/serverEnvironmentService'; import { IProcessEnvironment, isWindows } from 'vs/base/common/platform'; import { logRemoteEntry } from 'vs/workbench/services/extensions/common/remoteConsoleUtil'; import { removeDangerousEnvVariables } from 'vs/base/node/processes'; @@ -48,7 +47,7 @@ export async function buildUserEnvironment(startParamsEnv: { [key: string]: stri ...userShellEnv, ...{ VSCODE_LOG_NATIVE: String(isDebug), - VSCODE_AMD_ENTRYPOINT: 'vs/server/remoteExtensionHostProcess', + VSCODE_AMD_ENTRYPOINT: 'vs/workbench/api/node/extensionHostProcess', VSCODE_PIPE_LOGGING: 'true', VSCODE_VERBOSE_LOGGING: 'true', VSCODE_EXTHOST_WILL_SEND_SOCKET: 'true', @@ -187,7 +186,7 @@ export class ExtensionHostConnection { try { let execArgv: string[] = []; if (startParams.port && !(process).pkg) { - execArgv = [`--inspect${startParams.break ? '-brk' : ''}=0.0.0.0:${startParams.port}`]; + execArgv = [`--inspect${startParams.break ? '-brk' : ''}=${startParams.port}`]; } const env = await buildUserEnvironment(startParams.env, startParams.language, !!startParams.debugId, this._environmentService, this._logService); @@ -200,11 +199,9 @@ export class ExtensionHostConnection { }; // Run Extension Host as fork of current process - const args = ['--type=extensionHost', `--uriTransformerPath=${uriTransformerPath}`]; + const args = ['--type=extensionHost', `--transformURIs`]; const useHostProxy = this._environmentService.args['use-host-proxy']; - if (useHostProxy) { - args.push(`--useHostProxy`); - } + args.push(`--useHostProxy=${useHostProxy ? 'true' : 'false'}`); this._extensionHostProcess = cp.fork(FileAccess.asFileUri('bootstrap-fork', require).fsPath, args, opts); const pid = this._extensionHostProcess.pid; this._log(`<${pid}> Launched Extension Host Process.`); diff --git a/src/vs/server/remoteAgentEnvironmentImpl.ts b/src/vs/server/node/remoteAgentEnvironmentImpl.ts similarity index 95% rename from src/vs/server/remoteAgentEnvironmentImpl.ts rename to src/vs/server/node/remoteAgentEnvironmentImpl.ts index d1d0f61edfc..c94a00088e8 100644 --- a/src/vs/server/remoteAgentEnvironmentImpl.ts +++ b/src/vs/server/node/remoteAgentEnvironmentImpl.ts @@ -7,17 +7,17 @@ import { Event } from 'vs/base/common/event'; import * as platform from 'vs/base/common/platform'; import * as performance from 'vs/base/common/performance'; import { URI } from 'vs/base/common/uri'; -import { createRemoteURITransformer } from 'vs/server/remoteUriTransformer'; +import { createURITransformer } from 'vs/workbench/api/node/uriTransformer'; import { IRemoteAgentEnvironmentDTO, IGetEnvironmentDataArguments, IScanExtensionsArguments, IScanSingleExtensionArguments } from 'vs/workbench/services/remote/common/remoteAgentEnvironmentChannel'; import * as nls from 'vs/nls'; import { FileAccess, Schemas } from 'vs/base/common/network'; -import { IServerEnvironmentService } from 'vs/server/serverEnvironmentService'; +import { IServerEnvironmentService } from 'vs/server/node/serverEnvironmentService'; import { ExtensionScanner, ExtensionScannerInput, IExtensionResolver, IExtensionReference } from 'vs/workbench/services/extensions/node/extensionPoints'; import { IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { transformOutgoingURIs } from 'vs/base/common/uriIpc'; import { ILogService } from 'vs/platform/log/common/log'; -import { getNLSConfiguration, InternalNLSConfiguration } from 'vs/server/remoteLanguagePacks'; +import { getNLSConfiguration, InternalNLSConfiguration } from 'vs/server/node/remoteLanguagePacks'; import { ContextKeyExpr, ContextKeyDefinedExpr, ContextKeyNotExpr, ContextKeyEqualsExpr, ContextKeyNotEqualsExpr, ContextKeyRegexExpr, IContextKeyExprMapper, ContextKeyExpression, ContextKeyInExpr, ContextKeyGreaterExpr, ContextKeyGreaterEqualsExpr, ContextKeySmallerExpr, ContextKeySmallerEqualsExpr } from 'vs/platform/contextkey/common/contextkey'; import { listProcesses } from 'vs/base/node/ps'; import { getMachineInfo, collectWorkspaceStats } from 'vs/platform/diagnostics/node/diagnosticsService'; @@ -30,6 +30,7 @@ import { IExtensionManagementCLIService, InstallOptions } from 'vs/platform/exte import { cwd } from 'vs/base/common/process'; import { Promises } from 'vs/base/node/pfs'; import { IProductService } from 'vs/platform/product/common/productService'; +import { ServerConnectionToken, ServerConnectionTokenType } from 'vs/server/node/serverConnectionToken'; let _SystemExtensionsRoot: string | null = null; function getSystemExtensionsRoot(): string { @@ -54,7 +55,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { private readonly whenExtensionsReady: Promise; constructor( - private readonly _connectionToken: string, + private readonly _connectionToken: ServerConnectionToken, private readonly environmentService: IServerEnvironmentService, extensionManagementCLIService: IExtensionManagementCLIService, private readonly logService: ILogService, @@ -94,12 +95,11 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { } async call(_: any, command: string, arg?: any): Promise { - console.log(`Command received: ${command}`); switch (command) { case 'getEnvironmentData': { const args = arg; - const uriTransformer = createRemoteURITransformer(args.remoteAuthority); + const uriTransformer = createURITransformer(args.remoteAuthority); let environmentData = await this._getEnvironmentData(); environmentData = transformOutgoingURIs(environmentData, uriTransformer); @@ -117,7 +117,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { const args = arg; const language = args.language; this.logService.trace(`Scanning extensions using UI language: ${language}`); - const uriTransformer = createRemoteURITransformer(args.remoteAuthority); + const uriTransformer = createURITransformer(args.remoteAuthority); const extensionDevelopmentLocations = args.extensionDevelopmentPath && args.extensionDevelopmentPath.map(url => URI.revive(uriTransformer.transformIncoming(url))); const extensionDevelopmentPath = extensionDevelopmentLocations ? extensionDevelopmentLocations.filter(url => url.scheme === Schemas.file).map(url => url.fsPath) : undefined; @@ -136,7 +136,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { const args = arg; const language = args.language; const isBuiltin = args.isBuiltin; - const uriTransformer = createRemoteURITransformer(args.remoteAuthority); + const uriTransformer = createURITransformer(args.remoteAuthority); const extensionLocation = URI.revive(uriTransformer.transformIncoming(args.extensionLocation)); const extensionPath = extensionLocation.scheme === Schemas.file ? extensionLocation.fsPath : null; @@ -170,7 +170,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { const workspaceMetadata: { [key: string]: any } = {}; if (options.folders) { // only incoming paths are transformed, so remote authority is unneeded. - const uriTransformer = createRemoteURITransformer(''); + const uriTransformer = createURITransformer(''); const folderPaths = options.folders .map(folder => URI.revive(uriTransformer.transformIncoming(folder))) .filter(uri => uri.scheme === 'file'); @@ -201,9 +201,9 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { private static _massageWhenConditions(extensions: IExtensionDescription[]): void { // Massage "when" conditions which mention `resourceScheme` - interface WhenUser { when?: string; } + interface WhenUser { when?: string } - interface LocWhenUser { [loc: string]: WhenUser[]; } + interface LocWhenUser { [loc: string]: WhenUser[] } const _mapResourceSchemeValue = (value: string, isRegex: boolean): string => { // console.log(`_mapResourceSchemeValue: ${value}, ${isRegex}`); @@ -311,7 +311,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { private async _getEnvironmentData(): Promise { return { pid: process.pid, - connectionToken: this._connectionToken, + connectionToken: (this._connectionToken.type !== ServerConnectionTokenType.None ? this._connectionToken.value : ''), appRoot: URI.file(this.environmentService.appRoot), settingsPath: this.environmentService.machineSettingsResource, logsPath: URI.file(this.environmentService.logsPath), diff --git a/src/vs/server/remoteExtensionHostAgentCli.ts b/src/vs/server/node/remoteExtensionHostAgentCli.ts similarity index 98% rename from src/vs/server/remoteExtensionHostAgentCli.ts rename to src/vs/server/node/remoteExtensionHostAgentCli.ts index d52350adbd3..c86ca327bdd 100644 --- a/src/vs/server/remoteExtensionHostAgentCli.ts +++ b/src/vs/server/node/remoteExtensionHostAgentCli.ts @@ -26,7 +26,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IProductService } from 'vs/platform/product/common/productService'; import { SpdLogLogger } from 'vs/platform/log/node/spdlogLog'; import { RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { IServerEnvironmentService, ServerEnvironmentService, ServerParsedArgs } from 'vs/server/serverEnvironmentService'; +import { IServerEnvironmentService, ServerEnvironmentService, ServerParsedArgs } from 'vs/server/node/serverEnvironmentService'; import { ExtensionManagementCLIService } from 'vs/platform/extensionManagement/common/extensionManagementCLIService'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; @@ -140,7 +140,7 @@ function eventuallyExit(code: number): void { export async function run(args: ServerParsedArgs, REMOTE_DATA_FOLDER: string, optionDescriptions: OptionDescriptions): Promise { if (args.help) { - const executable = `server${isWindows ? '.bat' : '.sh'}`; + const executable = product.serverApplicationName + (isWindows ? '.cmd' : ''); console.log(buildHelpMessage(product.nameLong, executable, product.version, optionDescriptions, { noInputFiles: true, noPipe: true })); return; } diff --git a/src/vs/server/remoteExtensionHostAgentServer.ts b/src/vs/server/node/remoteExtensionHostAgentServer.ts similarity index 52% rename from src/vs/server/remoteExtensionHostAgentServer.ts rename to src/vs/server/node/remoteExtensionHostAgentServer.ts index dcc183056b1..eebeab7637f 100644 --- a/src/vs/server/remoteExtensionHostAgentServer.ts +++ b/src/vs/server/node/remoteExtensionHostAgentServer.ts @@ -7,196 +7,36 @@ import * as crypto from 'crypto'; import * as fs from 'fs'; import * as http from 'http'; import * as net from 'net'; -import * as url from 'url'; -import { release, hostname } from 'os'; -import * as perf from 'vs/base/common/performance'; import { performance } from 'perf_hooks'; -import { VSBuffer } from 'vs/base/common/buffer'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; -import { generateUuid } from 'vs/base/common/uuid'; -import { Promises } from 'vs/base/node/pfs'; -import { findFreePort } from 'vs/base/node/ports'; -import * as platform from 'vs/base/common/platform'; -import { PersistentProtocol, ProtocolConstants } from 'vs/base/parts/ipc/common/ipc.net'; -import { NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; -import { ConnectionType, ConnectionTypeRequest, ErrorMessage, HandshakeMessage, IRemoteExtensionHostStartParams, ITunnelConnectionStartParams, SignRequest } from 'vs/platform/remote/common/remoteAgentConnection'; -import { ExtensionHostConnection } from 'vs/server/extensionHostConnection'; -import { ManagementConnection } from 'vs/server/remoteExtensionManagement'; -import { createRemoteURITransformer } from 'vs/server/remoteUriTransformer'; -import { ILogService, LogLevel, AbstractLogger, DEFAULT_LOG_LEVEL, MultiplexLogService, getLogLevel, LogService } from 'vs/platform/log/common/log'; -import { FileAccess, Schemas } from 'vs/base/common/network'; -import product from 'vs/platform/product/common/product'; -import { IEnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IRequestService } from 'vs/platform/request/common/request'; -import { RequestService } from 'vs/platform/request/node/requestService'; -import { ITelemetryAppender, NullAppender, supportsTelemetry } from 'vs/platform/telemetry/common/telemetryUtils'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IExtensionGalleryService, IExtensionManagementCLIService, IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ExtensionGalleryServiceWithNoStorageService } from 'vs/platform/extensionManagement/common/extensionGalleryService'; -import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; -import { IDownloadService } from 'vs/platform/download/common/download'; -import { DownloadServiceChannelClient } from 'vs/platform/download/common/downloadIpc'; -import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; -import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; -import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; -import { ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; -import { resolveCommonProperties } from 'vs/platform/telemetry/common/commonProperties'; -import { getMachineId } from 'vs/base/node/id'; -import { FileService } from 'vs/platform/files/common/fileService'; -import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; -import { IFileService } from 'vs/platform/files/common/files'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { RemoteAgentConnectionContext } from 'vs/platform/remote/common/remoteAgentEnvironment'; -import { IPCServer, ClientConnectionEvent, IMessagePassingProtocol, StaticRouter, ProxyChannel } from 'vs/base/parts/ipc/common/ipc'; -import { Emitter, Event } from 'vs/base/common/event'; -import { RemoteAgentEnvironmentChannel } from 'vs/server/remoteAgentEnvironmentImpl'; -import { RemoteAgentFileSystemProviderChannel } from 'vs/server/remoteFileSystemProviderServer'; -import { REMOTE_FILE_SYSTEM_CHANNEL_NAME } from 'vs/workbench/services/remote/common/remoteFileSystemProviderClient'; -import { RequestChannel } from 'vs/platform/request/common/requestIpc'; -import { ExtensionManagementChannel } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; -import ErrorTelemetry from 'vs/platform/telemetry/node/errorTelemetry'; -import { ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; -import { LogLevelChannel } from 'vs/platform/log/common/logIpc'; -import { IURITransformer } from 'vs/base/common/uriIpc'; -import { WebClientServer, serveError, serveFile } from 'vs/server/webClientServer'; -import { URI } from 'vs/base/common/uri'; -import { isEqualOrParent } from 'vs/base/common/extpath'; -import { IServerEnvironmentService, ServerEnvironmentService, ServerParsedArgs } from 'vs/server/serverEnvironmentService'; -import { basename, dirname, join } from 'vs/base/common/path'; -import { REMOTE_TERMINAL_CHANNEL_NAME } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel'; -import { RemoteTerminalChannel } from 'vs/server/remoteTerminalChannel'; +import * as url from 'url'; import { LoaderStats } from 'vs/base/common/amd'; -import { RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { ExtensionManagementCLIService } from 'vs/platform/extensionManagement/common/extensionManagementCLIService'; -import { SpdLogLogger } from 'vs/platform/log/node/spdlogLog'; -import { IPtyService, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; -import { PtyHostService } from 'vs/platform/terminal/node/ptyHostService'; -import { IRemoteTelemetryService, RemoteNullTelemetryService, RemoteTelemetryService } from 'vs/server/remoteTelemetryService'; -import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; -import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; -import { CredentialsMainService } from 'vs/platform/credentials/node/credentialsMainService'; -import { IEncryptionService } from 'vs/workbench/services/encryption/common/encryptionService'; -import { EncryptionMainService } from 'vs/platform/encryption/node/encryptionMainService'; -import { RemoteTelemetryChannel } from 'vs/server/remoteTelemetryChannel'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { isEqualOrParent } from 'vs/base/common/extpath'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { connectionTokenQueryName, FileAccess, Schemas } from 'vs/base/common/network'; +import { dirname, join } from 'vs/base/common/path'; +import * as perf from 'vs/base/common/performance'; +import * as platform from 'vs/base/common/platform'; +import { URI } from 'vs/base/common/uri'; +import { generateUuid } from 'vs/base/common/uuid'; +import { findFreePort } from 'vs/base/node/ports'; +import { PersistentProtocol } from 'vs/base/parts/ipc/common/ipc.net'; +import { NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; +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 { ConnectionType, ConnectionTypeRequest, ErrorMessage, HandshakeMessage, IRemoteExtensionHostStartParams, ITunnelConnectionStartParams, SignRequest } from 'vs/platform/remote/common/remoteAgentConnection'; +import { RemoteAgentConnectionContext } from 'vs/platform/remote/common/remoteAgentEnvironment'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { ExtensionHostConnection } from 'vs/server/node/extensionHostConnection'; +import { ManagementConnection } from 'vs/server/node/remoteExtensionManagement'; +import { determineServerConnectionToken, requestHasValidConnectionToken as httpRequestHasValidConnectionToken, ServerConnectionToken, ServerConnectionTokenParseError, ServerConnectionTokenType } from 'vs/server/node/serverConnectionToken'; +import { IServerEnvironmentService, ServerParsedArgs } from 'vs/server/node/serverEnvironmentService'; +import { setupServerServices, SocketServer } from 'vs/server/node/serverServices'; +import { serveError, serveFile, WebClientServer } from 'vs/server/node/webClientServer'; const SHUTDOWN_TIMEOUT = 5 * 60 * 1000; -const eventPrefix = 'monacoworkbench'; - -class SocketServer extends IPCServer { - - private _onDidConnectEmitter: Emitter; - - constructor() { - const emitter = new Emitter(); - super(emitter.event); - this._onDidConnectEmitter = emitter; - } - - public acceptConnection(protocol: IMessagePassingProtocol, onDidClientDisconnect: Event): void { - this._onDidConnectEmitter.fire({ protocol, onDidClientDisconnect }); - } -} - -function twodigits(n: number): string { - if (n < 10) { - return `0${n}`; - } - return String(n); -} - -function now(): string { - const date = new Date(); - return `${twodigits(date.getHours())}:${twodigits(date.getMinutes())}:${twodigits(date.getSeconds())}`; -} - -class ServerLogService extends AbstractLogger implements ILogService { - _serviceBrand: undefined; - private useColors: boolean; - - constructor(logLevel: LogLevel = DEFAULT_LOG_LEVEL) { - super(); - this.setLevel(logLevel); - this.useColors = Boolean(process.stdout.isTTY); - } - - trace(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Trace) { - if (this.useColors) { - console.log(`\x1b[90m[${now()}]\x1b[0m`, message, ...args); - } else { - console.log(`[${now()}]`, message, ...args); - } - } - } - - debug(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Debug) { - if (this.useColors) { - console.log(`\x1b[90m[${now()}]\x1b[0m`, message, ...args); - } else { - console.log(`[${now()}]`, message, ...args); - } - } - } - - info(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Info) { - if (this.useColors) { - console.log(`\x1b[90m[${now()}]\x1b[0m`, message, ...args); - } else { - console.log(`[${now()}]`, message, ...args); - } - } - } - - warn(message: string | Error, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Warning) { - if (this.useColors) { - console.warn(`\x1b[93m[${now()}]\x1b[0m`, message, ...args); - } else { - console.warn(`[${now()}]`, message, ...args); - } - } - } - - error(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Error) { - if (this.useColors) { - console.error(`\x1b[91m[${now()}]\x1b[0m`, message, ...args); - } else { - console.error(`[${now()}]`, message, ...args); - } - } - } - - 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 - } - - flush(): void { - // noop - } -} - -export type ServerListenOptions = { host?: string; port?: number; socketPath?: string }; - declare module vsda { // the signer is a native module that for historical reasons uses a lower case class name // eslint-disable-next-line @typescript-eslint/naming-convention @@ -213,173 +53,33 @@ declare module vsda { export class RemoteExtensionHostAgentServer extends Disposable { - private readonly _logService: ILogService; - private readonly _socketServer: SocketServer; - private readonly _uriTransformerCache: { [remoteAuthority: string]: IURITransformer; }; - private readonly _extHostConnections: { [reconnectionToken: string]: ExtensionHostConnection; }; - private readonly _managementConnections: { [reconnectionToken: string]: ManagementConnection; }; + private readonly _extHostConnections: { [reconnectionToken: string]: ExtensionHostConnection }; + private readonly _managementConnections: { [reconnectionToken: string]: ManagementConnection }; private readonly _allReconnectionTokens: Set; private readonly _webClientServer: WebClientServer | null; private shutdownTimer: NodeJS.Timer | undefined; constructor( - private readonly _environmentService: IServerEnvironmentService, - private readonly _productService: IProductService, - private readonly _connectionToken: string, - private readonly _connectionTokenIsMandatory: boolean, + private readonly _socketServer: SocketServer, + private readonly _connectionToken: ServerConnectionToken, hasWebClient: boolean, - REMOTE_DATA_FOLDER: string + @IServerEnvironmentService private readonly _environmentService: IServerEnvironmentService, + @IProductService private readonly _productService: IProductService, + @ILogService private readonly _logService: ILogService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, ) { super(); - const logService = getOrCreateSpdLogService(this._environmentService); - logService.trace(`Remote configuration data at ${REMOTE_DATA_FOLDER}`); - logService.trace('process arguments:', this._environmentService.args); - const serverGreeting = _productService.serverGreeting.join('\n'); - if (serverGreeting) { - logService.info(`\n\n${serverGreeting}\n\n`); - } - - this._logService = new MultiplexLogService([new ServerLogService(getLogLevel(this._environmentService)), logService]); - this._socketServer = new SocketServer(); - this._uriTransformerCache = Object.create(null); this._extHostConnections = Object.create(null); this._managementConnections = Object.create(null); this._allReconnectionTokens = new Set(); - - if (hasWebClient) { - this._webClientServer = new WebClientServer(this._connectionToken, this._environmentService, this._logService, this._productService); - } else { - this._webClientServer = null; - } - this._logService.info(`Extension host agent started.`); - } - - public async initialize(): Promise<{ telemetryService: ITelemetryService; }> { - const services = await this._createServices(); - setTimeout(() => this._cleanupOlderLogs(this._environmentService.logsPath).then(null, err => this._logService.error(err)), 10000); - return services; - } - - private async _createServices(): Promise<{ telemetryService: ITelemetryService; }> { - const services = new ServiceCollection(); - - // ExtensionHost Debug broadcast service - this._socketServer.registerChannel(ExtensionHostDebugBroadcastChannel.ChannelName, new ExtensionHostDebugBroadcastChannel()); - - // TODO: @Sandy @Joao need dynamic context based router - const router = new StaticRouter(ctx => ctx.clientId === 'renderer'); - this._socketServer.registerChannel('logger', new LogLevelChannel(this._logService)); - - services.set(IEnvironmentService, this._environmentService); - services.set(INativeEnvironmentService, this._environmentService); - - services.set(ILogService, this._logService); - services.set(IProductService, this._productService); - - // Files - const fileService = this._register(new FileService(this._logService)); - services.set(IFileService, fileService); - fileService.registerProvider(Schemas.file, this._register(new DiskFileSystemProvider(this._logService))); - - const configurationService = new ConfigurationService(this._environmentService.machineSettingsResource, fileService); - services.set(IConfigurationService, configurationService); - - // URI Identity - services.set(IUriIdentityService, new UriIdentityService(fileService)); - - // Request - services.set(IRequestService, new SyncDescriptor(RequestService)); - - let appInsightsAppender: ITelemetryAppender = NullAppender; - const machineId = await getMachineId(); - if (supportsTelemetry(this._productService, this._environmentService)) { - if (this._productService.aiConfig && this._productService.aiConfig.asimovKey) { - appInsightsAppender = new AppInsightsAppender(eventPrefix, null, this._productService.aiConfig.asimovKey); - this._register(toDisposable(() => appInsightsAppender!.flush())); // Ensure the AI appender is disposed so that it flushes remaining data - } - - const config: ITelemetryServiceConfig = { - appenders: [appInsightsAppender], - commonProperties: resolveCommonProperties(fileService, release(), hostname(), process.arch, this._productService.commit, this._productService.version + '-remote', machineId, this._productService.msftInternalDomains, this._environmentService.installSourcePath, 'remoteAgent'), - piiPaths: [this._environmentService.appRoot] - }; - - services.set(IRemoteTelemetryService, new SyncDescriptor(RemoteTelemetryService, [config, undefined])); - } else { - services.set(IRemoteTelemetryService, RemoteNullTelemetryService); - } - - services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryServiceWithNoStorageService)); - - const downloadChannel = this._socketServer.getChannel('download', router); - services.set(IDownloadService, new DownloadServiceChannelClient(downloadChannel, () => this._getUriTransformer('renderer') /* TODO: @Sandy @Joao need dynamic context based router */)); - - services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService)); - - const instantiationService = new InstantiationService(services); - services.set(ILocalizationsService, instantiationService.createInstance(LocalizationsService)); - - const extensionManagementCLIService = instantiationService.createInstance(ExtensionManagementCLIService); - services.set(IExtensionManagementCLIService, extensionManagementCLIService); - - const ptyService = instantiationService.createInstance( - PtyHostService, - { - graceTime: ProtocolConstants.ReconnectionGraceTime, - shortGraceTime: ProtocolConstants.ReconnectionShortGraceTime, - scrollback: configurationService.getValue(TerminalSettingId.PersistentSessionScrollback) ?? 100 - } + this._webClientServer = ( + hasWebClient + ? this._instantiationService.createInstance(WebClientServer, this._connectionToken) + : null ); - services.set(IPtyService, ptyService); - - const encryptionService = instantiationService.createInstance(EncryptionMainService, machineId); - services.set(IEncryptionService, encryptionService); - - const credentialsService = instantiationService.createInstance(CredentialsMainService); - services.set(ICredentialsService, credentialsService); - - return instantiationService.invokeFunction(accessor => { - const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(this._connectionToken, this._environmentService, extensionManagementCLIService, this._logService, this._productService); - this._socketServer.registerChannel('remoteextensionsenvironment', remoteExtensionEnvironmentChannel); - - const telemetryChannel = new RemoteTelemetryChannel(accessor.get(IRemoteTelemetryService), appInsightsAppender); - this._socketServer.registerChannel('telemetry', telemetryChannel); - - this._socketServer.registerChannel(REMOTE_TERMINAL_CHANNEL_NAME, new RemoteTerminalChannel(this._environmentService, this._logService, ptyService, this._productService)); - - const remoteFileSystemChannel = new RemoteAgentFileSystemProviderChannel(this._logService, this._environmentService); - this._socketServer.registerChannel(REMOTE_FILE_SYSTEM_CHANNEL_NAME, remoteFileSystemChannel); - - this._socketServer.registerChannel('request', new RequestChannel(accessor.get(IRequestService))); - - const extensionManagementService = accessor.get(IExtensionManagementService); - const channel = new ExtensionManagementChannel(extensionManagementService, (ctx: RemoteAgentConnectionContext) => this._getUriTransformer(ctx.remoteAuthority)); - this._socketServer.registerChannel('extensions', channel); - - const encryptionChannel = ProxyChannel.fromService(accessor.get(IEncryptionService)); - this._socketServer.registerChannel('encryption', encryptionChannel); - - const credentialsChannel = ProxyChannel.fromService(accessor.get(ICredentialsService)); - this._socketServer.registerChannel('credentials', credentialsChannel); - - // clean up deprecated extensions - (extensionManagementService as ExtensionManagementService).removeDeprecatedExtensions(); - - this._register(new ErrorTelemetry(accessor.get(ITelemetryService))); - - return { - telemetryService: accessor.get(ITelemetryService) - }; - }); - } - - private _getUriTransformer(remoteAuthority: string): IURITransformer { - if (!this._uriTransformerCache[remoteAuthority]) { - this._uriTransformerCache[remoteAuthority] = createRemoteURITransformer(remoteAuthority); - } - return this._uriTransformerCache[remoteAuthority]; + this._logService.info(`Extension host agent started.`); } public async handleRequest(req: http.IncomingMessage, res: http.ServerResponse) { @@ -412,13 +112,14 @@ export class RemoteExtensionHostAgentServer extends Disposable { return res.end('OK'); } + if (!httpRequestHasValidConnectionToken(this._connectionToken, req, parsedUrl)) { + // invalid connection token + return serveError(req, res, 403, `Forbidden.`); + } + if (pathname === '/vscode-remote-resource') { // Handle HTTP requests for resources rendered in the rich client (images, fonts, etc.) // These resources could be files shipped with extensions or even workspace files. - if (parsedUrl.query['tkn'] !== this._connectionToken) { - return serveError(req, res, 403, `Forbidden.`); - } - const desiredPath = parsedUrl.query['path']; if (typeof desiredPath !== 'string') { return serveError(req, res, 400, `Bad request.`); @@ -531,19 +232,6 @@ export class RemoteExtensionHostAgentServer extends Disposable { } // Eventually cleanup - /** - * Cleans up older logs, while keeping the 10 most recent ones. - */ - private async _cleanupOlderLogs(logsPath: string): Promise { - const currentLog = basename(logsPath); - const logsRoot = dirname(logsPath); - const children = await Promises.readdir(logsRoot); - const allSessions = children.filter(name => /^\d{8}T\d{6}$/.test(name)); - const oldSessions = allSessions.sort().filter((d) => d !== currentLog); - const toDelete = oldSessions.slice(0, Math.max(0, oldSessions.length - 9)); - - await Promise.all(toDelete.map(name => Promises.rm(join(logsRoot, name)))); - } private _getRemoteAddress(socket: NodeSocket | WebSocketNodeSocket): string { let _socket: net.Socket; @@ -613,7 +301,7 @@ export class RemoteExtensionHostAgentServer extends Disposable { return rejectWebSocketConnection(`Invalid first message`); } - if (this._connectionTokenIsMandatory && msg1.auth !== this._connectionToken) { + if (this._connectionToken.type === ServerConnectionTokenType.Mandatory && !this._connectionToken.validate(msg1.auth)) { return rejectWebSocketConnection(`Unauthorized client refused: auth mismatch`); } @@ -668,7 +356,7 @@ export class RemoteExtensionHostAgentServer extends Disposable { let valid = false; if (!validator) { valid = true; - } else if (msg2.signedData === this._connectionToken) { + } else if (this._connectionToken.validate(msg2.signedData)) { // web client valid = true; } else { @@ -936,88 +624,47 @@ export class RemoteExtensionHostAgentServer extends Disposable { } } -const connectionTokenRegex = /^[0-9A-Za-z-]+$/; - -function parseConnectionToken(args: ServerParsedArgs): { connectionToken: string; connectionTokenIsMandatory: boolean; } { - - let connectionToken = args['connection-token']; - const connectionTokenFile = args['connection-token-file']; - const compatibility = args['compatibility'] === '1.63'; - - if (args['without-connection-token']) { - if (connectionToken || connectionTokenFile) { - console.warn(`Please do not use the argument '--connection-token' or '--connection-token-file' at the same time as '--without-connection-token'.`); - process.exit(1); - } - return { connectionToken: 'without-connection-token' /* to be implemented @alexd */, connectionTokenIsMandatory: false }; - } - - if (connectionTokenFile) { - if (connectionToken) { - console.warn(`Please do not use the argument '--connection-token' at the same time as '--connection-token-file'.`); - process.exit(1); - } - try { - let rawConnectionToken = fs.readFileSync(connectionTokenFile).toString(); - rawConnectionToken = rawConnectionToken.replace(/\r?\n$/, ''); - if (!connectionTokenRegex.test(rawConnectionToken)) { - console.warn(`The connection token defined in '${connectionTokenFile} does not adhere to the characters 0-9, a-z, A-Z or -.`); - process.exit(1); - } - return { connectionToken: rawConnectionToken, connectionTokenIsMandatory: true }; - } catch (e) { - console.warn(`Unable to read the connection token file at '${connectionTokenFile}'.`); - process.exit(1); - } - - } else { - if (connectionToken !== undefined && !connectionTokenRegex.test(connectionToken)) { - console.warn(`The connection token '${connectionToken}' does not adhere to the characters 0-9, a-z, A-Z or -.`); - process.exit(1); - } else if (connectionToken === undefined) { - connectionToken = generateUuid(); - console.log(`Connection token: ${connectionToken}`); - if (compatibility) { - console.log(`Connection token or will made mandatory in the next release. To run without connection token, use '--without-connection-token'.`); - } - } - return { connectionToken, connectionTokenIsMandatory: !compatibility }; - } -} - export interface IServerAPI { /** - * Do not remove!!. Called from vs/server/main.js + * Do not remove!!. Called from server-main.js */ handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise; /** - * Do not remove!!. Called from vs/server/main.js + * Do not remove!!. Called from server-main.js */ handleUpgrade(req: http.IncomingMessage, socket: net.Socket): void; /** - * Do not remove!!. Called from vs/server/main.js + * Do not remove!!. Called from server-main.js */ handleServerError(err: Error): void; /** - * Do not remove!!. Called from vs/server/main.js + * Do not remove!!. Called from server-main.js */ dispose(): void; } export async function createServer(address: string | net.AddressInfo | null, args: ServerParsedArgs, REMOTE_DATA_FOLDER: string): Promise { - const productService = { _serviceBrand: undefined, ...product }; - const environmentService = new ServerEnvironmentService(args, productService); + const connectionToken = await determineServerConnectionToken(args); + if (connectionToken instanceof ServerConnectionTokenParseError) { + console.warn(connectionToken.message); + process.exit(1); + } + const disposables = new DisposableStore(); + const { socketServer, instantiationService } = await setupServerServices(connectionToken, args, REMOTE_DATA_FOLDER, disposables); // // On Windows, exit early with warning message to users about potential security issue // if there is node_modules folder under home drive or Users folder. // - if (process.platform === 'win32' && process.env.HOMEDRIVE && process.env.HOMEPATH) { - const homeDirModulesPath = join(process.env.HOMEDRIVE, 'node_modules'); - const userDir = dirname(join(process.env.HOMEDRIVE, process.env.HOMEPATH)); - const userDirModulesPath = join(userDir, 'node_modules'); - if (fs.existsSync(homeDirModulesPath) || fs.existsSync(userDirModulesPath)) { - const message = ` + instantiationService.invokeFunction((accessor) => { + const logService = accessor.get(ILogService); + + if (process.platform === 'win32' && process.env.HOMEDRIVE && process.env.HOMEPATH) { + const homeDirModulesPath = join(process.env.HOMEDRIVE, 'node_modules'); + const userDir = dirname(join(process.env.HOMEDRIVE, process.env.HOMEPATH)); + const userDirModulesPath = join(userDir, 'node_modules'); + if (fs.existsSync(homeDirModulesPath) || fs.existsSync(userDirModulesPath)) { + const message = ` * * !!!! Server terminated due to presence of CVE-2020-1416 !!!! @@ -1030,24 +677,22 @@ export async function createServer(address: string | net.AddressInfo | null, arg * `; - const logService = getOrCreateSpdLogService(environmentService); - logService.warn(message); - console.warn(message); - process.exit(0); + logService.warn(message); + console.warn(message); + process.exit(0); + } } - } + }); - const { connectionToken, connectionTokenIsMandatory } = parseConnectionToken(args); const hasWebClient = fs.existsSync(FileAccess.asFileUri('vs/code/browser/workbench/workbench.html', require).fsPath); if (hasWebClient && address && typeof address !== 'string') { // ships the web ui! - console.log(`Web UI available at http://localhost${address.port === 80 ? '' : `:${address.port}`}/?tkn=${connectionToken}`); + const queryPart = (connectionToken.type !== ServerConnectionTokenType.None ? `?${connectionTokenQueryName}=${connectionToken.value}` : ''); + console.log(`Web UI available at http://localhost${address.port === 80 ? '' : `:${address.port}`}/${queryPart}`); } - const remoteExtensionHostAgentServer = new RemoteExtensionHostAgentServer(environmentService, productService, connectionToken, connectionTokenIsMandatory, hasWebClient, REMOTE_DATA_FOLDER); - const services = await remoteExtensionHostAgentServer.initialize(); - const { telemetryService } = services; + const remoteExtensionHostAgentServer = instantiationService.createInstance(RemoteExtensionHostAgentServer, socketServer, connectionToken, hasWebClient); perf.mark('code/server/ready'); const currentTime = performance.now(); @@ -1055,23 +700,27 @@ export async function createServer(address: string | net.AddressInfo | null, arg const vscodeServerListenTime: number = (global).vscodeServerListenTime; const vscodeServerCodeLoadedTime: number = (global).vscodeServerCodeLoadedTime; - type ServerStartClassification = { - startTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - startedTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - codeLoadedTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - readyTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - }; - type ServerStartEvent = { - startTime: number; - startedTime: number; - codeLoadedTime: number; - readyTime: number; - }; - telemetryService.publicLog2('serverStart', { - startTime: vscodeServerStartTime, - startedTime: vscodeServerListenTime, - codeLoadedTime: vscodeServerCodeLoadedTime, - readyTime: currentTime + instantiationService.invokeFunction((accessor) => { + const telemetryService = accessor.get(ITelemetryService); + + type ServerStartClassification = { + startTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + startedTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + codeLoadedTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + readyTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + }; + type ServerStartEvent = { + startTime: number; + startedTime: number; + codeLoadedTime: number; + readyTime: number; + }; + telemetryService.publicLog2('serverStart', { + startTime: vscodeServerStartTime, + startedTime: vscodeServerListenTime, + codeLoadedTime: vscodeServerCodeLoadedTime, + readyTime: currentTime + }); }); if (args['print-startup-performance']) { @@ -1093,13 +742,3 @@ export async function createServer(address: string | net.AddressInfo | null, arg } return remoteExtensionHostAgentServer; } - -const getOrCreateSpdLogService: (environmentService: IServerEnvironmentService) => ILogService = (function () { - let _logService: ILogService | null; - return function getLogService(environmentService: IServerEnvironmentService): ILogService { - if (!_logService) { - _logService = new LogService(new SpdLogLogger(RemoteExtensionLogFileName, join(environmentService.logsPath, `${RemoteExtensionLogFileName}.log`), true, false, getLogLevel(environmentService))); - } - return _logService; - }; -})(); diff --git a/src/vs/server/remoteExtensionManagement.ts b/src/vs/server/node/remoteExtensionManagement.ts similarity index 100% rename from src/vs/server/remoteExtensionManagement.ts rename to src/vs/server/node/remoteExtensionManagement.ts diff --git a/src/vs/server/remoteFileSystemProviderServer.ts b/src/vs/server/node/remoteFileSystemProviderServer.ts similarity index 94% rename from src/vs/server/remoteFileSystemProviderServer.ts rename to src/vs/server/node/remoteFileSystemProviderServer.ts index 33c21243523..9a4c62a6aff 100644 --- a/src/vs/server/remoteFileSystemProviderServer.ts +++ b/src/vs/server/node/remoteFileSystemProviderServer.ts @@ -8,11 +8,11 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { IURITransformer } from 'vs/base/common/uriIpc'; import { IFileChange } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; -import { createRemoteURITransformer } from 'vs/server/remoteUriTransformer'; +import { createURITransformer } from 'vs/workbench/api/node/uriTransformer'; import { RemoteAgentConnectionContext } from 'vs/platform/remote/common/remoteAgentEnvironment'; import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; import { posix, delimiter } from 'vs/base/common/path'; -import { IServerEnvironmentService } from 'vs/server/serverEnvironmentService'; +import { IServerEnvironmentService } from 'vs/server/node/serverEnvironmentService'; import { AbstractDiskFileSystemProviderChannel, AbstractSessionFileWatcher, ISessionFileWatcher } from 'vs/platform/files/node/diskFileSystemProviderServer'; import { IRecursiveWatcherOptions } from 'vs/platform/files/common/watcher'; @@ -32,7 +32,7 @@ export class RemoteAgentFileSystemProviderChannel extends AbstractDiskFileSystem protected override getUriTransformer(ctx: RemoteAgentConnectionContext): IURITransformer { let transformer = this.uriTransformerCache.get(ctx.remoteAuthority); if (!transformer) { - transformer = createRemoteURITransformer(ctx.remoteAuthority); + transformer = createURITransformer(ctx.remoteAuthority); this.uriTransformerCache.set(ctx.remoteAuthority, transformer); } diff --git a/src/vs/server/remoteLanguagePacks.ts b/src/vs/server/node/remoteLanguagePacks.ts similarity index 100% rename from src/vs/server/remoteLanguagePacks.ts rename to src/vs/server/node/remoteLanguagePacks.ts diff --git a/src/vs/server/remoteTerminalChannel.ts b/src/vs/server/node/remoteTerminalChannel.ts similarity index 96% rename from src/vs/server/remoteTerminalChannel.ts rename to src/vs/server/node/remoteTerminalChannel.ts index 66b8b435641..fc9f72d62c5 100644 --- a/src/vs/server/remoteTerminalChannel.ts +++ b/src/vs/server/node/remoteTerminalChannel.ts @@ -18,7 +18,7 @@ import { RemoteAgentConnectionContext } from 'vs/platform/remote/common/remoteAg import { IPtyService, IShellLaunchConfig, ITerminalProfile } from 'vs/platform/terminal/common/terminal'; import { IGetTerminalLayoutInfoArgs, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { createRemoteURITransformer } from 'vs/server/remoteUriTransformer'; +import { createURITransformer } from 'vs/workbench/api/node/uriTransformer'; import { CLIServerBase, ICommandsExecuter } from 'vs/workbench/api/node/extHostCLIServer'; import { IEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; import { MergedEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariableCollection'; @@ -26,8 +26,8 @@ import { deserializeEnvironmentVariableCollection } from 'vs/workbench/contrib/t import { ICreateTerminalProcessArguments, ICreateTerminalProcessResult, IWorkspaceFolderData } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel'; import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { AbstractVariableResolverService } from 'vs/workbench/services/configurationResolver/common/variableResolver'; -import { buildUserEnvironment } from 'vs/server/extensionHostConnection'; -import { IServerEnvironmentService } from 'vs/server/serverEnvironmentService'; +import { buildUserEnvironment } from 'vs/server/node/extensionHostConnection'; +import { IServerEnvironmentService } from 'vs/server/node/serverEnvironmentService'; import { IProductService } from 'vs/platform/product/common/productService'; class CustomVariableResolver extends AbstractVariableResolverService { @@ -35,7 +35,7 @@ class CustomVariableResolver extends AbstractVariableResolverService { env: platform.IProcessEnvironment, workspaceFolders: IWorkspaceFolder[], activeFileResource: URI | undefined, - resolvedVariables: { [name: string]: string; } + resolvedVariables: { [name: string]: string } ) { super({ getFolderUri: (folderName: string): URI | undefined => { @@ -69,7 +69,7 @@ class CustomVariableResolver extends AbstractVariableResolverService { getLineNumber: (): string | undefined => { return resolvedVariables['lineNumber']; } - }, undefined, Promise.resolve(env)); + }, undefined, Promise.resolve(os.homedir()), Promise.resolve(env)); } } @@ -82,7 +82,7 @@ export class RemoteTerminalChannel extends Disposable implements IServerChannel< uriTransformer: IURITransformer; }>(); - private readonly _onExecuteCommand = this._register(new Emitter<{ reqId: number, commandId: string, commandArgs: any[] }>()); + private readonly _onExecuteCommand = this._register(new Emitter<{ reqId: number; commandId: string; commandArgs: any[] }>()); readonly onExecuteCommand = this._onExecuteCommand.event; constructor( @@ -99,7 +99,7 @@ export class RemoteTerminalChannel extends Disposable implements IServerChannel< case '$restartPtyHost': return this._ptyService.restartPtyHost?.apply(this._ptyService, args); case '$createProcess': { - const uriTransformer = createRemoteURITransformer(ctx.remoteAuthority); + const uriTransformer = createURITransformer(ctx.remoteAuthority); return this._createProcess(uriTransformer, args); } case '$attachToProcess': return this._ptyService.attachToProcess.apply(this._ptyService, args); diff --git a/src/vs/server/remoteCli.ts b/src/vs/server/node/server.cli.ts similarity index 91% rename from src/vs/server/remoteCli.ts rename to src/vs/server/node/server.cli.ts index 92b7f50bde5..31365a6d00a 100644 --- a/src/vs/server/remoteCli.ts +++ b/src/vs/server/node/server.cli.ts @@ -32,7 +32,7 @@ interface ProductDescription { executableName: string; } -interface RemoteParsedArgs extends NativeParsedArgs { 'gitCredential'?: string; 'openExternal'?: boolean; } +interface RemoteParsedArgs extends NativeParsedArgs { 'gitCredential'?: string; 'openExternal'?: boolean } const isSupportedForCmd = (optionId: keyof RemoteParsedArgs) => { @@ -105,7 +105,7 @@ export function main(desc: ProductDescription, args: string[]): void { options['openExternal'] = { type: 'boolean' }; } - const errorReporter : ErrorReporter = { + const errorReporter: ErrorReporter = { onMultipleValues: (id: string, usedValue: string) => { console.error(`Option ${id} can only be defined once. Using value ${usedValue}.`); }, @@ -209,7 +209,8 @@ export function main(desc: ProductDescription, args: string[]): void { cmdLine.push(`--${opt}=${value}`); } }); - const cp = _cp.fork(join(__dirname, 'main.js'), cmdLine, { stdio: 'inherit' }); + + const cp = _cp.fork(join(__dirname, '../../../server-main.js'), cmdLine, { stdio: 'inherit' }); cp.on('error', err => console.log(err)); return; } @@ -260,6 +261,8 @@ export function main(desc: ProductDescription, args: string[]): void { type: 'status' }, verbose).then((res: string) => { console.log(res); + }).catch(e => { + console.error('Error when requesting status:', e); }); return; } @@ -273,6 +276,8 @@ export function main(desc: ProductDescription, args: string[]): void { force: parsedArgs['force'] }, verbose).then((res: string) => { console.log(res); + }).catch(e => { + console.error('Error when invoking the extension management command:', e); }); return; } @@ -297,7 +302,9 @@ export function main(desc: ProductDescription, args: string[]): void { forceNewWindow: parsedArgs['new-window'], waitMarkerFilePath, remoteAuthority: remote - }, verbose); + }, verbose).catch(e => { + console.error('Error when invoking the open command:', e); + }); if (waitMarkerFilePath) { waitForFileDeleted(waitMarkerFilePath); @@ -328,7 +335,9 @@ function openInBrowser(args: string[], verbose: boolean) { sendToPipe({ type: 'openExternal', uris - }, verbose); + }, verbose).catch(e => { + console.error('Error when invoking the open external command:', e); + }); } } @@ -336,7 +345,7 @@ function sendToPipe(args: PipeCommand, verbose: boolean): Promise { if (verbose) { console.log(JSON.stringify(args, null, ' ')); } - return new Promise(resolve => { + return new Promise((resolve, reject) => { const message = JSON.stringify(args); if (!cliPipe) { console.log('Message ' + message); @@ -347,10 +356,19 @@ function sendToPipe(args: PipeCommand, verbose: boolean): Promise { const opts: _http.RequestOptions = { socketPath: cliPipe, path: '/', - method: 'POST' + method: 'POST', + headers: { + 'content-type': 'application/json', + 'accept': 'application/json' + } }; const req = _http.request(opts, res => { + if (res.headers['content-type'] !== 'application/json') { + reject('Error in response: Invalid content type: Expected \'application/json\', is: ' + res.headers['content-type']); + return; + } + const chunks: string[] = []; res.setEncoding('utf8'); res.on('data', chunk => { @@ -358,7 +376,17 @@ function sendToPipe(args: PipeCommand, verbose: boolean): Promise { }); res.on('error', (err) => fatal('Error in response.', err)); res.on('end', () => { - resolve(chunks.join('')); + const content = chunks.join(''); + try { + const obj = JSON.parse(content); + if (res.statusCode === 200) { + resolve(obj); + } else { + reject(obj); + } + } catch (e) { + reject('Error in response: Unable to parse response as JSON: ' + content); + } }); }); diff --git a/src/vs/server/remoteExtensionHostAgent.ts b/src/vs/server/node/server.main.ts similarity index 84% rename from src/vs/server/remoteExtensionHostAgent.ts rename to src/vs/server/node/server.main.ts index 266e7b0500d..2555835789e 100644 --- a/src/vs/server/remoteExtensionHostAgent.ts +++ b/src/vs/server/node/server.main.ts @@ -7,12 +7,13 @@ import * as os from 'os'; import * as fs from 'fs'; import * as net from 'net'; import { FileAccess } from 'vs/base/common/network'; -import { run as runCli } from 'vs/server/remoteExtensionHostAgentCli'; -import { createServer as doCreateServer, IServerAPI } from 'vs/server/remoteExtensionHostAgentServer'; +import { run as runCli } from 'vs/server/node/remoteExtensionHostAgentCli'; +import { createServer as doCreateServer, IServerAPI } from 'vs/server/node/remoteExtensionHostAgentServer'; import { parseArgs, ErrorReporter } from 'vs/platform/environment/node/argv'; import { join, dirname } from 'vs/base/common/path'; import { performance } from 'perf_hooks'; -import { serverOptions } from 'vs/server/serverEnvironmentService'; +import { serverOptions } from 'vs/server/node/serverEnvironmentService'; +import product from 'vs/platform/product/common/product'; import * as perf from 'vs/base/common/performance'; perf.mark('code/server/codeLoaded'); @@ -34,7 +35,7 @@ const errorReporter: ErrorReporter = { const args = parseArgs(process.argv.slice(2), serverOptions, errorReporter); -const REMOTE_DATA_FOLDER = process.env['VSCODE_AGENT_FOLDER'] || join(os.homedir(), '.vscode-remote'); +const REMOTE_DATA_FOLDER = args['server-data-dir'] || process.env['VSCODE_AGENT_FOLDER'] || join(os.homedir(), product.serverDataFolderName || '.vscode-remote'); const USER_DATA_PATH = join(REMOTE_DATA_FOLDER, 'data'); const APP_SETTINGS_HOME = join(USER_DATA_PATH, 'User'); const GLOBAL_STORAGE_HOME = join(APP_SETTINGS_HOME, 'globalStorage'); @@ -54,14 +55,14 @@ args['extensions-dir'] = args['extensions-dir'] || join(REMOTE_DATA_FOLDER, 'ext }); /** - * invoked by vs/server/main.js + * invoked by server-main.js */ export function spawnCli() { runCli(args, REMOTE_DATA_FOLDER, serverOptions); } /** - * invoked by vs/server/main.js + * invoked by server-main.js */ export function createServer(address: string | net.AddressInfo | null): Promise { return doCreateServer(address, args, REMOTE_DATA_FOLDER); diff --git a/src/vs/server/node/serverConnectionToken.ts b/src/vs/server/node/serverConnectionToken.ts new file mode 100644 index 00000000000..2d678ce9756 --- /dev/null +++ b/src/vs/server/node/serverConnectionToken.ts @@ -0,0 +1,155 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as cookie from 'cookie'; +import * as fs from 'fs'; +import * as http from 'http'; +import * as url from 'url'; +import * as path from 'vs/base/common/path'; +import { generateUuid } from 'vs/base/common/uuid'; +import { connectionTokenCookieName, connectionTokenQueryName } from 'vs/base/common/network'; +import { ServerParsedArgs } from 'vs/server/node/serverEnvironmentService'; +import { Promises } from 'vs/base/node/pfs'; + +const connectionTokenRegex = /^[0-9A-Za-z-]+$/; + +export const enum ServerConnectionTokenType { + None, + Optional,// TODO: Remove this soon + Mandatory +} + +export class NoneServerConnectionToken { + public readonly type = ServerConnectionTokenType.None; + + public validate(connectionToken: any): boolean { + return true; + } +} + +export class OptionalServerConnectionToken { + public readonly type = ServerConnectionTokenType.Optional; + + constructor(public readonly value: string) { + } + + public validate(connectionToken: any): boolean { + return (connectionToken === this.value); + } +} + +export class MandatoryServerConnectionToken { + public readonly type = ServerConnectionTokenType.Mandatory; + + constructor(public readonly value: string) { + } + + public validate(connectionToken: any): boolean { + return (connectionToken === this.value); + } +} + +export type ServerConnectionToken = NoneServerConnectionToken | OptionalServerConnectionToken | MandatoryServerConnectionToken; + +export class ServerConnectionTokenParseError { + constructor( + public readonly message: string + ) { } +} + +export async function parseServerConnectionToken(args: ServerParsedArgs, defaultValue: () => Promise): Promise { + const withoutConnectionToken = args['without-connection-token']; + const connectionToken = args['connection-token']; + const connectionTokenFile = args['connection-token-file']; + const compatibility = (args['compatibility'] === '1.63'); + + if (withoutConnectionToken) { + if (typeof connectionToken !== 'undefined' || typeof connectionTokenFile !== 'undefined') { + return new ServerConnectionTokenParseError(`Please do not use the argument '--connection-token' or '--connection-token-file' at the same time as '--without-connection-token'.`); + } + return new NoneServerConnectionToken(); + } + + if (typeof connectionTokenFile !== 'undefined') { + if (typeof connectionToken !== 'undefined') { + return new ServerConnectionTokenParseError(`Please do not use the argument '--connection-token' at the same time as '--connection-token-file'.`); + } + + let rawConnectionToken: string; + try { + rawConnectionToken = fs.readFileSync(connectionTokenFile).toString().replace(/\r?\n$/, ''); + } catch (e) { + return new ServerConnectionTokenParseError(`Unable to read the connection token file at '${connectionTokenFile}'.`); + } + + if (!connectionTokenRegex.test(rawConnectionToken)) { + return new ServerConnectionTokenParseError(`The connection token defined in '${connectionTokenFile} does not adhere to the characters 0-9, a-z, A-Z or -.`); + } + + return new MandatoryServerConnectionToken(rawConnectionToken); + } + + if (typeof connectionToken !== 'undefined') { + if (!connectionTokenRegex.test(connectionToken)) { + return new ServerConnectionTokenParseError(`The connection token '${connectionToken} does not adhere to the characters 0-9, a-z, A-Z or -.`); + } + + if (compatibility) { + // TODO: Remove this case soon + return new OptionalServerConnectionToken(connectionToken); + } + + return new MandatoryServerConnectionToken(connectionToken); + } + + if (compatibility) { + // TODO: Remove this case soon + console.log(`Breaking change in the next release: Please use one of the following arguments: '--connection-token', '--connection-token-file' or '--without-connection-token'.`); + return new OptionalServerConnectionToken(await defaultValue()); + } + + return new MandatoryServerConnectionToken(await defaultValue()); +} + +export async function determineServerConnectionToken(args: ServerParsedArgs): Promise { + const readOrGenerateConnectionToken = async () => { + if (!args['user-data-dir']) { + // No place to store it! + return generateUuid(); + } + const storageLocation = path.join(args['user-data-dir'], 'token'); + + // First try to find a connection token + try { + const fileContents = await Promises.readFile(storageLocation); + const connectionToken = fileContents.toString().replace(/\r?\n$/, ''); + if (connectionTokenRegex.test(connectionToken)) { + return connectionToken; + } + } catch (err) { } + + // No connection token found, generate one + const connectionToken = generateUuid(); + + try { + // Try to store it + await Promises.writeFile(storageLocation, connectionToken, { mode: 0o600 }); + } catch (err) { } + + return connectionToken; + }; + return parseServerConnectionToken(args, readOrGenerateConnectionToken); +} + +export function requestHasValidConnectionToken(connectionToken: ServerConnectionToken, req: http.IncomingMessage, parsedUrl: url.UrlWithParsedQuery) { + // First check if there is a valid query parameter + if (connectionToken.validate(parsedUrl.query[connectionTokenQueryName])) { + return true; + } + + // Otherwise, check if there is a valid cookie + const cookies = cookie.parse(req.headers.cookie || ''); + return connectionToken.validate(cookies[connectionTokenCookieName]); +} diff --git a/src/vs/server/serverEnvironmentService.ts b/src/vs/server/node/serverEnvironmentService.ts similarity index 80% rename from src/vs/server/serverEnvironmentService.ts rename to src/vs/server/node/serverEnvironmentService.ts index b1320a602f4..efcec94e030 100644 --- a/src/vs/server/serverEnvironmentService.ts +++ b/src/vs/server/node/serverEnvironmentService.ts @@ -14,19 +14,21 @@ export const serverOptions: OptionDescriptions = { /* ----- server setup ----- */ - 'host': { type: 'string', cat: 'o', args: 'ip-address', description: nls.localize('host', 'The IP address the server should listen to. To use in combination with port.') }, - 'port': { type: 'string', cat: 'o', args: 'port | port-port', description: nls.localize('port', 'The port the server should listen to. If 0 is passed a random free port is picked. If a range in the format num-num is passed, a free port from the range is selected.') }, - 'pick-port': { type: 'string', deprecationMessage: 'Use the range notation in `port` instead.' }, - 'socket-path': { type: 'string', cat: 'o', args: 'path', description: nls.localize('socket-path', 'The path to a socket file for the server to listen to.') }, + 'host': { type: 'string', cat: 'o', args: 'ip-address', description: nls.localize('host', "The host name or IP address the server should listen to. If not set, defaults to 'localhost'.") }, + 'port': { type: 'string', cat: 'o', args: 'port | port range', description: nls.localize('port', "The port the server should listen to. If 0 is passed a random free port is picked. If a range in the format num-num is passed, a free port from the range (end inclusive) is selected.") }, + 'pick-port': { type: 'string', deprecationMessage: 'Use the range notation in \'port\' instead.' }, + 'socket-path': { type: 'string', cat: 'o', args: 'path', description: nls.localize('socket-path', "The path to a socket file for the server to listen to.") }, 'connection-token': { type: 'string', cat: 'o', args: 'token', deprecates: ['connectionToken'], description: nls.localize('connection-token', "A secret that must be included with all requests.") }, - 'connection-token-file': { type: 'string', cat: 'o', args: 'path', deprecates: ['connection-secret', 'connectionTokenFile'], description: nls.localize('connection-token-file', "Path to a file that contains the connection token. This will require that all incoming connections know the secret.") }, - 'without-connection-token': { type: 'boolean', cat: 'o', description: nls.localize('without-connection-token', "Run without a connection token. Only use this if the connection is protected by other means.") }, + 'connection-token-file': { type: 'string', cat: 'o', args: 'path', deprecates: ['connection-secret', 'connectionTokenFile'], description: nls.localize('connection-token-file', "Path to a file that contains the connection token.") }, + 'without-connection-token': { type: 'boolean', cat: 'o', description: nls.localize('without-connection-token', "Run without a connection token. Only use this if the connection is secured by other means.") }, 'disable-websocket-compression': { type: 'boolean' }, 'print-startup-performance': { type: 'boolean' }, 'print-ip-address': { type: 'boolean' }, - 'accept-server-license-terms': { type: 'boolean', cat: 'o', description: nls.localize('acceptLicenseTerms', 'If set, the user accepts the server license terms and the server will be started without a user prompt.') }, + 'accept-server-license-terms': { type: 'boolean', cat: 'o', description: nls.localize('acceptLicenseTerms', "If set, the user accepts the server license terms and the server will be started without a user prompt.") }, + 'server-data-dir': { type: 'string', cat: 'o', description: nls.localize('serverDataDir', "Specifies the directory that server data is kept in.") }, + 'telemetry-level': { type: 'string', cat: 'o', args: 'level', description: nls.localize('telemetry-level', "Sets the initial telemetry level. Valid levels are: 'off', 'crash', 'error' and 'all'. If not specified, the server will await a connection before sending any telemetry. Setting this to 'off' is equivalent to --disable-telemetry") }, - /* ----- vs code options ----- */ + /* ----- vs code options --- -- */ 'user-data-dir': OPTIONS['user-data-dir'], 'driver': OPTIONS['driver'], @@ -60,7 +62,7 @@ export const serverOptions: OptionDescriptions = { 'force': OPTIONS['force'], 'do-not-sync': OPTIONS['do-not-sync'], 'pre-release': OPTIONS['pre-release'], - 'start-server': { type: 'boolean', cat: 'e', description: nls.localize('start-server', 'Start the server when installing or uninstalling extensions. To be used in combination with `install-extension`, `install-builtin-extension` and `uninstall-extension`.') }, + 'start-server': { type: 'boolean', cat: 'e', description: nls.localize('start-server', "Start the server when installing or uninstalling extensions. To be used in combination with 'install-extension', 'install-builtin-extension' and 'uninstall-extension'.") }, /* ----- remote development options ----- */ @@ -124,6 +126,10 @@ export interface ServerParsedArgs { 'accept-server-license-terms': boolean; + 'server-data-dir'?: string; + + 'telemetry-level'?: string; + /* ----- vs code options ----- */ 'user-data-dir'?: string; @@ -176,7 +182,7 @@ export interface ServerParsedArgs { help: boolean; version: boolean; - compatibility: string + compatibility: string; _: string[]; } diff --git a/src/vs/server/node/serverServices.ts b/src/vs/server/node/serverServices.ts new file mode 100644 index 00000000000..8bbfb363e74 --- /dev/null +++ b/src/vs/server/node/serverServices.ts @@ -0,0 +1,338 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { hostname, release } from 'os'; +import { Emitter, Event } from 'vs/base/common/event'; +import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { Schemas } from 'vs/base/common/network'; +import * as path from 'vs/base/common/path'; +import { IURITransformer } from 'vs/base/common/uriIpc'; +import { getMachineId } from 'vs/base/node/id'; +import { Promises } from 'vs/base/node/pfs'; +import { ClientConnectionEvent, IMessagePassingProtocol, IPCServer, ProxyChannel, StaticRouter } from 'vs/base/parts/ipc/common/ipc'; +import { ProtocolConstants } from 'vs/base/parts/ipc/common/ipc.net'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'; +import { ICredentialsMainService } from 'vs/platform/credentials/common/credentials'; +import { CredentialsMainService } from 'vs/platform/credentials/node/credentialsMainService'; +import { ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; +import { IDownloadService } from 'vs/platform/download/common/download'; +import { DownloadServiceChannelClient } from 'vs/platform/download/common/downloadIpc'; +import { IEncryptionMainService } from 'vs/platform/encryption/common/encryptionService'; +import { EncryptionMainService } from 'vs/platform/encryption/node/encryptionMainService'; +import { IEnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; +import { ExtensionGalleryServiceWithNoStorageService } from 'vs/platform/extensionManagement/common/extensionGalleryService'; +import { IExtensionGalleryService, IExtensionManagementCLIService, IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { ExtensionManagementCLIService } from 'vs/platform/extensionManagement/common/extensionManagementCLIService'; +import { ExtensionManagementChannel } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; +import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; +import { IFileService } from 'vs/platform/files/common/files'; +import { FileService } from 'vs/platform/files/common/fileService'; +import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; +import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; +import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; +import { AbstractLogger, DEFAULT_LOG_LEVEL, getLogLevel, ILogService, LogLevel, LogService, MultiplexLogService } from 'vs/platform/log/common/log'; +import { LogLevelChannel } from 'vs/platform/log/common/logIpc'; +import { SpdLogLogger } from 'vs/platform/log/node/spdlogLog'; +import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { RemoteAgentConnectionContext } from 'vs/platform/remote/common/remoteAgentEnvironment'; +import { IRequestService } from 'vs/platform/request/common/request'; +import { RequestChannel } from 'vs/platform/request/common/requestIpc'; +import { RequestService } from 'vs/platform/request/node/requestService'; +import { resolveCommonProperties } from 'vs/platform/telemetry/common/commonProperties'; +import { ITelemetryService, TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; +import { ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; +import { ITelemetryAppender, NullAppender, supportsTelemetry } from 'vs/platform/telemetry/common/telemetryUtils'; +import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; +import ErrorTelemetry from 'vs/platform/telemetry/node/errorTelemetry'; +import { IPtyService, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; +import { PtyHostService } from 'vs/platform/terminal/node/ptyHostService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; +import { RemoteAgentEnvironmentChannel } from 'vs/server/node/remoteAgentEnvironmentImpl'; +import { RemoteAgentFileSystemProviderChannel } from 'vs/server/node/remoteFileSystemProviderServer'; +import { ServerTelemetryChannel } from 'vs/platform/telemetry/common/remoteTelemetryChannel'; +import { IServerTelemetryService, ServerNullTelemetryService, ServerTelemetryService } from 'vs/platform/telemetry/common/serverTelemetryService'; +import { RemoteTerminalChannel } from 'vs/server/node/remoteTerminalChannel'; +import { createURITransformer } from 'vs/workbench/api/node/uriTransformer'; +import { ServerConnectionToken } from 'vs/server/node/serverConnectionToken'; +import { ServerEnvironmentService, ServerParsedArgs } from 'vs/server/node/serverEnvironmentService'; +import { REMOTE_TERMINAL_CHANNEL_NAME } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel'; +import { RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { REMOTE_FILE_SYSTEM_CHANNEL_NAME } from 'vs/workbench/services/remote/common/remoteFileSystemProviderClient'; + +const eventPrefix = 'monacoworkbench'; + +const _uriTransformerCache: { [remoteAuthority: string]: IURITransformer } = Object.create(null); + +function getUriTransformer(remoteAuthority: string): IURITransformer { + if (!_uriTransformerCache[remoteAuthority]) { + _uriTransformerCache[remoteAuthority] = createURITransformer(remoteAuthority); + } + return _uriTransformerCache[remoteAuthority]; +} + +export async function setupServerServices(connectionToken: ServerConnectionToken, args: ServerParsedArgs, REMOTE_DATA_FOLDER: string, disposables: DisposableStore) { + const services = new ServiceCollection(); + const socketServer = new SocketServer(); + + const productService: IProductService = { _serviceBrand: undefined, ...product }; + services.set(IProductService, productService); + + const environmentService = new ServerEnvironmentService(args, productService); + services.set(IEnvironmentService, environmentService); + services.set(INativeEnvironmentService, environmentService); + + const spdLogService = new LogService(new SpdLogLogger(RemoteExtensionLogFileName, path.join(environmentService.logsPath, `${RemoteExtensionLogFileName}.log`), true, false, getLogLevel(environmentService))); + const logService = new MultiplexLogService([new ServerLogService(getLogLevel(environmentService)), spdLogService]); + services.set(ILogService, logService); + setTimeout(() => cleanupOlderLogs(environmentService.logsPath).then(null, err => logService.error(err)), 10000); + + logService.trace(`Remote configuration data at ${REMOTE_DATA_FOLDER}`); + logService.trace('process arguments:', environmentService.args); + const serverGreeting = productService.serverGreeting.join('\n'); + if (serverGreeting) { + spdLogService.info(`\n\n${serverGreeting}\n\n`); + } + + // ExtensionHost Debug broadcast service + socketServer.registerChannel(ExtensionHostDebugBroadcastChannel.ChannelName, new ExtensionHostDebugBroadcastChannel()); + + // TODO: @Sandy @Joao need dynamic context based router + const router = new StaticRouter(ctx => ctx.clientId === 'renderer'); + socketServer.registerChannel('logger', new LogLevelChannel(logService)); + + // Files + const fileService = disposables.add(new FileService(logService)); + services.set(IFileService, fileService); + fileService.registerProvider(Schemas.file, disposables.add(new DiskFileSystemProvider(logService))); + + const configurationService = new ConfigurationService(environmentService.machineSettingsResource, fileService); + services.set(IConfigurationService, configurationService); + + // URI Identity + services.set(IUriIdentityService, new UriIdentityService(fileService)); + + // Request + services.set(IRequestService, new SyncDescriptor(RequestService)); + + let appInsightsAppender: ITelemetryAppender = NullAppender; + const machineId = await getMachineId(); + if (supportsTelemetry(productService, environmentService)) { + if (productService.aiConfig && productService.aiConfig.asimovKey) { + appInsightsAppender = new AppInsightsAppender(eventPrefix, null, productService.aiConfig.asimovKey); + disposables.add(toDisposable(() => appInsightsAppender!.flush())); // Ensure the AI appender is disposed so that it flushes remaining data + } + + const config: ITelemetryServiceConfig = { + appenders: [appInsightsAppender], + commonProperties: resolveCommonProperties(fileService, release(), hostname(), process.arch, productService.commit, productService.version + '-remote', machineId, productService.msftInternalDomains, environmentService.installSourcePath, 'remoteAgent'), + piiPaths: [environmentService.appRoot] + }; + const initialTelemetryLevelArg = environmentService.args['telemetry-level']; + let injectedTelemetryLevel: TelemetryLevel | undefined = undefined; + // Convert the passed in CLI argument into a telemetry level for the telemetry service + if (initialTelemetryLevelArg === 'all') { + injectedTelemetryLevel = TelemetryLevel.USAGE; + } else if (initialTelemetryLevelArg === 'error') { + injectedTelemetryLevel = TelemetryLevel.ERROR; + } else if (initialTelemetryLevelArg === 'crash') { + injectedTelemetryLevel = TelemetryLevel.CRASH; + } else if (initialTelemetryLevelArg !== undefined) { + injectedTelemetryLevel = TelemetryLevel.NONE; + } + services.set(IServerTelemetryService, new SyncDescriptor(ServerTelemetryService, [config, injectedTelemetryLevel])); + } else { + services.set(IServerTelemetryService, ServerNullTelemetryService); + } + + services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryServiceWithNoStorageService)); + + const downloadChannel = socketServer.getChannel('download', router); + services.set(IDownloadService, new DownloadServiceChannelClient(downloadChannel, () => getUriTransformer('renderer') /* TODO: @Sandy @Joao need dynamic context based router */)); + + services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService)); + + const instantiationService: IInstantiationService = new InstantiationService(services); + services.set(ILocalizationsService, instantiationService.createInstance(LocalizationsService)); + + const extensionManagementCLIService = instantiationService.createInstance(ExtensionManagementCLIService); + services.set(IExtensionManagementCLIService, extensionManagementCLIService); + + const ptyService = instantiationService.createInstance( + PtyHostService, + { + graceTime: ProtocolConstants.ReconnectionGraceTime, + shortGraceTime: ProtocolConstants.ReconnectionShortGraceTime, + scrollback: configurationService.getValue(TerminalSettingId.PersistentSessionScrollback) ?? 100 + } + ); + services.set(IPtyService, ptyService); + + services.set(IEncryptionMainService, new SyncDescriptor(EncryptionMainService, [machineId])); + + services.set(ICredentialsMainService, new SyncDescriptor(CredentialsMainService, [true])); + + instantiationService.invokeFunction(accessor => { + const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(connectionToken, environmentService, extensionManagementCLIService, logService, productService); + socketServer.registerChannel('remoteextensionsenvironment', remoteExtensionEnvironmentChannel); + + const telemetryChannel = new ServerTelemetryChannel(accessor.get(IServerTelemetryService), appInsightsAppender); + socketServer.registerChannel('telemetry', telemetryChannel); + + socketServer.registerChannel(REMOTE_TERMINAL_CHANNEL_NAME, new RemoteTerminalChannel(environmentService, logService, ptyService, productService)); + + const remoteFileSystemChannel = new RemoteAgentFileSystemProviderChannel(logService, environmentService); + socketServer.registerChannel(REMOTE_FILE_SYSTEM_CHANNEL_NAME, remoteFileSystemChannel); + + socketServer.registerChannel('request', new RequestChannel(accessor.get(IRequestService))); + + const extensionManagementService = accessor.get(IExtensionManagementService); + const channel = new ExtensionManagementChannel(extensionManagementService, (ctx: RemoteAgentConnectionContext) => getUriTransformer(ctx.remoteAuthority)); + socketServer.registerChannel('extensions', channel); + + const encryptionChannel = ProxyChannel.fromService(accessor.get(IEncryptionMainService)); + socketServer.registerChannel('encryption', encryptionChannel); + + const credentialsChannel = ProxyChannel.fromService(accessor.get(ICredentialsMainService)); + socketServer.registerChannel('credentials', credentialsChannel); + + // clean up deprecated extensions + (extensionManagementService as ExtensionManagementService).removeDeprecatedExtensions(); + + disposables.add(new ErrorTelemetry(accessor.get(ITelemetryService))); + + return { + telemetryService: accessor.get(ITelemetryService) + }; + }); + + return { socketServer, instantiationService }; +} + +export class SocketServer extends IPCServer { + + private _onDidConnectEmitter: Emitter; + + constructor() { + const emitter = new Emitter(); + super(emitter.event); + this._onDidConnectEmitter = emitter; + } + + public acceptConnection(protocol: IMessagePassingProtocol, onDidClientDisconnect: Event): void { + this._onDidConnectEmitter.fire({ protocol, onDidClientDisconnect }); + } +} + +class ServerLogService extends AbstractLogger implements ILogService { + _serviceBrand: undefined; + private useColors: boolean; + + constructor(logLevel: LogLevel = DEFAULT_LOG_LEVEL) { + super(); + this.setLevel(logLevel); + this.useColors = Boolean(process.stdout.isTTY); + } + + trace(message: string, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Trace) { + if (this.useColors) { + console.log(`\x1b[90m[${now()}]\x1b[0m`, message, ...args); + } else { + console.log(`[${now()}]`, message, ...args); + } + } + } + + debug(message: string, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Debug) { + if (this.useColors) { + console.log(`\x1b[90m[${now()}]\x1b[0m`, message, ...args); + } else { + console.log(`[${now()}]`, message, ...args); + } + } + } + + info(message: string, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Info) { + if (this.useColors) { + console.log(`\x1b[90m[${now()}]\x1b[0m`, message, ...args); + } else { + console.log(`[${now()}]`, message, ...args); + } + } + } + + warn(message: string | Error, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Warning) { + if (this.useColors) { + console.warn(`\x1b[93m[${now()}]\x1b[0m`, message, ...args); + } else { + console.warn(`[${now()}]`, message, ...args); + } + } + } + + error(message: string, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Error) { + if (this.useColors) { + console.error(`\x1b[91m[${now()}]\x1b[0m`, message, ...args); + } else { + console.error(`[${now()}]`, message, ...args); + } + } + } + + 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 + } + + flush(): void { + // noop + } +} + +function now(): string { + const date = new Date(); + return `${twodigits(date.getHours())}:${twodigits(date.getMinutes())}:${twodigits(date.getSeconds())}`; +} + +function twodigits(n: number): string { + if (n < 10) { + return `0${n}`; + } + return String(n); +} + +/** + * Cleans up older logs, while keeping the 10 most recent ones. + */ +async function cleanupOlderLogs(logsPath: string): Promise { + const currentLog = path.basename(logsPath); + const logsRoot = path.dirname(logsPath); + const children = await Promises.readdir(logsRoot); + const allSessions = children.filter(name => /^\d{8}T\d{6}$/.test(name)); + const oldSessions = allSessions.sort().filter((d) => d !== currentLog); + const toDelete = oldSessions.slice(0, Math.max(0, oldSessions.length - 9)); + + await Promise.all(toDelete.map(name => Promises.rm(path.join(logsRoot, name)))); +} diff --git a/src/vs/server/webClientServer.ts b/src/vs/server/node/webClientServer.ts similarity index 59% rename from src/vs/server/webClientServer.ts rename to src/vs/server/node/webClientServer.ts index 5b4cb8e82e5..123ea73ed71 100644 --- a/src/vs/server/webClientServer.ts +++ b/src/vs/server/node/webClientServer.ts @@ -13,11 +13,19 @@ import { isEqualOrParent } from 'vs/base/common/extpath'; import { getMediaMime } from 'vs/base/common/mime'; import { isLinux } from 'vs/base/common/platform'; import { ILogService } from 'vs/platform/log/common/log'; -import { IServerEnvironmentService } from 'vs/server/serverEnvironmentService'; +import { IServerEnvironmentService } from 'vs/server/node/serverEnvironmentService'; import { extname, dirname, join, normalize } from 'vs/base/common/path'; -import { FileAccess } from 'vs/base/common/network'; +import { FileAccess, connectionTokenCookieName, connectionTokenQueryName } from 'vs/base/common/network'; import { generateUuid } from 'vs/base/common/uuid'; import { IProductService } from 'vs/platform/product/common/productService'; +import { ServerConnectionToken, ServerConnectionTokenType } from 'vs/server/node/serverConnectionToken'; +import { asText, IRequestService } from 'vs/platform/request/common/request'; +import { IHeaders } from 'vs/base/parts/request/common/request'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { URI } from 'vs/base/common/uri'; +import { streamToBuffer } from 'vs/base/common/buffer'; +import { IProductConfiguration } from 'vs/base/common/product'; +import { isString } from 'vs/base/common/types'; const textMimeType = { '.html': 'text/html', @@ -72,33 +80,44 @@ const APP_ROOT = dirname(FileAccess.asFileUri('', require).fsPath); export class WebClientServer { - constructor( - private readonly _connectionToken: string, - private readonly _environmentService: IServerEnvironmentService, - private readonly _logService: ILogService, - private readonly _productService: IProductService - ) { } + private readonly _webExtensionResourceUrlTemplate: URI | undefined; + constructor( + private readonly _connectionToken: ServerConnectionToken, + @IServerEnvironmentService private readonly _environmentService: IServerEnvironmentService, + @ILogService private readonly _logService: ILogService, + @IRequestService private readonly _requestService: IRequestService, + @IProductService private readonly _productService: IProductService, + ) { + this._webExtensionResourceUrlTemplate = this._productService.extensionsGallery?.resourceUrlTemplate ? URI.parse(this._productService.extensionsGallery.resourceUrlTemplate) : undefined; + } + + /** + * Handle web resources (i.e. only needed by the web client). + * **NOTE**: This method is only invoked when the server has web bits. + * **NOTE**: This method is only invoked after the connection token has been validated. + */ async handle(req: http.IncomingMessage, res: http.ServerResponse, parsedUrl: url.UrlWithParsedQuery): Promise { try { const pathname = parsedUrl.pathname!; if (pathname === '/favicon.ico' || pathname === '/manifest.json' || pathname === '/code-192.png' || pathname === '/code-512.png') { - // always serve icons/manifest, even without a token return serveFile(this._logService, req, res, join(APP_ROOT, 'resources', 'server', pathname.substr(1))); } if (/^\/static\//.test(pathname)) { - // always serve static requests, even without a token return this._handleStatic(req, res, parsedUrl); } if (pathname === '/') { - // the token handling is done inside the handler return this._handleRoot(req, res, parsedUrl); } if (pathname === '/callback') { // callback support return this._handleCallback(res); } + if (/^\/web-extension-resource\//.test(pathname)) { + // extension resource support + return this._handleWebExtensionResource(req, res, parsedUrl); + } return serveError(req, res, 404, 'Not found.'); } catch (error) { @@ -109,11 +128,6 @@ export class WebClientServer { } } - private _hasCorrectTokenCookie(req: http.IncomingMessage): boolean { - const cookies = cookie.parse(req.headers.cookie || ''); - return (cookies['vscode-tkn'] === this._connectionToken); - } - /** * Handle HTTP requests for /static/* */ @@ -132,6 +146,77 @@ export class WebClientServer { return serveFile(this._logService, req, res, filePath, headers); } + private _getResourceURLTemplateAuthority(uri: URI): string | undefined { + const index = uri.authority.indexOf('.'); + return index !== -1 ? uri.authority.substring(index + 1) : undefined; + } + + /** + * Handle extension resources + */ + private async _handleWebExtensionResource(req: http.IncomingMessage, res: http.ServerResponse, parsedUrl: url.UrlWithParsedQuery): Promise { + if (!this._webExtensionResourceUrlTemplate) { + return serveError(req, res, 500, 'No extension gallery service configured.'); + } + + // Strip `/web-extension-resource/` from the path + const normalizedPathname = decodeURIComponent(parsedUrl.pathname!); // support paths that are uri-encoded (e.g. spaces => %20) + const path = normalize(normalizedPathname.substr('/web-extension-resource/'.length)); + const uri = URI.parse(path).with({ + scheme: this._webExtensionResourceUrlTemplate.scheme, + authority: path.substring(0, path.indexOf('/')), + path: path.substring(path.indexOf('/') + 1) + }); + + if (this._getResourceURLTemplateAuthority(this._webExtensionResourceUrlTemplate) !== this._getResourceURLTemplateAuthority(uri)) { + return serveError(req, res, 403, 'Request Forbidden'); + } + + const headers: IHeaders = {}; + const setRequestHeader = (header: string) => { + const value = req.headers[header]; + if (value && (isString(value) || value[0])) { + headers[header] = isString(value) ? value : value[0]; + } else if (header !== header.toLowerCase()) { + setRequestHeader(header.toLowerCase()); + } + }; + setRequestHeader('X-Client-Name'); + setRequestHeader('X-Client-Version'); + setRequestHeader('X-Machine-Id'); + setRequestHeader('X-Client-Commit'); + + const context = await this._requestService.request({ + type: 'GET', + url: uri.toString(true), + headers + }, CancellationToken.None); + + const status = context.res.statusCode || 500; + if (status !== 200) { + let text: string | null = null; + try { + text = await asText(context); + } catch (error) {/* Ignore */ } + return serveError(req, res, status, text || `Request failed with status ${status}`); + } + + const responseHeaders: Record = Object.create(null); + const setResponseHeader = (header: string) => { + const value = context.res.headers[header]; + if (value) { + responseHeaders[header] = value; + } else if (header !== header.toLowerCase()) { + setResponseHeader(header.toLowerCase()); + } + }; + setResponseHeader('Cache-Control'); + setResponseHeader('Content-Type'); + res.writeHead(200, responseHeaders); + const buffer = await streamToBuffer(context.stream); + return res.end(buffer.buffer); + } + /** * Handle HTTP requests for / */ @@ -140,16 +225,23 @@ export class WebClientServer { return serveError(req, res, 400, `Bad request.`); } - const queryTkn = parsedUrl.query['tkn']; - if (typeof queryTkn === 'string') { - // tkn came in via a query string - // => set a cookie and redirect to url without tkn + const queryConnectionToken = parsedUrl.query[connectionTokenQueryName]; + if (typeof queryConnectionToken === 'string') { + // We got a connection token as a query parameter. + // We want to have a clean URL, so we strip it const responseHeaders: Record = Object.create(null); - responseHeaders['Set-Cookie'] = cookie.serialize('vscode-tkn', queryTkn, { sameSite: 'strict', maxAge: 60 * 60 * 24 * 7 /* 1 week */ }); + responseHeaders['Set-Cookie'] = cookie.serialize( + connectionTokenCookieName, + queryConnectionToken, + { + sameSite: 'lax', + maxAge: 60 * 60 * 24 * 7 /* 1 week */ + } + ); const newQuery = Object.create(null); for (let key in parsedUrl.query) { - if (key !== 'tkn') { + if (key !== connectionTokenQueryName) { newQuery[key] = parsedUrl.query[key]; } } @@ -160,10 +252,6 @@ export class WebClientServer { return res.end(); } - if (this._environmentService.isBuilt && !this._hasCorrectTokenCookie(req)) { - return serveError(req, res, 403, `Forbidden.`); - } - const remoteAuthority = req.headers.host; function escapeAttribute(value: string): string { @@ -190,6 +278,16 @@ export class WebClientServer { _wrapWebWorkerExtHostInIframe, developmentOptions: { enableSmokeTestDriver: this._environmentService.driverHandle === 'web' ? true : undefined }, settingsSyncOptions: !this._environmentService.isBuilt && this._environmentService.args['enable-sync'] ? { enabled: true } : undefined, + productConfiguration: >{ + extensionsGallery: this._webExtensionResourceUrlTemplate ? { + ...this._productService.extensionsGallery, + 'resourceUrlTemplate': this._webExtensionResourceUrlTemplate.with({ + scheme: 'http', + authority: remoteAuthority, + path: `web-extension-resource/${this._webExtensionResourceUrlTemplate.authority}${this._webExtensionResourceUrlTemplate.path}` + }).toString(true) + } : undefined + } }))) .replace('{{WORKBENCH_AUTH_SESSION}}', () => authSessionInfo ? escapeAttribute(JSON.stringify(authSessionInfo)) : ''); @@ -197,9 +295,9 @@ export class WebClientServer { 'default-src \'self\';', 'img-src \'self\' https: data: blob:;', 'media-src \'self\';', - `script-src 'self' 'unsafe-eval' ${this._getScriptCspHashes(data).join(' ')} 'sha256-9CevbjD7QdrWdGrVTVJD74tTH4eAhisvCOlLtWUn+Iw=' http://${remoteAuthority};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html + `script-src 'self' 'unsafe-eval' ${this._getScriptCspHashes(data).join(' ')} 'sha256-Luz5WwVrEgqx3ZT5ekNejY0UMaLynWfImiCqdaT6CeQ=' http://${remoteAuthority};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html 'child-src \'self\';', - `frame-src 'self' https://*.vscode-webview.net ${this._productService.webEndpointUrl || ''} data:;`, + `frame-src 'self' https://*.vscode-webview.net data:;`, 'worker-src \'self\' data:;', 'style-src \'self\' \'unsafe-inline\';', 'connect-src \'self\' ws: wss: https:;', @@ -207,14 +305,25 @@ export class WebClientServer { 'manifest-src \'self\';' ].join(' '); - res.writeHead(200, { + const headers: http.OutgoingHttpHeaders = { 'Content-Type': 'text/html', + 'Content-Security-Policy': cspDirectives + }; + if (this._connectionToken.type !== ServerConnectionTokenType.None) { // At this point we know the client has a valid cookie // and we want to set it prolong it to ensure that this // client is valid for another 1 week at least - 'Set-Cookie': cookie.serialize('vscode-tkn', this._connectionToken, { sameSite: 'strict', maxAge: 60 * 60 * 24 * 7 /* 1 week */ }), - 'Content-Security-Policy': cspDirectives - }); + headers['Set-Cookie'] = cookie.serialize( + connectionTokenCookieName, + this._connectionToken.value, + { + sameSite: 'lax', + maxAge: 60 * 60 * 24 * 7 /* 1 week */ + } + ); + } + + res.writeHead(200, headers); return res.end(data); } diff --git a/src/vs/server/remoteUriTransformer.ts b/src/vs/server/remoteUriTransformer.ts deleted file mode 100644 index 9fa8a624de9..00000000000 --- a/src/vs/server/remoteUriTransformer.ts +++ /dev/null @@ -1,15 +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 { URITransformer, IURITransformer, IRawURITransformer } from 'vs/base/common/uriIpc'; -import { FileAccess } from 'vs/base/common/network'; - -export const uriTransformerPath = FileAccess.asFileUri('vs/server/uriTransformer.js', require).fsPath; - -export function createRemoteURITransformer(remoteAuthority: string): IURITransformer { - const rawURITransformerFactory = require.__$__nodeRequire(uriTransformerPath); - const rawURITransformer = rawURITransformerFactory(remoteAuthority); - return new URITransformer(rawURITransformer); -} diff --git a/src/vs/server/test/node/serverConnectionToken.test.ts b/src/vs/server/test/node/serverConnectionToken.test.ts new file mode 100644 index 00000000000..c4836776627 --- /dev/null +++ b/src/vs/server/test/node/serverConnectionToken.test.ts @@ -0,0 +1,83 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import * as os from 'os'; +import * as path from 'path'; +import { getRandomTestPath } from 'vs/base/test/node/testUtils'; +import { parseServerConnectionToken, ServerConnectionToken, ServerConnectionTokenParseError, ServerConnectionTokenType } from 'vs/server/node/serverConnectionToken'; +import { ServerParsedArgs } from 'vs/server/node/serverEnvironmentService'; +import { Promises } from 'vs/base/node/pfs'; + +suite('parseServerConnectionToken', () => { + + function isError(r: ServerConnectionToken | ServerConnectionTokenParseError): r is ServerConnectionTokenParseError { + return (r instanceof ServerConnectionTokenParseError); + } + + function assertIsError(r: ServerConnectionToken | ServerConnectionTokenParseError): void { + assert.strictEqual(isError(r), true); + } + + test('no arguments generates a token that is mandatory', async () => { + const result = await parseServerConnectionToken({} as ServerParsedArgs, async () => 'defaultTokenValue'); + assert.ok(!(result instanceof ServerConnectionTokenParseError)); + assert.ok(result.type === ServerConnectionTokenType.Mandatory); + }); + + test('no arguments with --compatibility generates a token that is not mandatory', async () => { + const result = await parseServerConnectionToken({ 'compatibility': '1.63' } as ServerParsedArgs, async () => 'defaultTokenValue'); + assert.ok(!(result instanceof ServerConnectionTokenParseError)); + assert.ok(result.type === ServerConnectionTokenType.Optional); + assert.strictEqual(result.value, 'defaultTokenValue'); + }); + + test('--without-connection-token', async () => { + const result = await parseServerConnectionToken({ 'without-connection-token': true } as ServerParsedArgs, async () => 'defaultTokenValue'); + assert.ok(!(result instanceof ServerConnectionTokenParseError)); + assert.ok(result.type === ServerConnectionTokenType.None); + }); + + test('--without-connection-token --connection-token results in error', async () => { + assertIsError(await parseServerConnectionToken({ 'without-connection-token': true, 'connection-token': '0' } as ServerParsedArgs, async () => 'defaultTokenValue')); + }); + + test('--without-connection-token --connection-token-file results in error', async () => { + assertIsError(await parseServerConnectionToken({ 'without-connection-token': true, 'connection-token-file': '0' } as ServerParsedArgs, async () => 'defaultTokenValue')); + }); + + test('--connection-token-file --connection-token results in error', async () => { + assertIsError(await parseServerConnectionToken({ 'connection-token-file': '0', 'connection-token': '0' } as ServerParsedArgs, async () => 'defaultTokenValue')); + }); + + test('--connection-token-file', async () => { + const testDir = getRandomTestPath(os.tmpdir(), 'vsctests', 'server-connection-token'); + await Promises.mkdir(testDir, { recursive: true }); + const filename = path.join(testDir, 'connection-token-file'); + const connectionToken = `12345-123-abc`; + await Promises.writeFile(filename, connectionToken); + const result = await parseServerConnectionToken({ 'connection-token-file': filename } as ServerParsedArgs, async () => 'defaultTokenValue'); + assert.ok(!(result instanceof ServerConnectionTokenParseError)); + assert.ok(result.type === ServerConnectionTokenType.Mandatory); + assert.strictEqual(result.value, connectionToken); + await Promises.rm(testDir); + }); + + test('--connection-token', async () => { + const connectionToken = `12345-123-abc`; + const result = await parseServerConnectionToken({ 'connection-token': connectionToken } as ServerParsedArgs, async () => 'defaultTokenValue'); + assert.ok(!(result instanceof ServerConnectionTokenParseError)); + assert.ok(result.type === ServerConnectionTokenType.Mandatory); + assert.strictEqual(result.value, connectionToken); + }); + + test('--connection-token --compatibility marks a as not mandatory', async () => { + const connectionToken = `12345-123-abc`; + const result = await parseServerConnectionToken({ 'connection-token': connectionToken, 'compatibility': '1.63' } as ServerParsedArgs, async () => 'defaultTokenValue'); + assert.ok(!(result instanceof ServerConnectionTokenParseError)); + assert.ok(result.type === ServerConnectionTokenType.Optional); + assert.strictEqual(result.value, connectionToken); + }); +}); diff --git a/src/vs/workbench/api/browser/mainThreadAuthentication.ts b/src/vs/workbench/api/browser/mainThreadAuthentication.ts index ef18d7b5e41..77c903cdf0c 100644 --- a/src/vs/workbench/api/browser/mainThreadAuthentication.ts +++ b/src/vs/workbench/api/browser/mainThreadAuthentication.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import * as modes from 'vs/editor/common/languages'; import * as nls from 'vs/nls'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { IAuthenticationService, AllowedExtension, readAllowedExtensions, getAuthenticationProviderActivationEvent, addAccountUsage, readAccountUsages, removeAccountUsage } from 'vs/workbench/services/authentication/browser/authenticationService'; -import { ExtHostAuthenticationShape, ExtHostContext, IExtHostContext, MainContext, MainThreadAuthenticationShape } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { AllowedExtension, readAllowedExtensions, getAuthenticationProviderActivationEvent, addAccountUsage, readAccountUsages, removeAccountUsage } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationProvider, IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; +import { ExtHostAuthenticationShape, ExtHostContext, MainContext, MainThreadAuthenticationShape } from '../common/extHost.protocol'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import Severity from 'vs/base/common/severity'; @@ -25,7 +25,7 @@ interface TrustedExtensionsQuickPickItem { extension: AllowedExtension; } -export class MainThreadAuthenticationProvider extends Disposable { +export class MainThreadAuthenticationProvider extends Disposable implements IAuthenticationProvider { constructor( private readonly _proxy: ExtHostAuthenticationShape, public readonly id: string, @@ -96,7 +96,7 @@ export class MainThreadAuthenticationProvider extends Disposable { quickPick.show(); } - async removeAccountSessions(accountName: string, sessions: modes.AuthenticationSession[]): Promise { + async removeAccountSessions(accountName: string, sessions: AuthenticationSession[]): Promise { const accountUsages = readAccountUsages(this.storageService, this.id, accountName); const result = await this.dialogService.show( @@ -124,7 +124,7 @@ export class MainThreadAuthenticationProvider extends Disposable { return this._proxy.$getSessions(this.id, scopes); } - createSession(scopes: string[]): Promise { + createSession(scopes: string[]): Promise { return this._proxy.$createSession(this.id, scopes); } @@ -175,7 +175,7 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu return this.extensionService.activateByEvent(getAuthenticationProviderActivationEvent(id), ActivationKind.Immediate); } - $sendDidChangeSessions(id: string, event: modes.AuthenticationSessionsChangeEvent): void { + $sendDidChangeSessions(id: string, event: AuthenticationSessionsChangeEvent): void { this.authenticationService.sessionsUpdate(id, event); } @@ -205,7 +205,7 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu } - private async doGetSession(providerId: string, scopes: string[], extensionId: string, extensionName: string, options: AuthenticationGetSessionOptions): Promise { + 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); @@ -268,15 +268,15 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu return validSession; } - async $getSession(providerId: string, scopes: string[], extensionId: string, extensionName: string, options: AuthenticationGetSessionOptions): Promise { + async $getSession(providerId: string, scopes: string[], extensionId: string, extensionName: string, options: AuthenticationGetSessionOptions): Promise { const session = await this.doGetSession(providerId, scopes, extensionId, extensionName, options); if (session) { type AuthProviderUsageClassification = { - extensionId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - providerId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + extensionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + providerId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; - this.telemetryService.publicLog2<{ extensionId: string, providerId: string }, AuthProviderUsageClassification>('authentication.providerUsage', { providerId, extensionId }); + this.telemetryService.publicLog2<{ extensionId: string; providerId: string }, AuthProviderUsageClassification>('authentication.providerUsage', { providerId, extensionId }); addAccountUsage(this.storageService, providerId, session.account.label, extensionId, extensionName); } diff --git a/src/vs/workbench/api/browser/mainThreadBulkEdits.ts b/src/vs/workbench/api/browser/mainThreadBulkEdits.ts index 8b4e10f8efa..c4fed54577a 100644 --- a/src/vs/workbench/api/browser/mainThreadBulkEdits.ts +++ b/src/vs/workbench/api/browser/mainThreadBulkEdits.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; -import { IExtHostContext, IWorkspaceEditDto, MainThreadBulkEditsShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { IWorkspaceEditDto, MainThreadBulkEditsShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { reviveWorkspaceEditDto2 } from 'vs/workbench/api/browser/mainThreadEditors'; import { ILogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/api/browser/mainThreadCLICommands.ts b/src/vs/workbench/api/browser/mainThreadCLICommands.ts index 863d73cb679..c8b3aef6340 100644 --- a/src/vs/workbench/api/browser/mainThreadCLICommands.ts +++ b/src/vs/workbench/api/browser/mainThreadCLICommands.ts @@ -45,7 +45,7 @@ CommandsRegistry.registerCommand('_remoteCLI.getSystemStatus', function (accesso }); interface ManageExtensionsArgs { - list?: { showVersions?: boolean, category?: string; }; + list?: { showVersions?: boolean; category?: string }; install?: (string | URI)[]; uninstall?: string[]; force?: boolean; diff --git a/src/vs/workbench/api/browser/mainThreadClipboard.ts b/src/vs/workbench/api/browser/mainThreadClipboard.ts index 85c041c5b6e..11be3e647dc 100644 --- a/src/vs/workbench/api/browser/mainThreadClipboard.ts +++ b/src/vs/workbench/api/browser/mainThreadClipboard.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { MainContext, MainThreadClipboardShape } from '../common/extHost.protocol'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; diff --git a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts index 14c5b4669e6..9036d7a754a 100644 --- a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts +++ b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts @@ -10,9 +10,9 @@ import { IActiveCodeEditor, IViewZone } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { reviveWebviewContentOptions } from 'vs/workbench/api/browser/mainThreadWebviews'; -import { ExtHostContext, ExtHostEditorInsetsShape, IExtHostContext, IWebviewContentOptions, MainContext, MainThreadEditorInsetsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, ExtHostEditorInsetsShape, IWebviewContentOptions, MainContext, MainThreadEditorInsetsShape } from 'vs/workbench/api/common/extHost.protocol'; import { IWebviewService, IWebviewElement } from 'vs/workbench/contrib/webview/browser/webview'; -import { extHostNamedCustomer } from '../common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; // todo@jrieken move these things back into something like contrib/insets class EditorWebviewZone implements IViewZone { diff --git a/src/vs/workbench/api/browser/mainThreadCommands.ts b/src/vs/workbench/api/browser/mainThreadCommands.ts index b441871a34d..dc5df7b422e 100644 --- a/src/vs/workbench/api/browser/mainThreadCommands.ts +++ b/src/vs/workbench/api/browser/mainThreadCommands.ts @@ -5,11 +5,12 @@ import { ICommandService, CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ExtHostContext, MainThreadCommandsShape, ExtHostCommandsShape, MainContext, IExtHostContext } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, MainThreadCommandsShape, ExtHostCommandsShape, MainContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { revive } from 'vs/base/common/marshalling'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; +import { SerializableObjectWithBuffers, Dto } from 'vs/workbench/services/extensions/common/proxyIdentifier'; + @extHostNamedCustomer(MainContext.MainThreadCommands) export class MainThreadCommands implements MainThreadCommandsShape { @@ -94,7 +95,7 @@ export class MainThreadCommands implements MainThreadCommandsShape { // --- command doc -function _generateMarkdown(description: string | ICommandHandlerDescription): string { +function _generateMarkdown(description: string | Dto | ICommandHandlerDescription): string { if (typeof description === 'string') { return description; } else { diff --git a/src/vs/workbench/api/browser/mainThreadComments.ts b/src/vs/workbench/api/browser/mainThreadComments.ts index d85214116b9..3a794a22f6d 100644 --- a/src/vs/workbench/api/browser/mainThreadComments.ts +++ b/src/vs/workbench/api/browser/mainThreadComments.ts @@ -9,13 +9,13 @@ import { Disposable, DisposableStore, dispose, IDisposable } from 'vs/base/commo import { URI, UriComponents } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { IRange } from 'vs/editor/common/core/range'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { ICommentInfo, ICommentService } from 'vs/workbench/contrib/comments/browser/commentService'; import { CommentsPanel } from 'vs/workbench/contrib/comments/browser/commentsView'; -import { CommentProviderFeatures, ExtHostCommentsShape, ExtHostContext, IExtHostContext, MainContext, MainThreadCommentsShape, CommentThreadChanges, CommentChanges } from '../common/extHost.protocol'; +import { CommentProviderFeatures, ExtHostCommentsShape, ExtHostContext, MainContext, MainThreadCommentsShape, CommentThreadChanges } from '../common/extHost.protocol'; import { COMMENTS_VIEW_ID, COMMENTS_VIEW_TITLE } from 'vs/workbench/contrib/comments/browser/commentsTreeViewer'; import { ViewContainer, IViewContainersRegistry, Extensions as ViewExtensions, ViewContainerLocation, IViewsRegistry, IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; @@ -23,22 +23,22 @@ import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneCont import { Codicon } from 'vs/base/common/codicons'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { localize } from 'vs/nls'; -import { MarshalledId, revive } from 'vs/base/common/marshalling'; +import { MarshalledId, } from 'vs/base/common/marshalling'; -export class MainThreadCommentThread implements modes.CommentThread { - private _input?: modes.CommentInput; - get input(): modes.CommentInput | undefined { +export class MainThreadCommentThread implements languages.CommentThread { + private _input?: languages.CommentInput; + get input(): languages.CommentInput | undefined { return this._input; } - set input(value: modes.CommentInput | undefined) { + set input(value: languages.CommentInput | undefined) { this._input = value; this._onDidChangeInput.fire(value); } - private readonly _onDidChangeInput = new Emitter(); - get onDidChangeInput(): Event { return this._onDidChangeInput.event; } + private readonly _onDidChangeInput = new Emitter(); + get onDidChangeInput(): Event { return this._onDidChangeInput.event; } private _label: string | undefined; @@ -64,19 +64,19 @@ export class MainThreadCommentThread implements modes.CommentThread { private readonly _onDidChangeLabel = new Emitter(); readonly onDidChangeLabel: Event = this._onDidChangeLabel.event; - private _comments: modes.Comment[] | undefined; + private _comments: languages.Comment[] | undefined; - public get comments(): modes.Comment[] | undefined { + public get comments(): languages.Comment[] | undefined { return this._comments; } - public set comments(newComments: modes.Comment[] | undefined) { + public set comments(newComments: languages.Comment[] | undefined) { this._comments = newComments; this._onDidChangeComments.fire(this._comments); } - private readonly _onDidChangeComments = new Emitter(); - get onDidChangeComments(): Event { return this._onDidChangeComments.event; } + private readonly _onDidChangeComments = new Emitter(); + get onDidChangeComments(): Event { return this._onDidChangeComments.event; } set range(range: IRange) { this._range = range; @@ -101,17 +101,17 @@ export class MainThreadCommentThread implements modes.CommentThread { private readonly _onDidChangeRange = new Emitter(); public onDidChangeRange = this._onDidChangeRange.event; - private _collapsibleState: modes.CommentThreadCollapsibleState | undefined; + private _collapsibleState: languages.CommentThreadCollapsibleState | undefined; get collapsibleState() { return this._collapsibleState; } - set collapsibleState(newState: modes.CommentThreadCollapsibleState | undefined) { + set collapsibleState(newState: languages.CommentThreadCollapsibleState | undefined) { this._collapsibleState = newState; this._onDidChangeCollasibleState.fire(this._collapsibleState); } - private readonly _onDidChangeCollasibleState = new Emitter(); + private readonly _onDidChangeCollasibleState = new Emitter(); public onDidChangeCollasibleState = this._onDidChangeCollasibleState.event; private _isDisposed: boolean; @@ -139,27 +139,11 @@ export class MainThreadCommentThread implements modes.CommentThread { if (modified('range')) { this._range = changes.range!; } if (modified('label')) { this._label = changes.label; } if (modified('contextValue')) { this._contextValue = changes.contextValue === null ? undefined : changes.contextValue; } - if (modified('comments')) { this._comments = this.commentsFromCommentChanges(changes.comments); } + if (modified('comments')) { this._comments = changes.comments; } if (modified('collapseState')) { this._collapsibleState = changes.collapseState; } if (modified('canReply')) { this.canReply = changes.canReply!; } } - private commentsFromCommentChanges(comments?: CommentChanges[]): modes.Comment[] | undefined { - return comments?.map(comment => { - return { - body: comment.body, - uniqueIdInThread: comment.uniqueIdInThread, - userName: comment.userName, - commentReactions: comment.commentReactions, - contextValue: comment.contextValue, - detail: comment.detail ? revive(comment.detail) : undefined, - label: comment.label, - mode: comment.mode, - userIconPath: comment.userIconPath - }; - }); - } - dispose() { this._isDisposed = true; this._onDidChangeCollasibleState.dispose(); @@ -199,13 +183,13 @@ export class MainThreadCommentController { return this._label; } - private _reactions: modes.CommentReaction[] | undefined; + private _reactions: languages.CommentReaction[] | undefined; get reactions() { return this._reactions; } - set reactions(reactions: modes.CommentReaction[] | undefined) { + set reactions(reactions: languages.CommentReaction[] | undefined) { this._reactions = reactions; } @@ -239,7 +223,7 @@ export class MainThreadCommentController { threadId: string, resource: UriComponents, range: IRange, - ): modes.CommentThread { + ): languages.CommentThread { let thread = new MainThreadCommentThread( commentThreadHandle, this.handle, @@ -319,7 +303,7 @@ export class MainThreadCommentController { } async getDocumentComments(resource: URI, token: CancellationToken) { - let ret: modes.CommentThread[] = []; + let ret: languages.CommentThread[] = []; for (let thread of [...this._threads.keys()]) { const commentThread = this._threads.get(thread)!; if (commentThread.resource === resource.toString()) { @@ -345,7 +329,7 @@ export class MainThreadCommentController { return commentingRanges || []; } - async toggleReaction(uri: URI, thread: modes.CommentThread, comment: modes.Comment, reaction: modes.CommentReaction, token: CancellationToken): Promise { + async toggleReaction(uri: URI, thread: languages.CommentThread, comment: languages.Comment, reaction: languages.CommentReaction, token: CancellationToken): Promise { return this._proxy.$toggleReaction(this._handle, thread.commentThreadHandle, uri, comment, reaction); } @@ -459,7 +443,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments resource: UriComponents, range: IRange, extensionId: ExtensionIdentifier - ): modes.CommentThread | undefined { + ): languages.CommentThread | undefined { let provider = this._commentControllers.get(handle); if (!provider) { @@ -563,7 +547,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments return this._handlers.get(handle)!; } - $onDidCommentThreadsChange(handle: number, event: modes.CommentThreadChangedEvent) { + $onDidCommentThreadsChange(handle: number, event: languages.CommentThreadChangedEvent) { // notify comment service const providerId = this.getHandler(handle); this._commentService.updateComments(providerId, event); diff --git a/src/vs/workbench/api/browser/mainThreadConfiguration.ts b/src/vs/workbench/api/browser/mainThreadConfiguration.ts index 57ae2b9a374..de0630df1a1 100644 --- a/src/vs/workbench/api/browser/mainThreadConfiguration.ts +++ b/src/vs/workbench/api/browser/mainThreadConfiguration.ts @@ -8,8 +8,8 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, getScopes } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { MainThreadConfigurationShape, MainContext, ExtHostContext, IExtHostContext, IConfigurationInitData } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadConfigurationShape, MainContext, ExtHostContext, IConfigurationInitData } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { ConfigurationTarget, IConfigurationService, IConfigurationOverrides } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/workbench/api/browser/mainThreadConsole.ts b/src/vs/workbench/api/browser/mainThreadConsole.ts index fd69a678896..c942d609405 100644 --- a/src/vs/workbench/api/browser/mainThreadConsole.ts +++ b/src/vs/workbench/api/browser/mainThreadConsole.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { MainContext, MainThreadConsoleShape, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IRemoteConsoleLog, log } from 'vs/base/common/console'; import { logRemoteEntry, logRemoteEntryIfError } from 'vs/workbench/services/extensions/common/remoteConsoleUtil'; diff --git a/src/vs/workbench/api/browser/mainThreadCustomEditors.ts b/src/vs/workbench/api/browser/mainThreadCustomEditors.ts index 725009d8107..27c48ff72c5 100644 --- a/src/vs/workbench/api/browser/mainThreadCustomEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadCustomEditors.ts @@ -40,6 +40,7 @@ import { IWorkingCopyFileService, WorkingCopyFileEvent } from 'vs/workbench/serv import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { IWorkingCopy, IWorkingCopyBackup, NO_TYPE_ID, WorkingCopyCapabilities } from 'vs/workbench/services/workingCopy/common/workingCopy'; import { ResourceWorkingCopy } from 'vs/workbench/services/workingCopy/common/resourceWorkingCopy'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; const enum CustomEditorModelType { Custom, @@ -55,7 +56,7 @@ export class MainThreadCustomEditors extends Disposable implements extHostProtoc private readonly _editorRenameBackups = new Map(); constructor( - context: extHostProtocol.IExtHostContext, + context: IExtHostContext, private readonly mainThreadWebview: MainThreadWebviews, private readonly mainThreadWebviewPanels: MainThreadWebviewPanels, @IExtensionService extensionService: IExtensionService, @@ -225,7 +226,7 @@ export class MainThreadCustomEditors extends Disposable implements extHostProtoc modelType: CustomEditorModelType, resource: URI, viewType: string, - options: { backupId?: string; }, + options: { backupId?: string }, cancellation: CancellationToken, ): Promise> { const existingModel = this._customEditorService.models.tryRetain(resource, viewType); @@ -347,7 +348,7 @@ class MainThreadCustomEditorModel extends ResourceWorkingCopy implements ICustom proxy: extHostProtocol.ExtHostCustomEditorsShape, viewType: string, resource: URI, - options: { backupId?: string; }, + options: { backupId?: string }, getEditors: () => CustomEditorInput[], cancellation: CancellationToken, ): Promise { diff --git a/src/vs/workbench/api/browser/mainThreadDebugService.ts b/src/vs/workbench/api/browser/mainThreadDebugService.ts index 0eed5d9b97a..1fb6d0b37f7 100644 --- a/src/vs/workbench/api/browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/browser/mainThreadDebugService.ts @@ -5,17 +5,16 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI as uri, UriComponents } from 'vs/base/common/uri'; -import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunctionBreakpoint, IBreakpointData, IDebugAdapter, IDebugAdapterDescriptorFactory, IDebugSession, IDebugAdapterFactory, IDataBreakpoint, IDebugSessionOptions, IInstructionBreakpoint } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunctionBreakpoint, IBreakpointData, IDebugAdapter, IDebugAdapterDescriptorFactory, IDebugSession, IDebugAdapterFactory, IDataBreakpoint, IDebugSessionOptions, IInstructionBreakpoint, DebugConfigurationProviderTriggerKind } from 'vs/workbench/contrib/debug/common/debug'; import { ExtHostContext, ExtHostDebugServiceShape, MainThreadDebugServiceShape, DebugSessionUUID, MainContext, - IExtHostContext, IBreakpointsDeltaDto, ISourceMultiBreakpointDto, ISourceBreakpointDto, IFunctionBreakpointDto, IDebugSessionDto, IDataBreakpointDto, IStartDebuggingOptions, IDebugConfiguration + IBreakpointsDeltaDto, ISourceMultiBreakpointDto, ISourceBreakpointDto, IFunctionBreakpointDto, IDebugSessionDto, IDataBreakpointDto, IStartDebuggingOptions, IDebugConfiguration } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import severity from 'vs/base/common/severity'; import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/common/abstractDebugAdapter'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { convertToVSCPaths, convertToDAPaths, isSessionAttach } from 'vs/workbench/contrib/debug/common/debugUtils'; -import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/api/common/extHostTypes'; @extHostNamedCustomer(MainContext.MainThreadDebugService) export class MainThreadDebugService implements MainThreadDebugServiceShape, IDebugAdapterFactory { diff --git a/src/vs/workbench/api/browser/mainThreadDecorations.ts b/src/vs/workbench/api/browser/mainThreadDecorations.ts index ed32c7af58d..c3cb860ec9b 100644 --- a/src/vs/workbench/api/browser/mainThreadDecorations.ts +++ b/src/vs/workbench/api/browser/mainThreadDecorations.ts @@ -6,8 +6,8 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ExtHostContext, MainContext, IExtHostContext, MainThreadDecorationsShape, ExtHostDecorationsShape, DecorationData, DecorationRequest } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, MainContext, MainThreadDecorationsShape, ExtHostDecorationsShape, DecorationData, DecorationRequest } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IDecorationsService, IDecorationData } from 'vs/workbench/services/decorations/common/decorations'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -33,11 +33,11 @@ class DecorationRequestsQueue { this._resolver.set(id, resolve); this._processQueue(); }); - token.onCancellationRequested(() => { + const sub = token.onCancellationRequested(() => { this._requests.delete(id); this._resolver.delete(id); }); - return result; + return result.finally(() => sub.dispose()); } private _processQueue(): void { diff --git a/src/vs/workbench/api/browser/mainThreadDiagnostics.ts b/src/vs/workbench/api/browser/mainThreadDiagnostics.ts index 304d31cd546..8d59a22b4b1 100644 --- a/src/vs/workbench/api/browser/mainThreadDiagnostics.ts +++ b/src/vs/workbench/api/browser/mainThreadDiagnostics.ts @@ -5,8 +5,8 @@ import { IMarkerService, IMarkerData } from 'vs/platform/markers/common/markers'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { MainThreadDiagnosticsShape, MainContext, IExtHostContext, ExtHostDiagnosticsShape, ExtHostContext } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadDiagnosticsShape, MainContext, ExtHostDiagnosticsShape, ExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; diff --git a/src/vs/workbench/api/browser/mainThreadDialogs.ts b/src/vs/workbench/api/browser/mainThreadDialogs.ts index afa4240f39e..1f8066b2c0d 100644 --- a/src/vs/workbench/api/browser/mainThreadDialogs.ts +++ b/src/vs/workbench/api/browser/mainThreadDialogs.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { MainThreadDiaglogsShape, MainContext, IExtHostContext, MainThreadDialogOpenOptions, MainThreadDialogSaveOptions } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadDiaglogsShape, MainContext, MainThreadDialogOpenOptions, MainThreadDialogSaveOptions } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { forEach } from 'vs/base/common/collections'; import { IFileDialogService, IOpenDialogOptions, ISaveDialogOptions } from 'vs/platform/dialogs/common/dialogs'; diff --git a/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts b/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts index 5e5bf14dff5..4ecd40a83e9 100644 --- a/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts @@ -11,10 +11,10 @@ import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { ExtHostContext, ExtHostDocumentContentProvidersShape, IExtHostContext, MainContext, MainThreadDocumentContentProvidersShape } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { ExtHostContext, ExtHostDocumentContentProvidersShape, MainContext, MainThreadDocumentContentProvidersShape } from '../common/extHost.protocol'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; @extHostNamedCustomer(MainContext.MainThreadDocumentContentProviders) diff --git a/src/vs/workbench/api/browser/mainThreadDocuments.ts b/src/vs/workbench/api/browser/mainThreadDocuments.ts index ca679bece3c..77cdfebb801 100644 --- a/src/vs/workbench/api/browser/mainThreadDocuments.ts +++ b/src/vs/workbench/api/browser/mainThreadDocuments.ts @@ -7,12 +7,12 @@ import { toErrorMessage } from 'vs/base/common/errorMessage'; import { IReference, dispose, Disposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { ITextModel } from 'vs/editor/common/model'; -import { IModelService, shouldSynchronizeModel } from 'vs/editor/common/services/model'; +import { ITextModel, shouldSynchronizeModel } from 'vs/editor/common/model'; +import { IModelService } from 'vs/editor/common/services/model'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IFileService, FileOperation } from 'vs/platform/files/common/files'; import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/browser/mainThreadDocumentsAndEditors'; -import { ExtHostContext, ExtHostDocumentsShape, IExtHostContext, MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, ExtHostDocumentsShape, MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { toLocalResource, extUri, IExtUri } from 'vs/base/common/resources'; @@ -21,10 +21,11 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' import { Emitter } from 'vs/base/common/event'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { ResourceMap } from 'vs/base/common/map'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; export class BoundModelReferenceCollection { - private _data = new Array<{ uri: URI, length: number, dispose(): void }>(); + private _data = new Array<{ uri: URI; length: number; dispose(): void }>(); private _length = 0; constructor( @@ -51,7 +52,7 @@ export class BoundModelReferenceCollection { add(uri: URI, ref: IReference, length: number = 0): void { // const length = ref.object.textEditorModel.getValueLength(); let handle: any; - let entry: { uri: URI, length: number, dispose(): void }; + let entry: { uri: URI; length: number; dispose(): void }; const dispose = () => { const idx = this._data.indexOf(entry); if (idx >= 0) { @@ -193,7 +194,7 @@ export class MainThreadDocuments extends Disposable implements MainThreadDocumen this._modelTrackers.set(model.uri, new ModelTracker(model, this._onIsCaughtUpWithContentChanges, this._proxy, this._textFileService)); } - private _onModelModeChanged(event: { model: ITextModel; oldLanguageId: string; }): void { + private _onModelModeChanged(event: { model: ITextModel; oldLanguageId: string }): void { let { model } = event; if (!this._modelIsSynced.has(model.uri)) { return; @@ -250,7 +251,7 @@ export class MainThreadDocuments extends Disposable implements MainThreadDocumen }); } - $tryCreateDocument(options?: { language?: string, content?: string }): Promise { + $tryCreateDocument(options?: { language?: string; content?: string }): Promise { return this._doCreateUntitled(undefined, options ? options.language : undefined, options ? options.content : undefined); } diff --git a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts index 6f6537ec2b3..1d932abe4e7 100644 --- a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts @@ -10,15 +10,15 @@ import { ICodeEditor, isCodeEditor, isDiffEditor, IActiveCodeEditor } from 'vs/e import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IEditor } from 'vs/editor/common/editorCommon'; -import { ITextModel } from 'vs/editor/common/model'; -import { IModelService, shouldSynchronizeModel } from 'vs/editor/common/services/model'; +import { ITextModel, shouldSynchronizeModel } from 'vs/editor/common/model'; +import { IModelService } from 'vs/editor/common/services/model'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IFileService } from 'vs/platform/files/common/files'; -import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { MainThreadDocuments } from 'vs/workbench/api/browser/mainThreadDocuments'; import { MainThreadTextEditor } from 'vs/workbench/api/browser/mainThreadEditor'; import { MainThreadTextEditors } from 'vs/workbench/api/browser/mainThreadEditors'; -import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IExtHostContext, IModelAddedData, ITextEditorAddData, MainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IModelAddedData, ITextEditorAddData, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; import { IEditorPane } from 'vs/workbench/common/editor'; import { EditorGroupColumn, editorGroupToColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; diff --git a/src/vs/workbench/api/browser/mainThreadDownloadService.ts b/src/vs/workbench/api/browser/mainThreadDownloadService.ts index 8b64b910337..d8c25cadd72 100644 --- a/src/vs/workbench/api/browser/mainThreadDownloadService.ts +++ b/src/vs/workbench/api/browser/mainThreadDownloadService.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import { MainContext, IExtHostContext, MainThreadDownloadServiceShape } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainContext, MainThreadDownloadServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IDownloadService } from 'vs/platform/download/common/download'; import { UriComponents, URI } from 'vs/base/common/uri'; @@ -23,4 +23,4 @@ export class MainThreadDownloadService extends Disposable implements MainThreadD return this.downloadService.download(URI.revive(uri), URI.revive(to)); } -} \ No newline at end of file +} diff --git a/src/vs/workbench/api/browser/mainThreadEditor.ts b/src/vs/workbench/api/browser/mainThreadEditor.ts index 77c44e8b357..5fa8444c837 100644 --- a/src/vs/workbench/api/browser/mainThreadEditor.ts +++ b/src/vs/workbench/api/browser/mainThreadEditor.ts @@ -10,16 +10,17 @@ import { RenderLineNumbersType, TextEditorCursorStyle, cursorStyleToString, Edit import { IRange, Range } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import { IDecorationOptions, ScrollType } from 'vs/editor/common/editorCommon'; -import { ISingleEditOperation, ITextModel, ITextModelUpdateOptions, IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; +import { ITextModel, ITextModelUpdateOptions } from 'vs/editor/common/model'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { IModelService } from 'vs/editor/common/services/model'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { IApplyEditsOptions, IEditorPropertiesChangeData, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, IUndoStopOptions, TextEditorRevealType } from 'vs/workbench/api/common/extHost.protocol'; import { IEditorPane } from 'vs/workbench/common/editor'; import { withNullAsUndefined } from 'vs/base/common/types'; import { equals } from 'vs/base/common/arrays'; -import { CodeEditorStateFlag, EditorState } from 'vs/editor/browser/core/editorState'; +import { CodeEditorStateFlag, EditorState } from 'vs/editor/contrib/editorState/browser/editorState'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; import { MainThreadDocuments } from 'vs/workbench/api/browser/mainThreadDocuments'; export interface IFocusTracker { @@ -481,7 +482,7 @@ export class MainThreadTextEditor { this._model.pushEOL(opts.setEndOfLine); } - const transformedEdits = edits.map((edit): IIdentifiedSingleEditOperation => { + const transformedEdits = edits.map((edit): ISingleEditOperation => { return { range: Range.lift(edit.range), text: edit.text, diff --git a/src/vs/workbench/api/browser/mainThreadEditorTabs.ts b/src/vs/workbench/api/browser/mainThreadEditorTabs.ts index c50a61dab56..34f78bcba5e 100644 --- a/src/vs/workbench/api/browser/mainThreadEditorTabs.ts +++ b/src/vs/workbench/api/browser/mainThreadEditorTabs.ts @@ -5,9 +5,9 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { ExtHostContext, IExtHostEditorTabsShape, IExtHostContext, MainContext, IEditorTabDto } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { EditorResourceAccessor, IUntypedEditorInput, SideBySideEditor, GroupModelChangeKind } from 'vs/workbench/common/editor'; +import { ExtHostContext, IExtHostEditorTabsShape, MainContext, IEditorTabDto } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { EditorResourceAccessor, IUntypedEditorInput, SideBySideEditor, GroupModelChangeKind, DEFAULT_EDITOR_ASSOCIATION } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { isGroupEditorCloseEvent, isGroupEditorMoveEvent, isGroupEditorOpenEvent } from 'vs/workbench/common/editor/editorGroupModel'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; @@ -23,7 +23,7 @@ export class MainThreadEditorTabs { private readonly _dispoables = new DisposableStore(); private readonly _proxy: IExtHostEditorTabsShape; private readonly _tabModel: Map = new Map(); - private _currentlyActiveTab: { groupId: number, tab: IEditorTabDto } | undefined = undefined; + private _currentlyActiveTab: { groupId: number; tab: IEditorTabDto } | undefined = undefined; constructor( extHostContext: IExtHostContext, @@ -76,9 +76,10 @@ export class MainThreadEditorTabs { secondary: { resource: URI.revive(tab.additionalResourcesAndViewIds[1].resource), options: { override: tab.additionalResourcesAndViewIds[1].viewId } } }; } else { + // For now only text diff editor are supported return { - modified: { resource: URI.revive(tab.resource), options: { override: tab.editorId } }, - original: { resource: URI.revive(tab.additionalResourcesAndViewIds[1].resource), options: { override: tab.additionalResourcesAndViewIds[1].viewId } } + modified: { resource: URI.revive(tab.resource), options: { override: DEFAULT_EDITOR_ASSOCIATION.id } }, + original: { resource: URI.revive(tab.additionalResourcesAndViewIds[1].resource), options: { override: DEFAULT_EDITOR_ASSOCIATION.id } } }; } } @@ -277,7 +278,8 @@ export class MainThreadEditorTabs { if (!group) { return; } - const editor = group.editors.find(editor => editor.matches(this._tabToUntypedEditorInput(tab))); + const editorTab = this._tabToUntypedEditorInput(tab); + const editor = group.editors.find(editor => editor.matches(editorTab)); if (!editor) { return; } diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index 99fe9d8e332..feba5fdc8e2 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -11,14 +11,14 @@ import { IBulkEditService, ResourceEdit, ResourceFileEdit, ResourceTextEdit } fr import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IRange } from 'vs/editor/common/core/range'; import { ISelection } from 'vs/editor/common/core/selection'; -import { IDecorationOptions, IDecorationRenderOptions, ILineChange } from 'vs/editor/common/editorCommon'; -import { ISingleEditOperation } from 'vs/editor/common/model'; +import { IDecorationOptions, IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ITextEditorOptions, IResourceEditorInput, EditorActivation, EditorResolution } from 'vs/platform/editor/common/editor'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/browser/mainThreadDocumentsAndEditors'; import { MainThreadTextEditor } from 'vs/workbench/api/browser/mainThreadEditor'; -import { ExtHostContext, ExtHostEditorsShape, IApplyEditsOptions, IExtHostContext, ITextDocumentShowOptions, ITextEditorConfigurationUpdate, ITextEditorPositionData, IUndoStopOptions, MainThreadTextEditorsShape, TextEditorRevealType, IWorkspaceEditDto, WorkspaceEditType } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, ExtHostEditorsShape, IApplyEditsOptions, ITextDocumentShowOptions, ITextEditorConfigurationUpdate, ITextEditorPositionData, IUndoStopOptions, MainThreadTextEditorsShape, TextEditorRevealType, IWorkspaceEditDto, WorkspaceEditType } from 'vs/workbench/api/common/extHost.protocol'; import { editorGroupToColumn, columnToEditorGroup, EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -28,6 +28,8 @@ import { revive } from 'vs/base/common/marshalling'; import { ResourceNotebookCellEdit } from 'vs/workbench/contrib/bulkEdit/browser/bulkCellEdits'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto'; +import { ILineChange } from 'vs/editor/common/diff/diffComputer'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; export function reviveWorkspaceEditDto2(data: IWorkspaceEditDto | undefined): ResourceEdit[] { if (!data?.edits) { @@ -55,9 +57,9 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { private readonly _proxy: ExtHostEditorsShape; private readonly _documentsAndEditors: MainThreadDocumentsAndEditors; private readonly _toDispose = new DisposableStore(); - private _textEditorsListenersMap: { [editorId: string]: IDisposable[]; }; + private _textEditorsListenersMap: { [editorId: string]: IDisposable[] }; private _editorPositionData: ITextEditorPositionData | null; - private _registeredDecorationTypes: { [decorationType: string]: boolean; }; + private _registeredDecorationTypes: { [decorationType: string]: boolean }; constructor( documentsAndEditors: MainThreadDocumentsAndEditors, diff --git a/src/vs/workbench/api/browser/mainThreadErrors.ts b/src/vs/workbench/api/browser/mainThreadErrors.ts index 9ccf414c1f4..36fdac455c6 100644 --- a/src/vs/workbench/api/browser/mainThreadErrors.ts +++ b/src/vs/workbench/api/browser/mainThreadErrors.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { SerializedError, onUnexpectedError } from 'vs/base/common/errors'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { MainContext, MainThreadErrorsShape } from 'vs/workbench/api/common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadErrors) diff --git a/src/vs/workbench/api/browser/mainThreadExtensionService.ts b/src/vs/workbench/api/browser/mainThreadExtensionService.ts index a3ab550d7eb..6456ee59f11 100644 --- a/src/vs/workbench/api/browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/browser/mainThreadExtensionService.ts @@ -5,9 +5,9 @@ import { SerializedError } from 'vs/base/common/errors'; import Severity from 'vs/base/common/severity'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { IExtHostContext, MainContext, MainThreadExtensionServiceShape } from 'vs/workbench/api/common/extHost.protocol'; -import { IExtensionService, ExtensionHostKind, MissingExtensionDependency } from 'vs/workbench/services/extensions/common/extensions'; +import { extHostNamedCustomer, IExtHostContext, IInternalExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { ExtHostContext, ExtHostExtensionServiceShape, MainContext, MainThreadExtensionServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { IExtensionService, ExtensionHostKind, MissingExtensionDependency, ExtensionActivationReason, ActivationKind, IInternalExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { localize } from 'vs/nls'; @@ -18,15 +18,19 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IExtension, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ExtensionActivationReason } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ITimerService } from 'vs/workbench/services/timer/browser/timerService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IExtensionHostProxy, IResolveAuthorityResult } from 'vs/workbench/services/extensions/common/extensionHostProxy'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { URI } from 'vs/base/common/uri'; @extHostNamedCustomer(MainContext.MainThreadExtensionService) export class MainThreadExtensionService implements MainThreadExtensionServiceShape { private readonly _extensionHostKind: ExtensionHostKind; + private readonly _internalExtensionService: IInternalExtensionService; constructor( extHostContext: IExtHostContext, @@ -40,26 +44,33 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha @IWorkbenchEnvironmentService protected readonly _environmentService: IWorkbenchEnvironmentService, ) { this._extensionHostKind = extHostContext.extensionHostKind; + + const internalExtHostContext = (extHostContext); + this._internalExtensionService = internalExtHostContext.internalExtensionService; + internalExtHostContext._setExtensionHostProxy( + new ExtensionHostProxy(extHostContext.getProxy(ExtHostContext.ExtHostExtensionService)) + ); + internalExtHostContext._setAllMainProxyIdentifiers(Object.keys(MainContext).map((key) => (MainContext)[key])); } public dispose(): void { } $activateExtension(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise { - return this._extensionService._activateById(extensionId, reason); + return this._internalExtensionService._activateById(extensionId, reason); } async $onWillActivateExtension(extensionId: ExtensionIdentifier): Promise { - this._extensionService._onWillActivateExtension(extensionId); + this._internalExtensionService._onWillActivateExtension(extensionId); } $onDidActivateExtension(extensionId: ExtensionIdentifier, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationReason: ExtensionActivationReason): void { - this._extensionService._onDidActivateExtension(extensionId, codeLoadingTime, activateCallTime, activateResolvedTime, activationReason); + this._internalExtensionService._onDidActivateExtension(extensionId, codeLoadingTime, activateCallTime, activateResolvedTime, activationReason); } $onExtensionRuntimeError(extensionId: ExtensionIdentifier, data: SerializedError): void { const error = new Error(); error.name = data.name; error.message = data.message; error.stack = data.stack; - this._extensionService._onExtensionRuntimeError(extensionId, error); + this._internalExtensionService._onExtensionRuntimeError(extensionId, error); console.error(`[${extensionId}]${error.message}`); console.error(error.stack); } @@ -69,7 +80,7 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha error.message = data.message; error.stack = data.stack; - this._extensionService._onDidActivateExtensionError(extensionId, error); + this._internalExtensionService._onDidActivateExtensionError(extensionId, error); if (missingExtensionDependency) { const extension = await this._extensionService.getExtension(extensionId.value); @@ -144,7 +155,7 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha const extName = extension.displayName || extension.name; let dependencyExtension: IExtension | null = null; try { - dependencyExtension = (await this._extensionsWorkbenchService.queryGallery({ names: [missingDependency] }, CancellationToken.None)).firstPage[0]; + dependencyExtension = (await this._extensionsWorkbenchService.getExtensions([{ id: missingDependency }], CancellationToken.None))[0]; } catch (err) { } if (dependencyExtension) { @@ -172,3 +183,50 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha } } } + +class ExtensionHostProxy implements IExtensionHostProxy { + constructor( + private readonly _actual: ExtHostExtensionServiceShape + ) { } + + resolveAuthority(remoteAuthority: string, resolveAttempt: number): Promise { + return this._actual.$resolveAuthority(remoteAuthority, resolveAttempt); + } + async getCanonicalURI(remoteAuthority: string, uri: URI): Promise { + const uriComponents = await this._actual.$getCanonicalURI(remoteAuthority, uri); + return URI.revive(uriComponents); + } + startExtensionHost(enabledExtensionIds: ExtensionIdentifier[]): Promise { + return this._actual.$startExtensionHost(enabledExtensionIds); + } + extensionTestsExecute(): Promise { + return this._actual.$extensionTestsExecute(); + } + extensionTestsExit(code: number): Promise { + return this._actual.$extensionTestsExit(code); + } + activateByEvent(activationEvent: string, activationKind: ActivationKind): Promise { + return this._actual.$activateByEvent(activationEvent, activationKind); + } + activate(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise { + return this._actual.$activate(extensionId, reason); + } + setRemoteEnvironment(env: { [key: string]: string | null }): Promise { + return this._actual.$setRemoteEnvironment(env); + } + updateRemoteConnectionData(connectionData: IRemoteConnectionData): Promise { + return this._actual.$updateRemoteConnectionData(connectionData); + } + deltaExtensions(toAdd: IExtensionDescription[], toRemove: ExtensionIdentifier[]): Promise { + return this._actual.$deltaExtensions(toAdd, toRemove); + } + test_latency(n: number): Promise { + return this._actual.$test_latency(n); + } + test_up(b: VSBuffer): Promise { + return this._actual.$test_up(b); + } + test_down(size: number): Promise { + return this._actual.$test_down(size); + } +} diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index 7dd8c43f71a..8d1380f0fc4 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -7,8 +7,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IStat, IWatchOptions, FileType, FileOverwriteOptions, FileDeleteOptions, FileOpenOptions, IFileStat, FileOperationError, FileOperationResult, FileSystemProviderErrorCode, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithFileFolderCopyCapability, FilePermission, toFileSystemProviderErrorCode, IFilesConfiguration } from 'vs/platform/files/common/files'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { ExtHostContext, ExtHostFileSystemShape, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../common/extHost.protocol'; import { VSBuffer } from 'vs/base/common/buffer'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ILogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts index 93d14e1eb0c..756fb3bc722 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts @@ -5,8 +5,8 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { FileOperation, IFileService } from 'vs/platform/files/common/files'; -import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { ExtHostContext, IExtHostContext } from '../common/extHost.protocol'; +import { extHostCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { ExtHostContext } from '../common/extHost.protocol'; import { localize } from 'vs/nls'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -165,6 +165,8 @@ export class MainThreadFileSystemEventService { return localize('msg-copy', "Running 'File Copy' participants..."); case FileOperation.DELETE: return localize('msg-delete', "Running 'File Delete' participants..."); + case FileOperation.WRITE: + return localize('msg-write', "Running 'File Write' participants..."); } } }; diff --git a/src/vs/workbench/api/browser/mainThreadInteractive.ts b/src/vs/workbench/api/browser/mainThreadInteractive.ts index 7a918d998ea..36b227a69de 100644 --- a/src/vs/workbench/api/browser/mainThreadInteractive.ts +++ b/src/vs/workbench/api/browser/mainThreadInteractive.ts @@ -5,8 +5,8 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { ExtHostContext, ExtHostInteractiveShape, IExtHostContext, MainContext, MainThreadInteractiveShape } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, ExtHostInteractiveShape, MainContext, MainThreadInteractiveShape } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IInteractiveDocumentService } from 'vs/workbench/contrib/interactive/browser/interactiveDocumentService'; @extHostNamedCustomer(MainContext.MainThreadInteractive) diff --git a/src/vs/workbench/api/browser/mainThreadKeytar.ts b/src/vs/workbench/api/browser/mainThreadKeytar.ts index 5312a9aad19..8b7649ada1f 100644 --- a/src/vs/workbench/api/browser/mainThreadKeytar.ts +++ b/src/vs/workbench/api/browser/mainThreadKeytar.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { MainContext, MainThreadKeytarShape, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { MainContext, MainThreadKeytarShape } from 'vs/workbench/api/common/extHost.protocol'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; @extHostNamedCustomer(MainContext.MainThreadKeytar) @@ -31,7 +31,7 @@ export class MainThreadKeytar implements MainThreadKeytarShape { return this._credentialsService.findPassword(service); } - async $findCredentials(service: string): Promise> { + async $findCredentials(service: string): Promise> { return this._credentialsService.findCredentials(service); } diff --git a/src/vs/workbench/api/browser/mainThreadLabelService.ts b/src/vs/workbench/api/browser/mainThreadLabelService.ts index a0b85358bda..4c3f813a56e 100644 --- a/src/vs/workbench/api/browser/mainThreadLabelService.ts +++ b/src/vs/workbench/api/browser/mainThreadLabelService.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MainContext, MainThreadLabelServiceShape, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainContext, MainThreadLabelServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { ResourceLabelFormatter, ILabelService } from 'vs/platform/label/common/label'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -33,4 +33,4 @@ export class MainThreadLabelService implements MainThreadLabelServiceShape { dispose(): void { // noop } -} \ No newline at end of file +} diff --git a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts index 68a70aba356..f8346dcf668 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguageFeatures.ts @@ -5,17 +5,18 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; -import { ITextModel, ISingleEditOperation } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import { ITextModel } from 'vs/editor/common/model'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; +import * as languages from 'vs/editor/common/languages'; import * as search from 'vs/workbench/contrib/search/common/search'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Position as EditorPosition } from 'vs/editor/common/core/position'; import { Range as EditorRange, IRange } from 'vs/editor/common/core/range'; -import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ILanguageConfigurationDto, IRegExpDto, IIndentationRuleDto, IOnEnterRuleDto, ILocationDto, IWorkspaceSymbolDto, reviveWorkspaceEditDto, IDocumentFilterDto, IDefinitionLinkDto, ISignatureHelpProviderMetadataDto, ILinkDto, ICallHierarchyItemDto, ISuggestDataDto, ICodeActionDto, ISuggestDataDtoField, ISuggestResultDtoField, ICodeActionProviderMetadataDto, ILanguageWordDefinitionDto, IdentifiableInlineCompletions, IdentifiableInlineCompletion, ITypeHierarchyItemDto, IInlayHintDto } from '../common/extHost.protocol'; +import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, ILanguageConfigurationDto, IRegExpDto, IIndentationRuleDto, IOnEnterRuleDto, ILocationDto, IWorkspaceSymbolDto, reviveWorkspaceEditDto, IDocumentFilterDto, ILocationLinkDto, ISignatureHelpProviderMetadataDto, ILinkDto, ICallHierarchyItemDto, ISuggestDataDto, ICodeActionDto, ISuggestDataDtoField, ISuggestResultDtoField, ICodeActionProviderMetadataDto, ILanguageWordDefinitionDto, IdentifiableInlineCompletions, IdentifiableInlineCompletion, ITypeHierarchyItemDto, IInlayHintDto } from '../common/extHost.protocol'; import { ILanguageConfigurationService, LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { LanguageConfiguration, IndentationRule, OnEnterRule } from 'vs/editor/common/languages/languageConfiguration'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { URI } from 'vs/base/common/uri'; import { Selection } from 'vs/editor/common/core/selection'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; @@ -25,6 +26,7 @@ import { mixin } from 'vs/base/common/objects'; import { decodeSemanticTokensDto } from 'vs/editor/common/services/semanticTokensDto'; import { revive } from 'vs/base/common/marshalling'; import { CancellationError } from 'vs/base/common/errors'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; @extHostNamedCustomer(MainContext.MainThreadLanguageFeatures) export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesShape { @@ -36,7 +38,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha constructor( extHostContext: IExtHostContext, @ILanguageService languageService: ILanguageService, - @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService + @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostLanguageFeatures); this._languageService = languageService; @@ -87,31 +90,31 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha //#region --- revive functions - private static _reviveLocationDto(data?: ILocationDto): modes.Location; - private static _reviveLocationDto(data?: ILocationDto[]): modes.Location[]; - private static _reviveLocationDto(data: ILocationDto | ILocationDto[] | undefined): modes.Location | modes.Location[] | undefined { + private static _reviveLocationDto(data?: ILocationDto): languages.Location; + private static _reviveLocationDto(data?: ILocationDto[]): languages.Location[]; + private static _reviveLocationDto(data: ILocationDto | ILocationDto[] | undefined): languages.Location | languages.Location[] | undefined { if (!data) { return data; } else if (Array.isArray(data)) { data.forEach(l => MainThreadLanguageFeatures._reviveLocationDto(l)); - return data; + return data; } else { data.uri = URI.revive(data.uri); - return data; + return data; } } - private static _reviveLocationLinkDto(data: IDefinitionLinkDto): modes.LocationLink; - private static _reviveLocationLinkDto(data: IDefinitionLinkDto[]): modes.LocationLink[]; - private static _reviveLocationLinkDto(data: IDefinitionLinkDto | IDefinitionLinkDto[]): modes.LocationLink | modes.LocationLink[] { + private static _reviveLocationLinkDto(data: ILocationLinkDto): languages.LocationLink; + private static _reviveLocationLinkDto(data: ILocationLinkDto[]): languages.LocationLink[]; + private static _reviveLocationLinkDto(data: ILocationLinkDto | ILocationLinkDto[]): languages.LocationLink | languages.LocationLink[] { if (!data) { - return data; + return data; } else if (Array.isArray(data)) { data.forEach(l => MainThreadLanguageFeatures._reviveLocationLinkDto(l)); - return data; + return data; } else { data.uri = URI.revive(data.uri); - return data; + return data; } } @@ -130,18 +133,18 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha } } - private static _reviveCodeActionDto(data: ReadonlyArray): modes.CodeAction[] { + private static _reviveCodeActionDto(data: ReadonlyArray): languages.CodeAction[] { if (data) { data.forEach(code => reviveWorkspaceEditDto(code.edit)); } - return data; + return data; } - private static _reviveLinkDTO(data: ILinkDto): modes.ILink { + private static _reviveLinkDTO(data: ILinkDto): languages.ILink { if (data.url && typeof data.url !== 'string') { data.url = URI.revive(data.url); } - return data; + return data; } private static _reviveCallHierarchyItemDto(data: ICallHierarchyItemDto | undefined): callh.CallHierarchyItem { @@ -163,9 +166,9 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- outline $registerDocumentSymbolProvider(handle: number, selector: IDocumentFilterDto[], displayName: string): void { - this._registrations.set(handle, modes.DocumentSymbolProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.documentSymbolProvider.register(selector, { displayName, - provideDocumentSymbols: (model: ITextModel, token: CancellationToken): Promise => { + provideDocumentSymbols: (model: ITextModel, token: CancellationToken): Promise => { return this._proxy.$provideDocumentSymbols(handle, model.uri, token); } })); @@ -175,8 +178,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha $registerCodeLensSupport(handle: number, selector: IDocumentFilterDto[], eventHandle: number | undefined): void { - const provider = { - provideCodeLenses: async (model: ITextModel, token: CancellationToken): Promise => { + const provider = { + provideCodeLenses: async (model: ITextModel, token: CancellationToken): Promise => { const listDto = await this._proxy.$provideCodeLenses(handle, model.uri, token); if (!listDto) { return undefined; @@ -186,18 +189,18 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha dispose: () => listDto.cacheId && this._proxy.$releaseCodeLenses(handle, listDto.cacheId) }; }, - resolveCodeLens: (_model: ITextModel, codeLens: modes.CodeLens, token: CancellationToken): Promise => { + resolveCodeLens: (_model: ITextModel, codeLens: languages.CodeLens, token: CancellationToken): Promise => { return this._proxy.$resolveCodeLens(handle, codeLens, token); } }; if (typeof eventHandle === 'number') { - const emitter = new Emitter(); + const emitter = new Emitter(); this._registrations.set(eventHandle, emitter); provider.onDidChange = emitter.event; } - this._registrations.set(handle, modes.CodeLensProviderRegistry.register(selector, provider)); + this._registrations.set(handle, this._languageFeaturesService.codeLensProvider.register(selector, provider)); } $emitCodeLensEvent(eventHandle: number, event?: any): void { @@ -210,15 +213,15 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- declaration $registerDefinitionSupport(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.DefinitionProviderRegistry.register(selector, { - provideDefinition: (model, position, token): Promise => { + this._registrations.set(handle, this._languageFeaturesService.definitionProvider.register(selector, { + provideDefinition: (model, position, token): Promise => { return this._proxy.$provideDefinition(handle, model.uri, position, token).then(MainThreadLanguageFeatures._reviveLocationLinkDto); } })); } $registerDeclarationSupport(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.DeclarationProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.declarationProvider.register(selector, { provideDeclaration: (model, position, token) => { return this._proxy.$provideDeclaration(handle, model.uri, position, token).then(MainThreadLanguageFeatures._reviveLocationLinkDto); } @@ -226,16 +229,16 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha } $registerImplementationSupport(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.ImplementationProviderRegistry.register(selector, { - provideImplementation: (model, position, token): Promise => { + this._registrations.set(handle, this._languageFeaturesService.implementationProvider.register(selector, { + provideImplementation: (model, position, token): Promise => { return this._proxy.$provideImplementation(handle, model.uri, position, token).then(MainThreadLanguageFeatures._reviveLocationLinkDto); } })); } $registerTypeDefinitionSupport(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.TypeDefinitionProviderRegistry.register(selector, { - provideTypeDefinition: (model, position, token): Promise => { + this._registrations.set(handle, this._languageFeaturesService.typeDefinitionProvider.register(selector, { + provideTypeDefinition: (model, position, token): Promise => { return this._proxy.$provideTypeDefinition(handle, model.uri, position, token).then(MainThreadLanguageFeatures._reviveLocationLinkDto); } })); @@ -244,8 +247,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- extra info $registerHoverProvider(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.HoverProviderRegistry.register(selector, { - provideHover: (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => { + this._registrations.set(handle, this._languageFeaturesService.hoverProvider.register(selector, { + provideHover: (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => { return this._proxy.$provideHover(handle, model.uri, position, token); } })); @@ -254,8 +257,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- debug hover $registerEvaluatableExpressionProvider(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.EvaluatableExpressionProviderRegistry.register(selector, { - provideEvaluatableExpression: (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => { + this._registrations.set(handle, this._languageFeaturesService.evaluatableExpressionProvider.register(selector, { + provideEvaluatableExpression: (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => { return this._proxy.$provideEvaluatableExpression(handle, model.uri, position, token); } })); @@ -264,8 +267,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- inline values $registerInlineValuesProvider(handle: number, selector: IDocumentFilterDto[], eventHandle: number | undefined): void { - const provider = { - provideInlineValues: (model: ITextModel, viewPort: EditorRange, context: modes.InlineValueContext, token: CancellationToken): Promise => { + const provider = { + provideInlineValues: (model: ITextModel, viewPort: EditorRange, context: languages.InlineValueContext, token: CancellationToken): Promise => { return this._proxy.$provideInlineValues(handle, model.uri, viewPort, context, token); } }; @@ -276,7 +279,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha provider.onDidChangeInlineValues = emitter.event; } - this._registrations.set(handle, modes.InlineValuesProviderRegistry.register(selector, provider)); + this._registrations.set(handle, this._languageFeaturesService.inlineValuesProvider.register(selector, provider)); } $emitInlineValuesEvent(eventHandle: number, event?: any): void { @@ -289,8 +292,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- occurrences $registerDocumentHighlightProvider(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.DocumentHighlightProviderRegistry.register(selector, { - provideDocumentHighlights: (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => { + this._registrations.set(handle, this._languageFeaturesService.documentHighlightProvider.register(selector, { + provideDocumentHighlights: (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => { return this._proxy.$provideDocumentHighlights(handle, model.uri, position, token); } })); @@ -299,8 +302,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- linked editing $registerLinkedEditingRangeProvider(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.LinkedEditingRangeProviderRegistry.register(selector, { - provideLinkedEditingRanges: async (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => { + this._registrations.set(handle, this._languageFeaturesService.linkedEditingRangeProvider.register(selector, { + provideLinkedEditingRanges: async (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => { const res = await this._proxy.$provideLinkedEditingRanges(handle, model.uri, position, token); if (res) { return { @@ -316,8 +319,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- references $registerReferenceSupport(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.ReferenceProviderRegistry.register(selector, { - provideReferences: (model: ITextModel, position: EditorPosition, context: modes.ReferenceContext, token: CancellationToken): Promise => { + this._registrations.set(handle, this._languageFeaturesService.referenceProvider.register(selector, { + provideReferences: (model: ITextModel, position: EditorPosition, context: languages.ReferenceContext, token: CancellationToken): Promise => { return this._proxy.$provideReferences(handle, model.uri, position, context, token).then(MainThreadLanguageFeatures._reviveLocationDto); } })); @@ -326,13 +329,13 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- quick fix $registerQuickFixSupport(handle: number, selector: IDocumentFilterDto[], metadata: ICodeActionProviderMetadataDto, displayName: string, supportsResolve: boolean): void { - const provider: modes.CodeActionProvider = { - provideCodeActions: async (model: ITextModel, rangeOrSelection: EditorRange | Selection, context: modes.CodeActionContext, token: CancellationToken): Promise => { + const provider: languages.CodeActionProvider = { + provideCodeActions: async (model: ITextModel, rangeOrSelection: EditorRange | Selection, context: languages.CodeActionContext, token: CancellationToken): Promise => { const listDto = await this._proxy.$provideCodeActions(handle, model.uri, rangeOrSelection, context, token); if (!listDto) { return undefined; } - return { + return { actions: MainThreadLanguageFeatures._reviveCodeActionDto(listDto.actions), dispose: () => { if (typeof listDto.cacheId === 'number') { @@ -347,43 +350,43 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha }; if (supportsResolve) { - provider.resolveCodeAction = async (codeAction: modes.CodeAction, token: CancellationToken): Promise => { + provider.resolveCodeAction = async (codeAction: languages.CodeAction, token: CancellationToken): Promise => { const data = await this._proxy.$resolveCodeAction(handle, (codeAction).cacheId!, token); codeAction.edit = reviveWorkspaceEditDto(data); return codeAction; }; } - this._registrations.set(handle, modes.CodeActionProviderRegistry.register(selector, provider)); + this._registrations.set(handle, this._languageFeaturesService.codeActionProvider.register(selector, provider)); } // --- formatting $registerDocumentFormattingSupport(handle: number, selector: IDocumentFilterDto[], extensionId: ExtensionIdentifier, displayName: string): void { - this._registrations.set(handle, modes.DocumentFormattingEditProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.documentFormattingEditProvider.register(selector, { extensionId, displayName, - provideDocumentFormattingEdits: (model: ITextModel, options: modes.FormattingOptions, token: CancellationToken): Promise => { + provideDocumentFormattingEdits: (model: ITextModel, options: languages.FormattingOptions, token: CancellationToken): Promise => { return this._proxy.$provideDocumentFormattingEdits(handle, model.uri, options, token); } })); } $registerRangeFormattingSupport(handle: number, selector: IDocumentFilterDto[], extensionId: ExtensionIdentifier, displayName: string): void { - this._registrations.set(handle, modes.DocumentRangeFormattingEditProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.documentRangeFormattingEditProvider.register(selector, { extensionId, displayName, - provideDocumentRangeFormattingEdits: (model: ITextModel, range: EditorRange, options: modes.FormattingOptions, token: CancellationToken): Promise => { + provideDocumentRangeFormattingEdits: (model: ITextModel, range: EditorRange, options: languages.FormattingOptions, token: CancellationToken): Promise => { return this._proxy.$provideDocumentRangeFormattingEdits(handle, model.uri, range, options, token); } })); } $registerOnTypeFormattingSupport(handle: number, selector: IDocumentFilterDto[], autoFormatTriggerCharacters: string[], extensionId: ExtensionIdentifier): void { - this._registrations.set(handle, modes.OnTypeFormattingEditProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.onTypeFormattingEditProvider.register(selector, { extensionId, autoFormatTriggerCharacters, - provideOnTypeFormattingEdits: (model: ITextModel, position: EditorPosition, ch: string, options: modes.FormattingOptions, token: CancellationToken): Promise => { + provideOnTypeFormattingEdits: (model: ITextModel, position: EditorPosition, ch: string, options: languages.FormattingOptions, token: CancellationToken): Promise => { return this._proxy.$provideOnTypeFormattingEdits(handle, model.uri, position, ch, options, token); } })); @@ -400,7 +403,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha if (lastResultId !== undefined) { this._proxy.$releaseWorkspaceSymbols(handle, lastResultId); } - lastResultId = result._id; + lastResultId = result.cacheId; return MainThreadLanguageFeatures._reviveWorkspaceSymbolDto(result.symbols); } }; @@ -416,26 +419,26 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- rename $registerRenameSupport(handle: number, selector: IDocumentFilterDto[], supportResolveLocation: boolean): void { - this._registrations.set(handle, modes.RenameProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.renameProvider.register(selector, { provideRenameEdits: (model: ITextModel, position: EditorPosition, newName: string, token: CancellationToken) => { return this._proxy.$provideRenameEdits(handle, model.uri, position, newName, token).then(reviveWorkspaceEditDto); }, resolveRenameLocation: supportResolveLocation - ? (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => this._proxy.$resolveRenameLocation(handle, model.uri, position, token) + ? (model: ITextModel, position: EditorPosition, token: CancellationToken): Promise => this._proxy.$resolveRenameLocation(handle, model.uri, position, token) : undefined })); } // --- semantic tokens - $registerDocumentSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: modes.SemanticTokensLegend, eventHandle: number | undefined): void { + $registerDocumentSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: languages.SemanticTokensLegend, eventHandle: number | undefined): void { let event: Event | undefined = undefined; if (typeof eventHandle === 'number') { const emitter = new Emitter(); this._registrations.set(eventHandle, emitter); event = emitter.event; } - this._registrations.set(handle, modes.DocumentSemanticTokensProviderRegistry.register(selector, new MainThreadDocumentSemanticTokensProvider(this._proxy, handle, legend, event))); + this._registrations.set(handle, this._languageFeaturesService.documentSemanticTokensProvider.register(selector, new MainThreadDocumentSemanticTokensProvider(this._proxy, handle, legend, event))); } $emitDocumentSemanticTokensEvent(eventHandle: number): void { @@ -445,19 +448,19 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha } } - $registerDocumentRangeSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: modes.SemanticTokensLegend): void { - this._registrations.set(handle, modes.DocumentRangeSemanticTokensProviderRegistry.register(selector, new MainThreadDocumentRangeSemanticTokensProvider(this._proxy, handle, legend))); + $registerDocumentRangeSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: languages.SemanticTokensLegend): void { + this._registrations.set(handle, this._languageFeaturesService.documentRangeSemanticTokensProvider.register(selector, new MainThreadDocumentRangeSemanticTokensProvider(this._proxy, handle, legend))); } // --- suggest - private static _inflateSuggestDto(defaultRange: IRange | { insert: IRange, replace: IRange; }, data: ISuggestDataDto): modes.CompletionItem { + private static _inflateSuggestDto(defaultRange: IRange | { insert: IRange; replace: IRange }, data: ISuggestDataDto): languages.CompletionItem { const label = data[ISuggestDataDtoField.label]; return { label, - kind: data[ISuggestDataDtoField.kind] ?? modes.CompletionItemKind.Property, + kind: data[ISuggestDataDtoField.kind] ?? languages.CompletionItemKind.Property, tags: data[ISuggestDataDtoField.kindModifier], detail: data[ISuggestDataDtoField.detail], documentation: data[ISuggestDataDtoField.documentation], @@ -476,10 +479,10 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha } $registerSuggestSupport(handle: number, selector: IDocumentFilterDto[], triggerCharacters: string[], supportsResolveDetails: boolean, displayName: string): void { - const provider: modes.CompletionItemProvider = { + const provider: languages.CompletionItemProvider = { triggerCharacters, _debugDisplayName: displayName, - provideCompletionItems: async (model: ITextModel, position: EditorPosition, context: modes.CompletionContext, token: CancellationToken): Promise => { + provideCompletionItems: async (model: ITextModel, position: EditorPosition, context: languages.CompletionContext, token: CancellationToken): Promise => { const result = await this._proxy.$provideCompletionItems(handle, model.uri, position, context, token); if (!result) { return result; @@ -508,12 +511,12 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha }); }; } - this._registrations.set(handle, modes.CompletionProviderRegistry.register(selector, provider)); + this._registrations.set(handle, this._languageFeaturesService.completionProvider.register(selector, provider)); } $registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[]): void { - const provider: modes.InlineCompletionsProvider = { - provideInlineCompletions: async (model: ITextModel, position: EditorPosition, context: modes.InlineCompletionContext, token: CancellationToken): Promise => { + const provider: languages.InlineCompletionsProvider = { + provideInlineCompletions: async (model: ITextModel, position: EditorPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise => { return this._proxy.$provideInlineCompletions(handle, model.uri, position, context, token); }, handleItemDidShow: async (completions: IdentifiableInlineCompletions, item: IdentifiableInlineCompletion): Promise => { @@ -523,18 +526,18 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha this._proxy.$freeInlineCompletionsList(handle, completions.pid); } }; - this._registrations.set(handle, modes.InlineCompletionsProviderRegistry.register(selector, provider)); + this._registrations.set(handle, this._languageFeaturesService.inlineCompletionsProvider.register(selector, provider)); } // --- parameter hints $registerSignatureHelpProvider(handle: number, selector: IDocumentFilterDto[], metadata: ISignatureHelpProviderMetadataDto): void { - this._registrations.set(handle, modes.SignatureHelpProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.signatureHelpProvider.register(selector, { signatureHelpTriggerCharacters: metadata.triggerCharacters, signatureHelpRetriggerCharacters: metadata.retriggerCharacters, - provideSignatureHelp: async (model: ITextModel, position: EditorPosition, token: CancellationToken, context: modes.SignatureHelpContext): Promise => { + provideSignatureHelp: async (model: ITextModel, position: EditorPosition, token: CancellationToken, context: languages.SignatureHelpContext): Promise => { const result = await this._proxy.$provideSignatureHelp(handle, model.uri, position, context, token); if (!result) { return undefined; @@ -551,9 +554,10 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- inline hints - $registerInlayHintsProvider(handle: number, selector: IDocumentFilterDto[], supportsResolve: boolean, eventHandle: number | undefined): void { - const provider = { - provideInlayHints: async (model: ITextModel, range: EditorRange, token: CancellationToken): Promise => { + $registerInlayHintsProvider(handle: number, selector: IDocumentFilterDto[], supportsResolve: boolean, eventHandle: number | undefined, displayName: string | undefined): void { + const provider = { + displayName, + provideInlayHints: async (model: ITextModel, range: EditorRange, token: CancellationToken): Promise => { const result = await this._proxy.$provideInlayHints(handle, model.uri, range, token); if (!result) { return; @@ -584,7 +588,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha return { ...hint, tooltip: result.tooltip, - label: revive(result.label) + label: revive(result.label) }; }; } @@ -594,7 +598,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha provider.onDidChangeInlayHints = emitter.event; } - this._registrations.set(handle, modes.InlayHintsProviderRegistry.register(selector, provider)); + this._registrations.set(handle, this._languageFeaturesService.inlayHintsProvider.register(selector, provider)); } $emitInlayHintsEvent(eventHandle: number): void { @@ -607,7 +611,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- links $registerDocumentLinkProvider(handle: number, selector: IDocumentFilterDto[], supportsResolve: boolean): void { - const provider: modes.LinkProvider = { + const provider: languages.LinkProvider = { provideLinks: (model, token) => { return this._proxy.$provideDocumentLinks(handle, model.uri, token).then(dto => { if (!dto) { @@ -616,8 +620,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha return { links: dto.links.map(MainThreadLanguageFeatures._reviveLinkDTO), dispose: () => { - if (typeof dto.id === 'number') { - this._proxy.$releaseDocumentLinks(handle, dto.id); + if (typeof dto.cacheId === 'number') { + this._proxy.$releaseDocumentLinks(handle, dto.cacheId); } } }; @@ -635,14 +639,14 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha }); }; } - this._registrations.set(handle, modes.LinkProviderRegistry.register(selector, provider)); + this._registrations.set(handle, this._languageFeaturesService.linkProvider.register(selector, provider)); } // --- colors $registerDocumentColorProvider(handle: number, selector: IDocumentFilterDto[]): void { const proxy = this._proxy; - this._registrations.set(handle, modes.ColorProviderRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.colorProvider.register(selector, { provideDocumentColors: (model, token) => { return proxy.$provideDocumentColors(handle, model.uri, token) .then(documentColors => { @@ -675,19 +679,19 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- folding $registerFoldingRangeProvider(handle: number, selector: IDocumentFilterDto[], eventHandle: number | undefined): void { - const provider = { + const provider = { provideFoldingRanges: (model, context, token) => { return this._proxy.$provideFoldingRanges(handle, model.uri, context, token); } }; if (typeof eventHandle === 'number') { - const emitter = new Emitter(); + const emitter = new Emitter(); this._registrations.set(eventHandle, emitter); provider.onDidChange = emitter.event; } - this._registrations.set(handle, modes.FoldingRangeProviderRegistry.register(selector, provider)); + this._registrations.set(handle, this._languageFeaturesService.foldingRangeProvider.register(selector, provider)); } $emitFoldingRangeEvent(eventHandle: number, event?: any): void { @@ -700,7 +704,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // -- smart select $registerSelectionRangeProvider(handle: number, selector: IDocumentFilterDto[]): void { - this._registrations.set(handle, modes.SelectionRangeRegistry.register(selector, { + this._registrations.set(handle, this._languageFeaturesService.selectionRangeProvider.register(selector, { provideSelectionRanges: (model, positions, token) => { return this._proxy.$provideSelectionRanges(handle, model.uri, positions, token); } @@ -850,12 +854,12 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha } -export class MainThreadDocumentSemanticTokensProvider implements modes.DocumentSemanticTokensProvider { +export class MainThreadDocumentSemanticTokensProvider implements languages.DocumentSemanticTokensProvider { constructor( private readonly _proxy: ExtHostLanguageFeaturesShape, private readonly _handle: number, - private readonly _legend: modes.SemanticTokensLegend, + private readonly _legend: languages.SemanticTokensLegend, public readonly onDidChange: Event | undefined, ) { } @@ -866,11 +870,11 @@ export class MainThreadDocumentSemanticTokensProvider implements modes.DocumentS } } - public getLegend(): modes.SemanticTokensLegend { + public getLegend(): languages.SemanticTokensLegend { return this._legend; } - async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise { + async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise { const nLastResultId = lastResultId ? parseInt(lastResultId, 10) : 0; const encodedDto = await this._proxy.$provideDocumentSemanticTokens(this._handle, model.uri, nLastResultId, token); if (!encodedDto) { @@ -893,20 +897,20 @@ export class MainThreadDocumentSemanticTokensProvider implements modes.DocumentS } } -export class MainThreadDocumentRangeSemanticTokensProvider implements modes.DocumentRangeSemanticTokensProvider { +export class MainThreadDocumentRangeSemanticTokensProvider implements languages.DocumentRangeSemanticTokensProvider { constructor( private readonly _proxy: ExtHostLanguageFeaturesShape, private readonly _handle: number, - private readonly _legend: modes.SemanticTokensLegend, + private readonly _legend: languages.SemanticTokensLegend, ) { } - public getLegend(): modes.SemanticTokensLegend { + public getLegend(): languages.SemanticTokensLegend { return this._legend; } - async provideDocumentRangeSemanticTokens(model: ITextModel, range: EditorRange, token: CancellationToken): Promise { + async provideDocumentRangeSemanticTokens(model: ITextModel, range: EditorRange, token: CancellationToken): Promise { const encodedDto = await this._proxy.$provideDocumentRangeSemanticTokens(this._handle, model.uri, range, token); if (!encodedDto) { return null; diff --git a/src/vs/workbench/api/browser/mainThreadLanguages.ts b/src/vs/workbench/api/browser/mainThreadLanguages.ts index dba97cef040..71c8c4ab1c2 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguages.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguages.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import { URI, UriComponents } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; -import { MainThreadLanguagesShape, MainContext, IExtHostContext, ExtHostContext, ExtHostLanguagesShape } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadLanguagesShape, MainContext, ExtHostContext, ExtHostLanguagesShape } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { StandardTokenType } from 'vs/editor/common/languages'; @@ -62,7 +62,7 @@ export class MainThreadLanguages implements MainThreadLanguagesShape { } } - async $tokensAtPosition(resource: UriComponents, position: IPosition): Promise { + async $tokensAtPosition(resource: UriComponents, position: IPosition): Promise { const uri = URI.revive(resource); const model = this._modelService.getModel(uri); if (!model) { diff --git a/src/vs/workbench/api/browser/mainThreadLogService.ts b/src/vs/workbench/api/browser/mainThreadLogService.ts index 515b60645b4..d48722ba5cf 100644 --- a/src/vs/workbench/api/browser/mainThreadLogService.ts +++ b/src/vs/workbench/api/browser/mainThreadLogService.ts @@ -3,10 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { ILoggerOptions, ILoggerService, ILogService, log, LogLevel } from 'vs/platform/log/common/log'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IExtHostContext, ExtHostContext, MainThreadLoggerShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, MainThreadLoggerShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { UriComponents, URI } from 'vs/base/common/uri'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; diff --git a/src/vs/workbench/api/browser/mainThreadMessageService.ts b/src/vs/workbench/api/browser/mainThreadMessageService.ts index 7057922be81..5d7cc3c025a 100644 --- a/src/vs/workbench/api/browser/mainThreadMessageService.ts +++ b/src/vs/workbench/api/browser/mainThreadMessageService.ts @@ -6,8 +6,8 @@ import * as nls from 'vs/nls'; import Severity from 'vs/base/common/severity'; import { Action, IAction } from 'vs/base/common/actions'; -import { MainThreadMessageServiceShape, MainContext, IExtHostContext, MainThreadMessageOptions } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadMessageServiceShape, MainContext, MainThreadMessageOptions } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { Event } from 'vs/base/common/event'; @@ -31,7 +31,7 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { // } - $showMessage(severity: Severity, message: string, options: MainThreadMessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Promise { + $showMessage(severity: Severity, message: string, options: MainThreadMessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number }[]): Promise { if (options.modal) { return this._showModalMessage(severity, message, options.detail, commands, options.useCustom); } else { @@ -39,7 +39,7 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { } } - private _showMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number; }[], options: MainThreadMessageOptions): Promise { + private _showMessage(severity: Severity, message: string, commands: { title: string; isCloseAffordance: boolean; handle: number }[], options: MainThreadMessageOptions): Promise { return new Promise(resolve => { @@ -66,7 +66,7 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { primaryActions.push(new MessageItemAction('_extension_message_handle_' + command.handle, command.title, command.handle)); }); - let source: string | { label: string, id: string; } | undefined; + let source: string | { label: string; id: string } | undefined; if (options.source) { source = { label: nls.localize('extensionSource', "{0} (Extension)", options.source.label), @@ -100,7 +100,7 @@ export class MainThreadMessageService implements MainThreadMessageServiceShape { }); } - private async _showModalMessage(severity: Severity, message: string, detail: string | undefined, commands: { title: string; isCloseAffordance: boolean; handle: number; }[], useCustom?: boolean): Promise { + private async _showModalMessage(severity: Severity, message: string, detail: string | undefined, commands: { title: string; isCloseAffordance: boolean; handle: number }[], useCustom?: boolean): Promise { let cancelId: number | undefined = undefined; const buttons = commands.map((command, index) => { diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index 72ca5b6a0be..dfcb29b1f39 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -9,12 +9,12 @@ import { Emitter } from 'vs/base/common/event'; import { DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +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, TransientCellMetadata, TransientDocumentMetadata, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookCellStatusBarItemProvider, INotebookContributionData, NotebookData as NotebookData, NotebookExtensionDescription, TransientCellMetadata, TransientDocumentMetadata, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookContentProvider, INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; -import { ExtHostContext, ExtHostNotebookShape, IExtHostContext, MainContext, MainThreadNotebookShape, NotebookExtensionDescription } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostNotebookShape, MainContext, MainThreadNotebookShape } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadNotebook) export class MainThreadNotebooks implements MainThreadNotebookShape { @@ -22,7 +22,7 @@ export class MainThreadNotebooks implements MainThreadNotebookShape { private readonly _disposables = new DisposableStore(); private readonly _proxy: ExtHostNotebookShape; - private readonly _notebookProviders = new Map(); + private readonly _notebookProviders = new Map(); private readonly _notebookSerializer = new Map(); private readonly _notebookCellStatusBarRegistrations = new Map(); @@ -81,7 +81,7 @@ export class MainThreadNotebooks implements MainThreadNotebookShape { this._notebookProviders.set(viewType, { controller, disposable }); } - async $updateNotebookProviderOptions(viewType: string, options?: { transientOutputs: boolean; transientCellMetadata: TransientCellMetadata; transientDocumentMetadata: TransientDocumentMetadata; }): Promise { + async $updateNotebookProviderOptions(viewType: string, options?: { transientOutputs: boolean; transientCellMetadata: TransientCellMetadata; transientDocumentMetadata: TransientDocumentMetadata }): Promise { const provider = this._notebookProviders.get(viewType); if (provider && options) { diff --git a/src/vs/workbench/api/browser/mainThreadNotebookDocuments.ts b/src/vs/workbench/api/browser/mainThreadNotebookDocuments.ts index 7e28afe5c0b..ea7c35b6a32 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebookDocuments.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebookDocuments.ts @@ -12,10 +12,11 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { NotebookCellsChangeType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { ExtHostContext, ExtHostNotebookDocumentsShape, IExtHostContext, MainThreadNotebookDocumentsShape, NotebookCellDto, NotebookCellsChangedEventDto, NotebookDataDto } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostNotebookDocumentsShape, MainThreadNotebookDocumentsShape, NotebookCellDto, NotebookCellsChangedEventDto, NotebookDataDto } from '../common/extHost.protocol'; import { MainThreadNotebooksAndEditors } from 'vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors'; import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; export class MainThreadNotebookDocuments implements MainThreadNotebookDocumentsShape { @@ -127,7 +128,7 @@ export class MainThreadNotebookDocuments implements MainThreadNotebookDocumentsS } - async $tryCreateNotebook(options: { viewType: string, content?: NotebookDataDto }): Promise { + async $tryCreateNotebook(options: { viewType: string; content?: NotebookDataDto }): Promise { const ref = await this._notebookEditorModelResolverService.resolve({ untitledResource: undefined }, options.viewType); // untitled notebooks are disposed when they get saved. we should not hold a reference diff --git a/src/vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.ts b/src/vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.ts index 67ace55d95a..20db7e53b9e 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.ts @@ -11,7 +11,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { MainThreadNotebookDocuments } from 'vs/workbench/api/browser/mainThreadNotebookDocuments'; import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto'; import { MainThreadNotebookEditors } from 'vs/workbench/api/browser/mainThreadNotebookEditors'; -import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { editorGroupToColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { getNotebookEditorFromEditorPane, IActiveNotebookEditor, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/notebookEditorService'; @@ -19,7 +19,7 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ExtHostContext, ExtHostNotebookShape, IExtHostContext, INotebookDocumentsAndEditorsDelta, INotebookEditorAddData, INotebookModelAddedData, MainContext } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostNotebookShape, INotebookDocumentsAndEditorsDelta, INotebookEditorAddData, INotebookModelAddedData, MainContext } from '../common/extHost.protocol'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; interface INotebookAndEditorDelta { diff --git a/src/vs/workbench/api/browser/mainThreadNotebookDto.ts b/src/vs/workbench/api/browser/mainThreadNotebookDto.ts index 893100761b0..b9a4cf129ce 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebookDto.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebookDto.ts @@ -97,7 +97,6 @@ export namespace NotebookDto { if (data.editType === CellExecutionUpdateType.Output) { return { editType: data.editType, - cellHandle: data.cellHandle, append: data.append, outputs: data.outputs.map(fromNotebookOutputDto) }; diff --git a/src/vs/workbench/api/browser/mainThreadNotebookEditors.ts b/src/vs/workbench/api/browser/mainThreadNotebookEditors.ts index 6560f484bd4..9227fd07ca1 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebookEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebookEditors.ts @@ -6,7 +6,7 @@ import { DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { getNotebookEditorFromEditorPane, INotebookEditor, INotebookEditorOptions } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/notebookEditorService'; -import { ExtHostContext, ExtHostNotebookEditorsShape, ICellEditOperationDto, IExtHostContext, INotebookDocumentShowOptions, INotebookEditorViewColumnInfo, MainThreadNotebookEditorsShape, NotebookEditorRevealType } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostNotebookEditorsShape, ICellEditOperationDto, INotebookDocumentShowOptions, INotebookEditorViewColumnInfo, MainThreadNotebookEditorsShape, NotebookEditorRevealType } from '../common/extHost.protocol'; import { MainThreadNotebooksAndEditors } from 'vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors'; import { INotebookDecorationRenderOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; @@ -18,6 +18,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { columnToEditorGroup, editorGroupToColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { equals } from 'vs/base/common/objects'; import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; class MainThreadNotebook { diff --git a/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts b/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts index 2386aad3d79..4ea045a447f 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebookKernels.ts @@ -3,27 +3,26 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { flatten, groupBy, isNonEmptyArray } from 'vs/base/common/arrays'; +import { flatten, isNonEmptyArray } from 'vs/base/common/arrays'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { combinedDisposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/notebookEditorService'; -import { CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { INotebookCellExecution, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { INotebookKernel, INotebookKernelChangeEvent, INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; -import { ExtHostContext, ExtHostNotebookKernelsShape, ICellExecuteUpdateDto, ICellExecutionCompleteDto, IExtHostContext, INotebookKernelDto2, MainContext, MainThreadNotebookKernelsShape } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostNotebookKernelsShape, ICellExecuteUpdateDto, ICellExecutionCompleteDto, INotebookKernelDto2, MainContext, MainThreadNotebookKernelsShape } from '../common/extHost.protocol'; abstract class MainThreadKernel implements INotebookKernel { private readonly _onDidChange = new Emitter(); - private readonly preloads: { uri: URI, provides: string[]; }[]; + private readonly preloads: { uri: URI; provides: string[] }[]; readonly onDidChange: Event = this._onDidChange.event; readonly id: string; @@ -107,7 +106,7 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape private readonly _kernels = new Map(); private readonly _proxy: ExtHostNotebookKernelsShape; - private readonly _executions = new Set(); + private readonly _executions = new Map(); constructor( extHostContext: IExtHostContext, @@ -125,10 +124,7 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape this._disposables.add(toDisposable(() => { // EH shut down, complete all executions started by this EH this._executions.forEach(e => { - const uri = CellUri.parse(URI.parse(e)); - if (uri) { - this._notebookExecutionStateService.completeNotebookCellExecution(uri.notebook, uri.handle, { }); - } + e.complete({}); }); })); @@ -249,34 +245,34 @@ export class MainThreadNotebookKernels implements MainThreadNotebookKernelsShape // --- execution - $addExecution(rawUri: UriComponents, cellHandle: number): void { + $createExecution(handle: number, controllerId: string, rawUri: UriComponents, cellHandle: number): void { const uri = URI.revive(rawUri); - this._notebookExecutionStateService.createNotebookCellExecution(uri, cellHandle); - - const cellUri = CellUri.generateCellUri(uri, cellHandle, uri.scheme); - this._executions.add(cellUri.toString()); + const execution = this._notebookExecutionStateService.createCellExecution(controllerId, uri, cellHandle); + this._executions.set(handle, execution); } - $updateExecutions(data: SerializableObjectWithBuffers): void { + $updateExecution(handle: number, data: SerializableObjectWithBuffers): void { const updates = data.value; - const groupedUpdates = groupBy(updates, (a, b) => a.cellHandle - b.cellHandle); - groupedUpdates.forEach(datas => { - const first = datas[0]; - - try { - const uri = URI.revive(first.uri); - this._notebookExecutionStateService.updateNotebookCellExecution(uri, first.cellHandle, datas.map(NotebookDto.fromCellExecuteUpdateDto)); - } catch (e) { - onUnexpectedError(e); + try { + const execution = this._executions.get(handle); + if (execution) { + execution.update(updates.map(NotebookDto.fromCellExecuteUpdateDto)); } - }); + } catch (e) { + onUnexpectedError(e); + } } - $completeExecution(rawUri: UriComponents, cellHandle: number, data: SerializableObjectWithBuffers): void { - const uri = URI.revive(rawUri); - this._notebookExecutionStateService.completeNotebookCellExecution(uri, cellHandle, NotebookDto.fromCellExecuteCompleteDto(data.value)); - - const cellUri = CellUri.generateCellUri(uri, cellHandle, uri.scheme); - this._executions.delete(cellUri.toString()); + $completeExecution(handle: number, data: SerializableObjectWithBuffers): void { + try { + const execution = this._executions.get(handle); + if (execution) { + execution.complete(NotebookDto.fromCellExecuteCompleteDto(data.value)); + } + } catch (e) { + onUnexpectedError(e); + } finally { + this._executions.delete(handle); + } } } diff --git a/src/vs/workbench/api/browser/mainThreadNotebookRenderers.ts b/src/vs/workbench/api/browser/mainThreadNotebookRenderers.ts index 83a3578155e..b7c9bb85dc7 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebookRenderers.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebookRenderers.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import { ExtHostContext, ExtHostNotebookRenderersShape, IExtHostContext, MainContext, MainThreadNotebookRenderersShape } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, ExtHostNotebookRenderersShape, MainContext, MainThreadNotebookRenderersShape } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { INotebookRendererMessagingService } from 'vs/workbench/contrib/notebook/common/notebookRendererMessagingService'; @extHostNamedCustomer(MainContext.MainThreadNotebookRenderers) diff --git a/src/vs/workbench/api/browser/mainThreadOutputService.ts b/src/vs/workbench/api/browser/mainThreadOutputService.ts index 42b714e7fdb..2c82719f4e8 100644 --- a/src/vs/workbench/api/browser/mainThreadOutputService.ts +++ b/src/vs/workbench/api/browser/mainThreadOutputService.ts @@ -6,8 +6,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputService, IOutputChannel, OUTPUT_VIEW_ID, OutputChannelUpdateMode } from 'vs/workbench/contrib/output/common/output'; import { Extensions, IOutputChannelRegistry } from 'vs/workbench/services/output/common/output'; -import { MainThreadOutputServiceShape, MainContext, IExtHostContext, ExtHostOutputServiceShape, ExtHostContext } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadOutputServiceShape, MainContext, ExtHostOutputServiceShape, ExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { UriComponents, URI } from 'vs/base/common/uri'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/api/browser/mainThreadProgress.ts b/src/vs/workbench/api/browser/mainThreadProgress.ts index 147c0d3d564..7fa98113c30 100644 --- a/src/vs/workbench/api/browser/mainThreadProgress.ts +++ b/src/vs/workbench/api/browser/mainThreadProgress.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IProgress, IProgressService, IProgressStep, ProgressLocation, IProgressOptions, IProgressNotificationOptions } from 'vs/platform/progress/common/progress'; -import { MainThreadProgressShape, MainContext, IExtHostContext, ExtHostProgressShape, ExtHostContext } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadProgressShape, MainContext, ExtHostProgressShape, ExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { Action } from 'vs/base/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { localize } from 'vs/nls'; @@ -22,7 +22,7 @@ class ManageExtensionAction extends Action { export class MainThreadProgress implements MainThreadProgressShape { private readonly _progressService: IProgressService; - private _progress = new Map void, progress: IProgress }>(); + private _progress = new Map void; progress: IProgress }>(); private readonly _proxy: ExtHostProgressShape; constructor( diff --git a/src/vs/workbench/api/browser/mainThreadQuickOpen.ts b/src/vs/workbench/api/browser/mainThreadQuickOpen.ts index 9a47764e962..001745bf29a 100644 --- a/src/vs/workbench/api/browser/mainThreadQuickOpen.ts +++ b/src/vs/workbench/api/browser/mainThreadQuickOpen.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IPickOptions, IInputOptions, IQuickInputService, IQuickInput, IQuickPick, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { ExtHostContext, MainThreadQuickOpenShape, ExtHostQuickOpenShape, TransferQuickPickItem, MainContext, IExtHostContext, TransferQuickInput, TransferQuickInputButton, IInputBoxOptions, TransferQuickPickItemOrSeparator } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, MainThreadQuickOpenShape, ExtHostQuickOpenShape, TransferQuickPickItem, MainContext, TransferQuickInput, TransferQuickInputButton, IInputBoxOptions, TransferQuickPickItemOrSeparator } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { URI } from 'vs/base/common/uri'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -14,7 +14,7 @@ interface QuickInputSession { handlesToItems: Map; } -function reviveIconPathUris(iconPath: { dark: URI; light?: URI | undefined; }) { +function reviveIconPathUris(iconPath: { dark: URI; light?: URI | undefined }) { iconPath.dark = URI.revive(iconPath.dark); if (iconPath.light) { iconPath.light = URI.revive(iconPath.light); diff --git a/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.ts b/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.ts index a7a5fb056ca..abcaa4cc720 100644 --- a/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.ts +++ b/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { ExtHostContext, IExtHostContext, ExtHostExtensionServiceShape } from '../common/extHost.protocol'; +import { extHostCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { ExtHostContext, ExtHostExtensionServiceShape } from '../common/extHost.protocol'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { Disposable } from 'vs/base/common/lifecycle'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; diff --git a/src/vs/workbench/api/browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts index 60b414cf488..9570c503bba 100644 --- a/src/vs/workbench/api/browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -5,11 +5,11 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; -import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations, IInputValidation, ISCMViewService, InputValidationType } from 'vs/workbench/contrib/scm/common/scm'; -import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, IExtHostContext } from '../common/extHost.protocol'; +import { IDisposable, DisposableStore, combinedDisposable, dispose } from 'vs/base/common/lifecycle'; +import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations, IInputValidation, ISCMViewService, InputValidationType, ISCMActionButtonDescriptor } from 'vs/workbench/contrib/scm/common/scm'; +import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext } from '../common/extHost.protocol'; import { Command } from 'vs/editor/common/languages'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { ISplice, Sequence } from 'vs/base/common/sequence'; import { CancellationToken } from 'vs/base/common/cancellation'; import { MarshalledId } from 'vs/base/common/marshalling'; @@ -96,7 +96,7 @@ class MainThreadSCMProvider implements ISCMProvider { get id(): string { return this._id; } readonly groups = new Sequence(); - private readonly _groupsByHandle: { [handle: number]: MainThreadSCMResourceGroup; } = Object.create(null); + private readonly _groupsByHandle: { [handle: number]: MainThreadSCMResourceGroup } = Object.create(null); // get groups(): ISequence { // return { @@ -120,7 +120,7 @@ class MainThreadSCMProvider implements ISCMProvider { get commitTemplate(): string { return this.features.commitTemplate || ''; } get acceptInputCommand(): Command | undefined { return this.features.acceptInputCommand; } - get actionButton(): Command | undefined { return this.features.actionButton ?? undefined; } + get actionButton(): ISCMActionButtonDescriptor | undefined { return this.features.actionButton ?? undefined; } get statusBarCommands(): Command[] | undefined { return this.features.statusBarCommands; } get count(): number | undefined { return this.features.count; } @@ -290,10 +290,10 @@ export class MainThreadSCM implements MainThreadSCMShape { } dispose(): void { - this._repositories.forEach(r => r.dispose()); + dispose(this._repositories.values()); this._repositories.clear(); - this._repositoryDisposables.forEach(d => d.dispose()); + dispose(this._repositoryDisposables.values()); this._repositoryDisposables.clear(); this._disposables.dispose(); diff --git a/src/vs/workbench/api/browser/mainThreadSaveParticipant.ts b/src/vs/workbench/api/browser/mainThreadSaveParticipant.ts index 2b27da5aa99..fd39c8a6fbf 100644 --- a/src/vs/workbench/api/browser/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/browser/mainThreadSaveParticipant.ts @@ -4,16 +4,16 @@ *--------------------------------------------------------------------------------------------*/ import { CancellationToken } from 'vs/base/common/cancellation'; -import { shouldSynchronizeModel } from 'vs/editor/common/services/model'; +import { shouldSynchronizeModel } from 'vs/editor/common/model'; import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IProgressStep, IProgress } from 'vs/platform/progress/common/progress'; -import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { ITextFileSaveParticipant, ITextFileService, ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; import { SaveReason } from 'vs/workbench/common/editor'; -import { ExtHostContext, ExtHostDocumentSaveParticipantShape, IExtHostContext } from '../common/extHost.protocol'; -import { canceled } from 'vs/base/common/errors'; +import { ExtHostContext, ExtHostDocumentSaveParticipantShape } from '../common/extHost.protocol'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { raceCancellationError } from 'vs/base/common/async'; class ExtHostSaveParticipant implements ITextFileSaveParticipant { @@ -23,7 +23,7 @@ class ExtHostSaveParticipant implements ITextFileSaveParticipant { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocumentSaveParticipant); } - async participate(editorModel: ITextFileEditorModel, env: { reason: SaveReason; }, _progress: IProgress, token: CancellationToken): Promise { + async participate(editorModel: ITextFileEditorModel, env: { reason: SaveReason }, _progress: IProgress, token: CancellationToken): Promise { if (!editorModel.textEditorModel || !shouldSynchronizeModel(editorModel.textEditorModel)) { // the model never made it to the extension @@ -31,9 +31,7 @@ class ExtHostSaveParticipant implements ITextFileSaveParticipant { return undefined; } - return new Promise((resolve, reject) => { - - token.onCancellationRequested(() => reject(canceled())); + const p = new Promise((resolve, reject) => { setTimeout( () => reject(new Error(localize('timeout.onWillSave', "Aborted onWillSaveTextDocument-event after 1750ms"))), @@ -46,6 +44,8 @@ class ExtHostSaveParticipant implements ITextFileSaveParticipant { return undefined; }).then(resolve, reject); }); + + return raceCancellationError(p, token); } } diff --git a/src/vs/workbench/api/browser/mainThreadSearch.ts b/src/vs/workbench/api/browser/mainThreadSearch.ts index 5650c7831d4..45a9fb1d1a3 100644 --- a/src/vs/workbench/api/browser/mainThreadSearch.ts +++ b/src/vs/workbench/api/browser/mainThreadSearch.ts @@ -8,9 +8,9 @@ import { DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle' import { URI, UriComponents } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IFileMatch, IFileQuery, IRawFileMatch2, ISearchComplete, ISearchCompleteStats, ISearchProgressItem, ISearchResultProvider, ISearchService, ITextQuery, QueryType, SearchProviderType } from 'vs/workbench/services/search/common/search'; -import { ExtHostContext, ExtHostSearchShape, IExtHostContext, MainContext, MainThreadSearchShape } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostSearchShape, MainContext, MainThreadSearchShape } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadSearch) export class MainThreadSearch implements MainThreadSearchShape { diff --git a/src/vs/workbench/api/browser/mainThreadSecretState.ts b/src/vs/workbench/api/browser/mainThreadSecretState.ts index af1d73e8fd7..1a131d41518 100644 --- a/src/vs/workbench/api/browser/mainThreadSecretState.ts +++ b/src/vs/workbench/api/browser/mainThreadSecretState.ts @@ -4,37 +4,37 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; import { IEncryptionService } from 'vs/workbench/services/encryption/common/encryptionService'; -import { ExtHostContext, ExtHostSecretStateShape, IExtHostContext, MainContext, MainThreadSecretStateShape } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostSecretStateShape, MainContext, MainThreadSecretStateShape } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadSecretState) export class MainThreadSecretState extends Disposable implements MainThreadSecretStateShape { private readonly _proxy: ExtHostSecretStateShape; + private secretStoragePrefix = this.credentialsService.getSecretStoragePrefix(); + constructor( extHostContext: IExtHostContext, @ICredentialsService private readonly credentialsService: ICredentialsService, @IEncryptionService private readonly encryptionService: IEncryptionService, - @IProductService private readonly productService: IProductService ) { super(); this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostSecretState); - this._register(this.credentialsService.onDidChangePassword(e => { - const extensionId = e.service.substring(this.productService.urlProtocol.length); + this._register(this.credentialsService.onDidChangePassword(async e => { + const extensionId = e.service.substring((await this.secretStoragePrefix).length); this._proxy.$onDidChangePassword({ extensionId, key: e.account }); })); } - private getFullKey(extensionId: string): string { - return `${this.productService.urlProtocol}${extensionId}`; + private async getFullKey(extensionId: string): Promise { + return `${await this.secretStoragePrefix}${extensionId}`; } async $getPassword(extensionId: string, key: string): Promise { - const fullKey = this.getFullKey(extensionId); + const fullKey = await this.getFullKey(extensionId); const password = await this.credentialsService.getPassword(fullKey, key); const decrypted = password && await this.encryptionService.decrypt(password); @@ -53,7 +53,7 @@ export class MainThreadSecretState extends Disposable implements MainThreadSecre } async $setPassword(extensionId: string, key: string, value: string): Promise { - const fullKey = this.getFullKey(extensionId); + const fullKey = await this.getFullKey(extensionId); const toEncrypt = JSON.stringify({ extensionId, content: value @@ -64,7 +64,7 @@ export class MainThreadSecretState extends Disposable implements MainThreadSecre async $deletePassword(extensionId: string, key: string): Promise { try { - const fullKey = this.getFullKey(extensionId); + const fullKey = await this.getFullKey(extensionId); await this.credentialsService.deletePassword(fullKey, key); } catch (_) { throw new Error('Cannot delete password'); diff --git a/src/vs/workbench/api/browser/mainThreadStatusBar.ts b/src/vs/workbench/api/browser/mainThreadStatusBar.ts index eb6a5dace41..916f8f65f29 100644 --- a/src/vs/workbench/api/browser/mainThreadStatusBar.ts +++ b/src/vs/workbench/api/browser/mainThreadStatusBar.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { IStatusbarService, StatusbarAlignment as MainThreadStatusBarAlignment, IStatusbarEntryAccessor, IStatusbarEntry, StatusbarAlignment } from 'vs/workbench/services/statusbar/browser/statusbar'; -import { MainThreadStatusBarShape, MainContext, IExtHostContext } from '../common/extHost.protocol'; +import { MainThreadStatusBarShape, MainContext } from '../common/extHost.protocol'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { dispose } from 'vs/base/common/lifecycle'; import { Command } from 'vs/editor/common/languages'; import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility'; @@ -16,7 +16,7 @@ import { IMarkdownString } from 'vs/base/common/htmlContent'; @extHostNamedCustomer(MainContext.MainThreadStatusBar) export class MainThreadStatusBar implements MainThreadStatusBarShape { - private readonly entries: Map = new Map(); + private readonly entries: Map = new Map(); constructor( _extHostContext: IExtHostContext, diff --git a/src/vs/workbench/api/browser/mainThreadStorage.ts b/src/vs/workbench/api/browser/mainThreadStorage.ts index ab9a361c3e8..690895f0fe0 100644 --- a/src/vs/workbench/api/browser/mainThreadStorage.ts +++ b/src/vs/workbench/api/browser/mainThreadStorage.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { MainThreadStorageShape, MainContext, IExtHostContext, ExtHostStorageShape, ExtHostContext } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadStorageShape, MainContext, ExtHostStorageShape, ExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IDisposable } from 'vs/base/common/lifecycle'; import { isWeb } from 'vs/base/common/platform'; import { IExtensionIdWithVersion, IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; diff --git a/src/vs/workbench/api/browser/mainThreadTask.ts b/src/vs/workbench/api/browser/mainThreadTask.ts index 585790283e4..60575f37b1f 100644 --- a/src/vs/workbench/api/browser/mainThreadTask.ts +++ b/src/vs/workbench/api/browser/mainThreadTask.ts @@ -24,8 +24,8 @@ import { import { ResolveSet, ResolvedVariables } from 'vs/workbench/contrib/tasks/common/taskSystem'; import { ITaskService, TaskFilter, ITaskProvider } from 'vs/workbench/contrib/tasks/common/taskService'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { ExtHostContext, MainThreadTaskShape, ExtHostTaskShape, MainContext, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { ExtHostContext, MainThreadTaskShape, ExtHostTaskShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { TaskDefinitionDTO, TaskExecutionDTO, ProcessExecutionOptionsDTO, TaskPresentationOptionsDTO, ProcessExecutionDTO, ShellExecutionDTO, ShellExecutionOptionsDTO, CustomExecutionDTO, TaskDTO, TaskSourceDTO, TaskHandleDTO, TaskFilterDTO, TaskProcessStartedDTO, TaskProcessEndedDTO, TaskSystemInfoDTO, @@ -403,7 +403,7 @@ export class MainThreadTask implements MainThreadTaskShape { private readonly _extHostContext: IExtHostContext | undefined; private readonly _proxy: ExtHostTaskShape; - private readonly _providers: Map; + private readonly _providers: Map; constructor( extHostContext: IExtHostContext, diff --git a/src/vs/workbench/api/browser/mainThreadTelemetry.ts b/src/vs/workbench/api/browser/mainThreadTelemetry.ts index 0a70e6ac9fe..1ea9aa30327 100644 --- a/src/vs/workbench/api/browser/mainThreadTelemetry.ts +++ b/src/vs/workbench/api/browser/mainThreadTelemetry.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { ITelemetryService, TelemetryLevel, TELEMETRY_OLD_SETTING_ID, TELEMETRY_SETTING_ID } from 'vs/platform/telemetry/common/telemetry'; -import { MainThreadTelemetryShape, MainContext, IExtHostContext, ExtHostTelemetryShape, ExtHostContext } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadTelemetryShape, MainContext, ExtHostTelemetryShape, ExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; import { Disposable } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -19,42 +19,34 @@ export class MainThreadTelemetry extends Disposable implements MainThreadTelemet private static readonly _name = 'pluginHostTelemetry'; - private _oldTelemetryEnabledValue: boolean | undefined; - constructor( extHostContext: IExtHostContext, @ITelemetryService private readonly _telemetryService: ITelemetryService, @IConfigurationService private readonly _configurationService: IConfigurationService, - @IEnvironmentService private readonly _environmenService: IEnvironmentService, + @IEnvironmentService private readonly _environmentService: IEnvironmentService, @IProductService private readonly _productService: IProductService ) { super(); this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTelemetry); - if (supportsTelemetry(this._productService, this._environmenService)) { + if (supportsTelemetry(this._productService, this._environmentService)) { this._register(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(TELEMETRY_SETTING_ID) || e.affectsConfiguration(TELEMETRY_OLD_SETTING_ID)) { - const telemetryEnabled = this.telemetryEnabled; - // Since changing telemetryLevel from "off" => "error" doesn't change the isEnabled state - // We shouldn't fire a change event - if (telemetryEnabled !== this._oldTelemetryEnabledValue) { - this._oldTelemetryEnabledValue = telemetryEnabled; - this._proxy.$onDidChangeTelemetryEnabled(this.telemetryEnabled); - } + this._proxy.$onDidChangeTelemetryLevel(this.telemetryLevel); } })); } - this._proxy.$initializeTelemetryEnabled(this.telemetryEnabled); + this._proxy.$initializeTelemetryLevel(this.telemetryLevel); } - private get telemetryEnabled(): boolean { - if (!supportsTelemetry(this._productService, this._environmenService)) { - return false; + private get telemetryLevel(): TelemetryLevel { + if (!supportsTelemetry(this._productService, this._environmentService)) { + return TelemetryLevel.NONE; } - return getTelemetryLevel(this._configurationService) === TelemetryLevel.USAGE; + return getTelemetryLevel(this._configurationService); } $publicLog(eventName: string, data: any = Object.create(null)): void { diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 433c8e4312d..db958829ce8 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { DisposableStore, Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, TerminalLaunchConfig, ITerminalDimensionsDto, ExtHostTerminalIdentifier } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, TerminalLaunchConfig, ITerminalDimensionsDto, ExtHostTerminalIdentifier } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { URI } from 'vs/base/common/uri'; import { StopWatch } from 'vs/base/common/stopwatch'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -141,7 +141,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape isFeatureTerminal: launchConfig.isFeatureTerminal, isExtensionOwnedTerminal: launchConfig.isExtensionOwnedTerminal, useShellEnvironment: launchConfig.useShellEnvironment, - disablePersistence: launchConfig.disablePersistence + isTransient: launchConfig.isTransient }; const terminal = Promises.withAsyncBody(async r => { const terminal = await this._terminalService.createTerminal({ @@ -154,7 +154,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape await terminal; } - private async _deserializeParentTerminal(location?: TerminalLocation | TerminalEditorLocationOptions | { parentTerminal: ExtHostTerminalIdentifier } | { splitActiveTerminal: boolean, location?: TerminalLocation }): Promise { + private async _deserializeParentTerminal(location?: TerminalLocation | TerminalEditorLocationOptions | { parentTerminal: ExtHostTerminalIdentifier } | { splitActiveTerminal: boolean; location?: TerminalLocation }): Promise { if (typeof location === 'object' && 'parentTerminal' in location) { const parentTerminal = await this._extHostTerminals.get(location.parentTerminal.toString()); return parentTerminal ? { parentTerminal } : undefined; diff --git a/src/vs/workbench/api/browser/mainThreadTesting.ts b/src/vs/workbench/api/browser/mainThreadTesting.ts index 25c4ac69d8c..aebea377c3a 100644 --- a/src/vs/workbench/api/browser/mainThreadTesting.ts +++ b/src/vs/workbench/api/browser/mainThreadTesting.ts @@ -6,32 +6,19 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable, DisposableStore, IDisposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { revive } from 'vs/base/common/marshalling'; import { isDefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { Range } from 'vs/editor/common/core/range'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { MutableObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; -import { ExtensionRunTestsRequest, ITestItem, ITestMessage, ITestRunProfile, ITestRunTask, ResolvedTestRunRequest, SerializedTestMessage, TestDiffOpType, TestResultState, TestsDiff } from 'vs/workbench/contrib/testing/common/testCollection'; -import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService'; +import { ExtensionRunTestsRequest, IFileCoverage, ITestItem, ITestMessage, ITestRunProfile, ITestRunTask, ResolvedTestRunRequest, TestResultState, TestsDiffOp } from 'vs/workbench/contrib/testing/common/testCollection'; import { TestCoverage } from 'vs/workbench/contrib/testing/common/testCoverage'; +import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService'; import { LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; import { IMainThreadTestController, ITestRootProvider, ITestService } from 'vs/workbench/contrib/testing/common/testService'; -import { ExtHostContext, ExtHostTestingShape, IExtHostContext, ILocationDto, ITestControllerPatch, MainContext, MainThreadTestingShape } from '../common/extHost.protocol'; - -const reviveDiff = (diff: TestsDiff) => { - for (const entry of diff) { - if (entry[0] === TestDiffOpType.Add || entry[0] === TestDiffOpType.Update) { - const item = entry[1]; - if (item.item?.uri) { - item.item.uri = URI.revive(item.item.uri); - } - if (item.item?.range) { - item.item.range = Range.lift(item.item.range); - } - } - } -}; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { ExtHostContext, ExtHostTestingShape, ILocationDto, ITestControllerPatch, MainContext, MainThreadTestingShape } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadTesting) export class MainThreadTesting extends Disposable implements MainThreadTestingShape, ITestRootProvider { @@ -41,7 +28,7 @@ export class MainThreadTesting extends Disposable implements MainThreadTestingSh instance: IMainThreadTestController; label: MutableObservableValue; canRefresh: MutableObservableValue; - disposable: IDisposable + disposable: IDisposable; }>(); constructor( @@ -98,15 +85,8 @@ export class MainThreadTesting extends Disposable implements MainThreadTestingSh /** * @inheritdoc */ - $addTestsToRun(controllerId: string, runId: string, tests: ITestItem[]): void { - for (const test of tests) { - test.uri = URI.revive(test.uri); - if (test.range) { - test.range = Range.lift(test.range); - } - } - - this.withLiveRun(runId, r => r.addTestChainToRun(controllerId, tests)); + $addTestsToRun(controllerId: string, runId: string, tests: ITestItem.Serialized[]): void { + this.withLiveRun(runId, r => r.addTestChainToRun(controllerId, tests.map(ITestItem.deserialize))); } /** @@ -120,7 +100,7 @@ export class MainThreadTesting extends Disposable implements MainThreadTestingSh } (task.coverage as MutableObservableValue).value = new TestCoverage({ - provideFileCoverage: token => this.proxy.$provideFileCoverage(runId, taskId, token), + provideFileCoverage: async token => revive(await this.proxy.$provideFileCoverage(runId, taskId, token)), resolveFileCoverage: (i, token) => this.proxy.$resolveFileCoverage(runId, taskId, i, token), }); }); @@ -177,16 +157,11 @@ export class MainThreadTesting extends Disposable implements MainThreadTestingSh /** * @inheritdoc */ - public $appendTestMessagesInRun(runId: string, taskId: string, testId: string, messages: SerializedTestMessage[]): void { + public $appendTestMessagesInRun(runId: string, taskId: string, testId: string, messages: ITestMessage.Serialized[]): void { const r = this.resultService.getResult(runId); if (r && r instanceof LiveTestResult) { for (const message of messages) { - if (message.location) { - message.location.uri = URI.revive(message.location.uri); - message.location.range = Range.lift(message.location.range); - } - - r.appendMessage(testId, taskId, message as ITestMessage); + r.appendMessage(testId, taskId, ITestMessage.deserialize(message)); } } } @@ -249,7 +224,7 @@ export class MainThreadTesting extends Disposable implements MainThreadTestingSh * @inheritdoc */ public $subscribeToDiffs(): void { - this.proxy.$acceptDiff(this.testService.collection.getReviverDiff()); + this.proxy.$acceptDiff(this.testService.collection.getReviverDiff().map(TestsDiffOp.serialize)); this.diffListener.value = this.testService.onDidProcessDiff(this.proxy.$acceptDiff, this.proxy); } @@ -263,9 +238,8 @@ export class MainThreadTesting extends Disposable implements MainThreadTestingSh /** * @inheritdoc */ - public $publishDiff(controllerId: string, diff: TestsDiff): void { - reviveDiff(diff); - this.testService.publishDiff(controllerId, diff); + public $publishDiff(controllerId: string, diff: TestsDiffOp.Serialized[]): void { + this.testService.publishDiff(controllerId, diff.map(TestsDiffOp.deserialize)); } public async $runTests(req: ResolvedTestRunRequest, token: CancellationToken): Promise { diff --git a/src/vs/workbench/api/browser/mainThreadTheming.ts b/src/vs/workbench/api/browser/mainThreadTheming.ts index d810863f852..083da270ba3 100644 --- a/src/vs/workbench/api/browser/mainThreadTheming.ts +++ b/src/vs/workbench/api/browser/mainThreadTheming.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MainContext, IExtHostContext, ExtHostThemingShape, ExtHostContext, MainThreadThemingShape } from '../common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainContext, ExtHostThemingShape, ExtHostContext, MainThreadThemingShape } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IThemeService } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/workbench/api/browser/mainThreadTimeline.ts b/src/vs/workbench/api/browser/mainThreadTimeline.ts index c8d6d0a9a96..6636909bbdf 100644 --- a/src/vs/workbench/api/browser/mainThreadTimeline.ts +++ b/src/vs/workbench/api/browser/mainThreadTimeline.ts @@ -7,9 +7,10 @@ import { Emitter } from 'vs/base/common/event'; import { CancellationToken } from 'vs/base/common/cancellation'; import { URI } from 'vs/base/common/uri'; import { ILogService } from 'vs/platform/log/common/log'; -import { MainContext, MainThreadTimelineShape, IExtHostContext, ExtHostTimelineShape, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { TimelineChangeEvent, TimelineOptions, TimelineProviderDescriptor, ITimelineService, InternalTimelineOptions } from 'vs/workbench/contrib/timeline/common/timeline'; +import { MainContext, MainThreadTimelineShape, ExtHostTimelineShape, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { TimelineChangeEvent, TimelineOptions, TimelineProviderDescriptor, ITimelineService, InternalTimelineOptions, Timeline } from 'vs/workbench/contrib/timeline/common/timeline'; +import { revive } from 'vs/base/common/marshalling'; @extHostNamedCustomer(MainContext.MainThreadTimeline) export class MainThreadTimeline implements MainThreadTimelineShape { @@ -39,8 +40,8 @@ export class MainThreadTimeline implements MainThreadTimelineShape { this._timelineService.registerTimelineProvider({ ...provider, onDidChange: onDidChange.event, - provideTimeline(uri: URI, options: TimelineOptions, token: CancellationToken, internalOptions?: InternalTimelineOptions) { - return proxy.$getTimeline(provider.id, uri, options, token, internalOptions); + async provideTimeline(uri: URI, options: TimelineOptions, token: CancellationToken, internalOptions?: InternalTimelineOptions) { + return revive(await proxy.$getTimeline(provider.id, uri, options, token, internalOptions)); }, dispose() { emitters.delete(provider.id); diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index 7d16a017564..4ea3a5b2830 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape, MainContext, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ITreeViewDataProvider, ITreeItem, IViewsService, ITreeView, IViewsRegistry, ITreeViewDescriptor, IRevealOptions, Extensions, ResolvableTreeItem, ITreeViewDragAndDropController, ITreeDataTransfer } from 'vs/workbench/common/views'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { distinct } from 'vs/base/common/arrays'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { isUndefinedOrNull, isNumber } from 'vs/base/common/types'; @@ -14,6 +14,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; import { TreeDataTransferConverter } from 'vs/workbench/api/common/shared/treeDataTransfer'; +import { CancellationToken } from 'vs/base/common/cancellation'; @extHostNamedCustomer(MainContext.MainThreadTreeViews) export class MainThreadTreeViews extends Disposable implements MainThreadTreeViewsShape { @@ -32,14 +33,14 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTreeViews); } - async $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean, canSelectMany: boolean, dragAndDropMimeTypes: string[] | undefined, hasHandleDrag: boolean }): Promise { + async $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean; canSelectMany: boolean; dropMimeTypes: string[] | undefined; dragMimeTypes: string[] | undefined; hasHandleDrag: boolean }): Promise { this.logService.trace('MainThreadTreeViews#$registerTreeViewDataProvider', treeViewId, options); this.extensionService.whenInstalledExtensionsRegistered().then(() => { const dataProvider = new TreeViewDataProvider(treeViewId, this._proxy, this.notificationService); this._dataProviders.set(treeViewId, dataProvider); - const dndController = options.dragAndDropMimeTypes - ? new TreeViewDragAndDropController(treeViewId, options.dragAndDropMimeTypes, options.hasHandleDrag, this._proxy) : undefined; + const dndController = options.dropMimeTypes + ? new TreeViewDragAndDropController(treeViewId, options.dropMimeTypes, options.dragMimeTypes ?? [], options.hasHandleDrag, this._proxy) : undefined; const viewer = this.getTreeView(treeViewId); if (viewer) { // Order is important here. The internal tree isn't created until the dataProvider is set. @@ -56,7 +57,7 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie }); } - $reveal(treeViewId: string, itemInfo: { item: ITreeItem, parentChain: ITreeItem[] } | undefined, options: IRevealOptions): Promise { + $reveal(treeViewId: string, itemInfo: { item: ITreeItem; parentChain: ITreeItem[] } | undefined, options: IRevealOptions): Promise { this.logService.trace('MainThreadTreeViews#$reveal', treeViewId, itemInfo?.item, itemInfo?.parentChain, options); return this.viewsService.openView(treeViewId, options.focus) @@ -168,19 +169,21 @@ type TreeItemHandle = string; class TreeViewDragAndDropController implements ITreeViewDragAndDropController { constructor(private readonly treeViewId: string, - readonly supportedMimeTypes: string[], + readonly dropMimeTypes: string[], + readonly dragMimeTypes: string[], readonly hasWillDrop: boolean, private readonly _proxy: ExtHostTreeViewsShape) { } - async handleDrop(dataTransfer: ITreeDataTransfer, targetTreeItem: ITreeItem, operationUuid?: string, sourceTreeId?: string, sourceTreeItemHandles?: string[]): Promise { - return this._proxy.$handleDrop(this.treeViewId, await TreeDataTransferConverter.toTreeDataTransferDTO(dataTransfer), targetTreeItem.handle, operationUuid, sourceTreeId, sourceTreeItemHandles); + async handleDrop(dataTransfer: ITreeDataTransfer, targetTreeItem: ITreeItem, token: CancellationToken, + operationUuid?: string, sourceTreeId?: string, sourceTreeItemHandles?: string[]): Promise { + return this._proxy.$handleDrop(this.treeViewId, await TreeDataTransferConverter.toTreeDataTransferDTO(dataTransfer), targetTreeItem.handle, token, operationUuid, sourceTreeId, sourceTreeItemHandles); } - async handleDrag(sourceTreeItemHandles: string[], operationUuid: string): Promise { + async handleDrag(sourceTreeItemHandles: string[], operationUuid: string, token: CancellationToken): Promise { if (!this.hasWillDrop) { return; } - const additionalTransferItems = await this._proxy.$handleDrag(this.treeViewId, sourceTreeItemHandles, operationUuid); + const additionalTransferItems = await this._proxy.$handleDrag(this.treeViewId, sourceTreeItemHandles, operationUuid, token); if (!additionalTransferItems) { return; } diff --git a/src/vs/workbench/api/browser/mainThreadTunnelService.ts b/src/vs/workbench/api/browser/mainThreadTunnelService.ts index e0127baa03e..c43a9e82756 100644 --- a/src/vs/workbench/api/browser/mainThreadTunnelService.ts +++ b/src/vs/workbench/api/browser/mainThreadTunnelService.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { MainThreadTunnelServiceShape, IExtHostContext, MainContext, ExtHostContext, ExtHostTunnelServiceShape, CandidatePortSource, PortAttributesProviderSelector } from 'vs/workbench/api/common/extHost.protocol'; -import { TunnelDto } from 'vs/workbench/api/common/extHostTunnelService'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainThreadTunnelServiceShape, MainContext, ExtHostContext, ExtHostTunnelServiceShape, CandidatePortSource, PortAttributesProviderSelector, TunnelDto } from 'vs/workbench/api/common/extHost.protocol'; +import { TunnelDtoConverter } from 'vs/workbench/api/common/extHostTunnelService'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { CandidatePort, IRemoteExplorerService, makeAddress, PORT_AUTO_FORWARD_SETTING, PORT_AUTO_SOURCE_SETTING, PORT_AUTO_SOURCE_SETTING_OUTPUT, PORT_AUTO_SOURCE_SETTING_PROCESS, TunnelSource } from 'vs/workbench/services/remote/common/remoteExplorerService'; -import { ITunnelProvider, ITunnelService, TunnelCreationOptions, TunnelProviderFeatures, TunnelOptions, RemoteTunnel, isPortPrivileged, ProvidedPortAttributes, PortAttributesProvider, TunnelProtocol } from 'vs/platform/remote/common/tunnel'; +import { ITunnelProvider, ITunnelService, TunnelCreationOptions, TunnelProviderFeatures, TunnelOptions, RemoteTunnel, isPortPrivileged, ProvidedPortAttributes, PortAttributesProvider, TunnelProtocol } from 'vs/platform/tunnel/common/tunnel'; import { Disposable } from 'vs/base/common/lifecycle'; import type { TunnelDescription } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; @@ -117,7 +117,7 @@ export class MainThreadTunnelService extends Disposable implements MainThreadTun this.elevationPrompt(tunnelOptions, tunnel, source); } - return TunnelDto.fromServiceTunnel(tunnel); + return TunnelDtoConverter.fromServiceTunnel(tunnel); } return undefined; } @@ -145,7 +145,7 @@ export class MainThreadTunnelService extends Disposable implements MainThreadTun }]); } - async $closeTunnel(remote: { host: string, port: number }): Promise { + async $closeTunnel(remote: { host: string; port: number }): Promise { return this.remoteExplorerService.close(remote); } diff --git a/src/vs/workbench/api/browser/mainThreadUriOpeners.ts b/src/vs/workbench/api/browser/mainThreadUriOpeners.ts index 8794752d991..d44d17d5e32 100644 --- a/src/vs/workbench/api/browser/mainThreadUriOpeners.ts +++ b/src/vs/workbench/api/browser/mainThreadUriOpeners.ts @@ -13,12 +13,12 @@ import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IStorageService } from 'vs/platform/storage/common/storage'; -import { ExtHostContext, ExtHostUriOpenersShape, IExtHostContext, MainContext, MainThreadUriOpenersShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, ExtHostUriOpenersShape, MainContext, MainThreadUriOpenersShape } from 'vs/workbench/api/common/extHost.protocol'; import { defaultExternalUriOpenerId } from 'vs/workbench/contrib/externalUriOpener/common/configuration'; import { ContributedExternalUriOpenersStore } from 'vs/workbench/contrib/externalUriOpener/common/contributedOpeners'; import { IExternalOpenerProvider, IExternalUriOpener, IExternalUriOpenerService } from 'vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { extHostNamedCustomer } from '../common/extHostCustomers'; +import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers'; interface RegisteredOpenerMetadata { readonly schemes: ReadonlySet; diff --git a/src/vs/workbench/api/browser/mainThreadUrls.ts b/src/vs/workbench/api/browser/mainThreadUrls.ts index ecbbecba852..0485454906d 100644 --- a/src/vs/workbench/api/browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/browser/mainThreadUrls.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ExtHostContext, IExtHostContext, MainContext, MainThreadUrlsShape, ExtHostUrlsShape } from 'vs/workbench/api/common/extHost.protocol'; -import { extHostNamedCustomer } from '../common/extHostCustomers'; +import { ExtHostContext, MainContext, MainThreadUrlsShape, ExtHostUrlsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers'; import { IURLService, IURLHandler, IOpenURLOptions } from 'vs/platform/url/common/url'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -32,7 +32,7 @@ class ExtensionUrlHandler implements IURLHandler { export class MainThreadUrls implements MainThreadUrlsShape { private readonly proxy: ExtHostUrlsShape; - private handlers = new Map(); + private handlers = new Map(); constructor( context: IExtHostContext, diff --git a/src/vs/workbench/api/browser/mainThreadWebviewManager.ts b/src/vs/workbench/api/browser/mainThreadWebviewManager.ts index 225f15b104c..eed33b05ed9 100644 --- a/src/vs/workbench/api/browser/mainThreadWebviewManager.ts +++ b/src/vs/workbench/api/browser/mainThreadWebviewManager.ts @@ -10,12 +10,12 @@ import { MainThreadWebviewPanels } from 'vs/workbench/api/browser/mainThreadWebv import { MainThreadWebviews } from 'vs/workbench/api/browser/mainThreadWebviews'; import { MainThreadWebviewsViews } from 'vs/workbench/api/browser/mainThreadWebviewViews'; import * as extHostProtocol from 'vs/workbench/api/common/extHost.protocol'; -import { extHostCustomer } from '../common/extHostCustomers'; +import { extHostCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers'; @extHostCustomer export class MainThreadWebviewManager extends Disposable { constructor( - context: extHostProtocol.IExtHostContext, + context: IExtHostContext, @IInstantiationService instantiationService: IInstantiationService, ) { super(); diff --git a/src/vs/workbench/api/browser/mainThreadWebviewPanels.ts b/src/vs/workbench/api/browser/mainThreadWebviewPanels.ts index 5e00e96f690..a7359ef7b2f 100644 --- a/src/vs/workbench/api/browser/mainThreadWebviewPanels.ts +++ b/src/vs/workbench/api/browser/mainThreadWebviewPanels.ts @@ -15,10 +15,11 @@ import { WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; import { WebviewInput } from 'vs/workbench/contrib/webviewPanel/browser/webviewEditorInput'; import { WebviewIcons } from 'vs/workbench/contrib/webviewPanel/browser/webviewIconManager'; import { ICreateWebViewShowOptions, IWebviewWorkbenchService } from 'vs/workbench/contrib/webviewPanel/browser/webviewWorkbenchService'; -import { columnToEditorGroup, editorGroupToColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; -import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { ACTIVE_GROUP, IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { editorGroupToColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; +import { GroupDirection, GroupLocation, GroupsOrder, IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { ACTIVE_GROUP, IEditorService, PreferredGroup, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; /** * Bi-directional map between webview handles and inputs. @@ -86,7 +87,7 @@ export class MainThreadWebviewPanels extends Disposable implements extHostProtoc private readonly _revivers = new Map(); constructor( - context: extHostProtocol.IExtHostContext, + context: IExtHostContext, private readonly _mainThreadWebviews: MainThreadWebviews, @IExtensionService extensionService: IExtensionService, @IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService, @@ -154,9 +155,10 @@ export class MainThreadWebviewPanels extends Disposable implements extHostProtoc initData: extHostProtocol.IWebviewInitData, showOptions: extHostProtocol.WebviewPanelShowOptions, ): void { + const targetGroup = this.getTargetGroupFromShowOptions(showOptions); const mainThreadShowOptions: ICreateWebViewShowOptions = showOptions ? { preserveFocus: !!showOptions.preserveFocus, - group: columnToEditorGroup(this._editorGroupService, showOptions.viewColumn) + group: targetGroup } : {}; const extension = reviveWebviewExtension(extensionData); @@ -197,7 +199,41 @@ export class MainThreadWebviewPanels extends Disposable implements extHostProtoc return; } - this._webviewWorkbenchService.revealWebview(webview, showOptions.viewColumn ?? ACTIVE_GROUP, !!showOptions.preserveFocus); + const targetGroup = this.getTargetGroupFromShowOptions(showOptions); + this._webviewWorkbenchService.revealWebview(webview, targetGroup, !!showOptions.preserveFocus); + } + + private getTargetGroupFromShowOptions(showOptions: extHostProtocol.WebviewPanelShowOptions): PreferredGroup { + if (typeof showOptions.viewColumn === 'undefined' + || showOptions.viewColumn === ACTIVE_GROUP + || (this._editorGroupService.count === 1 && this._editorGroupService.activeGroup.isEmpty) + ) { + return ACTIVE_GROUP; + } + + if (showOptions.viewColumn === SIDE_GROUP) { + return SIDE_GROUP; + } + + if (showOptions.viewColumn >= 0) { + // First check to see if an existing group exists + const groupInColumn = this._editorGroupService.getGroups(GroupsOrder.GRID_APPEARANCE)[showOptions.viewColumn]; + if (groupInColumn) { + return groupInColumn.id; + } + + // We are dealing with an unknown group and therefore need a new group. + // Note that the new group's id may not match the one requested. We only allow + // creating a single new group, so if someone passes in `showOptions.viewColumn = 99` + // and there are two editor groups open, we simply create a third editor group instead + // of creating all the groups up to 99. + const newGroup = this._editorGroupService.findGroup({ location: GroupLocation.LAST }); + if (newGroup) { + return this._editorGroupService.addGroup(newGroup, GroupDirection.RIGHT); + } + } + + return ACTIVE_GROUP; } public $registerSerializer(viewType: string, options: { serializeBuffersForPostMessage: boolean }): void { diff --git a/src/vs/workbench/api/browser/mainThreadWebviewViews.ts b/src/vs/workbench/api/browser/mainThreadWebviewViews.ts index eb767e2744e..bc4cdd6781b 100644 --- a/src/vs/workbench/api/browser/mainThreadWebviewViews.ts +++ b/src/vs/workbench/api/browser/mainThreadWebviewViews.ts @@ -9,6 +9,7 @@ import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle'; import { MainThreadWebviews, reviveWebviewExtension } from 'vs/workbench/api/browser/mainThreadWebviews'; import * as extHostProtocol from 'vs/workbench/api/common/extHost.protocol'; import { IWebviewViewService, WebviewView } from 'vs/workbench/contrib/webviewView/browser/webviewViewService'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; export class MainThreadWebviewsViews extends Disposable implements extHostProtocol.MainThreadWebviewViewsShape { @@ -19,7 +20,7 @@ export class MainThreadWebviewsViews extends Disposable implements extHostProtoc private readonly _webviewViewProviders = new Map(); constructor( - context: extHostProtocol.IExtHostContext, + context: IExtHostContext, private readonly mainThreadWebviews: MainThreadWebviews, @IWebviewViewService private readonly _webviewViewService: IWebviewViewService, ) { @@ -55,7 +56,7 @@ export class MainThreadWebviewsViews extends Disposable implements extHostProtoc public $registerWebviewViewProvider( extensionData: extHostProtocol.WebviewExtensionDescription, viewType: string, - options: { retainContextWhenHidden?: boolean, serializeBuffersForPostMessage: boolean } + options: { retainContextWhenHidden?: boolean; serializeBuffersForPostMessage: boolean } ): void { if (this._webviewViewProviders.has(viewType)) { throw new Error(`View provider for ${viewType} already registered`); diff --git a/src/vs/workbench/api/browser/mainThreadWebviews.ts b/src/vs/workbench/api/browser/mainThreadWebviews.ts index 949e9b891cb..15e71145210 100644 --- a/src/vs/workbench/api/browser/mainThreadWebviews.ts +++ b/src/vs/workbench/api/browser/mainThreadWebviews.ts @@ -16,6 +16,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import * as extHostProtocol from 'vs/workbench/api/common/extHost.protocol'; import { deserializeWebviewMessage, serializeWebviewMessage } from 'vs/workbench/api/common/extHostWebviewMessaging'; import { IOverlayWebview, IWebview, WebviewContentOptions, WebviewExtensionDescription } from 'vs/workbench/contrib/webview/browser/webview'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; export class MainThreadWebviews extends Disposable implements extHostProtocol.MainThreadWebviewsShape { @@ -33,7 +34,7 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma private readonly _webviews = new Map(); constructor( - context: extHostProtocol.IExtHostContext, + context: IExtHostContext, @IOpenerService private readonly _openerService: IOpenerService, @IProductService private readonly _productService: IProductService, ) { diff --git a/src/vs/workbench/api/browser/mainThreadWindow.ts b/src/vs/workbench/api/browser/mainThreadWindow.ts index 5dc01ce8c76..a0ad6dbd0e1 100644 --- a/src/vs/workbench/api/browser/mainThreadWindow.ts +++ b/src/vs/workbench/api/browser/mainThreadWindow.ts @@ -7,8 +7,8 @@ import { Event } from 'vs/base/common/event'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { ExtHostContext, ExtHostWindowShape, IExtHostContext, IOpenUriOptions, MainContext, MainThreadWindowShape } from '../common/extHost.protocol'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { ExtHostContext, ExtHostWindowShape, IOpenUriOptions, MainContext, MainThreadWindowShape } from '../common/extHost.protocol'; import { IHostService } from 'vs/workbench/services/host/browser/host'; @extHostNamedCustomer(MainContext.MainThreadWindow) diff --git a/src/vs/workbench/api/browser/mainThreadWorkspace.ts b/src/vs/workbench/api/browser/mainThreadWorkspace.ts index 3f2d3273199..3f0ea4ae56e 100644 --- a/src/vs/workbench/api/browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/browser/mainThreadWorkspace.ts @@ -17,21 +17,20 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IRequestService } from 'vs/platform/request/common/request'; import { WorkspaceTrustRequestOptions, IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust'; -import { IWorkspace, IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { isUntitledWorkspace } from 'vs/platform/workspaces/common/workspaces'; -import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; -import { checkGlobFileExists } from 'vs/workbench/api/common/shared/workspaceContains'; -import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { IWorkspace, IWorkspaceContextService, WorkbenchState, isUntitledWorkspace } from 'vs/platform/workspace/common/workspace'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; +import { checkGlobFileExists } from 'vs/workbench/services/extensions/common/workspaceContains'; +import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IFileMatch, IPatternInfo, ISearchProgressItem, ISearchService } from 'vs/workbench/services/search/common/search'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; -import { ExtHostContext, ExtHostWorkspaceShape, IExtHostContext, ITextSearchComplete, IWorkspaceData, MainContext, MainThreadWorkspaceShape } from '../common/extHost.protocol'; +import { ExtHostContext, ExtHostWorkspaceShape, ITextSearchComplete, IWorkspaceData, MainContext, MainThreadWorkspaceShape } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadWorkspace) export class MainThreadWorkspace implements MainThreadWorkspaceShape { private readonly _toDispose = new DisposableStore(); - private readonly _activeCancelTokens: { [id: number]: CancellationTokenSource; } = Object.create(null); + private readonly _activeCancelTokens: { [id: number]: CancellationTokenSource } = Object.create(null); private readonly _proxy: ExtHostWorkspaceShape; private readonly _queryBuilder = this._instantiationService.createInstance(QueryBuilder); @@ -75,7 +74,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { // --- workspace --- - $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, foldersToAdd: { uri: UriComponents, name?: string; }[]): Promise { + $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, foldersToAdd: { uri: UriComponents; name?: string }[]): Promise { const workspaceFoldersToAdd = foldersToAdd.map(f => ({ uri: URI.revive(f.uri), name: f.name })); // Indicate in status message diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index ff95e5d8b02..e8ab7ef610b 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -401,7 +401,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { private addViews(extensions: readonly IExtensionPointUser[]): void { const viewIds: Set = new Set(); - const allViewDescriptors: { views: IViewDescriptor[], viewContainer: ViewContainer }[] = []; + const allViewDescriptors: { views: IViewDescriptor[]; viewContainer: ViewContainer }[] = []; for (const extension of extensions) { const { value, collector } = extension; diff --git a/src/vs/workbench/api/common/configurationExtensionPoint.ts b/src/vs/workbench/api/common/configurationExtensionPoint.ts index b8a329ea4af..80ef9c70b53 100644 --- a/src/vs/workbench/api/common/configurationExtensionPoint.ts +++ b/src/vs/workbench/api/common/configurationExtensionPoint.ts @@ -48,7 +48,7 @@ const configurationEntrySchema: IJSONSchema = { properties: { isExecutable: { type: 'boolean', - deprecationMessage: 'This property is deprecated. Instead use `scope` property and set it to `machine` value.' + markdownDeprecationMessage: 'This property is deprecated. Instead use `scope` property and set it to `machine` value.' }, scope: { type: 'string', @@ -62,7 +62,7 @@ const configurationEntrySchema: IJSONSchema = { nls.localize('scope.language-overridable.description', "Resource configuration that can be configured in language specific settings."), nls.localize('scope.machine-overridable.description', "Machine configuration that can be configured also in workspace or folder settings.") ], - description: nls.localize('scope.description', "Scope in which the configuration is applicable. Available scopes are `application`, `machine`, `window`, `resource`, and `machine-overridable`.") + markdownDescription: nls.localize('scope.description', "Scope in which the configuration is applicable. Available scopes are `application`, `machine`, `window`, `resource`, and `machine-overridable`.") }, enumDescriptions: { type: 'array', diff --git a/src/vs/workbench/api/common/exHostSecretState.ts b/src/vs/workbench/api/common/exHostSecretState.ts index b06f1245094..1e906df3f01 100644 --- a/src/vs/workbench/api/common/exHostSecretState.ts +++ b/src/vs/workbench/api/common/exHostSecretState.ts @@ -10,14 +10,14 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export class ExtHostSecretState implements ExtHostSecretStateShape { private _proxy: MainThreadSecretStateShape; - private _onDidChangePassword = new Emitter<{ extensionId: string, key: string }>(); + private _onDidChangePassword = new Emitter<{ extensionId: string; key: string }>(); readonly onDidChangePassword = this._onDidChangePassword.event; constructor(mainContext: IExtHostRpcService) { this._proxy = mainContext.getProxy(MainContext.MainThreadSecretState); } - async $onDidChangePassword(e: { extensionId: string, key: string }): Promise { + async $onDidChangePassword(e: { extensionId: string; key: string }): Promise { this._onDidChangePassword.fire(e); } diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index d7db26a11ac..7124a18d986 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -11,9 +11,10 @@ import { URI } from 'vs/base/common/uri'; import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; import { OverviewRulerLane } from 'vs/editor/common/model'; import * as languageConfiguration from 'vs/editor/common/languages/languageConfiguration'; -import { score } from 'vs/editor/common/languages/languageSelector'; +import { score } from 'vs/editor/common/languageSelector'; import * as files from 'vs/platform/files/common/files'; -import { ExtHostContext, MainContext, UIKind, CandidatePortSource, ExtHostLogLevelServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostContext, MainContext, CandidatePortSource, ExtHostLogLevelServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { UIKind } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { ExtHostApiCommands } from 'vs/workbench/api/common/extHostApiCommands'; import { ExtHostClipboard } from 'vs/workbench/api/common/extHostClipboard'; import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; @@ -92,6 +93,7 @@ import { ExtHostNotebookDocuments } from 'vs/workbench/api/common/extHostNoteboo import { ExtHostInteractive } from 'vs/workbench/api/common/extHostInteractive'; import { combinedDisposable } from 'vs/base/common/lifecycle'; import { checkProposedApiEnabled, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; +import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/contrib/debug/common/debug'; export interface IExtensionApiFactory { (extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode; @@ -303,16 +305,24 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I return extHostTerminalService.getDefaultShell(false); }, get isTelemetryEnabled() { - return extHostTelemetry.getTelemetryEnabled(); + return extHostTelemetry.getTelemetryConfiguration(); }, get onDidChangeTelemetryEnabled(): Event { return extHostTelemetry.onDidChangeTelemetryEnabled; }, + get telemetryConfiguration(): vscode.TelemetryConfiguration { + checkProposedApiEnabled(extension, 'telemetry'); + return extHostTelemetry.getTelemetryDetails(); + }, + get onDidChangeTelemetryConfiguration(): Event { + checkProposedApiEnabled(extension, 'telemetry'); + return extHostTelemetry.onDidChangeTelemetryConfiguration; + }, get isNewAppInstall() { const installAge = Date.now() - new Date(initData.telemetryInfo.firstSessionDate).getTime(); return isNaN(installAge) ? false : installAge < 1000 * 60 * 60 * 24; // install age is less than a day }, - openExternal(uri: URI, options?: { allowContributedOpeners?: boolean | string; }) { + openExternal(uri: URI, options?: { allowContributedOpeners?: boolean | string }) { return extHostWindow.openUri(uri, { allowTunneling: !!initData.remote.authority, allowContributedOpeners: options?.allowContributedOpeners, @@ -355,10 +365,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const tests: typeof vscode.tests = { createTestController(provider, label, refreshHandler?: (token: vscode.CancellationToken) => Thenable | void) { - if (refreshHandler) { - checkProposedApiEnabled(extension, 'testRefresh'); - } - return extHostTesting.createTestController(provider, label, refreshHandler); }, createTestObserver() { @@ -519,7 +525,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I return extHostLanguageFeatures.registerInlayHintsProvider(extension, selector, provider); }, createLanguageStatusItem(id: string, selector: vscode.DocumentSelector): vscode.LanguageStatusItem { - checkProposedApiEnabled(extension, 'languageStatus'); return extHostLanguages.createLanguageStatusItem(extension, id, selector); } }; @@ -602,10 +607,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I return >extHostMessageService.showMessage(extension, Severity.Error, message, rest[0], >rest.slice(1)); }, showQuickPick(items: any, options?: vscode.QuickPickOptions, token?: vscode.CancellationToken): any { - // TODO: remove this once quickPickSeparators has been finalized. - if (Array.isArray(items) && items.some((item) => item.kind === extHostTypes.QuickPickItemKind.Separator)) { - checkProposedApiEnabled(extension, 'quickPickSeparators'); - } return extHostQuickOpen.showQuickPick(items, options, token); }, showWorkspaceFolderPick(options?: vscode.WorkspaceFolderPickOptions) { @@ -654,7 +655,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I } return extHostOutputService.createOutputChannel(name, languageId || '', extension); }, - createWebviewPanel(viewType: string, title: string, showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, options?: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel { + createWebviewPanel(viewType: string, title: string, showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn; preserveFocus?: boolean }, options?: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel { return extHostWebviewPanels.createWebviewPanel(extension, viewType, title, showOptions, options); }, createWebviewTextEditorInset(editor: vscode.TextEditor, line: number, height: number, options?: vscode.WebviewOptions): vscode.WebviewEditorInset { @@ -685,7 +686,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I registerWebviewPanelSerializer: (viewType: string, serializer: vscode.WebviewPanelSerializer) => { return extHostWebviewPanels.registerWebviewPanelSerializer(extension, viewType, serializer); }, - registerCustomEditorProvider: (viewType: string, provider: vscode.CustomTextEditorProvider | vscode.CustomReadonlyEditorProvider, options: { webviewOptions?: vscode.WebviewPanelOptions, supportsMultipleEditorsPerDocument?: boolean } = {}) => { + registerCustomEditorProvider: (viewType: string, provider: vscode.CustomTextEditorProvider | vscode.CustomReadonlyEditorProvider, options: { webviewOptions?: vscode.WebviewPanelOptions; supportsMultipleEditorsPerDocument?: boolean } = {}) => { return extHostCustomEditors.registerCustomEditorProvider(extension, viewType, provider, options); }, registerFileDecorationProvider(provider: vscode.FileDecorationProvider) { @@ -708,8 +709,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I }, registerWebviewViewProvider(viewId: string, provider: vscode.WebviewViewProvider, options?: { webviewOptions?: { - retainContextWhenHidden?: boolean - } + retainContextWhenHidden?: boolean; + }; }) { return extHostWebviewViews.registerWebviewViewProvider(extension, viewId, provider, options?.webviewOptions); }, @@ -841,10 +842,10 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I set textDocuments(value) { throw errors.readonly(); }, - openTextDocument(uriOrFileNameOrOptions?: vscode.Uri | string | { language?: string; content?: string; }) { + openTextDocument(uriOrFileNameOrOptions?: vscode.Uri | string | { language?: string; content?: string }) { let uriPromise: Thenable; - const options = uriOrFileNameOrOptions as { language?: string; content?: string; }; + const options = uriOrFileNameOrOptions as { language?: string; content?: string }; if (typeof uriOrFileNameOrOptions === 'string') { uriPromise = Promise.resolve(URI.file(uriOrFileNameOrOptions)); } else if (URI.isUri(uriOrFileNameOrOptions)) { @@ -980,7 +981,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I checkProposedApiEnabled(extension, 'resolvers'); return extHostTunnelService.onDidChangeTunnels(listener, thisArg, disposables); }, - registerPortAttributesProvider: (portSelector: { pid?: number, portRange?: [number, number], commandMatcher?: RegExp }, provider: vscode.PortAttributesProvider) => { + registerPortAttributesProvider: (portSelector: { pid?: number; portRange?: [number, number]; commandMatcher?: RegExp }, provider: vscode.PortAttributesProvider) => { checkProposedApiEnabled(extension, 'portsAttributes'); return extHostTunnelService.registerPortsAttributesProvider(portSelector, provider); }, @@ -1047,7 +1048,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I return extHostDebugService.onDidChangeBreakpoints(listener, thisArgs, disposables); }, registerDebugConfigurationProvider(debugType: string, provider: vscode.DebugConfigurationProvider, triggerKind?: vscode.DebugConfigurationProviderTriggerKind) { - return extHostDebugService.registerDebugConfigurationProvider(debugType, provider, triggerKind || extHostTypes.DebugConfigurationProviderTriggerKind.Initial); + return extHostDebugService.registerDebugConfigurationProvider(debugType, provider, triggerKind || DebugConfigurationProviderTriggerKind.Initial); }, registerDebugAdapterDescriptorFactory(debugType: string, factory: vscode.DebugAdapterDescriptorFactory) { return extHostDebugService.registerDebugAdapterDescriptorFactory(extension, debugType, factory); @@ -1192,7 +1193,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I DebugAdapterInlineImplementation: extHostTypes.DebugAdapterInlineImplementation, DebugAdapterNamedPipeServer: extHostTypes.DebugAdapterNamedPipeServer, DebugAdapterServer: extHostTypes.DebugAdapterServer, - DebugConfigurationProviderTriggerKind: extHostTypes.DebugConfigurationProviderTriggerKind, + DebugConfigurationProviderTriggerKind: DebugConfigurationProviderTriggerKind, DebugConsoleMode: extHostTypes.DebugConsoleMode, DecorationRangeBehavior: extHostTypes.DecorationRangeBehavior, Diagnostic: extHostTypes.Diagnostic, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index f102c93c4b7..7b3d8080281 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -10,24 +10,25 @@ import { SerializedError } from 'vs/base/common/errors'; import { IRelativePattern } from 'vs/base/common/glob'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { MarshalledId, revive } from 'vs/base/common/marshalling'; +import { revive } from 'vs/base/common/marshalling'; import * as performance from 'vs/base/common/performance'; import Severity from 'vs/base/common/severity'; -import { Dto } from 'vs/base/common/types'; import { URI, UriComponents } from 'vs/base/common/uri'; import { RenderLineNumbersType, TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; +import { ILineChange } from 'vs/editor/common/diff/diffComputer'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { EndOfLineSequence, ISingleEditOperation } from 'vs/editor/common/model'; -import { IModelChangedEvent } from 'vs/editor/common/model/mirrorTextModel'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { CharacterPair, CommentRule, EnterAction } from 'vs/editor/common/languages/languageConfiguration'; +import { EndOfLineSequence } from 'vs/editor/common/model'; +import { IModelChangedEvent } from 'vs/editor/common/model/mirrorTextModel'; import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility'; -import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ConfigurationTarget, IConfigurationChange, IConfigurationData, IConfigurationOverrides } from 'vs/platform/configuration/common/configuration'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; +import { IExtensionIdWithVersion } from 'vs/platform/extensionManagement/common/extensionStorage'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import * as files from 'vs/platform/files/common/files'; import { ResourceLabelFormatter } from 'vs/platform/label/common/label'; @@ -35,112 +36,52 @@ import { ILoggerOptions, LogLevel } from 'vs/platform/log/common/log'; import { IMarkerData } from 'vs/platform/markers/common/markers'; import { IProgressOptions, IProgressStep } from 'vs/platform/progress/common/progress'; import * as quickInput from 'vs/platform/quickinput/common/quickInput'; -import { IRemoteConnectionData, RemoteAuthorityResolverErrorCode, ResolverResult, TunnelDescription } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { ProvidedPortAttributes, TunnelCreationOptions, TunnelOptions, TunnelProviderFeatures } from 'vs/platform/remote/common/tunnel'; +import { IRemoteConnectionData, TunnelDescription } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { ClassifiedEvent, GDPRClassification, StrictPropertyCheck } from 'vs/platform/telemetry/common/gdprTypings'; -import { ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; +import { TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; import { ICreateContributedTerminalProfileOptions, IProcessProperty, IShellLaunchConfigDto, ITerminalEnvironment, ITerminalLaunchError, ITerminalProfile, TerminalLocation } from 'vs/platform/terminal/common/terminal'; import { ThemeColor, ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { IExtensionIdWithVersion } from 'vs/platform/extensionManagement/common/extensionStorage'; +import { ProvidedPortAttributes, TunnelCreationOptions, TunnelOptions, TunnelPrivacyId, TunnelProviderFeatures } from 'vs/platform/tunnel/common/tunnel'; import { WorkspaceTrustRequestOptions } from 'vs/platform/workspace/common/workspaceTrust'; -import { ExtensionActivationReason } from 'vs/workbench/api/common/extHostExtensionActivator'; -import { ExtHostInteractive } from 'vs/workbench/api/common/extHostInteractive'; -import { TunnelDto } from 'vs/workbench/api/common/extHostTunnelService'; -import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/api/common/extHostTypes'; import * as tasks from 'vs/workbench/api/common/shared/tasks'; import { TreeDataTransferDTO } from 'vs/workbench/api/common/shared/treeDataTransfer'; import { SaveReason } from 'vs/workbench/common/editor'; import { IRevealOptions, ITreeItem } from 'vs/workbench/common/views'; import { CallHierarchyItem } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; -import { IAdapterDescriptor, IConfig, IDebugSessionReplMode } from 'vs/workbench/contrib/debug/common/debug'; +import { DebugConfigurationProviderTriggerKind, IAdapterDescriptor, IConfig, IDebugSessionReplMode } from 'vs/workbench/contrib/debug/common/debug'; import * as notebookCommon from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CellExecutionUpdateType } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; import { ICellExecutionComplete, ICellExecutionStateUpdate } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { OutputChannelUpdateMode } from 'vs/workbench/contrib/output/common/output'; import { InputValidationType } from 'vs/workbench/contrib/scm/common/scm'; -import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { IWorkspaceSymbol } from 'vs/workbench/contrib/search/common/search'; import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; -import { CoverageDetails, ExtensionRunTestsRequest, IFileCoverage, ISerializedTestResults, ITestItem, ITestRunProfile, ITestRunTask, ResolvedTestRunRequest, RunTestForControllerRequest, SerializedTestMessage, TestResultState, TestsDiff } from 'vs/workbench/contrib/testing/common/testCollection'; +import { CoverageDetails, ExtensionRunTestsRequest, IFileCoverage, ISerializedTestResults, ITestItem, ITestMessage, ITestRunProfile, ITestRunTask, ResolvedTestRunRequest, RunTestForControllerRequest, TestResultState, TestsDiffOp } from 'vs/workbench/contrib/testing/common/testCollection'; import { InternalTimelineOptions, Timeline, TimelineChangeEvent, TimelineOptions, TimelineProviderDescriptor } from 'vs/workbench/contrib/timeline/common/timeline'; import { TypeHierarchyItem } from 'vs/workbench/contrib/typeHierarchy/common/typeHierarchy'; +import { AuthenticationProviderInformation, AuthenticationSession, AuthenticationSessionsChangeEvent } from 'vs/workbench/services/authentication/common/authentication'; import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; -import { ActivationKind, ExtensionHostKind, MissingExtensionDependency } from 'vs/workbench/services/extensions/common/extensions'; -import { createExtHostContextProxyIdentifier as createExtId, createMainContextProxyIdentifier as createMainId, IRPCProtocol, SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; +import { IStaticWorkspaceData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; +import { IResolveAuthorityResult } from 'vs/workbench/services/extensions/common/extensionHostProxy'; +import { ActivationKind, ExtensionActivationReason, MissingExtensionDependency } from 'vs/workbench/services/extensions/common/extensions'; +import { createProxyIdentifier, Dto, IRPCProtocol, SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { ILanguageStatus } from 'vs/workbench/services/languageStatus/common/languageStatusService'; import { CandidatePort } from 'vs/workbench/services/remote/common/remoteExplorerService'; +import { ITextQueryBuilderOptions } from 'vs/workbench/services/search/common/queryBuilder'; import * as search from 'vs/workbench/services/search/common/search'; -export interface IEnvironment { - isExtensionDevelopmentDebug: boolean; - appName: string; - appHost: string; - appRoot?: URI; - appLanguage: string; - appUriScheme: string; - extensionDevelopmentLocationURI?: URI[]; - extensionTestsLocationURI?: URI; - globalStorageHome: URI; - workspaceStorageHome: URI; - useHostProxy?: boolean; - skipWorkspaceStorageLock?: boolean; -} - -export interface IStaticWorkspaceData { - id: string; - name: string; - transient?: boolean; - configuration?: UriComponents | null; - isUntitled?: boolean | null; -} - export interface IWorkspaceData extends IStaticWorkspaceData { - folders: { uri: UriComponents, name: string, index: number; }[]; -} - -export interface MessagePortLike { - postMessage(message: any, transfer?: any[]): void; - addEventListener(type: 'message', listener: (e: any) => any): void; - removeEventListener(type: 'message', listener: (e: any) => any): void; - start(): void; -} - -export interface IInitData { - version: string; - commit?: string; - parentPid: number; - environment: IEnvironment; - workspace?: IStaticWorkspaceData | null; - resolvedExtensions: ExtensionIdentifier[]; - hostExtensions: ExtensionIdentifier[]; - extensions: IExtensionDescription[]; - telemetryInfo: ITelemetryInfo; - logLevel: LogLevel; - logsLocation: URI; - logFile: URI; - autoStart: boolean; - remote: { isRemote: boolean; authority: string | undefined; connectionData: IRemoteConnectionData | null; }; - uiKind: UIKind; - messagePorts?: ReadonlyMap; + folders: { uri: UriComponents; name: string; index: number }[]; } export interface IConfigurationInitData extends IConfigurationData { configurationScopes: [string, ConfigurationScope | undefined][]; } -export interface IExtHostContext extends IRPCProtocol { - readonly remoteAuthority: string | null; - readonly extensionHostKind: ExtensionHostKind; -} - export interface IMainContext extends IRPCProtocol { } -export enum UIKind { - Desktop = 1, - Web = 2 -} - // --- main thread export interface MainThreadClipboardShape extends IDisposable { @@ -156,31 +97,29 @@ export interface MainThreadCommandsShape extends IDisposable { } export interface CommentProviderFeatures { - reactionGroup?: modes.CommentReaction[]; + reactionGroup?: languages.CommentReaction[]; reactionHandler?: boolean; - options?: modes.CommentOptions; + options?: languages.CommentOptions; } export interface CommentChanges { readonly uniqueIdInThread: number; - readonly body: IMarkdownString; + readonly body: string | IMarkdownString; readonly userName: string; readonly userIconPath?: string; readonly contextValue?: string; - readonly commentReactions?: modes.CommentReaction[]; + readonly commentReactions?: languages.CommentReaction[]; readonly label?: string; - readonly mode?: modes.CommentMode; - readonly detail?: { - $mid: MarshalledId.Date - } | string; + readonly mode?: languages.CommentMode; + readonly timestamp?: string; } export type CommentThreadChanges = Partial<{ - range: IRange, - label: string, - contextValue: string | null, - comments: CommentChanges[], - collapseState: modes.CommentThreadCollapsibleState; + range: IRange; + label: string; + contextValue: string | null; + comments: CommentChanges[]; + collapseState: languages.CommentThreadCollapsibleState; canReply: boolean; }>; @@ -188,19 +127,19 @@ export interface MainThreadCommentsShape extends IDisposable { $registerCommentController(handle: number, id: string, label: string): void; $unregisterCommentController(handle: number): void; $updateCommentControllerFeatures(handle: number, features: CommentProviderFeatures): void; - $createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange, extensionId: ExtensionIdentifier): modes.CommentThread | undefined; + $createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange, extensionId: ExtensionIdentifier): languages.CommentThread | undefined; $updateCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, changes: CommentThreadChanges): void; $deleteCommentThread(handle: number, commentThreadHandle: number): void; $updateCommentingRanges(handle: number): void; - $onDidCommentThreadsChange(handle: number, event: modes.CommentThreadChangedEvent): void; + $onDidCommentThreadsChange(handle: number, event: languages.CommentThreadChangedEvent): void; } export interface MainThreadAuthenticationShape extends IDisposable { $registerAuthenticationProvider(id: string, label: string, supportsMultipleAccounts: boolean): void; $unregisterAuthenticationProvider(id: string): void; $ensureProvider(id: string): Promise; - $sendDidChangeSessions(providerId: string, event: modes.AuthenticationSessionsChangeEvent): void; - $getSession(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string, options: { createIfNone?: boolean, forceNewSession?: boolean | { detail: string; }, clearSessionPreference?: boolean; }): Promise; + $sendDidChangeSessions(providerId: string, event: AuthenticationSessionsChangeEvent): void; + $getSession(providerId: string, scopes: readonly string[], extensionId: string, extensionName: string, options: { createIfNone?: boolean; forceNewSession?: boolean | { detail: string }; clearSessionPreference?: boolean }): Promise; $removeSession(providerId: string, sessionId: string): Promise; } @@ -226,14 +165,14 @@ export interface MainThreadDialogOpenOptions { canSelectFiles?: boolean; canSelectFolders?: boolean; canSelectMany?: boolean; - filters?: { [name: string]: string[]; }; + filters?: { [name: string]: string[] }; title?: string; } export interface MainThreadDialogSaveOptions { defaultUri?: UriComponents; saveLabel?: string; - filters?: { [name: string]: string[]; }; + filters?: { [name: string]: string[] }; title?: string; } @@ -255,7 +194,7 @@ export interface MainThreadDocumentContentProvidersShape extends IDisposable { } export interface MainThreadDocumentsShape extends IDisposable { - $tryCreateDocument(options?: { language?: string; content?: string; }): Promise; + $tryCreateDocument(options?: { language?: string; content?: string }): Promise; $tryOpenDocument(uri: UriComponents): Promise; $trySaveDocument(uri: UriComponents): Promise; } @@ -314,13 +253,13 @@ export interface MainThreadTextEditorsShape extends IDisposable { $trySetSelections(id: string, selections: ISelection[]): Promise; $tryApplyEdits(id: string, modelVersionId: number, edits: ISingleEditOperation[], opts: IApplyEditsOptions): Promise; $tryInsertSnippet(id: string, template: string, selections: readonly IRange[], opts: IUndoStopOptions): Promise; - $getDiffInformation(id: string): Promise; + $getDiffInformation(id: string): Promise; } export interface MainThreadTreeViewsShape extends IDisposable { - $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean, canSelectMany: boolean, dragAndDropMimeTypes: string[] | undefined, hasHandleDrag: boolean; }): Promise; - $refresh(treeViewId: string, itemsToRefresh?: { [treeItemHandle: string]: ITreeItem; }): Promise; - $reveal(treeViewId: string, itemInfo: { item: ITreeItem, parentChain: ITreeItem[]; } | undefined, options: IRevealOptions): Promise; + $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean; canSelectMany: boolean; dropMimeTypes: string[] | undefined; dragMimeTypes: string[] | undefined; hasHandleDrag: boolean }): Promise; + $refresh(treeViewId: string, itemsToRefresh?: { [treeItemHandle: string]: ITreeItem }): Promise; + $reveal(treeViewId: string, itemInfo: { item: ITreeItem; parentChain: ITreeItem[] } | undefined, options: IRevealOptions): Promise; $setMessage(treeViewId: string, message: string): void; $setTitle(treeViewId: string, title: string, description: string | undefined): void; } @@ -342,7 +281,7 @@ export interface MainThreadKeytarShape extends IDisposable { $setPassword(service: string, account: string, password: string): Promise; $deletePassword(service: string, account: string): Promise; $findPassword(service: string): Promise; - $findCredentials(service: string): Promise>; + $findCredentials(service: string): Promise>; } export interface IRegExpDto { @@ -404,11 +343,11 @@ export interface ISignatureHelpProviderMetadataDto { readonly retriggerCharacters: readonly string[]; } -export interface IdentifiableInlineCompletions extends modes.InlineCompletions { +export interface IdentifiableInlineCompletions extends languages.InlineCompletions { pid: number; } -export interface IdentifiableInlineCompletion extends modes.InlineCompletion { +export interface IdentifiableInlineCompletion extends languages.InlineCompletion { idx: number; } @@ -434,13 +373,13 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { $registerOnTypeFormattingSupport(handle: number, selector: IDocumentFilterDto[], autoFormatTriggerCharacters: string[], extensionId: ExtensionIdentifier): void; $registerNavigateTypeSupport(handle: number, supportsResolve: boolean): void; $registerRenameSupport(handle: number, selector: IDocumentFilterDto[], supportsResolveInitialValues: boolean): void; - $registerDocumentSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: modes.SemanticTokensLegend, eventHandle: number | undefined): void; + $registerDocumentSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: languages.SemanticTokensLegend, eventHandle: number | undefined): void; $emitDocumentSemanticTokensEvent(eventHandle: number): void; - $registerDocumentRangeSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: modes.SemanticTokensLegend): void; + $registerDocumentRangeSemanticTokensProvider(handle: number, selector: IDocumentFilterDto[], legend: languages.SemanticTokensLegend): void; $registerSuggestSupport(handle: number, selector: IDocumentFilterDto[], triggerCharacters: string[], supportsResolveDetails: boolean, displayName: string): void; $registerInlineCompletionsSupport(handle: number, selector: IDocumentFilterDto[]): void; $registerSignatureHelpProvider(handle: number, selector: IDocumentFilterDto[], metadata: ISignatureHelpProviderMetadataDto): void; - $registerInlayHintsProvider(handle: number, selector: IDocumentFilterDto[], supportsResolve: boolean, eventHandle: number | undefined): void; + $registerInlayHintsProvider(handle: number, selector: IDocumentFilterDto[], supportsResolve: boolean, eventHandle: number | undefined, displayName: string | undefined): void; $emitInlayHintsEvent(eventHandle: number): void; $registerDocumentLinkProvider(handle: number, selector: IDocumentFilterDto[], supportsResolve: boolean): void; $registerDocumentColorProvider(handle: number, selector: IDocumentFilterDto[]): void; @@ -454,20 +393,20 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { export interface MainThreadLanguagesShape extends IDisposable { $changeLanguage(resource: UriComponents, languageId: string): Promise; - $tokensAtPosition(resource: UriComponents, position: IPosition): Promise; + $tokensAtPosition(resource: UriComponents, position: IPosition): Promise; $setLanguageStatus(handle: number, status: ILanguageStatus): void; $removeLanguageStatus(handle: number): void; } export interface MainThreadMessageOptions { - source?: { identifier: ExtensionIdentifier, label: string; }; + source?: { identifier: ExtensionIdentifier; label: string }; modal?: boolean; detail?: string; useCustom?: boolean; } export interface MainThreadMessageServiceShape extends IDisposable { - $showMessage(severity: Severity, message: string, options: MainThreadMessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number; }[]): Promise; + $showMessage(severity: Severity, message: string, options: MainThreadMessageOptions, commands: { title: string; isCloseAffordance: boolean; handle: number }[]): Promise; } export interface MainThreadOutputServiceShape extends IDisposable { @@ -501,7 +440,7 @@ export interface TerminalLaunchConfig { shellArgs?: string[] | string; cwd?: string | UriComponents; env?: ITerminalEnvironment; - icon?: URI | { light: URI; dark: URI; } | ThemeIcon; + icon?: URI | { light: URI; dark: URI } | ThemeIcon; color?: string; initialText?: string; waitOnExit?: boolean; @@ -511,8 +450,8 @@ export interface TerminalLaunchConfig { isFeatureTerminal?: boolean; isExtensionOwnedTerminal?: boolean; useShellEnvironment?: boolean; - location?: TerminalLocation | { viewColumn: number, preserveFocus?: boolean; } | { parentTerminal: ExtHostTerminalIdentifier; } | { splitActiveTerminal: boolean; }; - disablePersistence?: boolean; + location?: TerminalLocation | { viewColumn: number; preserveFocus?: boolean } | { parentTerminal: ExtHostTerminalIdentifier } | { splitActiveTerminal: boolean }; + isTransient?: boolean; } export interface MainThreadTerminalServiceShape extends IDisposable { @@ -538,8 +477,16 @@ export interface MainThreadTerminalServiceShape extends IDisposable { } export type TransferQuickPickItemOrSeparator = TransferQuickPickItem | quickInput.IQuickPickSeparator; -export interface TransferQuickPickItem extends quickInput.IQuickPickItem { +export interface TransferQuickPickItem { handle: number; + + // shared properties from IQuickPickItem + type?: 'item'; + label: string; + description?: string; + detail?: string; + picked?: boolean; + alwaysShow?: boolean; buttons?: TransferQuickInputButton[]; } @@ -673,7 +620,7 @@ export interface IEditorTabDto { resource?: UriComponents; editorId?: string; isActive: boolean; - additionalResourcesAndViewIds: { resource?: UriComponents, viewId?: string; }[]; + additionalResourcesAndViewIds: { resource?: UriComponents; viewId?: string }[]; } export interface IExtHostEditorTabsShape { @@ -694,11 +641,6 @@ export interface WebviewExtensionDescription { readonly location: UriComponents; } -export interface NotebookExtensionDescription { - readonly id: ExtensionIdentifier; - readonly location: UriComponents | undefined; -} - export enum WebviewEditorCapabilities { Editable, SupportsHotExit, @@ -741,7 +683,7 @@ export const enum WebviewMessageArrayBufferViewType { } export interface WebviewMessageArrayBufferReference { - readonly $$vscode_array_buffer_reference$$: true, + readonly $$vscode_array_buffer_reference$$: true; readonly index: number; @@ -786,7 +728,7 @@ export interface MainThreadWebviewPanelsShape extends IDisposable { $setTitle(handle: WebviewHandle, value: string): void; $setIconPath(handle: WebviewHandle, value: IWebviewIconPath | undefined): void; - $registerSerializer(viewType: string, options: { serializeBuffersForPostMessage: boolean; }): void; + $registerSerializer(viewType: string, options: { serializeBuffersForPostMessage: boolean }): void; $unregisterSerializer(viewType: string): void; } @@ -800,7 +742,7 @@ export interface MainThreadCustomEditorsShape extends IDisposable { } export interface MainThreadWebviewViewsShape extends IDisposable { - $registerWebviewViewProvider(extension: WebviewExtensionDescription, viewType: string, options: { retainContextWhenHidden?: boolean, serializeBuffersForPostMessage: boolean; }): void; + $registerWebviewViewProvider(extension: WebviewExtensionDescription, viewType: string, options: { retainContextWhenHidden?: boolean; serializeBuffersForPostMessage: boolean }): void; $unregisterWebviewViewProvider(viewType: string): void; $setWebviewViewTitle(handle: WebviewHandle, value: string | undefined): void; @@ -851,7 +793,7 @@ export interface ExtHostCustomEditorsShape { position: EditorGroupColumn, cancellation: CancellationToken ): Promise; - $createCustomDocument(resource: UriComponents, viewType: string, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, cancellation: CancellationToken): Promise<{ editable: boolean; }>; + $createCustomDocument(resource: UriComponents, viewType: string, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, cancellation: CancellationToken): Promise<{ editable: boolean }>; $disposeCustomDocument(resource: UriComponents, viewType: string): Promise; $undo(resource: UriComponents, viewType: string, editId: number, isDirty: boolean): Promise; @@ -903,11 +845,11 @@ export interface INotebookCellStatusBarListDto { } export interface MainThreadNotebookShape extends IDisposable { - $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): Promise; - $updateNotebookProviderOptions(viewType: string, options?: { transientOutputs: boolean; transientCellMetadata: notebookCommon.TransientCellMetadata; transientDocumentMetadata: notebookCommon.TransientDocumentMetadata; }): Promise; + $registerNotebookProvider(extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): Promise; + $updateNotebookProviderOptions(viewType: string, options?: { transientOutputs: boolean; transientCellMetadata: notebookCommon.TransientCellMetadata; transientDocumentMetadata: notebookCommon.TransientDocumentMetadata }): Promise; $unregisterNotebookProvider(viewType: string): Promise; - $registerNotebookSerializer(handle: number, extension: NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): void; + $registerNotebookSerializer(handle: number, extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): void; $unregisterNotebookSerializer(handle: number): void; $registerNotebookCellStatusBarItemProvider(handle: number, eventHandle: number | undefined, viewType: string): Promise; @@ -926,7 +868,7 @@ export interface MainThreadNotebookEditorsShape extends IDisposable { } export interface MainThreadNotebookDocumentsShape extends IDisposable { - $tryCreateNotebook(options: { viewType: string, content?: NotebookDataDto; }): Promise; + $tryCreateNotebook(options: { viewType: string; content?: NotebookDataDto }): Promise; $tryOpenNotebook(uriComponents: UriComponents): Promise; $trySaveNotebook(uri: UriComponents): Promise; } @@ -943,34 +885,26 @@ export interface INotebookKernelDto2 { supportedLanguages?: string[]; supportsInterrupt?: boolean; supportsExecutionOrder?: boolean; - preloads?: { uri: UriComponents; provides: string[]; }[]; + preloads?: { uri: UriComponents; provides: string[] }[]; } export interface ICellExecuteOutputEditDto { editType: CellExecutionUpdateType.Output; - uri: UriComponents; - cellHandle: number; append?: boolean; outputs: NotebookOutputDto[]; } export interface ICellExecuteOutputItemEditDto { editType: CellExecutionUpdateType.OutputItems; - uri: UriComponents; - cellHandle: number; append?: boolean; outputId: string; items: NotebookOutputItemDto[]; } export interface ICellExecutionStateUpdateDto extends ICellExecutionStateUpdate { - uri: UriComponents; - cellHandle: number; } export interface ICellExecutionCompleteDto extends ICellExecutionComplete { - uri: UriComponents; - cellHandle: number; } export type ICellExecuteUpdateDto = ICellExecuteOutputEditDto | ICellExecuteOutputItemEditDto | ICellExecutionStateUpdateDto; @@ -982,9 +916,9 @@ export interface MainThreadNotebookKernelsShape extends IDisposable { $removeKernel(handle: number): void; $updateNotebookPriority(handle: number, uri: UriComponents, value: number | undefined): void; - $addExecution(uri: UriComponents, cellHandle: number): void; - $updateExecutions(data: SerializableObjectWithBuffers): void; - $completeExecution(uri: UriComponents, cellHandle: number, data: SerializableObjectWithBuffers): void; + $createExecution(handle: number, controllerId: string, uri: UriComponents, cellHandle: number): void; + $updateExecution(handle: number, data: SerializableObjectWithBuffers): void; + $completeExecution(handle: number, data: SerializableObjectWithBuffers): void; } export interface MainThreadNotebookRenderersShape extends IDisposable { @@ -1010,8 +944,8 @@ export interface MainThreadUriOpenersShape extends IDisposable { } export interface ExtHostUriOpenersShape { - $canOpenUri(id: string, uri: UriComponents, token: CancellationToken): Promise; - $openUri(id: string, context: { resolvedUri: UriComponents, sourceUri: UriComponents; }, token: CancellationToken): Promise; + $canOpenUri(id: string, uri: UriComponents, token: CancellationToken): Promise; + $openUri(id: string, context: { resolvedUri: UriComponents; sourceUri: UriComponents }, token: CancellationToken): Promise; } export interface ITextSearchComplete { @@ -1023,7 +957,7 @@ export interface MainThreadWorkspaceShape extends IDisposable { $startTextSearch(query: search.IPatternInfo, folder: UriComponents | null, options: ITextQueryBuilderOptions, requestId: number, token: CancellationToken): Promise; $checkExists(folders: readonly UriComponents[], includes: string[], token: CancellationToken): Promise; $saveAll(includeUntitled?: boolean): Promise; - $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents, name?: string; }[]): Promise; + $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents; name?: string }[]): Promise; $resolveProxy(url: string): Promise; $requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise; } @@ -1093,11 +1027,16 @@ export interface SCMProviderFeatures { hasQuickDiffProvider?: boolean; count?: number; commitTemplate?: string; - acceptInputCommand?: modes.Command; - actionButton?: ICommandDto | null; + acceptInputCommand?: languages.Command; + actionButton?: SCMActionButtonDto | null; statusBarCommands?: ICommandDto[]; } +export interface SCMActionButtonDto { + command: ICommandDto; + description?: string; +} + export interface SCMGroupFeatures { hideWhenEmpty?: boolean; } @@ -1210,7 +1149,7 @@ export interface PortAttributesProviderSelector { export interface MainThreadTunnelServiceShape extends IDisposable { $openTunnel(tunnelOptions: TunnelOptions, source: string | undefined): Promise; - $closeTunnel(remote: { host: string, port: number; }): Promise; + $closeTunnel(remote: { host: string; port: number }): Promise; $getTunnels(): Promise; $setTunnelProvider(features?: TunnelProviderFeatures): Promise; $setRemoteTunnelService(processId: number): Promise; @@ -1229,9 +1168,19 @@ export interface MainThreadTimelineShape extends IDisposable { // -- extension host +export interface ICommandHandlerDescriptionDto { + readonly description: string; + readonly args: ReadonlyArray<{ + readonly name: string; + readonly isOptional?: boolean; + readonly description?: string; + }>; + readonly returns?: string; +} + export interface ExtHostCommandsShape { $executeContributedCommand(id: string, ...args: any[]): Promise; - $getContributedCommandHandlerDescriptions(): Promise<{ [id: string]: string | ICommandHandlerDescription; }>; + $getContributedCommandHandlerDescriptions(): Promise<{ [id: string]: string | ICommandHandlerDescriptionDto }>; } export interface ExtHostConfigurationShape { @@ -1306,8 +1255,8 @@ export interface ExtHostDocumentsAndEditorsShape { export interface ExtHostTreeViewsShape { $getChildren(treeViewId: string, treeItemHandle?: string): Promise; - $handleDrop(destinationViewId: string, treeDataTransfer: TreeDataTransferDTO, newParentTreeItemHandle: string, operationUuid?: string, sourceViewId?: string, sourceTreeItemHandles?: string[]): Promise; - $handleDrag(sourceViewId: string, sourceTreeItemHandles: string[], operationUuid: string): Promise; + $handleDrop(destinationViewId: string, treeDataTransfer: TreeDataTransferDTO, newParentTreeItemHandle: string, token: CancellationToken, operationUuid?: string, sourceViewId?: string, sourceTreeItemHandles?: string[]): Promise; + $handleDrag(sourceViewId: string, sourceTreeItemHandles: string[], operationUuid: string, token: CancellationToken): Promise; $setExpanded(treeViewId: string, treeItemHandle: string, expanded: boolean): void; $setSelection(treeViewId: string, treeItemHandles: string[]): void; $setVisible(treeViewId: string, visible: boolean): void; @@ -1348,15 +1297,15 @@ export interface ExtHostLabelServiceShape { } export interface ExtHostAuthenticationShape { - $getSessions(id: string, scopes?: string[]): Promise>; - $createSession(id: string, scopes: string[]): Promise; + $getSessions(id: string, scopes?: string[]): Promise>; + $createSession(id: string, scopes: string[]): Promise; $removeSession(id: string, sessionId: string): Promise; $onDidChangeAuthenticationSessions(id: string, label: string): Promise; - $setProviders(providers: modes.AuthenticationProviderInformation[]): Promise; + $setProviders(providers: AuthenticationProviderInformation[]): Promise; } export interface ExtHostSecretStateShape { - $onDidChangePassword(e: { extensionId: string, key: string; }): Promise; + $onDidChangePassword(e: { extensionId: string; key: string }): Promise; } export interface ExtHostSearchShape { @@ -1366,22 +1315,6 @@ export interface ExtHostSearchShape { $clearCache(cacheKey: string): Promise; } -export interface IResolveAuthorityErrorResult { - type: 'error'; - error: { - message: string | undefined; - code: RemoteAuthorityResolverErrorCode; - detail: any; - }; -} - -export interface IResolveAuthorityOKResult { - type: 'ok'; - value: ResolverResult; -} - -export type IResolveAuthorityResult = IResolveAuthorityErrorResult | IResolveAuthorityOKResult; - export interface ExtHostExtensionServiceShape { $resolveAuthority(remoteAuthority: string, resolveAttempt: number): Promise; $getCanonicalURI(remoteAuthority: string, uri: UriComponents): Promise; @@ -1390,7 +1323,7 @@ export interface ExtHostExtensionServiceShape { $extensionTestsExit(code: number): Promise; $activateByEvent(activationEvent: string, activationKind: ActivationKind): Promise; $activate(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; - $setRemoteEnvironment(env: { [key: string]: string | null; }): Promise; + $setRemoteEnvironment(env: { [key: string]: string | null }): Promise; $updateRemoteConnectionData(connectionData: IRemoteConnectionData): Promise; $deltaExtensions(toAdd: IExtensionDescription[], toRemove: ExtensionIdentifier[]): Promise; @@ -1426,21 +1359,6 @@ export interface ExtHostLanguagesShape { $acceptLanguageIds(ids: string[]): void; } -export interface ObjectIdentifier { - $ident?: number; -} - -export namespace ObjectIdentifier { - export const name = '$ident'; - export function mixin(obj: T, id: number): T & ObjectIdentifier { - Object.defineProperty(obj, name, { value: id, enumerable: true }); - return obj; - } - export function of(obj: any): number { - return obj[name]; - } -} - export interface ExtHostHeapServiceShape { $onGarbageCollection(ids: number[]): void; } @@ -1476,20 +1394,20 @@ export const enum ISuggestDataDtoField { } export interface ISuggestDataDto { - [ISuggestDataDtoField.label]: string | modes.CompletionItemLabel; - [ISuggestDataDtoField.kind]?: modes.CompletionItemKind; + [ISuggestDataDtoField.label]: string | languages.CompletionItemLabel; + [ISuggestDataDtoField.kind]?: languages.CompletionItemKind; [ISuggestDataDtoField.detail]?: string; [ISuggestDataDtoField.documentation]?: string | IMarkdownString; [ISuggestDataDtoField.sortText]?: string; [ISuggestDataDtoField.filterText]?: string; [ISuggestDataDtoField.preselect]?: true; [ISuggestDataDtoField.insertText]?: string; - [ISuggestDataDtoField.insertTextRules]?: modes.CompletionItemInsertTextRule; - [ISuggestDataDtoField.range]?: IRange | { insert: IRange, replace: IRange; }; + [ISuggestDataDtoField.insertTextRules]?: languages.CompletionItemInsertTextRule; + [ISuggestDataDtoField.range]?: IRange | { insert: IRange; replace: IRange }; [ISuggestDataDtoField.commitCharacters]?: string[]; [ISuggestDataDtoField.additionalTextEdits]?: ISingleEditOperation[]; - [ISuggestDataDtoField.command]?: modes.Command; - [ISuggestDataDtoField.kindModifier]?: modes.CompletionItemTag[]; + [ISuggestDataDtoField.command]?: languages.Command; + [ISuggestDataDtoField.kindModifier]?: languages.CompletionItemTag[]; // not-standard x?: ChainedCacheId; } @@ -1502,7 +1420,7 @@ export const enum ISuggestResultDtoField { } export interface ISuggestResultDto { - [ISuggestResultDtoField.defaultRanges]: { insert: IRange, replace: IRange; }; + [ISuggestResultDtoField.defaultRanges]: { insert: IRange; replace: IRange }; [ISuggestResultDtoField.completions]: ISuggestDataDto[]; [ISuggestResultDtoField.isIncomplete]: undefined | true; [ISuggestResultDtoField.duration]: number; @@ -1511,61 +1429,33 @@ export interface ISuggestResultDto { export interface ISignatureHelpDto { id: CacheId; - signatures: modes.SignatureInformation[]; + signatures: languages.SignatureInformation[]; activeSignature: number; activeParameter: number; } export interface ISignatureHelpContextDto { - readonly triggerKind: modes.SignatureHelpTriggerKind; + readonly triggerKind: languages.SignatureHelpTriggerKind; readonly triggerCharacter: string | undefined; readonly isRetrigger: boolean; readonly activeSignatureHelp: ISignatureHelpDto | undefined; } -export interface IInlayHintDto { - cacheId?: ChainedCacheId; - label: string | modes.InlayHintLabelPart[]; - tooltip?: string | IMarkdownString; - position: IPosition; - kind: modes.InlayHintKind; - whitespaceBefore?: boolean; - whitespaceAfter?: boolean; -} +export type IInlayHintDto = CachedSessionItem>; -export interface IInlayHintsDto { - cacheId?: CacheId; - hints: IInlayHintDto[]; -} +export type IInlayHintsDto = CachedSession<{ hints: IInlayHintDto[] }>; -export interface ILocationDto { - uri: UriComponents; - range: IRange; -} +export type ILocationDto = Dto; +export type ILocationLinkDto = Dto; -export interface IDefinitionLinkDto { - originSelectionRange?: IRange; - uri: UriComponents; - range: IRange; - targetSelectionRange?: IRange; -} - -export interface IWorkspaceSymbolDto extends IdObject { - name: string; - containerName?: string; - kind: modes.SymbolKind; - location: ILocationDto; -} - -export interface IWorkspaceSymbolsDto extends IdObject { - symbols: IWorkspaceSymbolDto[]; -} +export type IWorkspaceSymbolDto = CachedSessionItem>; +export type IWorkspaceSymbolsDto = CachedSession<{ symbols: IWorkspaceSymbolDto[] }>; export interface IWorkspaceEditEntryMetadataDto { needsConfirmation: boolean; label: string; description?: string; - iconPath?: { id: string; } | UriComponents | { light: UriComponents, dark: UriComponents; }; + iconPath?: { id: string } | UriComponents | { light: UriComponents; dark: UriComponents }; } export const enum WorkspaceEditType { @@ -1578,14 +1468,14 @@ export interface IWorkspaceFileEditDto { _type: WorkspaceEditType.File; oldUri?: UriComponents; newUri?: UriComponents; - options?: modes.WorkspaceFileEditOptions; + options?: languages.WorkspaceFileEditOptions; metadata?: IWorkspaceEditEntryMetadataDto; } export interface IWorkspaceTextEditDto { _type: WorkspaceEditType.Text; resource: UriComponents; - edit: modes.TextEdit; + edit: languages.TextEdit; modelVersionId?: number; metadata?: IWorkspaceEditEntryMetadataDto; } @@ -1594,9 +1484,9 @@ export type ICellEditOperationDto = notebookCommon.ICellPartialMetadataEdit | notebookCommon.IDocumentMetadataEdit | { - editType: notebookCommon.CellEditType.Replace, - index: number, - count: number, + editType: notebookCommon.CellEditType.Replace; + index: number; + count: number; cells: NotebookCellDataDto[]; }; @@ -1612,7 +1502,7 @@ export interface IWorkspaceEditDto { edits: Array; } -export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined): modes.WorkspaceEdit { +export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined): languages.WorkspaceEdit { if (data && data.edits) { for (const edit of data.edits) { if (typeof (edit).resource === 'object') { @@ -1626,16 +1516,16 @@ export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined): mod } } } - return data; + return data; } -export type ICommandDto = ObjectIdentifier & modes.Command; +export type ICommandDto = { $ident?: number } & languages.Command; export interface ICodeActionDto { cacheId?: ChainedCacheId; title: string; edit?: IWorkspaceEditDto; - diagnostics?: IMarkerData[]; + diagnostics?: Dto; command?: ICommandDto; kind?: string; isPreferred?: boolean; @@ -1649,34 +1539,20 @@ export interface ICodeActionListDto { export interface ICodeActionProviderMetadataDto { readonly providedKinds?: readonly string[]; - readonly documentation?: ReadonlyArray<{ readonly kind: string, readonly command: ICommandDto; }>; + readonly documentation?: ReadonlyArray<{ readonly kind: string; readonly command: ICommandDto }>; } export type CacheId = number; export type ChainedCacheId = [CacheId, CacheId]; -export interface ILinksListDto { - id?: CacheId; - links: ILinkDto[]; -} +type CachedSessionItem = T & { cacheId?: ChainedCacheId }; +type CachedSession = T & { cacheId?: CacheId }; -export interface ILinkDto { - cacheId?: ChainedCacheId; - range: IRange; - url?: string | UriComponents; - tooltip?: string; -} +export type ILinksListDto = CachedSession<{ links: ILinkDto[] }>; +export type ILinkDto = CachedSessionItem>; -export interface ICodeLensListDto { - cacheId?: number; - lenses: ICodeLensDto[]; -} - -export interface ICodeLensDto { - cacheId?: ChainedCacheId; - range: IRange; - command?: ICommandDto; -} +export type ICodeLensListDto = CachedSession<{ lenses: ICodeLensDto[] }>; +export type ICodeLensDto = CachedSessionItem>; export type ICallHierarchyItemDto = Dto; @@ -1709,41 +1585,41 @@ export interface IInlineValueContextDto { export type ITypeHierarchyItemDto = Dto; export interface ExtHostLanguageFeaturesShape { - $provideDocumentSymbols(handle: number, resource: UriComponents, token: CancellationToken): Promise; + $provideDocumentSymbols(handle: number, resource: UriComponents, token: CancellationToken): Promise; $provideCodeLenses(handle: number, resource: UriComponents, token: CancellationToken): Promise; $resolveCodeLens(handle: number, symbol: ICodeLensDto, token: CancellationToken): Promise; $releaseCodeLenses(handle: number, id: number): void; - $provideDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $provideDeclaration(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $provideImplementation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $provideTypeDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $provideHover(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $provideEvaluatableExpression(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $provideInlineValues(handle: number, resource: UriComponents, range: IRange, context: modes.InlineValueContext, token: CancellationToken): Promise; - $provideDocumentHighlights(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideDeclaration(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideImplementation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideTypeDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideHover(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideEvaluatableExpression(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideInlineValues(handle: number, resource: UriComponents, range: IRange, context: languages.InlineValueContext, token: CancellationToken): Promise; + $provideDocumentHighlights(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; $provideLinkedEditingRanges(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; - $provideReferences(handle: number, resource: UriComponents, position: IPosition, context: modes.ReferenceContext, token: CancellationToken): Promise; - $provideCodeActions(handle: number, resource: UriComponents, rangeOrSelection: IRange | ISelection, context: modes.CodeActionContext, token: CancellationToken): Promise; + $provideReferences(handle: number, resource: UriComponents, position: IPosition, context: languages.ReferenceContext, token: CancellationToken): Promise; + $provideCodeActions(handle: number, resource: UriComponents, rangeOrSelection: IRange | ISelection, context: languages.CodeActionContext, token: CancellationToken): Promise; $resolveCodeAction(handle: number, id: ChainedCacheId, token: CancellationToken): Promise; $releaseCodeActions(handle: number, cacheId: number): void; - $provideDocumentFormattingEdits(handle: number, resource: UriComponents, options: modes.FormattingOptions, token: CancellationToken): Promise; - $provideDocumentRangeFormattingEdits(handle: number, resource: UriComponents, range: IRange, options: modes.FormattingOptions, token: CancellationToken): Promise; - $provideOnTypeFormattingEdits(handle: number, resource: UriComponents, position: IPosition, ch: string, options: modes.FormattingOptions, token: CancellationToken): Promise; + $provideDocumentFormattingEdits(handle: number, resource: UriComponents, options: languages.FormattingOptions, token: CancellationToken): Promise; + $provideDocumentRangeFormattingEdits(handle: number, resource: UriComponents, range: IRange, options: languages.FormattingOptions, token: CancellationToken): Promise; + $provideOnTypeFormattingEdits(handle: number, resource: UriComponents, position: IPosition, ch: string, options: languages.FormattingOptions, token: CancellationToken): Promise; $provideWorkspaceSymbols(handle: number, search: string, token: CancellationToken): Promise; $resolveWorkspaceSymbol(handle: number, symbol: IWorkspaceSymbolDto, token: CancellationToken): Promise; $releaseWorkspaceSymbols(handle: number, id: number): void; - $provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string, token: CancellationToken): Promise; - $resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string, token: CancellationToken): Promise; + $resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; $provideDocumentSemanticTokens(handle: number, resource: UriComponents, previousResultId: number, token: CancellationToken): Promise; $releaseDocumentSemanticTokens(handle: number, semanticColoringResultId: number): void; $provideDocumentRangeSemanticTokens(handle: number, resource: UriComponents, range: IRange, token: CancellationToken): Promise; - $provideCompletionItems(handle: number, resource: UriComponents, position: IPosition, context: modes.CompletionContext, token: CancellationToken): Promise; + $provideCompletionItems(handle: number, resource: UriComponents, position: IPosition, context: languages.CompletionContext, token: CancellationToken): Promise; $resolveCompletionItem(handle: number, id: ChainedCacheId, token: CancellationToken): Promise; $releaseCompletionItems(handle: number, id: number): void; - $provideInlineCompletions(handle: number, resource: UriComponents, position: IPosition, context: modes.InlineCompletionContext, token: CancellationToken): Promise; + $provideInlineCompletions(handle: number, resource: UriComponents, position: IPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise; $handleInlineCompletionDidShow(handle: number, pid: number, idx: number): void; $freeInlineCompletionsList(handle: number, pid: number): void; - $provideSignatureHelp(handle: number, resource: UriComponents, position: IPosition, context: modes.SignatureHelpContext, token: CancellationToken): Promise; + $provideSignatureHelp(handle: number, resource: UriComponents, position: IPosition, context: languages.SignatureHelpContext, token: CancellationToken): Promise; $releaseSignatureHelp(handle: number, id: number): void; $provideInlayHints(handle: number, resource: UriComponents, range: IRange, token: CancellationToken): Promise; $resolveInlayHint(handle: number, id: ChainedCacheId, token: CancellationToken): Promise; @@ -1752,9 +1628,9 @@ export interface ExtHostLanguageFeaturesShape { $resolveDocumentLink(handle: number, id: ChainedCacheId, token: CancellationToken): Promise; $releaseDocumentLinks(handle: number, id: number): void; $provideDocumentColors(handle: number, resource: UriComponents, token: CancellationToken): Promise; - $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: IRawColorInfo, token: CancellationToken): Promise; - $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext, token: CancellationToken): Promise; - $provideSelectionRanges(handle: number, resource: UriComponents, positions: IPosition[], token: CancellationToken): Promise; + $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: IRawColorInfo, token: CancellationToken): Promise; + $provideFoldingRanges(handle: number, resource: UriComponents, context: languages.FoldingContext, token: CancellationToken): Promise; + $provideSelectionRanges(handle: number, resource: UriComponents, positions: IPosition[], token: CancellationToken): Promise; $prepareCallHierarchy(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; $provideCallHierarchyIncomingCalls(handle: number, sessionId: string, itemId: string, token: CancellationToken): Promise; $provideCallHierarchyOutgoingCalls(handle: number, sessionId: string, itemId: string, token: CancellationToken): Promise; @@ -1779,8 +1655,8 @@ export interface ExtHostQuickOpenShape { } export interface ExtHostTelemetryShape { - $initializeTelemetryEnabled(enabled: boolean): void; - $onDidChangeTelemetryEnabled(enabled: boolean): void; + $initializeTelemetryLevel(level: TelemetryLevel): void; + $onDidChangeTelemetryLevel(level: TelemetryLevel): void; } export interface ITerminalLinkDto { @@ -1833,14 +1709,14 @@ export interface ExtHostSCMShape { } export interface ExtHostTaskShape { - $provideTasks(handle: number, validTypes: { [key: string]: boolean; }): Thenable; - $resolveTask(handle: number, taskDTO: tasks.TaskDTO): Thenable; + $provideTasks(handle: number, validTypes: { [key: string]: boolean }): Promise; + $resolveTask(handle: number, taskDTO: tasks.TaskDTO): Promise; $onDidStartTask(execution: tasks.TaskExecutionDTO, terminalId: number, resolvedDefinition: tasks.TaskDefinitionDTO): void; $onDidStartTaskProcess(value: tasks.TaskProcessStartedDTO): void; $onDidEndTaskProcess(value: tasks.TaskProcessEndedDTO): void; $OnDidEndTask(execution: tasks.TaskExecutionDTO): void; - $resolveVariables(workspaceFolder: UriComponents, toResolve: { process?: { name: string; cwd?: string; }, variables: string[]; }): Promise<{ process?: string; variables: { [key: string]: string; }; }>; - $jsonTasksSupported(): Thenable; + $resolveVariables(workspaceFolder: UriComponents, toResolve: { process?: { name: string; cwd?: string }; variables: string[] }): Promise<{ process?: string; variables: { [key: string]: string } }>; + $jsonTasksSupported(): Promise; $findExecutable(command: string, cwd?: string, paths?: string[]): Promise; } @@ -1914,7 +1790,7 @@ export interface ExtHostDebugServiceShape { $resolveDebugConfiguration(handle: number, folder: UriComponents | undefined, debugConfiguration: IConfig, token: CancellationToken): Promise; $resolveDebugConfigurationWithSubstitutedVariables(handle: number, folder: UriComponents | undefined, debugConfiguration: IConfig, token: CancellationToken): Promise; $provideDebugConfigurations(handle: number, folder: UriComponents | undefined, token: CancellationToken): Promise; - $provideDebugAdapter(handle: number, session: IDebugSessionDto): Promise; + $provideDebugAdapter(handle: number, session: IDebugSessionDto): Promise>; $acceptDebugSessionStarted(session: IDebugSessionDto): void; $acceptDebugSessionTerminated(session: IDebugSessionDto): void; $acceptDebugSessionActiveChanged(session: IDebugSessionDto | undefined): void; @@ -1930,7 +1806,7 @@ export interface DecorationRequest { } export type DecorationData = [boolean, string, string, ThemeColor]; -export type DecorationReply = { [id: number]: DecorationData; }; +export type DecorationReply = { [id: number]: DecorationData }; export interface ExtHostDecorationsShape { $provideDecorations(handle: number, requests: DecorationRequest[], token: CancellationToken): Promise; @@ -1962,7 +1838,7 @@ export interface ExtHostCommentsShape { $updateCommentThreadTemplate(commentControllerHandle: number, threadHandle: number, range: IRange): Promise; $deleteCommentThread(commentControllerHandle: number, commentThreadHandle: number): void; $provideCommentingRanges(commentControllerHandle: number, uriComponents: UriComponents, token: CancellationToken): Promise; - $toggleReaction(commentControllerHandle: number, threadHandle: number, uri: UriComponents, comment: modes.Comment, reaction: modes.CommentReaction): Promise; + $toggleReaction(commentControllerHandle: number, threadHandle: number, uri: UriComponents, comment: languages.Comment, reaction: languages.CommentReaction): Promise; } export interface INotebookSelectionChangeEvent { @@ -1985,7 +1861,7 @@ export interface INotebookDocumentPropertiesChangeData { export interface INotebookModelAddedData { uri: UriComponents; versionId: number; - cells: NotebookCellDto[], + cells: NotebookCellDto[]; viewType: string; metadata?: notebookCommon.NotebookDocumentMetadata; } @@ -2144,9 +2020,18 @@ export interface ExtHostThemingShape { export interface MainThreadThemingShape extends IDisposable { } +export interface TunnelDto { + remoteAddress: { port: number; host: string }; + localAddress: { port: number; host: string } | string; + public: boolean; + privacy: TunnelPrivacyId | string; + protocol: string | undefined; +} + + export interface ExtHostTunnelServiceShape { $forwardPort(tunnelOptions: TunnelOptions, tunnelCreationOptions: TunnelCreationOptions): Promise; - $closeTunnel(remote: { host: string, port: number; }, silent?: boolean): Promise; + $closeTunnel(remote: { host: string; port: number }, silent?: boolean): Promise; $onDidTunnelsChange(): Promise; $registerCandidateFinder(enable: boolean): Promise; $applyCandidateFilter(candidates: CandidatePort[]): Promise; @@ -2154,7 +2039,7 @@ export interface ExtHostTunnelServiceShape { } export interface ExtHostTimelineShape { - $getTimeline(source: string, uri: UriComponents, options: TimelineOptions, token: CancellationToken, internalOptions?: InternalTimelineOptions): Promise; + $getTimeline(source: string, uri: UriComponents, options: TimelineOptions, token: CancellationToken, internalOptions?: InternalTimelineOptions): Promise | undefined>; } export const enum ExtHostTestingResource { @@ -2166,13 +2051,13 @@ export interface ExtHostTestingShape { $runControllerTests(req: RunTestForControllerRequest, token: CancellationToken): Promise; $cancelExtensionTestRun(runId: string | undefined): void; /** Handles a diff of tests, as a result of a subscribeToDiffs() call */ - $acceptDiff(diff: TestsDiff): void; + $acceptDiff(diff: TestsDiffOp.Serialized[]): void; /** Publishes that a test run finished. */ $publishTestResults(results: ISerializedTestResults[]): void; /** Expands a test item's children, by the given number of levels. */ $expandTest(testId: string, levels: number): Promise; /** Requests file coverage for a test run. Errors if not available. */ - $provideFileCoverage(runId: string, taskId: string, token: CancellationToken): Promise; + $provideFileCoverage(runId: string, taskId: string, token: CancellationToken): Promise>; /** * Requests coverage details for the file index in coverage data for the run. * Requires file coverage to have been previously requested via $provideFileCoverage. @@ -2203,7 +2088,7 @@ export interface MainThreadTestingShape { /** Stops requesting tests published to VS Code. */ $unsubscribeFromDiffs(): void; /** Publishes that new tests were available on the given source. */ - $publishDiff(controllerId: string, diff: TestsDiff): void; + $publishDiff(controllerId: string, diff: TestsDiffOp.Serialized[]): void; // --- test run configurations: @@ -2223,11 +2108,11 @@ export interface MainThreadTestingShape { * Adds tests to the run. The tests are given in descending depth. The first * item will be a previously-known test, or a test root. */ - $addTestsToRun(controllerId: string, runId: string, tests: ITestItem[]): void; + $addTestsToRun(controllerId: string, runId: string, tests: ITestItem.Serialized[]): void; /** Updates the state of a test run in the given run. */ $updateTestStateInRun(runId: string, taskId: string, testId: string, state: TestResultState, duration?: number): void; /** Appends a message to a test in the run. */ - $appendTestMessagesInRun(runId: string, taskId: string, testId: string, messages: SerializedTestMessage[]): void; + $appendTestMessagesInRun(runId: string, taskId: string, testId: string, messages: ITestMessage.Serialized[]): void; /** Appends raw output to the test run.. */ $appendOutputToRun(runId: string, taskId: string, output: VSBuffer, location?: ILocationDto, testId?: string): void; /** Triggered when coverage is added to test results. */ @@ -2245,114 +2130,114 @@ export interface MainThreadTestingShape { // --- proxy identifiers export const MainContext = { - MainThreadAuthentication: createMainId('MainThreadAuthentication'), - MainThreadBulkEdits: createMainId('MainThreadBulkEdits'), - MainThreadClipboard: createMainId('MainThreadClipboard'), - MainThreadCommands: createMainId('MainThreadCommands'), - MainThreadComments: createMainId('MainThreadComments'), - MainThreadConfiguration: createMainId('MainThreadConfiguration'), - MainThreadConsole: createMainId('MainThreadConsole'), - MainThreadDebugService: createMainId('MainThreadDebugService'), - MainThreadDecorations: createMainId('MainThreadDecorations'), - MainThreadDiagnostics: createMainId('MainThreadDiagnostics'), - MainThreadDialogs: createMainId('MainThreadDiaglogs'), - MainThreadDocuments: createMainId('MainThreadDocuments'), - MainThreadDocumentContentProviders: createMainId('MainThreadDocumentContentProviders'), - MainThreadTextEditors: createMainId('MainThreadTextEditors'), - MainThreadEditorInsets: createMainId('MainThreadEditorInsets'), - MainThreadEditorTabs: createMainId('MainThreadEditorTabs'), - MainThreadErrors: createMainId('MainThreadErrors'), - MainThreadTreeViews: createMainId('MainThreadTreeViews'), - MainThreadDownloadService: createMainId('MainThreadDownloadService'), - MainThreadKeytar: createMainId('MainThreadKeytar'), - MainThreadLanguageFeatures: createMainId('MainThreadLanguageFeatures'), - MainThreadLanguages: createMainId('MainThreadLanguages'), - MainThreadLogger: createMainId('MainThreadLogger'), - MainThreadMessageService: createMainId('MainThreadMessageService'), - MainThreadOutputService: createMainId('MainThreadOutputService'), - MainThreadProgress: createMainId('MainThreadProgress'), - MainThreadQuickOpen: createMainId('MainThreadQuickOpen'), - MainThreadStatusBar: createMainId('MainThreadStatusBar'), - MainThreadSecretState: createMainId('MainThreadSecretState'), - MainThreadStorage: createMainId('MainThreadStorage'), - MainThreadTelemetry: createMainId('MainThreadTelemetry'), - MainThreadTerminalService: createMainId('MainThreadTerminalService'), - MainThreadWebviews: createMainId('MainThreadWebviews'), - MainThreadWebviewPanels: createMainId('MainThreadWebviewPanels'), - MainThreadWebviewViews: createMainId('MainThreadWebviewViews'), - MainThreadCustomEditors: createMainId('MainThreadCustomEditors'), - MainThreadUrls: createMainId('MainThreadUrls'), - MainThreadUriOpeners: createMainId('MainThreadUriOpeners'), - MainThreadWorkspace: createMainId('MainThreadWorkspace'), - MainThreadFileSystem: createMainId('MainThreadFileSystem'), - MainThreadExtensionService: createMainId('MainThreadExtensionService'), - MainThreadSCM: createMainId('MainThreadSCM'), - MainThreadSearch: createMainId('MainThreadSearch'), - MainThreadTask: createMainId('MainThreadTask'), - MainThreadWindow: createMainId('MainThreadWindow'), - MainThreadLabelService: createMainId('MainThreadLabelService'), - MainThreadNotebook: createMainId('MainThreadNotebook'), - MainThreadNotebookDocuments: createMainId('MainThreadNotebookDocumentsShape'), - MainThreadNotebookEditors: createMainId('MainThreadNotebookEditorsShape'), - MainThreadNotebookKernels: createMainId('MainThreadNotebookKernels'), - MainThreadNotebookRenderers: createMainId('MainThreadNotebookRenderers'), - MainThreadInteractive: createMainId('MainThreadInteractive'), - MainThreadTheming: createMainId('MainThreadTheming'), - MainThreadTunnelService: createMainId('MainThreadTunnelService'), - MainThreadTimeline: createMainId('MainThreadTimeline'), - MainThreadTesting: createMainId('MainThreadTesting'), + MainThreadAuthentication: createProxyIdentifier('MainThreadAuthentication'), + MainThreadBulkEdits: createProxyIdentifier('MainThreadBulkEdits'), + MainThreadClipboard: createProxyIdentifier('MainThreadClipboard'), + MainThreadCommands: createProxyIdentifier('MainThreadCommands'), + MainThreadComments: createProxyIdentifier('MainThreadComments'), + MainThreadConfiguration: createProxyIdentifier('MainThreadConfiguration'), + MainThreadConsole: createProxyIdentifier('MainThreadConsole'), + MainThreadDebugService: createProxyIdentifier('MainThreadDebugService'), + MainThreadDecorations: createProxyIdentifier('MainThreadDecorations'), + MainThreadDiagnostics: createProxyIdentifier('MainThreadDiagnostics'), + MainThreadDialogs: createProxyIdentifier('MainThreadDiaglogs'), + MainThreadDocuments: createProxyIdentifier('MainThreadDocuments'), + MainThreadDocumentContentProviders: createProxyIdentifier('MainThreadDocumentContentProviders'), + MainThreadTextEditors: createProxyIdentifier('MainThreadTextEditors'), + MainThreadEditorInsets: createProxyIdentifier('MainThreadEditorInsets'), + MainThreadEditorTabs: createProxyIdentifier('MainThreadEditorTabs'), + MainThreadErrors: createProxyIdentifier('MainThreadErrors'), + MainThreadTreeViews: createProxyIdentifier('MainThreadTreeViews'), + MainThreadDownloadService: createProxyIdentifier('MainThreadDownloadService'), + MainThreadKeytar: createProxyIdentifier('MainThreadKeytar'), + MainThreadLanguageFeatures: createProxyIdentifier('MainThreadLanguageFeatures'), + MainThreadLanguages: createProxyIdentifier('MainThreadLanguages'), + MainThreadLogger: createProxyIdentifier('MainThreadLogger'), + MainThreadMessageService: createProxyIdentifier('MainThreadMessageService'), + MainThreadOutputService: createProxyIdentifier('MainThreadOutputService'), + MainThreadProgress: createProxyIdentifier('MainThreadProgress'), + MainThreadQuickOpen: createProxyIdentifier('MainThreadQuickOpen'), + MainThreadStatusBar: createProxyIdentifier('MainThreadStatusBar'), + MainThreadSecretState: createProxyIdentifier('MainThreadSecretState'), + MainThreadStorage: createProxyIdentifier('MainThreadStorage'), + MainThreadTelemetry: createProxyIdentifier('MainThreadTelemetry'), + MainThreadTerminalService: createProxyIdentifier('MainThreadTerminalService'), + MainThreadWebviews: createProxyIdentifier('MainThreadWebviews'), + MainThreadWebviewPanels: createProxyIdentifier('MainThreadWebviewPanels'), + MainThreadWebviewViews: createProxyIdentifier('MainThreadWebviewViews'), + MainThreadCustomEditors: createProxyIdentifier('MainThreadCustomEditors'), + MainThreadUrls: createProxyIdentifier('MainThreadUrls'), + MainThreadUriOpeners: createProxyIdentifier('MainThreadUriOpeners'), + MainThreadWorkspace: createProxyIdentifier('MainThreadWorkspace'), + MainThreadFileSystem: createProxyIdentifier('MainThreadFileSystem'), + MainThreadExtensionService: createProxyIdentifier('MainThreadExtensionService'), + MainThreadSCM: createProxyIdentifier('MainThreadSCM'), + MainThreadSearch: createProxyIdentifier('MainThreadSearch'), + MainThreadTask: createProxyIdentifier('MainThreadTask'), + MainThreadWindow: createProxyIdentifier('MainThreadWindow'), + MainThreadLabelService: createProxyIdentifier('MainThreadLabelService'), + MainThreadNotebook: createProxyIdentifier('MainThreadNotebook'), + MainThreadNotebookDocuments: createProxyIdentifier('MainThreadNotebookDocumentsShape'), + MainThreadNotebookEditors: createProxyIdentifier('MainThreadNotebookEditorsShape'), + MainThreadNotebookKernels: createProxyIdentifier('MainThreadNotebookKernels'), + MainThreadNotebookRenderers: createProxyIdentifier('MainThreadNotebookRenderers'), + MainThreadInteractive: createProxyIdentifier('MainThreadInteractive'), + MainThreadTheming: createProxyIdentifier('MainThreadTheming'), + MainThreadTunnelService: createProxyIdentifier('MainThreadTunnelService'), + MainThreadTimeline: createProxyIdentifier('MainThreadTimeline'), + MainThreadTesting: createProxyIdentifier('MainThreadTesting'), }; export const ExtHostContext = { - ExtHostCommands: createExtId('ExtHostCommands'), - ExtHostConfiguration: createExtId('ExtHostConfiguration'), - ExtHostDiagnostics: createExtId('ExtHostDiagnostics'), - ExtHostDebugService: createExtId('ExtHostDebugService'), - ExtHostDecorations: createExtId('ExtHostDecorations'), - ExtHostDocumentsAndEditors: createExtId('ExtHostDocumentsAndEditors'), - ExtHostDocuments: createExtId('ExtHostDocuments'), - ExtHostDocumentContentProviders: createExtId('ExtHostDocumentContentProviders'), - ExtHostDocumentSaveParticipant: createExtId('ExtHostDocumentSaveParticipant'), - ExtHostEditors: createExtId('ExtHostEditors'), - ExtHostTreeViews: createExtId('ExtHostTreeViews'), - ExtHostFileSystem: createExtId('ExtHostFileSystem'), - ExtHostFileSystemInfo: createExtId('ExtHostFileSystemInfo'), - ExtHostFileSystemEventService: createExtId('ExtHostFileSystemEventService'), - ExtHostLanguages: createExtId('ExtHostLanguages'), - ExtHostLanguageFeatures: createExtId('ExtHostLanguageFeatures'), - ExtHostQuickOpen: createExtId('ExtHostQuickOpen'), - ExtHostExtensionService: createExtId('ExtHostExtensionService'), - ExtHostLogLevelServiceShape: createExtId('ExtHostLogLevelServiceShape'), - ExtHostTerminalService: createExtId('ExtHostTerminalService'), - ExtHostSCM: createExtId('ExtHostSCM'), - ExtHostSearch: createExtId('ExtHostSearch'), - ExtHostTask: createExtId('ExtHostTask'), - ExtHostWorkspace: createExtId('ExtHostWorkspace'), - ExtHostWindow: createExtId('ExtHostWindow'), - ExtHostWebviews: createExtId('ExtHostWebviews'), - ExtHostWebviewPanels: createExtId('ExtHostWebviewPanels'), - ExtHostCustomEditors: createExtId('ExtHostCustomEditors'), - ExtHostWebviewViews: createExtId('ExtHostWebviewViews'), - ExtHostEditorInsets: createExtId('ExtHostEditorInsets'), - ExtHostEditorTabs: createExtId('ExtHostEditorTabs'), - ExtHostProgress: createMainId('ExtHostProgress'), - ExtHostComments: createMainId('ExtHostComments'), - ExtHostSecretState: createMainId('ExtHostSecretState'), - ExtHostStorage: createMainId('ExtHostStorage'), - ExtHostUrls: createExtId('ExtHostUrls'), - ExtHostUriOpeners: createExtId('ExtHostUriOpeners'), - ExtHostOutputService: createMainId('ExtHostOutputService'), - ExtHosLabelService: createMainId('ExtHostLabelService'), - ExtHostNotebook: createMainId('ExtHostNotebook'), - ExtHostNotebookDocuments: createMainId('ExtHostNotebookDocuments'), - ExtHostNotebookEditors: createMainId('ExtHostNotebookEditors'), - ExtHostNotebookKernels: createMainId('ExtHostNotebookKernels'), - ExtHostNotebookRenderers: createMainId('ExtHostNotebookRenderers'), - ExtHostInteractive: createMainId('ExtHostInteractive'), - ExtHostTheming: createMainId('ExtHostTheming'), - ExtHostTunnelService: createMainId('ExtHostTunnelService'), - ExtHostAuthentication: createMainId('ExtHostAuthentication'), - ExtHostTimeline: createMainId('ExtHostTimeline'), - ExtHostTesting: createMainId('ExtHostTesting'), - ExtHostTelemetry: createMainId('ExtHostTelemetry'), + ExtHostCommands: createProxyIdentifier('ExtHostCommands'), + ExtHostConfiguration: createProxyIdentifier('ExtHostConfiguration'), + ExtHostDiagnostics: createProxyIdentifier('ExtHostDiagnostics'), + ExtHostDebugService: createProxyIdentifier('ExtHostDebugService'), + ExtHostDecorations: createProxyIdentifier('ExtHostDecorations'), + ExtHostDocumentsAndEditors: createProxyIdentifier('ExtHostDocumentsAndEditors'), + ExtHostDocuments: createProxyIdentifier('ExtHostDocuments'), + ExtHostDocumentContentProviders: createProxyIdentifier('ExtHostDocumentContentProviders'), + ExtHostDocumentSaveParticipant: createProxyIdentifier('ExtHostDocumentSaveParticipant'), + ExtHostEditors: createProxyIdentifier('ExtHostEditors'), + ExtHostTreeViews: createProxyIdentifier('ExtHostTreeViews'), + ExtHostFileSystem: createProxyIdentifier('ExtHostFileSystem'), + ExtHostFileSystemInfo: createProxyIdentifier('ExtHostFileSystemInfo'), + ExtHostFileSystemEventService: createProxyIdentifier('ExtHostFileSystemEventService'), + ExtHostLanguages: createProxyIdentifier('ExtHostLanguages'), + ExtHostLanguageFeatures: createProxyIdentifier('ExtHostLanguageFeatures'), + ExtHostQuickOpen: createProxyIdentifier('ExtHostQuickOpen'), + ExtHostExtensionService: createProxyIdentifier('ExtHostExtensionService'), + ExtHostLogLevelServiceShape: createProxyIdentifier('ExtHostLogLevelServiceShape'), + ExtHostTerminalService: createProxyIdentifier('ExtHostTerminalService'), + ExtHostSCM: createProxyIdentifier('ExtHostSCM'), + ExtHostSearch: createProxyIdentifier('ExtHostSearch'), + ExtHostTask: createProxyIdentifier('ExtHostTask'), + ExtHostWorkspace: createProxyIdentifier('ExtHostWorkspace'), + ExtHostWindow: createProxyIdentifier('ExtHostWindow'), + ExtHostWebviews: createProxyIdentifier('ExtHostWebviews'), + ExtHostWebviewPanels: createProxyIdentifier('ExtHostWebviewPanels'), + ExtHostCustomEditors: createProxyIdentifier('ExtHostCustomEditors'), + ExtHostWebviewViews: createProxyIdentifier('ExtHostWebviewViews'), + ExtHostEditorInsets: createProxyIdentifier('ExtHostEditorInsets'), + ExtHostEditorTabs: createProxyIdentifier('ExtHostEditorTabs'), + ExtHostProgress: createProxyIdentifier('ExtHostProgress'), + ExtHostComments: createProxyIdentifier('ExtHostComments'), + ExtHostSecretState: createProxyIdentifier('ExtHostSecretState'), + ExtHostStorage: createProxyIdentifier('ExtHostStorage'), + ExtHostUrls: createProxyIdentifier('ExtHostUrls'), + ExtHostUriOpeners: createProxyIdentifier('ExtHostUriOpeners'), + ExtHostOutputService: createProxyIdentifier('ExtHostOutputService'), + ExtHosLabelService: createProxyIdentifier('ExtHostLabelService'), + ExtHostNotebook: createProxyIdentifier('ExtHostNotebook'), + ExtHostNotebookDocuments: createProxyIdentifier('ExtHostNotebookDocuments'), + ExtHostNotebookEditors: createProxyIdentifier('ExtHostNotebookEditors'), + ExtHostNotebookKernels: createProxyIdentifier('ExtHostNotebookKernels'), + ExtHostNotebookRenderers: createProxyIdentifier('ExtHostNotebookRenderers'), + ExtHostInteractive: createProxyIdentifier('ExtHostInteractive'), + ExtHostTheming: createProxyIdentifier('ExtHostTheming'), + ExtHostTunnelService: createProxyIdentifier('ExtHostTunnelService'), + ExtHostAuthentication: createProxyIdentifier('ExtHostAuthentication'), + ExtHostTimeline: createProxyIdentifier('ExtHostTimeline'), + ExtHostTesting: createProxyIdentifier('ExtHostTesting'), + ExtHostTelemetry: createProxyIdentifier('ExtHostTelemetry'), }; diff --git a/src/vs/workbench/api/common/extHostApiCommands.ts b/src/vs/workbench/api/common/extHostApiCommands.ts index 1d83460acc3..4b866a477f3 100644 --- a/src/vs/workbench/api/common/extHostApiCommands.ts +++ b/src/vs/workbench/api/common/extHostApiCommands.ts @@ -8,7 +8,7 @@ import type * as vscode from 'vscode'; import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import * as types from 'vs/workbench/api/common/extHostTypes'; import { IRawColorInfo, IWorkspaceEditDto, ICallHierarchyItemDto, IIncomingCallDto, IOutgoingCallDto, ITypeHierarchyItemDto } from 'vs/workbench/api/common/extHost.protocol'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import * as search from 'vs/workbench/contrib/search/common/search'; import { ApiCommand, ApiCommandArgument, ApiCommandResult, ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { CustomCodeAction } from 'vs/workbench/api/common/extHostLanguageFeatures'; @@ -19,6 +19,8 @@ import { TransientCellMetadata, TransientDocumentMetadata } from 'vs/workbench/c import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { VSBuffer } from 'vs/base/common/buffer'; import { decodeSemanticTokensDto } from 'vs/editor/common/services/semanticTokensDto'; +import { matchesSomeScheme } from 'vs/platform/opener/common/opener'; +import { Schemas } from 'vs/base/common/network'; //#region --- NEW world @@ -27,19 +29,19 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.executeDocumentHighlights', '_executeDocumentHighlights', 'Execute document highlight provider.', [ApiCommandArgument.Uri, ApiCommandArgument.Position], - new ApiCommandResult('A promise that resolves to an array of DocumentHighlight-instances.', tryMapWith(typeConverters.DocumentHighlight.to)) + new ApiCommandResult('A promise that resolves to an array of DocumentHighlight-instances.', tryMapWith(typeConverters.DocumentHighlight.to)) ), // -- document symbols new ApiCommand( 'vscode.executeDocumentSymbolProvider', '_executeDocumentSymbolProvider', 'Execute document symbol provider.', [ApiCommandArgument.Uri], - new ApiCommandResult('A promise that resolves to an array of SymbolInformation and DocumentSymbol instances.', (value, apiArgs) => { + new ApiCommandResult('A promise that resolves to an array of SymbolInformation and DocumentSymbol instances.', (value, apiArgs) => { if (isFalsyOrEmpty(value)) { return undefined; } class MergedInfo extends types.SymbolInformation implements vscode.DocumentSymbol { - static to(symbol: modes.DocumentSymbol): MergedInfo { + static to(symbol: languages.DocumentSymbol): MergedInfo { const res = new MergedInfo( symbol.name, typeConverters.SymbolKind.to(symbol.kind), @@ -67,49 +69,49 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.executeFormatDocumentProvider', '_executeFormatDocumentProvider', 'Execute document format provider.', [ApiCommandArgument.Uri, new ApiCommandArgument('options', 'Formatting options', _ => true, v => v)], - new ApiCommandResult('A promise that resolves to an array of TextEdits.', tryMapWith(typeConverters.TextEdit.to)) + new ApiCommandResult('A promise that resolves to an array of TextEdits.', tryMapWith(typeConverters.TextEdit.to)) ), new ApiCommand( 'vscode.executeFormatRangeProvider', '_executeFormatRangeProvider', 'Execute range format provider.', [ApiCommandArgument.Uri, ApiCommandArgument.Range, new ApiCommandArgument('options', 'Formatting options', _ => true, v => v)], - new ApiCommandResult('A promise that resolves to an array of TextEdits.', tryMapWith(typeConverters.TextEdit.to)) + new ApiCommandResult('A promise that resolves to an array of TextEdits.', tryMapWith(typeConverters.TextEdit.to)) ), new ApiCommand( 'vscode.executeFormatOnTypeProvider', '_executeFormatOnTypeProvider', 'Execute format on type provider.', [ApiCommandArgument.Uri, ApiCommandArgument.Position, new ApiCommandArgument('ch', 'Trigger character', v => typeof v === 'string', v => v), new ApiCommandArgument('options', 'Formatting options', _ => true, v => v)], - new ApiCommandResult('A promise that resolves to an array of TextEdits.', tryMapWith(typeConverters.TextEdit.to)) + new ApiCommandResult('A promise that resolves to an array of TextEdits.', tryMapWith(typeConverters.TextEdit.to)) ), // -- go to symbol (definition, type definition, declaration, impl, references) new ApiCommand( 'vscode.executeDefinitionProvider', '_executeDefinitionProvider', 'Execute all definition providers.', [ApiCommandArgument.Uri, ApiCommandArgument.Position], - new ApiCommandResult<(modes.Location | modes.LocationLink)[], (types.Location | vscode.LocationLink)[] | undefined>('A promise that resolves to an array of Location or LocationLink instances.', mapLocationOrLocationLink) + new ApiCommandResult<(languages.Location | languages.LocationLink)[], (types.Location | vscode.LocationLink)[] | undefined>('A promise that resolves to an array of Location or LocationLink instances.', mapLocationOrLocationLink) ), new ApiCommand( 'vscode.executeTypeDefinitionProvider', '_executeTypeDefinitionProvider', 'Execute all type definition providers.', [ApiCommandArgument.Uri, ApiCommandArgument.Position], - new ApiCommandResult<(modes.Location | modes.LocationLink)[], (types.Location | vscode.LocationLink)[] | undefined>('A promise that resolves to an array of Location or LocationLink instances.', mapLocationOrLocationLink) + new ApiCommandResult<(languages.Location | languages.LocationLink)[], (types.Location | vscode.LocationLink)[] | undefined>('A promise that resolves to an array of Location or LocationLink instances.', mapLocationOrLocationLink) ), new ApiCommand( 'vscode.executeDeclarationProvider', '_executeDeclarationProvider', 'Execute all declaration providers.', [ApiCommandArgument.Uri, ApiCommandArgument.Position], - new ApiCommandResult<(modes.Location | modes.LocationLink)[], (types.Location | vscode.LocationLink)[] | undefined>('A promise that resolves to an array of Location or LocationLink instances.', mapLocationOrLocationLink) + new ApiCommandResult<(languages.Location | languages.LocationLink)[], (types.Location | vscode.LocationLink)[] | undefined>('A promise that resolves to an array of Location or LocationLink instances.', mapLocationOrLocationLink) ), new ApiCommand( 'vscode.executeImplementationProvider', '_executeImplementationProvider', 'Execute all implementation providers.', [ApiCommandArgument.Uri, ApiCommandArgument.Position], - new ApiCommandResult<(modes.Location | modes.LocationLink)[], (types.Location | vscode.LocationLink)[] | undefined>('A promise that resolves to an array of Location or LocationLink instances.', mapLocationOrLocationLink) + new ApiCommandResult<(languages.Location | languages.LocationLink)[], (types.Location | vscode.LocationLink)[] | undefined>('A promise that resolves to an array of Location or LocationLink instances.', mapLocationOrLocationLink) ), new ApiCommand( 'vscode.executeReferenceProvider', '_executeReferenceProvider', 'Execute all reference providers.', [ApiCommandArgument.Uri, ApiCommandArgument.Position], - new ApiCommandResult('A promise that resolves to an array of Location-instances.', tryMapWith(typeConverters.location.to)) + new ApiCommandResult('A promise that resolves to an array of Location-instances.', tryMapWith(typeConverters.location.to)) ), // -- hover new ApiCommand( 'vscode.executeHoverProvider', '_executeHoverProvider', 'Execute all hover providers.', [ApiCommandArgument.Uri, ApiCommandArgument.Position], - new ApiCommandResult('A promise that resolves to an array of Hover-instances.', tryMapWith(typeConverters.Hover.to)) + new ApiCommandResult('A promise that resolves to an array of Hover-instances.', tryMapWith(typeConverters.Hover.to)) ), // -- selection range new ApiCommand( @@ -153,7 +155,7 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.prepareRename', '_executePrepareRename', 'Execute the prepareRename of rename provider.', [ApiCommandArgument.Uri, ApiCommandArgument.Position], - new ApiCommandResult('A promise that resolves to a range and placeholder text.', value => { + new ApiCommandResult('A promise that resolves to a range and placeholder text.', value => { if (!value) { return undefined; } @@ -180,13 +182,13 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.executeLinkProvider', '_executeLinkProvider', 'Execute document link provider.', [ApiCommandArgument.Uri, ApiCommandArgument.Number.with('linkResolveCount', 'Number of links that should be resolved, only when links are unresolved.').optional()], - new ApiCommandResult('A promise that resolves to an array of DocumentLink-instances.', value => value.map(typeConverters.DocumentLink.to)) + new ApiCommandResult('A promise that resolves to an array of DocumentLink-instances.', value => value.map(typeConverters.DocumentLink.to)) ), // --- semantic tokens new ApiCommand( 'vscode.provideDocumentSemanticTokensLegend', '_provideDocumentSemanticTokensLegend', 'Provide semantic tokens legend for a document', [ApiCommandArgument.Uri], - new ApiCommandResult('A promise that resolves to SemanticTokensLegend.', value => { + new ApiCommandResult('A promise that resolves to SemanticTokensLegend.', value => { if (!value) { return undefined; } @@ -211,7 +213,7 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.provideDocumentRangeSemanticTokensLegend', '_provideDocumentRangeSemanticTokensLegend', 'Provide semantic tokens legend for a document range', [ApiCommandArgument.Uri, ApiCommandArgument.Range.optional()], - new ApiCommandResult('A promise that resolves to SemanticTokensLegend.', value => { + new ApiCommandResult('A promise that resolves to SemanticTokensLegend.', value => { if (!value) { return undefined; } @@ -242,7 +244,7 @@ const newCommands: ApiCommand[] = [ ApiCommandArgument.String.with('triggerCharacter', 'Trigger completion when the user types the character, like `,` or `(`').optional(), ApiCommandArgument.Number.with('itemResolveCount', 'Number of completions to resolve (too large numbers slow down completions)').optional() ], - new ApiCommandResult('A promise that resolves to a CompletionList-instance.', (value, _args, converter) => { + new ApiCommandResult('A promise that resolves to a CompletionList-instance.', (value, _args, converter) => { if (!value) { return new types.CompletionList([]); } @@ -254,7 +256,7 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.executeSignatureHelpProvider', '_executeSignatureHelpProvider', 'Execute signature help provider.', [ApiCommandArgument.Uri, ApiCommandArgument.Position, ApiCommandArgument.String.with('triggerCharacter', 'Trigger signature help when the user types the character, like `,` or `(`').optional()], - new ApiCommandResult('A promise that resolves to SignatureHelp.', value => { + new ApiCommandResult('A promise that resolves to SignatureHelp.', value => { if (value) { return typeConverters.SignatureHelp.to(value); } @@ -265,8 +267,8 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.executeCodeLensProvider', '_executeCodeLensProvider', 'Execute code lens provider.', [ApiCommandArgument.Uri, ApiCommandArgument.Number.with('itemResolveCount', 'Number of lenses that should be resolved and returned. Will only return resolved lenses, will impact performance)').optional()], - new ApiCommandResult('A promise that resolves to an array of CodeLens-instances.', (value, _args, converter) => { - return tryMapWith(item => { + new ApiCommandResult('A promise that resolves to an array of CodeLens-instances.', (value, _args, converter) => { + return tryMapWith(item => { return new types.CodeLens(typeConverters.Range.to(item.range), item.command && converter.fromInternal(item.command)); })(value); }) @@ -319,9 +321,9 @@ const newCommands: ApiCommand[] = [ 'vscode.executeColorPresentationProvider', '_executeColorPresentationProvider', 'Execute color presentation provider.', [ new ApiCommandArgument('color', 'The color to show and insert', v => v instanceof types.Color, typeConverters.Color.from), - new ApiCommandArgument<{ uri: URI, range: types.Range; }, { uri: URI, range: IRange; }>('context', 'Context object with uri and range', _v => true, v => ({ uri: v.uri, range: typeConverters.Range.from(v.range) })), + new ApiCommandArgument<{ uri: URI; range: types.Range }, { uri: URI; range: IRange }>('context', 'Context object with uri and range', _v => true, v => ({ uri: v.uri, range: typeConverters.Range.from(v.range) })), ], - new ApiCommandResult('A promise that resolves to an array of ColorPresentation objects.', result => { + new ApiCommandResult('A promise that resolves to an array of ColorPresentation objects.', result => { if (result) { return result.map(typeConverters.ColorPresentation.to); } @@ -332,7 +334,7 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.executeInlayHintProvider', '_executeInlayHintProvider', 'Execute inlay hints provider', [ApiCommandArgument.Uri, ApiCommandArgument.Range], - new ApiCommandResult('A promise that resolves to an array of Inlay objects', (result, args, converter) => { + new ApiCommandResult('A promise that resolves to an array of Inlay objects', (result, args, converter) => { return result.map(typeConverters.InlayHint.to.bind(undefined, converter)); }) ), @@ -347,12 +349,12 @@ const newCommands: ApiCommand[] = [ new ApiCommandResult<{ viewType: string; displayName: string; - options: { transientOutputs: boolean; transientCellMetadata: TransientCellMetadata; transientDocumentMetadata: TransientDocumentMetadata; }; - filenamePattern: (vscode.GlobPattern | { include: vscode.GlobPattern, exclude: vscode.GlobPattern })[] + options: { transientOutputs: boolean; transientCellMetadata: TransientCellMetadata; transientDocumentMetadata: TransientDocumentMetadata }; + filenamePattern: (vscode.GlobPattern | { include: vscode.GlobPattern; exclude: vscode.GlobPattern })[]; }[], { viewType: string; displayName: string; - filenamePattern: (vscode.GlobPattern | { include: vscode.GlobPattern; exclude: vscode.GlobPattern; })[]; + filenamePattern: (vscode.GlobPattern | { include: vscode.GlobPattern; exclude: vscode.GlobPattern })[]; options: vscode.NotebookDocumentContentOptions; }[] | undefined>('A promise that resolves to an array of NotebookContentProvider static info objects.', tryMapWith(item => { return { @@ -371,7 +373,7 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.executeInlineValueProvider', '_executeInlineValueProvider', 'Execute inline value provider', [ApiCommandArgument.Uri, ApiCommandArgument.Range], - new ApiCommandResult('A promise that resolves to an array of InlineValue objects', result => { + new ApiCommandResult('A promise that resolves to an array of InlineValue objects', result => { return result.map(typeConverters.InlineValue.to); }) ), @@ -379,7 +381,7 @@ const newCommands: ApiCommand[] = [ new ApiCommand( 'vscode.open', '_workbench.open', 'Opens the provided resource in the editor. Can be a text or binary file, or an http(s) URL. If you need more control over the options for opening a text file, use vscode.window.showTextDocument instead.', [ - ApiCommandArgument.Uri, + new ApiCommandArgument('uriOrString', 'Uri-instance or string (only http/https)', v => URI.isUri(v) || (typeof v === 'string' && matchesSomeScheme(v, Schemas.http, Schemas.https)), v => v), new ApiCommandArgument('columnOrOptions', 'Either the column in which to open or editor options, see vscode.TextDocumentShowOptions', v => v === undefined || typeof v === 'number' || typeof v === 'object', v => !v ? v : typeof v === 'number' ? [typeConverters.ViewColumn.from(v), undefined] : [typeConverters.ViewColumn.from(v.viewColumn), typeConverters.TextEditorOpenOptions.from(v)] @@ -459,13 +461,13 @@ function tryMapWith(f: (x: T) => R) { }; } -function mapLocationOrLocationLink(values: (modes.Location | modes.LocationLink)[]): (types.Location | vscode.LocationLink)[] | undefined { +function mapLocationOrLocationLink(values: (languages.Location | languages.LocationLink)[]): (types.Location | vscode.LocationLink)[] | undefined { if (!Array.isArray(values)) { return undefined; } const result: (types.Location | vscode.LocationLink)[] = []; for (const item of values) { - if (modes.isLocationLink(item)) { + if (languages.isLocationLink(item)) { result.push(typeConverters.DefinitionLink.to(item)); } else { result.push(typeConverters.location.to(item)); diff --git a/src/vs/workbench/api/common/extHostApiDeprecationService.ts b/src/vs/workbench/api/common/extHostApiDeprecationService.ts index 44cce5ba2ef..b39792a54bf 100644 --- a/src/vs/workbench/api/common/extHostApiDeprecationService.ts +++ b/src/vs/workbench/api/common/extHostApiDeprecationService.ts @@ -47,8 +47,8 @@ export class ExtHostApiDeprecationService implements IExtHostApiDeprecationServi apiId: string; }; type DeprecationTelemetryMeta = { - extensionId: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - apiId: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + extensionId: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + apiId: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; this._telemetryShape.$publicLog2('extHostDeprecatedApiUsage', { extensionId: extension.identifier.value, diff --git a/src/vs/workbench/api/common/extHostAuthentication.ts b/src/vs/workbench/api/common/extHostAuthentication.ts index 5d602c8a470..afc9355c25a 100644 --- a/src/vs/workbench/api/common/extHostAuthentication.ts +++ b/src/vs/workbench/api/common/extHostAuthentication.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import type * as vscode from 'vscode'; -import * as modes from 'vs/editor/common/languages'; import { Emitter, Event } from 'vs/base/common/event'; import { IMainContext, MainContext, MainThreadAuthenticationShape, ExtHostAuthenticationShape } from 'vs/workbench/api/common/extHost.protocol'; import { Disposable } from 'vs/workbench/api/common/extHostTypes'; @@ -129,7 +128,7 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { }); } - $createSession(providerId: string, scopes: string[]): Promise { + $createSession(providerId: string, scopes: string[]): Promise { const providerData = this._authenticationProviders.get(providerId); if (providerData) { return Promise.resolve(providerData.provider.createSession(scopes)); @@ -147,7 +146,7 @@ export class ExtHostAuthentication implements ExtHostAuthenticationShape { throw new Error(`Unable to find authentication provider with handle: ${providerId}`); } - $getSessions(providerId: string, scopes?: string[]): Promise> { + $getSessions(providerId: string, scopes?: string[]): Promise> { const providerData = this._authenticationProviders.get(providerId); if (providerData) { return Promise.resolve(providerData.provider.getSessions(scopes)); diff --git a/src/vs/workbench/api/common/extHostBulkEdits.ts b/src/vs/workbench/api/common/extHostBulkEdits.ts index 1f36833cdef..6547c861438 100644 --- a/src/vs/workbench/api/common/extHostBulkEdits.ts +++ b/src/vs/workbench/api/common/extHostBulkEdits.ts @@ -12,16 +12,22 @@ import type * as vscode from 'vscode'; export class ExtHostBulkEdits { private readonly _proxy: MainThreadBulkEditsShape; + private readonly _versionInformationProvider: WorkspaceEdit.IVersionInformationProvider; constructor( @IExtHostRpcService extHostRpc: IExtHostRpcService, - private readonly _extHostDocumentsAndEditors: ExtHostDocumentsAndEditors, + extHostDocumentsAndEditors: ExtHostDocumentsAndEditors, ) { this._proxy = extHostRpc.getProxy(MainContext.MainThreadBulkEdits); + + this._versionInformationProvider = { + getTextDocumentVersion: uri => extHostDocumentsAndEditors.getDocument(uri)?.version, + getNotebookDocumentVersion: () => undefined + }; } applyWorkspaceEdit(edit: vscode.WorkspaceEdit): Promise { - const dto = WorkspaceEdit.from(edit, this._extHostDocumentsAndEditors); + const dto = WorkspaceEdit.from(edit, this._versionInformationProvider); return this._proxy.$tryApplyWorkspaceEdit(dto); } } diff --git a/src/vs/workbench/api/common/extHostCodeInsets.ts b/src/vs/workbench/api/common/extHostCodeInsets.ts index fd7e9e715e5..9dbd644d15c 100644 --- a/src/vs/workbench/api/common/extHostCodeInsets.ts +++ b/src/vs/workbench/api/common/extHostCodeInsets.ts @@ -8,7 +8,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ExtHostTextEditor } from 'vs/workbench/api/common/extHostTextEditor'; import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; -import { asWebviewUri, webviewGenericCspSource, WebviewInitData } from 'vs/workbench/api/common/shared/webview'; +import { asWebviewUri, webviewGenericCspSource, WebviewInitData } from 'vs/workbench/common/webview'; import type * as vscode from 'vscode'; import { ExtHostEditorInsetsShape, MainThreadEditorInsetsShape } from './extHost.protocol'; @@ -16,7 +16,7 @@ export class ExtHostEditorInsets implements ExtHostEditorInsetsShape { private _handlePool = 0; private _disposables = new DisposableStore(); - private _insets = new Map }>(); + private _insets = new Map }>(); constructor( private readonly _proxy: MainThreadEditorInsetsShape, diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts index 89a8d2bee07..2ea50c6e796 100644 --- a/src/vs/workbench/api/common/extHostCommands.ts +++ b/src/vs/workbench/api/common/extHostCommands.ts @@ -8,9 +8,9 @@ import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import * as extHostTypeConverter from 'vs/workbench/api/common/extHostTypeConverters'; import { cloneAndChange } from 'vs/base/common/objects'; -import { MainContext, MainThreadCommandsShape, ExtHostCommandsShape, ObjectIdentifier, ICommandDto } from './extHost.protocol'; +import { MainContext, MainThreadCommandsShape, ExtHostCommandsShape, ICommandDto, ICommandHandlerDescriptionDto } from './extHost.protocol'; import { isNonEmptyArray } from 'vs/base/common/arrays'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import type * as vscode from 'vscode'; import { ILogService } from 'vs/platform/log/common/log'; import { revive } from 'vs/base/common/marshalling'; @@ -87,7 +87,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { if (Position.isIPosition(obj)) { return extHostTypeConverter.Position.to(obj); } - if (Range.isIRange((obj as modes.Location).range) && URI.isUri((obj as modes.Location).uri)) { + if (Range.isIRange((obj as languages.Location).range) && URI.isUri((obj as languages.Location).uri)) { return extHostTypeConverter.location.to(obj); } if (obj instanceof VSBuffer) { @@ -276,7 +276,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { }); } - $getContributedCommandHandlerDescriptions(): Promise<{ [id: string]: string | ICommandHandlerDescription }> { + $getContributedCommandHandlerDescriptions(): Promise<{ [id: string]: string | ICommandHandlerDescriptionDto }> { const result: { [id: string]: string | ICommandHandlerDescription } = Object.create(null); for (let [id, command] of this._commands) { let { description } = command; @@ -291,7 +291,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { export interface IExtHostCommands extends ExtHostCommands { } export const IExtHostCommands = createDecorator('IExtHostCommands'); -export class CommandsConverter { +export class CommandsConverter implements extHostTypeConverter.Command.ICommandsConverter { readonly delegatingCommandId: string = `_vscode_delegate_cmd_${Date.now().toString(36)}`; private readonly _cache = new Map(); @@ -355,11 +355,10 @@ export class CommandsConverter { return result; } - fromInternal(command: modes.Command): vscode.Command | undefined { + fromInternal(command: ICommandDto): vscode.Command | undefined { - const id = ObjectIdentifier.of(command); - if (typeof id === 'number') { - return this._cache.get(id); + if (typeof command.$ident === 'number') { + return this._cache.get(command.$ident); } else { return { diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index 915d28eb866..14c025e631c 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -11,7 +11,7 @@ import { DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/ import { MarshalledId } from 'vs/base/common/marshalling'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IRange } from 'vs/editor/common/core/range'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import * as extHostTypeConverter from 'vs/workbench/api/common/extHostTypeConverters'; @@ -190,7 +190,7 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo }).then(ranges => ranges ? ranges.map(x => extHostTypeConverter.Range.from(x)) : undefined); } - $toggleReaction(commentControllerHandle: number, threadHandle: number, uri: UriComponents, comment: modes.Comment, reaction: modes.CommentReaction): Promise { + $toggleReaction(commentControllerHandle: number, threadHandle: number, uri: UriComponents, comment: languages.Comment, reaction: languages.CommentReaction): Promise { const commentController = this._commentControllers.get(commentControllerHandle); if (!commentController || !commentController.reactionHandler) { @@ -217,11 +217,11 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo } } type CommentThreadModification = Partial<{ - range: vscode.Range, - label: string | undefined, - contextValue: string | undefined, - comments: vscode.Comment[], - collapsibleState: vscode.CommentThreadCollapsibleState + range: vscode.Range; + label: string | undefined; + contextValue: string | undefined; + comments: vscode.Comment[]; + collapsibleState: vscode.CommentThreadCollapsibleState; canReply: boolean; }>; @@ -511,13 +511,13 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo proxy.$updateCommentControllerFeatures(this.handle, { reactionHandler: !!handler }); } - private _options: modes.CommentOptions | undefined; + private _options: languages.CommentOptions | undefined; get options() { return this._options; } - set options(options: modes.CommentOptions | undefined) { + set options(options: languages.CommentOptions | undefined) { this._options = options; proxy.$updateCommentControllerFeatures(this.handle, { options: this._options }); @@ -574,7 +574,7 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo $createCommentThreadTemplate(uriComponents: UriComponents, range: IRange): ExtHostCommentThread { const commentThread = new ExtHostCommentThread(this.id, this.handle, undefined, URI.revive(uriComponents), extHostTypeConverter.Range.to(range), [], this._extension); - commentThread.collapsibleState = modes.CommentThreadCollapsibleState.Expanded; + commentThread.collapsibleState = languages.CommentThreadCollapsibleState.Expanded; this._threads.set(commentThread.handle, commentThread); return commentThread; } @@ -618,34 +618,24 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo const iconPath = vscodeComment.author && vscodeComment.author.iconPath ? vscodeComment.author.iconPath.toString() : undefined; - if (vscodeComment.detail) { + if (vscodeComment.timestamp) { checkProposedApiEnabled(thread.extensionDescription, 'commentTimestamp'); } - let detail: { $mid: MarshalledId.Date, source: any } | string | undefined; - if (vscodeComment.detail && (typeof vscodeComment.detail !== 'string')) { - detail = { - source: vscodeComment.detail, - $mid: MarshalledId.Date - }; - } else { - detail = vscodeComment.detail; - } - return { mode: vscodeComment.mode, contextValue: vscodeComment.contextValue, uniqueIdInThread: commentUniqueId, - body: extHostTypeConverter.MarkdownString.from(vscodeComment.body), + body: (typeof vscodeComment.body === 'string') ? vscodeComment.body : extHostTypeConverter.MarkdownString.from(vscodeComment.body), userName: vscodeComment.author.name, userIconPath: iconPath, label: vscodeComment.label, commentReactions: vscodeComment.reactions ? vscodeComment.reactions.map(reaction => convertToReaction(reaction)) : undefined, - detail: detail + timestamp: vscodeComment.timestamp?.toJSON() }; } - function convertToReaction(reaction: vscode.CommentReaction): modes.CommentReaction { + function convertToReaction(reaction: vscode.CommentReaction): languages.CommentReaction { return { label: reaction.label, iconPath: reaction.iconPath ? extHostTypeConverter.pathOrURIToURI(reaction.iconPath) : undefined, @@ -654,7 +644,7 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo }; } - function convertFromReaction(reaction: modes.CommentReaction): vscode.CommentReaction { + function convertFromReaction(reaction: languages.CommentReaction): vscode.CommentReaction { return { label: reaction.label || '', count: reaction.count || 0, @@ -663,18 +653,17 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo }; } - function convertToCollapsibleState(kind: vscode.CommentThreadCollapsibleState | undefined): modes.CommentThreadCollapsibleState { + function convertToCollapsibleState(kind: vscode.CommentThreadCollapsibleState | undefined): languages.CommentThreadCollapsibleState { if (kind !== undefined) { switch (kind) { case types.CommentThreadCollapsibleState.Expanded: - return modes.CommentThreadCollapsibleState.Expanded; + return languages.CommentThreadCollapsibleState.Expanded; case types.CommentThreadCollapsibleState.Collapsed: - return modes.CommentThreadCollapsibleState.Collapsed; + return languages.CommentThreadCollapsibleState.Collapsed; } } - return modes.CommentThreadCollapsibleState.Collapsed; + return languages.CommentThreadCollapsibleState.Collapsed; } return new ExtHostCommentsImpl(); } - diff --git a/src/vs/workbench/api/common/extHostConfiguration.ts b/src/vs/workbench/api/common/extHostConfiguration.ts index e8033334ac6..eca1651b33b 100644 --- a/src/vs/workbench/api/common/extHostConfiguration.ts +++ b/src/vs/workbench/api/common/extHostConfiguration.ts @@ -37,8 +37,8 @@ type ConfigurationInspect = { defaultValue?: T; globalValue?: T; - workspaceValue?: T, - workspaceFolderValue?: T, + workspaceValue?: T; + workspaceFolderValue?: T; defaultLanguageValue?: T; globalLanguageValue?: T; @@ -52,7 +52,7 @@ function isUri(thing: any): thing is vscode.Uri { return thing instanceof URI; } -function isResourceLanguage(thing: any): thing is { uri: URI, languageId: string } { +function isResourceLanguage(thing: any): thing is { uri: URI; languageId: string } { return thing && thing.uri instanceof URI && (thing.languageId && typeof thing.languageId === 'string'); @@ -313,7 +313,7 @@ export class ExtHostConfigProvider { } } - private _toConfigurationChangeEvent(change: IConfigurationChange, previous: { data: IConfigurationData, workspace: Workspace | undefined }): vscode.ConfigurationChangeEvent { + private _toConfigurationChangeEvent(change: IConfigurationChange, previous: { data: IConfigurationData; workspace: Workspace | undefined }): vscode.ConfigurationChangeEvent { const event = new ConfigurationChangeEvent(change, previous, this._configuration, this._extHostWorkspace.workspace); return Object.freeze({ affectsConfiguration: (section: string, scope?: vscode.ConfigurationScope) => event.affectsConfiguration(section, scopeToOverrides(scope)) diff --git a/src/vs/workbench/api/common/extHostCustomEditors.ts b/src/vs/workbench/api/common/extHostCustomEditors.ts index 5f9a06d01de..7c9e25f6126 100644 --- a/src/vs/workbench/api/common/extHostCustomEditors.ts +++ b/src/vs/workbench/api/common/extHostCustomEditors.ts @@ -176,7 +176,7 @@ export class ExtHostCustomEditors implements extHostProtocol.ExtHostCustomEditor extension: IExtensionDescription, viewType: string, provider: vscode.CustomReadonlyEditorProvider | vscode.CustomTextEditorProvider, - options: { webviewOptions?: vscode.WebviewPanelOptions, supportsMultipleEditorsPerDocument?: boolean }, + options: { webviewOptions?: vscode.WebviewPanelOptions; supportsMultipleEditorsPerDocument?: boolean }, ): vscode.Disposable { const disposables = new DisposableStore(); if (isCustomTextEditorProvider(provider)) { diff --git a/src/vs/workbench/api/common/extHostDebugService.ts b/src/vs/workbench/api/common/extHostDebugService.ts index 54c26a35ecf..31921d3cbef 100644 --- a/src/vs/workbench/api/common/extHostDebugService.ts +++ b/src/vs/workbench/api/common/extHostDebugService.ts @@ -16,7 +16,7 @@ import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/common/abstract import { IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { IExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; import { ExtHostDocumentsAndEditors, IExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { IDebuggerContribution, IConfig, IDebugAdapter, IDebugAdapterServer, IDebugAdapterExecutable, IAdapterDescriptor, IDebugAdapterImpl, IDebugAdapterNamedPipeServer } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebuggerContribution, IConfig, IDebugAdapter, IDebugAdapterServer, IDebugAdapterExecutable, IAdapterDescriptor, IDebugAdapterNamedPipeServer } from 'vs/workbench/contrib/debug/common/debug'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { AbstractVariableResolverService } from 'vs/workbench/services/configurationResolver/common/variableResolver'; import { ExtHostConfigProvider, IExtHostConfiguration } from '../common/extHostConfiguration'; @@ -32,6 +32,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { withNullAsUndefined } from 'vs/base/common/types'; import * as process from 'vs/base/common/process'; import { IExtHostEditorTabs } from 'vs/workbench/api/common/extHostEditorTabs'; +import { Dto } from 'vs/workbench/services/extensions/common/proxyIdentifier'; export const IExtHostDebugService = createDecorator('IExtHostDebugService'); @@ -642,7 +643,7 @@ export abstract class ExtHostDebugServiceBase implements IExtHostDebugService, E }); } - public async $provideDebugAdapter(adapterFactoryHandle: number, sessionDto: IDebugSessionDto): Promise { + public async $provideDebugAdapter(adapterFactoryHandle: number, sessionDto: IDebugSessionDto): Promise> { const adapterDescriptorFactory = this.getAdapterDescriptorFactoryByHandle(adapterFactoryHandle); if (!adapterDescriptorFactory) { return Promise.reject(new Error('no adapter descriptor factory found for handle')); @@ -693,7 +694,7 @@ export abstract class ExtHostDebugServiceBase implements IExtHostDebugService, E // private & dto helpers - private convertToDto(x: vscode.DebugAdapterDescriptor): IAdapterDescriptor { + private convertToDto(x: vscode.DebugAdapterDescriptor): Dto { if (x instanceof DebugAdapterExecutable) { return { @@ -714,7 +715,7 @@ export abstract class ExtHostDebugServiceBase implements IExtHostDebugService, E path: x.path }; } else if (x instanceof DebugAdapterInlineImplementation) { - return { + return >{ type: 'implementation', implementation: x.implementation }; @@ -940,7 +941,12 @@ export class ExtHostDebugConsole { export class ExtHostVariableResolverService extends AbstractVariableResolverService { - constructor(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors | undefined, configurationService: ExtHostConfigProvider, editorTabs: IExtHostEditorTabs, workspaceService?: IExtHostWorkspace) { + constructor(folders: vscode.WorkspaceFolder[], + editorService: ExtHostDocumentsAndEditors | undefined, + configurationService: ExtHostConfigProvider, + editorTabs: IExtHostEditorTabs, + workspaceService?: IExtHostWorkspace, + userHome?: string) { function getActiveUri(): URI | undefined { if (editorService) { const activeEditor = editorService.activeEditor(); @@ -950,7 +956,7 @@ export class ExtHostVariableResolverService extends AbstractVariableResolverServ const tabs = editorTabs.tabs.filter(tab => tab.isActive); if (tabs.length > 0) { // Resolve a resource from the tab - const asSideBySideResource = tabs[0].resource as { primary?: URI, secondary?: URI } | undefined; + const asSideBySideResource = tabs[0].resource as { primary?: URI; secondary?: URI } | undefined; if (asSideBySideResource && (asSideBySideResource.primary || asSideBySideResource.secondary)) { return asSideBySideResource.primary ?? asSideBySideResource.secondary; } else { @@ -1018,7 +1024,7 @@ export class ExtHostVariableResolverService extends AbstractVariableResolverServ } return undefined; } - }, undefined, Promise.resolve(process.env)); + }, undefined, userHome ? Promise.resolve(userHome) : undefined, Promise.resolve(process.env)); } } diff --git a/src/vs/workbench/api/common/extHostDocumentData.ts b/src/vs/workbench/api/common/extHostDocumentData.ts index 247ea5cd46c..92fd321b122 100644 --- a/src/vs/workbench/api/common/extHostDocumentData.ts +++ b/src/vs/workbench/api/common/extHostDocumentData.ts @@ -8,7 +8,7 @@ import { Schemas } from 'vs/base/common/network'; import { regExpLeadsToEndlessLoop } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { MirrorTextModel } from 'vs/editor/common/model/mirrorTextModel'; -import { ensureValidWordDefinition, getWordAtText } from 'vs/editor/common/model/wordHelper'; +import { ensureValidWordDefinition, getWordAtText } from 'vs/editor/common/core/wordHelper'; import { MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { EndOfLine, Position, Range } from 'vs/workbench/api/common/extHostTypes'; import type * as vscode from 'vscode'; diff --git a/src/vs/workbench/api/common/extHostDocumentSaveParticipant.ts b/src/vs/workbench/api/common/extHostDocumentSaveParticipant.ts index fe6fd330378..4b43d2f917a 100644 --- a/src/vs/workbench/api/common/extHostDocumentSaveParticipant.ts +++ b/src/vs/workbench/api/common/extHostDocumentSaveParticipant.ts @@ -27,7 +27,7 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic private readonly _logService: ILogService, private readonly _documents: ExtHostDocuments, private readonly _mainThreadBulkEdits: MainThreadBulkEditsShape, - private readonly _thresholds: { timeout: number; errors: number; } = { timeout: 1500, errors: 3 } + private readonly _thresholds: { timeout: number; errors: number } = { timeout: 1500, errors: 3 } ) { // } diff --git a/src/vs/workbench/api/common/extHostEditorTabs.ts b/src/vs/workbench/api/common/extHostEditorTabs.ts index 414d90f4580..409e257f697 100644 --- a/src/vs/workbench/api/common/extHostEditorTabs.ts +++ b/src/vs/workbench/api/common/extHostEditorTabs.ts @@ -20,7 +20,7 @@ export interface IEditorTab { resource: vscode.Uri | undefined; viewId: string | undefined; isActive: boolean; - additionalResourcesAndViewIds: { resource: vscode.Uri | undefined, viewId: string | undefined }[]; + additionalResourcesAndViewIds: { resource: vscode.Uri | undefined; viewId: string | undefined }[]; move(index: number, viewColumn: ViewColumn): Promise; close(): Promise; } diff --git a/src/vs/workbench/api/common/extHostExtensionActivator.ts b/src/vs/workbench/api/common/extHostExtensionActivator.ts index 34bab15025d..59ff5889c3f 100644 --- a/src/vs/workbench/api/common/extHostExtensionActivator.ts +++ b/src/vs/workbench/api/common/extHostExtensionActivator.ts @@ -8,7 +8,7 @@ import * as errors from 'vs/base/common/errors'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { MissingExtensionDependency } from 'vs/workbench/services/extensions/common/extensions'; +import { ExtensionActivationReason, MissingExtensionDependency } from 'vs/workbench/services/extensions/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; const NO_OP_VOID_PROMISE = Promise.resolve(undefined); @@ -29,10 +29,10 @@ export interface IExtensionAPI { } export type ExtensionActivationTimesFragment = { - startup?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true; }; - codeLoadingTime?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true; }; - activateCallTime?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true; }; - activateResolvedTime?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true; }; + startup?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + codeLoadingTime?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + activateCallTime?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + activateResolvedTime?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; }; export class ExtensionActivationTimes { @@ -162,13 +162,7 @@ export interface IExtensionsActivatorHost { actualActivateExtension(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; } -export interface ExtensionActivationReason { - readonly startup: boolean; - readonly extensionId: ExtensionIdentifier; - readonly activationEvent: string; -} - -type ActivationIdAndReason = { id: ExtensionIdentifier, reason: ExtensionActivationReason; }; +type ActivationIdAndReason = { id: ExtensionIdentifier; reason: ExtensionActivationReason }; export class ExtensionsActivator implements IDisposable { @@ -183,7 +177,7 @@ export class ExtensionsActivator implements IDisposable { /** * A map of already activated events to speed things up if the same activation event is triggered multiple times. */ - private readonly _alreadyActivatedEvents: { [activationEvent: string]: boolean; }; + private readonly _alreadyActivatedEvents: { [activationEvent: string]: boolean }; constructor( registry: ExtensionDescriptionRegistry, @@ -253,7 +247,7 @@ export class ExtensionsActivator implements IDisposable { * Handle semantics related to dependencies for `currentExtension`. * semantics: `redExtensions` must wait for `greenExtensions`. */ - private _handleActivateRequest(currentActivation: ActivationIdAndReason, greenExtensions: { [id: string]: ActivationIdAndReason; }, redExtensions: ActivationIdAndReason[]): void { + private _handleActivateRequest(currentActivation: ActivationIdAndReason, greenExtensions: { [id: string]: ActivationIdAndReason }, redExtensions: ActivationIdAndReason[]): void { if (this._hostExtensionsMap.has(ExtensionIdentifier.toKey(currentActivation.id))) { greenExtensions[ExtensionIdentifier.toKey(currentActivation.id)] = currentActivation; return; @@ -360,7 +354,7 @@ export class ExtensionsActivator implements IDisposable { return Promise.resolve(undefined); } - const greenMap: { [id: string]: ActivationIdAndReason; } = Object.create(null), + const greenMap: { [id: string]: ActivationIdAndReason } = Object.create(null), red: ActivationIdAndReason[] = []; for (let i = 0, len = extensions.length; i < len; i++) { diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 8586be14a72..7d9e044afcc 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -12,12 +12,13 @@ import { dispose, toDisposable, Disposable } from 'vs/base/common/lifecycle'; import { TernarySearchTree } from 'vs/base/common/map'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ILogService } from 'vs/platform/log/common/log'; -import { ExtHostExtensionServiceShape, IInitData, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape, IResolveAuthorityResult } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostExtensionServiceShape, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { IExtensionHostInitData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { ExtHostConfiguration, IExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; -import { ActivatedExtension, EmptyExtension, ExtensionActivationReason, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionModule, HostExtension, ExtensionActivationTimesFragment } from 'vs/workbench/api/common/extHostExtensionActivator'; +import { ActivatedExtension, EmptyExtension, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionModule, HostExtension, ExtensionActivationTimesFragment } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ExtHostStorage, IExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; import { ExtHostWorkspace, IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; -import { MissingExtensionDependency, ActivationKind, checkProposedApiEnabled, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; +import { MissingExtensionDependency, ActivationKind, checkProposedApiEnabled, isProposedApiEnabled, ExtensionActivationReason } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import * as errors from 'vs/base/common/errors'; import type * as vscode from 'vscode'; @@ -34,10 +35,11 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; import { Emitter, Event } from 'vs/base/common/event'; -import { IExtensionActivationHost, checkActivateWorkspaceContainsExtension } from 'vs/workbench/api/common/shared/workspaceContains'; +import { IExtensionActivationHost, checkActivateWorkspaceContainsExtension } from 'vs/workbench/services/extensions/common/workspaceContains'; import { ExtHostSecretState, IExtHostSecretState } from 'vs/workbench/api/common/exHostSecretState'; import { ExtensionSecrets } from 'vs/workbench/api/common/extHostSecrets'; import { Schemas } from 'vs/base/common/network'; +import { IResolveAuthorityResult } from 'vs/workbench/services/extensions/common/extensionHostProxy'; interface ITestRunner { /** Old test runner API, as exported from `vscode/lib/testrunner` */ @@ -60,14 +62,14 @@ export interface IHostUtils { } type TelemetryActivationEventFragment = { - id: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; - name: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; - extensionVersion: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; - publisherDisplayName: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - activationEvents: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - isBuiltin: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - reason: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - reasonId: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + id: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + name: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + extensionVersion: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + publisherDisplayName: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + activationEvents: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + isBuiltin: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + reason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + reasonId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; }; export abstract class AbstractExtHostExtensionService extends Disposable implements ExtHostExtensionServiceShape { @@ -80,7 +82,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme public readonly onDidChangeRemoteConnectionData = this._onDidChangeRemoteConnectionData.event; protected readonly _hostUtils: IHostUtils; - protected readonly _initData: IInitData; + protected readonly _initData: IExtensionHostInitData; protected readonly _extHostContext: IExtHostRpcService; protected readonly _instaService: IInstantiationService; protected readonly _extHostWorkspace: ExtHostWorkspace; @@ -105,7 +107,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme private readonly _activator: ExtensionsActivator; private _extensionPathIndex: Promise> | null; - private readonly _resolvers: { [authorityPrefix: string]: vscode.RemoteAuthorityResolver; }; + private readonly _resolvers: { [authorityPrefix: string]: vscode.RemoteAuthorityResolver }; private _started: boolean; private _remoteConnectionData: IRemoteConnectionData | null; @@ -357,11 +359,11 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme private _logExtensionActivationTimes(extensionDescription: IExtensionDescription, reason: ExtensionActivationReason, outcome: string, activationTimes?: ExtensionActivationTimes) { const event = getTelemetryActivationEvent(extensionDescription, reason); type ExtensionActivationTimesClassification = { - outcome: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + outcome: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; } & TelemetryActivationEventFragment & ExtensionActivationTimesFragment; type ExtensionActivationTimesEvent = { - outcome: string + outcome: string; } & ActivationTimesEvent & TelemetryActivationEvent; type ActivationTimesEvent = { @@ -677,7 +679,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme // -- called by main thread - private async _activateAndGetResolver(remoteAuthority: string): Promise<{ authorityPrefix: string; resolver: vscode.RemoteAuthorityResolver | undefined; }> { + private async _activateAndGetResolver(remoteAuthority: string): Promise<{ authorityPrefix: string; resolver: vscode.RemoteAuthorityResolver | undefined }> { const authorityPlusIndex = remoteAuthority.indexOf('+'); if (authorityPlusIndex === -1) { throw new Error(`Not an authority that can be resolved!`); diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index ceb0d0a549e..482fc33dbc5 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -129,7 +129,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } - registerFileSystemProvider(extension: IExtensionDescription, scheme: string, provider: vscode.FileSystemProvider, options: { isCaseSensitive?: boolean, isReadonly?: boolean; } = {}) { + registerFileSystemProvider(extension: IExtensionDescription, scheme: string, provider: vscode.FileSystemProvider, options: { isCaseSensitive?: boolean; isReadonly?: boolean } = {}) { if (this._registeredSchemes.has(scheme)) { throw new Error(`a provider for the scheme '${scheme}' is already registered`); diff --git a/src/vs/workbench/api/common/extHostFileSystemConsumer.ts b/src/vs/workbench/api/common/extHostFileSystemConsumer.ts index 6d750ef77a5..1ea7b1862da 100644 --- a/src/vs/workbench/api/common/extHostFileSystemConsumer.ts +++ b/src/vs/workbench/api/common/extHostFileSystemConsumer.ts @@ -95,7 +95,7 @@ export class ExtHostConsumerFileSystem { return ExtHostConsumerFileSystem._handleError(err); } }, - async delete(uri: vscode.Uri, options?: { recursive?: boolean; useTrash?: boolean; }): Promise { + async delete(uri: vscode.Uri, options?: { recursive?: boolean; useTrash?: boolean }): Promise { try { const provider = that._fileSystemProvider.get(uri.scheme); if (provider) { @@ -109,7 +109,7 @@ export class ExtHostConsumerFileSystem { return ExtHostConsumerFileSystem._handleError(err); } }, - async rename(oldUri: vscode.Uri, newUri: vscode.Uri, options?: { overwrite?: boolean; }): Promise { + async rename(oldUri: vscode.Uri, newUri: vscode.Uri, options?: { overwrite?: boolean }): Promise { try { // no shortcut: potentially involves different schemes, does mkdirp return await that._proxy.$rename(oldUri, newUri, { ...{ overwrite: false }, ...options }); @@ -117,7 +117,7 @@ export class ExtHostConsumerFileSystem { return ExtHostConsumerFileSystem._handleError(err); } }, - async copy(source: vscode.Uri, destination: vscode.Uri, options?: { overwrite?: boolean; }): Promise { + async copy(source: vscode.Uri, destination: vscode.Uri, options?: { overwrite?: boolean }): Promise { try { // no shortcut: potentially involves different schemes, does mkdirp return await that._proxy.$copy(source, destination, { ...{ overwrite: false }, ...options }); diff --git a/src/vs/workbench/api/common/extHostFileSystemEventService.ts b/src/vs/workbench/api/common/extHostFileSystemEventService.ts index 0f57b73fa92..ed5e1cd908a 100644 --- a/src/vs/workbench/api/common/extHostFileSystemEventService.ts +++ b/src/vs/workbench/api/common/extHostFileSystemEventService.ts @@ -248,7 +248,10 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ // concat all WorkspaceEdits collected via waitUntil-call and send them over to the renderer const dto: IWorkspaceEditDto = { edits: [] }; for (let edit of edits) { - let { edits } = typeConverter.WorkspaceEdit.from(edit, this._extHostDocumentsAndEditors); + let { edits } = typeConverter.WorkspaceEdit.from(edit, { + getTextDocumentVersion: uri => this._extHostDocumentsAndEditors.getDocument(uri)?.version, + getNotebookDocumentVersion: () => undefined, + }); dto.edits = dto.edits.concat(edits); } return { edit: dto, extensionNames: Array.from(extensionNames) }; diff --git a/src/vs/workbench/api/common/extHostInitDataService.ts b/src/vs/workbench/api/common/extHostInitDataService.ts index c318d2694d0..5b7f1ebfa03 100644 --- a/src/vs/workbench/api/common/extHostInitDataService.ts +++ b/src/vs/workbench/api/common/extHostInitDataService.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IInitData } from './extHost.protocol'; +import { IExtensionHostInitData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export const IExtHostInitDataService = createDecorator('IExtHostInitDataService'); -export interface IExtHostInitDataService extends Readonly { +export interface IExtHostInitDataService extends Readonly { readonly _serviceBrand: undefined; } diff --git a/src/vs/workbench/api/common/extHostInteractive.ts b/src/vs/workbench/api/common/extHostInteractive.ts index 4d6628ac39b..b492b0c9ed4 100644 --- a/src/vs/workbench/api/common/extHostInteractive.ts +++ b/src/vs/workbench/api/common/extHostInteractive.ts @@ -27,7 +27,7 @@ export class ExtHostInteractive implements ExtHostInteractiveShape { new ApiCommandArgument('controllerId', 'Notebook controller Id', v => true, v => v), new ApiCommandArgument('title', 'Interactive editor title', v => true, v => v) ], - new ApiCommandResult<{ notebookUri: UriComponents, inputUri: UriComponents, notebookEditorId?: string }, { notebookUri: URI, inputUri: URI, notebookEditor?: NotebookEditor }>('Notebook and input URI', (v: { notebookUri: UriComponents, inputUri: UriComponents, notebookEditorId?: string }) => { + new ApiCommandResult<{ notebookUri: UriComponents; inputUri: UriComponents; notebookEditorId?: string }, { notebookUri: URI; inputUri: URI; notebookEditor?: NotebookEditor }>('Notebook and input URI', (v: { notebookUri: UriComponents; inputUri: UriComponents; notebookEditorId?: string }) => { if (v.notebookEditorId !== undefined) { const editor = this._extHostNotebooks.getEditorById(v.notebookEditorId); return { notebookUri: URI.revive(v.notebookUri), inputUri: URI.revive(v.inputUri), notebookEditor: editor.apiEditor }; diff --git a/src/vs/workbench/api/common/extHostLanguageFeatures.ts b/src/vs/workbench/api/common/extHostLanguageFeatures.ts index b4b97013c18..57d43e8072c 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatures.ts @@ -7,9 +7,9 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { mixin } from 'vs/base/common/objects'; import type * as vscode from 'vscode'; import * as typeConvert from 'vs/workbench/api/common/extHostTypeConverters'; -import { Range, Disposable, CompletionList, SnippetString, CodeActionKind, SymbolInformation, DocumentSymbol, SemanticTokensEdits, SemanticTokens, SemanticTokensEdit, InlayHintKind, Location } from 'vs/workbench/api/common/extHostTypes'; -import { ISingleEditOperation } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import { Range, Disposable, CompletionList, SnippetString, CodeActionKind, SymbolInformation, DocumentSymbol, SemanticTokensEdits, SemanticTokens, SemanticTokensEdit, Location } from 'vs/workbench/api/common/extHostTypes'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; +import * as languages from 'vs/editor/common/languages'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; @@ -47,7 +47,7 @@ class DocumentSymbolAdapter { this._provider = provider; } - async provideDocumentSymbols(resource: URI, token: CancellationToken): Promise { + async provideDocumentSymbols(resource: URI, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const value = await this._provider.provideDocumentSymbols(doc, token); if (isFalsyOrEmpty(value)) { @@ -59,7 +59,7 @@ class DocumentSymbolAdapter { } } - private static _asDocumentSymbolTree(infos: SymbolInformation[]): modes.DocumentSymbol[] { + private static _asDocumentSymbolTree(infos: SymbolInformation[]): languages.DocumentSymbol[] { // first sort by start (and end) and then loop over all elements // and build a tree based on containment. infos = infos.slice(0).sort((a, b) => { @@ -69,10 +69,10 @@ class DocumentSymbolAdapter { } return res; }); - const res: modes.DocumentSymbol[] = []; - const parentStack: modes.DocumentSymbol[] = []; + const res: languages.DocumentSymbol[] = []; + const parentStack: languages.DocumentSymbol[] = []; for (const info of infos) { - const element: modes.DocumentSymbol = { + const element: languages.DocumentSymbol = { name: info.name || '!!MISSING: name!!', kind: typeConvert.SymbolKind.from(info.kind), tags: info.tags?.map(typeConvert.SymbolTag.from) || [], @@ -177,7 +177,7 @@ class CodeLensAdapter { } } -function convertToLocationLinks(value: vscode.Location | vscode.Location[] | vscode.LocationLink[] | undefined | null): modes.LocationLink[] { +function convertToLocationLinks(value: vscode.Location | vscode.Location[] | vscode.LocationLink[] | undefined | null): languages.LocationLink[] { if (Array.isArray(value)) { return (value).map(typeConvert.DefinitionLink.from); } else if (value) { @@ -193,7 +193,7 @@ class DefinitionAdapter { private readonly _provider: vscode.DefinitionProvider ) { } - async provideDefinition(resource: URI, position: IPosition, token: CancellationToken): Promise { + async provideDefinition(resource: URI, position: IPosition, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); const value = await this._provider.provideDefinition(doc, pos, token); @@ -208,7 +208,7 @@ class DeclarationAdapter { private readonly _provider: vscode.DeclarationProvider ) { } - async provideDeclaration(resource: URI, position: IPosition, token: CancellationToken): Promise { + async provideDeclaration(resource: URI, position: IPosition, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); const value = await this._provider.provideDeclaration(doc, pos, token); @@ -223,7 +223,7 @@ class ImplementationAdapter { private readonly _provider: vscode.ImplementationProvider ) { } - async provideImplementation(resource: URI, position: IPosition, token: CancellationToken): Promise { + async provideImplementation(resource: URI, position: IPosition, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); const value = await this._provider.provideImplementation(doc, pos, token); @@ -238,7 +238,7 @@ class TypeDefinitionAdapter { private readonly _provider: vscode.TypeDefinitionProvider ) { } - async provideTypeDefinition(resource: URI, position: IPosition, token: CancellationToken): Promise { + async provideTypeDefinition(resource: URI, position: IPosition, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); const value = await this._provider.provideTypeDefinition(doc, pos, token); @@ -253,7 +253,7 @@ class HoverAdapter { private readonly _provider: vscode.HoverProvider, ) { } - public async provideHover(resource: URI, position: IPosition, token: CancellationToken): Promise { + public async provideHover(resource: URI, position: IPosition, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); @@ -279,7 +279,7 @@ class EvaluatableExpressionAdapter { private readonly _provider: vscode.EvaluatableExpressionProvider, ) { } - async provideEvaluatableExpression(resource: URI, position: IPosition, token: CancellationToken): Promise { + async provideEvaluatableExpression(resource: URI, position: IPosition, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); @@ -299,7 +299,7 @@ class InlineValuesAdapter { private readonly _provider: vscode.InlineValuesProvider, ) { } - async provideInlineValues(resource: URI, viewPort: IRange, context: extHostProtocol.IInlineValueContextDto, token: CancellationToken): Promise { + async provideInlineValues(resource: URI, viewPort: IRange, context: extHostProtocol.IInlineValueContextDto, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const value = await this._provider.provideInlineValues(doc, typeConvert.Range.to(viewPort), typeConvert.InlineValueContext.to(context), token); if (Array.isArray(value)) { @@ -316,7 +316,7 @@ class DocumentHighlightAdapter { private readonly _provider: vscode.DocumentHighlightProvider ) { } - async provideDocumentHighlights(resource: URI, position: IPosition, token: CancellationToken): Promise { + async provideDocumentHighlights(resource: URI, position: IPosition, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); @@ -335,7 +335,7 @@ class LinkedEditingRangeAdapter { private readonly _provider: vscode.LinkedEditingRangeProvider ) { } - async provideLinkedEditingRanges(resource: URI, position: IPosition, token: CancellationToken): Promise { + async provideLinkedEditingRanges(resource: URI, position: IPosition, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); @@ -358,7 +358,7 @@ class ReferenceAdapter { private readonly _provider: vscode.ReferenceProvider ) { } - async provideReferences(resource: URI, position: IPosition, context: modes.ReferenceContext, token: CancellationToken): Promise { + async provideReferences(resource: URI, position: IPosition, context: languages.ReferenceContext, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); @@ -390,7 +390,7 @@ class CodeActionAdapter { private readonly _apiDeprecation: IExtHostApiDeprecationService, ) { } - async provideCodeActions(resource: URI, rangeOrSelection: IRange | ISelection, context: modes.CodeActionContext, token: CancellationToken): Promise { + async provideCodeActions(resource: URI, rangeOrSelection: IRange | ISelection, context: languages.CodeActionContext, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const ran = Selection.isISelection(rangeOrSelection) @@ -494,7 +494,7 @@ class DocumentFormattingAdapter { private readonly _provider: vscode.DocumentFormattingEditProvider ) { } - async provideDocumentFormattingEdits(resource: URI, options: modes.FormattingOptions, token: CancellationToken): Promise { + async provideDocumentFormattingEdits(resource: URI, options: languages.FormattingOptions, token: CancellationToken): Promise { const document = this._documents.getDocument(resource); @@ -513,7 +513,7 @@ class RangeFormattingAdapter { private readonly _provider: vscode.DocumentRangeFormattingEditProvider ) { } - async provideDocumentRangeFormattingEdits(resource: URI, range: IRange, options: modes.FormattingOptions, token: CancellationToken): Promise { + async provideDocumentRangeFormattingEdits(resource: URI, range: IRange, options: languages.FormattingOptions, token: CancellationToken): Promise { const document = this._documents.getDocument(resource); const ran = typeConvert.Range.to(range); @@ -535,7 +535,7 @@ class OnTypeFormattingAdapter { autoFormatTriggerCharacters: string[] = []; // not here - async provideOnTypeFormattingEdits(resource: URI, position: IPosition, ch: string, options: modes.FormattingOptions, token: CancellationToken): Promise { + async provideOnTypeFormattingEdits(resource: URI, position: IPosition, ch: string, options: languages.FormattingOptions, token: CancellationToken): Promise { const document = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); @@ -550,8 +550,7 @@ class OnTypeFormattingAdapter { class NavigateTypeAdapter { - private readonly _symbolCache = new Map(); - private readonly _resultCache = new Map(); + private readonly _cache = new Cache('WorkspaceSymbols'); constructor( private readonly _provider: vscode.WorkspaceSymbolProvider, @@ -559,26 +558,30 @@ class NavigateTypeAdapter { ) { } async provideWorkspaceSymbols(search: string, token: CancellationToken): Promise { - const result: extHostProtocol.IWorkspaceSymbolsDto = extHostProtocol.IdObject.mixin({ symbols: [] }); const value = await this._provider.provideWorkspaceSymbols(search, token); - if (isNonEmptyArray(value)) { - for (const item of value) { - if (!item) { - // drop - continue; - } - if (!item.name) { - this._logService.warn('INVALID SymbolInformation, lacks name', item); - continue; - } - const symbol = extHostProtocol.IdObject.mixin(typeConvert.WorkspaceSymbol.from(item)); - this._symbolCache.set(symbol._id!, item); - result.symbols.push(symbol); + + if (!isNonEmptyArray(value)) { + return { symbols: [] }; + } + + const sid = this._cache.add(value); + const result: extHostProtocol.IWorkspaceSymbolsDto = { + cacheId: sid, + symbols: [] + }; + + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (!item || !item.name) { + this._logService.warn('INVALID SymbolInformation', item); + continue; } + result.symbols.push({ + ...typeConvert.WorkspaceSymbol.from(item), + cacheId: [sid, i] + }); } - if (result.symbols.length > 0) { - this._resultCache.set(result._id!, [result.symbols[0]._id!, result.symbols[result.symbols.length - 1]._id!]); - } + return result; } @@ -586,8 +589,10 @@ class NavigateTypeAdapter { if (typeof this._provider.resolveWorkspaceSymbol !== 'function') { return symbol; } - - const item = this._symbolCache.get(symbol._id!); + if (!symbol.cacheId) { + return symbol; + } + const item = this._cache.get(...symbol.cacheId); if (item) { const value = await this._provider.resolveWorkspaceSymbol(item, token); return value && mixin(symbol, typeConvert.WorkspaceSymbol.from(value), true); @@ -596,13 +601,7 @@ class NavigateTypeAdapter { } releaseWorkspaceSymbols(id: number): any { - const range = this._resultCache.get(id); - if (range) { - for (let [from, to] = range; from <= to; from++) { - this._symbolCache.delete(from); - } - this._resultCache.delete(id); - } + this._cache.delete(id); } } @@ -641,7 +640,7 @@ class RenameAdapter { } } - async resolveRenameLocation(resource: URI, position: IPosition, token: CancellationToken): Promise<(modes.RenameLocation & modes.Rejection) | undefined> { + async resolveRenameLocation(resource: URI, position: IPosition, token: CancellationToken): Promise<(languages.RenameLocation & languages.Rejection) | undefined> { if (typeof this._provider.prepareRename !== 'function') { return Promise.resolve(undefined); } @@ -675,7 +674,7 @@ class RenameAdapter { } catch (err) { const rejectReason = RenameAdapter._asMessage(err); if (rejectReason) { - return { rejectReason, range: undefined!, text: undefined! }; + return { rejectReason, range: undefined!, text: undefined! }; } else { return Promise.reject(err); } @@ -700,9 +699,9 @@ class SemanticTokensPreviousResult { ) { } } -type RelaxedSemanticTokens = { readonly resultId?: string; readonly data: number[]; }; -type RelaxedSemanticTokensEdit = { readonly start: number; readonly deleteCount: number; readonly data?: number[]; }; -type RelaxedSemanticTokensEdits = { readonly resultId?: string; readonly edits: RelaxedSemanticTokensEdit[]; }; +type RelaxedSemanticTokens = { readonly resultId?: string; readonly data: number[] }; +type RelaxedSemanticTokensEdit = { readonly start: number; readonly deleteCount: number; readonly data?: number[] }; +type RelaxedSemanticTokensEdits = { readonly resultId?: string; readonly edits: RelaxedSemanticTokensEdit[] }; type ProvidedSemanticTokens = vscode.SemanticTokens | RelaxedSemanticTokens; type ProvidedSemanticTokensEdits = vscode.SemanticTokensEdits | RelaxedSemanticTokensEdits; @@ -885,7 +884,7 @@ class SuggestAdapter { private readonly _extension: IExtensionDescription, ) { } - async provideCompletionItems(resource: URI, position: IPosition, context: modes.CompletionContext, token: CancellationToken): Promise { + async provideCompletionItems(resource: URI, position: IPosition, context: languages.CompletionContext, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); @@ -981,7 +980,7 @@ class SuggestAdapter { [extHostProtocol.ISuggestDataDtoField.sortText]: item.sortText !== item.label ? item.sortText : undefined, [extHostProtocol.ISuggestDataDtoField.filterText]: item.filterText !== item.label ? item.filterText : undefined, [extHostProtocol.ISuggestDataDtoField.preselect]: item.preselect || undefined, - [extHostProtocol.ISuggestDataDtoField.insertTextRules]: item.keepWhitespace ? modes.CompletionItemInsertTextRule.KeepWhitespace : 0, + [extHostProtocol.ISuggestDataDtoField.insertTextRules]: item.keepWhitespace ? languages.CompletionItemInsertTextRule.KeepWhitespace : 0, [extHostProtocol.ISuggestDataDtoField.commitCharacters]: item.commitCharacters, [extHostProtocol.ISuggestDataDtoField.additionalTextEdits]: item.additionalTextEdits && item.additionalTextEdits.map(typeConvert.TextEdit.from), [extHostProtocol.ISuggestDataDtoField.command]: this._commands.toInternal(item.command, disposables), @@ -997,11 +996,11 @@ class SuggestAdapter { } else if (item.insertText instanceof SnippetString) { result[extHostProtocol.ISuggestDataDtoField.insertText] = item.insertText.value; - result[extHostProtocol.ISuggestDataDtoField.insertTextRules]! |= modes.CompletionItemInsertTextRule.InsertAsSnippet; + result[extHostProtocol.ISuggestDataDtoField.insertTextRules]! |= languages.CompletionItemInsertTextRule.InsertAsSnippet; } // 'overwrite[Before|After]'-logic - let range: vscode.Range | { inserting: vscode.Range, replacing: vscode.Range; } | undefined; + let range: vscode.Range | { inserting: vscode.Range; replacing: vscode.Range } | undefined; if (item.textEdit) { range = item.textEdit.range; } else if (item.range) { @@ -1034,7 +1033,7 @@ class InlineCompletionAdapter { private readonly _commands: CommandsConverter, ) { } - public async provideInlineCompletions(resource: URI, position: IPosition, context: modes.InlineCompletionContext, token: CancellationToken): Promise { + public async provideInlineCompletions(resource: URI, position: IPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const pos = typeConvert.Position.to(position); @@ -1070,7 +1069,7 @@ class InlineCompletionAdapter { return { pid, items: normalizedResult.items.map((item, idx) => { - let command: modes.Command | undefined = undefined; + let command: languages.Command | undefined = undefined; if (item.command) { if (!disposableStore) { disposableStore = new DisposableStore(); @@ -1084,6 +1083,7 @@ class InlineCompletionAdapter { range: item.range ? typeConvert.Range.from(item.range) : undefined, command, idx: idx, + completeBracketPairs: item.completeBracketPairs }); }), }; @@ -1236,7 +1236,7 @@ class InlayHintsAdapter { } private _isValidInlayHint(hint: vscode.InlayHint, range?: vscode.Range): boolean { - if (hint.label.length === 0 || Array.isArray(hint.label) && hint.label.every(part => part.label.length === 0)) { + if (hint.label.length === 0 || Array.isArray(hint.label) && hint.label.every(part => part.value.length === 0)) { console.log('INVALID inlay hint, empty label', hint); return false; } @@ -1257,25 +1257,27 @@ class InlayHintsAdapter { const result: extHostProtocol.IInlayHintDto = { label: '', // fill-in below cacheId: id, - tooltip: hint.tooltip && typeConvert.MarkdownString.from(hint.tooltip), + tooltip: typeConvert.MarkdownString.fromStrict(hint.tooltip), + command: hint.command && this._commands.toInternal(hint.command, disposables), position: typeConvert.Position.from(hint.position), - kind: typeConvert.InlayHintKind.from(hint.kind ?? InlayHintKind.Other), - whitespaceBefore: hint.whitespaceBefore, - whitespaceAfter: hint.whitespaceAfter, + kind: hint.kind && typeConvert.InlayHintKind.from(hint.kind), + paddingLeft: hint.paddingLeft, + paddingRight: hint.paddingRight, }; if (typeof hint.label === 'string') { result.label = hint.label; } else { result.label = hint.label.map(part => { - let r: modes.InlayHintLabelPart = { label: part.label }; - r.collapsible = part.collapsible; - if (Location.isLocation(part.action)) { - r.action = typeConvert.location.from(part.action); - } else if (part.action) { - r.action = this._commands.toInternal(part.action, disposables); + let result: languages.InlayHintLabelPart = { label: part.value }; + result.tooltip = typeConvert.MarkdownString.fromStrict(part.tooltip); + if (Location.isLocation(part.location)) { + result.location = typeConvert.location.from(part.location); } - return r; + if (part.command) { + result.command = this._commands.toInternal(part.command, disposables); + } + return result; }); } return result; @@ -1311,7 +1313,7 @@ class LinkProviderAdapter { } else { // cache links for future resolving const pid = this._cache.add(links); - const result: extHostProtocol.ILinksListDto = { links: [], id: pid }; + const result: extHostProtocol.ILinksListDto = { links: [], cacheId: pid }; for (let i = 0; i < links.length; i++) { if (!LinkProviderAdapter._validateLink(links[i])) { @@ -1376,7 +1378,7 @@ class ColorProviderAdapter { return colorInfos; } - async provideColorPresentations(resource: URI, raw: extHostProtocol.IRawColorInfo, token: CancellationToken): Promise { + async provideColorPresentations(resource: URI, raw: extHostProtocol.IRawColorInfo, token: CancellationToken): Promise { const document = this._documents.getDocument(resource); const range = typeConvert.Range.to(raw.range); const color = typeConvert.Color.to(raw.color); @@ -1395,7 +1397,7 @@ class FoldingProviderAdapter { private _provider: vscode.FoldingRangeProvider ) { } - async provideFoldingRanges(resource: URI, context: modes.FoldingContext, token: CancellationToken): Promise { + async provideFoldingRanges(resource: URI, context: languages.FoldingContext, token: CancellationToken): Promise { const doc = this._documents.getDocument(resource); const ranges = await this._provider.provideFoldingRanges(doc, context, token); if (!Array.isArray(ranges)) { @@ -1413,7 +1415,7 @@ class SelectionRangeAdapter { private readonly _logService: ILogService ) { } - async provideSelectionRanges(resource: URI, pos: IPosition[], token: CancellationToken): Promise { + async provideSelectionRanges(resource: URI, pos: IPosition[], token: CancellationToken): Promise { const document = this._documents.getDocument(resource); const positions = pos.map(typeConvert.Position.to); @@ -1425,9 +1427,9 @@ class SelectionRangeAdapter { this._logService.warn('BAD selection ranges, provider must return ranges for each position'); return []; } - const allResults: modes.SelectionRange[][] = []; + const allResults: languages.SelectionRange[][] = []; for (let i = 0; i < positions.length; i++) { - const oneResult: modes.SelectionRange[] = []; + const oneResult: languages.SelectionRange[] = []; allResults.push(oneResult); let last: vscode.Position | vscode.Range = positions[i]; @@ -1667,10 +1669,10 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF private async _withAdapter( handle: number, - ctor: { new(...args: any[]): A; }, + ctor: { new(...args: any[]): A }, callback: (adapter: A, extension: IExtensionDescription) => Promise, fallbackValue: R, - tokenToRaceAgainst?: CancellationToken + tokenToRaceAgainst: CancellationToken | undefined ): Promise { const data = this._adapter.get(handle); if (!data || !(data.adapter instanceof ctor)) { @@ -1678,7 +1680,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } const t1: number = Date.now(); - this._logService.trace(`[${data.extension.identifier.value}] INVOKE provider '${(ctor as any).name}'`); + this._logService.trace(`[${data.extension.identifier.value}] INVOKE provider '${callback.toString().replace(/[\r\n]/g, '')}'`); const result = callback(data.adapter, data.extension); @@ -1717,8 +1719,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideDocumentSymbols(handle: number, resource: UriComponents, token: CancellationToken): Promise { - return this._withAdapter(handle, DocumentSymbolAdapter, adapter => adapter.provideDocumentSymbols(URI.revive(resource), token), undefined); + $provideDocumentSymbols(handle: number, resource: UriComponents, token: CancellationToken): Promise { + return this._withAdapter(handle, DocumentSymbolAdapter, adapter => adapter.provideDocumentSymbols(URI.revive(resource), token), undefined, token); } // --- code lens @@ -1740,15 +1742,15 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $provideCodeLenses(handle: number, resource: UriComponents, token: CancellationToken): Promise { - return this._withAdapter(handle, CodeLensAdapter, adapter => adapter.provideCodeLenses(URI.revive(resource), token), undefined); + return this._withAdapter(handle, CodeLensAdapter, adapter => adapter.provideCodeLenses(URI.revive(resource), token), undefined, token); } $resolveCodeLens(handle: number, symbol: extHostProtocol.ICodeLensDto, token: CancellationToken): Promise { - return this._withAdapter(handle, CodeLensAdapter, adapter => adapter.resolveCodeLens(symbol, token), undefined); + return this._withAdapter(handle, CodeLensAdapter, adapter => adapter.resolveCodeLens(symbol, token), undefined, undefined); } $releaseCodeLenses(handle: number, cacheId: number): void { - this._withAdapter(handle, CodeLensAdapter, adapter => Promise.resolve(adapter.releaseCodeLenses(cacheId)), undefined); + this._withAdapter(handle, CodeLensAdapter, adapter => Promise.resolve(adapter.releaseCodeLenses(cacheId)), undefined, undefined); } // --- declaration @@ -1759,8 +1761,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, DefinitionAdapter, adapter => adapter.provideDefinition(URI.revive(resource), position, token), []); + $provideDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, DefinitionAdapter, adapter => adapter.provideDefinition(URI.revive(resource), position, token), [], token); } registerDeclarationProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DeclarationProvider): vscode.Disposable { @@ -1769,8 +1771,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideDeclaration(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, DeclarationAdapter, adapter => adapter.provideDeclaration(URI.revive(resource), position, token), []); + $provideDeclaration(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, DeclarationAdapter, adapter => adapter.provideDeclaration(URI.revive(resource), position, token), [], token); } registerImplementationProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.ImplementationProvider): vscode.Disposable { @@ -1779,8 +1781,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideImplementation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, ImplementationAdapter, adapter => adapter.provideImplementation(URI.revive(resource), position, token), []); + $provideImplementation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, ImplementationAdapter, adapter => adapter.provideImplementation(URI.revive(resource), position, token), [], token); } registerTypeDefinitionProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.TypeDefinitionProvider): vscode.Disposable { @@ -1789,8 +1791,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideTypeDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, TypeDefinitionAdapter, adapter => adapter.provideTypeDefinition(URI.revive(resource), position, token), []); + $provideTypeDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, TypeDefinitionAdapter, adapter => adapter.provideTypeDefinition(URI.revive(resource), position, token), [], token); } // --- extra info @@ -1801,8 +1803,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideHover(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, HoverAdapter, adapter => adapter.provideHover(URI.revive(resource), position, token), undefined); + $provideHover(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, HoverAdapter, adapter => adapter.provideHover(URI.revive(resource), position, token), undefined, token); } // --- debug hover @@ -1813,8 +1815,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideEvaluatableExpression(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, EvaluatableExpressionAdapter, adapter => adapter.provideEvaluatableExpression(URI.revive(resource), position, token), undefined); + $provideEvaluatableExpression(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, EvaluatableExpressionAdapter, adapter => adapter.provideEvaluatableExpression(URI.revive(resource), position, token), undefined, token); } // --- debug inline values @@ -1834,8 +1836,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return result; } - $provideInlineValues(handle: number, resource: UriComponents, range: IRange, context: extHostProtocol.IInlineValueContextDto, token: CancellationToken): Promise { - return this._withAdapter(handle, InlineValuesAdapter, adapter => adapter.provideInlineValues(URI.revive(resource), range, context, token), undefined); + $provideInlineValues(handle: number, resource: UriComponents, range: IRange, context: extHostProtocol.IInlineValueContextDto, token: CancellationToken): Promise { + return this._withAdapter(handle, InlineValuesAdapter, adapter => adapter.provideInlineValues(URI.revive(resource), range, context, token), undefined, token); } // --- occurrences @@ -1846,8 +1848,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideDocumentHighlights(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, DocumentHighlightAdapter, adapter => adapter.provideDocumentHighlights(URI.revive(resource), position, token), undefined); + $provideDocumentHighlights(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, DocumentHighlightAdapter, adapter => adapter.provideDocumentHighlights(URI.revive(resource), position, token), undefined, token); } // --- linked editing @@ -1868,7 +1870,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF }; } return undefined; - }, undefined); + }, undefined, token); } // --- references @@ -1879,8 +1881,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideReferences(handle: number, resource: UriComponents, position: IPosition, context: modes.ReferenceContext, token: CancellationToken): Promise { - return this._withAdapter(handle, ReferenceAdapter, adapter => adapter.provideReferences(URI.revive(resource), position, context, token), undefined); + $provideReferences(handle: number, resource: UriComponents, position: IPosition, context: languages.ReferenceContext, token: CancellationToken): Promise { + return this._withAdapter(handle, ReferenceAdapter, adapter => adapter.provideReferences(URI.revive(resource), position, context, token), undefined, token); } // --- quick fix @@ -1900,16 +1902,16 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } - $provideCodeActions(handle: number, resource: UriComponents, rangeOrSelection: IRange | ISelection, context: modes.CodeActionContext, token: CancellationToken): Promise { - return this._withAdapter(handle, CodeActionAdapter, adapter => adapter.provideCodeActions(URI.revive(resource), rangeOrSelection, context, token), undefined); + $provideCodeActions(handle: number, resource: UriComponents, rangeOrSelection: IRange | ISelection, context: languages.CodeActionContext, token: CancellationToken): Promise { + return this._withAdapter(handle, CodeActionAdapter, adapter => adapter.provideCodeActions(URI.revive(resource), rangeOrSelection, context, token), undefined, token); } $resolveCodeAction(handle: number, id: extHostProtocol.ChainedCacheId, token: CancellationToken): Promise { - return this._withAdapter(handle, CodeActionAdapter, adapter => adapter.resolveCodeAction(id, token), undefined); + return this._withAdapter(handle, CodeActionAdapter, adapter => adapter.resolveCodeAction(id, token), undefined, undefined); } $releaseCodeActions(handle: number, cacheId: number): void { - this._withAdapter(handle, CodeActionAdapter, adapter => Promise.resolve(adapter.releaseCodeActions(cacheId)), undefined); + this._withAdapter(handle, CodeActionAdapter, adapter => Promise.resolve(adapter.releaseCodeActions(cacheId)), undefined, undefined); } // --- formatting @@ -1920,8 +1922,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideDocumentFormattingEdits(handle: number, resource: UriComponents, options: modes.FormattingOptions, token: CancellationToken): Promise { - return this._withAdapter(handle, DocumentFormattingAdapter, adapter => adapter.provideDocumentFormattingEdits(URI.revive(resource), options, token), undefined); + $provideDocumentFormattingEdits(handle: number, resource: UriComponents, options: languages.FormattingOptions, token: CancellationToken): Promise { + return this._withAdapter(handle, DocumentFormattingAdapter, adapter => adapter.provideDocumentFormattingEdits(URI.revive(resource), options, token), undefined, token); } registerDocumentRangeFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentRangeFormattingEditProvider): vscode.Disposable { @@ -1930,8 +1932,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideDocumentRangeFormattingEdits(handle: number, resource: UriComponents, range: IRange, options: modes.FormattingOptions, token: CancellationToken): Promise { - return this._withAdapter(handle, RangeFormattingAdapter, adapter => adapter.provideDocumentRangeFormattingEdits(URI.revive(resource), range, options, token), undefined); + $provideDocumentRangeFormattingEdits(handle: number, resource: UriComponents, range: IRange, options: languages.FormattingOptions, token: CancellationToken): Promise { + return this._withAdapter(handle, RangeFormattingAdapter, adapter => adapter.provideDocumentRangeFormattingEdits(URI.revive(resource), range, options, token), undefined, token); } registerOnTypeFormattingEditProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.OnTypeFormattingEditProvider, triggerCharacters: string[]): vscode.Disposable { @@ -1940,8 +1942,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideOnTypeFormattingEdits(handle: number, resource: UriComponents, position: IPosition, ch: string, options: modes.FormattingOptions, token: CancellationToken): Promise { - return this._withAdapter(handle, OnTypeFormattingAdapter, adapter => adapter.provideOnTypeFormattingEdits(URI.revive(resource), position, ch, options, token), undefined); + $provideOnTypeFormattingEdits(handle: number, resource: UriComponents, position: IPosition, ch: string, options: languages.FormattingOptions, token: CancellationToken): Promise { + return this._withAdapter(handle, OnTypeFormattingAdapter, adapter => adapter.provideOnTypeFormattingEdits(URI.revive(resource), position, ch, options, token), undefined, token); } // --- navigate types @@ -1953,15 +1955,15 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $provideWorkspaceSymbols(handle: number, search: string, token: CancellationToken): Promise { - return this._withAdapter(handle, NavigateTypeAdapter, adapter => adapter.provideWorkspaceSymbols(search, token), { symbols: [] }); + return this._withAdapter(handle, NavigateTypeAdapter, adapter => adapter.provideWorkspaceSymbols(search, token), { symbols: [] }, token); } $resolveWorkspaceSymbol(handle: number, symbol: extHostProtocol.IWorkspaceSymbolDto, token: CancellationToken): Promise { - return this._withAdapter(handle, NavigateTypeAdapter, adapter => adapter.resolveWorkspaceSymbol(symbol, token), undefined); + return this._withAdapter(handle, NavigateTypeAdapter, adapter => adapter.resolveWorkspaceSymbol(symbol, token), undefined, undefined); } $releaseWorkspaceSymbols(handle: number, id: number): void { - this._withAdapter(handle, NavigateTypeAdapter, adapter => adapter.releaseWorkspaceSymbols(id), undefined); + this._withAdapter(handle, NavigateTypeAdapter, adapter => adapter.releaseWorkspaceSymbols(id), undefined, undefined); } // --- rename @@ -1973,11 +1975,11 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string, token: CancellationToken): Promise { - return this._withAdapter(handle, RenameAdapter, adapter => adapter.provideRenameEdits(URI.revive(resource), position, newName, token), undefined); + return this._withAdapter(handle, RenameAdapter, adapter => adapter.provideRenameEdits(URI.revive(resource), position, newName, token), undefined, token); } - $resolveRenameLocation(handle: number, resource: URI, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveRenameLocation(URI.revive(resource), position, token), undefined); + $resolveRenameLocation(handle: number, resource: URI, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveRenameLocation(URI.revive(resource), position, token), undefined, token); } //#region semantic coloring @@ -1997,11 +1999,11 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $provideDocumentSemanticTokens(handle: number, resource: UriComponents, previousResultId: number, token: CancellationToken): Promise { - return this._withAdapter(handle, DocumentSemanticTokensAdapter, adapter => adapter.provideDocumentSemanticTokens(URI.revive(resource), previousResultId, token), null); + return this._withAdapter(handle, DocumentSemanticTokensAdapter, adapter => adapter.provideDocumentSemanticTokens(URI.revive(resource), previousResultId, token), null, token); } $releaseDocumentSemanticTokens(handle: number, semanticColoringResultId: number): void { - this._withAdapter(handle, DocumentSemanticTokensAdapter, adapter => adapter.releaseDocumentSemanticColoring(semanticColoringResultId), undefined); + this._withAdapter(handle, DocumentSemanticTokensAdapter, adapter => adapter.releaseDocumentSemanticColoring(semanticColoringResultId), undefined, undefined); } registerDocumentRangeSemanticTokensProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentRangeSemanticTokensProvider, legend: vscode.SemanticTokensLegend): vscode.Disposable { @@ -2011,7 +2013,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $provideDocumentRangeSemanticTokens(handle: number, resource: UriComponents, range: IRange, token: CancellationToken): Promise { - return this._withAdapter(handle, DocumentRangeSemanticTokensAdapter, adapter => adapter.provideDocumentRangeSemanticTokens(URI.revive(resource), range, token), null); + return this._withAdapter(handle, DocumentRangeSemanticTokensAdapter, adapter => adapter.provideDocumentRangeSemanticTokens(URI.revive(resource), range, token), null, token); } //#endregion @@ -2024,7 +2026,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideCompletionItems(handle: number, resource: UriComponents, position: IPosition, context: modes.CompletionContext, token: CancellationToken): Promise { + $provideCompletionItems(handle: number, resource: UriComponents, position: IPosition, context: languages.CompletionContext, token: CancellationToken): Promise { return this._withAdapter(handle, SuggestAdapter, adapter => adapter.provideCompletionItems(URI.revive(resource), position, context, token), undefined, token); } @@ -2033,7 +2035,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $releaseCompletionItems(handle: number, id: number): void { - this._withAdapter(handle, SuggestAdapter, adapter => adapter.releaseCompletionItems(id), undefined); + this._withAdapter(handle, SuggestAdapter, adapter => adapter.releaseCompletionItems(id), undefined, undefined); } // --- ghost test @@ -2044,18 +2046,18 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideInlineCompletions(handle: number, resource: UriComponents, position: IPosition, context: modes.InlineCompletionContext, token: CancellationToken): Promise { - return this._withAdapter(handle, InlineCompletionAdapter, adapter => adapter.provideInlineCompletions(URI.revive(resource), position, context, token), undefined); + $provideInlineCompletions(handle: number, resource: UriComponents, position: IPosition, context: languages.InlineCompletionContext, token: CancellationToken): Promise { + return this._withAdapter(handle, InlineCompletionAdapter, adapter => adapter.provideInlineCompletions(URI.revive(resource), position, context, token), undefined, token); } $handleInlineCompletionDidShow(handle: number, pid: number, idx: number): void { this._withAdapter(handle, InlineCompletionAdapter, async adapter => { adapter.handleDidShowCompletionItem(pid, idx); - }, undefined); + }, undefined, undefined); } $freeInlineCompletionsList(handle: number, pid: number): void { - this._withAdapter(handle, InlineCompletionAdapter, async adapter => { adapter.disposeCompletions(pid); }, undefined); + this._withAdapter(handle, InlineCompletionAdapter, async adapter => { adapter.disposeCompletions(pid); }, undefined, undefined); } // --- parameter hints @@ -2071,11 +2073,11 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $provideSignatureHelp(handle: number, resource: UriComponents, position: IPosition, context: extHostProtocol.ISignatureHelpContextDto, token: CancellationToken): Promise { - return this._withAdapter(handle, SignatureHelpAdapter, adapter => adapter.provideSignatureHelp(URI.revive(resource), position, context, token), undefined); + return this._withAdapter(handle, SignatureHelpAdapter, adapter => adapter.provideSignatureHelp(URI.revive(resource), position, context, token), undefined, token); } $releaseSignatureHelp(handle: number, id: number): void { - this._withAdapter(handle, SignatureHelpAdapter, adapter => adapter.releaseSignatureHelp(id), undefined); + this._withAdapter(handle, SignatureHelpAdapter, adapter => adapter.releaseSignatureHelp(id), undefined, undefined); } // --- inline hints @@ -2085,7 +2087,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF const eventHandle = typeof provider.onDidChangeInlayHints === 'function' ? this._nextHandle() : undefined; const handle = this._addNewAdapter(new InlayHintsAdapter(this._documents, this._commands.converter, provider, this._logService, extension), extension); - this._proxy.$registerInlayHintsProvider(handle, this._transformDocumentSelector(selector), typeof provider.resolveInlayHint === 'function', eventHandle); + this._proxy.$registerInlayHintsProvider(handle, this._transformDocumentSelector(selector), typeof provider.resolveInlayHint === 'function', eventHandle, ExtHostLanguageFeatures._extLabel(extension)); let result = this._createDisposable(handle); if (eventHandle !== undefined) { @@ -2104,7 +2106,7 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $releaseInlayHints(handle: number, id: number): void { - this._withAdapter(handle, InlayHintsAdapter, adapter => adapter.releaseHints(id), undefined); + this._withAdapter(handle, InlayHintsAdapter, adapter => adapter.releaseHints(id), undefined, undefined); } // --- links @@ -2116,15 +2118,15 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $provideDocumentLinks(handle: number, resource: UriComponents, token: CancellationToken): Promise { - return this._withAdapter(handle, LinkProviderAdapter, adapter => adapter.provideLinks(URI.revive(resource), token), undefined); + return this._withAdapter(handle, LinkProviderAdapter, adapter => adapter.provideLinks(URI.revive(resource), token), undefined, token); } $resolveDocumentLink(handle: number, id: extHostProtocol.ChainedCacheId, token: CancellationToken): Promise { - return this._withAdapter(handle, LinkProviderAdapter, adapter => adapter.resolveLink(id, token), undefined); + return this._withAdapter(handle, LinkProviderAdapter, adapter => adapter.resolveLink(id, token), undefined, undefined); } $releaseDocumentLinks(handle: number, id: number): void { - this._withAdapter(handle, LinkProviderAdapter, adapter => adapter.releaseLinks(id), undefined); + this._withAdapter(handle, LinkProviderAdapter, adapter => adapter.releaseLinks(id), undefined, undefined); } registerColorProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable { @@ -2134,11 +2136,11 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $provideDocumentColors(handle: number, resource: UriComponents, token: CancellationToken): Promise { - return this._withAdapter(handle, ColorProviderAdapter, adapter => adapter.provideColors(URI.revive(resource), token), []); + return this._withAdapter(handle, ColorProviderAdapter, adapter => adapter.provideColors(URI.revive(resource), token), [], token); } - $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: extHostProtocol.IRawColorInfo, token: CancellationToken): Promise { - return this._withAdapter(handle, ColorProviderAdapter, adapter => adapter.provideColorPresentations(URI.revive(resource), colorInfo, token), undefined); + $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: extHostProtocol.IRawColorInfo, token: CancellationToken): Promise { + return this._withAdapter(handle, ColorProviderAdapter, adapter => adapter.provideColorPresentations(URI.revive(resource), colorInfo, token), undefined, token); } registerFoldingRangeProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable { @@ -2157,8 +2159,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return result; } - $provideFoldingRanges(handle: number, resource: UriComponents, context: vscode.FoldingContext, token: CancellationToken): Promise { - return this._withAdapter(handle, FoldingProviderAdapter, adapter => adapter.provideFoldingRanges(URI.revive(resource), context, token), undefined); + $provideFoldingRanges(handle: number, resource: UriComponents, context: vscode.FoldingContext, token: CancellationToken): Promise { + return this._withAdapter(handle, FoldingProviderAdapter, adapter => adapter.provideFoldingRanges(URI.revive(resource), context, token), undefined, token); } // --- smart select @@ -2169,8 +2171,8 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF return this._createDisposable(handle); } - $provideSelectionRanges(handle: number, resource: UriComponents, positions: IPosition[], token: CancellationToken): Promise { - return this._withAdapter(handle, SelectionRangeAdapter, adapter => adapter.provideSelectionRanges(URI.revive(resource), positions, token), []); + $provideSelectionRanges(handle: number, resource: UriComponents, positions: IPosition[], token: CancellationToken): Promise { + return this._withAdapter(handle, SelectionRangeAdapter, adapter => adapter.provideSelectionRanges(URI.revive(resource), positions, token), [], token); } // --- call hierarchy @@ -2182,19 +2184,19 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $prepareCallHierarchy(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, CallHierarchyAdapter, adapter => Promise.resolve(adapter.prepareSession(URI.revive(resource), position, token)), undefined); + return this._withAdapter(handle, CallHierarchyAdapter, adapter => Promise.resolve(adapter.prepareSession(URI.revive(resource), position, token)), undefined, token); } $provideCallHierarchyIncomingCalls(handle: number, sessionId: string, itemId: string, token: CancellationToken): Promise { - return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallsTo(sessionId, itemId, token), undefined); + return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallsTo(sessionId, itemId, token), undefined, token); } $provideCallHierarchyOutgoingCalls(handle: number, sessionId: string, itemId: string, token: CancellationToken): Promise { - return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallsFrom(sessionId, itemId, token), undefined); + return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallsFrom(sessionId, itemId, token), undefined, token); } $releaseCallHierarchy(handle: number, sessionId: string): void { - this._withAdapter(handle, CallHierarchyAdapter, adapter => Promise.resolve(adapter.releaseSession(sessionId)), undefined); + this._withAdapter(handle, CallHierarchyAdapter, adapter => Promise.resolve(adapter.releaseSession(sessionId)), undefined, undefined); } // --- type hierarchy @@ -2205,19 +2207,19 @@ export class ExtHostLanguageFeatures implements extHostProtocol.ExtHostLanguageF } $prepareTypeHierarchy(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { - return this._withAdapter(handle, TypeHierarchyAdapter, adapter => Promise.resolve(adapter.prepareSession(URI.revive(resource), position, token)), undefined); + return this._withAdapter(handle, TypeHierarchyAdapter, adapter => Promise.resolve(adapter.prepareSession(URI.revive(resource), position, token)), undefined, token); } $provideTypeHierarchySupertypes(handle: number, sessionId: string, itemId: string, token: CancellationToken): Promise { - return this._withAdapter(handle, TypeHierarchyAdapter, adapter => adapter.provideSupertypes(sessionId, itemId, token), undefined); + return this._withAdapter(handle, TypeHierarchyAdapter, adapter => adapter.provideSupertypes(sessionId, itemId, token), undefined, token); } $provideTypeHierarchySubtypes(handle: number, sessionId: string, itemId: string, token: CancellationToken): Promise { - return this._withAdapter(handle, TypeHierarchyAdapter, adapter => adapter.provideSubtypes(sessionId, itemId, token), undefined); + return this._withAdapter(handle, TypeHierarchyAdapter, adapter => adapter.provideSubtypes(sessionId, itemId, token), undefined, token); } $releaseTypeHierarchy(handle: number, sessionId: string): void { - this._withAdapter(handle, TypeHierarchyAdapter, adapter => Promise.resolve(adapter.releaseSession(sessionId)), undefined); + this._withAdapter(handle, TypeHierarchyAdapter, adapter => Promise.resolve(adapter.releaseSession(sessionId)), undefined, undefined); } // --- configuration diff --git a/src/vs/workbench/api/common/extHostMemento.ts b/src/vs/workbench/api/common/extHostMemento.ts index 303e1ca90bc..b18c4fce9ac 100644 --- a/src/vs/workbench/api/common/extHostMemento.ts +++ b/src/vs/workbench/api/common/extHostMemento.ts @@ -16,7 +16,7 @@ export class ExtensionMemento implements vscode.Memento { protected readonly _storage: ExtHostStorage; private readonly _init: Promise; - private _value?: { [n: string]: any; }; + private _value?: { [n: string]: any }; private readonly _storageListener: IDisposable; private _deferredPromises: Map> = new Map(); diff --git a/src/vs/workbench/api/common/extHostMessageService.ts b/src/vs/workbench/api/common/extHostMessageService.ts index a9a9c5b6e17..93f71893ee7 100644 --- a/src/vs/workbench/api/common/extHostMessageService.ts +++ b/src/vs/workbench/api/common/extHostMessageService.ts @@ -49,7 +49,7 @@ export class ExtHostMessageService { checkProposedApiEnabled(extension, 'resolvers'); } - const commands: { title: string; isCloseAffordance: boolean; handle: number; }[] = []; + const commands: { title: string; isCloseAffordance: boolean; handle: number }[] = []; for (let handle = 0; handle < items.length; handle++) { const command = items[handle]; diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 62a9af86b00..8bd8f2fe050 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -225,7 +225,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape { }); } - async createNotebookDocument(options: { viewType: string, content?: vscode.NotebookData }): Promise { + async createNotebookDocument(options: { viewType: string; content?: vscode.NotebookData }): Promise { const canonicalUri = await this._notebookDocumentsProxy.$tryCreateNotebook({ viewType: options.viewType, content: options.content && typeConverters.NotebookData.from(options.content) diff --git a/src/vs/workbench/api/common/extHostNotebookConcatDocument.ts b/src/vs/workbench/api/common/extHostNotebookConcatDocument.ts index d92dfc8b9e6..68e2df69964 100644 --- a/src/vs/workbench/api/common/extHostNotebookConcatDocument.ts +++ b/src/vs/workbench/api/common/extHostNotebookConcatDocument.ts @@ -8,9 +8,9 @@ import * as vscode from 'vscode'; import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostNotebookController } from 'vs/workbench/api/common/extHostNotebook'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; -import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; +import { PrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { score } from 'vs/editor/common/languages/languageSelector'; +import { score } from 'vs/editor/common/languageSelector'; import { ResourceMap } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; diff --git a/src/vs/workbench/api/common/extHostNotebookKernels.ts b/src/vs/workbench/api/common/extHostNotebookKernels.ts index 0205f542e1c..493f691ec34 100644 --- a/src/vs/workbench/api/common/extHostNotebookKernels.ts +++ b/src/vs/workbench/api/common/extHostNotebookKernels.ts @@ -16,10 +16,10 @@ import { ExtHostNotebookKernelsShape, ICellExecuteUpdateDto, IMainContext, INote import { ApiCommand, ApiCommandArgument, ApiCommandResult, ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; import { ExtHostNotebookController } from 'vs/workbench/api/common/extHostNotebook'; -import { ExtHostCell, ExtHostNotebookDocument } from 'vs/workbench/api/common/extHostNotebookDocument'; +import { ExtHostCell } from 'vs/workbench/api/common/extHostNotebookDocument'; import * as extHostTypeConverters from 'vs/workbench/api/common/extHostTypeConverters'; -import { NotebookCellOutput, NotebookCellExecutionState as ExtHostNotebookCellExecutionState } from 'vs/workbench/api/common/extHostTypes'; -import { asWebviewUri } from 'vs/workbench/api/common/shared/webview'; +import { NotebookCellExecutionState as ExtHostNotebookCellExecutionState, NotebookCellOutput } from 'vs/workbench/api/common/extHostTypes'; +import { asWebviewUri } from 'vs/workbench/common/webview'; import { NotebookCellExecutionState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CellExecutionUpdateType } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; import { checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; @@ -27,16 +27,16 @@ import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/ import * as vscode from 'vscode'; interface IKernelData { - extensionId: ExtensionIdentifier, + extensionId: ExtensionIdentifier; controller: vscode.NotebookController; - onDidChangeSelection: Emitter<{ selected: boolean; notebook: vscode.NotebookDocument; }>; - onDidReceiveMessage: Emitter<{ editor: vscode.NotebookEditor, message: any; }>; + onDidChangeSelection: Emitter<{ selected: boolean; notebook: vscode.NotebookDocument }>; + onDidReceiveMessage: Emitter<{ editor: vscode.NotebookEditor; message: any }>; associatedNotebooks: ResourceMap; } type ExtHostSelectKernelArgs = ControllerInfo | { notebookEditor: vscode.NotebookEditor } | ControllerInfo & { notebookEditor: vscode.NotebookEditor } | undefined; export type SelectKernelReturnArgs = ControllerInfo | { notebookEditorId: string } | ControllerInfo & { notebookEditorId: string } | undefined; -type ControllerInfo = { id: string, extension: string }; +type ControllerInfo = { id: string; extension: string }; export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape { @@ -104,11 +104,11 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape { let isDisposed = false; const commandDisposables = new DisposableStore(); - const onDidChangeSelection = new Emitter<{ selected: boolean, notebook: vscode.NotebookDocument; }>(); - const onDidReceiveMessage = new Emitter<{ editor: vscode.NotebookEditor, message: any; }>(); + const onDidChangeSelection = new Emitter<{ selected: boolean; notebook: vscode.NotebookDocument }>(); + const onDidReceiveMessage = new Emitter<{ editor: vscode.NotebookEditor; message: any }>(); const data: INotebookKernelDto2 = { - id: `${extension.identifier.value}/${id}`, + id: createKernelId(extension, id), notebookType: viewType, extensionId: extension.identifier, extensionLocation: extension.extensionLocation, @@ -218,7 +218,7 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape { that._logService.trace(`NotebookController[${handle}] NOT associated to notebook, associated to THESE notebooks:`, Array.from(associatedNotebooks.keys()).map(u => u.toString())); throw new Error(`notebook controller is NOT associated to notebook: ${cell.notebook.uri.toString()}`); } - return that._createNotebookCellExecution(cell); + return that._createNotebookCellExecution(cell, createKernelId(extension, this.id)); }, dispose: () => { if (!isDisposed) { @@ -348,7 +348,7 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape { // --- - _createNotebookCellExecution(cell: vscode.NotebookCell): vscode.NotebookCellExecution { + _createNotebookCellExecution(cell: vscode.NotebookCell, controllerId: string): vscode.NotebookCellExecution { if (cell.index < 0) { throw new Error('CANNOT execute cell that has been REMOVED from notebook'); } @@ -360,7 +360,7 @@ export class ExtHostNotebookKernels implements ExtHostNotebookKernelsShape { if (this._activeExecutions.has(cellObj.uri)) { throw new Error(`duplicate execution for ${cellObj.uri}`); } - const execution = new NotebookCellExecutionTask(cellObj.notebook, cellObj, this._proxy); + const execution = new NotebookCellExecutionTask(controllerId, cellObj, this._proxy); this._activeExecutions.set(cellObj.uri, execution); const listener = execution.onDidChangeState(() => { if (execution.state === NotebookCellExecutionTaskState.Resolved) { @@ -381,6 +381,9 @@ enum NotebookCellExecutionTaskState { } class NotebookCellExecutionTask extends Disposable { + private static HANDLE = 0; + private _handle = NotebookCellExecutionTask.HANDLE++; + private _onDidChangeState = new Emitter(); readonly onDidChangeState = this._onDidChangeState.event; @@ -394,7 +397,7 @@ class NotebookCellExecutionTask extends Disposable { private _executionOrder: number | undefined; constructor( - private readonly _document: ExtHostNotebookDocument, + controllerId: string, private readonly _cell: ExtHostCell, private readonly _proxy: MainThreadNotebookKernelsShape ) { @@ -403,7 +406,7 @@ class NotebookCellExecutionTask extends Disposable { this._collector = new TimeoutBasedCollector(10, updates => this.update(updates)); this._executionOrder = _cell.internalMetadata.executionOrder; - this._proxy.$addExecution(this._cell.notebook.uri, this._cell.handle); + this._proxy.$createExecution(this._handle, controllerId, this._cell.notebook.uri, this._cell.handle); } cancel(): void { @@ -416,7 +419,7 @@ class NotebookCellExecutionTask extends Disposable { private async update(update: ICellExecuteUpdateDto | ICellExecuteUpdateDto[]): Promise { const updates = Array.isArray(update) ? update : [update]; - return this._proxy.$updateExecutions(new SerializableObjectWithBuffers(updates)); + return this._proxy.$updateExecution(this._handle, new SerializableObjectWithBuffers(updates)); } private verifyStateForOutput() { @@ -429,17 +432,6 @@ class NotebookCellExecutionTask extends Disposable { } } - private cellIndexToHandle(cellOrCellIndex: vscode.NotebookCell | undefined): number { - let cell: ExtHostCell | undefined = this._cell; - if (cellOrCellIndex) { - cell = this._document.getCellFromApiCell(cellOrCellIndex); - } - if (!cell) { - throw new Error('INVALID cell'); - } - return cell.handle; - } - private validateAndConvertOutputs(items: vscode.NotebookCellOutput[]): NotebookOutputDto[] { return items.map(output => { const newOutput = NotebookCellOutput.ensureUniqueMimeTypes(output.items, true); @@ -455,13 +447,10 @@ class NotebookCellExecutionTask extends Disposable { } private async updateOutputs(outputs: vscode.NotebookCellOutput | vscode.NotebookCellOutput[], cell: vscode.NotebookCell | undefined, append: boolean): Promise { - const handle = this.cellIndexToHandle(cell); const outputDtos = this.validateAndConvertOutputs(asArray(outputs)); return this.updateSoon( { editType: CellExecutionUpdateType.Output, - uri: this._document.uri, - cellHandle: handle, append, outputs: outputDtos }); @@ -471,8 +460,6 @@ class NotebookCellExecutionTask extends Disposable { items = NotebookCellOutput.ensureUniqueMimeTypes(asArray(items), true); return this.updateSoon({ editType: CellExecutionUpdateType.OutputItems, - uri: this._document.uri, - cellHandle: this._cell.handle, items: items.map(extHostTypeConverters.NotebookCellOutputItem.from), outputId: output.id, append @@ -489,8 +476,6 @@ class NotebookCellExecutionTask extends Disposable { that._executionOrder = v; that.update([{ editType: CellExecutionUpdateType.ExecutionState, - uri: that._document.uri, - cellHandle: that._cell.handle, executionOrder: that._executionOrder }]); }, @@ -505,8 +490,6 @@ class NotebookCellExecutionTask extends Disposable { that.update({ editType: CellExecutionUpdateType.ExecutionState, - uri: that._document.uri, - cellHandle: that._cell.handle, runStartTime: startTime }); }, @@ -523,9 +506,7 @@ class NotebookCellExecutionTask extends Disposable { // so we use updateSoon and immediately flush. that._collector.flush(); - that._proxy.$completeExecution(that._document.uri, that._cell.handle, new SerializableObjectWithBuffers({ - uri: that._document.uri, - cellHandle: that._cell.handle, + that._proxy.$completeExecution(that._handle, new SerializableObjectWithBuffers({ runEndTime: endTime, lastRunSuccess: success })); @@ -601,3 +582,7 @@ class TimeoutBasedCollector { .finally(() => deferred.complete()); } } + +function createKernelId(extension: IExtensionDescription, id: string): string { + return `${extension.identifier.value}/${id}`; +} diff --git a/src/vs/workbench/api/common/extHostNotebookRenderers.ts b/src/vs/workbench/api/common/extHostNotebookRenderers.ts index 3cc008e1010..1b8925f8757 100644 --- a/src/vs/workbench/api/common/extHostNotebookRenderers.ts +++ b/src/vs/workbench/api/common/extHostNotebookRenderers.ts @@ -13,7 +13,7 @@ import * as vscode from 'vscode'; export class ExtHostNotebookRenderers implements ExtHostNotebookRenderersShape { - private readonly _rendererMessageEmitters = new Map>(); + private readonly _rendererMessageEmitters = new Map>(); private readonly proxy: MainThreadNotebookRenderersShape; constructor(mainContext: IMainContext, private readonly _extHostNotebook: ExtHostNotebookController) { @@ -37,7 +37,7 @@ export class ExtHostNotebookRenderers implements ExtHostNotebookRenderersShape { const messaging: vscode.NotebookRendererMessaging = { onDidReceiveMessage: (listener, thisArg, disposables) => { - const wrappedListener = notebookEditorVisible ? listener : (evt: { editor: vscode.NotebookEditor, message: any }) => { + const wrappedListener = notebookEditorVisible ? listener : (evt: { editor: vscode.NotebookEditor; message: any }) => { const obj = {}; notebookEditorAliases.set(obj, evt.editor); listener({ editor: obj as vscode.NotebookEditor, message: evt.message }); diff --git a/src/vs/workbench/api/common/extHostQuickOpen.ts b/src/vs/workbench/api/common/extHostQuickOpen.ts index 1e9445a3506..a2f6efd3cbc 100644 --- a/src/vs/workbench/api/common/extHostQuickOpen.ts +++ b/src/vs/workbench/api/common/extHostQuickOpen.ts @@ -18,12 +18,11 @@ import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensio import { coalesce } from 'vs/base/common/arrays'; import Severity from 'vs/base/common/severity'; import { ThemeIcon as ThemeIconUtils } from 'vs/platform/theme/common/themeService'; -import { checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; export type Item = string | QuickPickItem; export interface ExtHostQuickOpen { - showQuickPick(itemsOrItemsPromise: QuickPickItem[] | Promise, options: QuickPickOptions & { canPickMany: true; }, token?: CancellationToken): Promise; + showQuickPick(itemsOrItemsPromise: QuickPickItem[] | Promise, options: QuickPickOptions & { canPickMany: true }, token?: CancellationToken): Promise; showQuickPick(itemsOrItemsPromise: string[] | Promise, options?: QuickPickOptions, token?: CancellationToken): Promise; showQuickPick(itemsOrItemsPromise: QuickPickItem[] | Promise, options?: QuickPickOptions, token?: CancellationToken): Promise; showQuickPick(itemsOrItemsPromise: Item[] | Promise, options?: QuickPickOptions, token?: CancellationToken): Promise; @@ -57,7 +56,7 @@ export function createExtHostQuickOpen(mainContext: IMainContext, workspace: IEx this._commands = commands; } - showQuickPick(itemsOrItemsPromise: QuickPickItem[] | Promise, options: QuickPickOptions & { canPickMany: true; }, token?: CancellationToken): Promise; + showQuickPick(itemsOrItemsPromise: QuickPickItem[] | Promise, options: QuickPickOptions & { canPickMany: true }, token?: CancellationToken): Promise; showQuickPick(itemsOrItemsPromise: string[] | Promise, options?: QuickPickOptions, token?: CancellationToken): Promise; showQuickPick(itemsOrItemsPromise: QuickPickItem[] | Promise, options?: QuickPickOptions, token?: CancellationToken): Promise; showQuickPick(itemsOrItemsPromise: Item[] | Promise, options?: QuickPickOptions, token: CancellationToken = CancellationToken.None): Promise { @@ -469,12 +468,12 @@ export function createExtHostQuickOpen(mainContext: IMainContext, workspace: IEx } } - function getIconUris(iconPath: QuickInputButton['iconPath']): { dark: URI, light?: URI; } | { id: string; } { + function getIconUris(iconPath: QuickInputButton['iconPath']): { dark: URI; light?: URI } | { id: string } { if (iconPath instanceof ThemeIcon) { return { id: iconPath.id }; } - const dark = getDarkIconUri(iconPath as URI | { light: URI; dark: URI; }); - const light = getLightIconUri(iconPath as URI | { light: URI; dark: URI; }); + const dark = getDarkIconUri(iconPath as URI | { light: URI; dark: URI }); + const light = getLightIconUri(iconPath as URI | { light: URI; dark: URI }); // Tolerate strings: https://github.com/microsoft/vscode/issues/110432#issuecomment-726144556 return { dark: typeof dark === 'string' ? URI.file(dark) : dark, @@ -482,17 +481,17 @@ export function createExtHostQuickOpen(mainContext: IMainContext, workspace: IEx }; } - function getLightIconUri(iconPath: URI | { light: URI; dark: URI; }) { + function getLightIconUri(iconPath: URI | { light: URI; dark: URI }) { return typeof iconPath === 'object' && 'light' in iconPath ? iconPath.light : iconPath; } - function getDarkIconUri(iconPath: URI | { light: URI; dark: URI; }) { + function getDarkIconUri(iconPath: URI | { light: URI; dark: URI }) { return typeof iconPath === 'object' && 'dark' in iconPath ? iconPath.dark : iconPath; } function getIconPathOrClass(button: QuickInputButton) { const iconPathOrIconClass = getIconUris(button.iconPath); - let iconPath: { dark: URI; light?: URI | undefined; } | undefined; + let iconPath: { dark: URI; light?: URI | undefined } | undefined; let iconClass: string | undefined; if ('id' in iconPathOrIconClass) { iconClass = ThemeIconUtils.asClassName(iconPathOrIconClass); @@ -522,8 +521,7 @@ export function createExtHostQuickOpen(mainContext: IMainContext, workspace: IEx private readonly _onDidChangeSelectionEmitter = new Emitter(); private readonly _onDidTriggerItemButtonEmitter = new Emitter>(); - // TODO: revert this change once quickPickSeparators has been finalized. - constructor(private readonly extension: IExtensionDescription, onDispose: () => void) { + constructor(extension: IExtensionDescription, onDispose: () => void) { super(extension.identifier, onDispose); this._disposables.push( this._onDidChangeActiveEmitter, @@ -538,10 +536,6 @@ export function createExtHostQuickOpen(mainContext: IMainContext, workspace: IEx } set items(items: T[]) { - if (items.some((item) => item.kind !== undefined)) { - checkProposedApiEnabled(this.extension, 'quickPickSeparators'); - } - this._items = items.slice(); this._handlesToItems.clear(); this._itemsToHandles.clear(); diff --git a/src/vs/workbench/api/common/extHostRequireInterceptor.ts b/src/vs/workbench/api/common/extHostRequireInterceptor.ts index 9cc572c7e7c..9ce9a8f402f 100644 --- a/src/vs/workbench/api/common/extHostRequireInterceptor.ts +++ b/src/vs/workbench/api/common/extHostRequireInterceptor.ts @@ -100,6 +100,7 @@ class NodeModuleAliasingModuleFactory implements IAlternativeModuleProvider { */ private static readonly aliased: ReadonlyMap = new Map([ ['vscode-ripgrep', '@vscode/ripgrep'], + ['vscode-windows-registry', '@vscode/windows-registry'], ]); private readonly re?: RegExp; @@ -196,7 +197,7 @@ interface IKeytarModule { setPassword(service: string, account: string, password: string): Promise; deletePassword(service: string, account: string): Promise; findPassword(service: string): Promise; - findCredentials(service: string): Promise>; + findCredentials(service: string): Promise>; } class KeytarNodeModuleFactory implements INodeModuleFactory { @@ -241,7 +242,7 @@ class KeytarNodeModuleFactory implements INodeModuleFactory { findPassword: (service: string): Promise => { return mainThreadKeytar.$findPassword(service); }, - findCredentials(service: string): Promise> { + findCredentials(service: string): Promise> { return mainThreadKeytar.$findCredentials(service); } }; @@ -250,7 +251,7 @@ class KeytarNodeModuleFactory implements INodeModuleFactory { public load(_request: string, parent: URI): any { const ext = this._extensionPaths.findSubstr(parent); type ShimmingKeytarClassification = { - extension: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + extension: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; this._mainThreadTelemetry.$publicLog2<{ extension: string }, ShimmingKeytarClassification>('shimming.keytar', { extension: ext?.identifier.value ?? 'unknown_extension' }); return this._impl; @@ -347,7 +348,7 @@ class OpenNodeModuleFactory implements INodeModuleFactory { return; } type ShimmingOpenClassification = { - extension: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + extension: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; this._mainThreadTelemetry.$publicLog2<{ extension: string }, ShimmingOpenClassification>('shimming.open', { extension: this._extensionId }); } @@ -357,7 +358,7 @@ class OpenNodeModuleFactory implements INodeModuleFactory { return; } type ShimmingOpenCallNoForwardClassification = { - extension: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + extension: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; this._mainThreadTelemetry.$publicLog2<{ extension: string }, ShimmingOpenCallNoForwardClassification>('shimming.open.call.noForward', { extension: this._extensionId }); } diff --git a/src/vs/workbench/api/common/extHostSCM.ts b/src/vs/workbench/api/common/extHostSCM.ts index 8a9effffd6b..7be4469168d 100644 --- a/src/vs/workbench/api/common/extHostSCM.ts +++ b/src/vs/workbench/api/common/extHostSCM.ts @@ -362,7 +362,7 @@ class ExtHostSourceControlResourceGroup implements vscode.SourceControlResourceG const snapshot = [...this._resourceStates].sort(compareResourceStates); const diffs = sortedDiff(this._resourceSnapshot, snapshot, compareResourceStates); - const splices = diffs.map>(diff => { + const splices = diffs.map>(diff => { const toInsert = diff.toInsert.map(r => { const handle = this._resourceHandlePool++; this._resourceStatesMap.set(handle, r); @@ -506,18 +506,22 @@ class ExtHostSourceControl implements vscode.SourceControl { } private _actionButtonDisposables = new MutableDisposable(); - private _actionButton: vscode.Command | undefined; - get actionButton(): vscode.Command | undefined { + private _actionButton: vscode.SourceControlActionButton | undefined; + get actionButton(): vscode.SourceControlActionButton | undefined { checkProposedApiEnabled(this._extension, 'scmActionButton'); return this._actionButton; } - set actionButton(actionButton: vscode.Command | undefined) { + set actionButton(actionButton: vscode.SourceControlActionButton | undefined) { checkProposedApiEnabled(this._extension, 'scmActionButton'); this._actionButtonDisposables.value = new DisposableStore(); this._actionButton = actionButton; - const internal = actionButton !== undefined ? this._commands.converter.toInternal(this._actionButton, this._actionButtonDisposables.value) : undefined; + const internal = actionButton !== undefined ? + { + command: this._commands.converter.toInternal(actionButton.command, this._actionButtonDisposables.value), + description: actionButton.description + } : undefined; this.#proxy.$updateSourceControl(this.handle, { actionButton: internal ?? null }); } @@ -717,8 +721,8 @@ export class ExtHostSCM implements ExtHostSCMShape { createSourceControl(extension: IExtensionDescription, id: string, label: string, rootUri: vscode.Uri | undefined): vscode.SourceControl { this.logService.trace('ExtHostSCM#createSourceControl', extension.identifier.value, id, label, rootUri); - type TEvent = { extensionId: string; }; - type TMeta = { extensionId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; }; + type TEvent = { extensionId: string }; + type TMeta = { extensionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' } }; this._telemetry.$publicLog2('api/scm/createSourceControl', { extensionId: extension.identifier.value, }); diff --git a/src/vs/workbench/api/common/extHostStatusBar.ts b/src/vs/workbench/api/common/extHostStatusBar.ts index 03e90708205..a9076f1e20f 100644 --- a/src/vs/workbench/api/common/extHostStatusBar.ts +++ b/src/vs/workbench/api/common/extHostStatusBar.ts @@ -45,8 +45,8 @@ export class ExtHostStatusBarEntry implements vscode.StatusBarItem { private _backgroundColor?: ThemeColor; private readonly _internalCommandRegistration = new DisposableStore(); private _command?: { - readonly fromApi: string | vscode.Command, - readonly internal: ICommandDto, + readonly fromApi: string | vscode.Command; + readonly internal: ICommandDto; }; private _timeoutHandle: any; @@ -234,7 +234,7 @@ export class ExtHostStatusBarEntry implements vscode.StatusBarItem { color = ExtHostStatusBarEntry.ALLOWED_BACKGROUND_COLORS.get(this._backgroundColor.id); } - const tooltip = this._tooltip ? MarkdownString.fromStrict(this._tooltip) : undefined; + const tooltip = MarkdownString.fromStrict(this._tooltip); // Set to status bar this.#proxy.$setEntry(this._entryId, id, name, this._text, tooltip, this._command?.internal, color, diff --git a/src/vs/workbench/api/common/extHostStoragePaths.ts b/src/vs/workbench/api/common/extHostStoragePaths.ts index e5039299165..71342224211 100644 --- a/src/vs/workbench/api/common/extHostStoragePaths.ts +++ b/src/vs/workbench/api/common/extHostStoragePaths.ts @@ -7,7 +7,7 @@ import { IExtensionDescription } from 'vs/platform/extensions/common/extensions' import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; import { ILogService } from 'vs/platform/log/common/log'; -import { IEnvironment, IStaticWorkspaceData } from 'vs/workbench/api/common/extHost.protocol'; +import { IEnvironment, IStaticWorkspaceData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { IExtHostConsumerFileSystem } from 'vs/workbench/api/common/extHostFileSystemConsumer'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/common/extHostTask.ts b/src/vs/workbench/api/common/extHostTask.ts index baceec91f5c..37758d0d220 100644 --- a/src/vs/workbench/api/common/extHostTask.ts +++ b/src/vs/workbench/api/common/extHostTask.ts @@ -541,9 +541,9 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape, IExtHostTask }); } - protected abstract provideTasksInternal(validTypes: { [key: string]: boolean; }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[], extension: IExtensionDescription }; + protected abstract provideTasksInternal(validTypes: { [key: string]: boolean }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[]; extension: IExtensionDescription }; - public $provideTasks(handle: number, validTypes: { [key: string]: boolean; }): Thenable { + public $provideTasks(handle: number, validTypes: { [key: string]: boolean }): Promise { const handler = this._handlers.get(handle); if (!handler) { return Promise.reject(new Error('no handler found')); @@ -611,7 +611,7 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape, IExtHostTask return await this.resolveTaskInternal(resolvedTaskDTO); } - public abstract $resolveVariables(uriComponents: UriComponents, toResolve: { process?: { name: string; cwd?: string; path?: string }, variables: string[] }): Promise<{ process?: string, variables: { [key: string]: string; } }>; + public abstract $resolveVariables(uriComponents: UriComponents, toResolve: { process?: { name: string; cwd?: string; path?: string }; variables: string[] }): Promise<{ process?: string; variables: { [key: string]: string } }>; private nextHandle(): number { return this._handleCounter++; @@ -747,7 +747,7 @@ export class WorkerExtHostTask extends ExtHostTaskBase { return execution; } - protected provideTasksInternal(validTypes: { [key: string]: boolean; }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[], extension: IExtensionDescription } { + protected provideTasksInternal(validTypes: { [key: string]: boolean }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[]; extension: IExtensionDescription } { const taskDTOs: tasks.TaskDTO[] = []; if (value) { for (let task of value) { @@ -783,7 +783,7 @@ export class WorkerExtHostTask extends ExtHostTaskBase { return undefined; } - public async $resolveVariables(uriComponents: UriComponents, toResolve: { process?: { name: string; cwd?: string; path?: string }, variables: string[] }): Promise<{ process?: string, variables: { [key: string]: string; } }> { + public async $resolveVariables(uriComponents: UriComponents, toResolve: { process?: { name: string; cwd?: string; path?: string }; variables: string[] }): Promise<{ process?: string; variables: { [key: string]: string } }> { const result = { process: undefined as string, variables: Object.create(null) diff --git a/src/vs/workbench/api/common/extHostTelemetry.ts b/src/vs/workbench/api/common/extHostTelemetry.ts index 2d14c450b17..5136b494011 100644 --- a/src/vs/workbench/api/common/extHostTelemetry.ts +++ b/src/vs/workbench/api/common/extHostTelemetry.ts @@ -6,24 +6,42 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostTelemetryShape } from 'vs/workbench/api/common/extHost.protocol'; +import { TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; +import type { TelemetryConfiguration } from 'vscode'; export class ExtHostTelemetry implements ExtHostTelemetryShape { private readonly _onDidChangeTelemetryEnabled = new Emitter(); readonly onDidChangeTelemetryEnabled: Event = this._onDidChangeTelemetryEnabled.event; - private _enabled: boolean = false; + private readonly _onDidChangeTelemetryConfiguration = new Emitter(); + readonly onDidChangeTelemetryConfiguration: Event = this._onDidChangeTelemetryConfiguration.event; - getTelemetryEnabled(): boolean { - return this._enabled; + private _level: TelemetryLevel = TelemetryLevel.NONE; + private _oldTelemetryEnablement: boolean | undefined; + + getTelemetryConfiguration(): boolean { + return this._level === TelemetryLevel.USAGE; } - $initializeTelemetryEnabled(enabled: boolean): void { - this._enabled = enabled; + getTelemetryDetails(): TelemetryConfiguration { + return { + isCrashEnabled: this._level >= TelemetryLevel.CRASH, + isErrorsEnabled: this._level >= TelemetryLevel.ERROR, + isUsageEnabled: this._level >= TelemetryLevel.USAGE + }; } - $onDidChangeTelemetryEnabled(enabled: boolean): void { - this._enabled = enabled; - this._onDidChangeTelemetryEnabled.fire(enabled); + $initializeTelemetryLevel(level: TelemetryLevel): void { + this._level = level; + } + + $onDidChangeTelemetryLevel(level: TelemetryLevel): void { + this._oldTelemetryEnablement = this.getTelemetryConfiguration(); + this._level = level; + if (this._oldTelemetryEnablement !== this.getTelemetryConfiguration()) { + this._onDidChangeTelemetryEnabled.fire(this.getTelemetryConfiguration()); + } + this._onDidChangeTelemetryConfiguration.fire(this.getTelemetryDetails()); } } diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 9122229e560..12643cef941 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -57,7 +57,7 @@ export interface ITerminalInternalOptions { * This location is different from the API location because it can include splitActiveTerminal, * a property we resolve internally */ - location?: TerminalLocation | { viewColumn: number, preserveState?: boolean } | { splitActiveTerminal: boolean }; + location?: TerminalLocation | { viewColumn: number; preserveState?: boolean } | { splitActiveTerminal: boolean }; } export const IExtHostTerminalService = createDecorator('IExtHostTerminalService'); @@ -153,7 +153,7 @@ export class ExtHostTerminal { isExtensionOwnedTerminal: true, useShellEnvironment: withNullAsUndefined(internalOptions?.useShellEnvironment), location: internalOptions?.location || this._serializeParentTerminal(options.location, internalOptions?.resolvedExtHostIdentifier), - disablePersistence: withNullAsUndefined(options.disablePersistence) + isTransient: withNullAsUndefined(options.isTransient) }); } @@ -168,7 +168,7 @@ export class ExtHostTerminal { icon: iconPath, color: ThemeColor.isThemeColor(color) ? color.id : undefined, location: this._serializeParentTerminal(location, parentTerminal), - disablePersistence: true + isTransient: true }); // At this point, the id has been set via `$acceptTerminalOpened` if (typeof this._id === 'string') { @@ -701,7 +701,7 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I const result: ITerminalLinkDto[] = []; const context: vscode.TerminalLinkContext = { terminal: terminal.value, line }; - const promises: vscode.ProviderResult<{ provider: vscode.TerminalLinkProvider, links: vscode.TerminalLink[] }>[] = []; + const promises: vscode.ProviderResult<{ provider: vscode.TerminalLinkProvider; links: vscode.TerminalLink[] }>[] = []; for (const provider of this._linkProviders) { promises.push(Promises.withAsyncBody(async r => { diff --git a/src/vs/workbench/api/common/extHostTesting.ts b/src/vs/workbench/api/common/extHostTesting.ts index 2805e98f7ff..4b7f7abcc40 100644 --- a/src/vs/workbench/api/common/extHostTesting.ts +++ b/src/vs/workbench/api/common/extHostTesting.ts @@ -21,14 +21,14 @@ import { InvalidTestItemError, TestItemImpl, TestItemRootImpl } from 'vs/workben import * as Convert from 'vs/workbench/api/common/extHostTypeConverters'; import { TestRunProfileKind, TestRunRequest } from 'vs/workbench/api/common/extHostTypes'; import { SingleUseTestCollection } from 'vs/workbench/contrib/testing/common/ownedTestCollection'; -import { AbstractIncrementalTestCollection, CoverageDetails, IFileCoverage, IncrementalChangeCollector, IncrementalTestCollectionItem, InternalTestItem, ISerializedTestResults, ITestItem, RunTestForControllerRequest, TestResultState, TestRunProfileBitset, TestsDiff } from 'vs/workbench/contrib/testing/common/testCollection'; +import { AbstractIncrementalTestCollection, CoverageDetails, IFileCoverage, IncrementalChangeCollector, IncrementalTestCollectionItem, InternalTestItem, ISerializedTestResults, ITestItem, RunTestForControllerRequest, TestResultState, TestRunProfileBitset, TestsDiff, TestsDiffOp } from 'vs/workbench/contrib/testing/common/testCollection'; import { TestId, TestIdPathParts, TestPosition } from 'vs/workbench/contrib/testing/common/testId'; import type * as vscode from 'vscode'; interface ControllerInfo { - controller: vscode.TestController, - profiles: Map, - collection: SingleUseTestCollection, + controller: vscode.TestController; + profiles: Map; + collection: SingleUseTestCollection; } export class ExtHostTesting implements ExtHostTestingShape { @@ -123,7 +123,7 @@ export class ExtHostTesting implements ExtHostTestingShape { this.controllers.set(controllerId, info); disposable.add(toDisposable(() => this.controllers.delete(controllerId))); - disposable.add(collection.onDidGenerateDiff(diff => proxy.$publishDiff(controllerId, diff))); + disposable.add(collection.onDidGenerateDiff(diff => proxy.$publishDiff(controllerId, diff.map(TestsDiffOp.serialize)))); return controller; } @@ -151,6 +151,7 @@ export class ExtHostTesting implements ExtHostTestingShape { } await this.proxy.$runTests({ + isUiTriggered: false, targets: [{ testIds: req.include?.map(t => t.id) ?? [controller.collection.root.id], profileGroup: profileGroupToBitset[profile.kind], @@ -219,8 +220,8 @@ export class ExtHostTesting implements ExtHostTestingShape { * Receives a test update from the main thread. Called (eventually) whenever * tests change. */ - public $acceptDiff(diff: TestsDiff): void { - this.observer.applyDiff(diff); + public $acceptDiff(diff: TestsDiffOp.Serialized[]): void { + this.observer.applyDiff(diff.map(TestsDiffOp.deserialize)); } /** @@ -291,7 +292,7 @@ export class ExtHostTesting implements ExtHostTestingShape { } class TestRunTracker extends Disposable { - private readonly tasks = new Map(); + private readonly tasks = new Map(); private readonly sharedTestIds = new Set(); private readonly cts: CancellationTokenSource; private readonly endEmitter = this._register(new Emitter()); @@ -459,7 +460,7 @@ class TestRunTracker extends Disposable { return; } - const chain: ITestItem[] = []; + const chain: ITestItem.Serialized[] = []; const root = this.dto.colllection.root; while (true) { const converted = Convert.TestItem.from(test as TestItemImpl); diff --git a/src/vs/workbench/api/common/extHostTestingPrivateApi.ts b/src/vs/workbench/api/common/extHostTestingPrivateApi.ts index 270de0bd118..26c7081cce3 100644 --- a/src/vs/workbench/api/common/extHostTestingPrivateApi.ts +++ b/src/vs/workbench/api/common/extHostTestingPrivateApi.ts @@ -95,7 +95,7 @@ const testItemPropAccessor = ( }; }; -type WritableProps = Pick; +type WritableProps = Pick; const strictEqualComparator = (a: T, b: T) => a === b; @@ -107,6 +107,7 @@ const propComparators: { [K in keyof Required]: (a: vscode.TestIt }, label: strictEqualComparator, description: strictEqualComparator, + sortText: strictEqualComparator, busy: strictEqualComparator, error: strictEqualComparator, canResolveChildren: strictEqualComparator, @@ -129,6 +130,7 @@ const makePropDescriptors = (api: IExtHostTestItemApi, label: string): { [K in k range: testItemPropAccessor(api, 'range', undefined, propComparators.range), label: testItemPropAccessor(api, 'label', label, propComparators.label), description: testItemPropAccessor(api, 'description', undefined, propComparators.description), + sortText: testItemPropAccessor(api, 'sortText', undefined, propComparators.sortText), canResolveChildren: testItemPropAccessor(api, 'canResolveChildren', false, propComparators.canResolveChildren), busy: testItemPropAccessor(api, 'busy', false, propComparators.busy), error: testItemPropAccessor(api, 'error', undefined, propComparators.error), @@ -268,6 +270,7 @@ export class TestItemImpl implements vscode.TestItem { public range!: vscode.Range | undefined; public description!: string | undefined; + public sortText!: string | undefined; public label!: string; public error!: string | vscode.MarkdownString; public busy!: boolean; diff --git a/src/vs/workbench/api/common/extHostTextEditor.ts b/src/vs/workbench/api/common/extHostTextEditor.ts index 6f9c4ed2452..75e3a846b25 100644 --- a/src/vs/workbench/api/common/extHostTextEditor.ts +++ b/src/vs/workbench/api/common/extHostTextEditor.ts @@ -8,7 +8,7 @@ import { illegalArgument, readonly } from 'vs/base/common/errors'; import { IdGenerator } from 'vs/base/common/idGenerator'; import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; import { IRange } from 'vs/editor/common/core/range'; -import { ISingleEditOperation } from 'vs/editor/common/model'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, MainThreadTextEditorsShape } from 'vs/workbench/api/common/extHost.protocol'; import * as TypeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import { EndOfLine, Position, Range, Selection, SnippetString, TextEditorLineNumbersStyle, TextEditorRevealType } from 'vs/workbench/api/common/extHostTypes'; @@ -60,7 +60,7 @@ export class TextEditorEdit { private _setEndOfLine: EndOfLine | undefined = undefined; private _finalized: boolean = false; - constructor(document: vscode.TextDocument, options: { undoStopBefore: boolean; undoStopAfter: boolean; }) { + constructor(document: vscode.TextDocument, options: { undoStopBefore: boolean; undoStopAfter: boolean }) { this._document = document; this._documentVersionId = document.version; this._undoStopBefore = options.undoStopBefore; @@ -431,7 +431,7 @@ export class ExtHostTextEditor { throw readonly('viewColumn'); }, // --- edit - edit(callback: (edit: TextEditorEdit) => void, options: { undoStopBefore: boolean; undoStopAfter: boolean; } = { undoStopBefore: true, undoStopAfter: true }): Promise { + edit(callback: (edit: TextEditorEdit) => void, options: { undoStopBefore: boolean; undoStopAfter: boolean } = { undoStopBefore: true, undoStopAfter: true }): Promise { if (that._disposed) { return Promise.reject(new Error('TextEditor#edit not possible on closed editors')); } @@ -440,7 +440,7 @@ export class ExtHostTextEditor { return that._applyEdit(edit); }, // --- snippet edit - insertSnippet(snippet: SnippetString, where?: Position | readonly Position[] | Range | readonly Range[], options: { undoStopBefore: boolean; undoStopAfter: boolean; } = { undoStopBefore: true, undoStopAfter: true }): Promise { + insertSnippet(snippet: SnippetString, where?: Position | readonly Position[] | Range | readonly Range[], options: { undoStopBefore: boolean; undoStopAfter: boolean } = { undoStopBefore: true, undoStopAfter: true }): Promise { if (that._disposed) { return Promise.reject(new Error('TextEditor#insertSnippet not possible on closed editors')); } diff --git a/src/vs/workbench/api/common/extHostTextEditors.ts b/src/vs/workbench/api/common/extHostTextEditors.ts index 555b638a115..fac8326994b 100644 --- a/src/vs/workbench/api/common/extHostTextEditors.ts +++ b/src/vs/workbench/api/common/extHostTextEditors.ts @@ -56,7 +56,7 @@ export class ExtHostEditors implements ExtHostEditorsShape { } showTextDocument(document: vscode.TextDocument, column: vscode.ViewColumn, preserveFocus: boolean): Promise; - showTextDocument(document: vscode.TextDocument, options: { column: vscode.ViewColumn, preserveFocus: boolean, pinned: boolean }): Promise; + showTextDocument(document: vscode.TextDocument, options: { column: vscode.ViewColumn; preserveFocus: boolean; pinned: boolean }): Promise; showTextDocument(document: vscode.TextDocument, columnOrOptions: vscode.ViewColumn | vscode.TextDocumentShowOptions | undefined, preserveFocus?: boolean): Promise; async showTextDocument(document: vscode.TextDocument, columnOrOptions: vscode.ViewColumn | vscode.TextDocumentShowOptions | undefined, preserveFocus?: boolean): Promise { let options: ITextDocumentShowOptions; diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 76ccbbd770d..d473d1b84b4 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -20,7 +20,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { MarkdownString } from 'vs/workbench/api/common/extHostTypeConverters'; import { IMarkdownString } from 'vs/base/common/htmlContent'; -import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { Command } from 'vs/editor/common/languages'; import { TreeDataTransferConverter, TreeDataTransferDTO } from 'vs/workbench/api/common/shared/treeDataTransfer'; import { ITreeViewsDragAndDropService, TreeViewsDragAndDropService } from 'vs/workbench/services/views/common/treeViewsDragAndDropService'; @@ -87,9 +87,10 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { if (!options || !options.treeDataProvider) { throw new Error('Options with treeDataProvider is mandatory'); } - const dragAndDropMimeTypes = options.dragAndDropController?.supportedMimeTypes; + const dropMimeTypes = options.dragAndDropController?.dropMimeTypes; + const dragMimeTypes = options.dragAndDropController?.dragMimeTypes; const hasHandleDrag = !!options.dragAndDropController?.handleDrag; - const registerPromise = this._proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll, canSelectMany: !!options.canSelectMany, dragAndDropMimeTypes, hasHandleDrag: hasHandleDrag }); + const registerPromise = this._proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll, canSelectMany: !!options.canSelectMany, dropMimeTypes, dragMimeTypes, hasHandleDrag: hasHandleDrag }); const treeView = this.createExtHostTreeView(viewId, options, extension); return { get onDidCollapseElement() { return treeView.onDidCollapseElement; }, @@ -132,7 +133,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { return treeView.getChildren(treeItemHandle); } - async $handleDrop(destinationViewId: string, treeDataTransferDTO: TreeDataTransferDTO, newParentItemHandle: string, + async $handleDrop(destinationViewId: string, treeDataTransferDTO: TreeDataTransferDTO, newParentItemHandle: string, token: CancellationToken, operationUuid?: string, sourceViewId?: string, sourceTreeItemHandles?: string[]): Promise { const treeView = this.treeViews.get(destinationViewId); if (!treeView) { @@ -141,39 +142,35 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { const treeDataTransfer = TreeDataTransferConverter.toITreeDataTransfer(treeDataTransferDTO); if ((sourceViewId === destinationViewId) && sourceTreeItemHandles) { - await this.addAdditionalTransferItems(treeDataTransfer, treeView, sourceTreeItemHandles, operationUuid); + await this.addAdditionalTransferItems(treeDataTransfer, treeView, sourceTreeItemHandles, token, operationUuid); } - return treeView.onDrop(treeDataTransfer, newParentItemHandle); + return treeView.onDrop(treeDataTransfer, newParentItemHandle, token); } private async addAdditionalTransferItems(treeDataTransfer: ITreeDataTransfer, treeView: ExtHostTreeView, - sourceTreeItemHandles: string[], operationUuid?: string): Promise { + sourceTreeItemHandles: string[], token: CancellationToken, operationUuid?: string): Promise { const existingTransferOperation = this.treeDragAndDropService.removeDragOperationTransfer(operationUuid); - let additionalTransferItems: vscode.TreeDataTransfer | undefined; if (existingTransferOperation) { - additionalTransferItems = await existingTransferOperation; - } else if (operationUuid && treeView.handleDrag) { - const willDropPromise = treeView.handleDrag(sourceTreeItemHandles); - this.treeDragAndDropService.addDragOperationTransfer(operationUuid, willDropPromise); - additionalTransferItems = await willDropPromise; - } - if (additionalTransferItems) { - additionalTransferItems.forEach((value, key) => { + (await existingTransferOperation)?.forEach((value, key) => { if (value) { treeDataTransfer.set(key, value); } }); + } else if (operationUuid && treeView.handleDrag) { + const willDropPromise = treeView.handleDrag(sourceTreeItemHandles, treeDataTransfer, token); + this.treeDragAndDropService.addDragOperationTransfer(operationUuid, willDropPromise); + await willDropPromise; } return treeDataTransfer; } - async $handleDrag(sourceViewId: string, sourceTreeItemHandles: string[], operationUuid: string): Promise { + async $handleDrag(sourceViewId: string, sourceTreeItemHandles: string[], operationUuid: string, token: CancellationToken): Promise { const treeView = this.treeViews.get(sourceViewId); if (!treeView) { return Promise.reject(new Error(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', sourceViewId))); } - const treeDataTransfer = await this.addAdditionalTransferItems(new Map(), treeView, sourceTreeItemHandles, operationUuid); + const treeDataTransfer = await this.addAdditionalTransferItems(new Map(), treeView, sourceTreeItemHandles, token, operationUuid); if (!treeDataTransfer) { return; } @@ -234,7 +231,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { } type Root = null | undefined | void; -type TreeData = { message: boolean, element: T | T[] | Root | false }; +type TreeData = { message: boolean; element: T | T[] | Root | false }; interface TreeNode extends IDisposable { item: ITreeItem; @@ -306,7 +303,7 @@ class ExtHostTreeView extends Disposable { let refreshingPromise: Promise | null; let promiseCallback: () => void; - this._register(Event.debounce, { message: boolean, elements: (T | Root)[] }>(this._onDidChangeData.event, (result, current) => { + this._register(Event.debounce, { message: boolean; elements: (T | Root)[] }>(this._onDidChangeData.event, (result, current) => { if (!result) { result = { message: false, elements: [] }; } @@ -435,7 +432,7 @@ class ExtHostTreeView extends Disposable { } } - async handleDrag(sourceTreeItemHandles: TreeItemHandle[]): Promise { + async handleDrag(sourceTreeItemHandles: TreeItemHandle[], treeDataTransfer: ITreeDataTransfer, token: CancellationToken): Promise { const extensionTreeItems: T[] = []; for (const sourceHandle of sourceTreeItemHandles) { const extensionItem = this.getExtensionElement(sourceHandle); @@ -447,19 +444,20 @@ class ExtHostTreeView extends Disposable { if (!this.dndController?.handleDrag || (extensionTreeItems.length === 0)) { return; } - return this.dndController.handleDrag(extensionTreeItems); + await this.dndController.handleDrag(extensionTreeItems, treeDataTransfer, token); + return treeDataTransfer; } get hasHandleDrag(): boolean { return !!this.dndController?.handleDrag; } - async onDrop(treeDataTransfer: vscode.TreeDataTransfer, targetHandleOrNode: TreeItemHandle): Promise { + async onDrop(treeDataTransfer: vscode.TreeDataTransfer, targetHandleOrNode: TreeItemHandle, token: CancellationToken): Promise { const target = this.getExtensionElement(targetHandleOrNode); if (!target) { return; } - return asPromise(() => this.dndController?.handleDrop(treeDataTransfer, target)); + return asPromise(() => this.dndController?.handleDrop(treeDataTransfer, target, token)); } get hasResolve(): boolean { diff --git a/src/vs/workbench/api/common/extHostTunnelService.ts b/src/vs/workbench/api/common/extHostTunnelService.ts index e861d188f72..33923fdd09a 100644 --- a/src/vs/workbench/api/common/extHostTunnelService.ts +++ b/src/vs/workbench/api/common/extHostTunnelService.ts @@ -3,25 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ExtHostTunnelServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostTunnelServiceShape, TunnelDto } from 'vs/workbench/api/common/extHost.protocol'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import * as vscode from 'vscode'; -import { ProvidedPortAttributes, RemoteTunnel, TunnelCreationOptions, TunnelOptions, TunnelPrivacyId } from 'vs/platform/remote/common/tunnel'; +import { ProvidedPortAttributes, RemoteTunnel, TunnelCreationOptions, TunnelOptions, TunnelPrivacyId } from 'vs/platform/tunnel/common/tunnel'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Emitter } from 'vs/base/common/event'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { CandidatePort } from 'vs/workbench/services/remote/common/remoteExplorerService'; -export interface TunnelDto { - remoteAddress: { port: number, host: string }; - localAddress: { port: number, host: string } | string; - public: boolean; - privacy: TunnelPrivacyId | string; - protocol: string | undefined; -} - -export namespace TunnelDto { +export namespace TunnelDtoConverter { export function fromApiTunnel(tunnel: vscode.Tunnel): TunnelDto { return { remoteAddress: tunnel.remoteAddress, @@ -46,7 +38,7 @@ export namespace TunnelDto { } export interface Tunnel extends vscode.Disposable { - remote: { port: number, host: string }; + remote: { port: number; host: string }; localAddress: string; } @@ -56,7 +48,7 @@ export interface IExtHostTunnelService extends ExtHostTunnelServiceShape { getTunnels(): Promise; onDidChangeTunnels: vscode.Event; setTunnelFactory(provider: vscode.RemoteAuthorityResolver | undefined): Promise; - registerPortsAttributesProvider(portSelector: { pid?: number, portRange?: [number, number], commandMatcher?: RegExp }, provider: vscode.PortAttributesProvider): IDisposable; + registerPortsAttributesProvider(portSelector: { pid?: number; portRange?: [number, number]; commandMatcher?: RegExp }, provider: vscode.PortAttributesProvider): IDisposable; } export const IExtHostTunnelService = createDecorator('IExtHostTunnelService'); @@ -82,7 +74,7 @@ export class ExtHostTunnelService implements IExtHostTunnelService { async setTunnelFactory(provider: vscode.RemoteAuthorityResolver | undefined): Promise { return { dispose: () => { } }; } - registerPortsAttributesProvider(portSelector: { pid?: number, portRange?: [number, number] }, provider: vscode.PortAttributesProvider) { + registerPortsAttributesProvider(portSelector: { pid?: number; portRange?: [number, number] }, provider: vscode.PortAttributesProvider) { return { dispose: () => { } }; } @@ -91,7 +83,7 @@ export class ExtHostTunnelService implements IExtHostTunnelService { } async $forwardPort(tunnelOptions: TunnelOptions, tunnelCreationOptions: TunnelCreationOptions): Promise { return undefined; } - async $closeTunnel(remote: { host: string, port: number }): Promise { } + async $closeTunnel(remote: { host: string; port: number }): Promise { } async $onDidTunnelsChange(): Promise { } async $registerCandidateFinder(): Promise { } } diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 79e3d9aa20e..f7f40cc4356 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -7,7 +7,7 @@ import { asArray, coalesce, isNonEmptyArray } from 'vs/base/common/arrays'; import { VSBuffer } from 'vs/base/common/buffer'; import * as htmlContent from 'vs/base/common/htmlContent'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import * as marked from 'vs/base/common/marked/marked'; +import { marked } from 'vs/base/common/marked/marked'; import { parse } from 'vs/base/common/marshalling'; import { cloneAndChange } from 'vs/base/common/objects'; import { isDefined, isEmptyObject, isNumber, isString, withNullAsUndefined } from 'vs/base/common/types'; @@ -18,28 +18,33 @@ import { IPosition } from 'vs/editor/common/core/position'; import * as editorRange from 'vs/editor/common/core/range'; import { ISelection } from 'vs/editor/common/core/selection'; import { IContentDecorationRenderOptions, IDecorationOptions, IDecorationRenderOptions, IThemeDecorationRenderOptions } from 'vs/editor/common/editorCommon'; +import * as languages from 'vs/editor/common/languages'; +import * as languageSelector from 'vs/editor/common/languageSelector'; import { EndOfLineSequence, TrackedRangeStickiness } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; -import * as languageSelector from 'vs/editor/common/languages/languageSelector'; import { EditorResolution, ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IMarkerData, IRelatedInformation, MarkerSeverity, MarkerTag } from 'vs/platform/markers/common/markers'; import { ProgressLocation as MainProgressLocation } from 'vs/platform/progress/common/progress'; import * as extHostProtocol from 'vs/workbench/api/common/extHost.protocol'; -import { CommandsConverter } from 'vs/workbench/api/common/extHostCommands'; -import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { ExtHostNotebookController } from 'vs/workbench/api/common/extHostNotebook'; import { getPrivateApiFor, TestItemImpl } from 'vs/workbench/api/common/extHostTestingPrivateApi'; import { SaveReason } from 'vs/workbench/common/editor'; import * as notebooks from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import * as search from 'vs/workbench/contrib/search/common/search'; -import { CoverageDetails, DetailType, ICoveredCount, IFileCoverage, ISerializedTestResults, ITestErrorMessage, ITestItem, ITestItemContext, ITestTag, SerializedTestErrorMessage, SerializedTestResultItem, TestMessageType } from 'vs/workbench/contrib/testing/common/testCollection'; +import { CoverageDetails, denamespaceTestTag, DetailType, ICoveredCount, IFileCoverage, ISerializedTestResults, ITestErrorMessage, ITestItem, ITestItemContext, ITestTag, namespaceTestTag, TestMessageType, TestResultItem } from 'vs/workbench/contrib/testing/common/testCollection'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import type * as vscode from 'vscode'; import * as types from './extHostTypes'; +export namespace Command { + + export interface ICommandsConverter { + fromInternal(command: extHostProtocol.ICommandDto): vscode.Command | undefined; + toInternal(command: vscode.Command | undefined, disposables: DisposableStore): extHostProtocol.ICommandDto | undefined; + } +} + export interface PositionLike { line: number; character: number; @@ -104,12 +109,12 @@ export namespace Range { } export namespace TokenType { - export function to(type: modes.StandardTokenType): types.StandardTokenType { + export function to(type: languages.StandardTokenType): types.StandardTokenType { switch (type) { - case modes.StandardTokenType.Comment: return types.StandardTokenType.Comment; - case modes.StandardTokenType.Other: return types.StandardTokenType.Other; - case modes.StandardTokenType.RegEx: return types.StandardTokenType.RegEx; - case modes.StandardTokenType.String: return types.StandardTokenType.String; + case languages.StandardTokenType.Comment: return types.StandardTokenType.Comment; + case languages.StandardTokenType.Other: return types.StandardTokenType.Other; + case languages.StandardTokenType.RegEx: return types.StandardTokenType.RegEx; + case languages.StandardTokenType.String: return types.StandardTokenType.String; } } } @@ -316,7 +321,7 @@ export namespace MarkdownString { const { language, value } = markup; res = { value: '```' + language + '\n' + value + '\n```\n' }; } else if (types.MarkdownString.isMarkdownString(markup)) { - res = { value: markup.value, isTrusted: markup.isTrusted, supportThemeIcons: markup.supportThemeIcons, supportHtml: markup.supportHtml }; + res = { value: markup.value, isTrusted: markup.isTrusted, supportThemeIcons: markup.supportThemeIcons, supportHtml: markup.supportHtml, baseUri: markup.baseUri }; } else if (typeof markup === 'string') { res = { value: markup }; } else { @@ -324,7 +329,7 @@ export namespace MarkdownString { } // extract uris into a separate object - const resUris: { [href: string]: UriComponents; } = Object.create(null); + const resUris: { [href: string]: UriComponents } = Object.create(null); res.uris = resUris; const collectUri = (href: string): string => { @@ -339,14 +344,14 @@ export namespace MarkdownString { }; const renderer = new marked.Renderer(); renderer.link = collectUri; - renderer.image = href => collectUri(htmlContent.parseHrefAndDimensions(href).href); + renderer.image = href => typeof href === 'string' ? collectUri(htmlContent.parseHrefAndDimensions(href).href) : ''; marked(res.value, { renderer }); return res; } - function _uriMassage(part: string, bucket: { [n: string]: UriComponents; }): string { + function _uriMassage(part: string, bucket: { [n: string]: UriComponents }): string { if (!part) { return part; } @@ -382,10 +387,11 @@ export namespace MarkdownString { const result = new types.MarkdownString(value.value, value.supportThemeIcons); result.isTrusted = value.isTrusted; result.supportHtml = value.supportHtml; + result.baseUri = value.baseUri ? URI.from(value.baseUri) : undefined; return result; } - export function fromStrict(value: string | vscode.MarkdownString): undefined | string | htmlContent.IMarkdownString { + export function fromStrict(value: string | vscode.MarkdownString | undefined | null): undefined | string | htmlContent.IMarkdownString { if (!value) { return undefined; } @@ -535,15 +541,15 @@ export namespace DecorationRenderOptions { export namespace TextEdit { - export function from(edit: vscode.TextEdit): modes.TextEdit { - return { + export function from(edit: vscode.TextEdit): languages.TextEdit { + return { text: edit.newText, eol: edit.newEol && EndOfLine.from(edit.newEol), range: Range.from(edit.range) }; } - export function to(edit: modes.TextEdit): types.TextEdit { + export function to(edit: languages.TextEdit): types.TextEdit { const result = new types.TextEdit(Range.to(edit.range), edit.text); result.newEol = (typeof edit.eol === 'undefined' ? undefined : EndOfLine.to(edit.eol))!; return result; @@ -551,7 +557,13 @@ export namespace TextEdit { } export namespace WorkspaceEdit { - export function from(value: vscode.WorkspaceEdit, documents?: ExtHostDocumentsAndEditors, extHostNotebooks?: ExtHostNotebookController): extHostProtocol.IWorkspaceEditDto { + + export interface IVersionInformationProvider { + getTextDocumentVersion(uri: URI): number | undefined; + getNotebookDocumentVersion(uri: URI): number | undefined; + } + + export function from(value: vscode.WorkspaceEdit, versionInfo?: IVersionInformationProvider): extHostProtocol.IWorkspaceEditDto { const result: extHostProtocol.IWorkspaceEditDto = { edits: [] }; @@ -571,12 +583,11 @@ export namespace WorkspaceEdit { } else if (entry._type === types.FileEditType.Text) { // text edits - const doc = documents?.getDocument(entry.uri); result.edits.push({ _type: extHostProtocol.WorkspaceEditType.Text, resource: entry.uri, edit: TextEdit.from(entry.edit), - modelVersionId: doc?.version, + modelVersionId: versionInfo?.getTextDocumentVersion(entry.uri), metadata: entry.metadata }); } else if (entry._type === types.FileEditType.Cell) { @@ -586,7 +597,7 @@ export namespace WorkspaceEdit { resource: entry.uri, edit: entry.edit, notebookMetadata: entry.notebookMetadata, - notebookVersionId: extHostNotebooks?.getNotebookDocument(entry.uri, true)?.apiNotebook.version + notebookVersionId: versionInfo?.getNotebookDocumentVersion(entry.uri) }); } else if (entry._type === types.FileEditType.CellReplace) { @@ -594,7 +605,7 @@ export namespace WorkspaceEdit { _type: extHostProtocol.WorkspaceEditType.Cell, metadata: entry.metadata, resource: entry.uri, - notebookVersionId: extHostNotebooks?.getNotebookDocument(entry.uri, true)?.apiNotebook.version, + notebookVersionId: versionInfo?.getNotebookDocumentVersion(entry.uri), edit: { editType: notebooks.CellEditType.Replace, index: entry.index, @@ -632,39 +643,39 @@ export namespace WorkspaceEdit { export namespace SymbolKind { - const _fromMapping: { [kind: number]: modes.SymbolKind; } = Object.create(null); - _fromMapping[types.SymbolKind.File] = modes.SymbolKind.File; - _fromMapping[types.SymbolKind.Module] = modes.SymbolKind.Module; - _fromMapping[types.SymbolKind.Namespace] = modes.SymbolKind.Namespace; - _fromMapping[types.SymbolKind.Package] = modes.SymbolKind.Package; - _fromMapping[types.SymbolKind.Class] = modes.SymbolKind.Class; - _fromMapping[types.SymbolKind.Method] = modes.SymbolKind.Method; - _fromMapping[types.SymbolKind.Property] = modes.SymbolKind.Property; - _fromMapping[types.SymbolKind.Field] = modes.SymbolKind.Field; - _fromMapping[types.SymbolKind.Constructor] = modes.SymbolKind.Constructor; - _fromMapping[types.SymbolKind.Enum] = modes.SymbolKind.Enum; - _fromMapping[types.SymbolKind.Interface] = modes.SymbolKind.Interface; - _fromMapping[types.SymbolKind.Function] = modes.SymbolKind.Function; - _fromMapping[types.SymbolKind.Variable] = modes.SymbolKind.Variable; - _fromMapping[types.SymbolKind.Constant] = modes.SymbolKind.Constant; - _fromMapping[types.SymbolKind.String] = modes.SymbolKind.String; - _fromMapping[types.SymbolKind.Number] = modes.SymbolKind.Number; - _fromMapping[types.SymbolKind.Boolean] = modes.SymbolKind.Boolean; - _fromMapping[types.SymbolKind.Array] = modes.SymbolKind.Array; - _fromMapping[types.SymbolKind.Object] = modes.SymbolKind.Object; - _fromMapping[types.SymbolKind.Key] = modes.SymbolKind.Key; - _fromMapping[types.SymbolKind.Null] = modes.SymbolKind.Null; - _fromMapping[types.SymbolKind.EnumMember] = modes.SymbolKind.EnumMember; - _fromMapping[types.SymbolKind.Struct] = modes.SymbolKind.Struct; - _fromMapping[types.SymbolKind.Event] = modes.SymbolKind.Event; - _fromMapping[types.SymbolKind.Operator] = modes.SymbolKind.Operator; - _fromMapping[types.SymbolKind.TypeParameter] = modes.SymbolKind.TypeParameter; + const _fromMapping: { [kind: number]: languages.SymbolKind } = Object.create(null); + _fromMapping[types.SymbolKind.File] = languages.SymbolKind.File; + _fromMapping[types.SymbolKind.Module] = languages.SymbolKind.Module; + _fromMapping[types.SymbolKind.Namespace] = languages.SymbolKind.Namespace; + _fromMapping[types.SymbolKind.Package] = languages.SymbolKind.Package; + _fromMapping[types.SymbolKind.Class] = languages.SymbolKind.Class; + _fromMapping[types.SymbolKind.Method] = languages.SymbolKind.Method; + _fromMapping[types.SymbolKind.Property] = languages.SymbolKind.Property; + _fromMapping[types.SymbolKind.Field] = languages.SymbolKind.Field; + _fromMapping[types.SymbolKind.Constructor] = languages.SymbolKind.Constructor; + _fromMapping[types.SymbolKind.Enum] = languages.SymbolKind.Enum; + _fromMapping[types.SymbolKind.Interface] = languages.SymbolKind.Interface; + _fromMapping[types.SymbolKind.Function] = languages.SymbolKind.Function; + _fromMapping[types.SymbolKind.Variable] = languages.SymbolKind.Variable; + _fromMapping[types.SymbolKind.Constant] = languages.SymbolKind.Constant; + _fromMapping[types.SymbolKind.String] = languages.SymbolKind.String; + _fromMapping[types.SymbolKind.Number] = languages.SymbolKind.Number; + _fromMapping[types.SymbolKind.Boolean] = languages.SymbolKind.Boolean; + _fromMapping[types.SymbolKind.Array] = languages.SymbolKind.Array; + _fromMapping[types.SymbolKind.Object] = languages.SymbolKind.Object; + _fromMapping[types.SymbolKind.Key] = languages.SymbolKind.Key; + _fromMapping[types.SymbolKind.Null] = languages.SymbolKind.Null; + _fromMapping[types.SymbolKind.EnumMember] = languages.SymbolKind.EnumMember; + _fromMapping[types.SymbolKind.Struct] = languages.SymbolKind.Struct; + _fromMapping[types.SymbolKind.Event] = languages.SymbolKind.Event; + _fromMapping[types.SymbolKind.Operator] = languages.SymbolKind.Operator; + _fromMapping[types.SymbolKind.TypeParameter] = languages.SymbolKind.TypeParameter; - export function from(kind: vscode.SymbolKind): modes.SymbolKind { - return typeof _fromMapping[kind] === 'number' ? _fromMapping[kind] : modes.SymbolKind.Property; + export function from(kind: vscode.SymbolKind): languages.SymbolKind { + return typeof _fromMapping[kind] === 'number' ? _fromMapping[kind] : languages.SymbolKind.Property; } - export function to(kind: modes.SymbolKind): vscode.SymbolKind { + export function to(kind: languages.SymbolKind): vscode.SymbolKind { for (const k in _fromMapping) { if (_fromMapping[k] === kind) { return Number(k); @@ -676,15 +687,15 @@ export namespace SymbolKind { export namespace SymbolTag { - export function from(kind: types.SymbolTag): modes.SymbolTag { + export function from(kind: types.SymbolTag): languages.SymbolTag { switch (kind) { - case types.SymbolTag.Deprecated: return modes.SymbolTag.Deprecated; + case types.SymbolTag.Deprecated: return languages.SymbolTag.Deprecated; } } - export function to(kind: modes.SymbolTag): types.SymbolTag { + export function to(kind: languages.SymbolTag): types.SymbolTag { switch (kind) { - case modes.SymbolTag.Deprecated: return types.SymbolTag.Deprecated; + case languages.SymbolTag.Deprecated: return types.SymbolTag.Deprecated; } } } @@ -712,8 +723,8 @@ export namespace WorkspaceSymbol { } export namespace DocumentSymbol { - export function from(info: vscode.DocumentSymbol): modes.DocumentSymbol { - const result: modes.DocumentSymbol = { + export function from(info: vscode.DocumentSymbol): languages.DocumentSymbol { + const result: languages.DocumentSymbol = { name: info.name || '!!MISSING: name!!', detail: info.detail, range: Range.from(info.range), @@ -726,7 +737,7 @@ export namespace DocumentSymbol { } return result; } - export function to(info: modes.DocumentSymbol): vscode.DocumentSymbol { + export function to(info: languages.DocumentSymbol): vscode.DocumentSymbol { const result = new types.DocumentSymbol( info.name, info.detail, @@ -807,7 +818,7 @@ export namespace CallHierarchyOutgoingCall { export namespace location { - export function from(value: vscode.Location): modes.Location { + export function from(value: vscode.Location): languages.Location { return { range: value.range && Range.from(value.range), uri: value.uri @@ -820,7 +831,7 @@ export namespace location { } export namespace DefinitionLink { - export function from(value: vscode.Location | vscode.DefinitionLink): modes.LocationLink { + export function from(value: vscode.Location | vscode.DefinitionLink): languages.LocationLink { const definitionLink = value; const location = value; return { @@ -834,7 +845,7 @@ export namespace DefinitionLink { : undefined, }; } - export function to(value: extHostProtocol.IDefinitionLinkDto): vscode.LocationLink { + export function to(value: extHostProtocol.ILocationLinkDto): vscode.LocationLink { return { targetUri: URI.revive(value.uri), targetRange: Range.to(value.range), @@ -849,48 +860,48 @@ export namespace DefinitionLink { } export namespace Hover { - export function from(hover: vscode.Hover): modes.Hover { - return { + export function from(hover: vscode.Hover): languages.Hover { + return { range: Range.from(hover.range), contents: MarkdownString.fromMany(hover.contents) }; } - export function to(info: modes.Hover): types.Hover { + export function to(info: languages.Hover): types.Hover { return new types.Hover(info.contents.map(MarkdownString.to), Range.to(info.range)); } } export namespace EvaluatableExpression { - export function from(expression: vscode.EvaluatableExpression): modes.EvaluatableExpression { - return { + export function from(expression: vscode.EvaluatableExpression): languages.EvaluatableExpression { + return { range: Range.from(expression.range), expression: expression.expression }; } - export function to(info: modes.EvaluatableExpression): types.EvaluatableExpression { + export function to(info: languages.EvaluatableExpression): types.EvaluatableExpression { return new types.EvaluatableExpression(Range.to(info.range), info.expression); } } export namespace InlineValue { - export function from(inlineValue: vscode.InlineValue): modes.InlineValue { + export function from(inlineValue: vscode.InlineValue): languages.InlineValue { if (inlineValue instanceof types.InlineValueText) { - return { + return { type: 'text', range: Range.from(inlineValue.range), text: inlineValue.text }; } else if (inlineValue instanceof types.InlineValueVariableLookup) { - return { + return { type: 'variable', range: Range.from(inlineValue.range), variableName: inlineValue.variableName, caseSensitiveLookup: inlineValue.caseSensitiveLookup }; } else if (inlineValue instanceof types.InlineValueEvaluatableExpression) { - return { + return { type: 'expression', range: Range.from(inlineValue.range), expression: inlineValue.expression @@ -900,7 +911,7 @@ export namespace InlineValue { } } - export function to(inlineValue: modes.InlineValue): vscode.InlineValue { + export function to(inlineValue: languages.InlineValue): vscode.InlineValue { switch (inlineValue.type) { case 'text': return { @@ -936,25 +947,25 @@ export namespace InlineValueContext { } export namespace DocumentHighlight { - export function from(documentHighlight: vscode.DocumentHighlight): modes.DocumentHighlight { + export function from(documentHighlight: vscode.DocumentHighlight): languages.DocumentHighlight { return { range: Range.from(documentHighlight.range), kind: documentHighlight.kind }; } - export function to(occurrence: modes.DocumentHighlight): types.DocumentHighlight { + export function to(occurrence: languages.DocumentHighlight): types.DocumentHighlight { return new types.DocumentHighlight(Range.to(occurrence.range), occurrence.kind); } } export namespace CompletionTriggerKind { - export function to(kind: modes.CompletionTriggerKind) { + export function to(kind: languages.CompletionTriggerKind) { switch (kind) { - case modes.CompletionTriggerKind.TriggerCharacter: + case languages.CompletionTriggerKind.TriggerCharacter: return types.CompletionTriggerKind.TriggerCharacter; - case modes.CompletionTriggerKind.TriggerForIncompleteCompletions: + case languages.CompletionTriggerKind.TriggerForIncompleteCompletions: return types.CompletionTriggerKind.TriggerForIncompleteCompletions; - case modes.CompletionTriggerKind.Invoke: + case languages.CompletionTriggerKind.Invoke: default: return types.CompletionTriggerKind.Invoke; } @@ -962,7 +973,7 @@ export namespace CompletionTriggerKind { } export namespace CompletionContext { - export function to(context: modes.CompletionContext): types.CompletionContext { + export function to(context: languages.CompletionContext): types.CompletionContext { return { triggerKind: CompletionTriggerKind.to(context.triggerKind), triggerCharacter: context.triggerCharacter @@ -972,93 +983,93 @@ export namespace CompletionContext { export namespace CompletionItemTag { - export function from(kind: types.CompletionItemTag): modes.CompletionItemTag { + export function from(kind: types.CompletionItemTag): languages.CompletionItemTag { switch (kind) { - case types.CompletionItemTag.Deprecated: return modes.CompletionItemTag.Deprecated; + case types.CompletionItemTag.Deprecated: return languages.CompletionItemTag.Deprecated; } } - export function to(kind: modes.CompletionItemTag): types.CompletionItemTag { + export function to(kind: languages.CompletionItemTag): types.CompletionItemTag { switch (kind) { - case modes.CompletionItemTag.Deprecated: return types.CompletionItemTag.Deprecated; + case languages.CompletionItemTag.Deprecated: return types.CompletionItemTag.Deprecated; } } } export namespace CompletionItemKind { - const _from = new Map([ - [types.CompletionItemKind.Method, modes.CompletionItemKind.Method], - [types.CompletionItemKind.Function, modes.CompletionItemKind.Function], - [types.CompletionItemKind.Constructor, modes.CompletionItemKind.Constructor], - [types.CompletionItemKind.Field, modes.CompletionItemKind.Field], - [types.CompletionItemKind.Variable, modes.CompletionItemKind.Variable], - [types.CompletionItemKind.Class, modes.CompletionItemKind.Class], - [types.CompletionItemKind.Interface, modes.CompletionItemKind.Interface], - [types.CompletionItemKind.Struct, modes.CompletionItemKind.Struct], - [types.CompletionItemKind.Module, modes.CompletionItemKind.Module], - [types.CompletionItemKind.Property, modes.CompletionItemKind.Property], - [types.CompletionItemKind.Unit, modes.CompletionItemKind.Unit], - [types.CompletionItemKind.Value, modes.CompletionItemKind.Value], - [types.CompletionItemKind.Constant, modes.CompletionItemKind.Constant], - [types.CompletionItemKind.Enum, modes.CompletionItemKind.Enum], - [types.CompletionItemKind.EnumMember, modes.CompletionItemKind.EnumMember], - [types.CompletionItemKind.Keyword, modes.CompletionItemKind.Keyword], - [types.CompletionItemKind.Snippet, modes.CompletionItemKind.Snippet], - [types.CompletionItemKind.Text, modes.CompletionItemKind.Text], - [types.CompletionItemKind.Color, modes.CompletionItemKind.Color], - [types.CompletionItemKind.File, modes.CompletionItemKind.File], - [types.CompletionItemKind.Reference, modes.CompletionItemKind.Reference], - [types.CompletionItemKind.Folder, modes.CompletionItemKind.Folder], - [types.CompletionItemKind.Event, modes.CompletionItemKind.Event], - [types.CompletionItemKind.Operator, modes.CompletionItemKind.Operator], - [types.CompletionItemKind.TypeParameter, modes.CompletionItemKind.TypeParameter], - [types.CompletionItemKind.Issue, modes.CompletionItemKind.Issue], - [types.CompletionItemKind.User, modes.CompletionItemKind.User], + const _from = new Map([ + [types.CompletionItemKind.Method, languages.CompletionItemKind.Method], + [types.CompletionItemKind.Function, languages.CompletionItemKind.Function], + [types.CompletionItemKind.Constructor, languages.CompletionItemKind.Constructor], + [types.CompletionItemKind.Field, languages.CompletionItemKind.Field], + [types.CompletionItemKind.Variable, languages.CompletionItemKind.Variable], + [types.CompletionItemKind.Class, languages.CompletionItemKind.Class], + [types.CompletionItemKind.Interface, languages.CompletionItemKind.Interface], + [types.CompletionItemKind.Struct, languages.CompletionItemKind.Struct], + [types.CompletionItemKind.Module, languages.CompletionItemKind.Module], + [types.CompletionItemKind.Property, languages.CompletionItemKind.Property], + [types.CompletionItemKind.Unit, languages.CompletionItemKind.Unit], + [types.CompletionItemKind.Value, languages.CompletionItemKind.Value], + [types.CompletionItemKind.Constant, languages.CompletionItemKind.Constant], + [types.CompletionItemKind.Enum, languages.CompletionItemKind.Enum], + [types.CompletionItemKind.EnumMember, languages.CompletionItemKind.EnumMember], + [types.CompletionItemKind.Keyword, languages.CompletionItemKind.Keyword], + [types.CompletionItemKind.Snippet, languages.CompletionItemKind.Snippet], + [types.CompletionItemKind.Text, languages.CompletionItemKind.Text], + [types.CompletionItemKind.Color, languages.CompletionItemKind.Color], + [types.CompletionItemKind.File, languages.CompletionItemKind.File], + [types.CompletionItemKind.Reference, languages.CompletionItemKind.Reference], + [types.CompletionItemKind.Folder, languages.CompletionItemKind.Folder], + [types.CompletionItemKind.Event, languages.CompletionItemKind.Event], + [types.CompletionItemKind.Operator, languages.CompletionItemKind.Operator], + [types.CompletionItemKind.TypeParameter, languages.CompletionItemKind.TypeParameter], + [types.CompletionItemKind.Issue, languages.CompletionItemKind.Issue], + [types.CompletionItemKind.User, languages.CompletionItemKind.User], ]); - export function from(kind: types.CompletionItemKind): modes.CompletionItemKind { - return _from.get(kind) ?? modes.CompletionItemKind.Property; + export function from(kind: types.CompletionItemKind): languages.CompletionItemKind { + return _from.get(kind) ?? languages.CompletionItemKind.Property; } - const _to = new Map([ - [modes.CompletionItemKind.Method, types.CompletionItemKind.Method], - [modes.CompletionItemKind.Function, types.CompletionItemKind.Function], - [modes.CompletionItemKind.Constructor, types.CompletionItemKind.Constructor], - [modes.CompletionItemKind.Field, types.CompletionItemKind.Field], - [modes.CompletionItemKind.Variable, types.CompletionItemKind.Variable], - [modes.CompletionItemKind.Class, types.CompletionItemKind.Class], - [modes.CompletionItemKind.Interface, types.CompletionItemKind.Interface], - [modes.CompletionItemKind.Struct, types.CompletionItemKind.Struct], - [modes.CompletionItemKind.Module, types.CompletionItemKind.Module], - [modes.CompletionItemKind.Property, types.CompletionItemKind.Property], - [modes.CompletionItemKind.Unit, types.CompletionItemKind.Unit], - [modes.CompletionItemKind.Value, types.CompletionItemKind.Value], - [modes.CompletionItemKind.Constant, types.CompletionItemKind.Constant], - [modes.CompletionItemKind.Enum, types.CompletionItemKind.Enum], - [modes.CompletionItemKind.EnumMember, types.CompletionItemKind.EnumMember], - [modes.CompletionItemKind.Keyword, types.CompletionItemKind.Keyword], - [modes.CompletionItemKind.Snippet, types.CompletionItemKind.Snippet], - [modes.CompletionItemKind.Text, types.CompletionItemKind.Text], - [modes.CompletionItemKind.Color, types.CompletionItemKind.Color], - [modes.CompletionItemKind.File, types.CompletionItemKind.File], - [modes.CompletionItemKind.Reference, types.CompletionItemKind.Reference], - [modes.CompletionItemKind.Folder, types.CompletionItemKind.Folder], - [modes.CompletionItemKind.Event, types.CompletionItemKind.Event], - [modes.CompletionItemKind.Operator, types.CompletionItemKind.Operator], - [modes.CompletionItemKind.TypeParameter, types.CompletionItemKind.TypeParameter], - [modes.CompletionItemKind.User, types.CompletionItemKind.User], - [modes.CompletionItemKind.Issue, types.CompletionItemKind.Issue], + const _to = new Map([ + [languages.CompletionItemKind.Method, types.CompletionItemKind.Method], + [languages.CompletionItemKind.Function, types.CompletionItemKind.Function], + [languages.CompletionItemKind.Constructor, types.CompletionItemKind.Constructor], + [languages.CompletionItemKind.Field, types.CompletionItemKind.Field], + [languages.CompletionItemKind.Variable, types.CompletionItemKind.Variable], + [languages.CompletionItemKind.Class, types.CompletionItemKind.Class], + [languages.CompletionItemKind.Interface, types.CompletionItemKind.Interface], + [languages.CompletionItemKind.Struct, types.CompletionItemKind.Struct], + [languages.CompletionItemKind.Module, types.CompletionItemKind.Module], + [languages.CompletionItemKind.Property, types.CompletionItemKind.Property], + [languages.CompletionItemKind.Unit, types.CompletionItemKind.Unit], + [languages.CompletionItemKind.Value, types.CompletionItemKind.Value], + [languages.CompletionItemKind.Constant, types.CompletionItemKind.Constant], + [languages.CompletionItemKind.Enum, types.CompletionItemKind.Enum], + [languages.CompletionItemKind.EnumMember, types.CompletionItemKind.EnumMember], + [languages.CompletionItemKind.Keyword, types.CompletionItemKind.Keyword], + [languages.CompletionItemKind.Snippet, types.CompletionItemKind.Snippet], + [languages.CompletionItemKind.Text, types.CompletionItemKind.Text], + [languages.CompletionItemKind.Color, types.CompletionItemKind.Color], + [languages.CompletionItemKind.File, types.CompletionItemKind.File], + [languages.CompletionItemKind.Reference, types.CompletionItemKind.Reference], + [languages.CompletionItemKind.Folder, types.CompletionItemKind.Folder], + [languages.CompletionItemKind.Event, types.CompletionItemKind.Event], + [languages.CompletionItemKind.Operator, types.CompletionItemKind.Operator], + [languages.CompletionItemKind.TypeParameter, types.CompletionItemKind.TypeParameter], + [languages.CompletionItemKind.User, types.CompletionItemKind.User], + [languages.CompletionItemKind.Issue, types.CompletionItemKind.Issue], ]); - export function to(kind: modes.CompletionItemKind): types.CompletionItemKind { + export function to(kind: languages.CompletionItemKind): types.CompletionItemKind { return _to.get(kind) ?? types.CompletionItemKind.Property; } } export namespace CompletionItem { - export function to(suggestion: modes.CompletionItem, converter?: CommandsConverter): types.CompletionItem { + export function to(suggestion: languages.CompletionItem, converter?: Command.ICommandsConverter): types.CompletionItem { const result = new types.CompletionItem(suggestion.label); result.insertText = suggestion.insertText; @@ -1078,16 +1089,16 @@ export namespace CompletionItem { result.range = { inserting: Range.to(suggestion.range.insert), replacing: Range.to(suggestion.range.replace) }; } - result.keepWhitespace = typeof suggestion.insertTextRules === 'undefined' ? false : Boolean(suggestion.insertTextRules & modes.CompletionItemInsertTextRule.KeepWhitespace); + result.keepWhitespace = typeof suggestion.insertTextRules === 'undefined' ? false : Boolean(suggestion.insertTextRules & languages.CompletionItemInsertTextRule.KeepWhitespace); // 'insertText'-logic - if (typeof suggestion.insertTextRules !== 'undefined' && suggestion.insertTextRules & modes.CompletionItemInsertTextRule.InsertAsSnippet) { + if (typeof suggestion.insertTextRules !== 'undefined' && suggestion.insertTextRules & languages.CompletionItemInsertTextRule.InsertAsSnippet) { result.insertText = new types.SnippetString(suggestion.insertText); } else { result.insertText = suggestion.insertText; result.textEdit = result.range instanceof types.Range ? new types.TextEdit(result.range, result.insertText) : undefined; } if (suggestion.additionalTextEdits && suggestion.additionalTextEdits.length > 0) { - result.additionalTextEdits = suggestion.additionalTextEdits.map(e => TextEdit.to(e as modes.TextEdit)); + result.additionalTextEdits = suggestion.additionalTextEdits.map(e => TextEdit.to(e as languages.TextEdit)); } result.command = converter && suggestion.command ? converter.fromInternal(suggestion.command) : undefined; @@ -1096,13 +1107,13 @@ export namespace CompletionItem { } export namespace ParameterInformation { - export function from(info: types.ParameterInformation): modes.ParameterInformation { + export function from(info: types.ParameterInformation): languages.ParameterInformation { return { label: info.label, - documentation: info.documentation ? MarkdownString.fromStrict(info.documentation) : undefined + documentation: MarkdownString.fromStrict(info.documentation) }; } - export function to(info: modes.ParameterInformation): types.ParameterInformation { + export function to(info: languages.ParameterInformation): types.ParameterInformation { return { label: info.label, documentation: htmlContent.isMarkdownString(info.documentation) ? MarkdownString.to(info.documentation) : info.documentation @@ -1112,16 +1123,16 @@ export namespace ParameterInformation { export namespace SignatureInformation { - export function from(info: types.SignatureInformation): modes.SignatureInformation { + export function from(info: types.SignatureInformation): languages.SignatureInformation { return { label: info.label, - documentation: info.documentation ? MarkdownString.fromStrict(info.documentation) : undefined, + documentation: MarkdownString.fromStrict(info.documentation), parameters: Array.isArray(info.parameters) ? info.parameters.map(ParameterInformation.from) : [], activeParameter: info.activeParameter, }; } - export function to(info: modes.SignatureInformation): types.SignatureInformation { + export function to(info: languages.SignatureInformation): types.SignatureInformation { return { label: info.label, documentation: htmlContent.isMarkdownString(info.documentation) ? MarkdownString.to(info.documentation) : info.documentation, @@ -1133,7 +1144,7 @@ export namespace SignatureInformation { export namespace SignatureHelp { - export function from(help: types.SignatureHelp): modes.SignatureHelp { + export function from(help: types.SignatureHelp): languages.SignatureHelp { return { activeSignature: help.activeSignature, activeParameter: help.activeParameter, @@ -1141,7 +1152,7 @@ export namespace SignatureHelp { }; } - export function to(help: modes.SignatureHelp): types.SignatureHelp { + export function to(help: languages.SignatureHelp): types.SignatureHelp { return { activeSignature: help.activeSignature, activeParameter: help.activeParameter, @@ -1152,45 +1163,49 @@ export namespace SignatureHelp { export namespace InlayHint { - export function to(converter: CommandsConverter, hint: modes.InlayHint): vscode.InlayHint { + export function to(converter: Command.ICommandsConverter, hint: languages.InlayHint): vscode.InlayHint { const res = new types.InlayHint( - typeof hint.label === 'string' ? hint.label : hint.label.map(InlayHintLabelPart.to.bind(undefined, converter)), Position.to(hint.position), - InlayHintKind.to(hint.kind) + typeof hint.label === 'string' ? hint.label : hint.label.map(InlayHintLabelPart.to.bind(undefined, converter)), + hint.kind && InlayHintKind.to(hint.kind) ); res.tooltip = htmlContent.isMarkdownString(hint.tooltip) ? MarkdownString.to(hint.tooltip) : hint.tooltip; - res.whitespaceAfter = hint.whitespaceAfter; - res.whitespaceBefore = hint.whitespaceBefore; + res.command = hint.command && converter.fromInternal(hint.command); + res.paddingLeft = hint.paddingLeft; + res.paddingRight = hint.paddingRight; return res; } } export namespace InlayHintLabelPart { - export function to(converter: CommandsConverter, part: modes.InlayHintLabelPart): types.InlayHintLabelPart { + export function to(converter: Command.ICommandsConverter, part: languages.InlayHintLabelPart): types.InlayHintLabelPart { const result = new types.InlayHintLabelPart(part.label); - result.collapsible = part.collapsible; - if (modes.Command.is(part.action)) { - result.action = converter.fromInternal(part.action); - } else if (part.action) { - result.action = location.to(part.action); + result.tooltip = htmlContent.isMarkdownString(part.tooltip) + ? MarkdownString.to(part.tooltip) + : part.tooltip; + if (languages.Command.is(part.command)) { + result.command = converter.fromInternal(part.command); + } + if (part.location) { + result.location = location.to(part.location); } return result; } } export namespace InlayHintKind { - export function from(kind: vscode.InlayHintKind): modes.InlayHintKind { + export function from(kind: vscode.InlayHintKind): languages.InlayHintKind { return kind; } - export function to(kind: modes.InlayHintKind): vscode.InlayHintKind { + export function to(kind: languages.InlayHintKind): vscode.InlayHintKind { return kind; } } export namespace DocumentLink { - export function from(link: vscode.DocumentLink): modes.ILink { + export function from(link: vscode.DocumentLink): languages.ILink { return { range: Range.from(link.range), url: link.target, @@ -1198,7 +1213,7 @@ export namespace DocumentLink { }; } - export function to(link: modes.ILink): vscode.DocumentLink { + export function to(link: languages.ILink): vscode.DocumentLink { let target: URI | undefined = undefined; if (link.url) { try { @@ -1212,7 +1227,7 @@ export namespace DocumentLink { } export namespace ColorPresentation { - export function to(colorPresentation: modes.IColorPresentation): types.ColorPresentation { + export function to(colorPresentation: languages.IColorPresentation): types.ColorPresentation { const cp = new types.ColorPresentation(colorPresentation.label); if (colorPresentation.textEdit) { cp.textEdit = TextEdit.to(colorPresentation.textEdit); @@ -1223,7 +1238,7 @@ export namespace ColorPresentation { return cp; } - export function from(colorPresentation: vscode.ColorPresentation): modes.IColorPresentation { + export function from(colorPresentation: vscode.ColorPresentation): languages.IColorPresentation { return { label: colorPresentation.label, textEdit: colorPresentation.textEdit ? TextEdit.from(colorPresentation.textEdit) : undefined, @@ -1243,11 +1258,11 @@ export namespace Color { export namespace SelectionRange { - export function from(obj: vscode.SelectionRange): modes.SelectionRange { + export function from(obj: vscode.SelectionRange): languages.SelectionRange { return { range: Range.from(obj.range) }; } - export function to(obj: modes.SelectionRange): vscode.SelectionRange { + export function to(obj: languages.SelectionRange): vscode.SelectionRange { return new types.SelectionRange(Range.to(obj.range)); } } @@ -1329,8 +1344,8 @@ export namespace ProgressLocation { } export namespace FoldingRange { - export function from(r: vscode.FoldingRange): modes.FoldingRange { - const range: modes.FoldingRange = { start: r.start + 1, end: r.end + 1 }; + export function from(r: vscode.FoldingRange): languages.FoldingRange { + const range: languages.FoldingRange = { start: r.start + 1, end: r.end + 1 }; if (r.kind) { range.kind = FoldingRangeKind.from(r.kind); } @@ -1339,15 +1354,15 @@ export namespace FoldingRange { } export namespace FoldingRangeKind { - export function from(kind: vscode.FoldingRangeKind | undefined): modes.FoldingRangeKind | undefined { + export function from(kind: vscode.FoldingRangeKind | undefined): languages.FoldingRangeKind | undefined { if (kind) { switch (kind) { case types.FoldingRangeKind.Comment: - return modes.FoldingRangeKind.Comment; + return languages.FoldingRangeKind.Comment; case types.FoldingRangeKind.Imports: - return modes.FoldingRangeKind.Imports; + return languages.FoldingRangeKind.Imports; case types.FoldingRangeKind.Region: - return modes.FoldingRangeKind.Region; + return languages.FoldingRangeKind.Region; } } return undefined; @@ -1404,8 +1419,8 @@ export namespace GlobPattern { return pattern; // preserve `undefined` and `null` } - function isRelativePatternShape(obj: unknown): obj is { base: string, baseUri: URI, pattern: string } { - const rp = obj as { base: string, baseUri: URI, pattern: string } | undefined | null; + function isRelativePatternShape(obj: unknown): obj is { base: string; baseUri: URI; pattern: string } { + const rp = obj as { base: string; baseUri: URI; pattern: string } | undefined | null; if (!rp) { return false; } @@ -1413,13 +1428,13 @@ export namespace GlobPattern { return URI.isUri(rp.baseUri) && typeof rp.pattern === 'string'; } - function isLegacyRelativePatternShape(obj: unknown): obj is { base: string, pattern: string } { + function isLegacyRelativePatternShape(obj: unknown): obj is { base: string; pattern: string } { // Before 1.64.x, `RelativePattern` did not have any `baseUri: Uri` // property. To preserve backwards compatibility with older extensions // we allow this old format when creating the `vscode.RelativePattern`. - const rp = obj as { base: string, pattern: string } | undefined | null; + const rp = obj as { base: string; pattern: string } | undefined | null; if (!rp) { return false; } @@ -1594,11 +1609,11 @@ export namespace NotebookCellOutput { export namespace NotebookExclusiveDocumentPattern { - export function from(pattern: { include: vscode.GlobPattern | undefined, exclude: vscode.GlobPattern | undefined }): { include: string | extHostProtocol.IRelativePatternDto | undefined, exclude: string | extHostProtocol.IRelativePatternDto | undefined }; + export function from(pattern: { include: vscode.GlobPattern | undefined; exclude: vscode.GlobPattern | undefined }): { include: string | extHostProtocol.IRelativePatternDto | undefined; exclude: string | extHostProtocol.IRelativePatternDto | undefined }; export function from(pattern: vscode.GlobPattern): string | extHostProtocol.IRelativePatternDto; export function from(pattern: undefined): undefined; - export function from(pattern: { include: vscode.GlobPattern | undefined | null, exclude: vscode.GlobPattern | undefined } | vscode.GlobPattern | undefined): string | extHostProtocol.IRelativePatternDto | { include: string | extHostProtocol.IRelativePatternDto | undefined, exclude: string | extHostProtocol.IRelativePatternDto | undefined } | undefined; - export function from(pattern: { include: vscode.GlobPattern | undefined | null, exclude: vscode.GlobPattern | undefined } | vscode.GlobPattern | undefined): string | extHostProtocol.IRelativePatternDto | { include: string | extHostProtocol.IRelativePatternDto | undefined, exclude: string | extHostProtocol.IRelativePatternDto | undefined } | undefined { + export function from(pattern: { include: vscode.GlobPattern | undefined | null; exclude: vscode.GlobPattern | undefined } | vscode.GlobPattern | undefined): string | extHostProtocol.IRelativePatternDto | { include: string | extHostProtocol.IRelativePatternDto | undefined; exclude: string | extHostProtocol.IRelativePatternDto | undefined } | undefined; + export function from(pattern: { include: vscode.GlobPattern | undefined | null; exclude: vscode.GlobPattern | undefined } | vscode.GlobPattern | undefined): string | extHostProtocol.IRelativePatternDto | { include: string | extHostProtocol.IRelativePatternDto | undefined; exclude: string | extHostProtocol.IRelativePatternDto | undefined } | undefined { if (isExclusivePattern(pattern)) { return { include: withNullAsUndefined(GlobPattern.from(pattern.include)), @@ -1609,7 +1624,7 @@ export namespace NotebookExclusiveDocumentPattern { return withNullAsUndefined(GlobPattern.from(pattern)); } - export function to(pattern: string | extHostProtocol.IRelativePatternDto | { include: string | extHostProtocol.IRelativePatternDto, exclude: string | extHostProtocol.IRelativePatternDto }): { include: vscode.GlobPattern, exclude: vscode.GlobPattern } | vscode.GlobPattern { + export function to(pattern: string | extHostProtocol.IRelativePatternDto | { include: string | extHostProtocol.IRelativePatternDto; exclude: string | extHostProtocol.IRelativePatternDto }): { include: vscode.GlobPattern; exclude: vscode.GlobPattern } | vscode.GlobPattern { if (isExclusivePattern(pattern)) { return { include: GlobPattern.to(pattern.include), @@ -1620,8 +1635,8 @@ export namespace NotebookExclusiveDocumentPattern { return GlobPattern.to(pattern); } - function isExclusivePattern(obj: any): obj is { include?: T, exclude?: T } { - const ep = obj as { include?: T, exclude?: T } | undefined | null; + function isExclusivePattern(obj: any): obj is { include?: T; exclude?: T } { + const ep = obj as { include?: T; exclude?: T } | undefined | null; if (!ep) { return false; } @@ -1641,7 +1656,7 @@ export namespace NotebookDecorationRenderOptions { } export namespace NotebookStatusBarItem { - export function from(item: vscode.NotebookCellStatusBarItem, commandsConverter: CommandsConverter, disposables: DisposableStore): notebooks.INotebookCellStatusBarItem { + export function from(item: vscode.NotebookCellStatusBarItem, commandsConverter: Command.ICommandsConverter, disposables: DisposableStore): notebooks.INotebookCellStatusBarItem { const command = typeof item.command === 'string' ? { title: '', command: item.command } : item.command; return { alignment: item.alignment === types.NotebookCellStatusBarAlignment.Left ? notebooks.CellStatusbarAlignment.Left : notebooks.CellStatusbarAlignment.Right, @@ -1677,17 +1692,17 @@ export namespace NotebookRendererScript { } export namespace TestMessage { - export function from(message: vscode.TestMessage): SerializedTestErrorMessage { + export function from(message: vscode.TestMessage): ITestErrorMessage.Serialized { return { message: MarkdownString.fromStrict(message.message) || '', type: TestMessageType.Error, expected: message.expectedOutput, actual: message.actualOutput, - location: message.location ? location.from(message.location) as any : undefined, + location: message.location && ({ range: Range.from(message.location.range), uri: message.location.uri }), }; } - export function to(item: SerializedTestErrorMessage): vscode.TestMessage { + export function to(item: ITestErrorMessage.Serialized): vscode.TestMessage { const message = new types.TestMessage(typeof item.message === 'string' ? item.message : MarkdownString.to(item.message)); message.actualOutput = item.actual; message.expectedOutput = item.expected; @@ -1697,17 +1712,9 @@ export namespace TestMessage { } export namespace TestTag { - const enum Constants { - Delimiter = '\0', - } + export const namespace = namespaceTestTag; - export const namespace = (ctrlId: string, tagId: string) => - ctrlId + Constants.Delimiter + tagId; - - export const denamespace = (namespaced: string) => { - const index = namespaced.indexOf(Constants.Delimiter); - return { ctrlId: namespaced.slice(0, index), tagId: namespaced.slice(index + 1) }; - }; + export const denamespace = denamespaceTestTag; } export namespace TestItem { @@ -1718,15 +1725,17 @@ export namespace TestItem { return { extId: TestId.fromExtHostTestItem(item, ctrlId).toString(), label: item.label, - uri: item.uri, + uri: URI.revive(item.uri), + busy: false, tags: item.tags.map(t => TestTag.namespace(ctrlId, t.id)), - range: Range.from(item.range) || null, + range: editorRange.Range.lift(Range.from(item.range)), description: item.description || null, + sortText: item.sortText || null, error: item.error ? (MarkdownString.fromStrict(item.error) || null) : null, }; } - export function toPlain(item: ITestItem): Omit { + export function toPlain(item: ITestItem.Serialized): Omit { return { parent: undefined, error: undefined, @@ -1742,14 +1751,16 @@ export namespace TestItem { canResolveChildren: false, busy: false, description: item.description || undefined, + sortText: item.sortText || undefined, }; } function to(item: ITestItem): TestItemImpl { const testId = TestId.fromString(item.extId); - const testItem = new TestItemImpl(testId.controllerId, testId.localId, item.label, URI.revive(item.uri)); + const testItem = new TestItemImpl(testId.controllerId, testId.localId, item.label, URI.revive(item.uri) || undefined); testItem.range = Range.to(item.range || undefined); testItem.description = item.description || undefined; + testItem.sortText = item.sortText || undefined; return testItem; } @@ -1776,7 +1787,7 @@ export namespace TestTag { } export namespace TestResults { - const convertTestResultItem = (item: SerializedTestResultItem, byInternalId: Map): vscode.TestResultSnapshot => { + const convertTestResultItem = (item: TestResultItem.Serialized, byInternalId: Map): vscode.TestResultSnapshot => { const snapshot: vscode.TestResultSnapshot = ({ ...TestItem.toPlain(item.item), parent: undefined, @@ -1784,7 +1795,7 @@ export namespace TestResults { state: t.state as number as types.TestResultState, duration: t.duration, messages: t.messages - .filter((m): m is ITestErrorMessage => m.type === TestMessageType.Error) + .filter((m): m is ITestErrorMessage.Serialized => m.type === TestMessageType.Error) .map(TestMessage.to), })), children: item.children @@ -1801,8 +1812,8 @@ export namespace TestResults { }; export function to(serialized: ISerializedTestResults): vscode.TestRunResult { - const roots: SerializedTestResultItem[] = []; - const byInternalId = new Map(); + const roots: TestResultItem.Serialized[] = []; + const byInternalId = new Map(); for (const item of serialized.items) { byInternalId.set(item.item.extId, item); if (serialized.request.targets.some(t => t.controllerId === item.controllerId && t.testIds.includes(item.item.extId))) { @@ -1858,12 +1869,12 @@ export namespace TestCoverage { export namespace CodeActionTriggerKind { - export function to(value: modes.CodeActionTriggerType): types.CodeActionTriggerKind { + export function to(value: languages.CodeActionTriggerType): types.CodeActionTriggerKind { switch (value) { - case modes.CodeActionTriggerType.Invoke: + case languages.CodeActionTriggerType.Invoke: return types.CodeActionTriggerKind.Invoke; - case modes.CodeActionTriggerType.Auto: + case languages.CodeActionTriggerType.Auto: return types.CodeActionTriggerKind.Automatic; } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index d08fb7bd57a..f70d207a764 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -31,8 +31,8 @@ function es5ClassCompat(target: Function): any { @es5ClassCompat export class Disposable { - static from(...inDisposables: { dispose(): any; }[]): Disposable { - let disposables: ReadonlyArray<{ dispose(): any; }> | undefined = inDisposables; + static from(...inDisposables: { dispose(): any }[]): Disposable { + let disposables: ReadonlyArray<{ dispose(): any }> | undefined = inDisposables; return new Disposable(function () { if (disposables) { for (const disposable of disposables) { @@ -176,9 +176,9 @@ export class Position { } } - translate(change: { lineDelta?: number; characterDelta?: number; }): Position; + translate(change: { lineDelta?: number; characterDelta?: number }): Position; translate(lineDelta?: number, characterDelta?: number): Position; - translate(lineDeltaOrChange: number | undefined | { lineDelta?: number; characterDelta?: number; }, characterDelta: number = 0): Position { + translate(lineDeltaOrChange: number | undefined | { lineDelta?: number; characterDelta?: number }, characterDelta: number = 0): Position { if (lineDeltaOrChange === null || characterDelta === null) { throw illegalArgument(); @@ -200,9 +200,9 @@ export class Position { return new Position(this.line + lineDelta, this.character + characterDelta); } - with(change: { line?: number; character?: number; }): Position; + with(change: { line?: number; character?: number }): Position; with(line?: number, character?: number): Position; - with(lineOrChange: number | undefined | { line?: number; character?: number; }, character: number = this.character): Position { + with(lineOrChange: number | undefined | { line?: number; character?: number }, character: number = this.character): Position { if (lineOrChange === null || character === null) { throw illegalArgument(); @@ -335,9 +335,9 @@ export class Range { return this._start.line === this._end.line; } - with(change: { start?: Position, end?: Position; }): Range; + with(change: { start?: Position; end?: Position }): Range; with(start?: Position, end?: Position): Range; - with(startOrChange: Position | undefined | { start?: Position, end?: Position; }, end: Position = this.end): Range { + with(startOrChange: Position | undefined | { start?: Position; end?: Position }, end: Position = this.end): Range { if (startOrChange === null || end === null) { throw illegalArgument(); @@ -639,15 +639,15 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit { // --- file - renameFile(from: vscode.Uri, to: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }, metadata?: vscode.WorkspaceEditEntryMetadata): void { + renameFile(from: vscode.Uri, to: vscode.Uri, options?: { overwrite?: boolean; ignoreIfExists?: boolean }, metadata?: vscode.WorkspaceEditEntryMetadata): void { this._edits.push({ _type: FileEditType.File, from, to, options, metadata }); } - createFile(uri: vscode.Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean; }, metadata?: vscode.WorkspaceEditEntryMetadata): void { + createFile(uri: vscode.Uri, options?: { overwrite?: boolean; ignoreIfExists?: boolean }, metadata?: vscode.WorkspaceEditEntryMetadata): void { this._edits.push({ _type: FileEditType.File, from: undefined, to: uri, options, metadata }); } - deleteFile(uri: vscode.Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean; }, metadata?: vscode.WorkspaceEditEntryMetadata): void { + deleteFile(uri: vscode.Uri, options?: { recursive?: boolean; ignoreIfNotExists?: boolean }, metadata?: vscode.WorkspaceEditEntryMetadata): void { this._edits.push({ _type: FileEditType.File, from: uri, to: undefined, options, metadata }); } @@ -1353,6 +1353,14 @@ export class MarkdownString implements vscode.MarkdownString { this.#delegate.supportHtml = value; } + get baseUri(): vscode.Uri | undefined { + return this.#delegate.baseUri; + } + + set baseUri(value: vscode.Uri | undefined) { + this.#delegate.baseUri = value; + } + appendText(value: string): vscode.MarkdownString { this.#delegate.appendText(value); return this; @@ -1416,36 +1424,37 @@ export enum SignatureHelpTriggerKind { export enum InlayHintKind { - Other = 0, Type = 1, Parameter = 2, } @es5ClassCompat export class InlayHintLabelPart { - label: string; - collapsible?: boolean; - action?: vscode.Command | Location; // invokes provider - constructor(label: string) { - this.label = label; - } - toString(): string { - return this.label; + + value: string; + tooltip?: string | vscode.MarkdownString; + location?: Location; + command?: vscode.Command; + + constructor(value: string) { + this.value = value; } } @es5ClassCompat export class InlayHint implements vscode.InlayHint { + label: string | InlayHintLabelPart[]; tooltip?: string | vscode.MarkdownString; position: Position; kind?: vscode.InlayHintKind; - whitespaceBefore?: boolean; - whitespaceAfter?: boolean; + paddingLeft?: boolean; + paddingRight?: boolean; + command?: vscode.Command; - constructor(label: string | InlayHintLabelPart[], position: Position, kind?: vscode.InlayHintKind) { - this.label = label; + constructor(position: Position, label: string | InlayHintLabelPart[], kind?: vscode.InlayHintKind) { this.position = position; + this.label = label; this.kind = kind; } } @@ -1514,7 +1523,7 @@ export class CompletionItem implements vscode.CompletionItem { preselect?: boolean; insertText?: string | SnippetString; keepWhitespace?: boolean; - range?: Range | { inserting: Range; replacing: Range; }; + range?: Range | { inserting: Range; replacing: Range }; commitCharacters?: string[]; textEdit?: TextEdit; additionalTextEdits?: TextEdit[]; @@ -1693,7 +1702,7 @@ export class Color { } } -export type IColorFormat = string | { opaque: string, transparent: string; }; +export type IColorFormat = string | { opaque: string; transparent: string }; @es5ClassCompat export class ColorInformation { @@ -2009,19 +2018,19 @@ export enum TaskScope { } export class CustomExecution implements vscode.CustomExecution { - private _callback: (resolvedDefintion: vscode.TaskDefinition) => Thenable; - constructor(callback: (resolvedDefintion: vscode.TaskDefinition) => Thenable) { + private _callback: (resolvedDefinition: vscode.TaskDefinition) => Thenable; + constructor(callback: (resolvedDefinition: vscode.TaskDefinition) => Thenable) { this._callback = callback; } public computeId(): string { return 'customExecution' + generateUuid(); } - public set callback(value: (resolvedDefintion: vscode.TaskDefinition) => Thenable) { + public set callback(value: (resolvedDefinition: vscode.TaskDefinition) => Thenable) { this._callback = value; } - public get callback(): ((resolvedDefintion: vscode.TaskDefinition) => Thenable) { + public get callback(): ((resolvedDefinition: vscode.TaskDefinition) => Thenable) { return this._callback; } } @@ -2288,7 +2297,7 @@ export class TreeItem { label?: string | vscode.TreeItemLabel; resourceUri?: URI; - iconPath?: string | URI | { light: string | URI; dark: string | URI; }; + iconPath?: string | URI | { light: string | URI; dark: string | URI }; command?: vscode.Command; contextValue?: string; tooltip?: string | vscode.MarkdownString; @@ -2314,10 +2323,10 @@ export enum TreeItemCollapsibleState { @es5ClassCompat export class TreeDataTransferItem { async asString(): Promise { - return JSON.stringify(this._value); + return JSON.stringify(this.value); } - constructor(private readonly _value: any) { } + constructor(public readonly value: any) { } } @es5ClassCompat @@ -2938,17 +2947,6 @@ export enum DebugConsoleMode { MergeWithParent = 1 } -export enum DebugConfigurationProviderTriggerKind { - /** - * `DebugConfigurationProvider.provideDebugConfigurations` is called to provide the initial debug configurations for a newly created launch.json. - */ - Initial = 1, - /** - * `DebugConfigurationProvider.provideDebugConfigurations` is called to provide dynamically generated debug configurations when the user asks for them through the UI (e.g. via the "Select and Start Debugging" command). - */ - Dynamic = 2 -} - //#endregion @es5ClassCompat @@ -2961,7 +2959,7 @@ export class QuickInputButtons { export enum QuickPickItemKind { Separator = -1, - Default = 1, + Default = 0, } export enum ExtensionKind { @@ -3060,7 +3058,7 @@ export class NotebookRange { } } - with(change: { start?: number, end?: number }): NotebookRange { + with(change: { start?: number; end?: number }): NotebookRange { let start = this._start; let end = this._end; @@ -3145,7 +3143,7 @@ export class NotebookCellOutputItem { && (obj).data instanceof Uint8Array; } - static error(err: Error | { name: string, message?: string, stack?: string }): NotebookCellOutputItem { + static error(err: Error | { name: string; message?: string; stack?: string }): NotebookCellOutputItem { const obj = { name: err.name, message: err.message, diff --git a/src/vs/workbench/api/common/extHostUriOpener.ts b/src/vs/workbench/api/common/extHostUriOpener.ts index 2125cb9839f..4e3577ec1f7 100644 --- a/src/vs/workbench/api/common/extHostUriOpener.ts +++ b/src/vs/workbench/api/common/extHostUriOpener.ts @@ -7,7 +7,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI, UriComponents } from 'vs/base/common/uri'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import type * as vscode from 'vscode'; import { ExtHostUriOpenersShape, IMainContext, MainContext, MainThreadUriOpenersShape } from './extHost.protocol'; @@ -51,7 +51,7 @@ export class ExtHostUriOpeners implements ExtHostUriOpenersShape { }); } - async $canOpenUri(id: string, uriComponents: UriComponents, token: CancellationToken): Promise { + async $canOpenUri(id: string, uriComponents: UriComponents, token: CancellationToken): Promise { const opener = this._openers.get(id); if (!opener) { throw new Error(`Unknown opener with id: ${id}`); @@ -61,7 +61,7 @@ export class ExtHostUriOpeners implements ExtHostUriOpenersShape { return opener.canOpenExternalUri(uri, token); } - async $openUri(id: string, context: { resolvedUri: UriComponents, sourceUri: UriComponents }, token: CancellationToken): Promise { + async $openUri(id: string, context: { resolvedUri: UriComponents; sourceUri: UriComponents }, token: CancellationToken): Promise { const opener = this._openers.get(id); if (!opener) { throw new Error(`Unknown opener id: '${id}'`); diff --git a/src/vs/workbench/api/common/extHostWebview.ts b/src/vs/workbench/api/common/extHostWebview.ts index 6058b981233..d0abc76fdd1 100644 --- a/src/vs/workbench/api/common/extHostWebview.ts +++ b/src/vs/workbench/api/common/extHostWebview.ts @@ -13,7 +13,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IExtHostApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService'; import { serializeWebviewMessage, deserializeWebviewMessage } from 'vs/workbench/api/common/extHostWebviewMessaging'; import { IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; -import { asWebviewUri, webviewGenericCspSource, WebviewInitData } from 'vs/workbench/api/common/shared/webview'; +import { asWebviewUri, webviewGenericCspSource, WebviewInitData } from 'vs/workbench/common/webview'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import type * as vscode from 'vscode'; import * as extHostProtocol from './extHost.protocol'; diff --git a/src/vs/workbench/api/common/extHostWebviewMessaging.ts b/src/vs/workbench/api/common/extHostWebviewMessaging.ts index bba4171c6f1..b67625e2f24 100644 --- a/src/vs/workbench/api/common/extHostWebviewMessaging.ts +++ b/src/vs/workbench/api/common/extHostWebviewMessaging.ts @@ -22,7 +22,7 @@ class ArrayBufferSet { export function serializeWebviewMessage( message: any, options: { serializeBuffersForPostMessage?: boolean } -): { message: string, buffers: VSBuffer[] } { +): { message: string; buffers: VSBuffer[] } { if (options.serializeBuffersForPostMessage) { // Extract all ArrayBuffers from the message and replace them with references. const arrayBuffers = new ArrayBufferSet(); @@ -83,7 +83,7 @@ function getTypedArrayType(value: ArrayBufferView): extHostProtocol.WebviewMessa return undefined; } -export function deserializeWebviewMessage(jsonMessage: string, buffers: VSBuffer[]): { message: any, arrayBuffers: ArrayBuffer[] } { +export function deserializeWebviewMessage(jsonMessage: string, buffers: VSBuffer[]): { message: any; arrayBuffers: ArrayBuffer[] } { const arrayBuffers: ArrayBuffer[] = buffers.map(buffer => { const arrayBuffer = new ArrayBuffer(buffer.byteLength); const uint8Array = new Uint8Array(arrayBuffer); diff --git a/src/vs/workbench/api/common/extHostWebviewPanels.ts b/src/vs/workbench/api/common/extHostWebviewPanels.ts index 188bda392c1..2f2e575ed76 100644 --- a/src/vs/workbench/api/common/extHostWebviewPanels.ts +++ b/src/vs/workbench/api/common/extHostWebviewPanels.ts @@ -17,7 +17,7 @@ import * as extHostProtocol from './extHost.protocol'; import * as extHostTypes from './extHostTypes'; -type IconPath = URI | { readonly light: URI, readonly dark: URI }; +type IconPath = URI | { readonly light: URI; readonly dark: URI }; class ExtHostWebviewPanel extends Disposable implements vscode.WebviewPanel { @@ -135,7 +135,7 @@ class ExtHostWebviewPanel extends Disposable implements vscode.WebviewPanel { return this.#visible; } - _updateViewState(newState: { active: boolean; visible: boolean; viewColumn: vscode.ViewColumn; }) { + _updateViewState(newState: { active: boolean; visible: boolean; viewColumn: vscode.ViewColumn }) { if (this.#isDisposed) { return; } @@ -151,7 +151,7 @@ class ExtHostWebviewPanel extends Disposable implements vscode.WebviewPanel { public reveal(viewColumn?: vscode.ViewColumn, preserveFocus?: boolean): void { this.assertNotDisposed(); this.#proxy.$reveal(this.#handle, { - viewColumn: viewColumn ? typeConverters.ViewColumn.from(viewColumn) : undefined, + viewColumn: typeof viewColumn === 'undefined' ? undefined : typeConverters.ViewColumn.from(viewColumn), preserveFocus: !!preserveFocus }); } @@ -190,7 +190,7 @@ export class ExtHostWebviewPanels implements extHostProtocol.ExtHostWebviewPanel extension: IExtensionDescription, viewType: string, title: string, - showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn, preserveFocus?: boolean }, + showOptions: vscode.ViewColumn | { viewColumn: vscode.ViewColumn; preserveFocus?: boolean }, options: (vscode.WebviewPanelOptions & vscode.WebviewOptions) = {}, ): vscode.WebviewPanel { const viewColumn = typeof showOptions === 'object' ? showOptions.viewColumn : showOptions; diff --git a/src/vs/workbench/api/common/extHostWebviewView.ts b/src/vs/workbench/api/common/extHostWebviewView.ts index d91a5d30d2c..ed711d56d9a 100644 --- a/src/vs/workbench/api/common/extHostWebviewView.ts +++ b/src/vs/workbench/api/common/extHostWebviewView.ts @@ -138,7 +138,7 @@ export class ExtHostWebviewViews implements extHostProtocol.ExtHostWebviewViewsS viewType: string, provider: vscode.WebviewViewProvider, webviewOptions?: { - retainContextWhenHidden?: boolean + retainContextWhenHidden?: boolean; }, ): vscode.Disposable { if (this._viewProviders.has(viewType)) { diff --git a/src/vs/workbench/api/common/extHostWorkspace.ts b/src/vs/workbench/api/common/extHostWorkspace.ts index 766282f0ec5..dda77ef065e 100644 --- a/src/vs/workbench/api/common/extHostWorkspace.ts +++ b/src/vs/workbench/api/common/extHostWorkspace.ts @@ -26,7 +26,7 @@ import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitData import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { GlobPattern } from 'vs/workbench/api/common/extHostTypeConverters'; import { Range } from 'vs/workbench/api/common/extHostTypes'; -import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { ITextQueryBuilderOptions } from 'vs/workbench/services/search/common/queryBuilder'; import { IRawFileMatch2, resultIsMatch } from 'vs/workbench/services/search/common/search'; import * as vscode from 'vscode'; import { ExtHostWorkspaceShape, IRelativePatternDto, IWorkspaceData, MainContext, MainThreadMessageOptions, MainThreadMessageServiceShape, MainThreadWorkspaceShape } from './extHost.protocol'; @@ -54,7 +54,7 @@ function compareWorkspaceFolderByUriAndNameAndIndex(a: vscode.WorkspaceFolder, b return isFolderEqual(a.uri, b.uri, extHostFileSystemInfo) ? compare(a.name, b.name) : compare(a.uri.toString(), b.uri.toString()); } -function delta(oldFolders: vscode.WorkspaceFolder[], newFolders: vscode.WorkspaceFolder[], compare: (a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo) => number, extHostFileSystemInfo: IExtHostFileSystemInfo): { removed: vscode.WorkspaceFolder[], added: vscode.WorkspaceFolder[]; } { +function delta(oldFolders: vscode.WorkspaceFolder[], newFolders: vscode.WorkspaceFolder[], compare: (a: vscode.WorkspaceFolder, b: vscode.WorkspaceFolder, extHostFileSystemInfo: IExtHostFileSystemInfo) => number, extHostFileSystemInfo: IExtHostFileSystemInfo): { removed: vscode.WorkspaceFolder[]; added: vscode.WorkspaceFolder[] } { const oldSortedFolders = oldFolders.slice(0).sort((a, b) => compare(a, b, extHostFileSystemInfo)); const newSortedFolders = newFolders.slice(0).sort((a, b) => compare(a, b, extHostFileSystemInfo)); @@ -73,7 +73,7 @@ interface MutableWorkspaceFolder extends vscode.WorkspaceFolder { class ExtHostWorkspaceImpl extends Workspace { - static toExtHostWorkspace(data: IWorkspaceData | null, previousConfirmedWorkspace: ExtHostWorkspaceImpl | undefined, previousUnconfirmedWorkspace: ExtHostWorkspaceImpl | undefined, extHostFileSystemInfo: IExtHostFileSystemInfo): { workspace: ExtHostWorkspaceImpl | null, added: vscode.WorkspaceFolder[], removed: vscode.WorkspaceFolder[]; } { + static toExtHostWorkspace(data: IWorkspaceData | null, previousConfirmedWorkspace: ExtHostWorkspaceImpl | undefined, previousUnconfirmedWorkspace: ExtHostWorkspaceImpl | undefined, extHostFileSystemInfo: IExtHostFileSystemInfo): { workspace: ExtHostWorkspaceImpl | null; added: vscode.WorkspaceFolder[]; removed: vscode.WorkspaceFolder[] } { if (!data) { return { workspace: null, added: [], removed: [] }; } @@ -257,8 +257,8 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac return this._actualWorkspace.workspaceFolders.slice(0); } - updateWorkspaceFolders(extension: IExtensionDescription, index: number, deleteCount: number, ...workspaceFoldersToAdd: { uri: vscode.Uri, name?: string; }[]): boolean { - const validatedDistinctWorkspaceFoldersToAdd: { uri: vscode.Uri, name?: string; }[] = []; + updateWorkspaceFolders(extension: IExtensionDescription, index: number, deleteCount: number, ...workspaceFoldersToAdd: { uri: vscode.Uri; name?: string }[]): boolean { + const validatedDistinctWorkspaceFoldersToAdd: { uri: vscode.Uri; name?: string }[] = []; if (Array.isArray(workspaceFoldersToAdd)) { workspaceFoldersToAdd.forEach(folderToAdd => { if (URI.isUri(folderToAdd.uri) && !validatedDistinctWorkspaceFoldersToAdd.some(f => isFolderEqual(f.uri, folderToAdd.uri, this._extHostFileSystemInfo))) { @@ -580,7 +580,7 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac export const IExtHostWorkspace = createDecorator('IExtHostWorkspace'); export interface IExtHostWorkspace extends ExtHostWorkspace, ExtHostWorkspaceShape, IExtHostWorkspaceProvider { } -function parseSearchInclude(include: string | IRelativePatternDto | undefined | null): { includePattern?: string, folder?: URI; } { +function parseSearchInclude(include: string | IRelativePatternDto | undefined | null): { includePattern?: string; folder?: URI } { let includePattern: string | undefined; let includeFolder: URI | undefined; if (include) { diff --git a/src/vs/workbench/services/extensions/common/extensionHostMain.ts b/src/vs/workbench/api/common/extensionHostMain.ts similarity index 95% rename from src/vs/workbench/services/extensions/common/extensionHostMain.ts rename to src/vs/workbench/api/common/extensionHostMain.ts index 6f575189eac..bfa0ac3126f 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostMain.ts +++ b/src/vs/workbench/api/common/extensionHostMain.ts @@ -10,7 +10,8 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IURITransformer } from 'vs/base/common/uriIpc'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; -import { IInitData, MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol'; +import { MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol'; +import { IExtensionHostInitData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { RPCProtocol } from 'vs/workbench/services/extensions/common/rpcProtocol'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; @@ -43,7 +44,7 @@ export class ExtensionHostMain { constructor( protocol: IMessagePassingProtocol, - initData: IInitData, + initData: IExtensionHostInitData, hostUtils: IHostUtils, uriTransformer: IURITransformer | null, messagePorts?: ReadonlyMap @@ -151,7 +152,7 @@ export class ExtensionHostMain { }); } - private static _transform(initData: IInitData, rpcProtocol: RPCProtocol): IInitData { + private static _transform(initData: IExtensionHostInitData, rpcProtocol: RPCProtocol): IExtensionHostInitData { initData.extensions.forEach((ext) => (ext).extensionLocation = URI.revive(rpcProtocol.transformIncomingURIs(ext.extensionLocation))); initData.environment.appRoot = URI.revive(rpcProtocol.transformIncomingURIs(initData.environment.appRoot)); const extDevLocs = initData.environment.extensionDevelopmentLocationURI; diff --git a/src/vs/workbench/api/common/shared/tasks.ts b/src/vs/workbench/api/common/shared/tasks.ts index 5f651acbc80..61c0d091a59 100644 --- a/src/vs/workbench/api/common/shared/tasks.ts +++ b/src/vs/workbench/api/common/shared/tasks.ts @@ -5,6 +5,7 @@ import { UriComponents } from 'vs/base/common/uri'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import type { Dto } from 'vs/workbench/services/extensions/common/proxyIdentifier'; export interface TaskDefinitionDTO { type: string; @@ -104,7 +105,7 @@ export interface TaskDTO { export interface TaskSetDTO { tasks: TaskDTO[]; - extension: IExtensionDescription; + extension: Dto; } export interface TaskExecutionDTO { diff --git a/src/vs/workbench/api/common/shared/treeDataTransfer.ts b/src/vs/workbench/api/common/shared/treeDataTransfer.ts index fb0f9acb536..18936dca2f3 100644 --- a/src/vs/workbench/api/common/shared/treeDataTransfer.ts +++ b/src/vs/workbench/api/common/shared/treeDataTransfer.ts @@ -19,7 +19,8 @@ export namespace TreeDataTransferConverter { const newDataTransfer: ITreeDataTransfer = new Map(); value.types.forEach((type, index) => { newDataTransfer.set(type, { - asString: async () => value.items[index].asString + asString: async () => value.items[index].asString, + value: undefined }); }); return newDataTransfer; diff --git a/src/vs/workbench/api/node/extHostCLIServer.ts b/src/vs/workbench/api/node/extHostCLIServer.ts index 2a03770b37e..ef6d9163ba7 100644 --- a/src/vs/workbench/api/node/extHostCLIServer.ts +++ b/src/vs/workbench/api/node/extHostCLIServer.ts @@ -9,8 +9,8 @@ import * as fs from 'fs'; import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { IWindowOpenable, IOpenWindowOptions } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; -import { hasWorkspaceFileExtension } from 'vs/platform/workspaces/common/workspaces'; import { ILogService } from 'vs/platform/log/common/log'; +import { hasWorkspaceFileExtension } from 'vs/platform/workspace/common/workspace'; export interface OpenCommandPipeArgs { type: 'open'; @@ -36,7 +36,7 @@ export interface StatusPipeArgs { export interface ExtensionManagementPipeArgs { type: 'extensionManagement'; - list?: { showVersions?: boolean, category?: string; }; + list?: { showVersions?: boolean; category?: string }; install?: string[]; uninstall?: string[]; force?: boolean; @@ -79,39 +79,45 @@ export class CLIServerBase { } private onRequest(req: http.IncomingMessage, res: http.ServerResponse): void { + const sendResponse = (statusCode: number, returnObj: any) => { + res.writeHead(statusCode, { 'content-type': 'application/json' }); + res.end(JSON.stringify(returnObj), (err?: any) => err && this.logService.error(err)); + }; + const chunks: string[] = []; req.setEncoding('utf8'); req.on('data', (d: string) => chunks.push(d)); - req.on('end', () => { - const data: PipeCommand | any = JSON.parse(chunks.join('')); - switch (data.type) { - case 'open': - this.open(data, res); - break; - case 'openExternal': - this.openExternal(data, res); - break; - case 'status': - this.getStatus(data, res); - break; - case 'extensionManagement': - this.manageExtensions(data, res) - .catch(this.logService.error); - break; - default: - res.writeHead(404); - res.write(`Unknown message type: ${data.type}`, err => { - if (err) { - this.logService.error(err); - } - }); - res.end(); - break; + req.on('end', async () => { + try { + const data: PipeCommand | any = JSON.parse(chunks.join('')); + let returnObj; + switch (data.type) { + case 'open': + returnObj = await this.open(data); + break; + case 'openExternal': + returnObj = await this.openExternal(data); + break; + case 'status': + returnObj = await this.getStatus(data); + break; + case 'extensionManagement': + returnObj = await this.manageExtensions(data); + break; + default: + sendResponse(404, `Unknown message type: ${data.type}`); + break; + } + sendResponse(200, returnObj); + } catch (e) { + const message = e instanceof Error ? e.message : JSON.stringify(e); + sendResponse(500, message); + this.logService.error('Error while processing pipe request', e); } }); } - private open(data: OpenCommandPipeArgs, res: http.ServerResponse) { + private async open(data: OpenCommandPipeArgs): Promise { const { fileURIs, folderURIs, forceNewWindow, diffMode, addMode, forceReuseWindow, gotoLineMode, waitMarkerFilePath, remoteAuthority } = data; const urisToOpen: IWindowOpenable[] = []; if (Array.isArray(folderURIs)) { @@ -141,58 +147,30 @@ export class CLIServerBase { const windowOpenArgs: IOpenWindowOptions = { forceNewWindow, diffMode, addMode, gotoLineMode, forceReuseWindow, preferNewWindow, waitMarkerFileURI, remoteAuthority }; this._commands.executeCommand('_remoteCLI.windowOpen', urisToOpen, windowOpenArgs); - res.writeHead(200); - res.end(); + return ''; } - private async openExternal(data: OpenExternalCommandPipeArgs, res: http.ServerResponse) { + private async openExternal(data: OpenExternalCommandPipeArgs): Promise { for (const uriString of data.uris) { const uri = URI.parse(uriString); const urioOpen = uri.scheme === 'file' ? uri : uriString; // workaround for #112577 await this._commands.executeCommand('_remoteCLI.openExternal', urioOpen); } - res.writeHead(200); - res.end(); } - private async manageExtensions(data: ExtensionManagementPipeArgs, res: http.ServerResponse) { - try { - const toExtOrVSIX = (inputs: string[] | undefined) => inputs?.map(input => /\.vsix$/i.test(input) ? URI.parse(input) : input); - const commandArgs = { - list: data.list, - install: toExtOrVSIX(data.install), - uninstall: toExtOrVSIX(data.uninstall), - force: data.force - }; - const output = await this._commands.executeCommand('_remoteCLI.manageExtensions', commandArgs); - res.writeHead(200); - res.write(output); - } catch (err) { - res.writeHead(500); - res.write(String(err), err => { - if (err) { - this.logService.error(err); - } - }); - } - res.end(); + private async manageExtensions(data: ExtensionManagementPipeArgs): Promise { + const toExtOrVSIX = (inputs: string[] | undefined) => inputs?.map(input => /\.vsix$/i.test(input) ? URI.parse(input) : input); + const commandArgs = { + list: data.list, + install: toExtOrVSIX(data.install), + uninstall: toExtOrVSIX(data.uninstall), + force: data.force + }; + return await this._commands.executeCommand('_remoteCLI.manageExtensions', commandArgs); } - private async getStatus(data: StatusPipeArgs, res: http.ServerResponse) { - try { - const status = await this._commands.executeCommand('_remoteCLI.getSystemStatus'); - res.writeHead(200); - res.write(status); - res.end(); - } catch (err) { - res.writeHead(500); - res.write(String(err), err => { - if (err) { - this.logService.error(err); - } - }); - res.end(); - } + private async getStatus(data: StatusPipeArgs) { + return await this._commands.executeCommand('_remoteCLI.getSystemStatus'); } dispose(): void { diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index d7618a4c8e8..b235b34a8fc 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -5,6 +5,7 @@ import * as nls from 'vs/nls'; import type * as vscode from 'vscode'; +import { homedir } from 'os'; import * as platform from 'vs/base/common/platform'; import { DebugAdapterExecutable, ThemeIcon } from 'vs/workbench/api/common/extHostTypes'; import { ExecutableDebugAdapter, SocketDebugAdapter, NamedPipeDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; @@ -23,8 +24,10 @@ import { SignService } from 'vs/platform/sign/node/signService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { AbstractVariableResolverService } from 'vs/workbench/services/configurationResolver/common/variableResolver'; import { createCancelablePromise, firstParallel } from 'vs/base/common/async'; -import { hasChildProcesses, prepareCommand, runInExternalTerminal } from 'vs/workbench/contrib/debug/node/terminals'; +import { hasChildProcesses, prepareCommand } from 'vs/workbench/contrib/debug/node/terminals'; import { IExtHostEditorTabs } from 'vs/workbench/api/common/extHostEditorTabs'; +import { IExternalTerminalService } from 'vs/platform/externalTerminal/common/externalTerminal'; +import { WindowsExternalTerminalService, MacExternalTerminalService, LinuxExternalTerminalService } from 'vs/platform/externalTerminal/node/externalTerminalService'; export class ExtHostDebugService extends ExtHostDebugServiceBase { @@ -153,17 +156,35 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { } protected createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService { - return new ExtHostVariableResolverService(folders, editorService, configurationService, this._editorTabs, this._workspaceService); + return new ExtHostVariableResolverService(folders, editorService, configurationService, this._editorTabs, this._workspaceService, homedir()); } } +let externalTerminalService: IExternalTerminalService | undefined = undefined; + +export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, configProvider: ExtHostConfigProvider): Promise { + if (!externalTerminalService) { + if (platform.isWindows) { + externalTerminalService = new WindowsExternalTerminalService(); + } else if (platform.isMacintosh) { + externalTerminalService = new MacExternalTerminalService(); + } else if (platform.isLinux) { + externalTerminalService = new LinuxExternalTerminalService(); + } else { + throw new Error('external terminals not supported on this platform'); + } + } + const config = configProvider.getConfiguration('terminal'); + return externalTerminalService.runInTerminal(args.title!, args.cwd, args.args, args.env || {}, config.external || {}); +} + class DebugTerminalCollection { /** * Delay before a new terminal is a candidate for reuse. See #71850 */ private static minUseDelay = 1000; - private _terminalInstances = new Map(); + private _terminalInstances = new Map(); public async checkout(config: string, name: string) { const entries = [...this._terminalInstances.entries()]; diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index b9071ad93ba..481409b79d5 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -8,7 +8,7 @@ import { createApiFactoryAndRegisterActors } from 'vs/workbench/api/common/extHo import { RequireInterceptor } from 'vs/workbench/api/common/extHostRequireInterceptor'; import { MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtensionActivationTimesBuilder } from 'vs/workbench/api/common/extHostExtensionActivator'; -import { connectProxyResolver } from 'vs/workbench/services/extensions/node/proxyResolver'; +import { connectProxyResolver } from 'vs/workbench/api/node/proxyResolver'; import { AbstractExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; import { ExtHostDownloadService } from 'vs/workbench/api/node/extHostDownloadService'; import { URI } from 'vs/base/common/uri'; @@ -24,7 +24,7 @@ class NodeModuleRequireInterceptor extends RequireInterceptor { const that = this; const node_module = require.__$__nodeRequire('module'); const originalLoad = node_module._load; - node_module._load = function load(request: string, parent: { filename: string; }, isMain: boolean) { + node_module._load = function load(request: string, parent: { filename: string }, isMain: boolean) { request = applyAlternatives(request); if (!that._factories.has(request)) { return originalLoad.apply(this, arguments); diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index b13dd1ddfbf..c47e3203461 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -95,7 +95,7 @@ export class ExtHostTask extends ExtHostTaskBase { } } - protected provideTasksInternal(validTypes: { [key: string]: boolean; }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[], extension: IExtensionDescription } { + protected provideTasksInternal(validTypes: { [key: string]: boolean }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[]; extension: IExtensionDescription } { const taskDTOs: tasks.TaskDTO[] = []; if (value) { for (let task of value) { @@ -131,7 +131,7 @@ export class ExtHostTask extends ExtHostTaskBase { private async getVariableResolver(workspaceFolders: vscode.WorkspaceFolder[]): Promise { if (this._variableResolver === undefined) { const configProvider = await this._configurationService.getConfigProvider(); - this._variableResolver = new ExtHostVariableResolverService(workspaceFolders, this._editorService, configProvider, this.editorTabs, this.workspaceService); + this._variableResolver = new ExtHostVariableResolverService(workspaceFolders, this._editorService, configProvider, this.editorTabs, this.workspaceService, homedir()); } return this._variableResolver; } @@ -152,7 +152,7 @@ export class ExtHostTask extends ExtHostTaskBase { }; } - public async $resolveVariables(uriComponents: UriComponents, toResolve: { process?: { name: string; cwd?: string; path?: string }, variables: string[] }): Promise<{ process?: string, variables: { [key: string]: string; } }> { + public async $resolveVariables(uriComponents: UriComponents, toResolve: { process?: { name: string; cwd?: string; path?: string }; variables: string[] }): Promise<{ process?: string; variables: { [key: string]: string } }> { const uri: URI = URI.revive(uriComponents); const result = { process: undefined as string, diff --git a/src/vs/workbench/api/node/extHostTunnelService.ts b/src/vs/workbench/api/node/extHostTunnelService.ts index b19cadd9746..a66f16262b2 100644 --- a/src/vs/workbench/api/node/extHostTunnelService.ts +++ b/src/vs/workbench/api/node/extHostTunnelService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MainThreadTunnelServiceShape, MainContext, PortAttributesProviderSelector } from 'vs/workbench/api/common/extHost.protocol'; +import { MainThreadTunnelServiceShape, MainContext, PortAttributesProviderSelector, TunnelDto } from 'vs/workbench/api/common/extHost.protocol'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import type * as vscode from 'vscode'; import * as nls from 'vs/nls'; @@ -15,9 +15,9 @@ import * as resources from 'vs/base/common/resources'; import * as pfs from 'vs/base/node/pfs'; import * as types from 'vs/workbench/api/common/extHostTypes'; import { isLinux } from 'vs/base/common/platform'; -import { IExtHostTunnelService, TunnelDto } from 'vs/workbench/api/common/extHostTunnelService'; +import { IExtHostTunnelService, TunnelDtoConverter } from 'vs/workbench/api/common/extHostTunnelService'; import { Event, Emitter } from 'vs/base/common/event'; -import { TunnelOptions, TunnelCreationOptions, ProvidedPortAttributes, ProvidedOnAutoForward, isLocalhost, isAllInterfaces } from 'vs/platform/remote/common/tunnel'; +import { TunnelOptions, TunnelCreationOptions, ProvidedPortAttributes, ProvidedOnAutoForward, isLocalhost, isAllInterfaces } from 'vs/platform/tunnel/common/tunnel'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { MovingAverage } from 'vs/base/common/numbers'; import { CandidatePort } from 'vs/workbench/services/remote/common/remoteExplorerService'; @@ -28,8 +28,8 @@ class ExtensionTunnel implements vscode.Tunnel { onDidDispose: Event = this._onDispose.event; constructor( - public readonly remoteAddress: { port: number, host: string }, - public readonly localAddress: { port: number, host: string } | string, + public readonly remoteAddress: { port: number; host: string }, + public readonly localAddress: { port: number; host: string } | string, private readonly _dispose: () => Promise) { } dispose(): Promise { @@ -38,9 +38,9 @@ class ExtensionTunnel implements vscode.Tunnel { } } -export function getSockets(stdout: string): Record { +export function getSockets(stdout: string): Record { const lines = stdout.trim().split('\n'); - const mapped: { pid: number, socket: number }[] = []; + const mapped: { pid: number; socket: number }[] = []; lines.forEach(line => { const match = /\/proc\/(\d+)\/fd\/\d+ -> socket:\[(\d+)\]/.exec(line)!; if (match && match.length >= 3) { @@ -57,7 +57,7 @@ export function getSockets(stdout: string): Record[]).concat(...stdouts.map(loadConnectionTable)); return [ ...new Map( @@ -107,13 +107,13 @@ export function loadConnectionTable(stdout: string): Record[] { function knownExcludeCmdline(command: string): boolean { return !!command.match(/.*\.vscode-server-[a-zA-Z]+\/bin.*/) - || (command.indexOf('out/vs/server/main.js') !== -1) + || (command.indexOf('out/server-main.js') !== -1) || (command.indexOf('_productName=VSCode') !== -1); } export function getRootProcesses(stdout: string) { const lines = stdout.trim().split('\n'); - const mapped: { pid: number, cmd: string, ppid: number }[] = []; + const mapped: { pid: number; cmd: string; ppid: number }[] = []; lines.forEach(line => { const match = /^\d+\s+\D+\s+root\s+(\d+)\s+(\d+).+\d+\:\d+\:\d+\s+(.+)$/.exec(line)!; if (match && match.length >= 4) { @@ -127,7 +127,7 @@ export function getRootProcesses(stdout: string) { return mapped; } -export async function findPorts(connections: { socket: number, ip: string, port: number }[], socketMap: Record, processes: { pid: number, cwd: string, cmd: string }[]): Promise { +export async function findPorts(connections: { socket: number; ip: string; port: number }[], socketMap: Record, processes: { pid: number; cwd: string; cmd: string }[]): Promise { const processMap = processes.reduce((m, process) => { m[process.pid] = process; return m; @@ -144,7 +144,7 @@ export async function findPorts(connections: { socket: number, ip: string, port: return ports; } -export function tryFindRootPorts(connections: { socket: number, ip: string, port: number }[], rootProcessesStdout: string, previousPorts: Map): Map { +export function tryFindRootPorts(connections: { socket: number; ip: string; port: number }[], rootProcessesStdout: string, previousPorts: Map): Map { const ports: Map = new Map(); const rootProcesses = getRootProcesses(rootProcessesStdout); @@ -159,7 +159,7 @@ export function tryFindRootPorts(connections: { socket: number, ip: string, port let bestMatch = rootProcessMatch; // There are often several processes that "look" like they could match the port. // The one we want is usually the child of the other. Find the most child process. - let mostChild: { pid: number, cmd: string, ppid: number } | undefined; + let mostChild: { pid: number; cmd: string; ppid: number } | undefined; do { mostChild = rootProcesses.find(value => value.ppid === bestMatch.pid); if (mostChild) { @@ -180,14 +180,14 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe private readonly _proxy: MainThreadTunnelServiceShape; private _forwardPortProvider: ((tunnelOptions: TunnelOptions, tunnelCreationOptions: TunnelCreationOptions) => Thenable | undefined) | undefined; private _showCandidatePort: (host: string, port: number, detail: string) => Thenable = () => { return Promise.resolve(true); }; - private _extensionTunnels: Map> = new Map(); + private _extensionTunnels: Map> = new Map(); private _onDidChangeTunnels: Emitter = new Emitter(); onDidChangeTunnels: vscode.Event = this._onDidChangeTunnels.event; private _candidateFindingEnabled: boolean = false; private _foundRootPorts: Map = new Map(); private _providerHandleCounter: number = 0; - private _portAttributesProviders: Map = new Map(); + private _portAttributesProviders: Map = new Map(); constructor( @IExtHostRpcService extHostRpc: IExtHostRpcService, @@ -268,7 +268,7 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe this._candidateFindingEnabled = enable; // Regularly scan to see if the candidate ports have changed. let movingAverage = new MovingAverage(); - let oldPorts: { host: string, port: number, detail?: string }[] | undefined = undefined; + let oldPorts: { host: string; port: number; detail?: string }[] | undefined = undefined; while (this._candidateFindingEnabled) { const startTime = new Date().getTime(); const newPorts = (await this.findCandidatePorts()).filter(candidate => (isLocalhost(candidate.host) || isAllInterfaces(candidate.host))); @@ -328,7 +328,7 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe }); } - async $closeTunnel(remote: { host: string, port: number }, silent?: boolean): Promise { + async $closeTunnel(remote: { host: string; port: number }, silent?: boolean): Promise { if (this._extensionTunnels.has(remote.host)) { const hostMap = this._extensionTunnels.get(remote.host)!; if (hostMap.has(remote.port)) { @@ -362,7 +362,7 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe return this._proxy.$closeTunnel(tunnel.remoteAddress); })); this._extensionTunnels.get(tunnelOptions.remoteAddress.host)!.set(tunnelOptions.remoteAddress.port, { tunnel, disposeListener }); - return TunnelDto.fromApiTunnel(tunnel); + return TunnelDtoConverter.fromApiTunnel(tunnel); } else { this.logService.trace('ForwardedPorts: (ExtHostTunnelService) Tunnel is undefined'); } @@ -389,7 +389,7 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe } catch (e) { // File reading error. No additional handling needed. } - const connections: { socket: number, ip: string, port: number }[] = loadListeningPorts(tcp, tcp6); + const connections: { socket: number; ip: string; port: number }[] = loadListeningPorts(tcp, tcp6); const procSockets: string = await (new Promise(resolve => { exec('ls -l /proc/[0-9]*/fd/[0-9]* | grep socket:', (error, stdout, stderr) => { @@ -400,7 +400,7 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe const procChildren = await pfs.Promises.readdir('/proc'); const processes: { - pid: number, cwd: string, cmd: string + pid: number; cwd: string; cmd: string; }[] = []; for (let childName of procChildren) { try { @@ -417,7 +417,7 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe } } - const unFoundConnections: { socket: number, ip: string, port: number }[] = []; + const unFoundConnections: { socket: number; ip: string; port: number }[] = []; const filteredConnections = connections.filter((connection => { const foundConnection = socketMap[connection.socket]; if (!foundConnection) { diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts b/src/vs/workbench/api/node/extensionHostProcess.ts similarity index 92% rename from src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts rename to src/vs/workbench/api/node/extensionHostProcess.ts index 758c168a6f5..2707ecf73d3 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts +++ b/src/vs/workbench/api/node/extensionHostProcess.ts @@ -13,24 +13,24 @@ import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { PersistentProtocol, ProtocolConstants, BufferedEmitter } from 'vs/base/parts/ipc/common/ipc.net'; import { NodeSocket, WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; import product from 'vs/platform/product/common/product'; -import { IInitData } from 'vs/workbench/api/common/extHost.protocol'; -import { MessageType, createMessageOfType, isMessageOfType, IExtHostSocketMessage, IExtHostReadyMessage, IExtHostReduceGraceTimeMessage, ExtensionHostExitCode } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; -import { ExtensionHostMain, IExitFn } from 'vs/workbench/services/extensions/common/extensionHostMain'; +import { MessageType, createMessageOfType, isMessageOfType, IExtHostSocketMessage, IExtHostReadyMessage, IExtHostReduceGraceTimeMessage, ExtensionHostExitCode, IExtensionHostInitData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; +import { ExtensionHostMain, IExitFn } from 'vs/workbench/api/common/extensionHostMain'; import { VSBuffer } from 'vs/base/common/buffer'; -import { IURITransformer, URITransformer, IRawURITransformer } from 'vs/base/common/uriIpc'; +import { IURITransformer } from 'vs/base/common/uriIpc'; import { Promises } from 'vs/base/node/pfs'; import { realpath } from 'vs/base/node/extpath'; import { IHostUtils } from 'vs/workbench/api/common/extHostExtensionService'; import { ProcessTimeRunOnceScheduler } from 'vs/base/common/async'; import { boolean } from 'vs/editor/common/config/editorOptions'; +import { createURITransformer } from 'vs/workbench/api/node/uriTransformer'; import 'vs/workbench/api/common/extHost.common.services'; import 'vs/workbench/api/node/extHost.node.services'; interface ParsedExtHostArgs { - uriTransformerPath?: string; + transformURIs?: boolean; skipWorkspaceStorageLock?: boolean; - useHostProxy?: boolean; + useHostProxy?: 'true' | 'false'; // use a string, as undefined is also a valid value } // workaround for https://github.com/microsoft/vscode/issues/85490 @@ -45,12 +45,12 @@ interface ParsedExtHostArgs { })(); const args = minimist(process.argv.slice(2), { - string: [ - 'uriTransformerPath' - ], boolean: [ - 'skipWorkspaceStorageLock', - 'useHostProxy' + 'transformURIs', + 'skipWorkspaceStorageLock' + ], + string: [ + 'useHostProxy' // 'true' | 'false' | undefined ] }) as ParsedExtHostArgs; @@ -93,7 +93,7 @@ function patchProcess(allowExit: boolean) { interface IRendererConnection { protocol: IMessagePassingProtocol; - initData: IInitData; + initData: IExtensionHostInitData; } // This calls exit directly in case the initialization is not finished and we need to exit @@ -233,7 +233,7 @@ function connectToRenderer(protocol: IMessagePassingProtocol): Promise { first.dispose(); - const initData = JSON.parse(raw.toString()); + const initData = JSON.parse(raw.toString()); const rendererCommit = initData.commit; const myCommit = product.commit; @@ -336,7 +336,7 @@ export async function startExtensionHostProcess(): Promise { const { initData } = renderer; // setup things patchProcess(!!initData.environment.extensionTestsLocationURI); // to support other test frameworks like Jasmin that use process.exit (https://github.com/microsoft/vscode/issues/37708) - initData.environment.useHostProxy = !!args.useHostProxy; + initData.environment.useHostProxy = args.useHostProxy !== undefined ? args.useHostProxy !== 'false' : undefined; initData.environment.skipWorkspaceStorageLock = boolean(args.skipWorkspaceStorageLock, false); // host abstraction @@ -350,14 +350,8 @@ export async function startExtensionHostProcess(): Promise { // Attempt to load uri transformer let uriTransformer: IURITransformer | null = null; - if (initData.remote.authority && args.uriTransformerPath) { - try { - const rawURITransformerFactory = require.__$__nodeRequire(args.uriTransformerPath); - const rawURITransformer = rawURITransformerFactory(initData.remote.authority); - uriTransformer = new URITransformer(rawURITransformer); - } catch (e) { - console.error(e); - } + if (initData.remote.authority && args.transformURIs) { + uriTransformer = createURITransformer(initData.remote.authority); } const extensionHostMain = new ExtensionHostMain( @@ -370,3 +364,5 @@ export async function startExtensionHostProcess(): Promise { // rewrite onTerminate-function to be a proper shutdown onTerminate = (reason: string) => extensionHostMain.terminate(reason); } + +startExtensionHostProcess().catch((err) => console.log(err)); diff --git a/src/vs/workbench/services/extensions/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts similarity index 76% rename from src/vs/workbench/services/extensions/node/proxyResolver.ts rename to src/vs/workbench/api/node/proxyResolver.ts index 8b6e10d7ae1..d8295df7625 100644 --- a/src/vs/workbench/services/extensions/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -9,12 +9,13 @@ import * as tls from 'tls'; import { IExtHostWorkspaceProvider } from 'vs/workbench/api/common/extHostWorkspace'; import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; -import { MainThreadTelemetryShape, IInitData } from 'vs/workbench/api/common/extHost.protocol'; +import { MainThreadTelemetryShape } from 'vs/workbench/api/common/extHost.protocol'; +import { IExtensionHostInitData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { URI } from 'vs/base/common/uri'; import { ILogService } from 'vs/platform/log/common/log'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { LogLevel, createHttpPatch, ProxyResolveEvent, createProxyResolver, createTlsPatch, ProxySupportSetting } from 'vscode-proxy-agent'; +import { LogLevel, createHttpPatch, createProxyResolver, createTlsPatch, ProxySupportSetting } from 'vscode-proxy-agent'; export function connectProxyResolver( extHostWorkspace: IExtHostWorkspaceProvider, @@ -22,7 +23,7 @@ export function connectProxyResolver( extensionService: ExtHostExtensionService, extHostLogService: ILogService, mainThreadTelemetry: MainThreadTelemetryShape, - initData: IInitData, + initData: IExtensionHostInitData, ) { const useHostProxy = initData.environment.useHostProxy; const doUseHostProxy = typeof useHostProxy === 'boolean' ? useHostProxy : !initData.remote.isRemote; @@ -46,22 +47,8 @@ export function connectProxyResolver( } }, getLogLevel: () => extHostLogService.getLevel(), - proxyResolveTelemetry: event => { - type ResolveProxyClassification = { - count: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - duration: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - errorCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - cacheCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - cacheSize: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - cacheRolls: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - envCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - settingsCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - localhostCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - envNoProxyCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - results: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - }; - mainThreadTelemetry.$publicLog2('resolveProxy', event); - }, + // TODO @chrmarti Remove this from proxy agent + proxyResolveTelemetry: () => { }, useHostProxy: doUseHostProxy, env: process.env, }); @@ -106,13 +93,13 @@ function createPatchedModules(configProvider: ExtHostConfigProvider, resolveProx }; } -const modulesCache = new Map(); +const modulesCache = new Map(); function configureModuleLoading(extensionService: ExtHostExtensionService, lookup: ReturnType): Promise { return extensionService.getExtensionPathIndex() .then(extensionPaths => { const node_module = require.__$__nodeRequire('module'); const original = node_module._load; - node_module._load = function load(request: string, parent: { filename: string; }, isMain: boolean) { + node_module._load = function load(request: string, parent: { filename: string }, isMain: boolean) { if (request === 'tls') { return lookup.tls; } diff --git a/src/vs/server/uriTransformer.js b/src/vs/workbench/api/node/uriTransformer.ts similarity index 67% rename from src/vs/server/uriTransformer.js rename to src/vs/workbench/api/node/uriTransformer.ts index 852ca4a002f..c02ea46d00b 100644 --- a/src/vs/server/uriTransformer.js +++ b/src/vs/workbench/api/node/uriTransformer.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// @ts-check +import { UriParts, IRawURITransformer, URITransformer, IURITransformer } from 'vs/base/common/uriIpc'; /** * ``` @@ -14,19 +14,10 @@ * | file | vscode-local | * -------------------------------- * ``` - * @typedef { import('../base/common/uriIpc').IRawURITransformer } IRawURITransformer - * @typedef { import('../base/common/uriIpc').UriParts } UriParts - * @typedef { import('../base/common/uri').UriComponents } UriComponents - * @param {string} remoteAuthority - * @returns {IRawURITransformer} */ -module.exports = function(remoteAuthority) { +function createRawURITransformer(remoteAuthority: string): IRawURITransformer { return { - /** - * @param {UriParts} uri - * @returns {UriParts} - */ - transformIncoming: (uri) => { + transformIncoming: (uri: UriParts): UriParts => { if (uri.scheme === 'vscode-remote') { return { scheme: 'file', path: uri.path, query: uri.query, fragment: uri.fragment }; } @@ -35,11 +26,7 @@ module.exports = function(remoteAuthority) { } return uri; }, - /** - * @param {UriParts} uri - * @returns {UriParts} - */ - transformOutgoing: (uri) => { + transformOutgoing: (uri: UriParts): UriParts => { if (uri.scheme === 'file') { return { scheme: 'vscode-remote', authority: remoteAuthority, path: uri.path, query: uri.query, fragment: uri.fragment }; } @@ -48,11 +35,7 @@ module.exports = function(remoteAuthority) { } return uri; }, - /** - * @param {string} scheme - * @returns {string} - */ - transformOutgoingScheme: (scheme) => { + transformOutgoingScheme: (scheme: string): string => { if (scheme === 'file') { return 'vscode-remote'; } else if (scheme === 'vscode-local') { @@ -61,4 +44,8 @@ module.exports = function(remoteAuthority) { return scheme; } }; -}; +} + +export function createURITransformer(remoteAuthority: string): IURITransformer { + return new URITransformer(createRawURITransformer(remoteAuthority)); +} diff --git a/src/vs/workbench/test/browser/api/extHost.api.impl.test.ts b/src/vs/workbench/api/test/browser/extHost.api.impl.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/extHost.api.impl.test.ts rename to src/vs/workbench/api/test/browser/extHost.api.impl.test.ts diff --git a/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts b/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts similarity index 95% rename from src/vs/workbench/test/browser/api/extHostApiCommands.test.ts rename to src/vs/workbench/api/test/browser/extHostApiCommands.test.ts index 5e07798d9ee..bb60ad1fa8c 100644 --- a/src/vs/workbench/test/browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/api/test/browser/extHostApiCommands.test.ts @@ -6,9 +6,10 @@ import * as assert from 'assert'; import { setUnexpectedErrorHandler, errorHandler } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; +import { Event } from 'vs/base/common/event'; import * as types from 'vs/workbench/api/common/extHostTypes'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; -import { TestRPCProtocol } from './testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { MarkerService } from 'vs/platform/markers/common/markerService'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; @@ -25,7 +26,7 @@ import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import type * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import 'vs/workbench/contrib/search/browser/search.contribution'; -import { NullLogService } from 'vs/platform/log/common/log'; +import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { ITextModel } from 'vs/editor/common/model'; import { nullExtensionDescription, IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { dispose, ImmortalReference } from 'vs/base/common/lifecycle'; @@ -36,24 +37,27 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; - -import 'vs/editor/contrib/codeAction/codeAction'; -import 'vs/editor/contrib/codelens/codelens'; -import 'vs/editor/contrib/colorPicker/color'; -import 'vs/editor/contrib/format/format'; -import 'vs/editor/contrib/gotoSymbol/goToCommands'; -import 'vs/editor/contrib/documentSymbols/documentSymbols'; -import 'vs/editor/contrib/hover/getHover'; -import 'vs/editor/contrib/links/getLinks'; -import 'vs/editor/contrib/parameterHints/provideSignatureHelp'; -import 'vs/editor/contrib/smartSelect/smartSelect'; -import 'vs/editor/contrib/suggest/suggest'; -import 'vs/editor/contrib/rename/rename'; -import 'vs/editor/contrib/inlayHints/inlayHintsController'; import { IExtHostFileSystemInfo } from 'vs/workbench/api/common/extHostFileSystemInfo'; import { URITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService'; -import { IOutlineModelService, OutlineModelService } from 'vs/editor/contrib/documentSymbols/outlineModel'; -import { LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { IOutlineModelService, OutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; +import { ILanguageFeatureDebounceService, LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; + +import 'vs/editor/contrib/codeAction/browser/codeAction'; +import 'vs/editor/contrib/codelens/browser/codelens'; +import 'vs/editor/contrib/colorPicker/browser/color'; +import 'vs/editor/contrib/format/browser/format'; +import 'vs/editor/contrib/gotoSymbol/browser/goToCommands'; +import 'vs/editor/contrib/documentSymbols/browser/documentSymbols'; +import 'vs/editor/contrib/hover/browser/getHover'; +import 'vs/editor/contrib/links/browser/getLinks'; +import 'vs/editor/contrib/parameterHints/browser/provideSignatureHelp'; +import 'vs/editor/contrib/smartSelect/browser/smartSelect'; +import 'vs/editor/contrib/suggest/browser/suggest'; +import 'vs/editor/contrib/rename/browser/rename'; +import 'vs/editor/contrib/inlayHints/browser/inlayHintsController'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; +import { assertType } from 'vs/base/common/types'; function assertRejects(fn: () => Promise, message: string = 'Expected rejection') { return fn().then(() => assert.ok(false, message), _err => assert.ok(true)); @@ -73,6 +77,7 @@ suite('ExtHostLanguageFeatureCommands', function () { let mainThread: MainThreadLanguageFeatures; let commands: ExtHostCommands; let disposables: vscode.Disposable[] = []; + let originalErrorHandler: (e: any) => any; suiteSetup(() => { @@ -92,6 +97,7 @@ suite('ExtHostLanguageFeatureCommands', function () { let insta: IInstantiationService; rpcProtocol = new TestRPCProtocol(); const services = new ServiceCollection(); + services.set(ILanguageFeaturesService, new SyncDescriptor(LanguageFeaturesService)); services.set(IExtensionService, new class extends mock() { override async activateByEvent() { @@ -110,8 +116,11 @@ suite('ExtHostLanguageFeatureCommands', function () { } })); services.set(IMarkerService, new MarkerService()); + services.set(ILogService, new SyncDescriptor(NullLogService)); + services.set(ILanguageFeatureDebounceService, new SyncDescriptor(LanguageFeatureDebounceService)); services.set(IModelService, new class extends mock() { override getModel() { return model; } + override onModelRemoved = Event.None; }); services.set(ITextModelService, new class extends mock() { override async createModelReference() { @@ -125,7 +134,8 @@ suite('ExtHostLanguageFeatureCommands', function () { return edits || undefined; } }); - services.set(IOutlineModelService, new OutlineModelService(new LanguageFeatureDebounceService())); + services.set(ILanguageFeatureDebounceService, new SyncDescriptor(LanguageFeatureDebounceService)); + services.set(IOutlineModelService, new SyncDescriptor(OutlineModelService)); insta = new InstantiationService(services); @@ -266,7 +276,7 @@ suite('ExtHostLanguageFeatureCommands', function () { await rpcProtocol.sync(); - const data = await commands.executeCommand<{ range: vscode.Range, placeholder: string }>('vscode.prepareRename', model.uri, new types.Position(0, 12)); + const data = await commands.executeCommand<{ range: vscode.Range; placeholder: string }>('vscode.prepareRename', model.uri, new types.Position(0, 12)); assert.ok(data); assert.strictEqual(data.placeholder, 'foooPlaceholder'); @@ -1241,7 +1251,7 @@ suite('ExtHostLanguageFeatureCommands', function () { test('Inlay Hints, back and forth', async function () { disposables.push(extHost.registerInlayHintsProvider(nullExtensionDescription, defaultSelector, { provideInlayHints() { - return [new types.InlayHint('Foo', new types.Position(0, 1))]; + return [new types.InlayHint(new types.Position(0, 1), 'Foo')]; } })); @@ -1259,13 +1269,21 @@ suite('ExtHostLanguageFeatureCommands', function () { test('Inline Hints, merge', async function () { disposables.push(extHost.registerInlayHintsProvider(nullExtensionDescription, defaultSelector, { provideInlayHints() { - return [new types.InlayHint('Bar', new types.Position(10, 11))]; + const part = new types.InlayHintLabelPart('Bar'); + part.tooltip = 'part_tooltip'; + part.command = { command: 'cmd', title: 'part' }; + const hint = new types.InlayHint(new types.Position(10, 11), [part]); + hint.tooltip = 'hint_tooltip'; + hint.command = { command: 'cmd', title: 'hint' }; + hint.paddingLeft = true; + hint.paddingRight = false; + return [hint]; } })); disposables.push(extHost.registerInlayHintsProvider(nullExtensionDescription, defaultSelector, { provideInlayHints() { - const hint = new types.InlayHint('Foo', new types.Position(0, 1), types.InlayHintKind.Parameter); + const hint = new types.InlayHint(new types.Position(0, 1), 'Foo', types.InlayHintKind.Parameter); return [hint]; } })); @@ -1280,15 +1298,26 @@ suite('ExtHostLanguageFeatureCommands', function () { assert.strictEqual(first.position.line, 0); assert.strictEqual(first.position.character, 1); - assert.strictEqual(second.label, 'Bar'); assert.strictEqual(second.position.line, 10); assert.strictEqual(second.position.character, 11); + assert.strictEqual(second.paddingLeft, true); + assert.strictEqual(second.paddingRight, false); + assert.strictEqual(second.tooltip, 'hint_tooltip'); + assert.strictEqual(second.command?.command, 'cmd'); + assert.strictEqual(second.command?.title, 'hint'); + + const label = (second.label)[0]; + assertType(label instanceof types.InlayHintLabelPart); + assert.strictEqual(label.value, 'Bar'); + assert.strictEqual(label.tooltip, 'part_tooltip'); + assert.strictEqual(label.command?.command, 'cmd'); + assert.strictEqual(label.command?.title, 'part'); }); test('Inline Hints, bad provider', async function () { disposables.push(extHost.registerInlayHintsProvider(nullExtensionDescription, defaultSelector, { provideInlayHints() { - return [new types.InlayHint('Foo', new types.Position(0, 1))]; + return [new types.InlayHint(new types.Position(0, 1), 'Foo')]; } })); disposables.push(extHost.registerInlayHintsProvider(nullExtensionDescription, defaultSelector, { diff --git a/src/vs/workbench/test/browser/api/extHostAuthentication.test.ts b/src/vs/workbench/api/test/browser/extHostAuthentication.test.ts similarity index 92% rename from src/vs/workbench/test/browser/api/extHostAuthentication.test.ts rename to src/vs/workbench/api/test/browser/extHostAuthentication.test.ts index 5c89130cbb8..0a9919154a3 100644 --- a/src/vs/workbench/test/browser/api/extHostAuthentication.test.ts +++ b/src/vs/workbench/api/test/browser/extHostAuthentication.test.ts @@ -18,11 +18,12 @@ import { MainThreadAuthentication } from 'vs/workbench/api/browser/mainThreadAut import { ExtHostContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostAuthentication } from 'vs/workbench/api/common/extHostAuthentication'; import { IActivityService } from 'vs/workbench/services/activity/common/activity'; -import { AuthenticationService, IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { AuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { IExtensionService, nullExtensionDescription as extensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { TestRemoteAgentService } from 'vs/workbench/services/remote/test/common/testServices'; -import { TestRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { TestQuickInputService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestActivityService, TestExtensionService, TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; import type { AuthenticationProvider, AuthenticationSession } from 'vscode'; @@ -413,5 +414,34 @@ suite('ExtHostAuthentication', () => { } }); + test('Can get multiple sessions (with different scopes) in one extension', async () => { + let session: AuthenticationSession | undefined = await extHostAuthentication.getSession( + extensionDescription, + 'test-multiple', + ['foo'], + { + createIfNone: true + }); + session = await extHostAuthentication.getSession( + extensionDescription, + 'test-multiple', + ['bar'], + { + createIfNone: true + }); + assert.strictEqual(session?.id, '2'); + assert.strictEqual(session?.scopes[0], 'bar'); + + session = await extHostAuthentication.getSession( + extensionDescription, + 'test-multiple', + ['foo'], + { + createIfNone: false + }); + assert.strictEqual(session?.id, '1'); + assert.strictEqual(session?.scopes[0], 'foo'); + }); + //#endregion }); diff --git a/src/vs/workbench/test/browser/api/extHostBulkEdits.test.ts b/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts similarity index 98% rename from src/vs/workbench/test/browser/api/extHostBulkEdits.test.ts rename to src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts index 23a895c6037..e634cad36c4 100644 --- a/src/vs/workbench/test/browser/api/extHostBulkEdits.test.ts +++ b/src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts @@ -8,7 +8,7 @@ import { MainContext, IWorkspaceEditDto, WorkspaceEditType, MainThreadBulkEditsS import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/base/test/common/mock'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { SingleProxyRPCProtocol, TestRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { SingleProxyRPCProtocol, TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { NullLogService } from 'vs/platform/log/common/log'; import { assertType } from 'vs/base/common/types'; import { ExtHostBulkEdits } from 'vs/workbench/api/common/extHostBulkEdits'; diff --git a/src/vs/workbench/test/browser/api/extHostCommands.test.ts b/src/vs/workbench/api/test/browser/extHostCommands.test.ts similarity index 96% rename from src/vs/workbench/test/browser/api/extHostCommands.test.ts rename to src/vs/workbench/api/test/browser/extHostCommands.test.ts index c9c02395ccb..da9b47ccda9 100644 --- a/src/vs/workbench/test/browser/api/extHostCommands.test.ts +++ b/src/vs/workbench/api/test/browser/extHostCommands.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainThreadCommandsShape } from 'vs/workbench/api/common/extHost.protocol'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { SingleProxyRPCProtocol } from './testRPCProtocol'; +import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { mock } from 'vs/base/test/common/mock'; import { NullLogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/test/browser/api/extHostConfiguration.test.ts b/src/vs/workbench/api/test/browser/extHostConfiguration.test.ts similarity index 99% rename from src/vs/workbench/test/browser/api/extHostConfiguration.test.ts rename to src/vs/workbench/api/test/browser/extHostConfiguration.test.ts index ed9d51dd34f..764c1c294b1 100644 --- a/src/vs/workbench/test/browser/api/extHostConfiguration.test.ts +++ b/src/vs/workbench/api/test/browser/extHostConfiguration.test.ts @@ -9,7 +9,7 @@ import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; import { MainThreadConfigurationShape, IConfigurationInitData } from 'vs/workbench/api/common/extHost.protocol'; import { ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; -import { TestRPCProtocol } from './testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { mock } from 'vs/base/test/common/mock'; import { IWorkspaceFolder, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ConfigurationTarget, IConfigurationModel, IConfigurationChange } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/test/browser/api/extHostDecorations.test.ts b/src/vs/workbench/api/test/browser/extHostDecorations.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/extHostDecorations.test.ts rename to src/vs/workbench/api/test/browser/extHostDecorations.test.ts diff --git a/src/vs/workbench/test/browser/api/extHostDiagnostics.test.ts b/src/vs/workbench/api/test/browser/extHostDiagnostics.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/extHostDiagnostics.test.ts rename to src/vs/workbench/api/test/browser/extHostDiagnostics.test.ts diff --git a/src/vs/workbench/test/browser/api/extHostDocumentData.test.perf-data.ts b/src/vs/workbench/api/test/browser/extHostDocumentData.test.perf-data.ts similarity index 54% rename from src/vs/workbench/test/browser/api/extHostDocumentData.test.perf-data.ts rename to src/vs/workbench/api/test/browser/extHostDocumentData.test.perf-data.ts index 833bca4b2e5..aba53595c18 100644 --- a/src/vs/workbench/test/browser/api/extHostDocumentData.test.perf-data.ts +++ b/src/vs/workbench/api/test/browser/extHostDocumentData.test.perf-data.ts @@ -3,4 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -export const _$_$_expensive = '{"seq":0,"type":"response","command":"completionInfo","request_seq":956,"success":true,"body":{"isGlobalCompletion":true,"isMemberCompletion":false,"isNewIdentifierLocation":false,"entries":[{"name":"__dirname","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"__filename","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"_getInstrumentationKey","kind":"method","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"_util","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"$","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"abort","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"AbortController","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbortSignal","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbstractCaseAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractCodeEditorService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/abstractCodeEditorService"},{"name":"AbstractCommandsQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/commandsQuickAccess"},{"name":"AbstractConfigureRecommendedExtensionsAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"AbstractContextKeyService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"AbstractDebugAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"AbstractDebugAdapter","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/abstractDebugAdapter"},{"name":"AbstractDeleteAllToBoundaryAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractEditorCommandsQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/commandsQuickAccess"},{"name":"AbstractEditorNavigationQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/editorNavigationQuickAccess"},{"name":"AbstractExpressionsRenderer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"AbstractExtensionService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService"},{"name":"AbstractExtHostExtensionService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"AbstractExtHostOutputChannel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"AbstractFileDialogService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/abstractFileDialogService"},{"name":"AbstractFileOutputChannelModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"AbstractFileSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractGotoLineQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/gotoLineQuickAccess"},{"name":"AbstractGotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/gotoSymbolQuickAccess"},{"name":"AbstractJsonFileSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractKeybindingService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/abstractKeybindingService"},{"name":"AbstractLifecycleService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycleService"},{"name":"AbstractLineHighlightOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"AbstractLogService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"AbstractPathService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/common/pathService"},{"name":"AbstractProblemCollector","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"AbstractProcess","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"AbstractRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbstractRemoteAgentService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/abstractRemoteAgentService"},{"name":"AbstractScrollableElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"AbstractScrollbar","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/abstractScrollbar"},{"name":"AbstractSearchAndReplaceAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"AbstractSettingRenderer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"AbstractSettingsModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"AbstractShowReleaseNotesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"AbstractSortLinesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractTaskService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/abstractTaskService"},{"name":"AbstractTelemetryOptOut","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut"},{"name":"AbstractTextFileService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/browser/textFileService"},{"name":"AbstractTextMateService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/browser/abstractTextMateService"},{"name":"AbstractTextResourceEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textResourceEditor"},{"name":"AbstractTree","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"AbstractTunnelService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/tunnelService"},{"name":"AbstractUpdateService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/abstractUpdateService"},{"name":"AbstractURLService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlService"},{"name":"AbstractVariableResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/variableResolver"},{"name":"AbstractWorkspaceEditingService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService"},{"name":"Accelerator","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"acceptLocalChangesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"access","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"AccessibilityHelpNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"AccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"AccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"AccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibilityService"},{"name":"AccessibilitySupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"AccessibilitySupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"accessSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"AccountsActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ACL_IDENTITY","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"ACLED_DIRECTORIES","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"Action","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"Action2","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ActionBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"actions","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vscode-nsfw"},{"name":"ActionsOrientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActivatedExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ActivationTimes","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ACTIVE_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"activeContrastBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ActiveEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupEmptyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupIndexContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupLastContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorIsReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveGroupEditorsByMostRecentlyUsedQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"ActivePanelContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"ActiveViewletContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"ActiveWindowManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/activeWindowTracker"},{"name":"ACTIVITY_BAR_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_ACTIVE_FOCUS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BADGE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BADGE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ActivitybarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarPart"},{"name":"ActivityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/browser/activityService"},{"name":"ActivityUpdater","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"ADD_CONFIGURATION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"ADD_ROOT_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"ADD_ROOT_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"addArg","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"addClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addClasses","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addContextToEditorMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchHelpers"},{"name":"AddCursorsAtSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"addDisposableGenericMouseDownListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableGenericMouseMoveListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableGenericMouseUpListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableNonBubblingMouseOutListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableNonBubblingPointerOutListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableThrottledListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addEventListener","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"AddFunctionBreakpointAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"addListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"addListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ADDRCONFIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"ADDRGETNETWORKPARAMS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"AddRootFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"AddSelectionToNextFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"AddSelectionToPreviousFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"addSetting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"addStandardDisposableGenericMouseDownListner","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addStandardDisposableGenericMouseUpListner","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addStandardDisposableListener","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addTerminalEnvironmentKeys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"addToValueTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"AddToWorkspaceFolderRecommendationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"AddToWorkspaceRecommendationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"addTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"AddWatchExpressionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"adoptToGalleryExtensionId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"after","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"afterEach","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Agent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"Agent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"Aggregation","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"alert","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"alert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"alertFormattingEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"ALL_SYNC_RESOURCES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"allCharCodes","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"AllEditorsByAppearanceQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"AllEditorsByMostRecentlyUsedQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"AllKeysConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"allowedNodeEnvironmentFlags","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"allowSetForegroundWindow","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-foreground-love/index"},{"name":"allSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ALPN_ENABLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"AnalyserNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnchorAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"anchorGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"AnchorPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"animate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Animation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationEffect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationPlaybackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationTimeline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ansiColorIdentifiers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"ansiColorMap","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"any","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"anyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"AnythingQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/anythingQuickAccess"},{"name":"ApiCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ApiCommandArgument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ApiCommandResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"app","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"append","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"appendEditorTitleContextMenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions.contribution"},{"name":"appendFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"appendFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"appendKeyBindingLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"appendStylizedStringToContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"appendStylizedStringToContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"appendToCommandPalette","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions.contribution"},{"name":"AppInsightsAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/appInsightsAppender"},{"name":"applicationCache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ApplicationCache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"applicationSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"applyCodeAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"applyConfigurationValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"applyDeprecatedVariableMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolverUtils"},{"name":"applyDragImage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"applyEdit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"applyEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"ApplyEditsResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"ApplyToKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"appVersion","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"arch","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"arch","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"areFunctions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"areKeyboardLayoutsEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"areSame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"areSameExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"areWebviewInputOptionsEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"argv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"argv0","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"AriaLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ArrayBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"arrayInsert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"ArrayNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/navigator"},{"name":"ARROW_IMG_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarArrow"},{"name":"as","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"asArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"AsbtractOutputChannelModelService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"asCSSUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"asDomUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"asJson","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"asPromise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"assert","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"assertAllDefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"AssertDocumentLineMappingDirection","kind":"enum","kindModifiers":"","sortText":"0"},{"name":"assertEqualQueries","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"assertEqualSearchPathResults","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"AssertionError","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"assertIsDefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"assertMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveKeyboardEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveUserBinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"asserts","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"assertSyncedModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/editableTextModelTestUtils"},{"name":"assertType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"assign","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"asText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"asWebviewUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/webview"},{"name":"async","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"AsyncDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"AsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/asyncDataTree"},{"name":"AsyncEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"AsyncResource","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"atob","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Atomics","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"attachBadgeStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachBreadcrumbsStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachButtonStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachCheckboxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachDialogStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachFindReplaceInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachLinkStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachListStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachMenuStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachProgressBarStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachQuickInputStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachSelectBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachStylerCallback","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachSuggestEnabledInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput"},{"name":"Attr","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Audio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioBufferSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioDestinationNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioListener","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioParam","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioParamMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioProcessingEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioScheduledSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioWorklet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioWorkletNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"authentication","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"AuthenticationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/browser/authenticationService"},{"name":"AuthenticationTokenService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount"},{"name":"AuthenticationTokenService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/electron-browser/authenticationTokenService"},{"name":"AuthenticationTokenServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccountIpc"},{"name":"AuthenticatorAssertionResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthenticatorAttestationResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthenticatorResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthStatus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"AutoCheckUpdatesConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"AutoFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"AutoIndentOnPaste","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"AutoIndentOnPasteCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"automaticKeyboardNavigationSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"AutoSaveAfterShortDelayContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"AutoSaveConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"AutoSaveMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"AutoUpdateConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"autoUpdater","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"AvailabilityData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/AvailabilityData"},{"name":"AvailabilityData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"AverageBufferSize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"await","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"BackLayerWebView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView"},{"name":"BackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"BackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/node/backupFileService"},{"name":"BackupFilesModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"BackupMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backupMainService"},{"name":"BackupRestorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/common/backupRestorer"},{"name":"BACKUPS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/common/environment"},{"name":"BackupTracker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/common/backupTracker"},{"name":"BADFAMILY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADFLAGS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"badgeBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"badgeForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BADHINTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADNAME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADQUERY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADRESP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADSTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BareFontInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/fontInfo"},{"name":"BarProp","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Barrier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Base","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Base"},{"name":"Base","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"BaseActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"BaseAudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BaseBinaryResourceEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/binaryEditor"},{"name":"BaseBreakpoint","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"BaseCellViewModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel"},{"name":"BaseCloseAllAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseConfigurationResolverService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/browser/configurationResolverService"},{"name":"BaseCreateEditorGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseDropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"BaseEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/baseEditor"},{"name":"BaseEditorQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"BaseErrorTelemetry","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/errorTelemetry"},{"name":"BaseExtHostTerminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"BaseExtHostTerminalService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"BaseFocusGroupAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseMoveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"basename","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"basename","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"basename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"basenameOrAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"BaseNavigateEditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseQuickAccessEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseQuickAccessNavigateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/quickAccessActions"},{"name":"BaseResizeViewAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"BaseResolvedKeybinding","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/baseResolvedKeybinding"},{"name":"BaseSaveAllAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"BaseSplitEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseSwitchWindow","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"BaseTextEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textEditor"},{"name":"BaseTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/textEditorModel"},{"name":"baseTypeToTelemetryType","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"BaseWebview","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/baseWebviewElement"},{"name":"BaseWindowDriver","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/browser/baseDriver"},{"name":"BaseZoomAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"BasicInplaceReplace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/inplaceReplaceSupport"},{"name":"BatchedCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"before","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"beforeEach","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"BeforeUnloadEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BenchmarkSuite","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/benchmark/benchmarkUtils"},{"name":"BetterMergeId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"BhxBrowser","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"bigint","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"BigInt","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BigInt64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BigIntStats","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"BigUint64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BINARY_DIFF_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"BINARY_FILE_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"BinaryEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/binaryEditorModel"},{"name":"BinaryFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor"},{"name":"BinaryResourceDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/binaryDiffEditor"},{"name":"binarySearch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"BiquadFilterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Blob","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BlockCommentCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/blockCommentCommand"},{"name":"blur","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"boolean","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Boolean","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BooleanEventEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"BOTTOM_CELL_TOOLBAR_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"BoundModelReferenceCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocuments"},{"name":"BracesHidingRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"BracketElectricCharacterSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/electricCharacter"},{"name":"BracketMatchingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/bracketMatching/bracketMatching"},{"name":"BracketSelectionRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/bracketSelections"},{"name":"BracketsUtils","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"breadcrumbsActiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"breadcrumbsBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsConfig","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"BreadcrumbsControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsControl"},{"name":"BreadcrumbsFilePicker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"breadcrumbsFocusForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"breadcrumbsForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsItem","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"BreadcrumbsOutlinePicker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"BreadcrumbsPicker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"breadcrumbsPickerBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"BreadcrumbsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"break","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"breakBetweenGraphemeBreakType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Breakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Breakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Breakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"BREAKPOINT_EDITOR_CONTRIBUTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"BreakpointEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution"},{"name":"BREAKPOINTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"breakpointsExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"BreakpointsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"BreakpointWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointWidget"},{"name":"BreakpointWidgetContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"BroadcastChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"brotliCompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliCompressSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliDecompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliDecompressSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"BrowserBackupTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/browser/backupTracker"},{"name":"BrowserClipboardService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/clipboard/browser/clipboardService"},{"name":"BrowserCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/browser/credentialsService"},{"name":"BrowserEnvironmentConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/browser/environmentService"},{"name":"BrowserFeatures","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/canIUse"},{"name":"BrowserHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/browser/browserHostService"},{"name":"BrowserIntegrityServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/browser/integrityService"},{"name":"BrowserKeyboardMapperFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keymapService"},{"name":"BrowserKeyboardMapperFactoryBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keymapService"},{"name":"BrowserLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/lifecycle/browser/lifecycleService"},{"name":"BrowserPathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/browser/pathService"},{"name":"BrowserRequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/request/browser/requestService"},{"name":"BrowserResizeObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/sizeObserver"},{"name":"BrowserSocketFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/browserSocketFactory"},{"name":"BrowserStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/browser/storageService"},{"name":"BrowserTelemetryOptOut","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut"},{"name":"BrowserTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/browser/browserTextFileService"},{"name":"BrowserUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/update/browser/updateService"},{"name":"BrowserURLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/url/browser/urlService"},{"name":"BrowserView","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWindow","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWindowProxy","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWorkbenchEnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/browser/environmentService"},{"name":"BrowserWorkspaceEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspaceEditingService"},{"name":"BrowserWorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspacesService"},{"name":"btoa","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"buffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"Buffer","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"Buffer","kind":"alias","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"BufferedEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"BufferLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/bufferLog"},{"name":"BufferredOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"bufferToReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"bufferToStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"buildHelpMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"buildRegexParseError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"buildReplaceStringWithCasePreserved","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/search"},{"name":"buildTelemetryMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetry"},{"name":"buildVersionMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"BUILTIN_MANIFEST_CACHE_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"BuiltInBasicsExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"BuiltInExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"builtinModules","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"BuiltInThemesExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"BulkCategory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkEditAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditNaviLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane"},{"name":"BulkEditPreviewProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkEditService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/bulkEdit/browser/bulkEditService"},{"name":"BulkEditSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkFileOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkFileOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkFileOperationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkTextEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"Button","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/button/button"},{"name":"buttonBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"buttonBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"buttonForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ButtonGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/button/button"},{"name":"buttonHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"buttonHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"ByteLengthQueuingStrategy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cache"},{"name":"Cache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/cache"},{"name":"cached","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"cachedDataVersionTag","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"CachedExtensionScanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner"},{"name":"CachedKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keyboardMapper"},{"name":"CachedListVirtualDelegate","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"cachedStringRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/shiftCommand"},{"name":"caches","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CacheStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"calcANSI8bitColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"calcANSI8bitColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"calculateLF","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"calculateSize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"Call","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"callbackify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"CallHierarchyDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyIncomingCall","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyIncomingCall","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyIncomingCall","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyItem","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyOutgoingCall","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyOutgoingCall","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyOutgoingCall","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyTreePeekWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek"},{"name":"CallRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"CALLSTACK_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CallStackEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackEditorContribution"},{"name":"CallStackView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"CancelActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"cancelAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"CancelCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"canceled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"CancellationToken","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cancellation"},{"name":"CancellationTokenSource","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cancellation"},{"name":"CancellationTokenSource","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"CANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"CancelSearchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"canExecuteOnUI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canExecuteOnWeb","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canExecuteOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canNormalize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"CanvasGradient","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CanvasPattern","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CanvasRenderingContext2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"captureEvents","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"CaretPosition","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"case","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CaseSensitiveCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"catch","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CategoryElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"CategoryElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"CDATASection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CELL_MARGIN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"CELL_RUN_GUTTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"CELL_TOOLBAR_SEPERATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"CellEditState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellEditType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellFocusMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CellMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellMenus"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CellRevealPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellRunState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellUri","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CenteredViewLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/centered/centeredViewLayout"},{"name":"Certificate","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"CHANGE_BUFFER_DELAY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"ChangeEncodingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeEOLAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeIndentationSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ChangeModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeSortAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Channel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Channel"},{"name":"ChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ChannelMergerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ChannelServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ChannelSplitterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CharacterClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/characterClassifier"},{"name":"CharacterData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CharacterMapping","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"CharacterMappingConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"CharacterPairSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/characterPair"},{"name":"CharacterSet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/characterClassifier"},{"name":"CharCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/charCode"},{"name":"CharWidthRequest","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"CharWidthRequestType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"chdir","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Checkbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"CheckboxActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"CheckedStates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"CheckForUpdatesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"CheckForVSCodeUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"CheckForVSCodeUpdateActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/common/update"},{"name":"checkProposedApiEnabled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"checkServerIdentity","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"checksum","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/crypto"},{"name":"chmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chmod","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"chmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Choice","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"ChoiceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"ChokidarWatcherService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/chokidarWatcherService"},{"name":"ChordKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"chown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chrome","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ChunkStream","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Cipher","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"clamp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"class","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CLASSIFIER_MODIFIER_SEPARATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"ClassName","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"clean","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"cleanMnemonic","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"cleanRemoteAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"CleanSearchEditorStateCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"cleanUndefinedQueryValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"clear","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"CLEAR_ALL_NOTIFICATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"CLEAR_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"clearAllFontInfos","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"ClearAllNotificationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"ClearCommandHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"ClearEditorHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClearExtensionsInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"clearHistoryCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"clearImmediate","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearImmediate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"clearInterval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearInterval","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"clearLine","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"clearNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"ClearNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"ClearRecentFilesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClearReplAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/repl"},{"name":"clearScreenDown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"ClearSearchHistoryCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ClearSearchResultsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ClearTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"clearTextMimes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"clearTimeout","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearTimeout","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"ClickLinkGesture","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkKeyboardEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.cp"},{"name":"CLIENT_RENEG_LIMIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"CLIENT_RENEG_WINDOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"ClientCoordinates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"clientInformation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRectList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"ClientRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"clipboard","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Clipboard","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClipboardBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"ClipboardEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CLIServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostCLIServer"},{"name":"clock","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"cloneAndChange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"CLOSE_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITOR_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_AND_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_TO_THE_RIGHT_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_SAVED_EDITORS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CloseAllEditorGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseAllEditorsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseCurrentWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"closed","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CloseDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"CloseEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEditorInAllGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEditorsInOtherGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CloseExtensionDetailsOnViewChangeKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"CloseGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CloseLeftEditorsInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseOneEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClosePanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"CloseReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CloseReplaceWidgetActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CloseSidebarAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"closeSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"CloseWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"cmp","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"coalesce","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"coalesceInPlace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"CodeAction","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionAutoApply","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"CodeActionCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"CodeActionCommandArgs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"codeActionCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"CodeActionDocumentationContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationContribution"},{"name":"CodeActionExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint"},{"name":"CodeActionKeybindingResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionMenu"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionMenu"},{"name":"CodeActionModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"CodeActionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeActionsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsContribution"},{"name":"codeActionsExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint"},{"name":"CodeActionsState","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"CodeActionTrigger","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionTriggerType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeActionUi","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionUi"},{"name":"CodeApplication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/app"},{"name":"CodeCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell"},{"name":"CodeCellRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"CodeCellViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel"},{"name":"CodeDataTransfers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CodeEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/codeEditorService"},{"name":"CodeEditorServiceImpl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"CodeEditorStateFlag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"CodeEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"CodeInset","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeLens","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeLens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeLensCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codeLensCache"},{"name":"CodeLensContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensController"},{"name":"CodeLensHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensWidget"},{"name":"CodeLensModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelens"},{"name":"CodeLensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeLensWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensWidget"},{"name":"CodeWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/window"},{"name":"CodiconActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"CodiconLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/codiconLabel/codiconLabel"},{"name":"codiconStartMarker","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"coerce","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"COLLAPSE_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"CollapseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"CollapseAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/treeDefaults"},{"name":"CollapseDeepestExpandedLevelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CollapseExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CollapseNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"collectLaunchConfigs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"collectWorkspaceStats","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"Color","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Color","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"Color","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Color","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ColorDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorDetector"},{"name":"ColorExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorExtensionPoint"},{"name":"ColorFormat","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorId","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ColorInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"colorize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"colorizeElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"colorizeModelLine","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"Colorizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/colorizer"},{"name":"ColorMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ColorPickerBody","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPickerHeader","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPickerModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerModel"},{"name":"ColorPickerWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPresentation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorPresentation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorPresentation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ColorProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ColorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeData"},{"name":"ColorThemeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorThemeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"colorThemeSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"ColorZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"ColumnSelection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorColumnSelection"},{"name":"combinedAppender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"combinedDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"CombinedInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"CombinedSpliceable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/splice"},{"name":"Command","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"CommandLine","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"CommandOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"commands","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"commands","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"CommandsConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"CommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/commands/common/commandService"},{"name":"commandsExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/menusExtensionPoint"},{"name":"CommandsHistory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/commandsQuickAccess"},{"name":"CommandsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"CommandsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"CommandString","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CommandString","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"CommandTrackerAddon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon"},{"name":"Comment","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CommentBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"CommentContextKeys","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentContextKeys"},{"name":"CommentController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"COMMENTEDITOR_DECORATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentThreadWidget"},{"name":"CommentFormActions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentFormActions"},{"name":"CommentGlyphWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentGlyphWidget"},{"name":"CommentMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentMenus"},{"name":"CommentMode","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CommentMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CommentMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CommentMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/commentMode"},{"name":"CommentNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"CommentNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentNode"},{"name":"CommentNodeRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"comments","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"COMMENTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"COMMENTS_VIEW_TITLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsAsyncDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentService"},{"name":"CommentsList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"CommentsModelVirualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsPanel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsView"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CommitCharacterController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestCommitCharacters"},{"name":"CommonEditorConfiguration","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"CommonFindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"commonlyUsedData","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"commonPrefixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"commonPrefixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"commonSuffixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"CommonTask","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"Comparator","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compare","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"COMPARE_RESOURCE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COMPARE_SELECTED_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COMPARE_WITH_SAVED_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"compareAnything","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareBuild","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compareByPrefix","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareFileExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareFileNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareIdentifiers","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compareIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compareItemsByFuzzyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"compareMarkersByUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"comparePaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareSubstring","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compareSubstringIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"CompareWithClipboardAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CompatChangeAll","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"compile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCompile"},{"name":"compileFunction","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"CompletionContext","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"CompletionItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItem","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemInsertTextRule","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemInsertTextRule","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItemKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItemTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"completionKindFromString","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"completionKindToCssClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionList","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/completionModel"},{"name":"CompletionOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"CompletionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionTriggerKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"Component","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/component"},{"name":"ComposedTreeDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"Composite","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositeBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBar"},{"name":"CompositeDescriptor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBar"},{"name":"CompositeDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CompositeDragAndDropObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CompositeOverflowActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositeOverflowActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositePart","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositePart"},{"name":"CompositeProgressIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"CompositeRegistry","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeScope","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"CompositeSnippetVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"CompositionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"compress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"compressConsecutiveTextChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textChange"},{"name":"CompressedNavigationController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"CompressedObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"CompressibleAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/asyncDataTree"},{"name":"CompressibleObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTree"},{"name":"CompressibleObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"computeCodePoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ComputedEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"computeLinks","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"computeRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"computeScreenAwareSize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"computeStyles","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"config","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"config","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"Config","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"Config","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"Configuration","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"CONFIGURATION_SYNC_STORE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"ConfigurationCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configurationCache"},{"name":"ConfigurationCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/node/configurationCache"},{"name":"ConfigurationChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"ConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationEditingError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationEditingErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ConfigurationManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugConfigurationManager"},{"name":"ConfigurationModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/browser/configurationResolverService"},{"name":"ConfigurationResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService"},{"name":"ConfigurationScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationService"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ConfigurationTargetToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"configurationTelemetry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"ConfigureAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"ConfigureLanguageBasedSettingsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesActions"},{"name":"ConfigureLocaleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/localizationsActions"},{"name":"ConfigureNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"configureOpenerTrustedDomainsHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"ConfigureRecommendedExtensionsCommandsContributor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfigureRuntimeArgumentsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ConfigureTaskAction","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/abstractTaskService"},{"name":"ConfigureWorkspaceFolderRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfigureWorkspaceRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfiguringTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"confirm","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ConfirmResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"CONFLICT_RESOLUTION_CONTEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"CONFLICT_RESOLUTION_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"ConflictDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/bulkEdit/browser/conflicts"},{"name":"connect","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"connect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"connect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"connect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"connect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"connected","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ConnectionGainEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ConnectionLostEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ConnectionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectPrimaryMenuToInlineActionBar","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"connectProxyResolver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/proxyResolver"},{"name":"connectRemoteAgentExtensionHost","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectRemoteAgentManagement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectRemoteAgentTunnel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"CONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"console","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Console","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ConsoleLogInAutomationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/browser/log"},{"name":"ConsoleLogInMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ConsoleLogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ConsoleLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"consolidate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"const","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"constants","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"constants","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"constants","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"constants","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/constants"},{"name":"Constants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"Constants","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"Constants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"ConstantSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"consumeReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeReadableWithLimit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeStreamWithLimit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"contains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"containsDragType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"containsEmoji","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsFullWidthCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsRTL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsUppercaseCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ContentHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverWidgets"},{"name":"contentTracing","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ContentViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ContentWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"ContentWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"context","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Context","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/provideSignatureHelp"},{"name":"Context","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"Context","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"Context","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"CONTEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/toolbar/toolbar"},{"name":"CONTEXT_ACCESSIBILITY_MODE_ENABLED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"CONTEXT_ACTIVE_LOG_OUTPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_AUTH_TOKEN_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"CONTEXT_BREAKPOINT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINT_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINTS_EXIST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINTS_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_CALLSTACK_ITEM_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_CUSTOM_EDITORS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CONTEXT_DEBUG_CONFIGURATION_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_UX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_UX_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_EXPRESSION_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_EXTENSION_HOST_PROFILE_RECORDED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"CONTEXT_FIND_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FIND_WIDGET_NOT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CONTEXT_FOCUSED_SESSION_IS_ATTACH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_BREAKPOINT_WIDGET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_DEBUG_MODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_DEBUG_REPL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_OUTPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_JUMP_TO_CURSOR_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_KEYBINDING_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_KEYBINDINGS_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_KEYBINDINGS_SEARCH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_LOADED_SCRIPTS_ITEM_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_LOADED_SCRIPTS_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_MENU_CHANNEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/common/contextmenu"},{"name":"CONTEXT_MENU_CLOSE_CHANNEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/common/contextmenu"},{"name":"CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"CONTEXT_OUTPUT_SCROLL_LOCK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_PROFILE_SESSION_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"CONTEXT_RENAME_INPUT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/renameInputField"},{"name":"CONTEXT_REPLACE_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_RESTART_FRAME_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_SETTINGS_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_SETTINGS_JSON_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_SETTINGS_SEARCH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_STEP_BACK_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_SYNC_ENABLEMENT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"CONTEXT_SYNC_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"CONTEXT_TOC_ROW_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_UPDATE_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"CONTEXT_VARIABLES_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_WATCH_EXPRESSIONS_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"ContextAwareMenuEntryActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"contextBridge","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ContextKeyAndExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyDefinedExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyEqualsExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyExpr","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyExprType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyFalseExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotEqualsExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotRegexExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyOrExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyRegexExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"ContextKeyTrueExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextMenuController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/contextmenu/contextmenu"},{"name":"ContextMenuHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextMenuHandler"},{"name":"ContextMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextMenuService"},{"name":"ContextMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService"},{"name":"ContextScopedFindInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextScopedHistoryInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextScopedReplaceInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextSubMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/contextmenu"},{"name":"ContextTagKeys","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ContextTagKeys"},{"name":"ContextTagKeys","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ContextView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"ContextViewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextViewService"},{"name":"continue","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CONTINUE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"CONTINUE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"Contracts","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"contrastBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ContributableViewsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"ContributedCustomEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors"},{"name":"ContributedTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"convertBufferRangeToViewport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"convertLinkRangeToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"convertSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeCompatibility"},{"name":"convertSimple2RegExpPattern","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"convertToDAPaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"convertToVSCPaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"ConvolverNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cookies","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"CoordinatesConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"copy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"COPY_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"COPY_PATH_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COPY_RELATIVE_PATH_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COPY_STACK_TRACE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"copyAllCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyAllCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"copyFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"COPYFILE_EXCL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"COPYFILE_FICLONE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"COPYFILE_FICLONE_FORCE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"copyFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"copyFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"CopyLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/copyLinesCommand"},{"name":"copyMatchCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyMatchCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CopyNotificationMessageAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"CopyOptions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaInput"},{"name":"copyPathCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyPathCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CopyTerminalSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"CopyValueAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"CopyWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"CoreEditingCommands","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CoreEditorCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CoreNavigationCommands","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CorrelationContextManager","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/AutoCollection/CorrelationContextManager"},{"name":"count","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"CountBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/countBadge/countBadge"},{"name":"countEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"Counter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"CountQueuingStrategy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"countReset","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"cpus","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"cpuUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"crash","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"crashReporter","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"crashReporterIdStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"create","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"domain"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorSimpleWorker"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkComputer"},{"name":"create","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateWorker"},{"name":"createActionViewItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createAndBindHistoryNavigationWidgetScopedContextKeyService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"createAndFillInActionBarActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createAndFillInContextMenuActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createApiFactoryAndRegisterActors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.api.impl"},{"name":"createBreadcrumbsPicker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"createBreakpointDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution"},{"name":"createBrotliCompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createBrotliDecompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createCancelablePromise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"createCellViewModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel"},{"name":"createChannelReceiver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc"},{"name":"createChannelSender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc"},{"name":"createCipher","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createCipheriv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createConnection","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"createContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"createCSSRule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createCustomTask","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"createDecipher","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDecipheriv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDecorationsForStackFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackEditorContribution"},{"name":"createDecorator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"createDecorator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"createDeflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createDeflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createDiffEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createDiffieHellman","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDiffNavigator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createECDH","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createEditorFromSearchResult","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"createEditorPagePosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"createElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"createError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"createErrorWithActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorsWithActions"},{"name":"createExtHostContextProxyIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"createFakeScopedLineTokens","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/modesTestUtils"},{"name":"createFastDomNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/fastDomNode"},{"name":"createFileEditorInput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"createFileIconThemableTreeContainerScope","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"createFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"createFindMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"createGunzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createGzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createHash","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createHmac","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createHook","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"createImageBitmap","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"createInflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createInflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createInterface","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"createKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"createLineMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"createLineStarts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createLineStartsFast","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createMainContextProxyIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"createMatchers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/textMateScopeMatcher"},{"name":"createMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"createMemoizer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"createMessageOfType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"createMetaElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createMockBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"createMockSession","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/browser/callStack.test"},{"name":"createMockText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"createModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createMonacoBaseAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneBase"},{"name":"createMonacoEditorAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createMonacoLanguagesAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"createMouseMoveEventMerger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseHandler"},{"name":"CreateNewLocalTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote"},{"name":"CreateNewTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"createPrivateKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createProxyObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"createPublicKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createQueuedSender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"createReadStream","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"createReadStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/io"},{"name":"createRegExp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"createRequire","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"createRequireFromPath","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"createResourceExcludeMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"createRotatingLogger","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"createRotatingLogger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/spdlogService"},{"name":"createRotatingLoggerAsync","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"createScanner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"createScopedLineTokens","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"createSecretKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createSecureContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSecurePair","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSecureServer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"createSerializedGrid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"createServer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSign","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createSimpleKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"createSingleEditOp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/commands/shiftCommand.test"},{"name":"createSingleEditOp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test"},{"name":"createSlowExtensionAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions"},{"name":"createSocket","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dgram"},{"name":"createStringBuilder","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"createStubInstance","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"createStyleSheet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createSuggestItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/test/completionModel.test"},{"name":"createSyncDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/descriptors"},{"name":"createTerminalEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"createTestCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"createTextBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactory","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactoryFromSnapshot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactoryFromStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/editorTestUtils"},{"name":"createTextSearchResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"createTOCIterator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"createTokenizationSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchLexer"},{"name":"createTracing","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"trace_events"},{"name":"createUintArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createUnzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createUpdateURL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/abstractUpdateService"},{"name":"createValidator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesValidation"},{"name":"createVerify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createWaitMarkerFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/waitMarkerFile"},{"name":"createWebWorker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/webWorker"},{"name":"createWebWorker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createWriteStream","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Credential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CredentialsContainer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Critical","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"crypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Crypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CryptoKey","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CryptoKeyPair","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSS","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"CSSConditionRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"cssEscape","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"CSSFontFaceRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSGroupingRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSImportRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSKeyframeRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSKeyframesRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSMediaRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSNamespaceRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSPageRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSRuleList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleDeclaration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleSheet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSSupportsRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ctxCommentEditorFocused","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/simpleCommentEditor"},{"name":"ctxHasSymbols","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/symbolNavigation"},{"name":"ctxReferenceSearchVisible","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesController"},{"name":"CurrentLineHighlightOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"CurrentLineMarginHighlightOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"currentSchemaVersion","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"currentSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"Cursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"CursorAtBoundary","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CursorChangeReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorEvents"},{"name":"CursorChangeReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CursorCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCollection"},{"name":"CursorColumns","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorModelState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"CursorMove","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveCommands"},{"name":"CursorMoveCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveCommands"},{"name":"CursorPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveOperations"},{"name":"CursorRedo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorStateChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"cursorStyleToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"cursorTo","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"CursorUndo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorUndoRedoController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorWordAccessibilityLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordPartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CustomEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditors"},{"name":"CustomEditorInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CustomEditorInfoCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CustomEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInput"},{"name":"CustomEditorInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory"},{"name":"CustomEditorModelManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditorModelManager"},{"name":"CustomEditorPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"customEditorsAssociationsSettingId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"CustomEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditors"},{"name":"customEditorsExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/extensionPoint"},{"name":"CustomElementRegistry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"customElements","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CustomEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CustomExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CustomExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CustomExecution2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CustomExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"CUSTOMIZED_TASK_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CustomMenubarControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/menubarControl"},{"name":"CustomTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CustomTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customTextEditorModel"},{"name":"CustomTreeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"cutFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CutWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"cwd","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"cwd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DARK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"darken","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DarwinUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.darwin"},{"name":"data","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/filters.perf.data"},{"name":"Data","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Data"},{"name":"Data","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"Database","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"DataBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DataBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"DataCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataPoint","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPoint"},{"name":"DataPoint","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"DataPointType","kind":"enum","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"DataPointType","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"DataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"DataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"DataTransfer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransferItem","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransferItemList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransfers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/dataTree"},{"name":"DataUri","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"DataView","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Date","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"debounce","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"debug","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"debug","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Debug","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"DEBUG_HELPER_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DebugAdapterExecutable","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterExecutable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugAdapterInlineImplementation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterInlineImplementation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugAdapterServer","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugConsoleMode","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugConsoleMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugContentProvider"},{"name":"debugExceptionWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"debugExceptionWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"DebugExtensionHostAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"debugger","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Debugger","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Debugger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugger"},{"name":"debuggersExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"DebugHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugHover"},{"name":"debugIconContinueForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconDisconnectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconPauseForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconRestartForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStartForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepBackForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepIntoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepOutForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepOverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStopForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debuglog","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"DebugModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"debugPort","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DebugProgressContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugProgress"},{"name":"DebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugService"},{"name":"DebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugSession"},{"name":"DebugStatusContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugStatus"},{"name":"DebugTaskRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugTaskRunner"},{"name":"DebugToolBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugToolBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugToolBarBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"DebugViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugViewlet"},{"name":"Decipher","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"DeclarationProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"declare","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"decode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"decode","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"decode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"decodeSemanticTokensDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/semanticTokensDto"},{"name":"decodeStream","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"decodeURI","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"decodeURIComponent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"decodeUTF16LE","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"decodeUTF8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"decompress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"Decoration","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Decoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DecorationRangeBehavior","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DecorationRangeBehavior","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DecorationRangeBehavior","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DecorationRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DecorationSegment","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"DecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/decorations/decorations"},{"name":"DecorationsOverviewRuler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler"},{"name":"DecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/decorations/browser/decorationsService"},{"name":"DecorationToRender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"DecreaseSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"DecreaseViewSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"DedupOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"deepClone","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"deepEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"deepFreeze","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"deepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"default","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"DEFAULT_COMMANDS_TO_SKIP_SHELL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_CUSTOM_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"DEFAULT_ECDH_CURVE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"DEFAULT_EDITOR_MAX_DIMENSIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_EDITOR_MIN_DIMENSIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_EDITOR_PART_OPTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_ENCODING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"DEFAULT_LABELS_CONTAINER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"DEFAULT_LETTER_SPACING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_LINE_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_LOG_LEVEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"DEFAULT_PRODUCT_ICON_THEME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/productIconThemeData"},{"name":"DEFAULT_PRODUCT_ICON_THEME_SETTING_VALUE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"DEFAULT_SETTINGS_EDITOR_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"DEFAULT_SETTINGS_EDITOR_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"DEFAULT_TERMINAL_OSX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"DEFAULT_VALUE","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"DEFAULT_WORD_REGEXP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"defaultApp","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"defaultBreadcrumbsStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"defaultCipherList","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"defaultClient","kind":"let","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"DefaultConfigurationExportHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper"},{"name":"DefaultConfigurationModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"defaultCoreCipherList","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"defaultCustomEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors"},{"name":"DefaultDeserializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"defaultDialogStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"DefaultElementMapper","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"DefaultEndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"DefaultEndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"defaultGenerator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/idGenerator"},{"name":"defaultInsertColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"defaultKeybindingsContents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultKeybindingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultKeyboardNavigationDelegate","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"defaultListStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"defaultMaxListeners","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"defaultMenuStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"DefaultPaneDndController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"DefaultPreferencesEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"DefaultPreferencesEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"defaultQuickAccessContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"defaultQuickAccessContextKeyValue","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"DefaultQuickAccessFilterValue","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"DefaultRawSettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultRecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"defaultRemoveColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DefaultRoleName","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"defaultSearchConfig","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"DefaultSerializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"DefaultSettings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultSettingsEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"DefaultSettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultSettingsHeaderWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"DefaultSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"defaultSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"defaultStatus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DefaultStyleController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"defaultStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBox"},{"name":"DefaultURITransformer","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"defaultWebSocketFactory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/browserSocketFactory"},{"name":"defaultWindowState","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/window"},{"name":"DefaultWorkerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/worker/defaultWorkerFactory"},{"name":"DeferredPermissionRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeferredPromise","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"define","kind":"const","kindModifiers":"declare","sortText":"4"},{"name":"DefineKeybindingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"DefineKeybindingOverlayWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"DefineKeybindingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"defineTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"DefinitionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToCommands"},{"name":"DefinitionLink","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DefinitionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"deflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateRawSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"DelayedDragHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DelayedPagedModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"Delayer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"DelayNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Delegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"Delegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList"},{"name":"DelegatedLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"DelegatingEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorService"},{"name":"delete","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"DeleteAllLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteAllRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"deleteFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DeleteLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorDeleteOperations"},{"name":"deletePassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"deletePassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"DeleteWordCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordEndLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordEndRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordPartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"DeleteWordPartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"DeleteWordRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordStartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordStartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"delimiter","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"delimiter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"delta","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"DeltaExtensionsResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDescriptionRegistry"},{"name":"departFocus","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"DependsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"deprecate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"Deprecated_RemoteAuthorityContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"describe","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"descriptionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"deserialize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"deserializeEnvironmentVariableCollection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableShared"},{"name":"deserializePipePositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"Deserializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"deserializeSearchError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"desktopCapturer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"DesktopDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"DesktopHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/electron-browser/desktopHostService"},{"name":"DESTRUCTION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"detect","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"detectAvailableShells","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"detectEncodingByBOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/encoding/encoding.test"},{"name":"detectEncodingByBOMFromBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"detectEncodingFromBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"DetectIndentation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"detectModeId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"DeviceAcceleration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceLightEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceMotionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceOrientationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"devicePixelRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceRotationRate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DH_CHECK_P_NOT_PRIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_CHECK_P_NOT_SAFE_PRIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_NOT_SUITABLE_GENERATOR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_UNABLE_TO_CHECK_GENERATOR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"Diagnostic","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Diagnostic","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Diagnostic","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDiagnostics"},{"name":"DiagnosticRelatedInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticRelatedInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticRelatedInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticsChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsIpc"},{"name":"DiagnosticSeverity","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticSeverity","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"DiagnosticsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsIpc"},{"name":"DiagnosticTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"dialog","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Dialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dialog/dialog"},{"name":"DialogChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-browser/dialogIpc"},{"name":"DialogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-main/dialogs"},{"name":"DialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/dialogService"},{"name":"DialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/dialogService"},{"name":"didBindWorkbenchListAutomaticKeyboardNavigation","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"DidChangeContentEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"DidChangeDecorationsEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"didUseCachedData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/timer/electron-browser/timerService"},{"name":"diff","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"diff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"DiffAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"diffBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffChange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diffChange"},{"name":"DiffComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/diff/diffComputer"},{"name":"DiffEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/diffEditorInput"},{"name":"DiffEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/diffEditorModel"},{"name":"DiffEditorState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"DiffEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffEditorWidget"},{"name":"DiffieHellman","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"diffInserted","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"diffInsertedOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffNavigator"},{"name":"diffRemoved","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"diffRemovedOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffReview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffReview"},{"name":"Dimension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"dir","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Dir","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"Dirent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"dirExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"dirname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"dirname","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"dirname","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"DirtyDiffController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyDiffModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyDiffWorkbenchController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"DirtyFilesIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/dirtyFilesIndicator"},{"name":"DirtyWorkingCopiesContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"dirxml","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"DisableAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"DisableAllWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DISABLED_EXTENSIONS_STORAGE_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"DisabledExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"DisableDropDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableForWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableGloballyAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"disconnect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"disconnect","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DISCONNECT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"DISCONNECT_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"DiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/diskFileSystemProvider"},{"name":"DiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/electron-browser/diskFileSystemProvider"},{"name":"DiskSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchService"},{"name":"DispatchConfig","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/dispatchConfig"},{"name":"dispatchEvent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Disposable","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Disposable","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"Disposable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Disposable","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"DisposableStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"disposableTimeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"dispose","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"dispose","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"disposed","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"distinct","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"distinct","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"distinctES6","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"distinctParents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"do","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"doBenchmark","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/benchmark/benchmarkUtils"},{"name":"Dock","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"document","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Document","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"documentationExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint"},{"name":"DocumentationExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint"},{"name":"DocumentFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentFragment","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DocumentHighlight","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentHighlight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentHighlight","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"DocumentHighlightProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentLink","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentLink","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentLink","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentRangeFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentRangeSemanticTokensAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"DocumentRangeSemanticTokensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentSemanticTokensAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"DocumentSemanticTokensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentSymbol","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentSymbol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentSymbol","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentSymbolProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentTimeline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DocumentType","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"doesNotReject","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"doesNotThrow","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"domain","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Domain","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"domain"},{"name":"Domain","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Domain"},{"name":"Domain","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"domainSupportsProperties","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Constants"},{"name":"domainToASCII","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"domainToUnicode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"domContentLoaded","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"DOMError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"domEvent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/event"},{"name":"DOMException","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMImplementation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMLineBreaksComputerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/domLineBreaksComputer"},{"name":"DOMMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMMatrixReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMParser","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMPointReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMQuad","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DomReadingContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"DOMRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMRectList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMRectReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DomScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"DOMSettableTokenList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMStringList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMStringMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMTokenList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"doNotTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"dosDateTimeToDate","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"DOWNLOAD_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DOWNLOAD_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DownloadItem","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"DownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadService"},{"name":"DownloadServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadIpc"},{"name":"DownloadServiceChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadIpc"},{"name":"DragAndDropCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/dnd/dragAndDropCommand"},{"name":"DragAndDropController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/dnd/dnd"},{"name":"DragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DragAndDropObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DragEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DraggedCompositeIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedEditorGroupIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedEditorIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedViewIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DragMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"Driver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-main/driver"},{"name":"DriverChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"DriverChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"Dropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropdownMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropdownMenuActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropDownMenuActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Duplex","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"DuplicateSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DuplicateWorkspaceInNewWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"DynamicsCompressorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DynamicStandaloneServices","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneServices"},{"name":"DynamicViewOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/dynamicViewOverlay"},{"name":"DynamicWebviewEditorOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay"},{"name":"DynamicWorkspaceRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/dynamicWorkspaceRecommendations"},{"name":"E2BIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EACCES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EADDRINUSE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EADDRNOTAVAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EAFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EAGAIN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EALREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBADF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBADMSG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBUSY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECANCELED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECDH","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"ECHILD","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNABORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EDEADLK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EDESTADDRREQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"edit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"EditableConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"EditOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/editOperation"},{"name":"EditOperationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"EditOperationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"editor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"EDITOR_BOTTOM_PADDING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_CONTRIBUTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"EDITOR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_FONT_DEFAULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EDITOR_GROUP_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_EMPTY_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_FOCUSED_EMPTY_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_TABS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_TABS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_MODEL_DEFAULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EDITOR_PANE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_TITLE_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"EDITOR_TOOLBAR_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_TOP_MARGIN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_TOP_PADDING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"EditorActivation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"editorActiveIndentGuides","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorActiveLineNumber","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorActiveLinkForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorAreaVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorAssociationsConfigurationNode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"EditorAutoIndentStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorAutoIndentStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EditorAutoSave","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorAutoSave"},{"name":"editorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorBracketMatchBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorBracketMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorBreadcrumbsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsModel"},{"name":"editorCodeLensForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"EditorCommandsContextActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsContribution"},{"name":"editorConfigurationBaseNode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"EditorContextKeys","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorContextKeys"},{"name":"EditorControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorControl"},{"name":"editorCursorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorCursorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/editor"},{"name":"EditorDropTarget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorDropTarget"},{"name":"editorErrorBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorExtensionsRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"editorFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindRangeHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorFontLigatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"editorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/editorGroup"},{"name":"EditorGroupActiveEditorDirtyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorGroupEditorsCountContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorGroupToViewColumn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/editor"},{"name":"EditorGroupView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorGroupView"},{"name":"editorGutter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorGutterAddedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorGutterDeletedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorGutterModifiedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorHintBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHintForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverStatusBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorInactiveSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorIndentGuides","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorInfoBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorInput","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorKeybindingCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/keybindingCancellation"},{"name":"EditorLayoutInfoComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorLayoutSingleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutThreeColumnsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutThreeRowsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoByTwoGridAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoColumnsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoColumnsBottomAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoRowsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoRowsRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"editorLightBulbAutoFixForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorLightBulbForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorLineHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorLineHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorLineNumbers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorMarkerNavigationBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationInfo","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMatchesToTextSearchResults","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchHelpers"},{"name":"EditorMemento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/baseEditor"},{"name":"EditorModeContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"EditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorModesRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"EditorMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorMouseEventFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorOpenContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"EditorOption","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorOption","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EditorOptions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorOptionsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"editorOverviewRulerBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorPagePosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorPart"},{"name":"EditorPinnedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorPointerEventFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorProgressIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"editorRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorRangeHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorRuler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorScopedQuickInputServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"EditorScroll_","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"EditorScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar"},{"name":"editorSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorService"},{"name":"EditorSimpleWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorSimpleWorker"},{"name":"EditorsObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorsObserver"},{"name":"EditorsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"EditorStateCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"EditorStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"editorSuggestWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetSelectedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"EditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorSymbolHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorSymbolHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewContext"},{"name":"EditorType","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"editorUnnecessaryCodeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorUnnecessaryCodeOpacity","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorWalkThroughAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough"},{"name":"EditorWalkThroughInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough"},{"name":"editorWarningBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorWhitespace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/linesLayout"},{"name":"editorWhitespaces","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetResizeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorWorkerClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorWorkerHost","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorWorkerServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorZoom","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorZoom"},{"name":"EditPreferenceWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"EditStack","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"EDOM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EEXIST","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EFAULT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EFBIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EHOSTUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EIDRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EILSEQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINPROGRESS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINVAL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EISCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EISDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"electron","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Electron","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"ElectronAcceleratorLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"ElectronMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/electron-main/electronMainService"},{"name":"ElectronService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/electron/electron-browser/electronService"},{"name":"ElectronURLListener","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/electron-main/electronUrlListener"},{"name":"ElectronWebviewBasedWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewElement"},{"name":"ElectronWebviewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewService"},{"name":"Element","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ElementsDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"ElementSizeObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/elementSizeObserver"},{"name":"ELOOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"else","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"EmbeddedCodeEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/embeddedCodeEditorWidget"},{"name":"EmbeddedDiffEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/embeddedCodeEditorWidget"},{"name":"embeddedEditorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"EMFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"emit","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"emit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"emitKeypressEvents","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"Emitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"Emitter","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"Emitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"emitWarning","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"EMLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EmmetEditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/emmet/browser/emmetActions"},{"name":"empty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"EmptyExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"EmptyPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"EmptyPaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"emptyProgressRunner","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"EmptyView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/emptyView"},{"name":"EMSGSIZE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EnableAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"EnableAllWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ENABLED_EXTENSIONS_STORAGE_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"enableDebug","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"EnabledExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"EnableDropDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableForWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableGloballyAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Enablement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"EnablementState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"enablePromiseAPIs","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ENAMETOOLONG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"encode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"encode","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"encode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"EncodedTokenizationSupport2Adapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"encodeSemanticTokensDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/semanticTokensDto"},{"name":"encodeStream","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"encodeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"encodeURI","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"encodeURIComponent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"encodeUTF8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"encodingExists","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"encodingExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"EncodingMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EncodingOracle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService"},{"name":"endianness","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"EndOfLine","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EndOfLine","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"EndOfLinePreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"EndOfLinePreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EndOfLineSequence","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"EndOfLineSequence","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"endsWith","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ENETDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENETRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENETUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"Engine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"ENGINE_METHOD_ALL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_CIPHERS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DIGESTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_ECDH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_ECDSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_NONE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_PKEY_ASN1_METHS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_PKEY_METHS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_RAND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_RSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_STORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOBUFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENODATA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENODEV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOENT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOEXEC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOLCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOMEM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOMSG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOPROTOOPT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSPC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSYS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTEMPTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTSUP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ensureFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ensureValidWordDefinition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"Entry","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"enum","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"env","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"env","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"env","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ENV_azurePrefix","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_http_proxy","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_https_proxy","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_iKey","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_profileQueryEndpoint","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"Envelope","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Envelope"},{"name":"Envelope","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"EnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"EnvironmentVariableCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariable"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EnvironmentVariableService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableService"},{"name":"ENXIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EOF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"EOL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"EOPNOTSUPP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EOVERFLOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPERM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTONOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTOTYPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"eq","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"equal","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"equals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"equals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"equalsIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ERANGE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EROFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"error","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Error","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Error","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"ErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ErrorEvent","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/errorTelemetry"},{"name":"errorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"errorHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ErrorHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ErrorScope","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ErrorTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/browser/errorTelemetry"},{"name":"ErrorTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/errorTelemetry"},{"name":"escape","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"escape","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"escape","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"escapeCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"escapeNonWindowsPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"escapeRegExpCharacters","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ESPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ESRCH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"etag","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ETAG_DISABLED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ETIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ETIMEDOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ETXTBSY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"eval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"EvalError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EvaluatableExpression","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EvaluatableExpression","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EvaluatableExpression","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"EvaluatableExpressionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"event","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Event","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Event","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"Event","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"EventBufferer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"EventData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/EventData"},{"name":"EventData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"EventEmitter","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EventEmitter","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"events"},{"name":"EventHelper","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"EventMultiplexer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"eventNames","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"eventNames","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"EventSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EventTarget","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EventType","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"EventType","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/touch"},{"name":"EWOULDBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"exception","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ExceptionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ExceptionData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionData"},{"name":"ExceptionData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ExceptionDetails","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionDetails"},{"name":"ExceptionDetails","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ExceptionWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"ExcludePatternInputWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget"},{"name":"ExcludeSettingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"EXDEV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ExeBasedRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations"},{"name":"exec","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"exec","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/sudo-prompt/index"},{"name":"execArgv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"execFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"execFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"execPath","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"execSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"ExecutableDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"ExecuteCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"ExecuteCommandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ExecuteCommandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"executionAsyncId","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"ExecutionEngine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"ExecutionEngine","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"exists","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"exists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"existsSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"exit","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-watchdog/index"},{"name":"exit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"exitCode","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"EXPAND_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ExpandAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ExpandNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"expectation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"ExperimentActionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"experimental","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/colorRegistry.releaseTest"},{"name":"ExperimentalPrompts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/browser/experimentalPrompt"},{"name":"ExperimentalRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/experimentalRecommendations"},{"name":"ExperimentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"ExperimentState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"ExplorerCompressedFirstFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressedFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressedLastFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressionDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerDecorationsProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerDecorationsProvider"},{"name":"ExplorerDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerFocusCondition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerFolderContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"ExplorerModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"ExplorerResourceCut","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceMoveableToTrash","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceNotReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerRootContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"explorerRootErrorEmitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerService"},{"name":"ExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerView"},{"name":"ExplorerViewletViewsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"ExplorerViewletVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"export","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"exportEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"exports","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Expression","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ExpressionContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"EXT_HOST_CREATION_DELAY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"extends","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"EXTENSION_BADGE_REMOTE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EXTENSION_BADGE_REMOTE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EXTENSION_IDENTIFIER_PATTERN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"EXTENSION_IDENTIFIER_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"EXTENSION_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"ExtensionAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionActivationProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress"},{"name":"ExtensionActivationTimes","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ExtensionActivationTimesBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"extensionButtonProminentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"extensionButtonProminentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"extensionButtonProminentHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionContainers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionData","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"ExtensionData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionDependencyChecker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker"},{"name":"ExtensionDescriptionRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDescriptionRegistry"},{"name":"ExtensionDropDownAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionEditor"},{"name":"ExtensionEditorDropDownAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionEnablementService"},{"name":"ExtensionGalleryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService"},{"name":"ExtensionHostDebugBroadcastChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebugIpc"},{"name":"ExtensionHostDebugChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebugIpc"},{"name":"ExtensionHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService"},{"name":"ExtensionHostLogFileName","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ExtensionHostMain","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostMain"},{"name":"ExtensionHostPersistentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ExtensionHostProcessManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProcessManager"},{"name":"ExtensionHostProcessWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionHost"},{"name":"ExtensionHostProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler"},{"name":"ExtensionHostProfileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService"},{"name":"ExtensionIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"ExtensionIdentifierWithVersion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"ExtensionKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ExtensionKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ExtensionManagementChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionManagementChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionManagementError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementService"},{"name":"ExtensionManagementServerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService"},{"name":"ExtensionManagementServerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/node/extensionManagementService"},{"name":"ExtensionMemento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostMemento"},{"name":"ExtensionMessageCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionPackCountWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"ExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionPointContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/extensionHost.contribution"},{"name":"ExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper.contribution"},{"name":"ExtensionPointUserDelta","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionRecommendationReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"ExtensionRecommendations","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendations"},{"name":"ExtensionRecommendationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService"},{"name":"ExtensionRegistryReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ExtensionRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionResourceLoaderService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService"},{"name":"extensionResultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"extensionResultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/api/extHostSearch.test"},{"name":"extensions","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/jsonschemas/common/jsonContributionRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"Extensions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/contributions"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"Extensions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/output"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/actions"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/editor"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"EXTENSIONS_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionsActivator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ExtensionsAutoProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler"},{"name":"ExtensionScanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionPoints"},{"name":"ExtensionScannerInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionPoints"},{"name":"ExtensionsChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ExtensionsConfigurationInitialContent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionsConfigurationSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionsConfigurationSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionScriptApis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionService"},{"name":"ExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionService"},{"name":"ExtensionsGridView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionsInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsInput"},{"name":"ExtensionsLabel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ExtensionsLifecycle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionLifecycle"},{"name":"ExtensionsListView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"ExtensionsManifestCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionsManifestCache"},{"name":"ExtensionsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionsRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/extensionsSync"},{"name":"ExtensionState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionStoragePaths","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostStoragePaths"},{"name":"ExtensionsTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionsViewletViewsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"ExtensionsViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"ExtensionsWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService"},{"name":"ExtensionTipsChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionTipsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionTipsService"},{"name":"ExtensionToolTipAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"ExtensionWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"external","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"External","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ExternalElementsDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"ExternalThemeTrieElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ExternalUriResolverContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/externalUriResolver"},{"name":"ExtHostApiCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ExtHostApiDeprecationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"ExtHostAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostAuthentication"},{"name":"ExtHostCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostClipboard"},{"name":"ExtHostCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"ExtHostComments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostComments"},{"name":"ExtHostCommentThread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostComments"},{"name":"ExtHostConfigProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"ExtHostConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"ExtHostContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"extHostCustomer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostCustomersRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostDebugConsole","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostDebugService"},{"name":"ExtHostDebugServiceBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDecorations"},{"name":"ExtHostDiagnostics","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDiagnostics"},{"name":"ExtHostDialogs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDialogs"},{"name":"ExtHostDocumentContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentContentProviders"},{"name":"ExtHostDocumentData","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"ExtHostDocumentLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"ExtHostDocuments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocuments"},{"name":"ExtHostDocumentsAndEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentsAndEditors"},{"name":"ExtHostDocumentSaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentSaveParticipant"},{"name":"ExtHostDownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostDownloadService"},{"name":"ExtHostEditorInsets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCodeInsets"},{"name":"ExtHostEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditors"},{"name":"ExtHostExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostExtensionService"},{"name":"ExtHostExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/worker/extHostExtensionService"},{"name":"ExtHostFileSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostFileSystem"},{"name":"ExtHostFileSystemEventService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostFileSystemEventService"},{"name":"ExtHostLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLabelService"},{"name":"ExtHostLanguageFeatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"ExtHostLanguages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguages"},{"name":"extHostLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"ExtHostLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostLogService"},{"name":"ExtHostLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/worker/extHostLogService"},{"name":"ExtHostMessageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostMessageService"},{"name":"extHostNamedCustomer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostNotebookController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookDocument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookOutputRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostOutputChannelBackedByFile","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostOutputService"},{"name":"ExtHostOutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"ExtHostOutputService2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostOutputService"},{"name":"ExtHostProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostProgress"},{"name":"ExtHostPseudoterminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"ExtHostPushOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"ExtHostQuickOpen","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostQuickOpen"},{"name":"ExtHostRpcService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRpcService"},{"name":"ExtHostSCM","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSCM"},{"name":"ExtHostSCMInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSCM"},{"name":"ExtHostSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"ExtHostStatusBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStatusBar"},{"name":"ExtHostStatusBarEntry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStatusBar"},{"name":"ExtHostStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStorage"},{"name":"ExtHostTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTask"},{"name":"ExtHostTaskBase","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ExtHostTerminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"ExtHostTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTerminalService"},{"name":"ExtHostTextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"ExtHostTextEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"ExtHostTheming","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTheming"},{"name":"ExtHostTimeline","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTimeline"},{"name":"ExtHostTreeViews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTreeViews"},{"name":"ExtHostTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"ExtHostTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTunnelService"},{"name":"ExtHostUrls","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUrls"},{"name":"ExtHostVariableResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWebviewEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWebviews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWindow"},{"name":"ExtHostWorkspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWorkspace"},{"name":"extname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"extname","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"extname","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"extract","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"ExtractError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"extractLocalHostUriMetaDataForPortMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/tunnel"},{"name":"extractRangeFromFilter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"extractResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"extractSearchQueryFromLines","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"extractSearchQueryFromModel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"F_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"fail","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"FailedExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"fakeServer","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"fakeServerWithClock","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"FakeXMLHttpRequest","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"FALLBACK_MAX_MEMORY_SIZE_MB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/files"},{"name":"false","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"FastDomNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/fastDomNode"},{"name":"fchmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fdatasync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fdatasyncSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"features","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"FeedbackDropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/feedback/browser/feedback"},{"name":"FeedbackStatusbarConribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem"},{"name":"fetch","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"FetchFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider"},{"name":"File","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"FILE_EDITOR_INPUT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FileBasedRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations"},{"name":"FileChangesEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FileChangeType","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"FileCopiedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/fileDialogService"},{"name":"FileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/fileDialogService"},{"name":"FileDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/editors/fileEditorInput"},{"name":"FileElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsModel"},{"name":"FileElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"FileElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"fileExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"FileFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileIconThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/fileIconThemeData"},{"name":"FileKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FileLocationKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"FileLoggerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/fileLogService"},{"name":"FileLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/fileLogService"},{"name":"FileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"FileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FileMatchOrFolderMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchOrFolderMatchWithResourceFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchOrMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"FileOperation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FilePreview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"FileQueryCacheState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/cacheState"},{"name":"FileReader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FileReferences","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"FileReferencesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"FileResourceMarkersRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"FILES_ASSOCIATIONS_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FILES_EXCLUDE_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FilesConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"FileSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/fileSearchManager"},{"name":"FileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/fileService"},{"name":"FilesExplorerFocusCondition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FilesExplorerFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FilesFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"FileSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FilesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/stateService"},{"name":"FileStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/browser/storageService"},{"name":"FileSystemError","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileSystemError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FileSystemProviderCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileSystemProviderCapabilities","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"FileSystemProviderError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileSystemProviderErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileThemeIcon","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"FileType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"fileURLToPath","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"FileUserDataProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userData/common/fileUserDataProvider"},{"name":"FileWalker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/win32/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nodejs/watcherService"},{"name":"fillResourceDataTransfers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"Filter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"FilteredMatchesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"FilterOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersFilterOptions"},{"name":"filtersAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"filterValidationDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"FilterViewPaneContainer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewsViewlet"},{"name":"finalHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"finally","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"FinalNewLineParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"find","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"FIND_IDS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"findBestWindowOrFolderForFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"FindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"findCredentials","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"findCredentials","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"FindDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findDecorations"},{"name":"findExecutable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalEnvironment"},{"name":"findExpressionInStackFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugHover"},{"name":"findFirstInSorted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"findFreePort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"findFreePortFaster","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"FindInFilesActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FindInFilesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FindInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInput"},{"name":"FindMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"findMatchingThemeRule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMHelper"},{"name":"FindModelBoundToEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"findNodeAtLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"findNodeAtOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"FindOptionOverride","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findState"},{"name":"FindOptionsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findOptionsWidget"},{"name":"FindOrReplaceInFilesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"findParentWithClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"findPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"findPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"FindReplaceState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findState"},{"name":"findRules","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"FindStartFocusAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"findValidPasteFileTarget","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"FindWidgetViewZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"findWindowOnExtensionDevelopmentPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"findWindowOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"findWindowOnWorkspaceOrFolderUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"finished","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"fips","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"FIRST_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"firstIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"FirstMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"firstNonWhitespaceIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"firstOrDefault","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"firstSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"FixAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"fixAllCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"fixCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"fixDriveC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"fixInsert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"fixNewline","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"fixPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"fixRegexNewline","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"flatten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Float32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Float64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FloatingClickWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorWidgets"},{"name":"focus","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"FOCUS_FIRST_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_LAST_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_NEXT_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_PREVIOUS_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_REPL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"FocusAboveGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusActiveEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FocusActiveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusBelowGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"focusBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"focusedCellIndicator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"FocusedViewContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"FocusEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FocusFilesExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FocusFirstGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusLastGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusLeftGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusNavigationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FocusNextGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusNextInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusNextSearchResultAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusPreviousGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusPreviousInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusPreviousSearchResultAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusQueryEditorWidgetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"FocusQueryEditorWidgetCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"FocusRightGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusSearchFromResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"focusSearchListCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusSearchListCommandID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FocusSessionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"FocusSessionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActionViewItems"},{"name":"foldBackgroundBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/folding"},{"name":"FOLDER_CONFIG_FOLDER_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"FolderConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"FolderFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FolderMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FolderMatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"FolderMatchWithResource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FolderSettingsActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"FolderSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"folderSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"foldersToIncludeGlobs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"foldersToRgExcludeGlobs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"FolderThemeIcon","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"FoldingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/folding"},{"name":"FoldingDecorationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingDecorations"},{"name":"FoldingModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"FoldingRange","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FoldingRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FoldingRange","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"FoldingRangeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FoldingRangeKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"FoldingRangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FoldingRangeKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"FoldingRangeProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"FoldingRegion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"FoldingRegions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"FollowerLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"FontInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/fontInfo"},{"name":"FontStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"fontStylePattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"for","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"forEach","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"foreground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ForeignElementType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"fork","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"fork","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"format","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"format","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"format","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"format","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"formatDocumentRangeWithProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentRangeWithSelectedProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentWithProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentWithSelectedProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"formatPII","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"FormatString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"FormattingConflicts","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"FormattingEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/formattingEdit"},{"name":"FormattingMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatWithOptions","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"FormData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FORMERR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"forwardedPortsViewEnabled","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"frameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"frames","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FrankensteinMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/abstractMode"},{"name":"freemem","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"fromBuffer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromFd","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromMap","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"fromNow","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/date"},{"name":"fromRandomAccessReader","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromRangeOrRangeWithMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"fstat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fstatSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"FSWatcher","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/chokidar/types/index"},{"name":"fsync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fsyncSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ftruncate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ftruncateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"function","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Function","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"futimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"futimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fuzzyContains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"fuzzyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"FuzzyScore","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"fuzzyScoreGraceful","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"fuzzyScoreGracefulAggressive","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"GainNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Gamepad","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadButton","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadHapticActuator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadPose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"generateIndent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentUtils"},{"name":"generateKeyPair","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"generateKeyPairSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"generateRandomChunkWithLF","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateRandomEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateRandomPipeName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"generateRandomReplaces","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateSequentialInserts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateTokensCSSForColorMap","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"generateUuid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uuid"},{"name":"Gesture","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/touch"},{"name":"get","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"get","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"getAbsoluteGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"getActiveEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"getActiveNotebookEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"getActiveTextEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"getActiveWebviewEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"getAllMethodNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"getAllPropertyNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"getAppDataPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/paths"},{"name":"getBaseLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"getBasenameTerms","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getBlinkMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getBreakpointMessageAndClassName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"getCharContainingOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getCharIndex","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"getCiphers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getCiphers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"getClientArea","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getCodeActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"getCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"getCodeForKeyCode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/keyboardEvent"},{"name":"getCodeLensData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelens"},{"name":"getColorPresentations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/color"},{"name":"getColorRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"getColors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/color"},{"name":"getComparisonKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"getComputedStyle","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getComputedStyle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getConfigurationKeys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getConfigurationValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getContentHeight","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getContentWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getContext","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerView"},{"name":"getContext","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"getContextForContributedActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"getContextMenuActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"getCorrelationContext","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"getCPUUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getCreationTime","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getCurrentActivationRecord","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"getCurrentKeyboardLayout","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"getCurves","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getCwd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDeclarationsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getDefaultIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getDefaultSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getDefaultShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDefaultShellArgs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDefaultUserDataPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/paths"},{"name":"getDefaultValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"getDefaultValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getDefinitionsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getDelayedChannel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"getDiffieHellman","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getDisallowedIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getDispatchConfig","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/dispatchConfig"},{"name":"getDocumentFormattingEditsUntilResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getDocumentRangeFormattingEditsUntilResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getDocumentSymbols","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/documentSymbols"},{"name":"getDomainsOfRemotes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getDomNodePagePosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getDuration","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEditOperation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCommand"},{"name":"getEditorPartOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"getegid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getElementsByTagName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getEmptyExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getEnabledCategories","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"trace_events"},{"name":"getEncodedLanguageId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"getEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEntry","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"getErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"geteuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getExactExpressionStartAndEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getExcludes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"getExpandedBodySize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"getExtensionHostDebugSession","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getExtensionKind","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"getExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"getExtraColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils"},{"name":"getFileNamesMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"getFirstFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"getGalleryExtensionId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getGalleryExtensionTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getgid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getGraphemeBreakType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getgroups","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getHashedRemotesFromConfig","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getHashes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getHeapCodeStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapSnapshot","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapSpaceStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapStatistics","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getHover","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/getHover"},{"name":"getIconClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputUtils"},{"name":"getIconClasses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"getIconRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"getIdAndVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"getIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"getImplementationsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getInstalledExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"getInvalidTypeError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesValidation"},{"name":"getIOCounters","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getIssueReporterStyles","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueService"},{"name":"getKeyboardLayoutId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"getKeyMap","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"getLangEnvVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getLanguages","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"getLargestChildWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getLastActiveWindow","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"getLeadingWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getLineEndOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"getLineStartOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"getLinks","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"getLocalExtensionTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getLogLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"getMac","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/macAddress"},{"name":"getMachineId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/id"},{"name":"getMachineInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"getMainProcessParentEnv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalEnvironment"},{"name":"getMaliciousExtensionsSet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getManifest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementUtil"},{"name":"getMapForWordSeparators","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"getMatchedCSSRules","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getMaxListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"getMaxListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getMediaMime","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"getMenuBarVisibility","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"getMigratedSettingValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getModelMarkers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getMultiSelectedEditorContexts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"getMultiSelectedResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getNextCodePoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getNextTickChannel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"getNLines","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getNLSConfiguration","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/languagePacks"},{"name":"getNodeColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"getNodeIsInOverviewRuler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"getNodePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNodeType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNodeValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNonWhitespacePrefix","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsService"},{"name":"getOccurrencesAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordHighlighter/wordHighlighter"},{"name":"getOnTypeFormattingEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getOnTypeRenameRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"getOpenEditorsViewMultiSelection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getOrDefault","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"getOrMakeSearchEditorInput","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput"},{"name":"getOrSet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"getOuterEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"getOutOfWorkspaceEditorResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"getOutputSimpleEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform"},{"name":"getPackedSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getParseErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonErrorMessages"},{"name":"getPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"getPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"getPathFromAmdModule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/amd"},{"name":"getPathLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"getPathTerms","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getPixelRatio","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getPlatformTextDecoder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"getPriority","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"getProcessCpuUsage","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProcessList","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProcessMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getProcessTree","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProxyAgent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/node/proxy"},{"name":"getQuickNavigateHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"getRandomElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"getRandomEOLSequence","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomInt","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomTestPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/testUtils"},{"name":"getRealAndSyntheticDocumentFormattersOrdered","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getReferencesAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getReindentEditOperations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"getRelativeLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"getRemoteAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"getRemoteName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"getRemotes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getResizesObserver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/sizeObserver"},{"name":"getResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"getResourceForCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"getSCMResourceContextKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/menus"},{"name":"getScopes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"getSearchView","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"getSelection","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getSelectionKeyboardEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"getSelectionSearchString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"getServers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"getServiceMachineId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/serviceMachineId/common/serviceMachineId"},{"name":"getSettingsTargetName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"getShadowRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getShellEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/shellEnv"},{"name":"getSimpleCodeEditorWidgetOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions"},{"name":"getSimpleEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions"},{"name":"getSimpleWorkspaceLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/label/common/label"},{"name":"getSingletonServiceDescriptors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/extensions"},{"name":"getSnippetSuggestSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"getSpaceCnt","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentUtils"},{"name":"getStackFrameThreadAndSessionToFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugService"},{"name":"getStateLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"getStdinFilePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"getStoredWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"getStringIdentifierForProxy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"GetStringRegKey","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/vscode-windows-registry/index"},{"name":"getSuggestionComparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"getSyncResourceFromLocalPreview","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getSystemMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getSystemShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"getSystemVersion","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getTemplates","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskTemplates"},{"name":"getTerminalShellConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalConfiguration"},{"name":"getThemeTypeSelector","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"getTimeSinceLastZoomLevelChanged","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getTitleBarStyle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"getTokenClassificationRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"getTopLeftOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalHeight","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalScrollWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTypeDefinitionsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getUnpackedSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"getUriFromAmdModule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/amd"},{"name":"getUriFromSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"getUserDataSyncStore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getVisbileViewContextKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"getVisibleAndSorted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getVisibleState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"getWebviewContentMimeType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/mimeTypes"},{"name":"getWellFormedFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"getWindowsBuildNumber","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"getWindowsShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"getWindowsStateStoreData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsStateStorage"},{"name":"getWordAtText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"getWordDefinitionFor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"getWorkerBootstrapUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/worker/defaultWorkerFactory"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspaces"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test"},{"name":"getWorkspaceSymbols","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"getXtermLineContent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"getZoomFactor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"global","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GLOBAL_ACTIVITY_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/activity"},{"name":"GlobalActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"globalAgent","kind":"let","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"globalAgent","kind":"let","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"GlobalCompareResourcesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"GlobalEditorMouseMoveMonitor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"GlobalExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService"},{"name":"globalGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"GlobalMouseMoveMonitor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/globalMouseMoveMonitor"},{"name":"GlobalNewUntitledFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"GlobalRemoveRootFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"globals","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"globalShortcut","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"GlobalStateSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/globalStateSync"},{"name":"GlobalStorageDatabaseChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageIpc"},{"name":"GlobalStorageDatabaseChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageIpc"},{"name":"GlobalStyleSheet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"globalThis","kind":"module","kindModifiers":"","sortText":"4"},{"name":"GlobPattern","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"GlyphHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverWidgets"},{"name":"GlyphMarginOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"GOTO_NEXT_CHANGE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"GOTO_PREVIOUS_CHANGE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"GotoDefinitionAtPositionEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess"},{"name":"GoToLineNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"GotoLineQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess"},{"name":"GotoSymbolAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess"},{"name":"GotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess"},{"name":"gracefulify","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/graceful-fs/index"},{"name":"grammarsExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMGrammars"},{"name":"Graph","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/graph"},{"name":"GraphemeBreakType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Grid","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"GridView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"GridViewSizing","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"group","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"groupBy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"groupBy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"groupByExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"GroupChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"groupCollapsed","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"GroupDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"groupEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"groupIntersect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"GroupLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupOrientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupsArrangement","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"gt","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"gte","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"gtr","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"guessIndentation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/indentationGuesser"},{"name":"guessMimeTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"gunzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gunzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"handleANSIOutput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"handleANSIOutput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"Handler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"handleVetos","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"hang","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"hasChildProcesses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"hasClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"hasFileFolderCopyCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hasFileReadStreamCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"Hash","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"HashChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Hasher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"hashPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/node/backupFileService"},{"name":"hasOpenReadWriteCloseCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hasParentWithClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"hasReadWriteCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"HasSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"hasSiblingFn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"hasSiblingPromiseFn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"hasStdinWithoutTty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"hasTextDecoder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"hasToIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"hasTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"hasUncaughtExceptionCaptureCallback","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"hasWorkspaceFileExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"hc_black","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"HC_THEME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"Headers","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HelpQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/helpQuickAccess"},{"name":"HiddenAreasRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"HiddenRangeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/hiddenRangeModel"},{"name":"hide","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"HIDE_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"HIDE_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"HideNotificationsCenterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"HideWebViewEditorFindCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"HideWelcomeOverlayAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay"},{"name":"HIGH_CONTRAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"HighlightedLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/highlightedlabel/highlightedLabel"},{"name":"HighlightMatchesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"history","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"History","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HistoryInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"HistoryNavigationEnablementContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"HistoryNavigationWidgetContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"HistoryNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/history"},{"name":"HistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/browser/history"},{"name":"HitTestContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"HIVES","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCC","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCR","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCU","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKLM","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKU","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"Hmac","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"homedir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"HorizontalPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"HorizontalRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"HorizontalScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/horizontalScrollbar"},{"name":"horizontalScrollingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"HostExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"hostname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"HotExitConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"Hover","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Hover","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Hover","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"HoverOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverOperation"},{"name":"HoverProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"HoverStartMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverOperation"},{"name":"hrtime","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"HSLA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"HSVA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"HTMLAllCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAnchorElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAppletElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAreaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAudioElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBaseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBaseFontElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBodyElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLButtonElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLCanvasElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDataElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDataListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDetailsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDialogElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDirectoryElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDivElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDocument","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLEmbedElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFieldSetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFontElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFormControlsCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFormElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFrameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFrameSetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHeadElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHeadingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHtmlElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLIFrameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLInputElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLabelElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLegendElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLIElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLinkElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMapElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMarqueeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMediaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMenuElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMetaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMeterElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLModElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLObjectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptGroupElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptionsCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOutputElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLParagraphElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLParamElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLPictureElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLPreElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLProgressElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLQuoteElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLScriptElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSelectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSlotElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSourceElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSpanElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLStyleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableCaptionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableColElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableDataCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableHeaderCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableRowElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableSectionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTemplateElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTextAreaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTimeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTitleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTrackElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLUListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLUnknownElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLVideoElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Http2ServerRequest","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"Http2ServerResponse","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"HttpProxyAgent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/http-proxy-agent/index"},{"name":"IAccessibilityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"IActivityBarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activityBar/browser/activityBarService"},{"name":"IActivityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"IAuthenticationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/browser/authenticationService"},{"name":"IUserDataSyncAccountService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount"},{"name":"IBackupFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backup"},{"name":"IBackupMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backup"},{"name":"IBreadcrumbsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"IBulkEditService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/bulkEditService"},{"name":"ICACLS_PATH","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"IClipboardService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/clipboard/common/clipboardService"},{"name":"ICodeEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorService"},{"name":"ICodeLensCache","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codeLensCache"},{"name":"ICommandService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"ICommentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentService"},{"name":"IconBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"IConfigurationResolverService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolver"},{"name":"IConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"iconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"IconLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/iconLabel/iconLabel"},{"name":"iconsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"IContextKeyService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"IContextMenuService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextView"},{"name":"IContextViewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextView"},{"name":"ICredentialsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/credentials/common/credentials"},{"name":"ICredentialsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/common/credentials"},{"name":"ICustomEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/common/driver"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"ID_EDITOR_WORKER_SERVICE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerService"},{"name":"ID_INDENT_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"ID_INIT_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/intializingRangeProvider"},{"name":"ID_SYNTAX_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"IDBCursor","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBCursorWithValue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBDatabase","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBFactory","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBIndex","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBKeyRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBObjectStore","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBOpenDBRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBTransaction","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBVersionChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDebugHelperService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"IDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"IDecorationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/decorations/browser/decorations"},{"name":"IdentityCoordinatesConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"IdentityLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"IdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"IdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"IdGenerator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/idGenerator"},{"name":"IDiagnosticsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"IDialogMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-main/dialogs"},{"name":"IDialogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"IdleValue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IdObject","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"IDownloadService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/download"},{"name":"idPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"IDriver","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/common/driver"},{"name":"IEditorGroupsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"IEditorProgressService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"IEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"IEditorWorkerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerService"},{"name":"IElectronMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/electron-main/electronMainService"},{"name":"IElectronService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/node/electron"},{"name":"IEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/common/environment"},{"name":"IEnvironmentVariableService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariable"},{"name":"IExperimentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"IExplorerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"IExtensionGalleryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionHostDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebug"},{"name":"IExtensionHostProfileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"IExtensionManagementServerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IExtensionManagementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionRecommendationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IExtensionResourceLoaderService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader"},{"name":"IExtensionService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"IExtensionStoragePaths","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStoragePaths"},{"name":"IExtensionsWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"IExtensionTipsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionUrlHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionUrlHandler"},{"name":"IExternalTerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/common/externalTerminal"},{"name":"IExtHostApiDeprecationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"IExtHostCommands","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"IExtHostConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"IExtHostDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"IExtHostDecorations","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDecorations"},{"name":"IExtHostDocumentsAndEditors","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentsAndEditors"},{"name":"IExtHostExtensionService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"IExtHostInitDataService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostInitDataService"},{"name":"IExtHostOutputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"IExtHostRpcService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRpcService"},{"name":"IExtHostSearch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"IExtHostStorage","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStorage"},{"name":"IExtHostTask","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"IExtHostTerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"IExtHostTimeline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTimeline"},{"name":"IExtHostTunnelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"IExtHostWorkspace","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWorkspace"},{"name":"if","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"ifError","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"IFileDialogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"IFilesConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"IFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"IframeUtils","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/iframe"},{"name":"IFrameWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewElement"},{"name":"IGlobalExtensionEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ignoreBracketsInToken","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"ignoreErrors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IgnoreExtensionRecommendationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"IHistoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/common/history"},{"name":"IHostService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/browser/host"},{"name":"IHostUtils","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"IInstantiationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"IIntegrityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/common/integrity"},{"name":"IIRFilterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/node/issue"},{"name":"IJSONEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"IKeybindingEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingEditing"},{"name":"IKeybindingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybinding"},{"name":"IKeymapService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"ILabelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/label/common/label"},{"name":"ILaunchMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"ILayoutService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/layout/browser/layoutService"},{"name":"ILifecycleMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"ILifecycleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"IListService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"illegalArgument","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"illegalState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ILocalizationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"ILoggerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ILogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"Image","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IMAGE_PREVIEW_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ImageBitmap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ImageBitmapRenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ImageData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IMainProcessService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/mainProcessService"},{"name":"IMarkerData","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"IMarkerDecorationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/markersDecorationService"},{"name":"IMarkerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"IMarkersWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"IMenubarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"IMenuService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ImmortalReference","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"IMMUTABLE_CODE_TO_KEY_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"IMMUTABLE_KEY_CODE_TO_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"IModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelService"},{"name":"IModeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modeService"},{"name":"impactsEditorPartOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"ImplementationProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"implements","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"import","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"importEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"importScripts","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"in","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"inAppPurchase","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"inc","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"IncomingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"IncomingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"IncreaseSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"IncreaseViewSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"incrementFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"IndentAction","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"IndentAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfiguration"},{"name":"IndentAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"IndentationToSpacesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToSpacesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToTabsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToTabsCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/indentRules"},{"name":"IndentGuidesOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/indentGuides/indentGuides"},{"name":"IndentLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"IndentRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"IndentRulesSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/indentRules"},{"name":"IndentUsingSpaces","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentUsingTabs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"index","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"indexedDB","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"INDEXEDDB_LOGS_OBJECT_STORE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"INDEXEDDB_VSCODE_DB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"IndexedDBLogProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"indexOfPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"IndexTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTree"},{"name":"IndexTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"InEditorZenModeContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"Infinity","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"inflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateRawSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"info","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Information","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"inherits","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"INITIAL","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"initialize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.worker"},{"name":"InitializingRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/intializingRangeProvider"},{"name":"InlineDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"InlineDecorationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"InlineDiffMargin","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/inlineDiffMargin"},{"name":"InMemoryBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"InMemoryFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/inMemoryFilesystemProvider"},{"name":"InMemoryLogProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/common/inMemoryLogProvider"},{"name":"InMemoryStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"InMemoryStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"InMemoryTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"innerHeight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"innerWidth","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"INotebookService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"INotificationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"InPlaceReplaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/inPlaceReplace/inPlaceReplaceCommand"},{"name":"inputActiveOptionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputActiveOptionBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"InputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"InputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"InputDeviceInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"InputEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"InputFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"InputFocusedContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"inputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputPlaceholderForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputsSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolverSchema"},{"name":"inputValidationErrorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationErrorBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"InputValidationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"inputValidationWarningBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationWarningBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inQuickPickContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"InQuickPickContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"inQuickPickContextKeyValue","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"inRecentFilesPickerContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"insane","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/insane/insane"},{"name":"InSearchEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"insert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"InsertCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"InsertCodeCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"InsertCursorAbove","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"InsertCursorBelow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"InsertLineAfterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"InsertLineBeforeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"InsertMarkdownCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"inspect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"INSPECT_MAX_BYTES","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"InspectTokensNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"INSTALL_ERROR_INCOMPATIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"INSTALL_ERROR_MALICIOUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"INSTALL_ERROR_NOT_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"InstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallAnotherVersionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallCountWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"InstallExtensionQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess"},{"name":"InstallExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallInOtherServerAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallLocalExtensionsInRemoteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallOperation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"InstallRecommendedExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallSpecificVersionOfExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallVSIXAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallWorkspaceRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"instanceof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"instanceStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"InstantiationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiationService"},{"name":"Int16Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Int32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Int8Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IntegrityServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/node/integrityService"},{"name":"interface","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Interface","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"INTERNAL_CONSOLE_OPTIONS_SCHEMA","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"InternalEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorAction"},{"name":"InternalModelContentChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"IntersectionObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IntersectionObserverEntry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"intersects","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"intervalCompare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"IntervalNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"IntervalTimer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IntervalTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"Intl","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"IOpenerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"IOutputChannelModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"IOutputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"IPadShowKeyboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard"},{"name":"IPanelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/panel/common/panelService"},{"name":"IPathService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/common/pathService"},{"name":"IPCClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ipcMain","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ipcRenderer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"IPCServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"IPeekViewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"IPreferencesSearchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"IPreferencesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"IProductService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/product/common/productService"},{"name":"IProgressService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"IQuickInputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickInput"},{"name":"IRemoteAgentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentService"},{"name":"IRemoteAuthorityResolverService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"IRemoteExplorerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"IReplaceService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/replace"},{"name":"IRequestService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"IResourceIdentityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/common/resourceIdentityService"},{"name":"IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"isAbsolute","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"isAbsolute","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"isAbsolutePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isActive","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-mutex/index"},{"name":"isAncestor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isArray","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isatty","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"isBasicASCII","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isBoolean","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isBoolean","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isBuffer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IsCenteredLayoutContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isChrome","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"ISCMService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"isCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isCompositeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isCompressedFolderName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"isConfigurationOverrides","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"isContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"isDate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isDebuggerMainContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isDecorationOptionsArr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"isDeepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IsDevelopmentContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isDiffEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isDiffEditorConfigurationKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"isDirtyDiffVisible","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"isDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"ISearchHistoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchHistoryService"},{"name":"ISearchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"ISearchWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"isEdge","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isEdgeWebView","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isEditorConfigurationKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"isEditorInputWithOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isElevated","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-is-elevated/index"},{"name":"isEmojiImprecise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isEmptyMarkdownString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"isEmptyObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isEngineValid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"isEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isEqualAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isEqualOrParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isEqualOrParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isError","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isErrorWithActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorsWithActions"},{"name":"isExcludeSetting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"isFalsyOrEmpty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"isFalsyOrWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isFileMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isFilePatternMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isFileToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"isFilterResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"isFinite","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"isFirefox","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isFolderToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"isFullscreen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"IsFullscreenContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"isFullWidthCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isFunction","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isFunction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isFuzzyAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isFuzzyActionArr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isGridBranchNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"isGridBranchNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"ISharedProcessMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-main/sharedProcessMainService"},{"name":"ISharedProcessService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/sharedProcessService"},{"name":"isHighSurrogate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isHTMLElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isIAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isIExtensionIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"isIExtensionIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ISignService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/common/sign"},{"name":"isIMenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"isInDOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isInShadowDOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isIOS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isIP","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isIPad","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isIPv4","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isIPv6","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isISOKeyboard","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"isISubmenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"isKeymapExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"isLanguagePackExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"isLinux","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsLinuxContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isLittleEndian","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isLocationLink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"isLowerAsciiLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isLowSurrogate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"IsMacContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isMacintosh","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsMacNativeContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isMainFrame","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"isMainThread","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"isMarkdownString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"isMaster","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"isMenubarMenuItemAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemSubmenu","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemUriAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMessageOfType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"isMultilineRegexSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"isNamedProblemMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"isNaN","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"isNative","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"ISnippetsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippets.contribution"},{"name":"isNonEmptyArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"isNotificationViewItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"isNull","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNullOrUndefined","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNullRange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"isNumber","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNumber","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isObject","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isOpera","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"isPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isPatternInWord","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"isPrimitive","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isProgressMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isPromiseCanceledError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"isQuote","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"isRawFileWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRawUriWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isReadableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"isRecentFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRecentFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRecentWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRegExp","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isRelativePattern","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"isRemoteConsoleLog","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"isRemoteDiagnosticError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/common/diagnostics"},{"name":"isRootOrDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isRootUser","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isSafari","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isSCMRepository","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSCMResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSCMResourceGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSearchViewFocused","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"isSecureContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"isSelectionRangeChangeEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"isSelectionSingleChangeEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"isSemanticColoringEnabled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"isSerializedEditorGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/editorGroup"},{"name":"isSerializedFileMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSerializedSearchComplete","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSerializedSearchSuccess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSessionAttach","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isShadowRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isSingleFolderWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isSingleFolderWorkspaceInitializationPayload","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isStandalone","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isStatusbarInDebugMode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"isStoredWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isString","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isStringArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isSuccess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"IssueMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/electron-main/issueMainService"},{"name":"IssueReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterMain"},{"name":"IssueReporterModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterModel"},{"name":"issueReporterPage","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterPage"},{"name":"IssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/issue/electron-browser/issueService"},{"name":"IssueType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/node/issue"},{"name":"isSymbol","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IStandaloneThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/standaloneThemeService"},{"name":"IStateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/state"},{"name":"IStaticExtensionsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/staticExtensions"},{"name":"IStatusbarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/statusbar/common/statusbar"},{"name":"isTextEditorPane","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isThemeColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"isThenable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IStorageKeysSyncRegistryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/storageKeys"},{"name":"IStorageMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageMainService"},{"name":"IStorageService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"ISuggestDataDtoField","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"ISuggestMemoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"ISuggestResultDtoField","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"isUNC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isUndefined","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isUndefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isUndefinedOrNull","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isUnspecific","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"isUntitledWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isUpper","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"isUpperAsciiLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isURLDomainTrusted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsValidator"},{"name":"isUTFEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"isUUID","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uuid"},{"name":"isValidBasename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isValidExtensionVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isValidLocalization","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"isValidMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"isValidVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isValidVersionStr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isVersionValid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isWeb","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsWebContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isWebKit","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isWebkitWebView","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isWindows","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsWindowsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isWindowsDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isWorker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"isWorkspaceBackupInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backup"},{"name":"isWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"isWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isWorkspaceToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"ISymbolNavigationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/symbolNavigation"},{"name":"it","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ITaskService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskService"},{"name":"ITelemetryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"ItemActivation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"Iterable","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/iterator"},{"name":"ITerminalInstanceService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"ITerminalNativeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ITerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"ITextFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"ITextMateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"ITextModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/resolverService"},{"name":"ITextResourceConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationService"},{"name":"ITextResourcePropertiesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationService"},{"name":"IThemeMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/electron-main/themeMainService"},{"name":"IThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ITimelineService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"ITimerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/timer/electron-browser/timerService"},{"name":"ITitleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/title/common/titleService"},{"name":"ITunnelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/tunnel"},{"name":"IUndoRedoService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedo"},{"name":"IUntitledTextEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorService"},{"name":"IUpdateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"IURITransformerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUriTransformerService"},{"name":"IURLService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/url"},{"name":"IUserDataAutoSyncService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncBackupStoreService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncLogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncStoreService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncUtilService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IViewDescriptorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"IViewletService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/viewlet/browser/viewlet"},{"name":"IViewsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"IWebIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/browser/issueService"},{"name":"IWebviewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"IWebviewWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"IWindowsMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windows"},{"name":"IWorkbenchEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/common/environmentService"},{"name":"IWorkbenchExtensionEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IWorkbenchIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issue"},{"name":"IWorkbenchLayoutService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"IWorkbenchThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"IWorkingCopyFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileService"},{"name":"IWorkingCopyService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"IWorkspace","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspaceContextService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspaceEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/common/workspaceEditing"},{"name":"IWorkspaceFolder","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspacesHistoryMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService"},{"name":"IWorkspacesMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"IWorkspacesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"IWorkspaceTagsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/common/workspaceTags"},{"name":"javascriptOnEnterRules","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules"},{"name":"join","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"join","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"join","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"JoinAllGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"JoinLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"joinPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"JoinTwoGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"JSON","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"JSONEditingError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"JSONEditingErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"JSONEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditingService"},{"name":"JsonSchemaVersion","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"JsonSchemaVersion","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"JSONValidationExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/jsonValidationExtensionPoint"},{"name":"JUMP_TO_CURSOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"KEEP_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_NOT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_IS_OPEN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_TEXT_NOT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"KEYBINDING_ENTRY_TEMPLATE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/keybindingsEditorModel"},{"name":"KeybindingEditorDecorationsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"KeybindingIO","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingIO"},{"name":"KeybindingLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/keybindingLabel/keybindingLabel"},{"name":"KeybindingParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingParser"},{"name":"KeybindingResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingResolver"},{"name":"KEYBINDINGS_EDITOR_CLEAR_INPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_COPY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_DEFINE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_REMOVE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_RESET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KeybindingsEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingEditing"},{"name":"KeybindingsEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditor"},{"name":"KeybindingsEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"KeybindingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/keybindingsEditorModel"},{"name":"KeybindingSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybinding"},{"name":"KeybindingsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"KeybindingsSearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"KeybindingsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/keybindingsSync"},{"name":"KeybindingWeight","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"KeybindingWidgetRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"KEYBOARD_LAYOUT_OPEN_PICKER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KeyboardEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"KeyboardLayoutContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution"},{"name":"KeyboardLayoutPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker"},{"name":"KeyboardLayoutPickerContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker"},{"name":"KeyboardMapperFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService"},{"name":"keyboardNavigationSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"KeyboardSupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/canIUse"},{"name":"KeyChord","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"KeyCode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"KeyCodeUtils","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyedTaskIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"KeyframeEffect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"keyFromOverrideIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"KeymapExtensions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"KeymapInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"KeymapRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/keymapRecommendations"},{"name":"KeyMod","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyMod","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneBase"},{"name":"KeyMod","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"KeyObject","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"keyof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"keys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"KeytarCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/credentials/node/credentialsService"},{"name":"KeytarCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/node/credentialsService"},{"name":"KeyValueLogProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/common/keyValueLogProvider"},{"name":"kill","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"KillTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"kMaxLength","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"knownAcronyms","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"KnownSnippetVariableNames","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"knownTermMappings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"kStringMaxLength","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"Label","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"LabelContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/remote.contribution"},{"name":"LabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/label/common/labelService"},{"name":"language","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Language","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"LanguageConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageConfigurationFileHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint"},{"name":"LanguageConfigurationRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageConfigurationRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageFeatureRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageFeatureRegistry"},{"name":"LanguageId","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LanguageIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LanguagePackCachedDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner"},{"name":"languages","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"languages","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"LanguageSelector","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"languagesExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/mode/common/workbenchModeService"},{"name":"LanguagesRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/languagesRegistry"},{"name":"LanguageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"LargeFileOptimizationsWarner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/largeFileOptimizations"},{"name":"LAST_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"lastIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"lastNonWhitespaceIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"lastSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"LAUNCH_CONFIGURATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"LaunchMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"launchSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"launchSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"layout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"Layout","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/layout"},{"name":"LAYOUT_EDITOR_GROUPS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"LayoutAnchorPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"LayoutController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"LayoutData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget"},{"name":"LayoutPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"LazilyResolvedWebviewEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"Lazy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lazy"},{"name":"lazyEnv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"LazyOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"LazyPromise","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/lazyPromise"},{"name":"lchmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"LcsDiff","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"lcut","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"leftest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"leftRotate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"LEGACY_CONSOLE_MODE_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"legacy_ENV_iKey","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"length","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"let","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"lexer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Lexer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"LifecycleMainPhase","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"LifecycleMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"LifecyclePhase","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"LifecyclePhaseToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"LIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"LightBulbWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/lightBulbWidget"},{"name":"lighten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Limiter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"LineBreakData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"LineCommentCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/lineCommentCommand"},{"name":"LineContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/completionModel"},{"name":"LineContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"LineDecoder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/decoder"},{"name":"LineDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"LineDecorationsNormalizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"LineNumbersOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers"},{"name":"LinePartMetadata","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"LineProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"LineRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"LinesDecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations"},{"name":"LinesLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/linesLayout"},{"name":"LineStarts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"LineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/lineTokens"},{"name":"LineTokens2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"LineVisibleRanges","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"link","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Link","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"Link","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/browser/link"},{"name":"LINK_INTERCEPT_THRESHOLD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"LinkComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"LinkDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/links"},{"name":"LinkDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/linkDetector"},{"name":"LinkedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedList"},{"name":"LinkedMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"LinkedText","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedText"},{"name":"LinkProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LinksList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"linkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"linuxDistro","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"LinuxDistro","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"LinuxExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"LinuxUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.linux"},{"name":"List","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"listActiveSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listActiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listDeemphasizedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ListDragOverEffect","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"ListDragOverReactions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"listDropBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listenerCount","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"listenerCount","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"listenerCount","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"listeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"listeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ListeningStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ListError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"listErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetNoMatchesOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFocusBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFocusForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHoverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveFocusBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInvalidItemForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listProcesses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ps"},{"name":"ListResourceNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"ListService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"ListSettingListModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ListSettingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ListView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"listWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"loadavg","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"LOADED_SCRIPTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"LoadedScriptsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/loadedScriptsView"},{"name":"LoaderEvent","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"LoaderEventType","kind":"enum","kindModifiers":"declare","sortText":"4"},{"name":"LOADIPHLPAPI","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"loadLocalResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"loadWASM","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"LOCAL_MACHINE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"locale","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"LocalInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"LocalizationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/node/localizations"},{"name":"LocalizationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/localizations/electron-browser/localizationsService"},{"name":"LocalizationWorkbenchContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/localizations.contribution"},{"name":"localize","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/nls"},{"name":"localize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/nls.mock"},{"name":"localizeManifest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionNls"},{"name":"LocalSearchProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"LocalSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchService"},{"name":"LocalSelectionTransfer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"localStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"location","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"location","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Location","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Location","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Location","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"locationbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"log","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"log","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"log","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"log","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"log","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"LOG_MIME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LOG_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LOG_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LogAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"LogContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputServices"},{"name":"Logger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionPoints"},{"name":"LoggerChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"LoggerChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"LoggerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/loggerService"},{"name":"LogLevel","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"LogLevel","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"LogLevel","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"LogLevel","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"LogLevel","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"logOnceWebWorkerWarning","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"logRemoteEntry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/remoteConsoleUtil"},{"name":"LogsDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsDataCleaner"},{"name":"LogsDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner"},{"name":"LogServiceAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"logStorage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"LogViewer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/logViewer"},{"name":"LogViewerInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/logViewer"},{"name":"LONG_LINE_BOUNDARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"LongRunningOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"lookup","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"lookupService","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"LowerCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"LRUCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"LRUMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"lstat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lstat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"lstatSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lt","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"lte","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ltr","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ltrim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"lutimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lutimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"MacExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"machineIdKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"machineOverridableSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"machineSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"machineSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"MacLinuxFallbackKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper"},{"name":"MacLinuxKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"macLinuxKeyboardMappingEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/web.main"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cli"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/desktop.main"},{"name":"Main","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"MainContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"mainLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"mainModule","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"MainPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/mainPane"},{"name":"MainPaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/mainPane"},{"name":"MainProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/mainProcessService"},{"name":"MAINTAIN_UNDO_REDO_STACK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"MainThreadAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadAuthentication"},{"name":"MainThreadAuthenticationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadAuthentication"},{"name":"MainThreadClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadClipboard"},{"name":"MainThreadCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadCommands"},{"name":"MainThreadCommentController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadComments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadCommentThread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadConfiguration"},{"name":"MainThreadConsole","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadConsole"},{"name":"MainThreadDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDebugService"},{"name":"MainThreadDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDecorations"},{"name":"MainThreadDiagnostics","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDiagnostics"},{"name":"MainThreadDialogs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDialogs"},{"name":"MainThreadDocumentContentProviders","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocumentContentProviders"},{"name":"MainThreadDocumentRangeSemanticTokensProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadDocuments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocuments"},{"name":"MainThreadDocumentsAndEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors"},{"name":"MainThreadDocumentSemanticTokensProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadDownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDownloadService"},{"name":"MainThreadEditorInsets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadCodeInsets"},{"name":"MainThreadErrors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadErrors"},{"name":"MainThreadExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadExtensionService"},{"name":"MainThreadFileSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadFileSystem"},{"name":"MainThreadFileSystemEventService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService"},{"name":"MainThreadKeytar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadKeytar"},{"name":"MainThreadLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLabelService"},{"name":"MainThreadLanguageFeatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadLanguages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguages"},{"name":"MainThreadLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLogService"},{"name":"MainThreadMessageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadMessageService"},{"name":"MainThreadNotebookController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadNotebookDocument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadNotebooks","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadOutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadOutputService"},{"name":"MainThreadProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadProgress"},{"name":"MainThreadQuickOpen","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen"},{"name":"MainThreadSCM","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSCM"},{"name":"MainThreadSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSearch"},{"name":"MainThreadStatusBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadStatusBar"},{"name":"MainThreadStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadStorage"},{"name":"MainThreadTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTask"},{"name":"MainThreadTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTelemetry"},{"name":"MainThreadTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTerminalService"},{"name":"MainThreadTextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditor"},{"name":"MainThreadTextEditorProperties","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditor"},{"name":"MainThreadTextEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditors"},{"name":"MainThreadTheming","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTheming"},{"name":"MainThreadTimeline","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTimeline"},{"name":"MainThreadTreeViews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTreeViews"},{"name":"MainThreadTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTunnelService"},{"name":"MainThreadUrls","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadUrls"},{"name":"MainThreadWebviews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWebview"},{"name":"MainThreadWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWindow"},{"name":"MainThreadWorkspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWorkspace"},{"name":"major","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"MakeAddress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"MaliciousExtensionChecker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"MaliciousStatusLabelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ManageAuthorizedExtensionURIsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionUrlHandler"},{"name":"ManageAutomaticTaskRunning","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks"},{"name":"ManageExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ManageExtensionsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess"},{"name":"ManagementPersistentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"manageTrustedDomainSettingsCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"MANIFEST_CACHE_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"Map","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"mapArrayOrNot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"mapPager","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"mapToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"Margin","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/margin/margin"},{"name":"MarginViewLineDecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations"},{"name":"MarginViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"mark","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"markAsFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"MarkdownCellRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"MarkdownCellViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel"},{"name":"markdownEscapeEscapedCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"MarkdownRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/markdown/markdownRenderer"},{"name":"MarkdownRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/mdRenderer"},{"name":"MarkdownString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"MarkdownString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"MarkdownString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"MarkdownString","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"markdownUnescapeCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"marked","kind":"alias","kindModifiers":"declare","sortText":"4"},{"name":"markedStringsEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"Marker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"Marker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"MarkerController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoError"},{"name":"MarkerDecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/markerDecorationsServiceImpl"},{"name":"MarkerNavigationWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"MarkerRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markerService"},{"name":"MarkerSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"MarkerSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MarkerSeverity","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"MarkersFilterActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"MarkersFilters","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"MarkersModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"MarkersTreeAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkersView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersView"},{"name":"MarkersViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkersWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"MarkerTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"MarkerTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MarkerTag","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"MarkerViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"markTimeline","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"mas","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"match","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"match","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"Match","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"MATCHES_LIMIT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"matchesCamelCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesContiguousSubString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzy2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzyCodiconAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"matchesPrefix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesScheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"matchesStrictPrefix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesSubString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesWords","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"MatchFindAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"MatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"matchMedia","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"Math","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MAX_BYTES_ON_DISK","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"MAX_CONNECTION_FAILURES_BEFORE_WARN","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"MAX_FILE_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MAX_FOLDING_REGIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"MAX_HEAP_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MAX_LINE_NUMBER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"MAX_OUTPUT_LENGTH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"MAX_VALUE_RENDER_LENGTH_IN_VIEWLET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"maxHeaderSize","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"MaximizeGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"maxSatisfying","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"mayIncludeActionsOfKind","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"measure","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Measurement","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"MediaDeviceInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaDevices","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaElementAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaEncryptedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeyMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeys","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeySession","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeyStatusMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeySystemAccess","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaQueryList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaQueryListEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamAudioDestinationNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrackAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Memento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/memento"},{"name":"memoize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"memory","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Memory","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"memoryUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Menu","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Menu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"MENU_ESCAPED_MNEMONIC_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"MENU_MNEMONIC_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"menuBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menubar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Menubar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/electron-main/menubar"},{"name":"MenuBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menubar"},{"name":"MENUBAR_SELECTION_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MENUBAR_SELECTION_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MENUBAR_SELECTION_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MenubarControl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/menubarControl"},{"name":"MenubarMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/electron-main/menubarMainService"},{"name":"MenubarService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/menubar/electron-browser/menubarService"},{"name":"menuBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuEntryActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"menuForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuId","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"MenuItem","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"MenuItemAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"MenuItemExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"MenuPreventer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/menuPreventer"},{"name":"MenuRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"menuSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSelectionBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSeparatorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/menuService"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/extensionsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/keybindingsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/globalStateMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/snippetsMerge"},{"name":"mergeAllGroups","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"mergeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"mergeCommonContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCommonHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCurrentContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCurrentHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MergedEnvironmentVariableCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableCollection"},{"name":"mergeEnvironments","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"MergeGroupMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"mergeIncomingContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeIncomingHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergePagers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"mergeSort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"MergeWindowTabsHandlerHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"MessageChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessageChannel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"MessageController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/message/messageController"},{"name":"MessageData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MessageData"},{"name":"MessageData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"MessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessagePort","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessagePort","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"Messages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/messages"},{"name":"MessageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"MessageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"METHODS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"MetricData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MetricData"},{"name":"MetricData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"MIME_BINARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MIME_TEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MIME_UNKNOWN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MimeType","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MimeTypeArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MimeTypeRendererResolver","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"mimeTypeSupportedByCore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"MIN_MAX_MEMORY_SIZE_MB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/files"},{"name":"Minimap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimap"},{"name":"MINIMAP_GUTTER_WIDTH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"minimapBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MinimapCharRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharRenderer"},{"name":"MinimapCharRendererFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharRendererFactory"},{"name":"minimapError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapGutterAddedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"minimapGutterDeletedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"minimapGutterModifiedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MinimapLinesRenderingData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"MinimapPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"MinimapPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"minimapSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderActiveBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MinimapTokensColorTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/minimapTokensColorTracker"},{"name":"minimapWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimist","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/minimist/index"},{"name":"MinimizeOtherGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MINIMUM_LETTER_SPACING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"minimumTranslatedStrings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/minimalTranslations"},{"name":"minor","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"minSatisfying","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"minVersion","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"MirrorTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/mirrorTextModel"},{"name":"MissingDependencyError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"mixin","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"mkdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdirp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"mkdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdtemp","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdtempSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mnemonicButtonLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"mnemonicMenuLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"mocha","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Mocha","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"mock","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"MockContextKeyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/test/common/mockKeybindingService"},{"name":"MockDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/test/common/mockKeybindingService"},{"name":"MockMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/mockMode"},{"name":"MockObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/mockSearchTree"},{"name":"MockRawSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockTextAreaWrapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/controller/textAreaState.test"},{"name":"ModelBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"ModelConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"ModelDecorationMinimapOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelDecorationOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelDecorationOverviewRulerOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelRawContentChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawEOLChanged","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawFlush","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLineChanged","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLinesDeleted","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLinesInserted","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"ModelTransientSettingWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/abstractCodeEditorService"},{"name":"ModesContentHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/modesContentHover"},{"name":"ModeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modeServiceImpl"},{"name":"ModesGlyphHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/modesGlyphHover"},{"name":"ModesHoverController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hover"},{"name":"ModesRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"MODIFIED_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"modifiedItemIndicator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ModifierLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"modify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"modifySearchEditorContextLinesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"module","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Module","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"monaco","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"MonacoEnvironment","kind":"let","kindModifiers":"declare","sortText":"4"},{"name":"MonarchBracket","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"MonarchTokenizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchLexer"},{"name":"monitorEventLoopDelay","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"MonospaceLineBreaksComputerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/monospaceLineBreaksComputer"},{"name":"MouseController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"MouseEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MouseHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseHandler"},{"name":"MouseTarget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"MouseTargetFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"MouseTargetType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"MouseTargetType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MouseWheelClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"move","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"move","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MOVE_ACTIVE_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"MOVE_FILE_TO_TRASH_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"moveBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MoveCaretCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/caretOperations/moveCaretCommand"},{"name":"MoveCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"moveCursor","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"MoveEditorLeftInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorRightInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToAboveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToBelowGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToFirstGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToLastGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToLeftGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToNextGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToPreviousGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToRightGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"moveFileToTrashHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"MoveFocusedViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"MoveGroupDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupUpAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/moveLinesCommand"},{"name":"MoveOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveOperations"},{"name":"MoveSelectionToNextFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MoveSelectionToPreviousFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"moveTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MoveToNextChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MoveToPreviousChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MoveWindowTabToNewWindowHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"MoveWordCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"MSAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSBlobBuilder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"msContentScript","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOCredentialAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOSignature","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOSignatureAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGesture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGestureEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGraphicsTrust","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSInputMethodContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyNeededEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeys","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeySession","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSPointerEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"msWriteProfilerMark","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MultiCursorSelectionController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSelectionControllerAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSessionResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultilineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultilineTokens2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultilineTokensBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultiModelEditStackElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"MultipleEditorGroupsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"MultiplexLayoutController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"MultiplexLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"multiSelectModifierSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"MutableDisposable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"MutationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MutationObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MutationRecord","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Mutex","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-mutex/index"},{"name":"MyArray","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"MyEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/parts/editor/baseEditor.test"},{"name":"MyOtherEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/parts/editor/baseEditor.test"},{"name":"name","kind":"const","kindModifiers":"declare","sortText":"4"},{"name":"NamedNodeMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"namespace","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Namespace","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"NaN","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NativeAccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/accessibility/electron-browser/accessibilityService"},{"name":"NativeBackupTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/electron-browser/backupTracker"},{"name":"NativeClipboardService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/clipboard/electron-browser/clipboardService"},{"name":"NativeExtHostSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostSearch"},{"name":"nativeImage","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeImage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService"},{"name":"NativePathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/electron-browser/pathService"},{"name":"NativeRequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/request/electron-browser/requestService"},{"name":"NativeResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"NativeResourceIdentityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/node/resourceIdentityServiceImpl"},{"name":"NativeSimpleFileDialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/simpleFileDialog"},{"name":"NativeStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageService"},{"name":"NativeTelemetryOptOut","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut"},{"name":"NativeTextFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/electron-browser/textFileEditor"},{"name":"NativeTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService"},{"name":"NativeTextSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/textSearchManager"},{"name":"nativeTheme","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/update/electron-browser/updateService"},{"name":"NativeWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/window"},{"name":"NativeWorkbenchEnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/electron-browser/environmentService"},{"name":"NativeWorkspaceEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService"},{"name":"NativeWorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/electron-browser/workspacesService"},{"name":"NavigateBackwardsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateBetweenGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateForwardAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateLastAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateToLastEditLocationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigationModeAddon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/navigationModeAddon"},{"name":"NavigationPreloadManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"navigator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Navigator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"neq","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"net","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"netLog","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"networkInterfaces","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"never","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NEVER_MEASURE_RENDER_TIME_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"NeverShowAgainScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"new","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NEW_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewEditorGroupAboveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupBelowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewExplorerItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"NewFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"NewWindowAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"newWindowCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"NewWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"newWriteableBufferStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"newWriteableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"NEXT_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"nextCharLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"NextCommentThreadAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"NextMarkerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoError"},{"name":"NextMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextMatchFindAction2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"NextSelectionMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextSideBarViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"nextTick","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"nextTick","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"NO_KEY_MODS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"noAsar","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"NODATA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Node","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"nodeAcceptEdit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"NodeCachedDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner"},{"name":"NodeClient","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/NodeClient"},{"name":"NodeColor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"NodeColor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"NodeDebugHelperService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugHelperService"},{"name":"NodeFilter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NodeIterator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NodeJS","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"NodeList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"noDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"nodeReadableToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"NodeSocket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"nodeSocketFactory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/node/nodeSocketFactory"},{"name":"nodesToArrays","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/browser/ui/grid/util"},{"name":"nodeStreamToVSBufferReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"NodeTestBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test"},{"name":"NoEditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"noIntlCompareFileNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"NOMEM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NoMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"NONAME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NoOpNotification","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NoOpProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NoOpWorkspaceTagsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/browser/workspaceTagsService"},{"name":"normalize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"normalize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"normalizeDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"normalizeExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"normalizeFileChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/watcher"},{"name":"normalizeGitHubUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/common/issueReporterUtil"},{"name":"normalizeNFC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"normalizeNFD","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"normalizePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"normalizeRoots","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/chokidarWatcherService"},{"name":"normalizeVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"NoTabsTitleControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/noTabsTitleControl"},{"name":"notDeepEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"notDeepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"notebook","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"NOTEBOOK_CELL_EDITABLE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_MARKDOWN_EDIT_MODE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_RUN_STATE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_TYPE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_DISPLAY_ORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NOTEBOOK_EDITABLE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_EDITOR_CURSOR_BOUNDARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NOTEBOOK_EDITOR_EDITABLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EDITOR_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EXECUTING_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_VIEW_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NotebookCellList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/notebookCellList"},{"name":"NotebookCellListDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"NotebookCellMetadataDefaults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel"},{"name":"NotebookCellTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel"},{"name":"NotebookCodeEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebook.contribution"},{"name":"notebookDocumentMetadataDefaults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookEditorCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"NotebookEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditorInput"},{"name":"NotebookEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditorInput"},{"name":"NotebookEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookEventDispatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookFindWidget"},{"name":"NotebookLayoutChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookMetadataChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"notebookOutputContainerColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookOutputRendererInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer"},{"name":"NotebookOutputRendererInfoStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"notebookProviderExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/extensionPoint"},{"name":"NotebookProviderInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookProvider"},{"name":"NotebookProviderInfoStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"NotebookRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookRegistry"},{"name":"notebookRendererExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/extensionPoint"},{"name":"NotebookService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"NotebookTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/model/notebookTextModel"},{"name":"NotebookViewEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel"},{"name":"notEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"NOTFOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Notification","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Notification","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NotificationActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"NotificationChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationHandle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NOTIFICATIONS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_HEADER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_HEADER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_ERROR_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_INFO_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_LINKS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_TOAST_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_WARNING_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NotificationsAlerts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsAlerts"},{"name":"NotificationsCenter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCenter"},{"name":"NotificationsCenterVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/notification/common/notificationService"},{"name":"NotificationsFilter","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NotificationsList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsList"},{"name":"NotificationsListDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NotificationsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationsStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsStatus"},{"name":"NotificationsToasts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsToasts"},{"name":"NotificationsToastsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationTemplateRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NotificationViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationViewItemContentChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationViewItemProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NOTIMP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NotImplementedError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"NOTINITIALIZED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"notStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"NsfwWatcherService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/nsfwWatcherService"},{"name":"null","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NULL_LANGUAGE_IDENTIFIER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NULL_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NULL_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NullApiDeprecationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"NullAppender","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"NullCommandService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"nullExtensionDescription","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"NullExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"NullFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/test/common/nullFileSystemProvider"},{"name":"NullLifecycleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"NullLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"NullOpenerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"nullRange","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"NullTelemetryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"nullTokenize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"nullTokenize2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"number","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Number","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NumberBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"O_APPEND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_CREAT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DIRECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DIRECTORY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DSYNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_EXCL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOATIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOCTTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOFOLLOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NONBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_RDONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_RDWR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_SYMLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_SYNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_TRUNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_WRONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"object","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Object","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ObjectIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"ObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTree"},{"name":"ObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTreeModel"},{"name":"off","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"OfflineAudioCompletionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OfflineAudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"offscreenBuffering","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OffscreenCanvas","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OffscreenCanvasRenderingContext2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ok","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"ok","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/assert"},{"name":"on","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"on","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"onabort","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onafterprint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationcancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationiteration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onauxclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onbeforeprint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onbeforeunload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onblur","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncanplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncanplaythrough","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"once","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"once","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"events"},{"name":"once","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/functional"},{"name":"once","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"onchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onclose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncompassneedscalibration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncontextmenu","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncuechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondblclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondevicelight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondevicemotion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondeviceorientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondeviceorientationabsolute","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onDidChangeFullscreen","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"onDidChangeKeyboardLayout","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"onDidChangeModelLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"onDidChangeZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"onDidCreateEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"onDidCreateModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"ondrag","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragexit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondrop","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondurationchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OneCursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/oneCursor"},{"name":"OneLineRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"onemptied","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onended","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnEnterSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/onEnter"},{"name":"oneOf","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"OneReference","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"OneReferenceRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"onerror","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OneSnippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetSession"},{"name":"onExtensionChanged","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"onfocus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ongotpointercapture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onhashchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnigScanner","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"OnigString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"oninput","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oninvalid","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeydown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeypress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeyup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"onlanguagechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ONLINE_SERVICES_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"onload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadeddata","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadedmetadata","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onlostpointercapture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmessage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmessageerror","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousedown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousemove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousewheel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturedoubletap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgestureend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturehold","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturestart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturetap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsinertiastart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointercancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerdown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointermove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onoffline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ononline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onorientationchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpagehide","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpageshow","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpause","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onplaying","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointercancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerdown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointermove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpopstate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onprogress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onratechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onreadystatechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onrejectionhandled","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onreset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onresize","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onscroll","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsecuritypolicyviolation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onseeked","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onseeking","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselectionchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselectstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onstalled","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onstorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsubmit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsuspend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontimeupdate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontoggle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchcancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchmove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitioncancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionrun","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnTypeFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"OnTypeRenameAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"OnTypeRenameContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"OnTypeRenameProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"onUnexpectedError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"onUnexpectedExternalError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"onunhandledrejection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onunload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvolumechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayactivate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayblur","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayconnect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaydeactivate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaydisconnect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayfocus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypointerrestricted","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypointerunrestricted","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypresentchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onwaiting","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onwheel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onWillDisposeModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"open","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"OPEN_CREATE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_EDITOR_AT_INDEX_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"OPEN_PRIVATECACHE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_READONLY","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_READWRITE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_SHAREDCACHE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_TO_SIDE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OPEN_URI","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OpenAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"openBreakpointSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"OpenContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"OpenDebugConsoleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugViewlet"},{"name":"opendir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"opendirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"OpenEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"OpenEditorsFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"OpenEditorsGroupContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OpenEditorsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/openEditorsView"},{"name":"OpenEditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"opener","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OpenerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/openerService"},{"name":"OpenerValidatorContributions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsValidator"},{"name":"OpenExplorerViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files.contribution"},{"name":"OpenExtensionLogsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/electron-browser/logsActions"},{"name":"OpenExtensionsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions"},{"name":"OpenExtensionsViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"OpenFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenFileFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"openFilePreserveFocusHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"OpenFirstEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenFolderAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenInEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"OpenInEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenIssueReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenIssueReporterActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/common/commands"},{"name":"OpenLastEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenLatestReleaseNotesInBrowserAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"OpenLocalFileCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLocalFileFolderCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLocalFolderCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLogsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/electron-browser/logsActions"},{"name":"OpenMatchToSide","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"openModeSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"OpenNewEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenNewEditorToSideCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenNextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenProcessExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueActions"},{"name":"OpenRecentAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"OpenResultsInEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"OpenSearchEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"OpenSearchEditorToSideAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"openSearchView","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"OpenSearchViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"openStdin","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"openSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"OpenUrlAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/url.contribution"},{"name":"OpenViewPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"OpenWebviewDeveloperToolsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"openWindowCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OpenWindowSessionLogFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsActions"},{"name":"OpenWithAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenWorkspaceButtonContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorWidgets"},{"name":"OpenWorkspaceConfigFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OperatingSystem","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Option","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"optional","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"OPTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"or","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"OrganizeImportsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"organizeImportsCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"orientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Orientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"origin","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"originalFSPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"orthogonal","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"OS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"OS_PROVIDES_FILE_PROTECTION","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"OscillatorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"outerHeight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"outerWidth","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OutgoingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"OutlineAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineConfigKeys","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineElementTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineGroupTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineItemComparator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlinePane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/outline/browser/outlinePane"},{"name":"OutlineSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineViewFiltered","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineViewFocused","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineViewId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineVirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutOfProcessWin32FolderWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/win32/csharpWatcherService"},{"name":"OUTPUT_MIME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OutputAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/node/outputAppender"},{"name":"OutputBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingIO"},{"name":"OutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"OutputChannelModelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModelService"},{"name":"OutputChannelModelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/electron-browser/outputChannelModelService"},{"name":"OutputEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputView"},{"name":"OutputLinkComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkComputer"},{"name":"OutputLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkProvider"},{"name":"OutputPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"OutputRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/outputRenderer"},{"name":"OutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputServices"},{"name":"OutputViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputView"},{"name":"outside","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"OverconstrainedError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OverflowEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OverlayWidgetDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"OverlayWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"OverlayWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"OVERRIDE_PROPERTY_PATTERN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"overrideIdentifierFromKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"OverviewRuler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler"},{"name":"overviewRulerAddedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerCommentingRangeForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentGlyphWidget"},{"name":"overviewRulerCommonContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerCurrentContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerDeletedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"overviewRulerFindMatchForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerIncomingContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerInfo","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"overviewRulerModifiedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"overviewRulerSelectionHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"OverviewRulerZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"OverviewZoneManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"package","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"pad","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"PageCoordinates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"PagedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listPaging"},{"name":"PagedModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"PagedScreenReaderStrategy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaState"},{"name":"PageTransitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PageViewData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/PageViewData"},{"name":"PageViewData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"pageXOffset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pageYOffset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Pane","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"PaneComposite","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panecomposite"},{"name":"PaneCompositePanel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"Panel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PANEL_ACTIVE_TITLE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_ACTIVE_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/outline/browser/outline.contribution"},{"name":"PANEL_INACTIVE_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_INPUT_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PanelActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PanelDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PanelFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"PanelKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"PanelPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelPart"},{"name":"PanelPositionContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"PanelRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PaneView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"PannerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ParameterHintsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHintsModel"},{"name":"ParameterHintsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHintsWidget"},{"name":"ParameterInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ParameterInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ParameterInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"parent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"parentPort","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"parse","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"parse","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/plistParser"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/tokenization/typescript"},{"name":"parseArgs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"parseClassifierString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"parseCLIProcessArgv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"parseCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"ParsedTokenThemeRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ParseErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parseExtensionDevOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDevOptions"},{"name":"parseExtensionHostPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseFloat","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"parseHrefAndDimensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"parseInt","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"parseKeyboardLayoutDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"parseLineAndColumnAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/paths"},{"name":"parseLinkedText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedText"},{"name":"parseMainProcessArgv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"ParseOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parsePathArg","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"parser","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Parser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"parseRawGrammar","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"parseReplaceString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"parseSavedSearchEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"parseSearchPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseTokenTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"parseTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parseUserDataDir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"parseWithLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/plistParser"},{"name":"Part","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/part"},{"name":"PartFingerprint","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"PartFingerprints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"PartialModelCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"PartialViewCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"Parts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"PassThrough","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"PASTE_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"pasteFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"PasteWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"patch","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"Path2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pathIncludedInQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"PathIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"pathOrURIToURI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"pathsToEditors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"pathToFileURL","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"PatternExcludesFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"PatternIncludesFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"PatternInputWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget"},{"name":"patternsToIExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"PAUSE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"PAUSE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"PauseableEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"PaymentAddress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentRequestUpdateEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pbkdf2","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"pbkdf2Sync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"PeekContext","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorGutterBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsFileForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsMatchForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"PeekViewWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"performance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"performance","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"Performance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceEntry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceMark","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceMeasure","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceNavigation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceNavigationTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceObserver","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"PerformanceObserverEntryList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceResourceTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerfviewContrib","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor"},{"name":"PerfviewInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor"},{"name":"PerfWidgetExternal","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PeriodicWave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionRequestedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Permissions","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionStatus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PersistentConnectionEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"PersistentContributableViewsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"PersistentProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"personalbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PICK_WORKSPACE_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"pickerGroupBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"pickerGroupForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"PickerQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/pickerQuickAccess"},{"name":"pid","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Piece","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"pieceToQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"PieceTreeBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"PieceTreeTextBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer"},{"name":"PieceTreeTextBufferBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder"},{"name":"PieceTreeTextBufferFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder"},{"name":"pipeline","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"Placeholder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"PlaceHolderPanelActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PlaceHolderToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"PlaceHolderToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PlaceHolderViewletActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"PLAINTEXT_LANGUAGE_IDENTIFIER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"PLAINTEXT_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"platform","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"platform","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"platform","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"platform","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Platform","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"PlatformToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Plugin","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PluginArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"POINT_CONVERSION_COMPRESSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"POINT_CONVERSION_HYBRID","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"POINT_CONVERSION_UNCOMPRESSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"PointerEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PointerEventHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/pointerHandler"},{"name":"PointerHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/pointerHandler"},{"name":"PointerHandlerLastRenderData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"PopStateEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"popup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/electron-browser/contextmenu"},{"name":"position","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Position","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"positionFromString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"positionIsInRange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"PositionPanelActionConfigs","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"positionToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"posix","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"posix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"postMessage","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"powerMonitor","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"powerSaveBlocker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"POWERSHELL_PATH","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"ppid","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prebakedMiniMaps","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapPreBaked"},{"name":"PreferencesContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferencesContribution"},{"name":"PreferencesEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"PreferencesEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"PreferencesLabel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"PreferencesSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"PreferencesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/browser/preferencesService"},{"name":"preferredSideBySideGroupDirection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"prefersExecuteOnUI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"prefersExecuteOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"PrefixMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"PrefixSumComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/prefixSumComputer"},{"name":"PrefixSumIndexOfResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/prefixSumComputer"},{"name":"prepareActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"prepareCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"prepareQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"prepend","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"prependListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"prependListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prependOnceListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"prependOnceListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prerelease","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"PresentationOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"presentationSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"PreserveCaseCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/replaceInput"},{"name":"prevCharLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"PREVIEW_DIR_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"PREVIOUS_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"PreviousMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousMatchFindAction2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PreviousSelectionMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousSideBarViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"print","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"privateDecrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"privateEncrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"ProblemCollectorEventKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"ProblemHandlingStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"ProblemLocationKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemMatcherParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemMatcherRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemPatternParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemPatternRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"problemsErrorIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"problemsInfoIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"problemsWarningIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"process","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProcessDataFlag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"ProcessExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ProcessExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ProcessExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ProcessExecutionOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ProcessingInstruction","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProcessRunnerDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/node/processRunnerDetector"},{"name":"ProcessState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ProcessTaskSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/node/processTaskSystem"},{"name":"product","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/product/common/product"},{"name":"ProductContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ProductIconThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/productIconThemeData"},{"name":"productService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"profile","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"profileEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ProfileSessionState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"Progress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"ProgressBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"ProgressBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/progressbar/progressbar"},{"name":"progressBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ProgressBarIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"ProgressEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ProgressLocation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressService"},{"name":"Promise","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PromiseRejectionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"promises","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"promises","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"promisify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"prompt","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"protocol","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Protocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Protocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.electron"},{"name":"ProtocolConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"events"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"module"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"stream"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"https-proxy-agent"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"mocha"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Domain"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/AvailabilityData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Base"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ContextTagKeys"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Data"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPoint"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Envelope"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/EventData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/StackFrame"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionDetails"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MessageData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MetricData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/PageViewData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RemoteDependencyData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RequestData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Channel"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/TelemetryClient"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/NodeClient"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/http-proxy-agent/index"},{"name":"provideDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerDecorationsProvider"},{"name":"provideSelectionRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/smartSelect"},{"name":"provideSignatureHelp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/provideSignatureHelp"},{"name":"provideSuggestionItems","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"Proxy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProxyAgent","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-proxy-agent/index"},{"name":"ProxyAuthHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/auth"},{"name":"ProxyIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"pseudoRandomBytes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"publicDecrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"publicEncrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"PublicKeyCredential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushSubscription","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushSubscriptionOptions","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pushToEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"pushToStart","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Query","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionQuery"},{"name":"QueryBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/queryBuilder"},{"name":"QueryGlobTester","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"QueryType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"Queue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"queueMicrotask","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"QuickAccessController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/quickAccess"},{"name":"QuickAccessLeastRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessLeastRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessNavigateNextAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/quickAccessActions"},{"name":"QuickAccessPreviousEditorFromHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessPreviousRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessPreviousRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"QuickAccessViewPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"QuickCommandNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"QuickFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"QuickFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"QuickFixActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"QuickFixController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"QuickHelpNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"quickInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QuickInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputBox"},{"name":"QuickInputButtons","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"QuickInputButtons","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"QuickInputController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInput"},{"name":"QuickInputEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"QuickInputEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"quickInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QuickInputList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputList"},{"name":"QuickInputListFocus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputList"},{"name":"QuickInputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/quickInput"},{"name":"QuickInputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/quickinput/browser/quickInputService"},{"name":"quickInputTitleBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QUICKOPEN_DETAIL_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"QUICKOPEN_SKIP_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"QuickOutlineNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"quickPickItemScorerAccessor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"QuickPickItemScorerAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"QuickSwitchWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"R_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"raceCancellation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"raceTimeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RadioGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"RadioNodeList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RandomAccessReader","kind":"class","kindModifiers":"abstract,export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"RandomBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"randomBytes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomFill","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomFillSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"RandomSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"range","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Range","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"RangeError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RangeHighlightDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/rangeDecorations"},{"name":"RangeHighlightDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"RangeMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"RangesCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"RangesCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"RangeUtil","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/rangeUtil"},{"name":"RatingsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RawContentChangedType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"RawContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"RawDebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/rawDebugSession"},{"name":"rawListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"RawObjectReplElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"rbDelete","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"rcompare","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"rcompareIdentifiers","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ReactionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"ReactionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"read","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Readable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"ReadableStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ReadableStreamReader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"readableToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readCharWidths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"readdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readdir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readDirsInDir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readdirSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readdirWithFileTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"readFromStdin","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"readlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readonly","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ReadonlyEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"readRawMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"ReadStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ReadStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"readSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readTrustedDomains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"readUInt16LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt32BE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt32LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"realcaseSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"realpath","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"realpath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"realpathSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"realpathSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"ReapplyBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"RecommendationWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"recomputeMaxEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"recomputeTreeMetadata","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"ReconnectionPermanentFailureEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ReconnectionRunningEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ReconnectionWaitEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"Recoverable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"RedoWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"RefactorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"refactorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"RefCountedStyleSheet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"ReferenceCollection","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"ReferenceError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ReferenceProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ReferencesController","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesController"},{"name":"ReferencesModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"ReferenceWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget"},{"name":"Reflect","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"RefreshAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"RefreshExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"REFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"REG_BINARY","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_DWORD","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_EXPAND_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_MULTI_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_NONE","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_QWORD","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_TYPES","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"RegexCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"RegExp","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"regExpContainsBackreference","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"regExpFlags","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"regExpLeadsToEndlessLoop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"register","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerAction2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"registerCodeActionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerCodeLensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"registerColorProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerColors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"registerColorThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerColorThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"registerCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"registerCompletionItemProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"registerContextMenuListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/electron-main/contextmenu"},{"name":"registerContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceContributions"},{"name":"registerContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"registerDeclarationProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDefaultLanguageCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerDefinitionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDiffEditorContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerDocumentFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentHighlightProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentRangeFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentRangeSemanticTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentSemanticTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentSymbolProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerEditorAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerEditorCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerEditorContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerFileIconThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerFileIconThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/fileIconThemeSchema"},{"name":"registerFileProtocol","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols"},{"name":"registerFoldingRangeProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerHoverProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerIcon","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"registerImplementationProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerInstantiatedEditorAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerLanguageCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerLinkProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerModelAndPositionCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerModelCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerNotificationCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"registerOnTypeFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerOnTypeRenameProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerOutputTransform","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookRegistry"},{"name":"registerProductIconThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerProductIconThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/productIconThemeSchema"},{"name":"registerReferenceProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerRemoteContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote"},{"name":"registerRenameProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSelectionRangeProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSignatureHelpProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSingleton","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/extensions"},{"name":"registerTerminalActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"registerTestEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"registerTextMime","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"registerThemingParticipant","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"registerTypeDefinitionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerWindowDriver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/browser/driver"},{"name":"registerWindowDriver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-browser/driver"},{"name":"Registry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/registry/common/platform"},{"name":"Registry","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"ReindentLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ReindentSelectedLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ReinstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"rejects","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"RelatedInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"RelatedInformationRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"relative","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"relative","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"relativePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"RelativePattern","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"RelativePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Relay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"RelayURLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/url/electron-browser/urlService"},{"name":"release","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"release","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"releaseEvents","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ReleaseNotesManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/releaseNotesEditor"},{"name":"ReloadAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ReloadWebviewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"ReloadWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"ReloadWindowWithExtensionsDisabledAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"remeasureFonts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"remote","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"REMOTE_EXPLORER_TYPE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"REMOTE_FILE_SYSTEM_CHANNEL_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel"},{"name":"REMOTE_HOST_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"REMOTE_MACHINE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"RemoteAgentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/abstractRemoteAgentService"},{"name":"RemoteAgentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/browser/remoteAgentServiceImpl"},{"name":"RemoteAgentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl"},{"name":"RemoteAuthorities","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/network"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"RemoteAuthorityResolverErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"RemoteAuthorityResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/remoteAuthorityResolverService"},{"name":"RemoteAuthorityResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/electron-browser/remoteAuthorityResolverService"},{"name":"RemoteBadgeWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RemoteConnectionState","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteDependencyData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RemoteDependencyData"},{"name":"RemoteDependencyData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"RemoteDependencyDataConstants","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Constants"},{"name":"RemoteExtensionEnvironmentChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentEnvironmentChannel"},{"name":"RemoteExtensionHostClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHostClient"},{"name":"RemoteExtensionLogFileName","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentService"},{"name":"RemoteExtensionManagementChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc"},{"name":"RemoteExtensionsInstaller","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/remoteExtensionsInstaller"},{"name":"RemoteFileDialogContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel"},{"name":"RemoteFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"RemoteInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"RemoteNameContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchService"},{"name":"RemoteUserConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"RemoteViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/remote"},{"name":"RemoteWindowActiveIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/remoteIndicator"},{"name":"REMOVE_ROOT_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"REMOVE_ROOT_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"removeAccents","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"RemoveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"RemoveActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"RemoveAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeAllListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"removeAllListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"RemoveAllWatchExpressionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeAnsiEscapeCodes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"RemoveBreakpointAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeClasses","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeCSSRulesContainingSelector","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeElementsAfterNulls","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/resolvedKeybindingItem"},{"name":"removeEventListener","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RemoveFromRecentlyOpenedAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"removeFromValueTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"removeListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"removeListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"removeMarkdownEscapes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"removeNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"removeTabIndexAndUpdateFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"rename","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"rename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/rename"},{"name":"RenameAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/rename"},{"name":"renameHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"renameIgnoreError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RenameInputField","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/renameInputField"},{"name":"RenameProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"renameSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"renderCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"RenderedLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewLayer"},{"name":"Renderer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Renderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList"},{"name":"rendererLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"renderExpressionValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"renderFormattedText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"RenderIndentGuides","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"RenderingContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"RenderLineInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"RenderLineNumbersType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"RenderLineNumbersType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"RenderLineOutput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"RenderLineOutput2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderMarkdown","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/markdownRenderer"},{"name":"renderMarkdownDocument","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markdown/common/markdownDocumentRenderer"},{"name":"RenderMinimap","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"RenderMinimap","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"renderText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"renderVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"renderViewLine","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderViewLine2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderViewTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"RenderWhitespace","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"ReopenClosedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ReopenResourcesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"repeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Repl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/repl"},{"name":"REPL_MODE_SLOPPY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"REPL_MODE_STRICT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"REPL_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"ReplAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceActiveKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceAllCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replaceAllCommand"},{"name":"ReplaceAllInFileActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceAllInFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceAllInFolderActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandThatPreservesSelection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandThatSelectsText","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandWithOffsetCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandWithoutChangingPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceInFilesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/replaceInput"},{"name":"ReplaceInputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplacePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"ReplacePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/replace"},{"name":"ReplacePiece","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"ReplacePreviewContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceService"},{"name":"ReplaceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceService"},{"name":"ReplDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplEvaluationInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplEvaluationInputsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplEvaluationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplEvaluationResultsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplRawObjectsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"REPLServer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"ReplSimpleElementsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplVariablesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"report","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"reporters","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"mocha"},{"name":"ReportExtensionIssueAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"ReportPerformanceIssueUsingReporterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueActions"},{"name":"RepositoryPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"RepositoryViewDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"request","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"request","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"request","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/request/browser/request"},{"name":"Request","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"requestAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RequestChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/requestIpc"},{"name":"RequestChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/requestIpc"},{"name":"RequestData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RequestData"},{"name":"RequestData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"RequestInitiator","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RequestMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/electron-main/requestMainService"},{"name":"RequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/browser/requestService"},{"name":"RequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/node/requestService"},{"name":"RequestType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"require","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RequireInterceptor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRequireInterceptor"},{"name":"RerunSearchEditorSearchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"RerunSearchEditorSearchCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"ResetFocusedViewLocationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ResetGroupSizesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"resetSentinel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"ResetViewLocationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"resizeBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"resizeTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"resolve","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"resolve4","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolve6","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveAny","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveCname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveColorValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"resolveCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/commonProperties"},{"name":"ResolvedAuthority","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ResolvedAuthority","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ResolvedKeybinding","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"ResolvedKeybindingItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/resolvedKeybindingItem"},{"name":"ResolvedKeybindingPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"resolveExtensionsSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"resolveMarketplaceHeaders","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService"},{"name":"resolveMx","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveNaptr","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveNs","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolvePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"resolvePatternsForProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"resolvePtr","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Resolver","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveSettingsTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"resolveSoa","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveSrv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveTerminalEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/terminalEncoding"},{"name":"resolveTxt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveWorkbenchCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/browser/workbenchCommonProperties"},{"name":"resolveWorkbenchCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/workbenchCommonProperties"},{"name":"ResourceContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/resources"},{"name":"ResourceDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"ResourceEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/resourceEditorInput"},{"name":"ResourceEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/resourceEditorModel"},{"name":"ResourceGlobMatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"ResourceGlobMatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/resources"},{"name":"ResourceLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"ResourceLabels","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"resourceLanguageSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ResourceMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"ResourceMarkers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"ResourceMarkersRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"ResourceQueue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"ResourcesDropHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"ResourceSelectedForCompareContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"resourceSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"resourcesPath","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ResourceTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resourceTree"},{"name":"resourceUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ResourceWithCommentsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"ResourceWithCommentThreads","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"Response","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ResponseType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ResponsiveState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RESTART_FRAME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"RESTART_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"RESTART_SESSION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"restore","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"restoreFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"restoreParentsScrollTop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"restoreRecentlyOpened","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"restoreWindowsState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsStateStorage"},{"name":"RestrictedRenderingContext","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"resultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"retry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"return","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"REVEAL_IN_EXPLORER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"RevealInSideBarForSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"RevealKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RevealLine_","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"RevealProblemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"revealResourcesInOS","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/electron-browser/fileCommands"},{"name":"RevealTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"reverse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"REVERSE_CONTINUE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"REVERT_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"RevertAndCloseEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"revertLocalChangesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"ReviewViewZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"ReviewZoneWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentThreadWidget"},{"name":"revive","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"reviveQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"reviveWebviewExtensionDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory"},{"name":"reviveWorkspaceEditDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"reviveWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"rewriteAbsolutePaths","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"rewriteWorkspaceFileForNewLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"RGBA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"RGBA8","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/rgba"},{"name":"rgErrorMsgForDisplay","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"rgErrorMsgForDisplay","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"rgPath","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-ripgrep/lib/index"},{"name":"RichEditBracket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"RichEditBrackets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"RichEditSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"rightRotate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"righttest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"rimraf","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RimRafMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"rimrafSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RipgrepParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"RipgrepSearchProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchProvider"},{"name":"RipgrepTextSearchEngine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"rmdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rmdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rootCertificates","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"rot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"RotatingLogger","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"RowCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rowCache"},{"name":"RPCProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RSA_NO_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_OAEP_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_PSS_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_SSLV23_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_X931_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"rsort","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"RTCCertificate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDataChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDataChannelEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtlsTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtlsTransportStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtmfSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDTMFSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDTMFToneChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceCandidate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceCandidatePairChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceGatherer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceGathererEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceTransportStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIdentityAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnectionIceErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnectionIceEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpReceiver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpTransceiver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSctpTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSessionDescription","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSrtpSdesTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSsrcConflictEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsProvider","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsReport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCTrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"rtrim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Rulers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/rulers/rulers"},{"name":"run","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RunAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"runAtThisOrScheduleAtNextAnimationFrame","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"RunAutomaticTasks","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks"},{"name":"runInContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runInExternalTerminal","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"runInNewContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runInThisContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runMain","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"RunOnceScheduler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RunOnceWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RunOnOptions","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunOnOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"RunOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"RuntimeExtensionsEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"RuntimeExtensionsInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput"},{"name":"RuntimeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunToCursorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"runWhenIdle","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"S_IFBLK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFCHR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFIFO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFLNK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFMT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFREG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IROTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWOTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXOTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"safeBtoa","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"safeStringify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"sandbox","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"sandboxed","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"sanitize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"sanitizeFilePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"sanitizeGridNodeDescriptor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"sanitizeProcessEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"sanitizeRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"Sash","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"SashState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"satisfies","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SAVE_ALL_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_ALL_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_ALL_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_AS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_AS_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_WITHOUT_FORMATTING_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILES_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SaveAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"SaveAllInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"SaveExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"SaveLocalFileCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"saveParentsScrollTop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"SaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant"},{"name":"SaveParticipantsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"SaveReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SaveWorkspaceAsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"ScanCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanCodeBinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanCodeUtils","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanError","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"Scanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"scheduleAtNextAnimationFrame","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"schema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchemaCommon"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v1"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v2"},{"name":"Schemas","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/network"},{"name":"Schemas","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"scm","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SCMAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/menus"},{"name":"SCMService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scmService"},{"name":"SCMStatusController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/activity"},{"name":"SCMTreeKeyboardNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMTreeSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"Scope","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ScopedCredential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScopedCredentialInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScopedLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"score","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageSelector"},{"name":"scoreFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"scoreFuzzy2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"scoreItemFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"screen","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screen","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Screen","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenLeft","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScreenOrientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenTop","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenX","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenY","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Script","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"ScriptProcessorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scroll","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Scrollable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"ScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"ScrollbarArrow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarArrow"},{"name":"scrollbars","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrollbarShadow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderActiveBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ScrollbarState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarState"},{"name":"ScrollbarVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"ScrollbarVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"ScrollbarVisibilityController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController"},{"name":"scrollBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ScrollDecorationViewPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration"},{"name":"ScrollPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon"},{"name":"ScrollState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"scrollTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ScrollType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"ScrollType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"scrollX","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrollY","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"scryptSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"sdkVersion","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"SEARCH_EXCLUDE_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-search/typings/xterm-addon-search"},{"name":"SearchChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchIpc"},{"name":"SearchChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchIpc"},{"name":"SearchCompletionExitCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchDND","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor"},{"name":"SearchEditorBodyScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"searchEditorFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"searchEditorFindMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SearchEditorFindMatchClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SearchEditorID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SearchEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput"},{"name":"SearchEditorScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"searchEditorTextInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor"},{"name":"Searcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchHistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchHistoryService"},{"name":"SearchInputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"searchMatchComparer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchParams","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchProviderType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchResultIdx","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SearchResultModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchService"},{"name":"SearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/rawSearchService"},{"name":"SearchSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchView"},{"name":"SearchViewFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"SearchViewPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchView"},{"name":"SearchViewVisibleKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"SearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"SearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"SearchWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SecurityPolicyViolationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SELECT_FOR_COMPARE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SelectActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"selectAllSearchEditorMatchesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"SelectAllSearchEditorMatchesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SelectAllTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SelectAllWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"SelectAndStartAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"selectBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"selectBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBox"},{"name":"SelectBoxList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBoxCustom"},{"name":"SelectBoxNative","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBoxNative"},{"name":"SelectColorThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/themes/browser/themes.contribution"},{"name":"SelectDefaultShellWindowsTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"selectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectHighlightsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"Selection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Selection","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Selection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/selection"},{"name":"Selection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Selection","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Selection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"selectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectionBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"SelectionClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard"},{"name":"SelectionClipboardContributionID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/selectionClipboard"},{"name":"SelectionDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/selection"},{"name":"SelectionDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SelectionDirection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"SelectionHighlighter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"SelectionMatchFindAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"SelectionRange","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SelectionRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SelectionRange","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SelectionRangeRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SelectionsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/selections/selections"},{"name":"selectListBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"selectorPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"self","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SEMANTIC_HIGHLIGHTING_SETTING_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"SemanticTokens","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensBuilder","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensEdits","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensEdits","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensHelp","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/semanticTokensHelp"},{"name":"SemanticTokensLegend","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensLegend","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensProviderStyling","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"SemanticTokensProviderStylingConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"SemVer","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SEMVER_SPEC_VERSION","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"send","kind":"method","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"Sender","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"SENTINEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"SENTINEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"sep","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"sep","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"Separator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"sequence","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Sequence","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/sequence"},{"name":"Sequencer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"SerializableFileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SerializableGrid","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"serialize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"serializeEnvironmentVariableCollection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableShared"},{"name":"serializeFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"serializePipePositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"Serializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"serializeSearchConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"serializeSearchError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"serializeSearchResultForEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"serve","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"serve","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-main/driver"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/electron-main/ipc.electron-main"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.cp"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"ServerExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"ServerResponse","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"SERVFAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ServiceCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/serviceCollection"},{"name":"ServiceUIFrameContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerContainer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerRegistration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"session","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Session","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"Session","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"sessionStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Set","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SET_CONTEXT_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"setARIAContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"setAsyncMode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"setCollapseStateAtLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateForMatchingLines","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateForType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateLevelsDown","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateLevelsUp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateUp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"SetColorThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"SetEditorLayoutAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"setegid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"seteuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setFdLimit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"SetFileIconThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"setFlagsFromString","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"setFullscreen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"setgid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setGlobalLeakWarningThreshold","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"setgroups","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setImmediate","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setImmediate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"setImmediate","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"setInterval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setInterval","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"setLanguageConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"SetLogLevelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsActions"},{"name":"SetMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"setMaxListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"setMaxListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setModelLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setModelMarkers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setMonarchTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"setNodeStickiness","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"setOptions","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"SetPanelPositionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"setPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"setPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"setPriority","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"SetProductIconThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"setProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"setServers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"setSnippetSuggestSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"setTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setTimeout","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setTimeout","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"SettingArrayRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingBoolRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingComplexRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingEnumRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingExcludeRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"settingKeyToDisplayFormat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingMatches","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"SettingNewExtensionsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingNumberRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"settings","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"SETTINGS_COMMAND_OPEN_SETTINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_EDIT_FOCUSED_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FILTER_ONLINE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_LIST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_TOC","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SWITCH_TO_JSON","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"Settings2EditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"SettingsChangeRelauncher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution"},{"name":"settingsCheckboxBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsCheckboxBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsCheckboxForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsEditor2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsEditor2"},{"name":"SettingsEditor2Input","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"SettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"SettingsEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"SettingsGroupTitleRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"SettingsGroupTitleWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsHeaderForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsHeaderWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsNumberInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsNumberInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsNumberInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectListBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsSync"},{"name":"SettingsTargetsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsTextInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsTextInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsTextInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingsTreeElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingsTreeGroupElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeNewExtensionsElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeSettingElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingTextRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingTreeRenderers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingValueType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"setTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"setToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"setuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setUncaughtExceptionCaptureCallback","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setUnexpectedErrorHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"setup","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"setup","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"setupMaster","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"setupTerminalCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalCommands"},{"name":"setupTerminalMenu","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalMenu"},{"name":"setWordDefinitionFor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"setZoomFactor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"setZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"Severity","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/severity"},{"name":"Severity","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"SeverityIcon","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/severityIcon/common/severityIcon"},{"name":"SeverityLevel","kind":"enum","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"SeverityLevel","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"shadowCaretRangeFromPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"ShadowRoot","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SharedArrayBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"sharedLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"SharedProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/sharedProcess"},{"name":"SharedProcessMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-main/sharedProcessMainService"},{"name":"SharedProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService"},{"name":"SharedWorker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"shell","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"SHELL_CWD_INVALID_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"SHELL_PATH_DIRECTORY_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"SHELL_PATH_INVALID_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ShellExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ShellExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ShellExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ShellExecutionOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"shift","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"ShiftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/shiftCommand"},{"name":"shorten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"shouldSetLangEnvVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"shouldSynchronizeModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelService"},{"name":"show","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"SHOW_EDITORS_IN_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SHOW_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ShowActiveFileInExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ShowAllCommandsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"ShowAllEditorsByAppearanceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowAllEditorsByMostRecentlyUsedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowAzureExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowBuiltInExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowCandidateContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/showCandidate"},{"name":"ShowCurrentReleaseNotesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ShowCurrentReleaseNotesActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/common/update"},{"name":"ShowDisabledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowEditorsInActiveGroupByMostRecentlyUsedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowEnabledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"showExtensionQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/format/browser/showExtensionQuery"},{"name":"ShowInstalledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowLanguageExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ShowLanguageExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowNextChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"ShowNextWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ShowOpenedFileInNewWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ShowOutdatedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowPopularExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowPreviousChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"ShowPreviousWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ShowProblemsPanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"ShowRecommendationsOnlyOnDemandKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ShowRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowRecommendedKeymapExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowReleaseNotesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ShowRuntimeExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"showSimpleSuggestions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"ShowViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ShowWebViewEditorFindWidgetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"shuffle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"ShutdownReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"SIDE_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"SidebarFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"SidebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/sidebar/sidebarPart"},{"name":"SideBarVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"SideBySideEditor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SideBySideEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/sideBySideEditor"},{"name":"SideBySideEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SIGABRT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGALRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGBREAK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGBUS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGCHLD","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGCONT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGFPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGHUP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGILL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGINT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGIOT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGKILL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"sign","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"SIGN_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/common/sign"},{"name":"SignatureHelp","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureHelp","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureHelp","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SignatureHelpProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SignatureInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Signer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"SignService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/browser/signService"},{"name":"SignService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/node/signService"},{"name":"SIGPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPOLL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPROF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPWR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGQUIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSEGV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSTKFLT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSTOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSYS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTERM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTRAP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTSTP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTTIN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTTOU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUNUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGURG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUSR1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUSR2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGVTALRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGWINCH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGXCPU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGXFSZ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SimpleBreadcrumbsItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"SimpleBulkEditService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleButton","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"SimpleCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"simpleCheckboxBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"simpleCheckboxBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"simpleCheckboxForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SimpleCommentEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/simpleCommentEditor"},{"name":"SimpleConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleEditorModelResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleEditorProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleFileDialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"SimpleFindReplaceWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindReplaceWidget"},{"name":"SimpleFindWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget"},{"name":"SimpleKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"SimpleLayoutService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleNotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleReplElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"SimpleResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleServicesNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"SimpleUriLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleWorkerClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"SimpleWorkerServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"SimpleWorkspaceContextService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SingleCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"SingleEditorGroupsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"singleLetterHash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"SingleLineInputHeight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"SingleModelEditStackElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"singlePagePager","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"SingleProxyRPCProtocol","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/api/testRPCProtocol"},{"name":"sinon","kind":"alias","kindModifiers":"declare","sortText":"4"},{"name":"Sinon","kind":"var","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"size","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"size","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"Sizing","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"Sizing","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"SlicedLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/lineTokens"},{"name":"SlowBuffer","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"SlowExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions"},{"name":"SmartSnippetInserter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/smartSnippetInserter"},{"name":"SmoothScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"SmoothScrollingOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"SmoothScrollingUpdate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"snapshotToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"SnapUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.snap"},{"name":"Snippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"SnippetCompletion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider"},{"name":"SnippetCompletionProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider"},{"name":"SnippetController2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetController2"},{"name":"SnippetFile","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"snippetFinalTabstopHighlightBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"snippetFinalTabstopHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SnippetParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"SnippetSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetSession"},{"name":"SnippetSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"SnippetSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"SnippetsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/snippetsSync"},{"name":"SnippetString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SnippetString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"snippetTabstopHighlightBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"snippetTabstopHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Socket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dgram"},{"name":"Socket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"SocketDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"sort","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SortBy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"sortedDiff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Sorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"SortLinesAscendingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"SortLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/sortLinesCommand"},{"name":"SortLinesDescendingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"sortMimeTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"SortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"SortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"Source","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"Source","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"Source","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"SourceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"sourceActionCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"SourceBreakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SourceBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SourceBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SourceBufferList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SourceControlInputBoxValidationType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SourceControlInputBoxValidationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SparseEncodedTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"spawn","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"spawn","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"node-pty"},{"name":"spawnRipgrepCmd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"spawnSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"SpdLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/spdlogService"},{"name":"specify","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechGrammar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechGrammarList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognition","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionAlternative","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionResult","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionResultList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"speechSynthesis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisUtterance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisVoice","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SPLIT_EDITOR_DOWN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_LEFT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_RIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_UP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"splitEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SplitEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorOrthogonalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorsVertically","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SplitEditorUpAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"splitGlobAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"SplitInActiveWorkspaceTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SplitLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"SplitLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"splitName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"SplitTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SplitView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"spreadGlobComponents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"spy","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"SQLiteStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/node/storage"},{"name":"SSL_OP_ALL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CIPHER_SERVER_PREFERENCE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CISCO_ANYCONNECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_COOKIE_EXCHANGE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CRYPTOPRO_TLSEXT_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_EPHEMERAL_RSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_LEGACY_SERVER_CONNECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MICROSOFT_SESS_ID_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MSIE_SSLV2_RSA_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_CA_DN_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_CHALLENGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_QUERY_MTU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SSLv2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SSLv3","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TICKET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1_1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1_2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_PKCS1_CHECK_1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_PKCS1_CHECK_2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SINGLE_DH_USE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SINGLE_ECDH_USE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SSLEAY_080_CLIENT_DH_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_BLOCK_PADDING_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_D5_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_ROLLBACK_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"StableEditorScrollState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"StackFrame","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"StackFrame","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/StackFrame"},{"name":"StackFrame","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"StandaloneCodeEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneCodeEditorNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"StandaloneCodeEditorServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeServiceImpl"},{"name":"StandaloneCommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneCommandsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess"},{"name":"StandaloneConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"StandaloneDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneGotoLineQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess"},{"name":"StandaloneGotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess"},{"name":"StandaloneKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneQuickInputServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"StandaloneReferencesController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch"},{"name":"StandaloneTelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneThemeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneThemeServiceImpl"},{"name":"StandardAutoClosingPairConditional","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfiguration"},{"name":"StandardKeyboardEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/keyboardEvent"},{"name":"StandardMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"standardMouseMoveMerger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/globalMouseMoveMonitor"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"StandardWheelEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"StandardWindow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"start","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"start","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"start","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-watchdog/index"},{"name":"StartAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"StartDebugActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActionViewItems"},{"name":"StartDebugQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugQuickAccess"},{"name":"startExtensionHostProcess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup"},{"name":"StartExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"StartFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"StartFindReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"StartFindWithSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"startProfiling","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"StartStopProblemCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"startsWith","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startsWithIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startsWithUTF8BOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterMain"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/processExplorer/processExplorerMain"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/sharedProcessMain"},{"name":"StartupKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"StartupKindToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"StartupProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/startupProfiler"},{"name":"StartupTimings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/startupTimings"},{"name":"stat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"stat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"State","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"stateExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"StatefullMarkdownCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell"},{"name":"StateMachine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"Statement","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"StateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/stateService"},{"name":"StateType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"StaticDND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"StaticExtensionsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/staticExtensions"},{"name":"StaticLanguageSelector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/mockMode"},{"name":"StaticRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StaticRouter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"StaticServices","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneServices"},{"name":"StatisticType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"statLink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"Stats","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"statSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"status","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"status","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"STATUS_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_DEBUGGING_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_DEBUGGING_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_DEBUGGING_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_HOST_NAME_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_HOST_NAME_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_ITEM_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_ITEM_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_CODES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"statusbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StatusbarAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/statusbar/common/statusbar"},{"name":"StatusBarAlignment","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"StatusBarAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"StatusBarColorProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"StatusbarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/statusbar/statusbarPart"},{"name":"StatusLabelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"StatusMessageChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"StatusUpdater","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"stderr","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"stdin","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"stdinDataListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"stdout","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"STEP_BACK_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_INTO_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_INTO_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OUT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OUT_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OVER_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OVER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"StereoPannerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"stop","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"stop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/event"},{"name":"STOP_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STOP_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"StopExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"StopWatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stopwatch"},{"name":"Storage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Storage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"StorageDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/storageDataCleaner"},{"name":"StorageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StorageHint","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"StorageKeysSyncRegistryChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"StorageKeysSyncRegistryChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"StorageKeysSyncRegistryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/storageKeys"},{"name":"StorageMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageMainService"},{"name":"StorageManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StorageManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService"},{"name":"StorageScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"strcmp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"Stream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"StreamDebugAdapter","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"streamToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"streamToBufferReadableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"streamToNodeReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"strict","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"strictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"string","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"String","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StringBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"StringDecoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"string_decoder"},{"name":"stringDiff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"StringDiffSequence","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"StringEOL","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"stringHash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"stringify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"stringify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"StringIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"StringRepresentationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"StringSHA1","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"stringToSnapshot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"stripCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"stripComments","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"stripUTF8BOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"stripWildcards","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"stub","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"styleMedia","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleMedia","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleSheet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleSheetList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SubmenuAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"SubmenuItemAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"substituteMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"SubtleCrypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SuggestAlternatives","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestAlternatives"},{"name":"SuggestController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestController"},{"name":"SuggestEnabledInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput"},{"name":"suggestFilename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"SuggestMemoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"SuggestModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"SuggestWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"suggestWidgetStatusbarMenu","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"suite","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"suiteRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"suiteSetup","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"suiteTeardown","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"super","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"SUPPORTED_CODE_ACTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"SUPPORTED_ENCODINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"SurroundSelectionCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/surroundSelectionCommand"},{"name":"SVGAElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAngle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedAngle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedBoolean","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedEnumeration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedInteger","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedLength","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedLengthList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedNumber","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedNumberList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedPreserveAspectRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedString","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedTransformList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateMotionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateTransformElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimationElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGCircleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGClipPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGComponentTransferFunctionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGCursorElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGDefsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGDescElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElementInstance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElementInstanceList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGEllipseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEBlendElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEColorMatrixElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEComponentTransferElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFECompositeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEConvolveMatrixElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDiffuseLightingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDisplacementMapElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDistantLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDropShadowElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFloodElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncAElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncBElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEGaussianBlurElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMergeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMergeNodeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMorphologyElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEOffsetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEPointLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFESpecularLightingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFESpotLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFETileElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFETurbulenceElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFilterElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGForeignObjectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGeometryElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGraphicsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLength","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLengthList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLinearGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLineElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMarkerElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMaskElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMetadataElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGNumber","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGNumberList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSeg","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegArcAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegArcRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegClosePath","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicSmoothAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicSmoothRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticSmoothAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticSmoothRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoHorizontalAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoHorizontalRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoVerticalAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoVerticalRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegMovetoAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegMovetoRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPatternElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPointList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPolygonElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPolylineElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPreserveAspectRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRadialGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGScriptElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStopElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStringList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStyleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSVGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSwitchElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSymbolElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextContentElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextPositioningElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTitleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTransform","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTransformList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTSpanElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGUnitTypes","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGUseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGViewElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGZoomAndPan","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGZoomEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"switch","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"SwitchPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"SwitchRemoteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/explorerViewItems"},{"name":"SwitchRemoteViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/explorerViewItems"},{"name":"SwitchTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SwitchTerminalActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SwitchWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"symbol","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Symbol","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SYMBOL_ICON_ARRAY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_BOOLEAN_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CLASS_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_COLOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CONSTANT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CONSTRUCTOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_ENUMERATOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_EVENT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FIELD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FILE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FOLDER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FUNCTION_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_INTERFACE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_KEY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_KEYWORD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_METHOD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_MODULE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NAMESPACE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NULL_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NUMBER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_OBJECT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_OPERATOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_PACKAGE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_PROPERTY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_REFERENCE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_SNIPPET_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_STRING_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_STRUCT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_TEXT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_TYPEPARAMETER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_UNIT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_VARIABLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SymbolInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SymbolKinds","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/symbolsQuickAccess"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"symlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"symlink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"symlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"SyncActionDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"SyncDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/descriptors"},{"name":"SyncIgnoredIconAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"SyncManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SyncResource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"SyncStatus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"SyntaxError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SyntaxKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"SyntaxRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"SystemDisabledWarningAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"systemPreferences","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TAB_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_BORDER_TOP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BORDER_TOP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TabCompletionController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/tabCompletion"},{"name":"TabFocus","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"table","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TabsTitleControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/tabsTitleControl"},{"name":"TAG","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"tail","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"tail2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"takeHeapSnapshot","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Task","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Task","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TASK_RUNNING_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"Task2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskConfigSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"TaskDefinition","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskDefinitionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskDefinitionRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskDefinitionRegistry"},{"name":"TaskDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskErrors","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskEvent","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskEventKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskExecuteKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskFilterDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskGroup","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskGroup","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskHandleDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"TaskPanelKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskPanelKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskPresentationOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskQuickPick","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"TaskRevealKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskRevealKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskRunResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugTaskRunner"},{"name":"TaskRunSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskRunType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"tasks","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TASKS_CONFIGURATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TASKS_DEFAULT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TaskScope","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskSequentializer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TaskService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskService"},{"name":"TaskService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/electron-browser/taskService"},{"name":"TaskSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskSourceKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TasksQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/tasksQuickAccess"},{"name":"tasksSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TaskStatusBarContributions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/task.contribution"},{"name":"teardown","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"TelemetryAppenderChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetryIpc"},{"name":"TelemetryAppenderClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetryIpc"},{"name":"TelemetryClient","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/TelemetryClient"},{"name":"TelemetryClient","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"TelemetryContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution"},{"name":"telemetryLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryService"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/browser/telemetryService"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/electron-browser/telemetryService"},{"name":"TelemetryType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"telemetryTypeToBaseType","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"TEMPDIR_PREFIX","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"template","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"Terminal","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"xterm"},{"name":"TERMINAL_ACTION_CATEGORY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_BORDER_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_COMMAND_ID","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_CONFIG_SECTION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_CURSOR_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_CURSOR_FOREGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_FOREGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_SELECTION_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TerminalConfigHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper"},{"name":"terminalConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalConfiguration"},{"name":"TerminalCursorStyle","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TerminalDataBufferer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalDataBuffering"},{"name":"TerminalFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalFindWidget"},{"name":"TerminalInstance","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalInstance"},{"name":"TerminalInstanceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalInstanceService"},{"name":"TerminalInstanceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService"},{"name":"TerminalLinkManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager"},{"name":"TerminalNativeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService"},{"name":"TerminalPasteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"TerminalProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalProcess"},{"name":"TerminalProcessExtHostProxy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy"},{"name":"TerminalProcessManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalProcessManager"},{"name":"TerminalQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalsQuickAccess"},{"name":"terminalSendSequenceCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"TerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalService"},{"name":"TerminalTab","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalTab"},{"name":"TerminalTaskSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem"},{"name":"TerminalValidatedLocalLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider"},{"name":"TerminalViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalView"},{"name":"TerminalWebLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalWebLinkProvider"},{"name":"TerminalWidgetManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager"},{"name":"TerminalWordLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider"},{"name":"TERMINATE_THREAD_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"TerminateResponseCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"TerminateResponseCode","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"TernarySearchTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"test","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"test","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"TEST_VIEW_CONTAINER_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"TestAccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testApplyEditsWithSyncedModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/editableTextModelTestUtils"},{"name":"TestBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestBackupMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test"},{"name":"testCase","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"TestCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"TestChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestCodeEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"TestCodeEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/editorTestServices"},{"name":"TestColorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"testCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCommand"},{"name":"TestCommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/editorTestServices"},{"name":"TestConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/testConfiguration"},{"name":"TestConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/test/common/testConfigurationService"},{"name":"TestContextService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"TestDecorationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/test/foldingModel.test"},{"name":"TestDecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestDialogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test"},{"name":"TestDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/test/common/testDialogService"},{"name":"TestDiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/test/electron-browser/diskFileService.test"},{"name":"TestEditorGroupAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorGroupsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorGroupView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestElectronService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestExperimentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test"},{"name":"TestExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test"},{"name":"TestExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/utils"},{"name":"TestFileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileIconTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"TestFilesConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/test/findController.test"},{"name":"TestHistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestInstantiationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/test/common/instantiationServiceMock"},{"name":"TestLayoutService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestListService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestNativePathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestNativeTextFileServiceWithEncodingOverrides","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestNotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"TestNotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/test/common/testNotificationService"},{"name":"TestPanelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestPathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestReadonlyTextFileEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"testRepeatedActionAndExtractPositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"testRepeatOnly","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"TestRPCProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/api/testRPCProtocol"},{"name":"TestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestServiceAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestServiceAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestServiceClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestSharedProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testTextBufferFactory","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test"},{"name":"TestTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestTextResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestTextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/services/modelService.test"},{"name":"TestTextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"TestThemeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"TestUserDataSyncUtilService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"TestView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/browser/ui/grid/util"},{"name":"TestViewletService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testViewModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/viewModel/testViewModel"},{"name":"TestViewsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestWindowConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestWorkingCopy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test"},{"name":"TestWorkingCopyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/test/common/testWorkspace"},{"name":"TestWorkspace","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/test/common/testWorkspace"},{"name":"Text","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Text","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TEXT_DIFF_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TEXT_FILE_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"TextAreaHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaHandler"},{"name":"TextAreaInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaInput"},{"name":"TextAreaState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaState"},{"name":"TextBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"textBlockQuoteBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textBlockQuoteBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextChange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textChange"},{"name":"textCodeBlockBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextCompareEditorActiveContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextCompareEditorVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextDecoder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextDecoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TextDecoderStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textDiffEditor"},{"name":"TextDiffEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/textDiffEditorModel"},{"name":"TextDocumentSaveReason","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextDocumentSaveReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextDocumentSaveReason","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEdit","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"TextEditElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"TextEditorCursorBlinkingStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"TextEditorCursorBlinkingStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TextEditorDecorationType","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"TextEditorEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"TextEditorLineNumbersStyle","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorLineNumbersStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorLineNumbersStyle","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextEditorOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorSelectionChangeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorSelectionChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorSelectionRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"TextEditorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/browser/history"},{"name":"TextEncoder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextEncoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TextEncoderStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextFileContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"TextFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileEditor"},{"name":"TextFileEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileEditorModel"},{"name":"TextFileEditorModelManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileEditorModelManager"},{"name":"TextFileEditorModelState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileEditorTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileEditorTracker"},{"name":"TextFileLoadReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileOperationError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileOperationResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileSaveErrorHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"TextFileSaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileSaveParticipant"},{"name":"TextInputActionsProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/textInputActions"},{"name":"textLinkActiveForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textLinkForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textmateColorGroupSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"textmateColorSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"textmateColorsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"TextMateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/browser/textMateService"},{"name":"TextMateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateService"},{"name":"TextmateSnippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TextMateWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateWorker"},{"name":"TextMateWorkerHost","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateService"},{"name":"TextMetrics","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"TextModelCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"TextModelResolvedOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"TextModelResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textmodelResolver/common/textModelResolverService"},{"name":"TextModelSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"TextModelTokenization","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelTokens"},{"name":"textPreformatForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationServiceImpl"},{"name":"TextResourceEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textResourceEditor"},{"name":"TextResourceEditorInput","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textresourceProperties/common/textResourcePropertiesService"},{"name":"TextSearchEngineAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/textSearchAdapter"},{"name":"TextSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"TextSearchMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"TextSearchResultsCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"textSeparatorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextSnapshotReadable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackCueList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Themable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemableDecorationAttachmentRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ThemableDecorationRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ThemeColor","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ThemeColor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"themeColorFromId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemeConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"ThemeIcon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ThemeIcon","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemeIcon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ThemeMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/electron-main/themeMainService"},{"name":"ThemeRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"ThemeRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMHelper"},{"name":"ThemeSettings","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"ThemeTrieElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ThemeTrieElementRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"this","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Thread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ThreadAndSessionIds","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"threadId","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"throttle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"ThrottledDelayer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Throttler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"throw","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"throwDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"throwProposedApiError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"throws","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"tildify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"time","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimeBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"timeEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timeline","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimelineElementTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"timelineEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimelineFollowActiveEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TimelineItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TimelineKeyboardNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineListVirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelinePane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelinePaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timeline.contribution"},{"name":"TimelinePaneId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"TimelineService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timelineService"},{"name":"timeLog","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TIMEOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"TimeoutTimer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TimeRanges","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"timeStamp","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timingSafeEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"title","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"TITLE_BAR_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TitlebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/titlebarPart"},{"name":"TitlebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart"},{"name":"TitleCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"TitleControl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/titleControl"},{"name":"TitleEventSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TLSSocket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"TMGrammarFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMGrammarFactory"},{"name":"tmpdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"TMScopeRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMScopeRegistry"},{"name":"toASCII","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"toBackupWorkspaceResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/electron-browser/backup"},{"name":"toBufferOrReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"toCanonicalName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"tocData","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"TOCRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"TOCTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"TOCTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"toDecodeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"toDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"toErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorMessage"},{"name":"toExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"toExtensionDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"toFileChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/watcher"},{"name":"toFileOperationResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"toFileSystemProviderErrorCode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"TOGGLE_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_CONDITIONAL_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_DIFF_IGNORE_TRIM_WHITESPACE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"TOGGLE_DIFF_SIDE_BY_SIDE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"TOGGLE_IGNORE_EXTENSION_ACTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"TOGGLE_INLINE_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"TOGGLE_LOG_POINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"TOGGLE_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ToggleActivityBarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleAutoSaveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ToggleAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ToggleBreakpointsActivatedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"toggleCaseSensitiveCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleCaseSensitiveCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleCaseSensitiveKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"toggleClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"ToggleCollapseAndExpandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"toggleCollapseState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"ToggleColumnSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection"},{"name":"ToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ToggleDevToolsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ToggleEditorLayoutAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleEditorVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleGroupSizesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ToggleHighContrastNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"ToggleMaximizedPanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"ToggleMenuBarAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleMinimapAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleMinimap"},{"name":"ToggleMultiCursorModifierAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier"},{"name":"TogglePanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"ToggleReactionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"toggleRegexCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleRegexCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleRegexKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleRenderControlCharacterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter"},{"name":"ToggleRenderWhitespaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace"},{"name":"toggleSearchEditorCaseSensitiveCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorCaseSensitiveCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorContextLinesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorRegexCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorRegexCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorWholeWordCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorWholeWordCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"ToggleSearchOnTypeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleSearchScopeKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleSharedProcessAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ToggleSidebarPositionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleSidebarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleStatusbarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleTabFocusModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode"},{"name":"ToggleTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"ToggleViewAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ToggleViewModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"toggleWholeWordCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleWholeWordCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleWholeWordKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleWindowTabsBarHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"Token","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"Token","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TOKEN_TYPE_WILDCARD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenClassificationExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/tokenClassificationExtensionPoint"},{"name":"TokenizationRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TokenizationRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/tokenizationRegistry"},{"name":"TokenizationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"TokenizationResult2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"TokenizationStateStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelTokens"},{"name":"TokenizationSupport2Adapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"tokenize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"tokenizeLineToHTML","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/textToHtmlTokenizer"},{"name":"tokenizeToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/textToHtmlTokenizer"},{"name":"TokenMetadata","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TokensStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"TokensStore2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"TokenStyle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenStylingRule","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"tokenStylingSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"TokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"toKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"toLocalISOString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/date"},{"name":"toLocalResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"toMultilineTokens2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"toNamespacedPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"toNodeEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"toolbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ToolBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/toolbar/toolbar"},{"name":"TOOLTIP_HOVER_THRESHOLD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"TooltipWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"toOverrides","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"top","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"top","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"topAsync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"toReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"toResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"toResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"toSlashes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"toStandardTokenType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"toStoreData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"toStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"toString","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"totalmem","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"Touch","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Touch","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"TouchBar","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarButton","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarColorPicker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarGroup","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarLabel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarPopover","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarScrubber","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSegmentedControl","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSlider","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSpacer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TouchList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"toUint32","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"toUint8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"toUnicode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"toValuesTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"toWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"toWorkspaceFolders","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"toWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"trace","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"traceDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"traceProcessWarnings","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"TrackedRangeStickiness","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"TrackedRangeStickiness","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"trackFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"transcode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"transform","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"Transform","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"Transform","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TransformableMarker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"transformAndReviveIncomingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"transformErrorForSerialization","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"transformIncomingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"transformOutgoingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"TransformStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TransitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Translations","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionPoints"},{"name":"translationsConfigFile","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"transparent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TransposeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"Tray","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TreeDragOverBubble","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeDragOverReactions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"TreeError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"treeIndentGuidesStroke","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TreeItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TreeItem2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TreeMouseEventTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"TreeResourceNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"TreeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"TreeViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"TreeVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeWalker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TRIGGER_RENAME_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"TriggerAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/pickerQuickAccess"},{"name":"triggerAsyncId","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"triggerDownload","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"TriggerParameterHintsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHints"},{"name":"Triggers","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TriggerSuggestAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestController"},{"name":"trim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"TrimFinalNewLinesParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"trimTrailingWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/trimTrailingWhitespaceCommand"},{"name":"TrimTrailingWhitespaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"TrimTrailingWhitespaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/trimTrailingWhitespaceCommand"},{"name":"TrimWhitespaceParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"true","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"trueMachineIdKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"truncate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"truncate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"truncateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"TRUSTED_DOMAINS_CONTENT_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"TRUSTED_DOMAINS_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"TrustedDomainsFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsFileSystemProvider"},{"name":"try","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"TunnelCloseableContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelDto","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"TunnelFactoryContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/tunnelFactory"},{"name":"TunnelModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"TunnelPanel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelPanelDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/tunnelService"},{"name":"TunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/node/tunnelService"},{"name":"TunnelType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"TunnelTypeContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"twistiePixels","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"type","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"type","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Type","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/lineCommentCommand"},{"name":"typeAndModifierIdPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TypeDefinitionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TypeError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"typeof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"TypeOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorTypeOperations"},{"name":"types","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TypeWithAutoClosingCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorTypeOperations"},{"name":"ucs2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"UIEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"UIKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"UIKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"UILabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"Uint16Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8ClampedArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8Matrix","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"umask","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"undefined","kind":"var","kindModifiers":"","sortText":"4"},{"name":"UndoIgnoreExtensionRecommendationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UndoRedoElementType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedo"},{"name":"UndoRedoService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedoService"},{"name":"UndoWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"unescape","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"unescape","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"Unicode11Addon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-unicode11/typings/xterm-addon-unicode11"},{"name":"unicodeEscapesToPCRE2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"UninstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"unique","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"uniqueFilter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"unknown","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"UNKNOWN_SOURCE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"UnknownExtensionRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"unlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"unlink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"unlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"UnloadReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"unmnemonicLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"untildify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"UNTITLED_WORKSPACE_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"UntitledTextEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorInput"},{"name":"UntitledTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorModel"},{"name":"UntitledTextEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorService"},{"name":"unwatchFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"unzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"unzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"UpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UpdateAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UpdateChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateIpc"},{"name":"updateColorThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"UpdateContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"updateFileIconThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"updateIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"updateProblemMatchers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v2"},{"name":"updateProductIconThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"updateTreeMetadata","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"UpdateType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"updateViewTypeSchema","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"UpperCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"uppercaseFirstLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"uptime","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"uptime","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Uri","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Uri","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"URI","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"URIError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"UriIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"uriToFsPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uri"},{"name":"URITransformer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"URITransformerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUriTransformerService"},{"name":"url","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"URL","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"URL","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"URLHandlerChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLHandlerChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLHandlerRouter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLSearchParams","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"URLSearchParams","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"URLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/node/urlService"},{"name":"USE_ICACLS","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"USE_SPLIT_JSON_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"useFakeTimers","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"useFakeXMLHttpRequest","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"USER_DATA_SYNC_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"USER_MANIFEST_CACHE_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"USER_STANDALONE_CONFIGURATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"USER_TASKS_GROUP_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskService"},{"name":"userAgent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"UserConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"UserDataAutoSyncChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userDataSync/electron-browser/userDataAutoSyncService"},{"name":"UserDataSycnUtilServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"UserDataSyncBackupStoreService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncBackupStoreService"},{"name":"UserDataSyncChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"UserDataSyncEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncEnablementService"},{"name":"UserDataSyncError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"UserDataSyncErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"userDataSyncLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"UserDataSyncLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncLog"},{"name":"UserDataSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncService"},{"name":"UserDataSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService"},{"name":"UserDataSyncStoreError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"UserDataSyncStoreService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncStoreService"},{"name":"UserDataSyncTestServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"UserDataSyncTrigger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger"},{"name":"UserDataSyncUtilServiceClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncViewContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncView"},{"name":"UserDataSyncWorkbenchContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync"},{"name":"userInfo","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"UserSettings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"UserSettingsLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"UserSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"userSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"useSlashForPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"USLayoutResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding"},{"name":"USUAL_WORD_SEPARATORS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"UTF16be","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16be_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16le","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16le_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8_BOM_CHARACTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"UTF8_with_bom","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"utimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"utimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"UV_UDP_REUSEADDR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"V4MAPPED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"valid","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ValidAnnotatedEditOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"validateConstraint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"validateConstraints","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"ValidatedEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"validateFileName","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"validateFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"validatePaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/paths"},{"name":"validateProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"validateTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"ValidationState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"ValidationStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"ValidityState","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"validRange","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"values","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"values","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"var","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Variable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"Variable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"VARIABLES_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"VariablesDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"variableSetEmitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"VariablesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"VariablesView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"verbose","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"Verbose","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"Verbosity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"VerifiedTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem"},{"name":"verify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"Verify","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"version","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"version","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"version","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"version","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"versions","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"VerticalRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"VerticalScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/verticalScrollbar"},{"name":"VideoPlaybackQuality","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"View","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewImpl"},{"name":"VIEW_CONTAINER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"ViewColumn","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ViewColumn","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ViewColumn","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"viewColumnToEditorGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/editor"},{"name":"ViewConfigurationChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewContainerLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"ViewContentPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"ViewContentSizeChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewContentWidgets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets"},{"name":"ViewContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewContext"},{"name":"ViewController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewController"},{"name":"ViewCursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewCursors/viewCursor"},{"name":"ViewCursors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewCursors/viewCursors"},{"name":"ViewCursorStateChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewDecorationsChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewDescriptorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/views/browser/viewDescriptorService"},{"name":"ViewEventDispatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEventDispatcher"},{"name":"ViewEventEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewEventHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewEventHandler"},{"name":"ViewEventsCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewFlushedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewFocusChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewIdentifierMap","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewLanguageConfigurationEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLayout"},{"name":"Viewlet","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/remote.contribution"},{"name":"ViewletActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ViewletDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ViewletRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ViewLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"ViewLineData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewLineMappingChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLineOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"ViewLineRenderingData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewLines","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLines"},{"name":"ViewLinesChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLinesDeletedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLinesInsertedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLineToken","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewLineTokenFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewMenuActions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewMenuActions"},{"name":"ViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModelImpl"},{"name":"ViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugViewModel"},{"name":"ViewModelDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewModelDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModelDecorations"},{"name":"ViewOutgoingEvents","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOutgoingEvents"},{"name":"ViewOverlayLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ViewOverlayWidgets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets"},{"name":"ViewPane","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewPaneContainer"},{"name":"ViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewPaneContainer"},{"name":"ViewPart","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"Viewport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewportData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLinesViewportData"},{"name":"ViewQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"ViewRevealRangeRequestEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"viewsContainersContribution","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/viewsExtensionPoint"},{"name":"ViewScrollChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"ViewsWelcomeContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution"},{"name":"viewsWelcomeExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewsWelcomeExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewThemeChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewTokensChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewTokensColorsChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"viewTypeSchamaAddition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"ViewZoneDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"ViewZones","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewZones/viewZones"},{"name":"ViewZonesChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"VirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"VirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"virtualMachineHint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/id"},{"name":"VirualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"VisibleLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewLayer"},{"name":"VisibleRanges","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"visit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"void","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"VRDisplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRDisplayCapabilities","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRDisplayEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VREyeParameters","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRFieldOfView","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRFrameData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRPose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"vs","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"vs_code_editor_walkthrough","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/vs_code_editor_walkthrough"},{"name":"vs_code_welcome_page","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page"},{"name":"vs_dark","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"VS_DARK_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VS_HC_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VS_LIGHT_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VSBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"VTTCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VTTRegion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"W_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WAIT_BETWEEN_RESEND","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"WALK_THROUGH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"WalkThroughArrowDown","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughArrowUp","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider"},{"name":"WalkThroughInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput"},{"name":"WalkThroughModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput"},{"name":"WalkThroughPageDown","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughPageUp","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions"},{"name":"WalkThroughPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart"},{"name":"WalkThroughSnippetContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider"},{"name":"warn","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Warning","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"watch","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"watch","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/chokidar/types/index"},{"name":"WATCH_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"WatcherChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherIpc"},{"name":"WatcherChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherIpc"},{"name":"WatcherChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherIpc"},{"name":"WatcherChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherIpc"},{"name":"WatchExpressionsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/watchExpressionsView"},{"name":"WatchExpressionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/watchExpressionsView"},{"name":"watchFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"watchFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"watchFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"WatchingProblemCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"WatermarkContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/watermark/browser/watermark"},{"name":"WaveShaperNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WeakMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WeakMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"WeakSet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebAssembly","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"WebAuthentication","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebAuthnAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webContents","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebContents","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"webFrame","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebGL2RenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLActiveInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebglAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-webgl/typings/xterm-addon-webgl"},{"name":"WebGLBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLContextEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLFramebuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLObject","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLProgram","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLQuery","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLRenderbuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLRenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLSampler","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLShader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLShaderPrecisionFormat","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLSync","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLTexture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLTransformFeedback","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLUniformLocation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLVertexArrayObject","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebIssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/browser/issueService"},{"name":"webkitCancelAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitConvertPointFromNodeToPage","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitConvertPointFromPageToNode","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"WebKitCSSMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebKitPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webkitRequestAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitRTCPeerConnection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webkitURL","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebLinksAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-web-links/typings/xterm-addon-web-links"},{"name":"WebRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebResourceIdentityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/common/resourceIdentityService"},{"name":"WebSocket","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebSocketNodeSocket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"WebTelemetryAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/browser/telemetryService"},{"name":"webviewDeveloperCategory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"WebviewEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditor"},{"name":"WebviewEditorCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"WebViewEditorFindNextCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"WebViewEditorFindPreviousCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"WebviewEditorInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory"},{"name":"WebviewEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"WebviewFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewFindWidget"},{"name":"webviewHasOwnEditFunctionsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"webviewHasOwnEditFunctionsContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"WebviewIconManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewIconManager"},{"name":"WebviewInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInput"},{"name":"WebviewMessageChannels","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/baseWebviewElement"},{"name":"WebviewPortMappingManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/portMapping"},{"name":"WebviewResourceResponse","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"WebviewResourceScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"WebviewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewService"},{"name":"webviewTag","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebviewThemeDataProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/themeing"},{"name":"WebWorkerExtensionHostStarter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter"},{"name":"WelcomeInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomeOverlayAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay"},{"name":"WelcomePageAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"welcomePageBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomePageContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/welcomeView"},{"name":"WheelEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"whenDeleted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"whenProviderRegistered","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"while","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"WholeWordsCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"Widget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/widget"},{"name":"widgetShadow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"WidgetVerticalAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager"},{"name":"WillSaveStateReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"win32","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"win32","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"win32","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"Win32UpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.win32"},{"name":"window","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"window","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Window","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WINDOW_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WINDOW_INACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WindowDriverChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverRegistryChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverRegistryChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windows"},{"name":"windowOpenNoOpener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"windowSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"WindowsExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"WindowsKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"windowsKeyboardMappingEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"WindowsMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsMainService"},{"name":"WindowsNativeResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"WindowsShellHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/windowsShellHelper"},{"name":"WindowsShellType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"windowsStore","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Winreg","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"with","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"withEditorModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/editorTestUtils"},{"name":"withFormatting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"withNullAsUndefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"withTestCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"withTestNotebook","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"withUndefinedAsNull","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"WordCharacterClass","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"WordCharacterClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"WordContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/wordContextKey"},{"name":"WordDistance","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/wordDistance"},{"name":"WordLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"WordNavigationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordPartLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"WordPartOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordPartRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"WordRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"WordSelectionRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/wordSelections"},{"name":"Workbench","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/workbench"},{"name":"WORKBENCH_BACKGROUND","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WorkbenchAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchColorsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"WorkbenchCompressibleAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchCompressibleObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchConfigurationNodeBase","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/configuration"},{"name":"WorkbenchContextKeysHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkbenchDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchInstantiationService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"workbenchInstantiationService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"WorkbenchIssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueService"},{"name":"WorkbenchKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keybindingService"},{"name":"WorkbenchList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListAutomaticKeyboardNavigation","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListAutomaticKeyboardNavigationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListDoubleSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListFocusContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListHasSelectionOrFocus","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListMultiSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListSupportsKeyboardNavigation","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListSupportsMultiSelectContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchModeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/mode/common/workbenchModeService"},{"name":"WorkbenchObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchPagedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchReferencesController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch"},{"name":"WorkbenchState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WorkbenchStateContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkbenchThemeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/workbenchThemeService"},{"name":"worker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"Worker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Worker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"Worker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"workerData","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"WorkerExtHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"WorkerExtHostTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"WorkerExtHostTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"workers","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"WorkingCopyCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"WorkingCopyFileOperationParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant"},{"name":"WorkingCopyFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileService"},{"name":"WorkingCopyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"Worklet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"workspace","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Workspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WORKSPACE_EXTENSION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"WORKSPACE_FILTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"WORKSPACE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WORKSPACE_STANDALONE_CONFIGURATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WorkspaceBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"WorkspaceChangeExtHostRelauncher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution"},{"name":"WorkspaceConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"WorkspaceConfigurationEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"WorkspaceConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"WorkspaceEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"WorkspaceEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"WorkspaceEdit","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"WorkspaceFileEdit","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"WorkspaceFolder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WorkspaceFolderCountContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkspaceRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations"},{"name":"WorkspaceRecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"WorkspaceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configurationService"},{"name":"WorkspaceSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"workspaceSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WorkspacesHistoryMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService"},{"name":"WorkspacesMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"WorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesService"},{"name":"WorkspaceSymbol","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"WorkspaceSymbolProviderRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"WorkspaceTags","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"WorkspaceTagsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTagsService"},{"name":"WorkspaceTextEdit","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"WorkspaceWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/workspaceWatcher"},{"name":"wrap","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"WrappingIndent","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"WrappingIndent","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"wrapWithCorrelationContext","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"Writable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"WritableStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"write","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"writeFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFileSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"writeHeapSnapshot","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"writeProfile","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"writer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"WriteStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"WriteStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"writeSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeTransientState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleWordWrap"},{"name":"writeUInt16LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt32BE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt32LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writev","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writevSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"WSA_E_CANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSA_E_NO_MORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEACCES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEADDRINUSE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEADDRNOTAVAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEAFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEALREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEBADF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNABORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDESTADDRREQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDISCON","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDQUOT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEFAULT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEHOSTDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEHOSTUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINPROGRESS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVAL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVALIDPROCTABLE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVALIDPROVIDER","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEISCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAELOOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEMFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEMSGSIZE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENAMETOOLONG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOBUFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOMORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOPROTOOPT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTEMPTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEOPNOTSUPP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROCLIM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROTONOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROTOTYPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROVIDERFAILEDINIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEREMOTE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESHUTDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESOCKTNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESTALE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAETIMEDOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAETOOMANYREFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEUSERS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEWOULDBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSANOTINITIALISED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASERVICE_NOT_FOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASYSCALLFAILURE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASYSNOTREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSATYPE_NOT_FOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAVERNOTSUPPORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"X_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"x01","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x02","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x03","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x04","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x05","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x06","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x07","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x08","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x09","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x10","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x11","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x12","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x13","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x14","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x15","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x16","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x17","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x18","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x19","kind":"const","kindModifiers":"","sortText":"4"},{"name":"xdescribe","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"xdgRuntimeDir","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"xit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLDocument","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequestEventTarget","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequestUpload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLSerializer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathEvaluator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathExpression","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathResult","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XSLTProcessor","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"yield","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Z_ASCII","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BEST_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BEST_SPEED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BINARY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BUF_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DATA_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFAULT_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFAULT_STRATEGY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFLATED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_ERRNO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FILTERED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FINISH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FIXED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FULL_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_HUFFMAN_ONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_MEM_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NEED_DICT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NO_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NO_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_PARTIAL_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_RLE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_STREAM_END","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_STREAM_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_SYNC_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_TEXT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_TREES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_UNKNOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_VERSION_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"zip","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"ZipFile","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"ZipFile","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yazl/index"},{"name":"ZoneWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"ZoomInAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ZoomOutAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ZoomResetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"}]}}'; +export const _$_$_expensive = '{"seq":0,"type":"response","command":"completionInfo","request_seq":956,"success":true,"body":{"isGlobalCompletion":true,"isMemberCompletion":false,"isNewIdentifierLocation":false,"entries":[{"name":"__dirname","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"__filename","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"_getInstrumentationKey","kind":"method","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"_util","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"$","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"abort","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"AbortController","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbortSignal","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbstractCaseAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractCodeEditorService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/abstractCodeEditorService"},{"name":"AbstractCommandsQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/commandsQuickAccess"},{"name":"AbstractConfigureRecommendedExtensionsAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"AbstractContextKeyService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"AbstractDebugAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"AbstractDebugAdapter","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/abstractDebugAdapter"},{"name":"AbstractDeleteAllToBoundaryAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractEditorCommandsQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/commandsQuickAccess"},{"name":"AbstractEditorNavigationQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/editorNavigationQuickAccess"},{"name":"AbstractExpressionsRenderer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"AbstractExtensionService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService"},{"name":"AbstractExtHostExtensionService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"AbstractExtHostOutputChannel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"AbstractFileDialogService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/abstractFileDialogService"},{"name":"AbstractFileOutputChannelModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"AbstractFileSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractGotoLineQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/gotoLineQuickAccess"},{"name":"AbstractGotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/quickAccess/gotoSymbolQuickAccess"},{"name":"AbstractJsonFileSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractKeybindingService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/abstractKeybindingService"},{"name":"AbstractLifecycleService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycleService"},{"name":"AbstractLineHighlightOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"AbstractLogService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"AbstractPathService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/common/pathService"},{"name":"AbstractProblemCollector","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"AbstractProcess","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"AbstractRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AbstractRemoteAgentService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/abstractRemoteAgentService"},{"name":"AbstractScrollableElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"AbstractScrollbar","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/abstractScrollbar"},{"name":"AbstractSearchAndReplaceAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"AbstractSettingRenderer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"AbstractSettingsModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"AbstractShowReleaseNotesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"AbstractSortLinesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"AbstractSynchroniser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/abstractSynchronizer"},{"name":"AbstractTaskService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/abstractTaskService"},{"name":"AbstractTelemetryOptOut","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut"},{"name":"AbstractTextFileService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/browser/textFileService"},{"name":"AbstractTextMateService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/browser/abstractTextMateService"},{"name":"AbstractTextResourceEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textResourceEditor"},{"name":"AbstractTree","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"AbstractTunnelService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/tunnelService"},{"name":"AbstractUpdateService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/abstractUpdateService"},{"name":"AbstractURLService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlService"},{"name":"AbstractVariableResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/variableResolver"},{"name":"AbstractWorkspaceEditingService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService"},{"name":"Accelerator","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"acceptLocalChangesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"access","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"AccessibilityHelpNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"AccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"AccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"AccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibilityService"},{"name":"AccessibilitySupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"AccessibilitySupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"accessSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"AccountsActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ACL_IDENTITY","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"ACLED_DIRECTORIES","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"Action","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"Action2","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ActionBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"actions","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vscode-nsfw"},{"name":"ActionsOrientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"ActivatedExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ActivationTimes","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ACTIVE_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"activeContrastBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ActiveEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupEmptyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupIndexContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorGroupLastContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveEditorIsReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"ActiveGroupEditorsByMostRecentlyUsedQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"ActivePanelContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"ActiveViewletContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"ActiveWindowManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/activeWindowTracker"},{"name":"ACTIVITY_BAR_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_ACTIVE_FOCUS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BADGE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BADGE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ACTIVITY_BAR_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ActivitybarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarPart"},{"name":"ActivityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/browser/activityService"},{"name":"ActivityUpdater","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"ADD_CONFIGURATION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"ADD_ROOT_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"ADD_ROOT_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"addArg","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"addClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addClasses","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addContextToEditorMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchHelpers"},{"name":"AddCursorsAtSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"addDisposableGenericMouseDownListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableGenericMouseMoveListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableGenericMouseUpListner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableNonBubblingMouseOutListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableNonBubblingPointerOutListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addDisposableThrottledListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addEventListener","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"AddFunctionBreakpointAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"addListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"addListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ADDRCONFIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"ADDRGETNETWORKPARAMS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"AddRootFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"AddSelectionToNextFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"AddSelectionToPreviousFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"addSetting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"addStandardDisposableGenericMouseDownListner","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addStandardDisposableGenericMouseUpListner","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addStandardDisposableListener","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"addTerminalEnvironmentKeys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"addToValueTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"AddToWorkspaceFolderRecommendationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"AddToWorkspaceRecommendationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"addTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"AddWatchExpressionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"adoptToGalleryExtensionId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"after","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"afterEach","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Agent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"Agent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"Aggregation","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"alert","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"alert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"alertFormattingEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"ALL_SYNC_RESOURCES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"allCharCodes","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"AllEditorsByAppearanceQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"AllEditorsByMostRecentlyUsedQuickAccess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"AllKeysConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"allowedNodeEnvironmentFlags","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"allowSetForegroundWindow","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-foreground-love/index"},{"name":"allSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ALPN_ENABLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"AnalyserNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnchorAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"anchorGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"AnchorPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"animate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Animation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationEffect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationPlaybackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AnimationTimeline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ansiColorIdentifiers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"ansiColorMap","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"any","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"anyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"AnythingQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/anythingQuickAccess"},{"name":"ApiCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ApiCommandArgument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ApiCommandResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"app","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"append","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"appendEditorTitleContextMenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions.contribution"},{"name":"appendFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"appendFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"appendKeyBindingLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"appendStylizedStringToContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"appendStylizedStringToContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"appendToCommandPalette","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions.contribution"},{"name":"AppInsightsAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/appInsightsAppender"},{"name":"applicationCache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ApplicationCache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"applicationSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"applyCodeAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"applyConfigurationValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"applyDeprecatedVariableMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolverUtils"},{"name":"applyDragImage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"applyEdit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"applyEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"ApplyEditsResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"ApplyToKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"appVersion","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"arch","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"arch","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"areFunctions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"areKeyboardLayoutsEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"areSame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"areSameExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"areWebviewInputOptionsEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"argv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"argv0","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"AriaLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ArrayBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"arrayInsert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"ArrayNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/navigator"},{"name":"ARROW_IMG_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarArrow"},{"name":"as","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"asArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"AsbtractOutputChannelModelService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"asCSSUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"asDomUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"asJson","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"asPromise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"assert","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"assertAllDefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"AssertDocumentLineMappingDirection","kind":"enum","kindModifiers":"","sortText":"0"},{"name":"assertEqualQueries","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"assertEqualSearchPathResults","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"AssertionError","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"assertIsDefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"assertMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveKeyboardEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"assertResolveUserBinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"asserts","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"assertSyncedModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/editableTextModelTestUtils"},{"name":"assertType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"assign","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"asText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"asWebviewUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/webview"},{"name":"async","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"AsyncDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"AsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/asyncDataTree"},{"name":"AsyncEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"AsyncResource","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"atob","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Atomics","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"attachBadgeStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachBreadcrumbsStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachButtonStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachCheckboxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachDialogStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachFindReplaceInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachLinkStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachListStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachMenuStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachProgressBarStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachQuickInputStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachSelectBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachStylerCallback","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"attachSuggestEnabledInputBoxStyler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput"},{"name":"Attr","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Audio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioBufferSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioDestinationNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioListener","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioParam","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioParamMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioProcessingEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioScheduledSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioWorklet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AudioWorkletNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"authentication","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"AuthenticationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/browser/authenticationService"},{"name":"AuthenticationTokenService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount"},{"name":"AuthenticationTokenService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/electron-browser/authenticationTokenService"},{"name":"AuthenticationTokenServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccountIpc"},{"name":"AuthenticatorAssertionResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthenticatorAttestationResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthenticatorResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"AuthStatus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"AutoCheckUpdatesConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"AutoFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"AutoIndentOnPaste","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"AutoIndentOnPasteCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"automaticKeyboardNavigationSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"AutoSaveAfterShortDelayContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"AutoSaveConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"AutoSaveMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"AutoUpdateConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"autoUpdater","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"AvailabilityData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/AvailabilityData"},{"name":"AvailabilityData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"AverageBufferSize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"await","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"BackLayerWebView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView"},{"name":"BackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"BackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/node/backupFileService"},{"name":"BackupFilesModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"BackupMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backupMainService"},{"name":"BackupRestorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/common/backupRestorer"},{"name":"BACKUPS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/common/environment"},{"name":"BackupTracker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/common/backupTracker"},{"name":"BADFAMILY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADFLAGS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"badgeBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"badgeForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BADHINTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADNAME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADQUERY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADRESP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BADSTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"BareFontInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/fontInfo"},{"name":"BarProp","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Barrier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Base","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Base"},{"name":"Base","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"BaseActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"BaseAudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BaseBinaryResourceEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/binaryEditor"},{"name":"BaseBreakpoint","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"BaseCellViewModel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel"},{"name":"BaseCloseAllAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseConfigurationResolverService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/browser/configurationResolverService"},{"name":"BaseCreateEditorGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseDropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"BaseEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/baseEditor"},{"name":"BaseEditorQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorQuickAccess"},{"name":"BaseErrorTelemetry","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/errorTelemetry"},{"name":"BaseExtHostTerminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"BaseExtHostTerminalService","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"BaseFocusGroupAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseMoveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"basename","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"basename","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"basename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"basenameOrAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"BaseNavigateEditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseQuickAccessEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseQuickAccessNavigateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/quickAccessActions"},{"name":"BaseResizeViewAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"BaseResolvedKeybinding","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/baseResolvedKeybinding"},{"name":"BaseSaveAllAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"BaseSplitEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"BaseSwitchWindow","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"BaseTextEditor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textEditor"},{"name":"BaseTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/textEditorModel"},{"name":"baseTypeToTelemetryType","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"BaseWebview","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/baseWebviewElement"},{"name":"BaseWindowDriver","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/browser/baseDriver"},{"name":"BaseZoomAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"BasicInplaceReplace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/inplaceReplaceSupport"},{"name":"BatchedCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"before","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"beforeEach","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"BeforeUnloadEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BenchmarkSuite","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/benchmark/benchmarkUtils"},{"name":"BetterMergeId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"BhxBrowser","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"bigint","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"BigInt","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BigInt64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BigIntStats","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"BigUint64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BINARY_DIFF_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"BINARY_FILE_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"BinaryEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/binaryEditorModel"},{"name":"BinaryFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor"},{"name":"BinaryResourceDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/binaryDiffEditor"},{"name":"binarySearch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"BiquadFilterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Blob","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BlockCommentCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/blockCommentCommand"},{"name":"blur","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"boolean","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Boolean","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"BooleanEventEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"BOTTOM_CELL_TOOLBAR_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"BoundModelReferenceCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocuments"},{"name":"BracesHidingRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"BracketElectricCharacterSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/electricCharacter"},{"name":"BracketMatchingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/bracketMatching/bracketMatching"},{"name":"BracketSelectionRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/bracketSelections"},{"name":"BracketsUtils","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"breadcrumbsActiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"breadcrumbsBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsConfig","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"BreadcrumbsControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsControl"},{"name":"BreadcrumbsFilePicker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"breadcrumbsFocusForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"breadcrumbsForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsItem","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"BreadcrumbsOutlinePicker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"BreadcrumbsPicker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"breadcrumbsPickerBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"BreadcrumbsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"BreadcrumbsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"break","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"breakBetweenGraphemeBreakType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Breakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Breakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Breakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"BREAKPOINT_EDITOR_CONTRIBUTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"BreakpointEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution"},{"name":"BREAKPOINTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"breakpointsExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"BreakpointsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"BreakpointWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointWidget"},{"name":"BreakpointWidgetContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"BroadcastChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"brotliCompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliCompressSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliDecompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"brotliDecompressSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"BrowserBackupTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/browser/backupTracker"},{"name":"BrowserClipboardService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/clipboard/browser/clipboardService"},{"name":"BrowserCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/browser/credentialsService"},{"name":"BrowserEnvironmentConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/browser/environmentService"},{"name":"BrowserFeatures","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/canIUse"},{"name":"BrowserHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/browser/browserHostService"},{"name":"BrowserIntegrityServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/browser/integrityService"},{"name":"BrowserKeyboardMapperFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keymapService"},{"name":"BrowserKeyboardMapperFactoryBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keymapService"},{"name":"BrowserLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/lifecycle/browser/lifecycleService"},{"name":"BrowserPathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/browser/pathService"},{"name":"BrowserRequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/request/browser/requestService"},{"name":"BrowserResizeObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/sizeObserver"},{"name":"BrowserSocketFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/browserSocketFactory"},{"name":"BrowserStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/browser/storageService"},{"name":"BrowserTelemetryOptOut","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut"},{"name":"BrowserTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/browser/browserTextFileService"},{"name":"BrowserUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/update/browser/updateService"},{"name":"BrowserURLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/url/browser/urlService"},{"name":"BrowserView","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWindow","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWindowProxy","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"BrowserWorkbenchEnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/browser/environmentService"},{"name":"BrowserWorkspaceEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspaceEditingService"},{"name":"BrowserWorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspacesService"},{"name":"btoa","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"buffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"Buffer","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"Buffer","kind":"alias","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"BufferedEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"BufferLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/bufferLog"},{"name":"BufferredOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"bufferToReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"bufferToStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"buildHelpMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"buildRegexParseError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"buildReplaceStringWithCasePreserved","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/search"},{"name":"buildTelemetryMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetry"},{"name":"buildVersionMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"BUILTIN_MANIFEST_CACHE_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"BuiltInBasicsExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"BuiltInExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"builtinModules","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"BuiltInThemesExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"BulkCategory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkEditAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditNaviLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkEditPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane"},{"name":"BulkEditPreviewProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkEditService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/bulkEdit/browser/bulkEditService"},{"name":"BulkEditSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"BulkFileOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkFileOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkFileOperationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"BulkTextEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"Button","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/button/button"},{"name":"buttonBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"buttonBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"buttonForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ButtonGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/button/button"},{"name":"buttonHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"buttonHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"ByteLengthQueuingStrategy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cache","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cache"},{"name":"Cache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/cache"},{"name":"cached","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"cachedDataVersionTag","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"CachedExtensionScanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner"},{"name":"CachedKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keyboardMapper"},{"name":"CachedListVirtualDelegate","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"cachedStringRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/shiftCommand"},{"name":"caches","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CacheStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"calcANSI8bitColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"calcANSI8bitColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"calculateLF","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"calculateSize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"Call","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"callbackify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"CallHierarchyDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyIncomingCall","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyIncomingCall","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyIncomingCall","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyItem","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyOutgoingCall","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CallHierarchyOutgoingCall","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CallHierarchyOutgoingCall","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CallHierarchyProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/common/callHierarchy"},{"name":"CallHierarchyTreePeekWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek"},{"name":"CallRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"CALLSTACK_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CallStackEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackEditorContribution"},{"name":"CallStackView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"CancelActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"cancelAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"CancelCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"canceled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"CancellationToken","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cancellation"},{"name":"CancellationTokenSource","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/cancellation"},{"name":"CancellationTokenSource","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"CANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"CancelSearchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"canExecuteOnUI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canExecuteOnWeb","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canExecuteOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"canNormalize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"CanvasGradient","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CanvasPattern","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CanvasRenderingContext2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"captureEvents","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"CaretPosition","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"case","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CaseSensitiveCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"catch","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CategoryElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"CategoryElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"CDATASection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CELL_MARGIN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"CELL_RUN_GUTTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"CELL_TOOLBAR_SEPERATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"CellEditState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellEditType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellFocusMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"CellKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CellMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellMenus"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"CellOutputKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CellRevealPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellRunState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CellUri","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"CenteredViewLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/centered/centeredViewLayout"},{"name":"Certificate","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"CHANGE_BUFFER_DELAY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"ChangeEncodingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeEOLAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeIndentationSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ChangeModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ChangeSortAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Channel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Channel"},{"name":"ChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ChannelMergerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ChannelServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ChannelSplitterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CharacterClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/characterClassifier"},{"name":"CharacterData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CharacterMapping","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"CharacterMappingConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"CharacterPairSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/characterPair"},{"name":"CharacterSet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/characterClassifier"},{"name":"CharCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/charCode"},{"name":"CharWidthRequest","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"CharWidthRequestType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"chdir","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Checkbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"CheckboxActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"CheckedStates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview"},{"name":"CheckForUpdatesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"CheckForVSCodeUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"CheckForVSCodeUpdateActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/common/update"},{"name":"checkProposedApiEnabled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"checkServerIdentity","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"checksum","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/crypto"},{"name":"chmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chmod","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"chmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Choice","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"ChoiceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"ChokidarWatcherService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/chokidarWatcherService"},{"name":"ChordKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"chown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"chrome","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ChunkStream","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Cipher","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"clamp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"class","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CLASSIFIER_MODIFIER_SEPARATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"ClassName","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"clean","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"cleanMnemonic","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"cleanRemoteAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"CleanSearchEditorStateCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"cleanUndefinedQueryValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"clear","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"CLEAR_ALL_NOTIFICATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"CLEAR_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"clearAllFontInfos","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"ClearAllNotificationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"ClearCommandHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"ClearEditorHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClearExtensionsInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"clearHistoryCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"clearImmediate","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearImmediate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"clearInterval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearInterval","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"clearLine","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"clearNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"ClearNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"ClearRecentFilesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClearReplAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/repl"},{"name":"clearScreenDown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"ClearSearchHistoryCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ClearSearchResultsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ClearTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"clearTextMimes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"clearTimeout","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"clearTimeout","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"ClickLinkGesture","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkKeyboardEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"ClickLinkOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/clickLinkGesture"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser"},{"name":"Client","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.cp"},{"name":"CLIENT_RENEG_LIMIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"CLIENT_RENEG_WINDOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"ClientCoordinates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"clientInformation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRectList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClientRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"ClientRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"clipboard","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Clipboard","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ClipboardBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"ClipboardEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CLIServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostCLIServer"},{"name":"clock","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"cloneAndChange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"close","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"CLOSE_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITOR_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_AND_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_EDITORS_TO_THE_RIGHT_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CLOSE_SAVED_EDITORS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"CloseAllEditorGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseAllEditorsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseCurrentWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"closed","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CloseDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"CloseEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEditorInAllGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEditorsInOtherGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CloseExtensionDetailsOnViewChangeKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"CloseGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CloseLeftEditorsInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"CloseOneEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ClosePanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"CloseReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CloseReplaceWidgetActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CloseSidebarAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"closeSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"CloseWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"cmp","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"coalesce","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"coalesceInPlace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"CodeAction","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionAutoApply","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"CodeActionCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"CodeActionCommandArgs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"codeActionCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"CodeActionDocumentationContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationContribution"},{"name":"CodeActionExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint"},{"name":"CodeActionKeybindingResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionMenu"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"CodeActionKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionMenu"},{"name":"CodeActionModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"CodeActionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeActionsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsContribution"},{"name":"codeActionsExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint"},{"name":"CodeActionsState","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"CodeActionTrigger","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeActionTriggerType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeActionUi","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionUi"},{"name":"CodeApplication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/app"},{"name":"CodeCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell"},{"name":"CodeCellRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"CodeCellViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel"},{"name":"CodeDataTransfers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CodeEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/codeEditorService"},{"name":"CodeEditorServiceImpl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"CodeEditorStateFlag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"CodeEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"CodeInset","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeLens","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CodeLens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CodeLensCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codeLensCache"},{"name":"CodeLensContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensController"},{"name":"CodeLensHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensWidget"},{"name":"CodeLensModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelens"},{"name":"CodeLensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CodeLensWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelensWidget"},{"name":"CodeWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/window"},{"name":"CodiconActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"CodiconLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/codiconLabel/codiconLabel"},{"name":"codiconStartMarker","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"coerce","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"COLLAPSE_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"CollapseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"CollapseAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/treeDefaults"},{"name":"CollapseDeepestExpandedLevelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CollapseExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CollapseNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"collectLaunchConfigs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"collectWorkspaceStats","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"Color","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Color","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"Color","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Color","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ColorDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorDetector"},{"name":"ColorExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorExtensionPoint"},{"name":"ColorFormat","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorId","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ColorInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"colorize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"colorizeElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"colorizeModelLine","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"Colorizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/colorizer"},{"name":"ColorMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ColorPickerBody","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPickerHeader","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPickerModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerModel"},{"name":"ColorPickerWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/colorPickerWidget"},{"name":"ColorPresentation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorPresentation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorPresentation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ColorProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ColorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ColorThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeData"},{"name":"ColorThemeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ColorThemeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"colorThemeSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"ColorZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"ColumnSelection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorColumnSelection"},{"name":"combinedAppender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"combinedDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"CombinedInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"CombinedSpliceable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/splice"},{"name":"Command","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"CommandLine","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"CommandOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"commands","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"commands","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"CommandsConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"CommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/commands/common/commandService"},{"name":"commandsExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/menusExtensionPoint"},{"name":"CommandsHistory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/commandsQuickAccess"},{"name":"CommandsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"CommandsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"CommandString","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CommandString","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"CommandTrackerAddon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon"},{"name":"Comment","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CommentBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"CommentContextKeys","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentContextKeys"},{"name":"CommentController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"COMMENTEDITOR_DECORATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentThreadWidget"},{"name":"CommentFormActions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentFormActions"},{"name":"CommentGlyphWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentGlyphWidget"},{"name":"CommentMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentMenus"},{"name":"CommentMode","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CommentMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CommentMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CommentMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/commentMode"},{"name":"CommentNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"CommentNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentNode"},{"name":"CommentNodeRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"comments","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"COMMENTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"COMMENTS_VIEW_TITLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsAsyncDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentService"},{"name":"CommentsList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"CommentsModelVirualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"CommentsPanel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsView"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CommentThreadCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CommitCharacterController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestCommitCharacters"},{"name":"CommonEditorConfiguration","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"CommonFindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"commonlyUsedData","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"commonPrefixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"commonPrefixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"commonSuffixLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"CommonTask","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"Comparator","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compare","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"COMPARE_RESOURCE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COMPARE_SELECTED_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COMPARE_WITH_SAVED_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"compareAnything","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareBuild","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compareByPrefix","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareFileExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareFileNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareIdentifiers","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"compareIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compareItemsByFuzzyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"compareMarkersByUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"comparePaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"compareSubstring","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"compareSubstringIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"CompareWithClipboardAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CompatChangeAll","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"compile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCompile"},{"name":"compileFunction","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"CompletionContext","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"CompletionItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItem","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemInsertTextRule","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemInsertTextRule","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItemKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionItemTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionItemTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"completionKindFromString","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"completionKindToCssClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionList","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/completionModel"},{"name":"CompletionOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"CompletionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CompletionTriggerKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"CompletionTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"Component","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/component"},{"name":"ComposedTreeDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"Composite","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositeBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBar"},{"name":"CompositeDescriptor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBar"},{"name":"CompositeDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CompositeDragAndDropObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"CompositeOverflowActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositeOverflowActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"CompositePart","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositePart"},{"name":"CompositeProgressIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"CompositeRegistry","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/composite"},{"name":"CompositeScope","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"CompositeSnippetVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"CompositionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"compress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"compressConsecutiveTextChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textChange"},{"name":"CompressedNavigationController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"CompressedObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"CompressibleAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/asyncDataTree"},{"name":"CompressibleObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTree"},{"name":"CompressibleObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"computeCodePoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ComputedEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"computeLinks","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"computeRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"computeScreenAwareSize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"computeStyles","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"config","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"config","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"Config","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"Config","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"Configuration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"Configuration","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"CONFIGURATION_SYNC_STORE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"ConfigurationCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configurationCache"},{"name":"ConfigurationCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/node/configurationCache"},{"name":"ConfigurationChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"ConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationEditingError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationEditingErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"ConfigurationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ConfigurationManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugConfigurationManager"},{"name":"ConfigurationModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"ConfigurationResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/browser/configurationResolverService"},{"name":"ConfigurationResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService"},{"name":"ConfigurationScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationService"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"ConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ConfigurationTargetToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"configurationTelemetry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"ConfigureAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"ConfigureLanguageBasedSettingsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesActions"},{"name":"ConfigureLocaleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/localizationsActions"},{"name":"ConfigureNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"configureOpenerTrustedDomainsHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"ConfigureRecommendedExtensionsCommandsContributor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfigureRuntimeArgumentsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ConfigureTaskAction","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/abstractTaskService"},{"name":"ConfigureWorkspaceFolderRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfigureWorkspaceRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ConfiguringTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"confirm","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ConfirmResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"CONFLICT_RESOLUTION_CONTEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"CONFLICT_RESOLUTION_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"ConflictDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/bulkEdit/browser/conflicts"},{"name":"connect","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"connect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"connect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"connect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"connect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"connected","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ConnectionGainEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ConnectionLostEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ConnectionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectPrimaryMenuToInlineActionBar","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"connectProxyResolver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/proxyResolver"},{"name":"connectRemoteAgentExtensionHost","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectRemoteAgentManagement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"connectRemoteAgentTunnel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"CONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"console","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Console","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ConsoleLogInAutomationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/browser/log"},{"name":"ConsoleLogInMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ConsoleLogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ConsoleLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"consolidate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"const","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"constants","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"constants","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"constants","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"constants","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"constants","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/constants"},{"name":"Constants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"Constants","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"Constants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"ConstantSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"consumeReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeReadableWithLimit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"consumeStreamWithLimit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"contains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"containsDragType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"containsEmoji","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsFullWidthCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsRTL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"containsUppercaseCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ContentHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverWidgets"},{"name":"contentTracing","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ContentViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ContentWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"ContentWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"context","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Context","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/provideSignatureHelp"},{"name":"Context","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"Context","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"Context","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"CONTEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/toolbar/toolbar"},{"name":"CONTEXT_ACCESSIBILITY_MODE_ENABLED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"CONTEXT_ACTIVE_LOG_OUTPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_AUTH_TOKEN_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"CONTEXT_BREAKPOINT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINT_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINTS_EXIST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_BREAKPOINTS_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_CALLSTACK_ITEM_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_CUSTOM_EDITORS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CONTEXT_DEBUG_CONFIGURATION_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_UX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_DEBUG_UX_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_EXPRESSION_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_EXTENSION_HOST_PROFILE_RECORDED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"CONTEXT_FIND_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FIND_WIDGET_NOT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CONTEXT_FOCUSED_SESSION_IS_ATTACH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_BREAKPOINT_WIDGET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_DEBUG_MODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_DEBUG_REPL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_IN_OUTPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_JUMP_TO_CURSOR_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_KEYBINDING_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_KEYBINDINGS_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_KEYBINDINGS_SEARCH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_LOADED_SCRIPTS_ITEM_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_LOADED_SCRIPTS_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_MENU_CHANNEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/common/contextmenu"},{"name":"CONTEXT_MENU_CLOSE_CHANNEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/common/contextmenu"},{"name":"CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"CONTEXT_OUTPUT_SCROLL_LOCK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"CONTEXT_PROFILE_SESSION_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"CONTEXT_RENAME_INPUT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/renameInputField"},{"name":"CONTEXT_REPLACE_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"CONTEXT_RESTART_FRAME_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_SETTINGS_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_SETTINGS_JSON_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_SETTINGS_SEARCH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_STEP_BACK_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_SYNC_ENABLEMENT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"CONTEXT_SYNC_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"CONTEXT_TOC_ROW_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"CONTEXT_UPDATE_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"CONTEXT_VARIABLES_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"CONTEXT_WATCH_EXPRESSIONS_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"ContextAwareMenuEntryActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"contextBridge","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ContextKeyAndExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyDefinedExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyEqualsExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyExpr","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyExprType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyFalseExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotEqualsExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyNotRegexExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyOrExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyRegexExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextKeyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/browser/contextKeyService"},{"name":"ContextKeyTrueExpr","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"ContextMenuController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/contextmenu/contextmenu"},{"name":"ContextMenuHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextMenuHandler"},{"name":"ContextMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextMenuService"},{"name":"ContextMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService"},{"name":"ContextScopedFindInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextScopedHistoryInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextScopedReplaceInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"ContextSubMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/contextmenu"},{"name":"ContextTagKeys","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ContextTagKeys"},{"name":"ContextTagKeys","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ContextView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"ContextViewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextViewService"},{"name":"continue","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"CONTINUE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"CONTINUE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"Contracts","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"contrastBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ContributableViewsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"ContributedCustomEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors"},{"name":"ContributedTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"convertBufferRangeToViewport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"convertLinkRangeToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"convertSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeCompatibility"},{"name":"convertSimple2RegExpPattern","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"convertToDAPaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"convertToVSCPaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"ConvolverNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Cookies","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"CoordinatesConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"copy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"COPY_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"COPY_PATH_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COPY_RELATIVE_PATH_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"COPY_STACK_TRACE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"copyAllCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyAllCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"copyFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"COPYFILE_EXCL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"COPYFILE_FICLONE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"COPYFILE_FICLONE_FORCE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"copyFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"copyFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"CopyLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/copyLinesCommand"},{"name":"copyMatchCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyMatchCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CopyNotificationMessageAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"CopyOptions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaInput"},{"name":"copyPathCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"CopyPathCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"CopyTerminalSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"CopyValueAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"CopyWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"CoreEditingCommands","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CoreEditorCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CoreNavigationCommands","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"CorrelationContextManager","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/AutoCollection/CorrelationContextManager"},{"name":"count","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"CountBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/countBadge/countBadge"},{"name":"countEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"Counter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"CountQueuingStrategy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"countReset","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"cpus","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"cpuUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"crash","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"crashReporter","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"crashReporterIdStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"create","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"domain"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorSimpleWorker"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkComputer"},{"name":"create","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"create","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateWorker"},{"name":"createActionViewItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createAndBindHistoryNavigationWidgetScopedContextKeyService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"createAndFillInActionBarActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createAndFillInContextMenuActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"createApiFactoryAndRegisterActors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.api.impl"},{"name":"createBreadcrumbsPicker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"createBreakpointDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution"},{"name":"createBrotliCompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createBrotliDecompress","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createCancelablePromise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"createCellViewModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel"},{"name":"createChannelReceiver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc"},{"name":"createChannelSender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc"},{"name":"createCipher","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createCipheriv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createConnection","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"createContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"createCSSRule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createCustomTask","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"createDecipher","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDecipheriv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDecorationsForStackFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackEditorContribution"},{"name":"createDecorator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"createDecorator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"createDeflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createDeflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createDiffEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createDiffieHellman","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createDiffNavigator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createECDH","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createEditorFromSearchResult","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"createEditorPagePosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"createElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"createError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"createErrorWithActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorsWithActions"},{"name":"createExtHostContextProxyIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"createFakeScopedLineTokens","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/modesTestUtils"},{"name":"createFastDomNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/fastDomNode"},{"name":"createFileEditorInput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"createFileIconThemableTreeContainerScope","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"createFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"createFindMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"createGunzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createGzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createHash","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createHmac","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createHook","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"createImageBitmap","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"createInflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createInflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createInterface","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"createKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"createLineMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"createLineStarts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createLineStartsFast","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createMainContextProxyIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"createMatchers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/textMateScopeMatcher"},{"name":"createMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"createMemoizer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"createMessageOfType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"createMetaElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createMockBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"createMockSession","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/browser/callStack.test"},{"name":"createMockText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"createModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createMonacoBaseAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneBase"},{"name":"createMonacoEditorAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createMonacoLanguagesAPI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"createMouseMoveEventMerger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseHandler"},{"name":"CreateNewLocalTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote"},{"name":"CreateNewTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"createPrivateKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createProxyObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"createPublicKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createQueuedSender","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"createReadStream","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"createReadStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/io"},{"name":"createRegExp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"createRequire","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"createRequireFromPath","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"createResourceExcludeMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"createRotatingLogger","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"createRotatingLogger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/spdlogService"},{"name":"createRotatingLoggerAsync","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"createScanner","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"createScopedLineTokens","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"createSecretKey","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createSecureContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSecurePair","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSecureServer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"createSerializedGrid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"createServer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"createServer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"createSign","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createSimpleKeybinding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"createSingleEditOp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/commands/shiftCommand.test"},{"name":"createSingleEditOp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test"},{"name":"createSlowExtensionAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions"},{"name":"createSocket","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dgram"},{"name":"createStringBuilder","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"createStubInstance","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"createStyleSheet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"createSuggestItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/test/completionModel.test"},{"name":"createSyncDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/descriptors"},{"name":"createTerminalEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"createTestCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"createTextBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactory","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactoryFromSnapshot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextBufferFactoryFromStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"createTextModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/editorTestUtils"},{"name":"createTextSearchResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"createTOCIterator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"createTokenizationSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchLexer"},{"name":"createTracing","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"trace_events"},{"name":"createUintArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"createUnzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"createUpdateURL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/abstractUpdateService"},{"name":"createValidator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesValidation"},{"name":"createVerify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"createWaitMarkerFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/waitMarkerFile"},{"name":"createWebWorker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/webWorker"},{"name":"createWebWorker","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"createWriteStream","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Credential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CredentialsContainer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Critical","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"crypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Crypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CryptoKey","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CryptoKeyPair","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSS","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"CSSConditionRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"cssEscape","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"CSSFontFaceRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSGroupingRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSImportRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSKeyframeRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSKeyframesRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSMediaRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSNamespaceRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSPageRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSRuleList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleDeclaration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSStyleSheet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CSSSupportsRule","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ctxCommentEditorFocused","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/simpleCommentEditor"},{"name":"ctxHasSymbols","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/symbolNavigation"},{"name":"ctxReferenceSearchVisible","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesController"},{"name":"CurrentLineHighlightOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"CurrentLineMarginHighlightOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight"},{"name":"currentSchemaVersion","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"currentSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"Cursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"CursorAtBoundary","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"CursorChangeReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorEvents"},{"name":"CursorChangeReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"CursorCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCollection"},{"name":"CursorColumns","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorModelState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"CursorMove","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveCommands"},{"name":"CursorMoveCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveCommands"},{"name":"CursorPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveOperations"},{"name":"CursorRedo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"CursorStateChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursor"},{"name":"cursorStyleToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"cursorTo","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"CursorUndo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorUndoRedoController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/cursorUndo/cursorUndo"},{"name":"CursorWordAccessibilityLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordAccessibilityRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordEndRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordPartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordPartRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"CursorWordRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartLeftSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CursorWordStartRightSelect","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"CustomEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditors"},{"name":"CustomEditorInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CustomEditorInfoCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"CustomEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInput"},{"name":"CustomEditorInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory"},{"name":"CustomEditorModelManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditorModelManager"},{"name":"CustomEditorPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"customEditorsAssociationsSettingId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"CustomEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/browser/customEditors"},{"name":"customEditorsExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/extensionPoint"},{"name":"CustomElementRegistry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"customElements","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CustomEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"CustomExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CustomExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"CustomExecution2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"CustomExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"CUSTOMIZED_TASK_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CustomMenubarControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/menubarControl"},{"name":"CustomTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"CustomTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customTextEditorModel"},{"name":"CustomTreeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"cutFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"CutWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"cwd","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"cwd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DARK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"darken","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DarwinUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.darwin"},{"name":"data","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/filters.perf.data"},{"name":"Data","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Data"},{"name":"Data","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"Database","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"DataBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DataBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"DataCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataPoint","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPoint"},{"name":"DataPoint","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"DataPointType","kind":"enum","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"DataPointType","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"DataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"DataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"DataTransfer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransferItem","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransferItemList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DataTransfers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/dataTree"},{"name":"DataUri","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"DataView","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Date","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"debounce","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"debug","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"debug","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Debug","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"DEBUG_HELPER_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DEBUG_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"DebugAdapterExecutable","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterExecutable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugAdapterInlineImplementation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterInlineImplementation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugAdapterServer","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugAdapterServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugConsoleMode","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DebugConsoleMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DebugContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugContentProvider"},{"name":"debugExceptionWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"debugExceptionWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"DebugExtensionHostAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"debugger","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Debugger","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Debugger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugger"},{"name":"debuggersExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"DebugHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugHover"},{"name":"debugIconContinueForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconDisconnectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconPauseForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconRestartForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStartForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepBackForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepIntoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepOutForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStepOverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugIconStopForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debuglog","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"DebugModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"debugPort","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DebugProgressContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugProgress"},{"name":"DebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugService"},{"name":"DebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugSession"},{"name":"DebugStatusContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugStatus"},{"name":"DebugTaskRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugTaskRunner"},{"name":"DebugToolBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugToolBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"debugToolBarBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugToolBar"},{"name":"DebugViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugViewlet"},{"name":"Decipher","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"DeclarationProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"declare","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"decode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"decode","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"decode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"decodeSemanticTokensDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/semanticTokensDto"},{"name":"decodeStream","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"decodeURI","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"decodeURIComponent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"decodeUTF16LE","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"decodeUTF8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"decompress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"Decoration","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Decoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DecorationRangeBehavior","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DecorationRangeBehavior","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DecorationRangeBehavior","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DecorationRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DecorationSegment","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"DecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/decorations/decorations"},{"name":"DecorationsOverviewRuler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler"},{"name":"DecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/decorations/browser/decorationsService"},{"name":"DecorationToRender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"DecreaseSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"DecreaseViewSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"DedupOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"deepClone","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"deepEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"deepFreeze","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"deepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"default","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"DEFAULT_COMMANDS_TO_SKIP_SHELL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_CUSTOM_EDITOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"DEFAULT_ECDH_CURVE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"DEFAULT_EDITOR_MAX_DIMENSIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_EDITOR_MIN_DIMENSIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_EDITOR_PART_OPTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"DEFAULT_ENCODING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"DEFAULT_LABELS_CONTAINER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"DEFAULT_LETTER_SPACING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_LINE_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"DEFAULT_LOG_LEVEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"DEFAULT_PRODUCT_ICON_THEME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/productIconThemeData"},{"name":"DEFAULT_PRODUCT_ICON_THEME_SETTING_VALUE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"DEFAULT_SETTINGS_EDITOR_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"DEFAULT_SETTINGS_EDITOR_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"DEFAULT_TERMINAL_OSX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"DEFAULT_VALUE","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"DEFAULT_WORD_REGEXP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"defaultApp","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"defaultBreadcrumbsStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"defaultCipherList","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"defaultClient","kind":"let","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"DefaultConfigurationExportHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper"},{"name":"DefaultConfigurationModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"defaultCoreCipherList","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"defaultCustomEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/contributedCustomEditors"},{"name":"DefaultDeserializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"defaultDialogStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"DefaultElementMapper","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/compressedObjectTreeModel"},{"name":"DefaultEndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"DefaultEndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"defaultGenerator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/idGenerator"},{"name":"defaultInsertColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"defaultKeybindingsContents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultKeybindingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultKeyboardNavigationDelegate","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"defaultListStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"defaultMaxListeners","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"defaultMenuStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/styler"},{"name":"DefaultPaneDndController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"DefaultPreferencesEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"DefaultPreferencesEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"defaultQuickAccessContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"defaultQuickAccessContextKeyValue","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"DefaultQuickAccessFilterValue","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"DefaultRawSettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultRecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"defaultRemoveColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DefaultRoleName","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"defaultSearchConfig","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"DefaultSerializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"DefaultSettings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultSettingsEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"DefaultSettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"DefaultSettingsHeaderWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"DefaultSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"defaultSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"defaultStatus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DefaultStyleController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"defaultStyles","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBox"},{"name":"DefaultURITransformer","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"defaultWebSocketFactory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/browserSocketFactory"},{"name":"defaultWindowState","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/window"},{"name":"DefaultWorkerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/worker/defaultWorkerFactory"},{"name":"DeferredPermissionRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeferredPromise","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"define","kind":"const","kindModifiers":"declare","sortText":"4"},{"name":"DefineKeybindingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"DefineKeybindingOverlayWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"DefineKeybindingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"defineTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"DefinitionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToCommands"},{"name":"DefinitionLink","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DefinitionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"deflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateRawSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"deflateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"DelayedDragHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DelayedPagedModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"Delayer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"DelayNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Delegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"Delegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList"},{"name":"DelegatedLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"DelegatingEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorService"},{"name":"delete","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"DeleteAllLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteAllRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"deleteFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DeleteLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DeleteOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorDeleteOperations"},{"name":"deletePassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"deletePassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"DeleteWordCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordEndLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordEndRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordPartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"DeleteWordPartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"DeleteWordRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordStartLeft","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"DeleteWordStartRight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"delimiter","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"delimiter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"delta","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"DeltaExtensionsResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDescriptionRegistry"},{"name":"departFocus","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"DependsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"deprecate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"Deprecated_RemoteAuthorityContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"describe","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"descriptionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"deserialize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"deserializeEnvironmentVariableCollection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableShared"},{"name":"deserializePipePositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"Deserializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"deserializeSearchError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"desktopCapturer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"DesktopDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"DesktopHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/electron-browser/desktopHostService"},{"name":"DESTRUCTION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"detect","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"detectAvailableShells","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"detectEncodingByBOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/encoding/encoding.test"},{"name":"detectEncodingByBOMFromBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"detectEncodingFromBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"DetectIndentation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"detectModeId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"DeviceAcceleration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceLightEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceMotionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceOrientationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"devicePixelRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DeviceRotationRate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DH_CHECK_P_NOT_PRIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_CHECK_P_NOT_SAFE_PRIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_NOT_SUITABLE_GENERATOR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"DH_UNABLE_TO_CHECK_GENERATOR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"Diagnostic","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Diagnostic","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Diagnostic","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDiagnostics"},{"name":"DiagnosticRelatedInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticRelatedInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticRelatedInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticsChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsIpc"},{"name":"DiagnosticSeverity","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticSeverity","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DiagnosticsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"DiagnosticsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsIpc"},{"name":"DiagnosticTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DiagnosticTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DiagnosticTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"dialog","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Dialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dialog/dialog"},{"name":"DialogChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-browser/dialogIpc"},{"name":"DialogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-main/dialogs"},{"name":"DialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/dialogService"},{"name":"DialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/dialogService"},{"name":"didBindWorkbenchListAutomaticKeyboardNavigation","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"DidChangeContentEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"DidChangeDecorationsEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"didUseCachedData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/timer/electron-browser/timerService"},{"name":"diff","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"diff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"DiffAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"diffBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffChange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diffChange"},{"name":"DiffComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/diff/diffComputer"},{"name":"DiffEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/diffEditorInput"},{"name":"DiffEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/diffEditorModel"},{"name":"DiffEditorState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"DiffEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffEditorWidget"},{"name":"DiffieHellman","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"diffInserted","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"diffInsertedOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffNavigator"},{"name":"diffRemoved","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"diffRemovedOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"DiffReview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/diffReview"},{"name":"Dimension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"dir","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Dir","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"Direction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"Dirent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"dirExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"dirname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"dirname","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"dirname","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"DirtyDiffController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyDiffModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyDiffWorkbenchController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"DirtyEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"DirtyFilesIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/dirtyFilesIndicator"},{"name":"DirtyWorkingCopiesContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"dirxml","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"DisableAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"DisableAllWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DISABLED_EXTENSIONS_STORAGE_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"DisabledExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"DisableDropDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableForWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"DisableGloballyAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"disconnect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"disconnect","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"DISCONNECT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"DISCONNECT_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"DiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/diskFileSystemProvider"},{"name":"DiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/electron-browser/diskFileSystemProvider"},{"name":"DiskSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchService"},{"name":"DispatchConfig","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/dispatchConfig"},{"name":"dispatchEvent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Disposable","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Disposable","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"Disposable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Disposable","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"DisposableStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"disposableTimeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"dispose","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"dispose","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"disposed","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"distinct","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"distinct","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"distinctES6","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"distinctParents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"do","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"doBenchmark","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/benchmark/benchmarkUtils"},{"name":"Dock","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"document","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Document","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"documentationExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint"},{"name":"DocumentationExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint"},{"name":"DocumentFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentFragment","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DocumentHighlight","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentHighlight","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentHighlight","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentHighlightKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"DocumentHighlightProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentLink","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentLink","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentLink","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentRangeFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentRangeSemanticTokensAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"DocumentRangeSemanticTokensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentSemanticTokensAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"DocumentSemanticTokensProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentSymbol","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"DocumentSymbol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"DocumentSymbol","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"DocumentSymbolProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"DocumentTimeline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DocumentType","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"doesNotReject","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"doesNotThrow","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"domain","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Domain","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"domain"},{"name":"Domain","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Domain"},{"name":"Domain","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"domainSupportsProperties","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Constants"},{"name":"domainToASCII","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"domainToUnicode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"domContentLoaded","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"DOMError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"domEvent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/event"},{"name":"DOMException","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMImplementation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMLineBreaksComputerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/domLineBreaksComputer"},{"name":"DOMMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMMatrixReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMParser","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMPointReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMQuad","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DomReadingContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"DOMRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMRectList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMRectReadOnly","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DomScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"DOMSettableTokenList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMStringList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMStringMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DOMTokenList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"doNotTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"dosDateTimeToDate","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"DOWNLOAD_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DOWNLOAD_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"DownloadItem","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"DownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadService"},{"name":"DownloadServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadIpc"},{"name":"DownloadServiceChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/downloadIpc"},{"name":"DragAndDropCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/dnd/dragAndDropCommand"},{"name":"DragAndDropController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/dnd/dnd"},{"name":"DragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"DragAndDropObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DragEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DraggedCompositeIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedEditorGroupIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedEditorIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DraggedViewIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"DragMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"Driver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-main/driver"},{"name":"DriverChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"DriverChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"Dropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropdownMenu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropdownMenuActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/dropdown/dropdown"},{"name":"DropDownMenuActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Duplex","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"DuplicateSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"DuplicateWorkspaceInNewWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"DynamicsCompressorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"DynamicStandaloneServices","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneServices"},{"name":"DynamicViewOverlay","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/dynamicViewOverlay"},{"name":"DynamicWebviewEditorOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay"},{"name":"DynamicWorkspaceRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/dynamicWorkspaceRecommendations"},{"name":"E2BIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EACCES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EADDRINUSE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EADDRNOTAVAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EAFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EAGAIN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EALREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBADF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBADMSG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EBUSY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECANCELED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECDH","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"ECHILD","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNABORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ECONNRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EDEADLK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EDESTADDRREQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"edit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"EditableConfigurationTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationEditingService"},{"name":"EditOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/editOperation"},{"name":"EditOperationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"EditOperationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"editor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"EDITOR_BOTTOM_PADDING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_CONTRIBUTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"EDITOR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_FONT_DEFAULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EDITOR_GROUP_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_EMPTY_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_FOCUSED_EMPTY_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_TABS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_GROUP_HEADER_TABS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_MODEL_DEFAULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EDITOR_PANE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EDITOR_TITLE_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"EDITOR_TOOLBAR_HEIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_TOP_MARGIN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EDITOR_TOP_PADDING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"EditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"EditorActivation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"editorActiveIndentGuides","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorActiveLineNumber","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorActiveLinkForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorAreaVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorAssociationsConfigurationNode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"EditorAutoIndentStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorAutoIndentStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EditorAutoSave","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorAutoSave"},{"name":"editorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorBracketMatchBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorBracketMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorBreadcrumbsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsModel"},{"name":"editorCodeLensForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"EditorCommandsContextActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeActions/common/codeActionsContribution"},{"name":"editorConfigurationBaseNode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"EditorContextKeys","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorContextKeys"},{"name":"EditorControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorControl"},{"name":"editorCursorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorCursorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/editor"},{"name":"EditorDropTarget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorDropTarget"},{"name":"editorErrorBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorExtensionsRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"editorFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorFindRangeHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorFontLigatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"editorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/editorGroup"},{"name":"EditorGroupActiveEditorDirtyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorGroupEditorsCountContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorGroupToViewColumn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/editor"},{"name":"EditorGroupView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorGroupView"},{"name":"editorGutter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorGutterAddedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorGutterDeletedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorGutterModifiedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"editorHintBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHintForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorHoverStatusBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorInactiveSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorIndentGuides","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorInfoBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorInput","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorKeybindingCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/keybindingCancellation"},{"name":"EditorLayoutInfoComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorLayoutSingleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutThreeColumnsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutThreeRowsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoByTwoGridAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoColumnsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoColumnsBottomAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoRowsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"EditorLayoutTwoRowsRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"editorLightBulbAutoFixForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorLightBulbForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorLineHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorLineHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorLineNumbers","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorMarkerNavigationBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationInfo","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMarkerNavigationWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"editorMatchesToTextSearchResults","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchHelpers"},{"name":"EditorMemento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/baseEditor"},{"name":"EditorModeContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/codeEditorWidget"},{"name":"EditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorModesRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"EditorMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorMouseEventFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorOpenContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"EditorOption","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorOption","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EditorOptions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"EditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorOptionsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"editorOverviewRulerBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorPagePosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorPart"},{"name":"EditorPinnedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorPointerEventFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"EditorProgressIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"editorRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorRangeHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorRuler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorScopedQuickInputServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"EditorScroll_","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"EditorScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar"},{"name":"editorSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorSelectionHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorService"},{"name":"EditorSimpleWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorSimpleWorker"},{"name":"EditorsObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorsObserver"},{"name":"EditorsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EditorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"EditorStateCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"EditorStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"editorSuggestWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"editorSuggestWidgetSelectedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"EditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"editorSymbolHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorSymbolHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewContext"},{"name":"EditorType","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"editorUnnecessaryCodeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorUnnecessaryCodeOpacity","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"EditorWalkThroughAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough"},{"name":"EditorWalkThroughInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough"},{"name":"editorWarningBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorWhitespace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/linesLayout"},{"name":"editorWhitespaces","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"editorWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"editorWidgetResizeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"EditorWorkerClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorWorkerHost","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorWorkerServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerServiceImpl"},{"name":"EditorZoom","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorZoom"},{"name":"EditPreferenceWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"EditStack","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"EDOM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EEXIST","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EFAULT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EFBIG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EHOSTUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EIDRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EILSEQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINPROGRESS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EINVAL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EISCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EISDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"electron","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Electron","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"ElectronAcceleratorLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"ElectronMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/electron-main/electronMainService"},{"name":"ElectronService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/electron/electron-browser/electronService"},{"name":"ElectronURLListener","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/electron-main/electronUrlListener"},{"name":"ElectronWebviewBasedWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewElement"},{"name":"ElectronWebviewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewService"},{"name":"Element","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ElementsDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"ElementSizeObserver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/elementSizeObserver"},{"name":"ELOOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"else","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"EmbeddedCodeEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/embeddedCodeEditorWidget"},{"name":"EmbeddedDiffEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/embeddedCodeEditorWidget"},{"name":"embeddedEditorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart"},{"name":"EMFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"emit","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"emit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"emitKeypressEvents","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"Emitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"Emitter","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"Emitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"emitWarning","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"EMLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EmmetEditorAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/emmet/browser/emmetActions"},{"name":"empty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"EmptyExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"EmptyPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"EmptyPaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"emptyProgressRunner","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"EmptyView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/emptyView"},{"name":"EMSGSIZE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EnableAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"EnableAllWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ENABLED_EXTENSIONS_STORAGE_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"enableDebug","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/jschardet/index"},{"name":"EnabledExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"EnableDropDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableForWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"EnableGloballyAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"Enablement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"EnablementState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"enablePromiseAPIs","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ENAMETOOLONG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"encode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"encode","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"encode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"EncodedTokenizationSupport2Adapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"encodeSemanticTokensDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/semanticTokensDto"},{"name":"encodeStream","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"encodeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"encodeURI","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"encodeURIComponent","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"encodeUTF8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"encodingExists","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/iconv-lite/lib/index"},{"name":"encodingExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"EncodingMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"EncodingOracle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService"},{"name":"endianness","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"EndOfLine","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EndOfLine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EndOfLine","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"EndOfLinePreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"EndOfLinePreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"EndOfLineSequence","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"EndOfLineSequence","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"endsWith","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ENETDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENETRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENETUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"Engine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"ENGINE_METHOD_ALL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_CIPHERS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DIGESTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_DSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_ECDH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_ECDSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_NONE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_PKEY_ASN1_METHS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_PKEY_METHS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_RAND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_RSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENGINE_METHOD_STORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOBUFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENODATA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENODEV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOENT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOEXEC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOLCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOMEM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOMSG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOPROTOOPT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSPC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOSYS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTEMPTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTSUP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ENOTTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ensureFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ensureValidWordDefinition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"Entry","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"enum","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"env","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"env","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"env","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ENV_azurePrefix","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_http_proxy","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_https_proxy","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_iKey","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"ENV_profileQueryEndpoint","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"Envelope","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Envelope"},{"name":"Envelope","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"EnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"EnvironmentVariableCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariable"},{"name":"EnvironmentVariableMutatorType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EnvironmentVariableService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableService"},{"name":"ENXIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EOF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"EOL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"EOPNOTSUPP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EOVERFLOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPERM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTONOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EPROTOTYPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"eq","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"equal","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"equals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"equals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"equalsIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ERANGE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"EROFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"error","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Error","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Error","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"ErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ErrorEvent","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/errorTelemetry"},{"name":"errorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"errorHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ErrorHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ErrorScope","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ErrorTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/browser/errorTelemetry"},{"name":"ErrorTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/errorTelemetry"},{"name":"escape","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"escape","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"escape","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"escapeCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"escapeNonWindowsPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"escapeRegExpCharacters","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"ESPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ESRCH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"etag","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ETAG_DISABLED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"ETIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ETIMEDOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ETXTBSY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"eval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"EvalError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EvaluatableExpression","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EvaluatableExpression","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"EvaluatableExpression","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"EvaluatableExpressionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"event","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Event","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Event","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"Event","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"EventBufferer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"EventData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/EventData"},{"name":"EventData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"EventEmitter","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"EventEmitter","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"events"},{"name":"EventHelper","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"EventMultiplexer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"eventNames","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"eventNames","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"EventSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EventTarget","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"EventType","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"EventType","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/touch"},{"name":"EWOULDBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"exception","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ExceptionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ExceptionData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionData"},{"name":"ExceptionData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ExceptionDetails","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionDetails"},{"name":"ExceptionDetails","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"ExceptionWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/exceptionWidget"},{"name":"ExcludePatternInputWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget"},{"name":"ExcludeSettingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"EXDEV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"ExeBasedRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations"},{"name":"exec","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"exec","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/sudo-prompt/index"},{"name":"execArgv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"execFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"execFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"execPath","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"execSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"ExecutableDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"ExecuteCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"ExecuteCommandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ExecuteCommandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"executionAsyncId","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"ExecutionEngine","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"ExecutionEngine","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"exists","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"exists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"existsSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"exit","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-watchdog/index"},{"name":"exit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"exitCode","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"EXPAND_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ExpandAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ExpandNotificationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"expectation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"ExperimentActionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"experimental","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/colorRegistry.releaseTest"},{"name":"ExperimentalPrompts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/browser/experimentalPrompt"},{"name":"ExperimentalRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/experimentalRecommendations"},{"name":"ExperimentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"ExperimentState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"ExplorerCompressedFirstFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressedFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressedLastFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerCompressionDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerDecorationsProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerDecorationsProvider"},{"name":"ExplorerDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerFocusCondition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerFolderContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"ExplorerModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"ExplorerResourceCut","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceMoveableToTrash","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceNotReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerResourceReadonlyContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerRootContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"explorerRootErrorEmitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"ExplorerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerService"},{"name":"ExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerView"},{"name":"ExplorerViewletViewsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"ExplorerViewletVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"ExplorerViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"export","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"exportEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"exports","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Expression","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ExpressionContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"EXT_HOST_CREATION_DELAY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"extends","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"EXTENSION_BADGE_REMOTE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EXTENSION_BADGE_REMOTE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"EXTENSION_IDENTIFIER_PATTERN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"EXTENSION_IDENTIFIER_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"EXTENSION_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"ExtensionAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionActivationProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress"},{"name":"ExtensionActivationTimes","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ExtensionActivationTimesBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"extensionButtonProminentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"extensionButtonProminentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"extensionButtonProminentHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionContainers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionData","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"ExtensionData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionDependencyChecker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker"},{"name":"ExtensionDescriptionRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDescriptionRegistry"},{"name":"ExtensionDropDownAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionEditor"},{"name":"ExtensionEditorDropDownAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionEnablementService"},{"name":"ExtensionGalleryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService"},{"name":"ExtensionHostDebugBroadcastChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebugIpc"},{"name":"ExtensionHostDebugChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebugIpc"},{"name":"ExtensionHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/electron-browser/extensionHostDebugService"},{"name":"ExtensionHostLogFileName","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ExtensionHostMain","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostMain"},{"name":"ExtensionHostPersistentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ExtensionHostProcessManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProcessManager"},{"name":"ExtensionHostProcessWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionHost"},{"name":"ExtensionHostProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler"},{"name":"ExtensionHostProfileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService"},{"name":"ExtensionIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"ExtensionIdentifierWithVersion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"ExtensionKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ExtensionKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ExtensionManagementChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionManagementChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionManagementError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementService"},{"name":"ExtensionManagementServerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService"},{"name":"ExtensionManagementServerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementService"},{"name":"ExtensionManagementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/node/extensionManagementService"},{"name":"ExtensionMemento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostMemento"},{"name":"ExtensionMessageCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionPackCountWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"ExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionPointContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"ExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/extensionHost.contribution"},{"name":"ExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/configExporter/electron-browser/configurationExportHelper.contribution"},{"name":"ExtensionPointUserDelta","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionRecommendationReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"ExtensionRecommendations","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendations"},{"name":"ExtensionRecommendationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService"},{"name":"ExtensionRegistryReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ExtensionRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionResourceLoaderService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService"},{"name":"extensionResultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"extensionResultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/api/extHostSearch.test"},{"name":"extensions","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/jsonschemas/common/jsonContributionRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"Extensions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/contributions"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"Extensions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/output"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/actions"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/editor"},{"name":"Extensions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"EXTENSIONS_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionsActivator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"ExtensionsAutoProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler"},{"name":"ExtensionScanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionPoints"},{"name":"ExtensionScannerInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionPoints"},{"name":"ExtensionsChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ExtensionsConfigurationInitialContent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionsConfigurationSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionsConfigurationSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate"},{"name":"ExtensionScriptApis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionService"},{"name":"ExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/extensionService"},{"name":"ExtensionsGridView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionsInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsInput"},{"name":"ExtensionsLabel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ExtensionsLifecycle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionLifecycle"},{"name":"ExtensionsListView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"ExtensionsManifestCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionsManifestCache"},{"name":"ExtensionsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionsRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"ExtensionsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/extensionsSync"},{"name":"ExtensionState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ExtensionStoragePaths","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostStoragePaths"},{"name":"ExtensionsTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"ExtensionsViewletViewsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"ExtensionsViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"ExtensionsWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService"},{"name":"ExtensionTipsChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc"},{"name":"ExtensionTipsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionTipsService"},{"name":"ExtensionToolTipAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ExtensionType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"ExtensionWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"external","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"External","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ExternalElementsDragAndDropData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"ExternalThemeTrieElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ExternalUriResolverContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/externalUriResolver"},{"name":"ExtHostApiCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiCommands"},{"name":"ExtHostApiDeprecationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"ExtHostAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostAuthentication"},{"name":"ExtHostCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostClipboard"},{"name":"ExtHostCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"ExtHostComments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostComments"},{"name":"ExtHostCommentThread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostComments"},{"name":"ExtHostConfigProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"ExtHostConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"ExtHostContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"extHostCustomer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostCustomersRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostDebugConsole","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostDebugService"},{"name":"ExtHostDebugServiceBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDecorations"},{"name":"ExtHostDiagnostics","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDiagnostics"},{"name":"ExtHostDialogs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDialogs"},{"name":"ExtHostDocumentContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentContentProviders"},{"name":"ExtHostDocumentData","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"ExtHostDocumentLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"ExtHostDocuments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocuments"},{"name":"ExtHostDocumentsAndEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentsAndEditors"},{"name":"ExtHostDocumentSaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentSaveParticipant"},{"name":"ExtHostDownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostDownloadService"},{"name":"ExtHostEditorInsets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCodeInsets"},{"name":"ExtHostEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditors"},{"name":"ExtHostExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostExtensionService"},{"name":"ExtHostExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/worker/extHostExtensionService"},{"name":"ExtHostFileSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostFileSystem"},{"name":"ExtHostFileSystemEventService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostFileSystemEventService"},{"name":"ExtHostLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLabelService"},{"name":"ExtHostLanguageFeatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguageFeatures"},{"name":"ExtHostLanguages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostLanguages"},{"name":"extHostLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"ExtHostLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostLogService"},{"name":"ExtHostLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/worker/extHostLogService"},{"name":"ExtHostMessageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostMessageService"},{"name":"extHostNamedCustomer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCustomers"},{"name":"ExtHostNotebookController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookDocument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostNotebookOutputRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"ExtHostOutputChannelBackedByFile","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostOutputService"},{"name":"ExtHostOutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"ExtHostOutputService2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostOutputService"},{"name":"ExtHostProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostProgress"},{"name":"ExtHostPseudoterminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"ExtHostPushOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"ExtHostQuickOpen","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostQuickOpen"},{"name":"ExtHostRpcService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRpcService"},{"name":"ExtHostSCM","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSCM"},{"name":"ExtHostSCMInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSCM"},{"name":"ExtHostSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"ExtHostStatusBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStatusBar"},{"name":"ExtHostStatusBarEntry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStatusBar"},{"name":"ExtHostStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStorage"},{"name":"ExtHostTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTask"},{"name":"ExtHostTaskBase","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ExtHostTerminal","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"ExtHostTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTerminalService"},{"name":"ExtHostTextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"ExtHostTextEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"ExtHostTheming","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTheming"},{"name":"ExtHostTimeline","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTimeline"},{"name":"ExtHostTreeViews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTreeViews"},{"name":"ExtHostTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"ExtHostTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostTunnelService"},{"name":"ExtHostUrls","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUrls"},{"name":"ExtHostVariableResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"ExtHostWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWebviewEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWebviews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWebview"},{"name":"ExtHostWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWindow"},{"name":"ExtHostWorkspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWorkspace"},{"name":"extname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"extname","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"extname","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"extract","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"ExtractError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"extractLocalHostUriMetaDataForPortMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/tunnel"},{"name":"extractRangeFromFilter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"extractResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"extractSearchQueryFromLines","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"extractSearchQueryFromModel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"F_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"fail","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"FailedExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"fakeServer","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"fakeServerWithClock","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"FakeXMLHttpRequest","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"FALLBACK_MAX_MEMORY_SIZE_MB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/files"},{"name":"false","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"FastDomNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/fastDomNode"},{"name":"fchmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fchownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fdatasync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fdatasyncSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"features","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"FeedbackDropdown","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/feedback/browser/feedback"},{"name":"FeedbackStatusbarConribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/feedback/browser/feedbackStatusbarItem"},{"name":"fetch","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"FetchFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider"},{"name":"File","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"FILE_EDITOR_INPUT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FileBasedRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations"},{"name":"FileChangesEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FileChangeType","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"FileCopiedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/fileDialogService"},{"name":"FileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/fileDialogService"},{"name":"FileDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/editors/fileEditorInput"},{"name":"FileElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsModel"},{"name":"FileElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"FileElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"fileExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"FileFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileIconThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/fileIconThemeData"},{"name":"FileKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FileLocationKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"FileLoggerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/fileLogService"},{"name":"FileLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/fileLogService"},{"name":"FileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"FileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FileMatchOrFolderMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchOrFolderMatchWithResourceFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchOrMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FileMatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"FileOperation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileOperationResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FilePreview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"FileQueryCacheState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/cacheState"},{"name":"FileReader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FileReferences","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"FileReferencesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"FileResourceMarkersRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"FILES_ASSOCIATIONS_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FILES_EXCLUDE_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FilesConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"FileSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/fileSearchManager"},{"name":"FileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/fileService"},{"name":"FilesExplorerFocusCondition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FilesExplorerFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"FilesFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsPicker"},{"name":"FileSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FilesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"FileStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/stateService"},{"name":"FileStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/browser/storageService"},{"name":"FileSystemError","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileSystemError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FileSystemProviderCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileSystemProviderCapabilities","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"FileSystemProviderError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileSystemProviderErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"FileThemeIcon","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"FileType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FileType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"fileURLToPath","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"FileUserDataProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userData/common/fileUserDataProvider"},{"name":"FileWalker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/win32/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherService"},{"name":"FileWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nodejs/watcherService"},{"name":"fillResourceDataTransfers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"Filter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"FilteredMatchesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"FilterOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersFilterOptions"},{"name":"filtersAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"filterValidationDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"FilterViewPaneContainer","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewsViewlet"},{"name":"finalHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"finally","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"FinalNewLineParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"find","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"FIND_IDS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"findBestWindowOrFolderForFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"FindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"findCredentials","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"findCredentials","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"FindDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findDecorations"},{"name":"findExecutable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalEnvironment"},{"name":"findExpressionInStackFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugHover"},{"name":"findFirstInSorted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"findFreePort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"findFreePortFaster","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"FindInFilesActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FindInFilesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FindInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInput"},{"name":"FindMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"findMatchingThemeRule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMHelper"},{"name":"FindModelBoundToEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"findNodeAtLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"findNodeAtOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"FindOptionOverride","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findState"},{"name":"FindOptionsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findOptionsWidget"},{"name":"FindOrReplaceInFilesAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"findParentWithClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"findPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"findPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"FindReplaceState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findState"},{"name":"findRules","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"FindStartFocusAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"findValidPasteFileTarget","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"FindWidgetViewZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"findWindowOnExtensionDevelopmentPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"findWindowOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"findWindowOnWorkspaceOrFolderUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"finished","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"fips","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"first","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"FIRST_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"firstIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"FirstMatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"firstNonWhitespaceIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"firstOrDefault","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"firstSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"FixAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"fixAllCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"fixCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"fixDriveC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"fixInsert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"fixNewline","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"fixPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"fixRegexNewline","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"flatten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Float32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Float64Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FloatingClickWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorWidgets"},{"name":"focus","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"FOCUS_FIRST_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_LAST_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_NEXT_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_PREVIOUS_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"FOCUS_REPL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"FocusAboveGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusActiveEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FocusActiveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusBelowGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"focusBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"focusedCellIndicator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"FocusedViewContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"FocusEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FocusFilesExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"FocusFirstGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusLastGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusLeftGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusNavigationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FocusNextGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusNextInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusNextSearchResultAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusPreviousGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusPreviousInputAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusPreviousSearchResultAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusQueryEditorWidgetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"FocusQueryEditorWidgetCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"FocusRightGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"FocusSearchFromResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"focusSearchListCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"FocusSearchListCommandID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FocusSessionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"FocusSessionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActionViewItems"},{"name":"foldBackgroundBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/folding"},{"name":"FOLDER_CONFIG_FOLDER_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"FOLDER_SETTINGS_PATH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"FolderConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"FolderFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"FolderMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FolderMatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"FolderMatchWithResource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"FolderSettingsActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"FolderSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"folderSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"foldersToIncludeGlobs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"foldersToRgExcludeGlobs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"FolderThemeIcon","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"FoldingController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/folding"},{"name":"FoldingDecorationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingDecorations"},{"name":"FoldingModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"FoldingRange","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FoldingRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FoldingRange","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"FoldingRangeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FoldingRangeKind","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"FoldingRangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FoldingRangeKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"FoldingRangeProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"FoldingRegion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"FoldingRegions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"FollowerLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"FontInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/fontInfo"},{"name":"FontStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"fontStylePattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"for","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"forEach","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"foreground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ForeignElementType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"fork","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"fork","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"format","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"format","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"format","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"format","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"format","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"formatDocumentRangeWithProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentRangeWithSelectedProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentWithProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatDocumentWithSelectedProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"formatPII","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"FormatString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"FormattingConflicts","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"FormattingEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/formattingEdit"},{"name":"FormattingMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"formatWithOptions","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"FormData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FORMERR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"forwardedPortsViewEnabled","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"frameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"frames","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FrankensteinMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/abstractMode"},{"name":"freemem","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"fromBuffer","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromFd","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromMap","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"fromNow","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/date"},{"name":"fromRandomAccessReader","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"fromRangeOrRangeWithMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"fstat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fstatSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"FSWatcher","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/chokidar/types/index"},{"name":"fsync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fsyncSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ftruncate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ftruncateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"function","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Function","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"FunctionBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"futimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"futimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"fuzzyContains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"fuzzyScore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"FuzzyScore","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"fuzzyScoreGraceful","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"fuzzyScoreGracefulAggressive","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"GainNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Gamepad","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadButton","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadHapticActuator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GamepadPose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"generateIndent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentUtils"},{"name":"generateKeyPair","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"generateKeyPairSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"generateRandomChunkWithLF","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateRandomEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateRandomPipeName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"generateRandomReplaces","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateSequentialInserts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"generateTokensCSSForColorMap","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"generateUuid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uuid"},{"name":"Gesture","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/touch"},{"name":"get","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"get","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"getAbsoluteGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"getActiveEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"getActiveNotebookEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"getActiveTextEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"getActiveWebviewEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"getAllMethodNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"getAllPropertyNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"getAppDataPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/paths"},{"name":"getBaseLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"getBasenameTerms","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getBlinkMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getBreakpointMessageAndClassName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"getCharContainingOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getCharIndex","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharSheet"},{"name":"getCiphers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getCiphers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"getClientArea","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getCodeActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"getCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"getCodeForKeyCode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/keyboardEvent"},{"name":"getCodeLensData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codelens"},{"name":"getColorPresentations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/color"},{"name":"getColorRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"getColors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/colorPicker/color"},{"name":"getComparisonKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"getComputedStyle","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getComputedStyle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getConfigurationKeys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getConfigurationValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getContentHeight","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getContentWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getContext","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerView"},{"name":"getContext","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"getContextForContributedActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/callStackView"},{"name":"getContextMenuActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"getCorrelationContext","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"getCPUUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getCreationTime","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getCurrentActivationRecord","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"getCurrentKeyboardLayout","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"getCurves","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getCwd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDeclarationsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getDefaultIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getDefaultSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getDefaultShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDefaultShellArgs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getDefaultUserDataPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/paths"},{"name":"getDefaultValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"getDefaultValues","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getDefinitionsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getDelayedChannel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"getDiffieHellman","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getDisallowedIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getDispatchConfig","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/dispatchConfig"},{"name":"getDocumentFormattingEditsUntilResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getDocumentRangeFormattingEditsUntilResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getDocumentSymbols","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/documentSymbols"},{"name":"getDomainsOfRemotes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getDomNodePagePosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getDuration","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEditOperation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCommand"},{"name":"getEditorPartOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"getegid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getElementsByTagName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getEmptyExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getEnabledCategories","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"trace_events"},{"name":"getEncodedLanguageId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"getEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEntry","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"getEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"getErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"geteuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getExactExpressionStartAndEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getExcludes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"getExpandedBodySize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"getExtensionHostDebugSession","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getExtensionKind","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"getExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"getExtraColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils"},{"name":"getFileNamesMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"getFirstFrame","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"getGalleryExtensionId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getGalleryExtensionTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getgid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getGraphemeBreakType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getgroups","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getHashedRemotesFromConfig","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getHashes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"getHeapCodeStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapSnapshot","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapSpaceStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapStatistics","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"getHeapStatistics","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getHover","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/getHover"},{"name":"getIconClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputUtils"},{"name":"getIconClasses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/getIconClasses"},{"name":"getIconRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"getIdAndVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"getIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"getImplementationsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getInstalledExtensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"getInvalidTypeError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesValidation"},{"name":"getIOCounters","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getIssueReporterStyles","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueService"},{"name":"getKeyboardLayoutId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"getKeyMap","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"getLangEnvVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"getLanguages","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"getLargestChildWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getLastActiveWindow","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"getLeadingWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getLineEndOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"getLineStartOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/content"},{"name":"getLinks","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"getLocalExtensionTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getLogLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"getMac","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/macAddress"},{"name":"getMachineId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/id"},{"name":"getMachineInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"getMainProcessParentEnv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalEnvironment"},{"name":"getMaliciousExtensionsSet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"getManifest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/node/extensionManagementUtil"},{"name":"getMapForWordSeparators","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"getMatchedCSSRules","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getMaxListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"getMaxListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getMediaMime","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"getMenuBarVisibility","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"getMigratedSettingValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"getModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getModelMarkers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"getMultiSelectedEditorContexts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"getMultiSelectedResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getNextCodePoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getNextTickChannel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"getNLines","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"getNLSConfiguration","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/languagePacks"},{"name":"getNodeColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"getNodeIsInOverviewRuler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"getNodePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNodeType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNodeValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"getNonWhitespacePrefix","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsService"},{"name":"getOccurrencesAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordHighlighter/wordHighlighter"},{"name":"getOnTypeFormattingEdits","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getOnTypeRenameRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"getOpenEditorsViewMultiSelection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getOrDefault","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"getOrMakeSearchEditorInput","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput"},{"name":"getOrSet","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"getOuterEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"getOutOfWorkspaceEditorResources","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"getOutputSimpleEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform"},{"name":"getPackedSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getParseErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonErrorMessages"},{"name":"getPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"getPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"getPathFromAmdModule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/amd"},{"name":"getPathLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"getPathTerms","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"getPixelRatio","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getPlatformTextDecoder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"getPriority","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"getProcessCpuUsage","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProcessList","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProcessMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getProcessTree","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"getProxyAgent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/node/proxy"},{"name":"getQuickNavigateHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"getRandomElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"getRandomEOLSequence","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomInt","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils"},{"name":"getRandomTestPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/testUtils"},{"name":"getRealAndSyntheticDocumentFormattersOrdered","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/format/format"},{"name":"getReferencesAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getReindentEditOperations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"getRelativeLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"getRemoteAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"getRemoteName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"getRemotes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"getResizesObserver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/sizeObserver"},{"name":"getResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"getResourceForCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files"},{"name":"getRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"getSCMResourceContextKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/menus"},{"name":"getScopes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"getSearchView","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"getSelection","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"getSelectionKeyboardEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"getSelectionSearchString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"getServers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"getServiceMachineId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/serviceMachineId/common/serviceMachineId"},{"name":"getSettingsTargetName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"getShadowRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getShellEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/shellEnv"},{"name":"getSimpleCodeEditorWidgetOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions"},{"name":"getSimpleEditorOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions"},{"name":"getSimpleWorkspaceLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/label/common/label"},{"name":"getSingletonServiceDescriptors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/extensions"},{"name":"getSnippetSuggestSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"getSpaceCnt","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentUtils"},{"name":"getStackFrameThreadAndSessionToFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugService"},{"name":"getStateLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"getStdinFilePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"getStoredWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"getStringIdentifierForProxy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"GetStringRegKey","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/vscode-windows-registry/index"},{"name":"getSuggestionComparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"getSyncResourceFromLocalPreview","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getSystemMemoryInfo","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getSystemShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"getSystemVersion","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getTemplates","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskTemplates"},{"name":"getTerminalShellConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalConfiguration"},{"name":"getThemeTypeSelector","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"getTimeSinceLastZoomLevelChanged","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getTitleBarStyle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"getTokenClassificationRegistry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"getTopLeftOffset","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalHeight","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalScrollWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTotalWidth","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"getTypeDefinitionsAtPosition","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/goToSymbol"},{"name":"getuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"getUnpackedSettings","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"getUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"getUriFromAmdModule","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/amd"},{"name":"getUriFromSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"getUserDataSyncStore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"getVisbileViewContextKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"getVisibleAndSorted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"getVisibleState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"getWebviewContentMimeType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/mimeTypes"},{"name":"getWellFormedFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"getWindowsBuildNumber","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"getWindowsShell","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"getWindowsStateStoreData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsStateStorage"},{"name":"getWordAtText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"getWordDefinitionFor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"getWorkerBootstrapUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/worker/defaultWorkerFactory"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/browser/workspaces"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"getWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test"},{"name":"getWorkspaceSymbols","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"getXtermLineContent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"getZoomFactor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"getZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"global","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"GLOBAL_ACTIVITY_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/activity"},{"name":"GlobalActivityActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"globalAgent","kind":"let","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"globalAgent","kind":"let","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"GlobalCompareResourcesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"GlobalEditorMouseMoveMonitor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"GlobalExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService"},{"name":"globalGlob","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"GlobalMouseMoveMonitor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/globalMouseMoveMonitor"},{"name":"GlobalNewUntitledFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"GlobalRemoveRootFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"globals","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"globalShortcut","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"GlobalStateSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/globalStateSync"},{"name":"GlobalStorageDatabaseChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageIpc"},{"name":"GlobalStorageDatabaseChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageIpc"},{"name":"GlobalStyleSheet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"globalThis","kind":"module","kindModifiers":"","sortText":"4"},{"name":"GlobPattern","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"GlyphHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverWidgets"},{"name":"GlyphMarginOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin"},{"name":"GOTO_NEXT_CHANGE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"GOTO_PREVIOUS_CHANGE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"GotoDefinitionAtPositionEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess"},{"name":"GotoLineAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess"},{"name":"GoToLineNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"GotoLineQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess"},{"name":"GotoSymbolAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess"},{"name":"GotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess"},{"name":"gracefulify","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/graceful-fs/index"},{"name":"grammarsExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMGrammars"},{"name":"Graph","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/graph"},{"name":"GraphemeBreakType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Grid","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"GridView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"GridViewSizing","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"group","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"groupBy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"groupBy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"groupByExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagementUtil"},{"name":"GroupChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"groupCollapsed","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"GroupDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"groupEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"groupIntersect","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"GroupLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupOrientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupsArrangement","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupsOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"GroupType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"gt","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"gte","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"gtr","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"guessIndentation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/indentationGuesser"},{"name":"guessMimeTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"gunzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gunzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"gzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"handleANSIOutput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform"},{"name":"handleANSIOutput","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugANSIHandling"},{"name":"Handler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"handleVetos","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"hang","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"hasChildProcesses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"hasClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"hasFileFolderCopyCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hasFileReadStreamCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"Hash","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"HashChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Hasher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"hashPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/node/backupFileService"},{"name":"hasOpenReadWriteCloseCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"hasParentWithClass","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"hasReadWriteCapability","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"HasSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"hasSiblingFn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"hasSiblingPromiseFn","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"hasStdinWithoutTty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"hasTextDecoder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/stringBuilder"},{"name":"hasToIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"hasTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"hasUncaughtExceptionCaptureCallback","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"hasWorkspaceFileExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"hc_black","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"HC_THEME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"Headers","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HelpQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/helpQuickAccess"},{"name":"HiddenAreasRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"HiddenRangeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/hiddenRangeModel"},{"name":"hide","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"HIDE_NOTIFICATION_TOAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"HIDE_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"HideNotificationsCenterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"HideWebViewEditorFindCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"HideWelcomeOverlayAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay"},{"name":"HIGH_CONTRAST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"HighlightedLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/highlightedlabel/highlightedLabel"},{"name":"HighlightMatchesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"history","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"History","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HistoryInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"HistoryNavigationEnablementContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"HistoryNavigationWidgetContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/browser/contextScopedHistoryWidget"},{"name":"HistoryNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/history"},{"name":"HistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/browser/history"},{"name":"HitTestContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"HIVES","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCC","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCR","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKCU","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKLM","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"HKU","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"Hmac","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"homedir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"HorizontalPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"HorizontalRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"HorizontalScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/horizontalScrollbar"},{"name":"horizontalScrollingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"HostExtension","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionActivator"},{"name":"hostname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"HotExitConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"Hover","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Hover","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Hover","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"HoverOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverOperation"},{"name":"HoverProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"HoverStartMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hoverOperation"},{"name":"hrtime","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"HSLA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"HSVA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"HTMLAllCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAnchorElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAppletElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAreaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLAudioElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBaseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBaseFontElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBodyElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLBRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLButtonElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLCanvasElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDataElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDataListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDetailsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDialogElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDirectoryElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDivElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLDocument","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLEmbedElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFieldSetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFontElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFormControlsCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFormElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFrameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLFrameSetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHeadElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHeadingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLHtmlElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLIFrameElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLInputElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLabelElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLegendElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLIElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLLinkElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMapElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMarqueeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMediaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMenuElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMetaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLMeterElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLModElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLObjectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptGroupElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOptionsCollection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLOutputElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLParagraphElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLParamElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLPictureElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLPreElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLProgressElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLQuoteElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLScriptElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSelectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSlotElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSourceElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLSpanElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLStyleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableCaptionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableColElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableDataCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableHeaderCellElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableRowElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTableSectionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTemplateElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTextAreaElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTimeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTitleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLTrackElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLUListElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLUnknownElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"HTMLVideoElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Http2ServerRequest","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"Http2ServerResponse","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"http2"},{"name":"HttpProxyAgent","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/http-proxy-agent/index"},{"name":"IAccessibilityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/accessibility/common/accessibility"},{"name":"IActivityBarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activityBar/browser/activityBarService"},{"name":"IActivityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"IAuthenticationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/authentication/browser/authenticationService"},{"name":"IUserDataSyncAccountService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount"},{"name":"IBackupFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backup"},{"name":"IBackupMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backup"},{"name":"IBreadcrumbsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/breadcrumbs"},{"name":"IBulkEditService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/bulkEditService"},{"name":"ICACLS_PATH","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"IClipboardService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/clipboard/common/clipboardService"},{"name":"ICodeEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorService"},{"name":"ICodeLensCache","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codelens/codeLensCache"},{"name":"ICommandService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"ICommentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentService"},{"name":"IconBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"IConfigurationResolverService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolver"},{"name":"IConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"iconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"IconLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/iconLabel/iconLabel"},{"name":"iconsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"IContextKeyService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"IContextMenuService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextView"},{"name":"IContextViewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextview/browser/contextView"},{"name":"ICredentialsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/credentials/common/credentials"},{"name":"ICredentialsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/common/credentials"},{"name":"ICustomEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/customEditor/common/customEditor"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/common/driver"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"ID_EDITOR_WORKER_SERVICE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerService"},{"name":"ID_INDENT_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"ID_INIT_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/intializingRangeProvider"},{"name":"ID_SYNTAX_PROVIDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"IDBCursor","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBCursorWithValue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBDatabase","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBFactory","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBIndex","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBKeyRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBObjectStore","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBOpenDBRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBTransaction","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDBVersionChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IDebugHelperService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"IDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"IDecorationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/decorations/browser/decorations"},{"name":"IdentityCoordinatesConverter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"IdentityLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"IdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"IdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"IdGenerator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/idGenerator"},{"name":"IDiagnosticsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/node/diagnosticsService"},{"name":"IDialogMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/electron-main/dialogs"},{"name":"IDialogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"IdleValue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IdObject","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"IDownloadService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/download/common/download"},{"name":"idPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"IDriver","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/common/driver"},{"name":"IEditorGroupsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"IEditorProgressService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"IEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"IEditorWorkerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/editorWorkerService"},{"name":"IElectronMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/electron-main/electronMainService"},{"name":"IElectronService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/electron/node/electron"},{"name":"IEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/common/environment"},{"name":"IEnvironmentVariableService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariable"},{"name":"IExperimentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/common/experimentService"},{"name":"IExplorerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"IExtensionGalleryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionHostDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/debug/common/extensionHostDebug"},{"name":"IExtensionHostProfileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"IExtensionManagementServerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IExtensionManagementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionRecommendationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IExtensionResourceLoaderService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader"},{"name":"IExtensionService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"IExtensionStoragePaths","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStoragePaths"},{"name":"IExtensionsWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"IExtensionTipsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"IExtensionUrlHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionUrlHandler"},{"name":"IExternalTerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/common/externalTerminal"},{"name":"IExtHostApiDeprecationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"IExtHostCommands","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostCommands"},{"name":"IExtHostConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostConfiguration"},{"name":"IExtHostDebugService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"IExtHostDecorations","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDecorations"},{"name":"IExtHostDocumentsAndEditors","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentsAndEditors"},{"name":"IExtHostExtensionService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"IExtHostInitDataService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostInitDataService"},{"name":"IExtHostOutputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"IExtHostRpcService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRpcService"},{"name":"IExtHostSearch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"IExtHostStorage","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostStorage"},{"name":"IExtHostTask","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"IExtHostTerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"IExtHostTimeline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTimeline"},{"name":"IExtHostTunnelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"IExtHostWorkspace","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostWorkspace"},{"name":"if","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"ifError","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"IFileDialogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/common/dialogs"},{"name":"IFilesConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService"},{"name":"IFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"IframeUtils","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/iframe"},{"name":"IFrameWebview","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewElement"},{"name":"IGlobalExtensionEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ignoreBracketsInToken","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"ignoreErrors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IgnoreExtensionRecommendationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"IHistoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/common/history"},{"name":"IHostService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/host/browser/host"},{"name":"IHostUtils","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostExtensionService"},{"name":"IInstantiationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"IIntegrityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/common/integrity"},{"name":"IIRFilterNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/node/issue"},{"name":"IJSONEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"IKeybindingEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingEditing"},{"name":"IKeybindingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybinding"},{"name":"IKeymapService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"ILabelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/label/common/label"},{"name":"ILaunchMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"ILayoutService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/layout/browser/layoutService"},{"name":"ILifecycleMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"ILifecycleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"IListService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"illegalArgument","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"illegalState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ILocalizationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"ILoggerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"ILogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"Image","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IMAGE_PREVIEW_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"ImageBitmap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ImageBitmapRenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ImageData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IMainProcessService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/mainProcessService"},{"name":"IMarkerData","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"IMarkerDecorationsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/markersDecorationService"},{"name":"IMarkerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"IMarkersWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"IMenubarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"IMenuService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"ImmortalReference","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"IMMUTABLE_CODE_TO_KEY_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"IMMUTABLE_KEY_CODE_TO_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"IModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelService"},{"name":"IModeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modeService"},{"name":"impactsEditorPartOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editor"},{"name":"ImplementationProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"implements","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"import","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"importEntries","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"importScripts","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"in","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"inAppPurchase","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"inc","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"IncomingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"IncomingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"IncreaseSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"IncreaseViewSizeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"incrementFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"IndentAction","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"IndentAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfiguration"},{"name":"IndentAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"IndentationToSpacesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToSpacesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToTabsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentationToTabsCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/indentRules"},{"name":"IndentGuidesOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/indentGuides/indentGuides"},{"name":"IndentLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"IndentRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"IndentRulesSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/indentRules"},{"name":"IndentUsingSpaces","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"IndentUsingTabs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"index","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"indexedDB","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"INDEXEDDB_LOGS_OBJECT_STORE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"INDEXEDDB_VSCODE_DB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"IndexedDBLogProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/browser/indexedDBLogProvider"},{"name":"indexOfPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"IndexTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTree"},{"name":"IndexTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"InEditorZenModeContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"Infinity","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"inflate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateRaw","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateRawSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"inflateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"info","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Information","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"inherits","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"INITIAL","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"initialize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.worker"},{"name":"InitializingRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/intializingRangeProvider"},{"name":"InlineDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"InlineDecorationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"InlineDiffMargin","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/widget/inlineDiffMargin"},{"name":"InMemoryBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/common/backupFileService"},{"name":"InMemoryFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/inMemoryFilesystemProvider"},{"name":"InMemoryLogProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/common/inMemoryLogProvider"},{"name":"InMemoryStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"InMemoryStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"InMemoryTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"innerHeight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"innerWidth","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"INotebookService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"INotificationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"InPlaceReplaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/inPlaceReplace/inPlaceReplaceCommand"},{"name":"inputActiveOptionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputActiveOptionBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"InputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"InputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"InputDeviceInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"InputEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"InputFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"InputFocusedContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"inputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputPlaceholderForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputsSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configurationResolver/common/configurationResolverSchema"},{"name":"inputValidationErrorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationErrorBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"InputValidationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"inputValidationWarningBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationWarningBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inputValidationWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"inQuickPickContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"InQuickPickContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"inQuickPickContextKeyValue","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/quickaccess"},{"name":"inRecentFilesPickerContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"insane","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/insane/insane"},{"name":"InSearchEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"insert","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"InsertCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"InsertCodeCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"InsertCursorAbove","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"InsertCursorBelow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"InsertLineAfterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"InsertLineBeforeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"InsertMarkdownCellAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookActions"},{"name":"inspect","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"INSPECT_MAX_BYTES","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"InspectTokensNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"INSTALL_ERROR_INCOMPATIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"INSTALL_ERROR_MALICIOUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"INSTALL_ERROR_NOT_SUPPORTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"InstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallAnotherVersionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallCountWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"InstallExtensionQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess"},{"name":"InstallExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallInOtherServerAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallLocalExtensionsInRemoteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallOperation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"InstallRecommendedExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallSpecificVersionOfExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallVSIXAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"InstallWorkspaceRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"instanceof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"instanceStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"InstantiationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiationService"},{"name":"Int16Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Int32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Int8Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IntegrityServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/integrity/node/integrityService"},{"name":"interface","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Interface","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"INTERNAL_CONSOLE_OPTIONS_SCHEMA","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"InternalEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorAction"},{"name":"InternalModelContentChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"IntersectionObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"IntersectionObserverEntry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"intersects","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"intervalCompare","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"IntervalNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"IntervalTimer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IntervalTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"Intl","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"IOpenerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"IOutputChannelModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModel"},{"name":"IOutputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"IPadShowKeyboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard"},{"name":"IPanelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/panel/common/panelService"},{"name":"IPathService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/common/pathService"},{"name":"IPCClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ipcMain","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"ipcRenderer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"IPCServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"IPeekViewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"IPreferencesSearchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"IPreferencesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"IProductService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/product/common/productService"},{"name":"IProgressService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"IQuickInputService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickInput"},{"name":"IRemoteAgentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentService"},{"name":"IRemoteAuthorityResolverService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"IRemoteExplorerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"IReplaceService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/replace"},{"name":"IRequestService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"IResourceIdentityService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/common/resourceIdentityService"},{"name":"IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"isAbsolute","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"isAbsolute","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"isAbsolutePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isActive","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-mutex/index"},{"name":"isAncestor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isArray","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isatty","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"isBasicASCII","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isBoolean","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isBoolean","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isBuffer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IsCenteredLayoutContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isChrome","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"ISCMService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"isCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isCompositeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isCompressedFolderName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerViewer"},{"name":"isConfigurationOverrides","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"isContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"isDate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isDebuggerMainContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isDecorationOptionsArr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"isDeepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IsDevelopmentContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isDiffEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"isDiffEditorConfigurationKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"isDirtyDiffVisible","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"isDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"ISearchHistoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchHistoryService"},{"name":"ISearchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"ISearchWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"isEdge","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isEdgeWebView","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isEditorConfigurationKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"isEditorInputWithOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isElevated","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-is-elevated/index"},{"name":"isEmojiImprecise","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isEmptyMarkdownString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"isEmptyObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isEngineValid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isEOL","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonFormatter"},{"name":"isEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isEqual","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isEqualAuthority","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isEqualOrParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isEqualOrParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"isError","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isErrorWithActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorsWithActions"},{"name":"isExcludeSetting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"isFalsyOrEmpty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"isFalsyOrWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isFileMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isFilePatternMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isFileToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"isFilterResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/indexTreeModel"},{"name":"isFinite","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"isFirefox","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isFolderToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"isFullscreen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"IsFullscreenContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"isFullWidthCharacter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isFunction","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isFunction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isFuzzyAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isFuzzyActionArr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isGridBranchNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"isGridBranchNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"ISharedProcessMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-main/sharedProcessMainService"},{"name":"ISharedProcessService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/sharedProcessService"},{"name":"isHighSurrogate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isHTMLElement","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isIAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isIExtensionIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"isIExtensionIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"ISignService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/common/sign"},{"name":"isIMenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"isInDOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isInShadowDOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isIOS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isIP","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isIPad","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isIPv4","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isIPv6","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"isISOKeyboard","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"isISubmenuItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"isKeymapExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"isLanguagePackExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"isLinux","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsLinuxContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isLittleEndian","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isLocationLink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"isLowerAsciiLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isLowSurrogate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"IsMacContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isMacintosh","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsMacNativeContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isMainFrame","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"isMainThread","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"isMarkdownString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"isMaster","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"isMenubarMenuItemAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemSubmenu","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMenubarMenuItemUriAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/node/menubar"},{"name":"isMessageOfType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"isMultilineRegexSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"isNamedProblemMatcher","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"isNaN","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"isNative","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"ISnippetsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippets.contribution"},{"name":"isNonEmptyArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"isNotificationViewItem","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"isNull","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNullOrUndefined","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNullRange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"isNumber","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isNumber","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isObject","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isObject","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isOpera","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isParent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"isPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isPatternInWord","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"isPrimitive","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isProgressMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isPromiseCanceledError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"isQuote","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"isRawFileWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRawUriWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isReadableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"isRecentFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRecentFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRecentWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isRegExp","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isRelativePattern","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"isRemoteConsoleLog","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"isRemoteDiagnosticError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/diagnostics/common/diagnostics"},{"name":"isRootOrDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isRootUser","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"isSafari","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isSCMRepository","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSCMResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSCMResourceGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/util"},{"name":"isSearchViewFocused","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"isSecureContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"isSelectionRangeChangeEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"isSelectionSingleChangeEvent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"isSemanticColoringEnabled","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"isSerializedEditorGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/editorGroup"},{"name":"isSerializedFileMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSerializedSearchComplete","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSerializedSearchSuccess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"isSessionAttach","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isShadowRoot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"isSingleFolderWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isSingleFolderWorkspaceInitializationPayload","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isStandalone","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isStatusbarInDebugMode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"isStoredWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isString","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"isStringArray","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isSuccess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/request"},{"name":"IssueMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/electron-main/issueMainService"},{"name":"IssueReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterMain"},{"name":"IssueReporterModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterModel"},{"name":"issueReporterPage","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterPage"},{"name":"IssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/issue/electron-browser/issueService"},{"name":"IssueType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/node/issue"},{"name":"isSymbol","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"IStandaloneThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/standaloneThemeService"},{"name":"IStateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/state"},{"name":"IStaticExtensionsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/staticExtensions"},{"name":"IStatusbarService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/statusbar/common/statusbar"},{"name":"isTextEditorPane","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"isThemeColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"isThenable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"IStorageKeysSyncRegistryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/storageKeys"},{"name":"IStorageMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageMainService"},{"name":"IStorageService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"ISuggestDataDtoField","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"ISuggestMemoryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"ISuggestResultDtoField","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"isUNC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isUndefined","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"isUndefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isUndefinedOrNull","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"isUnspecific","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"isUntitledWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isUpper","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"isUpperAsciiLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"isUri","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugUtils"},{"name":"isURLDomainTrusted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsValidator"},{"name":"isUTFEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"isUUID","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uuid"},{"name":"isValidBasename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isValidExtensionVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isValidLocalization","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"isValidMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"isValidVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isValidVersionStr","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isVersionValid","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"isWeb","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsWebContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isWebKit","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isWebkitWebView","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"isWindows","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"IsWindowsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkeys"},{"name":"isWindowsDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"isWorker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"isWorkspaceBackupInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/backup/electron-main/backup"},{"name":"isWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"isWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"isWorkspaceToOpen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/common/windows"},{"name":"ISymbolNavigationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/symbolNavigation"},{"name":"it","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ITaskService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskService"},{"name":"ITelemetryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"ItemActivation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"Iterable","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/iterator"},{"name":"ITerminalInstanceService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"ITerminalNativeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ITerminalService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"ITextFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"ITextMateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"ITextModelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/resolverService"},{"name":"ITextResourceConfigurationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationService"},{"name":"ITextResourcePropertiesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationService"},{"name":"IThemeMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/electron-main/themeMainService"},{"name":"IThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ITimelineService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"ITimerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/timer/electron-browser/timerService"},{"name":"ITitleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/title/common/titleService"},{"name":"ITunnelService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/tunnel"},{"name":"IUndoRedoService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedo"},{"name":"IUntitledTextEditorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorService"},{"name":"IUpdateService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"IURITransformerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUriTransformerService"},{"name":"IURLService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/url"},{"name":"IUserDataAutoSyncService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncBackupStoreService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncLogService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncStoreService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IUserDataSyncUtilService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"IViewDescriptorService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"IViewletService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/viewlet/browser/viewlet"},{"name":"IViewsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"IWebIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/browser/issueService"},{"name":"IWebviewService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"IWebviewWorkbenchService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"IWindowsMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windows"},{"name":"IWorkbenchEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/common/environmentService"},{"name":"IWorkbenchExtensionEnablementService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement"},{"name":"IWorkbenchIssueService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issue"},{"name":"IWorkbenchLayoutService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"IWorkbenchThemeService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"IWorkingCopyFileService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileService"},{"name":"IWorkingCopyService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"IWorkspace","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspaceContextService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspaceEditingService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/common/workspaceEditing"},{"name":"IWorkspaceFolder","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"IWorkspacesHistoryMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService"},{"name":"IWorkspacesMainService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"IWorkspacesService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"IWorkspaceTagsService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/common/workspaceTags"},{"name":"javascriptOnEnterRules","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules"},{"name":"join","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"join","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"join","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"JoinAllGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"JoinLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"joinPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"JoinTwoGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"JSON","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"JSONEditingError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"JSONEditingErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditing"},{"name":"JSONEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/jsonEditingService"},{"name":"JsonSchemaVersion","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"JsonSchemaVersion","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"JSONValidationExtensionPoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/jsonValidationExtensionPoint"},{"name":"JUMP_TO_CURSOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"KEEP_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_NOT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_IS_OPEN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_TEXT_NOT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"KEYBINDING_ENTRY_TEMPLATE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/keybindingsEditorModel"},{"name":"KeybindingEditorDecorationsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"KeybindingIO","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingIO"},{"name":"KeybindingLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/keybindingLabel/keybindingLabel"},{"name":"KeybindingParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingParser"},{"name":"KeybindingResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingResolver"},{"name":"KEYBINDINGS_EDITOR_CLEAR_INPUT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_COPY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_DEFINE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_REMOVE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_RESET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KeybindingsEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingEditing"},{"name":"KeybindingsEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditor"},{"name":"KeybindingsEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"KeybindingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/keybindingsEditorModel"},{"name":"KeybindingSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybinding"},{"name":"KeybindingsRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"KeybindingsSearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingWidgets"},{"name":"KeybindingsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/keybindingsSync"},{"name":"KeybindingWeight","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/keybindingsRegistry"},{"name":"KeybindingWidgetRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution"},{"name":"KEYBOARD_LAYOUT_OPEN_PICKER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"KeyboardEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"KeyboardLayoutContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keyboardLayouts/_.contribution"},{"name":"KeyboardLayoutPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker"},{"name":"KeyboardLayoutPickerContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/keyboardLayoutPicker"},{"name":"KeyboardMapperFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/electron-browser/nativeKeymapService"},{"name":"keyboardNavigationSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"KeyboardSupport","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/canIUse"},{"name":"KeyChord","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"KeyCode","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"KeyCodeUtils","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyedTaskIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"KeyframeEffect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"keyFromOverrideIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"KeymapExtensions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"KeymapInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"KeymapRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/keymapRecommendations"},{"name":"KeyMod","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"KeyMod","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneBase"},{"name":"KeyMod","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"KeyObject","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"keyof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"keys","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"KeytarCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/credentials/node/credentialsService"},{"name":"KeytarCredentialsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/credentials/node/credentialsService"},{"name":"KeyValueLogProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/log/common/keyValueLogProvider"},{"name":"kill","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"KillTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"kMaxLength","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"knownAcronyms","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"KnownSnippetVariableNames","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"knownTermMappings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"kStringMaxLength","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"Label","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"LabelContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/remote.contribution"},{"name":"LabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/label/common/labelService"},{"name":"language","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Language","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"LanguageConfigurationChangeEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageConfigurationFileHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint"},{"name":"LanguageConfigurationRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageConfigurationRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"LanguageFeatureRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageFeatureRegistry"},{"name":"LanguageId","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LanguageIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LanguagePackCachedDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner"},{"name":"languages","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"languages","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"LanguageSelector","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"languagesExtPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/mode/common/workbenchModeService"},{"name":"LanguagesRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/languagesRegistry"},{"name":"LanguageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/common/localizations"},{"name":"LargeFileOptimizationsWarner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/largeFileOptimizations"},{"name":"LAST_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"lastIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"lastNonWhitespaceIndex","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"lastSessionDateStorageKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"LAUNCH_CONFIGURATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"LaunchMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/launch/electron-main/launchMainService"},{"name":"launchSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"launchSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"layout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"Layout","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/layout"},{"name":"LAYOUT_EDITOR_GROUPS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"LayoutAnchorPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/contextview/contextview"},{"name":"LayoutController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"LayoutData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget"},{"name":"LayoutPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"LazilyResolvedWebviewEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"Lazy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lazy"},{"name":"lazyEnv","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"LazyOutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostOutput"},{"name":"LazyPromise","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/lazyPromise"},{"name":"lchmod","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchmodSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchown","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lchownSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"LcsDiff","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"lcut","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"leftest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"leftRotate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"LEGACY_CONSOLE_MODE_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"legacy_ENV_iKey","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"length","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"let","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"lexer","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Lexer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"LifecycleMainPhase","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"LifecycleMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"LifecyclePhase","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"LifecyclePhaseToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"LIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"LightBulbWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/lightBulbWidget"},{"name":"lighten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Limiter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"LineBreakData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"LineCommentCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/lineCommentCommand"},{"name":"LineContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/completionModel"},{"name":"LineContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"LineDecoder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/decoder"},{"name":"LineDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"LineDecorationsNormalizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/lineDecorations"},{"name":"LineNumbersOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers"},{"name":"LinePartMetadata","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"LineProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"LineRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"LinesDecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations"},{"name":"LinesLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/linesLayout"},{"name":"LineStarts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"LineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/lineTokens"},{"name":"LineTokens2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"LineVisibleRanges","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"link","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Link","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"Link","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/browser/link"},{"name":"LINK_INTERCEPT_THRESHOLD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"LinkComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"LinkDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/links"},{"name":"LinkDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/linkDetector"},{"name":"LinkedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedList"},{"name":"LinkedMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"LinkedText","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedText"},{"name":"LinkProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"LinksList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/links/getLinks"},{"name":"linkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"linuxDistro","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminal"},{"name":"LinuxDistro","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"LinuxExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"LinuxUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.linux"},{"name":"List","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"listActiveSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listActiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listDeemphasizedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ListDragOverEffect","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"ListDragOverReactions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"listDropBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listenerCount","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"listenerCount","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"listenerCount","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"listeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"listeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ListeningStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ListError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/list"},{"name":"listErrorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetNoMatchesOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFilterWidgetOutline","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFocusBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listFocusForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listHoverForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveFocusBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInactiveSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listInvalidItemForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"listProcesses","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ps"},{"name":"ListResourceNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"ListService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"ListSettingListModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ListSettingWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ListView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listView"},{"name":"listWarningForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"loadavg","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"LOADED_SCRIPTS_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"LoadedScriptsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/loadedScriptsView"},{"name":"LoaderEvent","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"LoaderEventType","kind":"enum","kindModifiers":"declare","sortText":"4"},{"name":"LOADIPHLPAPI","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"loadLocalResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"loadWASM","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"LOCAL_MACHINE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"locale","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"LocalInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"LocalizationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/localizations/node/localizations"},{"name":"LocalizationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/localizations/electron-browser/localizationsService"},{"name":"LocalizationWorkbenchContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/localizations.contribution"},{"name":"localize","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/nls"},{"name":"localize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/nls.mock"},{"name":"localizeManifest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionNls"},{"name":"LocalSearchProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"LocalSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchService"},{"name":"LocalSelectionTransfer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"localStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"location","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"location","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Location","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Location","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Location","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"locationbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"log","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"log","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"log","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"log","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"log","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"LOG_MIME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LOG_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LOG_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"LogAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"LogContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputServices"},{"name":"Logger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionPoints"},{"name":"LoggerChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"LoggerChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/logIpc"},{"name":"LoggerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/loggerService"},{"name":"LogLevel","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"LogLevel","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"LogLevel","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"LogLevel","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"LogLevel","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/workbench.web.api"},{"name":"logOnceWebWorkerWarning","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"logRemoteEntry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/remoteConsoleUtil"},{"name":"LogsDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsDataCleaner"},{"name":"LogsDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner"},{"name":"LogServiceAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"logStorage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"LogViewer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/logViewer"},{"name":"LogViewerInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/logViewer"},{"name":"LONG_LINE_BOUNDARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"LongRunningOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"lookup","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"lookupService","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"LowerCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"LRUCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"LRUMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"lstat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lstat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"lstatSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lt","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"lte","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ltr","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ltrim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"lutimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"lutimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"MacExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"machineIdKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"machineOverridableSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"machineSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"machineSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"MacLinuxFallbackKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper"},{"name":"MacLinuxKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"macLinuxKeyboardMappingEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/web.main"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cli"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"main","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/desktop.main"},{"name":"Main","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/cliProcessMain"},{"name":"MainContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"mainLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"mainModule","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"MainPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/mainPane"},{"name":"MainPaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/mainPane"},{"name":"MainProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-browser/mainProcessService"},{"name":"MAINTAIN_UNDO_REDO_STACK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"MainThreadAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadAuthentication"},{"name":"MainThreadAuthenticationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadAuthentication"},{"name":"MainThreadClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadClipboard"},{"name":"MainThreadCommands","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadCommands"},{"name":"MainThreadCommentController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadComments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadCommentThread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadComments"},{"name":"MainThreadConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadConfiguration"},{"name":"MainThreadConsole","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadConsole"},{"name":"MainThreadDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDebugService"},{"name":"MainThreadDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDecorations"},{"name":"MainThreadDiagnostics","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDiagnostics"},{"name":"MainThreadDialogs","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDialogs"},{"name":"MainThreadDocumentContentProviders","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocumentContentProviders"},{"name":"MainThreadDocumentRangeSemanticTokensProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadDocuments","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocuments"},{"name":"MainThreadDocumentsAndEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors"},{"name":"MainThreadDocumentSemanticTokensProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadDownloadService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadDownloadService"},{"name":"MainThreadEditorInsets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadCodeInsets"},{"name":"MainThreadErrors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadErrors"},{"name":"MainThreadExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadExtensionService"},{"name":"MainThreadFileSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadFileSystem"},{"name":"MainThreadFileSystemEventService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService"},{"name":"MainThreadKeytar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadKeytar"},{"name":"MainThreadLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLabelService"},{"name":"MainThreadLanguageFeatures","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures"},{"name":"MainThreadLanguages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLanguages"},{"name":"MainThreadLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadLogService"},{"name":"MainThreadMessageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadMessageService"},{"name":"MainThreadNotebookController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadNotebookDocument","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadNotebooks","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadNotebook"},{"name":"MainThreadOutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadOutputService"},{"name":"MainThreadProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadProgress"},{"name":"MainThreadQuickOpen","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen"},{"name":"MainThreadSCM","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSCM"},{"name":"MainThreadSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSearch"},{"name":"MainThreadStatusBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadStatusBar"},{"name":"MainThreadStorage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadStorage"},{"name":"MainThreadTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTask"},{"name":"MainThreadTelemetry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTelemetry"},{"name":"MainThreadTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTerminalService"},{"name":"MainThreadTextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditor"},{"name":"MainThreadTextEditorProperties","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditor"},{"name":"MainThreadTextEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadEditors"},{"name":"MainThreadTheming","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTheming"},{"name":"MainThreadTimeline","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTimeline"},{"name":"MainThreadTreeViews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTreeViews"},{"name":"MainThreadTunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadTunnelService"},{"name":"MainThreadUrls","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadUrls"},{"name":"MainThreadWebviews","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWebview"},{"name":"MainThreadWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWindow"},{"name":"MainThreadWorkspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadWorkspace"},{"name":"major","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"MakeAddress","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"MaliciousExtensionChecker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"MaliciousStatusLabelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ManageAuthorizedExtensionURIsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/extensionUrlHandler"},{"name":"ManageAutomaticTaskRunning","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks"},{"name":"ManageExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ManageExtensionsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess"},{"name":"ManagementPersistentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"manageTrustedDomainSettingsCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"MANIFEST_CACHE_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"Map","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"mapArrayOrNot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"mapPager","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"mapToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"Margin","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/margin/margin"},{"name":"MarginViewLineDecorationsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations"},{"name":"MarginViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"mark","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/performance"},{"name":"markAsFileSystemProviderError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"MarkdownCellRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"MarkdownCellViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel"},{"name":"markdownEscapeEscapedCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"MarkdownRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/markdown/markdownRenderer"},{"name":"MarkdownRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/mdRenderer"},{"name":"MarkdownString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"MarkdownString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"MarkdownString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"MarkdownString","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"markdownUnescapeCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"marked","kind":"alias","kindModifiers":"declare","sortText":"4"},{"name":"markedStringsEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"Marker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"Marker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"MarkerController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoError"},{"name":"MarkerDecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/markerDecorationsServiceImpl"},{"name":"MarkerNavigationWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoErrorWidget"},{"name":"MarkerRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markerService"},{"name":"MarkerSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"MarkerSeverity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MarkerSeverity","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"MarkersFilterActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"MarkersFilters","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"MarkersModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"MarkersTreeAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkersView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersView"},{"name":"MarkersViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"MarkersWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markers"},{"name":"MarkerTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/markers/common/markers"},{"name":"MarkerTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MarkerTag","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"MarkerViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"markTimeline","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"mas","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"match","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"match","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"Match","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"MATCHES_LIMIT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"matchesCamelCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesContiguousSubString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzy2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesFuzzyCodiconAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"matchesPrefix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesScheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"matchesStrictPrefix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesSubString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"matchesWords","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"MatchFindAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"MatchFocusKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"matchMedia","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MatchRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"Math","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MAX_BYTES_ON_DISK","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"MAX_CONNECTION_FAILURES_BEFORE_WARN","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"MAX_FILE_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MAX_FOLDING_REGIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"MAX_HEAP_SIZE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MAX_LINE_NUMBER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingRanges"},{"name":"MAX_OUTPUT_LENGTH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"MAX_VALUE_RENDER_LENGTH_IN_VIEWLET","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"maxHeaderSize","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"MaximizeGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"maxSatisfying","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"mayIncludeActionsOfKind","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/types"},{"name":"measure","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Measurement","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPointType"},{"name":"MediaDeviceInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaDevices","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaElementAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaEncryptedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeyMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeys","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeySession","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeyStatusMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaKeySystemAccess","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaQueryList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaQueryListEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamAudioDestinationNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrackAudioSourceNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MediaStreamTrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Memento","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/memento"},{"name":"memoize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"memory","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Memory","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"memoryUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Menu","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Menu","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"MENU_ESCAPED_MNEMONIC_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"MENU_MNEMONIC_REGEX","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"menuBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menubar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Menubar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/electron-main/menubar"},{"name":"MenuBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menubar"},{"name":"MENUBAR_SELECTION_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MENUBAR_SELECTION_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MENUBAR_SELECTION_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"MenubarControl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/menubarControl"},{"name":"MenubarMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/menubar/electron-main/menubarMainService"},{"name":"MenubarService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/menubar/electron-browser/menubarService"},{"name":"menuBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuEntryActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/browser/menuEntryActionViewItem"},{"name":"menuForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuId","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"MenuItem","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"MenuItemAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"MenuItemExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"MenuPreventer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/menuPreventer"},{"name":"MenuRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"menuSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSelectionBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"menuSeparatorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/menuService"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/extensionsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/keybindingsMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/globalStateMerge"},{"name":"merge","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/snippetsMerge"},{"name":"mergeAllGroups","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"mergeBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"mergeCommonContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCommonHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCurrentContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeCurrentHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MergedEnvironmentVariableCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableCollection"},{"name":"mergeEnvironments","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"MergeGroupMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"mergeIncomingContentBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergeIncomingHeaderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"mergePagers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"mergeSort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"MergeWindowTabsHandlerHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"MessageChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessageChannel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"MessageController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/message/messageController"},{"name":"MessageData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MessageData"},{"name":"MessageData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"MessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessagePort","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MessagePort","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"Messages","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/messages"},{"name":"MessageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/inputbox/inputBox"},{"name":"MessageType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionHostProtocol"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"MetadataConsts","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"METHODS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"MetricData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MetricData"},{"name":"MetricData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"MIME_BINARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MIME_TEXT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MIME_UNKNOWN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"MimeType","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MimeTypeArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MimeTypeRendererResolver","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"mimeTypeSupportedByCore","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"MIN_MAX_MEMORY_SIZE_MB","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/files"},{"name":"Minimap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimap"},{"name":"MINIMAP_GUTTER_WIDTH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"minimapBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MinimapCharRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharRenderer"},{"name":"MinimapCharRendererFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapCharRendererFactory"},{"name":"minimapError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapGutterAddedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"minimapGutterDeletedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"minimapGutterModifiedBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MinimapLinesRenderingData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"MinimapPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"MinimapPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"minimapSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderActiveBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimapSliderHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"MinimapTokensColorTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/minimapTokensColorTracker"},{"name":"minimapWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"minimist","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/minimist/index"},{"name":"MinimizeOtherGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MINIMUM_LETTER_SPACING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"minimumTranslatedStrings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/localizations/browser/minimalTranslations"},{"name":"minor","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"minSatisfying","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"minVersion","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"MirrorTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/mirrorTextModel"},{"name":"MissingDependencyError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"mixin","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"mkdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdirp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"mkdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdtemp","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mkdtempSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"mnemonicButtonLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"mnemonicMenuLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"mocha","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Mocha","kind":"class","kindModifiers":"declare","sortText":"4"},{"name":"mock","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"MockContextKeyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/test/common/mockKeybindingService"},{"name":"MockDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/test/common/mockKeybindingService"},{"name":"MockMode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/mockMode"},{"name":"MockObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/mockSearchTree"},{"name":"MockRawSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/test/common/mockDebug"},{"name":"MockTextAreaWrapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/controller/textAreaState.test"},{"name":"ModelBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"ModelConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"ModelDecorationMinimapOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelDecorationOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelDecorationOverviewRulerOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"ModelRawContentChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawEOLChanged","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawFlush","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLineChanged","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLinesDeleted","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelRawLinesInserted","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"ModelServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"ModelTransientSettingWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/abstractCodeEditorService"},{"name":"ModesContentHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/modesContentHover"},{"name":"ModeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modeServiceImpl"},{"name":"ModesGlyphHoverWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/modesGlyphHover"},{"name":"ModesHoverController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/hover/hover"},{"name":"ModesRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"MODIFIED_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"modifiedItemIndicator","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"ModifierLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"modify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"modifySearchEditorContextLinesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"module","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Module","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"monaco","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"MonacoEnvironment","kind":"let","kindModifiers":"declare","sortText":"4"},{"name":"MonarchBracket","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"MonarchTokenizer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchLexer"},{"name":"monitorEventLoopDelay","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"MonospaceLineBreaksComputerFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/monospaceLineBreaksComputer"},{"name":"MouseController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listWidget"},{"name":"MouseEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MouseHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseHandler"},{"name":"MouseTarget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"MouseTargetFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"MouseTargetType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"MouseTargetType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"MouseWheelClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"move","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"move","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"MOVE_ACTIVE_EDITOR_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"MOVE_FILE_TO_TRASH_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"moveBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MoveCaretCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/caretOperations/moveCaretCommand"},{"name":"MoveCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit"},{"name":"moveCursor","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"readline"},{"name":"MoveEditorLeftInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorRightInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToAboveGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToBelowGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToFirstGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToLastGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToLeftGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToNextGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToPreviousGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveEditorToRightGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"moveFileToTrashHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"MoveFocusedViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"MoveGroupDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveGroupUpAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"MoveLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/moveLinesCommand"},{"name":"MoveOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorMoveOperations"},{"name":"MoveSelectionToNextFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MoveSelectionToPreviousFindMatchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"moveTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MoveToNextChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MoveToPreviousChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"MoveWindowTabToNewWindowHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"MoveWordCommand","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"MSAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSBlobBuilder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"msContentScript","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOCredentialAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOSignature","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSFIDOSignatureAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGesture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGestureEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSGraphicsTrust","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSInputMethodContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeyNeededEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeys","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSMediaKeySession","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSPointerEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MSStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"msWriteProfilerMark","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"MultiCursorSelectionController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSelectionControllerAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultiCursorSessionResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"MultilineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultilineTokens2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultilineTokensBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"MultiModelEditStackElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"MultipleEditorGroupsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"MultiplexLayoutController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"MultiplexLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"multiSelectModifierSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"MutableDisposable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"MutationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MutationObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"MutationRecord","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Mutex","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-mutex/index"},{"name":"MyArray","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"MyEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/parts/editor/baseEditor.test"},{"name":"MyOtherEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/parts/editor/baseEditor.test"},{"name":"name","kind":"const","kindModifiers":"declare","sortText":"4"},{"name":"NamedNodeMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"namespace","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Namespace","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"NaN","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NativeAccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/accessibility/electron-browser/accessibilityService"},{"name":"NativeBackupTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/backup/electron-browser/backupTracker"},{"name":"NativeClipboardService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/clipboard/electron-browser/clipboardService"},{"name":"NativeExtHostSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/node/extHostSearch"},{"name":"nativeImage","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeImage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService"},{"name":"NativePathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/path/electron-browser/pathService"},{"name":"NativeRequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/request/electron-browser/requestService"},{"name":"NativeResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper"},{"name":"NativeResourceIdentityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/node/resourceIdentityServiceImpl"},{"name":"NativeSimpleFileDialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/electron-browser/simpleFileDialog"},{"name":"NativeStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageService"},{"name":"NativeTelemetryOptOut","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/telemetryOptOut/electron-browser/telemetryOptOut"},{"name":"NativeTextFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/electron-browser/textFileEditor"},{"name":"NativeTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService"},{"name":"NativeTextSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/textSearchManager"},{"name":"nativeTheme","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NativeUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/update/electron-browser/updateService"},{"name":"NativeWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/window"},{"name":"NativeWorkbenchEnvironmentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/environment/electron-browser/environmentService"},{"name":"NativeWorkspaceEditingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/electron-browser/workspaceEditingService"},{"name":"NativeWorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workspaces/electron-browser/workspacesService"},{"name":"NavigateBackwardsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateBetweenGroupsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateForwardAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateLastAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigateToLastEditLocationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NavigationModeAddon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/navigationModeAddon"},{"name":"NavigationPreloadManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"navigator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Navigator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"neq","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"net","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"netLog","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"networkInterfaces","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"never","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NEVER_MEASURE_RENDER_TIME_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"NeverShowAgainScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"new","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NEW_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NEW_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewEditorGroupAboveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupBelowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewEditorGroupRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"NewExplorerItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/explorerModel"},{"name":"NewFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"NewWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"NewWindowAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"newWindowCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"NewWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"newWriteableBufferStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"newWriteableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"NEXT_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"nextCharLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"NextCommentThreadAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"NextMarkerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoError/gotoError"},{"name":"NextMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextMatchFindAction2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"NextSelectionMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"NextSideBarViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"nextTick","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"nextTick","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"NO_KEY_MODS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"noAsar","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"NODATA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Node","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"nodeAcceptEdit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"NodeCachedDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner"},{"name":"NodeClient","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/NodeClient"},{"name":"NodeColor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"NodeColor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"NodeDebugHelperService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugHelperService"},{"name":"NodeFilter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NodeIterator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NodeJS","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"NodeList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"noDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"nodeReadableToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"NodeSocket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"nodeSocketFactory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/node/nodeSocketFactory"},{"name":"nodesToArrays","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/browser/ui/grid/util"},{"name":"nodeStreamToVSBufferReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"NodeTestBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test"},{"name":"NoEditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"noIntlCompareFileNames","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/comparers"},{"name":"NOMEM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NoMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"NONAME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NoOpNotification","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NoOpProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NoOpWorkspaceTagsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/browser/workspaceTagsService"},{"name":"normalize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"normalize","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"normalizeDriveLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"normalizeExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"normalizeFileChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/watcher"},{"name":"normalizeGitHubUrl","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/issue/common/issueReporterUtil"},{"name":"normalizeNFC","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"normalizeNFD","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"normalizePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"normalizeRoots","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/chokidarWatcherService"},{"name":"normalizeVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"NoTabsTitleControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/noTabsTitleControl"},{"name":"notDeepEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"notDeepStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"notebook","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"NOTEBOOK_CELL_EDITABLE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_MARKDOWN_EDIT_MODE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_RUN_STATE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_CELL_TYPE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_DISPLAY_ORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NOTEBOOK_EDITABLE_CONTEXT_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_EDITOR_CURSOR_BOUNDARY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NOTEBOOK_EDITOR_EDITABLE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EDITOR_FOCUSED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookBrowser"},{"name":"NOTEBOOK_EXECUTING_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NOTEBOOK_VIEW_TYPE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/constants"},{"name":"NotebookCellList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/notebookCellList"},{"name":"NotebookCellListDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer"},{"name":"NotebookCellMetadataDefaults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel"},{"name":"NotebookCellTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel"},{"name":"NotebookCodeEditors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebook.contribution"},{"name":"notebookDocumentMetadataDefaults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"NotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookEditorCellEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostNotebook"},{"name":"NotebookEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditorInput"},{"name":"NotebookEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditorInput"},{"name":"NotebookEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookEventDispatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/contrib/notebookFindWidget"},{"name":"NotebookLayoutChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookMetadataChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"notebookOutputContainerColor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookEditor"},{"name":"NotebookOutputRendererInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer"},{"name":"NotebookOutputRendererInfoStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"notebookProviderExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/extensionPoint"},{"name":"NotebookProviderInfo","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookProvider"},{"name":"NotebookProviderInfoStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"NotebookRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookRegistry"},{"name":"notebookRendererExtensionPoint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/extensionPoint"},{"name":"NotebookService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookService"},{"name":"NotebookTextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/model/notebookTextModel"},{"name":"NotebookViewEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher"},{"name":"NotebookViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel"},{"name":"notEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"NOTFOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Notification","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Notification","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"NotificationActionRunner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsActions"},{"name":"NotificationChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationHandle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NOTIFICATIONS_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_HEADER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_CENTER_HEADER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_ERROR_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_INFO_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_LINKS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_TOAST_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NOTIFICATIONS_WARNING_ICON_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"NotificationsAlerts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsAlerts"},{"name":"NotificationsCenter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCenter"},{"name":"NotificationsCenterVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/notification/common/notificationService"},{"name":"NotificationsFilter","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"NotificationsList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsList"},{"name":"NotificationsListDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NotificationsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationsStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsStatus"},{"name":"NotificationsToasts","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsToasts"},{"name":"NotificationsToastsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"NotificationTemplateRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsViewer"},{"name":"NotificationViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationViewItemContentChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NotificationViewItemProgress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"NOTIMP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"NotImplementedError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"NOTINITIALIZED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"notStrictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"NsfwWatcherService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/nsfwWatcherService"},{"name":"null","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"NULL_LANGUAGE_IDENTIFIER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NULL_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NULL_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"NullApiDeprecationService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostApiDeprecationService"},{"name":"NullAppender","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"NullCommandService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/commands/common/commands"},{"name":"nullExtensionDescription","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"NullExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"NullFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/test/common/nullFileSystemProvider"},{"name":"NullLifecycleService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"NullLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/common/log"},{"name":"NullOpenerService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/opener/common/opener"},{"name":"nullRange","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"NullTelemetryService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"nullTokenize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"nullTokenize2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/nullMode"},{"name":"number","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Number","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"NumberBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"O_APPEND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_CREAT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DIRECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DIRECTORY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_DSYNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_EXCL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOATIME","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOCTTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NOFOLLOW","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_NONBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_RDONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_RDWR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_SYMLINK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_SYNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_TRUNC","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"O_WRONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"object","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Object","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ObjectIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"ObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTree"},{"name":"ObjectTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/objectTreeModel"},{"name":"off","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"OfflineAudioCompletionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OfflineAudioContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"offscreenBuffering","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OffscreenCanvas","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OffscreenCanvasRenderingContext2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ok","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"ok","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/assert"},{"name":"on","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"on","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"onabort","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onafterprint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationcancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationiteration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onanimationstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onauxclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onbeforeprint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onbeforeunload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onblur","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncanplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncanplaythrough","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"once","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"once","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"events"},{"name":"once","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/functional"},{"name":"once","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"onchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onclose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncompassneedscalibration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncontextmenu","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oncuechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondblclick","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondevicelight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondevicemotion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondeviceorientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondeviceorientationabsolute","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onDidChangeFullscreen","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"onDidChangeKeyboardLayout","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-keymap/index"},{"name":"onDidChangeModelLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"onDidChangeZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"onDidCreateEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"onDidCreateModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"ondrag","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragexit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondragstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondrop","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ondurationchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OneCursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/oneCursor"},{"name":"OneLineRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"onemptied","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onended","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnEnterSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/onEnter"},{"name":"oneOf","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"OneReference","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"OneReferenceRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"onerror","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OneSnippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetSession"},{"name":"onExtensionChanged","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils"},{"name":"onfocus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ongotpointercapture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onhashchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnigScanner","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"OnigString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/onigasm-umd/main"},{"name":"oninput","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"oninvalid","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeydown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeypress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onkeyup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"onlanguagechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ONLINE_SERVICES_SETTING_TAG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"onload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadeddata","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadedmetadata","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onloadstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onlostpointercapture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmessage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmessageerror","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousedown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousemove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmouseup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmousewheel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturedoubletap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgestureend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturehold","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturestart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsgesturetap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmsinertiastart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointercancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerdown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointermove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onmspointerup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onoffline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ononline","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onorientationchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpagehide","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpageshow","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpause","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onplaying","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointercancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerdown","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerenter","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerleave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointermove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerout","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerover","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpointerup","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onpopstate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onprogress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onratechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onreadystatechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onrejectionhandled","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onreset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onresize","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onscroll","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsecuritypolicyviolation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onseeked","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onseeking","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselectionchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onselectstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onstalled","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onstorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsubmit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onsuspend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontimeupdate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontoggle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchcancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchmove","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontouchstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitioncancel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionend","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionrun","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ontransitionstart","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OnTypeFormattingEditProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"OnTypeRenameAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"OnTypeRenameContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/onTypeRename"},{"name":"OnTypeRenameProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"onUnexpectedError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"onUnexpectedExternalError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"onunhandledrejection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onunload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvolumechange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayactivate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayblur","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayconnect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaydeactivate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaydisconnect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplayfocus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypointerrestricted","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypointerunrestricted","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onvrdisplaypresentchange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onwaiting","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onwheel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"onWillDisposeModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"open","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"open","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"OPEN_CREATE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_EDITOR_AT_INDEX_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"OPEN_PRIVATECACHE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_READONLY","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_READWRITE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_SHAREDCACHE","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OPEN_TO_SIDE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OPEN_URI","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"OpenAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"openBreakpointSource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/breakpointsView"},{"name":"OpenContext","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/node/window"},{"name":"OpenDebugConsoleAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugViewlet"},{"name":"opendir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"opendirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"OpenEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"OpenEditorsFocusedContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"OpenEditorsGroupContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OpenEditorsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/openEditorsView"},{"name":"OpenEditorsVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"opener","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OpenerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/openerService"},{"name":"OpenerValidatorContributions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsValidator"},{"name":"OpenExplorerViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/files.contribution"},{"name":"OpenExtensionLogsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/electron-browser/logsActions"},{"name":"OpenExtensionsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions"},{"name":"OpenExtensionsViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"OpenFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenFileFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"openFilePreserveFocusHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"OpenFirstEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenFolderAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenInEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"OpenInEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenIssueReporter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenIssueReporterActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/common/commands"},{"name":"OpenLastEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenLatestReleaseNotesInBrowserAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"OpenLocalFileCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLocalFileFolderCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLocalFolderCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"OpenLogsFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/electron-browser/logsActions"},{"name":"OpenMatchToSide","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"openModeSettingKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"OpenNewEditorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenNewEditorToSideCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"OpenNextEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenNextRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousEditorInGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenPreviousRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"OpenProcessExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueActions"},{"name":"OpenRecentAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"OpenResultsInEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"OpenSearchEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"OpenSearchEditorToSideAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"openSearchView","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"OpenSearchViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"openStdin","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"openSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"OpenUrlAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/url.contribution"},{"name":"OpenViewPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"OpenWebviewDeveloperToolsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"openWindowCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"OpenWindowSessionLogFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsActions"},{"name":"OpenWithAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"OpenWorkspaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OpenWorkspaceButtonContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorWidgets"},{"name":"OpenWorkspaceConfigFileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"OperatingSystem","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Option","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"optional","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/instantiation"},{"name":"OPTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"or","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/filters"},{"name":"OrganizeImportsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"organizeImportsCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"orientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Orientation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"origin","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"originalFSPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"orthogonal","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/gridview"},{"name":"OS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"OS_PROVIDES_FILE_PROTECTION","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"OscillatorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"outerHeight","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"outerWidth","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OutgoingMessage","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"OutlineAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineConfigKeys","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineElementTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineGroupTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineItemComparator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"OutlineNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlinePane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/outline/browser/outlinePane"},{"name":"OutlineSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutlineViewFiltered","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineViewFocused","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineViewId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outline"},{"name":"OutlineVirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"OutOfProcessWin32FolderWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/win32/csharpWatcherService"},{"name":"OUTPUT_MIME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OUTPUT_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/output"},{"name":"OutputAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/node/outputAppender"},{"name":"OutputBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keybindingIO"},{"name":"OutputChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchUtils"},{"name":"OutputChannelModelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/common/outputChannelModelService"},{"name":"OutputChannelModelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/output/electron-browser/outputChannelModelService"},{"name":"OutputEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputView"},{"name":"OutputLinkComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkComputer"},{"name":"OutputLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/common/outputLinkProvider"},{"name":"OutputPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"OutputRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/output/outputRenderer"},{"name":"OutputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputServices"},{"name":"OutputViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/output/browser/outputView"},{"name":"outside","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"OverconstrainedError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OverflowEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"OverlayWidgetDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"OverlayWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorBrowser"},{"name":"OverlayWidgetPositionPreference","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"OVERRIDE_PROPERTY_PATTERN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"overrideIdentifierFromKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"OverviewRuler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler"},{"name":"overviewRulerAddedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerCommentingRangeForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentGlyphWidget"},{"name":"overviewRulerCommonContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerCurrentContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerDeletedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerError","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"overviewRulerFindMatchForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerIncomingContentForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerInfo","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"OverviewRulerLane","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"overviewRulerModifiedForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"overviewRulerRangeHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"overviewRulerSelectionHighlightForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"overviewRulerWarning","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/editorColorRegistry"},{"name":"OverviewRulerZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"OverviewZoneManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/overviewZoneManager"},{"name":"package","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"pad","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"PageCoordinates","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorDom"},{"name":"PagedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/listPaging"},{"name":"PagedModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"PagedScreenReaderStrategy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaState"},{"name":"PageTransitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PageViewData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/PageViewData"},{"name":"PageViewData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"pageXOffset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pageYOffset","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Pane","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"PaneComposite","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panecomposite"},{"name":"PaneCompositePanel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"Panel","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PANEL_ACTIVE_TITLE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_ACTIVE_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"PANEL_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/outline/browser/outline.contribution"},{"name":"PANEL_INACTIVE_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PANEL_INPUT_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"PanelActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PanelDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PanelFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"PanelKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"PanelPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelPart"},{"name":"PanelPositionContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/panel"},{"name":"PanelRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/panel"},{"name":"PaneView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/paneview"},{"name":"PannerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ParameterHintsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHintsModel"},{"name":"ParameterHintsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHintsWidget"},{"name":"ParameterInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ParameterInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ParameterInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"parent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"parentPort","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"parse","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"parse","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"parse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/console"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/plistParser"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"parse","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/tokenization/typescript"},{"name":"parseArgs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argv"},{"name":"parseClassifierString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"parseCLIProcessArgv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"parseCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicon"},{"name":"ParsedTokenThemeRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ParseErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parseExtensionDevOptions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionDevOptions"},{"name":"parseExtensionHostPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseFloat","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"parseHrefAndDimensions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"parseInt","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"parseKeyboardLayoutDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/keymapInfo"},{"name":"parseLineAndColumnAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/paths"},{"name":"parseLinkedText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/linkedText"},{"name":"parseMainProcessArgv","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/argvHelper"},{"name":"ParseOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parsePathArg","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"parser","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Parser","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"parseRawGrammar","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"parseReplaceString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"parseSavedSearchEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"parseSearchPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseTokenTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"parseTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"parseUserDataDir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"parseVersion","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensionValidator"},{"name":"parseWithLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/plistParser"},{"name":"Part","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/part"},{"name":"PartFingerprint","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"PartFingerprints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"PartialModelCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"PartialViewCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"Parts","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"PassThrough","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"PASTE_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"pasteFileHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"PasteWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"patch","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"Path2D","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pathIncludedInQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"PathIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"pathOrURIToURI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"pathsToEditors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"pathToFileURL","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"PatternExcludesFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"PatternIncludesFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"PatternInputWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/patternInputWidget"},{"name":"patternsToIExpression","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/test/browser/queryBuilder.test"},{"name":"PAUSE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"PAUSE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"PauseableEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"PaymentAddress","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentRequestUpdateEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PaymentResponse","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pbkdf2","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"pbkdf2Sync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"PeekContext","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorGutterBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewEditorMatchHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsFileForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsMatchForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsMatchHighlight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsSelectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewResultsSelectionForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"peekViewTitleInfoForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"PeekViewWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/peekView/peekView"},{"name":"performance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"performance","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"Performance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceEntry","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceMark","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceMeasure","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceNavigation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceNavigationTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceObserver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceObserver","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"perf_hooks"},{"name":"PerformanceObserverEntryList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceResourceTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerformanceTiming","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PerfviewContrib","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor"},{"name":"PerfviewInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor"},{"name":"PerfWidgetExternal","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PeriodicWave","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionRequestedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Permissions","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PermissionStatus","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PersistentConnectionEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"PersistentContributableViewsModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"PersistentProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"personalbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PICK_WORKSPACE_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceCommands"},{"name":"pickerGroupBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"pickerGroupForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"PickerQuickAccessProvider","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/pickerQuickAccess"},{"name":"pid","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Piece","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"pieceToQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"PieceTreeBase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"PieceTreeTextBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer"},{"name":"PieceTreeTextBufferBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder"},{"name":"PieceTreeTextBufferFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder"},{"name":"pipeline","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"Placeholder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"PlaceHolderPanelActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PlaceHolderToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"PlaceHolderToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PlaceHolderViewletActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"PLAINTEXT_LANGUAGE_IDENTIFIER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"PLAINTEXT_MODE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/modesRegistry"},{"name":"platform","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"platform","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"platform","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/process"},{"name":"platform","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Platform","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"PlatformToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"Plugin","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PluginArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"POINT_CONVERSION_COMPRESSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"POINT_CONVERSION_HYBRID","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"POINT_CONVERSION_UNCOMPRESSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"PointerEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PointerEventHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/pointerHandler"},{"name":"PointerHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/pointerHandler"},{"name":"PointerHandlerLastRenderData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"PopStateEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"popup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/electron-browser/contextmenu"},{"name":"position","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"Position","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"positionFromString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"positionIsInRange","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"PositionPanelActionConfigs","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"positionToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/layout/browser/layoutService"},{"name":"posix","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"posix","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"postMessage","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"powerMonitor","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"powerSaveBlocker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"POWERSHELL_PATH","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"ppid","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prebakedMiniMaps","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/minimap/minimapPreBaked"},{"name":"PreferencesContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferencesContribution"},{"name":"PreferencesEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesEditor"},{"name":"PreferencesEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"PreferencesLabel","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"PreferencesSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"PreferencesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/browser/preferencesService"},{"name":"preferredSideBySideGroupDirection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorGroupsService"},{"name":"prefersExecuteOnUI","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"prefersExecuteOnWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsUtil"},{"name":"PrefixMemory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"PrefixSumComputer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/prefixSumComputer"},{"name":"PrefixSumIndexOfResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/prefixSumComputer"},{"name":"prepareActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"prepareCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"prepareQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"prepend","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"prependListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"prependListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prependOnceListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"prependOnceListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"prerelease","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"PresentationOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"presentationSchema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSchemas"},{"name":"PreserveCaseCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/replaceInput"},{"name":"prevCharLength","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"PREVIEW_DIR_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"PREVIOUS_COMPRESSED_FOLDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"PreviousMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousMatchFindAction2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"PreviousSelectionMatchFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"PreviousSideBarViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"print","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"privateDecrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"privateEncrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"ProblemCollectorEventKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"ProblemHandlingStrategy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"ProblemLocationKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemMatcherParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemMatcherRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemPatternParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"ProblemPatternRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"problemsErrorIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"problemsInfoIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"problemsWarningIconForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"process","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProcessDataFlag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/windows-process-tree/index"},{"name":"ProcessExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ProcessExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ProcessExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ProcessExecutionOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ProcessingInstruction","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProcessRunnerDetector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/node/processRunnerDetector"},{"name":"ProcessState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ProcessTaskSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/node/processTaskSystem"},{"name":"product","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/product/common/product"},{"name":"ProductContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ProductIconThemeData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/productIconThemeData"},{"name":"productService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"profile","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"profileEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"ProfileSessionState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"Progress","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"ProgressBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"ProgressBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/progressbar/progressbar"},{"name":"progressBarBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ProgressBarIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressIndicator"},{"name":"ProgressEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/progress/common/progress"},{"name":"ProgressLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ProgressLocation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/progress/browser/progressService"},{"name":"Promise","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PromiseRejectionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"promises","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"promises","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"promisify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"prompt","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"protocol","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Protocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"Protocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.electron"},{"name":"ProtocolConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc.net"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"events"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"module"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"stream"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"https-proxy-agent"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"mocha"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Config"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Domain"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/AvailabilityData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Base"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ContextTagKeys"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Data"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/DataPoint"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/Envelope"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/EventData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/StackFrame"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionDetails"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/ExceptionData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MessageData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/MetricData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/PageViewData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RemoteDependencyData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RequestData"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Channel"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/TelemetryClient"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/NodeClient"},{"name":"prototype","kind":"property","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/http-proxy-agent/index"},{"name":"provideDecorations","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/views/explorerDecorationsProvider"},{"name":"provideSelectionRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/smartSelect"},{"name":"provideSignatureHelp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/provideSignatureHelp"},{"name":"provideSuggestionItems","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"Proxy","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ProxyAgent","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-proxy-agent/index"},{"name":"ProxyAuthHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/auth"},{"name":"ProxyIdentifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/proxyIdentifier"},{"name":"pseudoRandomBytes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"publicDecrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"publicEncrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"PublicKeyCredential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushSubscription","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"PushSubscriptionOptions","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"pushToEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"pushToStart","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Query","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensionQuery"},{"name":"QueryBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/queryBuilder"},{"name":"QueryGlobTester","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"QueryType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"Queue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"queueMicrotask","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"QuickAccessController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/quickAccess"},{"name":"QuickAccessLeastRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessLeastRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessNavigateNextAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/quickAccessActions"},{"name":"QuickAccessPreviousEditorFromHistoryAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessPreviousRecentlyUsedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessPreviousRecentlyUsedEditorInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"QuickAccessRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/common/quickAccess"},{"name":"QuickAccessViewPickerAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"QuickCommandNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"QuickFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"QuickFixAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"QuickFixActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"QuickFixController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"QuickHelpNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"quickInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QuickInputBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputBox"},{"name":"QuickInputButtons","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"QuickInputButtons","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"QuickInputController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInput"},{"name":"QuickInputEditorContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"QuickInputEditorWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"quickInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QuickInputList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputList"},{"name":"QuickInputListFocus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/browser/quickInputList"},{"name":"QuickInputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/quickInput"},{"name":"QuickInputService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/quickinput/browser/quickInputService"},{"name":"quickInputTitleBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"QUICKOPEN_DETAIL_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"QUICKOPEN_SKIP_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"QuickOutlineNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"quickPickItemScorerAccessor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"QuickPickItemScorerAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/quickinput/common/quickInput"},{"name":"QuickSwitchWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"R_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"raceCancellation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"raceTimeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RadioGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/actions"},{"name":"RadioNodeList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RandomAccessReader","kind":"class","kindModifiers":"abstract,export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"RandomBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"randomBytes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomFill","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomFillSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"randomPort","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/ports"},{"name":"RandomSource","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"range","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Range","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"RangeError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RangeHighlightDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/rangeDecorations"},{"name":"RangeHighlightDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"RangeMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"RangesCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/indentRangeProvider"},{"name":"RangesCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"RangeUtil","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/rangeUtil"},{"name":"RatingsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RawContentChangedType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelEvents"},{"name":"RawContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"RawDebugSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/rawDebugSession"},{"name":"rawListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"RawObjectReplElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"rbDelete","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"rcompare","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"rcompareIdentifiers","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ReactionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"ReactionActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"read","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"Readable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"ReadableStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ReadableStreamReader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"readableToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readCharWidths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/charWidthReader"},{"name":"readdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readdir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readDirsInDir","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readdirSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readdirWithFileTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"readFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"readFromStdin","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"readlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readonly","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"ReadonlyEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"readRawMapping","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/test/electron-browser/keyboardMapperTestUtils"},{"name":"ReadStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"ReadStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"readSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"readTrustedDomains","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"readUInt16LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt32BE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt32LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"readUInt8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"realcaseSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"realpath","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"realpath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"realpathSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"realpathSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/extpath"},{"name":"ReapplyBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"RecommendationWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"recomputeMaxEnd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"recomputeTreeMetadata","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"ReconnectionPermanentFailureEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ReconnectionRunningEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"ReconnectionWaitEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAgentConnection"},{"name":"Recoverable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"RedoWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"RefactorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"refactorCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"RefCountedStyleSheet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/services/codeEditorServiceImpl"},{"name":"ReferenceCollection","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"ReferenceError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ReferenceProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"ReferencesController","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesController"},{"name":"ReferencesModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/referencesModel"},{"name":"ReferenceWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget"},{"name":"Reflect","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"RefreshAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"RefreshExplorerView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"REFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"REG_BINARY","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_DWORD","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_EXPAND_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_MULTI_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_NONE","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_QWORD","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_SZ","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"REG_TYPES","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"winreg"},{"name":"RegexCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"RegExp","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"regExpContainsBackreference","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"regExpFlags","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"regExpLeadsToEndlessLoop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"register","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerAction2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"registerCodeActionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerCodeLensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerColor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"registerColorProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerColors","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"registerColorThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerColorThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"registerCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"registerCompletionItemProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"registerContextMenuListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/contextmenu/electron-main/contextmenu"},{"name":"registerContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceContributions"},{"name":"registerContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"registerDeclarationProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDefaultLanguageCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerDefinitionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDiffEditorContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerDocumentFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentHighlightProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentRangeFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentRangeSemanticTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentSemanticTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerDocumentSymbolProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerEditorAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerEditorCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerEditorContribution","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerFileIconThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerFileIconThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/fileIconThemeSchema"},{"name":"registerFileProtocol","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols"},{"name":"registerFoldingRangeProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerHoverProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerIcon","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/iconRegistry"},{"name":"registerImplementationProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerInstantiatedEditorAction","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerLanguageCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerLinkProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerModelAndPositionCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerModelCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/editorExtensions"},{"name":"registerNotificationCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"registerOnTypeFormattingEditProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerOnTypeRenameProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerOutputTransform","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/notebookRegistry"},{"name":"registerProductIconThemeExtensionPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"registerProductIconThemeSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/productIconThemeSchema"},{"name":"registerReferenceProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerRemoteContributions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalRemote"},{"name":"registerRenameProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSelectionRangeProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSignatureHelpProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerSingleton","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/extensions"},{"name":"registerTerminalActions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"registerTestEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"registerTextMime","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"registerThemingParticipant","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"registerTypeDefinitionProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"registerWindowDriver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/browser/driver"},{"name":"registerWindowDriver","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-browser/driver"},{"name":"Registry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/registry/common/platform"},{"name":"Registry","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"ReindentLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ReindentSelectedLinesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/indentation/indentation"},{"name":"ReinstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"rejects","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"RelatedInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"RelatedInformationRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"relative","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"relative","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"relativePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"RelativePattern","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"RelativePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Relay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"RelayURLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/url/electron-browser/urlService"},{"name":"release","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"release","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"releaseEvents","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ReleaseNotesManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/releaseNotesEditor"},{"name":"ReloadAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ReloadWebviewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"ReloadWindowAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/windowActions"},{"name":"ReloadWindowWithExtensionsDisabledAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"remeasureFonts","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"remote","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"REMOTE_EXPLORER_TYPE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"REMOTE_FILE_SYSTEM_CHANNEL_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel"},{"name":"REMOTE_HOST_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteHosts"},{"name":"REMOTE_MACHINE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"RemoteAgentConnection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/abstractRemoteAgentService"},{"name":"RemoteAgentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/browser/remoteAgentServiceImpl"},{"name":"RemoteAgentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl"},{"name":"RemoteAuthorities","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/network"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"RemoteAuthorityResolverError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"RemoteAuthorityResolverErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/common/remoteAuthorityResolver"},{"name":"RemoteAuthorityResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/browser/remoteAuthorityResolverService"},{"name":"RemoteAuthorityResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/remote/electron-browser/remoteAuthorityResolverService"},{"name":"RemoteBadgeWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"RemoteConnectionState","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteDependencyData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RemoteDependencyData"},{"name":"RemoteDependencyData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"RemoteDependencyDataConstants","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Constants"},{"name":"RemoteExtensionEnvironmentChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentEnvironmentChannel"},{"name":"RemoteExtensionHostClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHostClient"},{"name":"RemoteExtensionLogFileName","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentService"},{"name":"RemoteExtensionManagementChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc"},{"name":"RemoteExtensionsInstaller","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/remoteExtensionsInstaller"},{"name":"RemoteFileDialogContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel"},{"name":"RemoteFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"RemoteInstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"RemoteNameContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"RemoteSearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchService"},{"name":"RemoteUserConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"RemoteViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/remote"},{"name":"RemoteWindowActiveIndicator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/remoteIndicator"},{"name":"REMOVE_ROOT_FOLDER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"REMOVE_ROOT_FOLDER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"removeAccents","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/normalization"},{"name":"RemoveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"RemoveActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"RemoveAllBreakpointsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeAllListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"removeAllListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"RemoveAllWatchExpressionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeAnsiEscapeCodes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"RemoveBreakpointAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"removeClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeClasses","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeCSSRulesContainingSelector","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeElementsAfterNulls","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/resolvedKeybindingItem"},{"name":"removeEventListener","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RemoveFromRecentlyOpenedAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"removeFromValueTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"removeListener","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"removeListener","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"removeMarkdownEscapes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/htmlContent"},{"name":"removeNode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"removeTabIndexAndUpdateFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"removeTrailingPathSeparator","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"rename","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"rename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/rename"},{"name":"RenameAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/rename"},{"name":"renameHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"renameIgnoreError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RenameInputField","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/rename/renameInputField"},{"name":"RenameProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"renameSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"renderCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"RenderedLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewLayer"},{"name":"Renderer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"Renderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList"},{"name":"rendererLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"renderExpressionValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"renderFormattedText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"RenderIndentGuides","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/abstractTree"},{"name":"RenderingContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"RenderLineInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"RenderLineNumbersType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"RenderLineNumbersType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"RenderLineOutput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"RenderLineOutput2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderMarkdown","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/markdownRenderer"},{"name":"renderMarkdownDocument","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markdown/common/markdownDocumentRenderer"},{"name":"RenderMinimap","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"RenderMinimap","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"renderText","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/formattedTextRenderer"},{"name":"renderVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"renderViewLine","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderViewLine2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"renderViewTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"RenderWhitespace","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLineRenderer"},{"name":"ReopenClosedEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ReopenResourcesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"repeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Repl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/repl"},{"name":"REPL_MODE_SLOPPY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"REPL_MODE_STRICT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"REPL_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"ReplAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceActiveKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceAllCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replaceAllCommand"},{"name":"ReplaceAllInFileActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceAllInFolderAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceAllInFolderActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandThatPreservesSelection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandThatSelectsText","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandWithOffsetCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceCommandWithoutChangingPosition","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/replaceCommand"},{"name":"ReplaceInFilesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ReplaceInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/replaceInput"},{"name":"ReplaceInputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ReplacePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"ReplacePattern","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/replace"},{"name":"ReplacePiece","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/replacePattern"},{"name":"ReplacePreviewContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceService"},{"name":"ReplaceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/replaceService"},{"name":"ReplDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplEvaluationInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplEvaluationInputsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplEvaluationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplEvaluationResultsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"ReplRawObjectsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"REPLServer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"ReplSimpleElementsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"ReplVariablesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/replViewer"},{"name":"report","kind":"property","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"reporters","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"mocha"},{"name":"ReportExtensionIssueAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"ReportPerformanceIssueUsingReporterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueActions"},{"name":"RepositoryPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"RepositoryViewDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"request","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"request","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"request","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/request/browser/request"},{"name":"Request","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"requestAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RequestChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/requestIpc"},{"name":"RequestChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/common/requestIpc"},{"name":"RequestData","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/RequestData"},{"name":"RequestData","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"RequestInitiator","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RequestMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/electron-main/requestMainService"},{"name":"RequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/browser/requestService"},{"name":"RequestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/request/node/requestService"},{"name":"RequestType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"require","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RequireInterceptor","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostRequireInterceptor"},{"name":"RerunSearchEditorSearchAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"RerunSearchEditorSearchCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"ResetFocusedViewLocationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ResetGroupSizesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"resetSentinel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"ResetViewLocationsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"resizeBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"resizeTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"resolve","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"resolve","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"resolve4","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolve6","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveAny","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveCname","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveColorValue","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"resolveCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/commonProperties"},{"name":"ResolvedAuthority","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ResolvedAuthority","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ResolvedKeybinding","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"ResolvedKeybindingItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/resolvedKeybindingItem"},{"name":"ResolvedKeybindingPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"resolveExtensionsSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"resolveMarketplaceHeaders","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService"},{"name":"resolveMx","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveNaptr","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveNs","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolvePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"resolvePatternsForProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"resolvePtr","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"Resolver","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveSettingsTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"resolveSoa","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveSrv","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveTerminalEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/terminalEncoding"},{"name":"resolveTxt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"resolveWorkbenchCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/browser/workbenchCommonProperties"},{"name":"resolveWorkbenchCommonProperties","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/workbenchCommonProperties"},{"name":"ResourceContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/resources"},{"name":"ResourceDragAndDrop","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"ResourceEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/resourceEditorInput"},{"name":"ResourceEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/resourceEditorModel"},{"name":"ResourceGlobMatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"ResourceGlobMatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/resources"},{"name":"ResourceLabel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"ResourceLabels","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/labels"},{"name":"resourceLanguageSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"ResourceMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"ResourceMarkers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersModel"},{"name":"ResourceMarkersRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"ResourceQueue","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"ResourcesDropHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/dnd"},{"name":"ResourceSelectedForCompareContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"resourceSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"resourcesPath","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ResourceTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resourceTree"},{"name":"resourceUsage","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"ResourceWithCommentsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsTreeViewer"},{"name":"ResourceWithCommentThreads","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/common/commentModel"},{"name":"Response","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ResponseType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"ResponsiveState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RESTART_FRAME_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"RESTART_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"RESTART_SESSION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"restore","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"restoreFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"restoreParentsScrollTop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"restoreRecentlyOpened","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"restoreWindowsState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsStateStorage"},{"name":"RestrictedRenderingContext","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"resultIsMatch","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"retry","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"return","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"REVEAL_IN_EXPLORER_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"RevealInSideBarForSearchResults","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"RevealKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RevealLine_","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/coreCommands"},{"name":"RevealProblemKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"revealResourcesInOS","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/electron-browser/fileCommands"},{"name":"RevealTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"reverse","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"REVERSE_CONTINUE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"REVERT_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"RevertAndCloseEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"revertLocalChangesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"ReviewViewZone","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentsEditorContribution"},{"name":"ReviewZoneWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/commentThreadWidget"},{"name":"revive","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"reviveQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostSearch"},{"name":"reviveWebviewExtensionDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory"},{"name":"reviveWorkspaceEditDto","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"reviveWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"rewriteAbsolutePaths","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"rewriteWorkspaceFileForNewLocation","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"RGBA","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/color"},{"name":"RGBA8","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/rgba"},{"name":"rgErrorMsgForDisplay","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/fileSearch"},{"name":"rgErrorMsgForDisplay","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"rgPath","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-ripgrep/lib/index"},{"name":"RichEditBracket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"RichEditBrackets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/richEditBrackets"},{"name":"RichEditSupport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfigurationRegistry"},{"name":"rightRotate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"righttest","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"rimraf","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RimRafMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"rimrafSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"RipgrepParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"RipgrepSearchProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepSearchProvider"},{"name":"RipgrepTextSearchEngine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"rmdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rmdirSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"rootCertificates","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"rot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/numbers"},{"name":"RotatingLogger","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"RowCache","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rowCache"},{"name":"RPCProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/rpcProtocol"},{"name":"RSA_NO_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_OAEP_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_PKCS1_PSS_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_SSLV23_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"RSA_X931_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"rsort","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"RTCCertificate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDataChannel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDataChannelEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtlsTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtlsTransportStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDtmfSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDTMFSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCDTMFToneChangeEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceCandidate","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceCandidatePairChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceGatherer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceGathererEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIceTransportStateChangedEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCIdentityAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnectionIceErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCPeerConnectionIceEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpReceiver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpSender","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCRtpTransceiver","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSctpTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSessionDescription","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSrtpSdesTransport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCSsrcConflictEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsProvider","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCStatsReport","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"RTCTrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"rtrim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"Rulers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/rulers/rulers"},{"name":"run","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"RunAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"runAtThisOrScheduleAtNextAnimationFrame","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"RunAutomaticTasks","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks"},{"name":"runInContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runInExternalTerminal","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/terminals"},{"name":"runInNewContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runInThisContext","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"runMain","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"RunOnceScheduler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RunOnceWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"RunOnOptions","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunOnOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"RunOptions","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"RuntimeExtensionsEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"RuntimeExtensionsInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput"},{"name":"RuntimeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"RunToCursorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"runWhenIdle","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"S_IFBLK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFCHR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFDIR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFIFO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFLNK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFMT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFREG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IFSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IROTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IRWXU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWOTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IWUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXGRP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXOTH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"S_IXUSR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"safeBtoa","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"safeStringify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/objects"},{"name":"sandbox","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"sandboxed","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"sanitize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"sanitizeFilePath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"sanitizeGridNodeDescriptor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"sanitizeProcessEnvironment","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"sanitizeRanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"Sash","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"SashState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/sash/sash"},{"name":"satisfies","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SAVE_ALL_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_ALL_IN_GROUP_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_ALL_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_AS_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_AS_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILE_WITHOUT_FORMATTING_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SAVE_FILES_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SaveAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"SaveAllInGroupAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"SaveExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"SaveLocalFileCommand","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"saveParentsScrollTop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"SaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant"},{"name":"SaveParticipantsContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"SaveReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SaveWorkspaceAsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/workspaceActions"},{"name":"ScanCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanCodeBinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanCodeUtils","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scanCode"},{"name":"ScanError","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"Scanner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"scheduleAtNextAnimationFrame","kind":"let","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"schema","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionsRegistry"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchemaCommon"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v1"},{"name":"schema","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v2"},{"name":"Schemas","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/network"},{"name":"Schemas","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemMatcher"},{"name":"scm","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SCMAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMMenus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/menus"},{"name":"SCMService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scmService"},{"name":"SCMStatusController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/activity"},{"name":"SCMTreeKeyboardNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMTreeSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"SCMViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/scmViewlet"},{"name":"Scope","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ScopedCredential","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScopedCredentialInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScopedLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports"},{"name":"score","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageSelector"},{"name":"scoreFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"scoreFuzzy2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"scoreItemFuzzy","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/fuzzyScorer"},{"name":"screen","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screen","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Screen","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenLeft","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ScreenOrientation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenTop","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenX","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"screenY","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Script","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"vm"},{"name":"ScriptProcessorNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scroll","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"Scrollable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"ScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"ScrollbarArrow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarArrow"},{"name":"scrollbars","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrollbarShadow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderActiveBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"scrollbarSliderHoverBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"ScrollbarState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarState"},{"name":"ScrollbarVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"ScrollbarVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"ScrollbarVisibilityController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController"},{"name":"scrollBy","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ScrollDecorationViewPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration"},{"name":"ScrollPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/addons/commandTrackerAddon"},{"name":"ScrollState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"scrollTo","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"ScrollType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/editorCommon"},{"name":"ScrollType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"scrollX","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrollY","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"scrypt","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"scryptSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"sdkVersion","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Context"},{"name":"SEARCH_EXCLUDE_CONFIG","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchAccessibilityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-search/typings/xterm-addon-search"},{"name":"SearchChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchIpc"},{"name":"SearchChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/searchIpc"},{"name":"SearchCompletionExitCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchDND","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchResultsView"},{"name":"SearchEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor"},{"name":"SearchEditorBodyScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"searchEditorFindMatch","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"searchEditorFindMatchBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SearchEditorFindMatchClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SearchEditorID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SearchEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput"},{"name":"SearchEditorScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"searchEditorTextInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditor"},{"name":"Searcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchHistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchHistoryService"},{"name":"SearchInputBoxFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"searchMatchComparer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchParams","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"SearchProviderType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SearchResultIdx","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SearchResultModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/searchService"},{"name":"SearchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/rawSearchService"},{"name":"SearchSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SearchView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchView"},{"name":"SearchViewFocusedKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"SearchViewPosition","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchView"},{"name":"SearchViewVisibleKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"SearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"SearchWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"SearchWorkbenchService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/searchModel"},{"name":"SecurityPolicyViolationEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SELECT_FOR_COMPARE_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileCommands"},{"name":"SelectActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"selectAllSearchEditorMatchesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"SelectAllSearchEditorMatchesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"SelectAllTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SelectAllWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"SelectAndStartAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"selectBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"selectBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectBox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBox"},{"name":"SelectBoxList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBoxCustom"},{"name":"SelectBoxNative","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/selectBox/selectBoxNative"},{"name":"SelectColorThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/themes/browser/themes.contribution"},{"name":"SelectDefaultShellWindowsTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"selectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectHighlightsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"Selection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Selection","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Selection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/selection"},{"name":"Selection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"Selection","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Selection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"selectionBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SelectionBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"SelectionClipboard","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard"},{"name":"SelectionClipboardContributionID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/selectionClipboard"},{"name":"SelectionDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/selection"},{"name":"SelectionDirection","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SelectionDirection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"SelectionHighlighter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/multicursor/multicursor"},{"name":"SelectionMatchFindAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"SelectionRange","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SelectionRange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SelectionRange","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SelectionRangeRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SelectionsOverlay","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/selections/selections"},{"name":"selectListBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"selectorPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"self","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SEMANTIC_HIGHLIGHTING_SETTING_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelServiceImpl"},{"name":"SemanticTokens","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensBuilder","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensBuilder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensEdits","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensEdits","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensHelp","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/semanticTokensHelp"},{"name":"SemanticTokensLegend","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SemanticTokensLegend","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SemanticTokensProviderStyling","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"SemanticTokensProviderStylingConstants","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"SemVer","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SEMVER_SPEC_VERSION","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"send","kind":"method","kindModifiers":"declare,optional","sortText":"5","hasAction":true,"source":"process"},{"name":"Sender","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"SENTINEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"SENTINEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"sep","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"sep","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"Separator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/actionbar/actionbar"},{"name":"sequence","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Sequence","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/sequence"},{"name":"Sequencer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"SerializableFileMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"SerializableGrid","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"serialize","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"serializeEnvironmentVariableCollection","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/environmentVariableShared"},{"name":"serializeFontInfo","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/config/configuration"},{"name":"serializePipePositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"Serializer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"serializeSearchConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"serializeSearchError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"serializeSearchResultForEditor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization"},{"name":"serve","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"serve","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/electron-main/driver"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"https"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"Server","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/electron-main/ipc.electron-main"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.cp"},{"name":"Server","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"ServerExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"ServerResponse","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"SERVFAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ServiceCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/serviceCollection"},{"name":"ServiceUIFrameContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerContainer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerMessageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ServiceWorkerRegistration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"session","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"Session","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"Session","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"sessionStorage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Set","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SET_CONTEXT_COMMAND_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/contextkey/common/contextkey"},{"name":"setARIAContainer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"setAsyncMode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"setCollapseStateAtLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateForMatchingLines","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateForType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateLevelsDown","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateLevelsUp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"setCollapseStateUp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"SetColorThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"SetEditorLayoutAPICommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/apiCommands"},{"name":"setegid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"seteuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setFdLimit","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"SetFileIconThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"setFlagsFromString","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"setFullscreen","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"setgid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setGlobalLeakWarningThreshold","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/event"},{"name":"setgroups","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setImmediate","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setImmediate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"setImmediate","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"setInterval","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setInterval","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"setLanguageConfiguration","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"SetLogLevelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logsActions"},{"name":"SetMap","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"setMaxListeners","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"setMaxListeners","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setModelLanguage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setModelMarkers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setMonarchTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"setNodeStickiness","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/intervalTree"},{"name":"setOptions","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marked/marked"},{"name":"SetPanelPositionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"setPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/keytar/keytar"},{"name":"setPassword","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/keytar/index"},{"name":"setPriority","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"SetProductIconThemeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"setProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"setServers","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"setSnippetSuggestSupport","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"setTheme","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"setTimeout","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setTimeout","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"timers"},{"name":"SettingArrayRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingBoolRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingComplexRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingEnumRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingExcludeRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingGroupRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"settingKeyToDisplayFormat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingMatches","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesSearch"},{"name":"SettingNewExtensionsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingNumberRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"settings","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"SETTINGS_COMMAND_OPEN_SETTINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_EDIT_FOCUSED_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FILTER_ONLINE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_LIST","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_FOCUS_TOC","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SEARCH","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"SETTINGS_EDITOR_COMMAND_SWITCH_TO_JSON","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/preferences"},{"name":"Settings2EditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"SettingsChangeRelauncher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution"},{"name":"settingsCheckboxBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsCheckboxBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsCheckboxForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsEditor2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsEditor2"},{"name":"SettingsEditor2Input","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesEditorInput"},{"name":"SettingsEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"SettingsEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"SettingsGroupTitleRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"SettingsGroupTitleWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsHeaderForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsHeaderWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsNumberInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsNumberInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsNumberInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsSelectListBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsSync"},{"name":"SettingsTargetsWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesWidgets"},{"name":"settingsTextInputBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsTextInputBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"settingsTextInputForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsWidgets"},{"name":"SettingsTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingsTreeElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeFilter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingsTreeGroupElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeNewExtensionsElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingsTreeSettingElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTreeModels"},{"name":"SettingTextRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingTreeRenderers","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsTree"},{"name":"SettingValueType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"setTokensProvider","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"setToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"setuid","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setUncaughtExceptionCaptureCallback","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"setUnexpectedErrorHandler","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"setup","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"setup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"setup","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"setupMaster","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"setupTerminalCommands","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalCommands"},{"name":"setupTerminalMenu","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalMenu"},{"name":"setWordDefinitionFor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDocumentData"},{"name":"setZoomFactor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"setZoomLevel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/browser"},{"name":"Severity","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/severity"},{"name":"Severity","kind":"alias","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/common/notification"},{"name":"SeverityIcon","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/severityIcon/common/severityIcon"},{"name":"SeverityLevel","kind":"enum","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"SeverityLevel","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"shadowCaretRangeFromPoint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/mouseTarget"},{"name":"ShadowRoot","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SharedArrayBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"sharedLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"SharedProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-main/sharedProcess"},{"name":"SharedProcessMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/ipc/electron-main/sharedProcessMainService"},{"name":"SharedProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService"},{"name":"SharedWorker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"shell","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"SHELL_CWD_INVALID_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"SHELL_PATH_DIRECTORY_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"SHELL_PATH_INVALID_EXIT_CODE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"ShellExecution","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ShellExecution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ShellExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ShellExecutionOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ShellQuoting","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"shift","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/list/rangeMap"},{"name":"ShiftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/shiftCommand"},{"name":"shorten","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"shouldSetLangEnvVariable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalEnvironment"},{"name":"shouldSynchronizeModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/modelService"},{"name":"show","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"SHOW_EDITORS_IN_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SHOW_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ShowActiveFileInExplorer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ShowAllCommandsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess"},{"name":"ShowAllEditorsByAppearanceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowAllEditorsByMostRecentlyUsedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowAzureExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowBuiltInExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowCandidateContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/showCandidate"},{"name":"ShowCurrentReleaseNotesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ShowCurrentReleaseNotesActionId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/common/update"},{"name":"ShowDisabledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowEditorsInActiveGroupByMostRecentlyUsedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ShowEnabledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"showExtensionQuery","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/format/browser/showExtensionQuery"},{"name":"ShowInstalledExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowLanguageExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorStatus"},{"name":"ShowLanguageExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowNextChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"ShowNextWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ShowOpenedFileInNewWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ShowOutdatedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowPopularExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowPreviousChangeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator"},{"name":"ShowPreviousWindowTabHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ShowProblemsPanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersViewActions"},{"name":"ShowRecommendationsOnlyOnDemandKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"ShowRecommendedExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowRecommendedKeymapExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ShowReleaseNotesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"ShowRuntimeExtensionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"showSimpleSuggestions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"ShowViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ShowWebViewEditorFindWidgetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"shuffle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"ShutdownReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"SIDE_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_DRAG_AND_DROP_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_SECTION_HEADER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_BAR_TITLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"SIDE_GROUP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/common/editorService"},{"name":"SidebarFocusContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"SidebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/sidebar/sidebarPart"},{"name":"SideBarVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/viewlet"},{"name":"SideBySideEditor","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SideBySideEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/sideBySideEditor"},{"name":"SideBySideEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SIGABRT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGALRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGBREAK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGBUS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGCHLD","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGCONT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGFPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGHUP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGILL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGINT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGIO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGIOT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGKILL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"sign","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"SIGN_SERVICE_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/common/sign"},{"name":"SignatureHelp","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureHelp","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureHelp","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SignatureHelpProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureHelpTriggerKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SignatureInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SignatureInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SignatureInformation","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"Signer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"SignService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/browser/signService"},{"name":"SignService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/sign/node/signService"},{"name":"SIGPIPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPOLL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPROF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGPWR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGQUIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSEGV","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSTKFLT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSTOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGSYS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTERM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTRAP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTSTP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTTIN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGTTOU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUNUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGURG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUSR1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGUSR2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGVTALRM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGWINCH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGXCPU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SIGXFSZ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SimpleBreadcrumbsItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget"},{"name":"SimpleBulkEditService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleButton","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findWidget"},{"name":"SimpleCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/checkbox/checkbox"},{"name":"simpleCheckboxBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"simpleCheckboxBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"simpleCheckboxForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SimpleCommentEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/simpleCommentEditor"},{"name":"SimpleConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleEditorModelResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleEditorProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleFileDialog","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/dialogs/browser/simpleFileDialog"},{"name":"SimpleFindReplaceWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindReplaceWidget"},{"name":"SimpleFindWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget"},{"name":"SimpleKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keyCodes"},{"name":"SimpleLayoutService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleNotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleReplElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/replModel"},{"name":"SimpleResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleServicesNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"SimpleUriLabelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SimpleWorkerClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"SimpleWorkerServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/worker/simpleWorker"},{"name":"SimpleWorkspaceContextService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"SingleCursorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorCommon"},{"name":"SingleEditorGroupsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"singleLetterHash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"SingleLineInputHeight","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchWidget"},{"name":"SingleModelEditStackElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/editStack"},{"name":"singlePagePager","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/paging"},{"name":"SingleProxyRPCProtocol","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/api/testRPCProtocol"},{"name":"sinon","kind":"alias","kindModifiers":"declare","sortText":"4"},{"name":"Sinon","kind":"var","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"size","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"size","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"Sizing","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"Sizing","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/grid/grid"},{"name":"SlicedLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/lineTokens"},{"name":"SlowBuffer","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"SlowExtensionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions"},{"name":"SmartSnippetInserter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/common/smartSnippetInserter"},{"name":"SmoothScrollableElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/scrollableElement"},{"name":"SmoothScrollingOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"SmoothScrollingUpdate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/scrollable"},{"name":"snapshotToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"SnapUpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.snap"},{"name":"Snippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"SnippetCompletion","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider"},{"name":"SnippetCompletionProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider"},{"name":"SnippetController2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetController2"},{"name":"SnippetFile","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"snippetFinalTabstopHighlightBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"snippetFinalTabstopHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"SnippetParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"SnippetSession","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetSession"},{"name":"SnippetSortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"SnippetSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/snippetsFile"},{"name":"SnippetsSynchroniser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/snippetsSync"},{"name":"SnippetString","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SnippetString","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"snippetTabstopHighlightBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"snippetTabstopHighlightBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"Socket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dgram"},{"name":"Socket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"net"},{"name":"SocketDebugAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"sort","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"SortBy","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"sortedDiff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"Sorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"SortLinesAscendingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"SortLinesCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/sortLinesCommand"},{"name":"SortLinesDescendingAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"sortMimeTypes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/common/notebookCommon"},{"name":"SortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"SortOrder","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"Source","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"Source","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"Source","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"SourceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionCommands"},{"name":"sourceActionCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeAction"},{"name":"SourceBreakpoint","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SourceBreakpoint","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SourceBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SourceBufferList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SourceControlInputBoxValidationType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SourceControlInputBoxValidationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SparseEncodedTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"spawn","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"spawn","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"node-pty"},{"name":"spawnRipgrepCmd","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepFileSearch"},{"name":"spawnSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"child_process"},{"name":"SpdLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/log/node/spdlogService"},{"name":"specify","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechGrammar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechGrammarList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognition","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionAlternative","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionResult","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechRecognitionResultList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"speechSynthesis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesis","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisErrorEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisUtterance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SpeechSynthesisVoice","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SPLIT_EDITOR_DOWN","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_LEFT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_RIGHT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SPLIT_EDITOR_UP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"splitEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"SplitEditorAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorDownAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorLeftAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorOrthogonalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorRightAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"SplitEditorsVertically","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"SplitEditorUpAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"splitGlobAware","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/glob"},{"name":"SplitInActiveWorkspaceTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SplitLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"SplitLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/splitLinesCollection"},{"name":"splitName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"SplitTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SplitView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/splitview/splitview"},{"name":"spreadGlobComponents","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"spy","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"SQLiteStorageDatabase","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/node/storage"},{"name":"SSL_OP_ALL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CIPHER_SERVER_PREFERENCE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CISCO_ANYCONNECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_COOKIE_EXCHANGE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_CRYPTOPRO_TLSEXT_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_EPHEMERAL_RSA","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_LEGACY_SERVER_CONNECT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MICROSOFT_SESS_ID_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_MSIE_SSLV2_RSA_PADDING","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_CA_DN_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_CHALLENGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_QUERY_MTU","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SSLv2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_SSLv3","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TICKET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1_1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_NO_TLSv1_2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_PKCS1_CHECK_1","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_PKCS1_CHECK_2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SINGLE_DH_USE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SINGLE_ECDH_USE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SSLEAY_080_CLIENT_DH_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_BLOCK_PADDING_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_D5_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"SSL_OP_TLS_ROLLBACK_BUG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"StableEditorScrollState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"StackFrame","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"StackFrame","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/StackFrame"},{"name":"StackFrame","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/index"},{"name":"StandaloneCodeEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneCodeEditorNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"StandaloneCodeEditorServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeServiceImpl"},{"name":"StandaloneCommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneCommandsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess"},{"name":"StandaloneConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"StandaloneDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneCodeEditor"},{"name":"StandaloneGotoLineQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess"},{"name":"StandaloneGotoSymbolQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess"},{"name":"StandaloneKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneQuickInputServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl"},{"name":"StandaloneReferencesController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch"},{"name":"StandaloneTelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/simpleServices"},{"name":"StandaloneThemeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneThemeServiceImpl"},{"name":"StandardAutoClosingPairConditional","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/languageConfiguration"},{"name":"StandardKeyboardEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/keyboardEvent"},{"name":"StandardMouseEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"standardMouseMoveMerger","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/globalMouseMoveMonitor"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/textMateService"},{"name":"StandardTokenType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-textmate/release/main"},{"name":"StandardWheelEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/mouseEvent"},{"name":"StandardWindow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"start","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"start","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"start","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/native-watchdog/index"},{"name":"StartAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"StartDebugActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActionViewItems"},{"name":"StartDebugQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugQuickAccess"},{"name":"startExtensionHostProcess","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup"},{"name":"StartExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"StartFindAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"StartFindReplaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"StartFindWithSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findController"},{"name":"startProfiling","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"StartStopProblemCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"startsWith","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startsWithIgnoreCase","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startsWithUTF8BOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/issue/issueReporterMain"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/processExplorer/processExplorerMain"},{"name":"startup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/sharedProcessMain"},{"name":"StartupKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"StartupKindToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/common/lifecycle"},{"name":"StartupProfiler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/startupProfiler"},{"name":"StartupTimings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/performance/electron-browser/startupTimings"},{"name":"stat","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"stat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"State","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"State","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"stateExists","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"StatefullMarkdownCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell"},{"name":"StateMachine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"Statement","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"StateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/state/node/stateService"},{"name":"StateType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"StaticDND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dnd"},{"name":"StaticExtensionsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/staticExtensions"},{"name":"StaticLanguageSelector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/mockMode"},{"name":"StaticRange","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StaticRouter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/common/ipc"},{"name":"StaticServices","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneServices"},{"name":"StatisticType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionManagement"},{"name":"statLink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"Stats","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"statSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"status","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"status","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/aria/aria"},{"name":"STATUS_BAR_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_DEBUGGING_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_DEBUGGING_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_DEBUGGING_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"STATUS_BAR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_HOST_NAME_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_HOST_NAME_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_ITEM_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_ITEM_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_NO_FOLDER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"STATUS_CODES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"http"},{"name":"statusbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StatusbarAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/statusbar/common/statusbar"},{"name":"StatusBarAlignment","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"StatusBarAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"StatusBarColorProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/statusbarColorProvider"},{"name":"StatusbarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/statusbar/statusbarPart"},{"name":"StatusLabelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"StatusMessageChangeType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/notifications"},{"name":"StatusUpdater","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet"},{"name":"stderr","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"stdin","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"stdinDataListener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/stdin"},{"name":"stdout","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"STEP_BACK_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_INTO_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_INTO_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OUT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OUT_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OVER_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STEP_OVER_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"StereoPannerNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"stop","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"stop","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/event"},{"name":"STOP_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"STOP_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"StopExtensionHostProfileAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor"},{"name":"StopWatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stopwatch"},{"name":"Storage","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Storage","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"StorageDataCleaner","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/electron-browser/sharedProcess/contrib/storageDataCleaner"},{"name":"StorageEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StorageHint","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/storage/common/storage"},{"name":"StorageKeysSyncRegistryChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"StorageKeysSyncRegistryChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"StorageKeysSyncRegistryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/storageKeys"},{"name":"StorageMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/node/storageMainService"},{"name":"StorageManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StorageManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService"},{"name":"StorageScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"strcmp","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"Stream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"StreamDebugAdapter","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/node/debugAdapter"},{"name":"streamToBuffer","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"streamToBufferReadableStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"streamToNodeReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/stream"},{"name":"strict","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"strictEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"string","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"String","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StringBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase"},{"name":"StringDecoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"string_decoder"},{"name":"stringDiff","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"StringDiffSequence","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/diff/diff"},{"name":"StringEOL","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"stringHash","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"stringify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"stringify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/marshalling"},{"name":"StringIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"StringRepresentationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/gotoSymbol/peek/referencesTree"},{"name":"StringSHA1","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/hash"},{"name":"stringToSnapshot","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"stripCodicons","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/codicons"},{"name":"stripComments","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"stripUTF8BOM","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"stripWildcards","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"stub","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"styleMedia","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleMedia","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleSheet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"StyleSheetList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SubmenuAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/menu/menu"},{"name":"SubmenuItemAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"substituteMatches","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/monarch/monarchCommon"},{"name":"SubtleCrypto","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SuggestAlternatives","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestAlternatives"},{"name":"SuggestController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestController"},{"name":"SuggestEnabledInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput"},{"name":"suggestFilename","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/mime"},{"name":"SuggestMemoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestMemory"},{"name":"SuggestModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestModel"},{"name":"SuggestWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestWidget"},{"name":"suggestWidgetStatusbarMenu","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggest"},{"name":"suite","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"suiteRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"suiteSetup","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"suiteTeardown","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"super","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"SUPPORTED_CODE_ACTIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/codeAction/codeActionModel"},{"name":"SUPPORTED_ENCODINGS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"SurroundSelectionCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/surroundSelectionCommand"},{"name":"SVGAElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAngle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedAngle","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedBoolean","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedEnumeration","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedInteger","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedLength","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedLengthList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedNumber","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedNumberList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedPreserveAspectRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedString","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimatedTransformList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateMotionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimateTransformElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGAnimationElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGCircleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGClipPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGComponentTransferFunctionElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGCursorElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGDefsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGDescElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElementInstance","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGElementInstanceList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGEllipseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEBlendElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEColorMatrixElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEComponentTransferElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFECompositeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEConvolveMatrixElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDiffuseLightingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDisplacementMapElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDistantLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEDropShadowElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFloodElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncAElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncBElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEFuncRElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEGaussianBlurElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMergeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMergeNodeElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEMorphologyElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEOffsetElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFEPointLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFESpecularLightingElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFESpotLightElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFETileElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFETurbulenceElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGFilterElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGForeignObjectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGeometryElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGGraphicsElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGImageElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLength","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLengthList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLinearGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGLineElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMarkerElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMaskElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGMetadataElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGNumber","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGNumberList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSeg","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegArcAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegArcRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegClosePath","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicSmoothAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoCubicSmoothRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticSmoothAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegCurvetoQuadraticSmoothRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoHorizontalAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoHorizontalRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoVerticalAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegLinetoVerticalRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegMovetoAbs","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPathSegMovetoRel","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPatternElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPointList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPolygonElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPolylineElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGPreserveAspectRatio","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRadialGradientElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRect","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGRectElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGScriptElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStopElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStringList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGStyleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSVGElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSwitchElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGSymbolElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextContentElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextPathElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTextPositioningElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTitleElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTransform","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTransformList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGTSpanElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGUnitTypes","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGUseElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGViewElement","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGZoomAndPan","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SVGZoomEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"switch","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"SwitchPanelViewAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"SwitchRemoteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/explorerViewItems"},{"name":"SwitchRemoteViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/explorerViewItems"},{"name":"SwitchTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SwitchTerminalActionViewItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"SwitchWindow","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"symbol","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Symbol","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SYMBOL_ICON_ARRAY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_BOOLEAN_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CLASS_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_COLOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CONSTANT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_CONSTRUCTOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_ENUMERATOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_EVENT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FIELD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FILE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FOLDER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_FUNCTION_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_INTERFACE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_KEY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_KEYWORD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_METHOD_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_MODULE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NAMESPACE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NULL_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_NUMBER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_OBJECT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_OPERATOR_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_PACKAGE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_PROPERTY_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_REFERENCE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_SNIPPET_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_STRING_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_STRUCT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_TEXT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_TYPEPARAMETER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_UNIT_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SYMBOL_ICON_VARIABLE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineTree"},{"name":"SymbolInformation","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolInformation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SymbolKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"SymbolKinds","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolsQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/symbolsQuickAccess"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"SymbolTag","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"SymbolTag","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"symlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"symlink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"symlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"SyncActionDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/actions/common/actions"},{"name":"SyncDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/common/descriptors"},{"name":"SyncIgnoredIconAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"SyncManager","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SyncResource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"SyncStatus","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"SyntaxError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"SyntaxKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"SyntaxRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/syntaxRangeProvider"},{"name":"SystemDisabledWarningAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"systemPreferences","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TAB_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_BORDER_TOP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_ACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_HOVER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_INACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_BORDER_TOP","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_ACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_HOVER_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TAB_UNFOCUSED_INACTIVE_MODIFIED_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TabCompletionController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/snippets/browser/tabCompletion"},{"name":"TabFocus","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/commonEditorConfig"},{"name":"table","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TabsTitleControl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/tabsTitleControl"},{"name":"TAG","kind":"property","kindModifiers":"private,static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"tail","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"tail2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"takeHeapSnapshot","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Task","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Task","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TASK_RUNNING_STATE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"Task2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskConfigSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"TaskDefinition","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskDefinitionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskDefinitionRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskDefinitionRegistry"},{"name":"TaskDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskErrors","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskEvent","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskEventKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskExecuteKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TaskExecutionDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskFilterDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskGroup","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskGroup","kind":"type","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskGroup","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskHandleDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskIdentifier","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskConfiguration"},{"name":"TaskPanelKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskPanelKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskPresentationOptionsDTO","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"TaskQuickPick","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskQuickPick"},{"name":"TaskRevealKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskRevealKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskRunResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugTaskRunner"},{"name":"TaskRunSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskRunType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"tasks","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TASKS_CONFIGURATION_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TASKS_DEFAULT","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TaskScope","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TaskScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskScope","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TaskSequentializer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TaskService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/taskService"},{"name":"TaskService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/electron-browser/taskService"},{"name":"TaskSorter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TaskSourceKind","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/tasks"},{"name":"TasksQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/tasksQuickAccess"},{"name":"tasksSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"TaskStatusBarContributions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/task.contribution"},{"name":"teardown","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"TelemetryAppenderChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetryIpc"},{"name":"TelemetryAppenderClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/node/telemetryIpc"},{"name":"TelemetryClient","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/TelemetryClient"},{"name":"TelemetryClient","kind":"alias","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"TelemetryContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution"},{"name":"telemetryLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryService"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/browser/telemetryService"},{"name":"TelemetryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/electron-browser/telemetryService"},{"name":"TelemetryType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"telemetryTypeToBaseType","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/TelemetryTypes/TelemetryType"},{"name":"TEMPDIR_PREFIX","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"template","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"Terminal","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"xterm"},{"name":"TERMINAL_ACTION_CATEGORY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_BORDER_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_COMMAND_ID","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_CONFIG_SECTION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TERMINAL_CURSOR_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_CURSOR_FOREGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_FOREGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_SELECTION_BACKGROUND_COLOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalColorRegistry"},{"name":"TERMINAL_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TerminalConfigHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper"},{"name":"terminalConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalConfiguration"},{"name":"TerminalCursorStyle","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TerminalDataBufferer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminalDataBuffering"},{"name":"TerminalFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalFindWidget"},{"name":"TerminalInstance","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalInstance"},{"name":"TerminalInstanceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalInstanceService"},{"name":"TerminalInstanceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService"},{"name":"TerminalLinkManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager"},{"name":"TerminalNativeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService"},{"name":"TerminalPasteAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"TerminalProcess","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/node/terminalProcess"},{"name":"TerminalProcessExtHostProxy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy"},{"name":"TerminalProcessManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalProcessManager"},{"name":"TerminalQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalsQuickAccess"},{"name":"terminalSendSequenceCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"TerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalService"},{"name":"TerminalTab","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalTab"},{"name":"TerminalTaskSystem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem"},{"name":"TerminalValidatedLocalLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider"},{"name":"TerminalViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalView"},{"name":"TerminalWebLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalWebLinkProvider"},{"name":"TerminalWidgetManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager"},{"name":"TerminalWordLinkProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider"},{"name":"TERMINATE_THREAD_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"TerminateResponseCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/processes"},{"name":"TerminateResponseCode","kind":"alias","kindModifiers":"","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"TernarySearchTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"test","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"test","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"TEST_VIEW_CONTAINER_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"TestAccessibilityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testApplyEditsWithSyncedModels","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/editableTextModelTestUtils"},{"name":"TestBackupFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestBackupMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test"},{"name":"testCase","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"TestCell","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"TestChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestCodeEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"TestCodeEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/editorTestServices"},{"name":"TestColorTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"testCommand","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCommand"},{"name":"TestCommandService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/editorTestServices"},{"name":"TestConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/mocks/testConfiguration"},{"name":"TestConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/test/common/testConfigurationService"},{"name":"TestContextService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"TestDecorationProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/test/foldingModel.test"},{"name":"TestDecorationsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestDialogMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test"},{"name":"TestDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/dialogs/test/common/testDialogService"},{"name":"TestDiskFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/test/electron-browser/diskFileService.test"},{"name":"TestEditorGroupAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorGroupsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorGroupView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestElectronService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestEnvironmentService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestExperimentService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test"},{"name":"TestExtensionEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test"},{"name":"TestExtensionService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/node/utils"},{"name":"TestFileDialogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileIconTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"TestFilesConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestFindController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/test/findController.test"},{"name":"TestHistoryService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestHostService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestInstantiationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/instantiation/test/common/instantiationServiceMock"},{"name":"TestLayoutService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestLifecycleService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestListService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestMenuService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestNativePathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestNativeTextFileServiceWithEncodingOverrides","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestNotebookEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"TestNotificationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/notification/test/common/testNotificationService"},{"name":"TestPanelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestPathService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestProgressService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestReadonlyTextFileEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testRepeat","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"testRepeatedActionAndExtractPositions","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/test/wordTestUtils"},{"name":"testRepeatOnly","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"TestRPCProtocol","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/api/testRPCProtocol"},{"name":"TestService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestServiceAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestServiceAccessor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestServiceClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/test/node/testService"},{"name":"TestSharedProcessService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestStorageService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testTextBufferFactory","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test"},{"name":"TestTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestTextFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestTextResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestTextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/services/modelService.test"},{"name":"TestTextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"TestThemeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/test/common/testThemeService"},{"name":"TestUserDataSyncUtilService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"TestView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/browser/ui/grid/util"},{"name":"TestViewletService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"testViewModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/viewModel/testViewModel"},{"name":"TestViewsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"TestWindowConfiguration","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"TestWorkingCopy","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/test/common/workingCopyService.test"},{"name":"TestWorkingCopyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/common/workbenchTestServices"},{"name":"testWorkspace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/test/common/testWorkspace"},{"name":"TestWorkspace","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/test/common/testWorkspace"},{"name":"Text","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Text","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TEXT_DIFF_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TEXT_FILE_EDITOR_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"TextAreaHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaHandler"},{"name":"TextAreaInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaInput"},{"name":"TextAreaState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/controller/textAreaState"},{"name":"TextBadge","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/activity/common/activity"},{"name":"textBlockQuoteBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textBlockQuoteBorder","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextChange","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textChange"},{"name":"textCodeBlockBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextCompareEditorActiveContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextCompareEditorVisibleContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextDecoder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextDecoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TextDecoderStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextDiffEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textDiffEditor"},{"name":"TextDiffEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor/textDiffEditorModel"},{"name":"TextDocumentSaveReason","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextDocumentSaveReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextDocumentSaveReason","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEdit","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"TextEditElementRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree"},{"name":"TextEditorCursorBlinkingStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"TextEditorCursorBlinkingStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"TextEditorCursorStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TextEditorDecorationType","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"TextEditorEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTextEditor"},{"name":"TextEditorLineNumbersStyle","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorLineNumbersStyle","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorLineNumbersStyle","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextEditorOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"TextEditorRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorSelectionChangeKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TextEditorSelectionChangeKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TextEditorSelectionRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/editor/common/editor"},{"name":"TextEditorState","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/history/browser/history"},{"name":"TextEncoder","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextEncoder","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TextEncoderStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextFileContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"TextFileEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileEditor"},{"name":"TextFileEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileEditorModel"},{"name":"TextFileEditorModelManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileEditorModelManager"},{"name":"TextFileEditorModelState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileEditorTracker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileEditorTracker"},{"name":"TextFileLoadReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileOperationError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileOperationResult","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextFileSaveErrorHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler"},{"name":"TextFileSaveParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textFileSaveParticipant"},{"name":"TextInputActionsProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/textInputActions"},{"name":"textLinkActiveForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textLinkForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"textmateColorGroupSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"textmateColorSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"textmateColorsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/colorThemeSchema"},{"name":"TextMateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/browser/textMateService"},{"name":"TextMateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateService"},{"name":"TextmateSnippet","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TextMateWorker","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateWorker"},{"name":"TextMateWorkerHost","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/electron-browser/textMateService"},{"name":"TextMetrics","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModel"},{"name":"TextModelCancellationTokenSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/core/editorState"},{"name":"TextModelResolvedOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"TextModelResolverService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textmodelResolver/common/textModelResolverService"},{"name":"TextModelSearch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelSearch"},{"name":"TextModelTokenization","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelTokens"},{"name":"textPreformatForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextResourceConfigurationService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/textResourceConfigurationServiceImpl"},{"name":"TextResourceEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/textResourceEditor"},{"name":"TextResourceEditorInput","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"TextResourcePropertiesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textresourceProperties/common/textResourcePropertiesService"},{"name":"TextSearchEngineAdapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/textSearchAdapter"},{"name":"TextSearchManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"TextSearchMatch","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"TextSearchResultsCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/textSearchManager"},{"name":"textSeparatorForeground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TextSnapshotReadable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"TextTrack","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackCueList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TextTrackList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Themable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemableDecorationAttachmentRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ThemableDecorationRenderOptions","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"ThemeColor","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ThemeColor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"themeColorFromId","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemeConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"ThemeIcon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ThemeIcon","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/themeService"},{"name":"ThemeIcon","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ThemeMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/electron-main/themeMainService"},{"name":"ThemeRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeExtensionPoints"},{"name":"ThemeRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMHelper"},{"name":"ThemeSettings","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"ThemeTrieElement","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"ThemeTrieElementRule","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"this","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Thread","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"ThreadAndSessionIds","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"threadId","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"throttle","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/decorators"},{"name":"ThrottledDelayer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"Throttler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"throw","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"throwDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"throwProposedApiError","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"throws","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"assert"},{"name":"tildify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"time","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimeBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"timeEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timeline","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimelineElementTemplate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"timelineEnd","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"TimelineFollowActiveEditorContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineIdentityProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TimelineItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TimelineKeyboardNavigationLabelProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelineListVirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelinePane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timelinePane"},{"name":"TimelinePaneDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/browser/timeline.contribution"},{"name":"TimelinePaneId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"TimelineService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timelineService"},{"name":"timeLog","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timeout","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TIMEOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"TimeoutTimer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/async"},{"name":"TimeRanges","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"timeStamp","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"timingSafeEqual","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"title","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"TITLE_BAR_ACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_ACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_INACTIVE_BACKGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TITLE_BAR_INACTIVE_FOREGROUND","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"TitlebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/titlebar/titlebarPart"},{"name":"TitlebarPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/parts/titlebar/titlebarPart"},{"name":"TitleCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"TitleControl","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/titleControl"},{"name":"TitleEventSource","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/common/terminal"},{"name":"TLSSocket","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tls"},{"name":"TMGrammarFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMGrammarFactory"},{"name":"tmpdir","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"TMScopeRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textMate/common/TMScopeRegistry"},{"name":"toASCII","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"toBackupWorkspaceResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/backup/electron-browser/backup"},{"name":"toBufferOrReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/textfile/common/textfiles"},{"name":"toCanonicalName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"tocData","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/settingsLayout"},{"name":"TOCRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"TOCTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"TOCTreeModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/tocTree"},{"name":"toDecodeStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"toDisposable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/lifecycle"},{"name":"toErrorMessage","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errorMessage"},{"name":"toExtension","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensions"},{"name":"toExtensionDescription","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"toFileChanges","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/watcher"},{"name":"toFileOperationResult","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"toFileSystemProviderErrorCode","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"TOGGLE_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_CONDITIONAL_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_DIFF_IGNORE_TRIM_WHITESPACE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"TOGGLE_DIFF_SIDE_BY_SIDE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorCommands"},{"name":"TOGGLE_IGNORE_EXTENSION_ACTION_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"TOGGLE_INLINE_BREAKPOINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugCommands"},{"name":"TOGGLE_LOG_POINT_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugEditorActions"},{"name":"TOGGLE_NOTIFICATION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"TOGGLE_NOTIFICATIONS_CENTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands"},{"name":"ToggleActivityBarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleAutoSaveAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"ToggleAutoUpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"ToggleBreakpointsActivatedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/debugActions"},{"name":"toggleCaseSensitiveCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleCaseSensitiveCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleCaseSensitiveKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"toggleClass","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"ToggleCollapseAndExpandAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"toggleCollapseState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/folding/foldingModel"},{"name":"ToggleColumnSelectionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection"},{"name":"ToggleCompositePinnedAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/compositeBarActions"},{"name":"ToggleDevToolsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ToggleEditorLayoutAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleEditorVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleGroupSizesAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/editor/editorActions"},{"name":"ToggleHighContrastNLS","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standaloneStrings"},{"name":"ToggleMaximizedPanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"ToggleMenuBarAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleMinimapAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleMinimap"},{"name":"ToggleMultiCursorModifierAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier"},{"name":"TogglePanelAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/panel/panelActions"},{"name":"ToggleReactionsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/comments/browser/reactionsAction"},{"name":"toggleRegexCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleRegexCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleRegexKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleRenderControlCharacterAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter"},{"name":"ToggleRenderWhitespaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace"},{"name":"toggleSearchEditorCaseSensitiveCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorCaseSensitiveCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorContextLinesCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorContextLinesCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorRegexCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorRegexCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"toggleSearchEditorWholeWordCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions"},{"name":"ToggleSearchEditorWholeWordCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/searchEditor/browser/constants"},{"name":"ToggleSearchOnTypeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleSearchScopeKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleSharedProcessAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/developerActions"},{"name":"ToggleSidebarPositionAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleSidebarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleStatusbarVisibilityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleTabFocusModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode"},{"name":"ToggleTerminalAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalActions"},{"name":"ToggleViewAction","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/actions/layoutActions"},{"name":"ToggleViewletAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ToggleViewModeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/browser/repositoryPane"},{"name":"toggleWholeWordCommand","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/browser/searchActions"},{"name":"ToggleWholeWordCommandId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/constants"},{"name":"ToggleWholeWordKeybinding","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/find/findModel"},{"name":"ToggleWindowTabsBarHandler","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"Token","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"Token","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TOKEN_TYPE_WILDCARD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenClassificationExtensionPoints","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/tokenClassificationExtensionPoint"},{"name":"TokenizationRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TokenizationRegistryImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/tokenizationRegistry"},{"name":"TokenizationResult","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"TokenizationResult2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/core/token"},{"name":"TokenizationStateStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/textModelTokens"},{"name":"TokenizationSupport2Adapter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneLanguages"},{"name":"tokenize","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/browser/standaloneEditor"},{"name":"tokenizeLineToHTML","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/textToHtmlTokenizer"},{"name":"tokenizeToString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/textToHtmlTokenizer"},{"name":"TokenMetadata","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TokensStore","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"TokensStore2","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/tokensStore"},{"name":"TokenStyle","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenStylingRule","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"tokenStylingSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TokenTheme","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"TokenType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"toKey","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/timeline/common/timeline"},{"name":"toLocalISOString","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/date"},{"name":"toLocalResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/resources"},{"name":"toMultilineTokens2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/services/semanticTokensProviderStyling"},{"name":"toNamespacedPath","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"toNodeEncoding","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"toolbar","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"ToolBar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/toolbar/toolbar"},{"name":"TOOLTIP_HOVER_THRESHOLD","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers"},{"name":"TooltipWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets"},{"name":"toOverrides","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"top","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"top","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"topAsync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"toReadable","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"toResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/test/common/utils"},{"name":"toResource","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"toSlashes","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/extpath"},{"name":"toStandardTokenType","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/supports/tokenization"},{"name":"toStoreData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"toStream","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"toString","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"totalmem","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"Touch","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Touch","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"TouchBar","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarButton","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarColorPicker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarGroup","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarLabel","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarPopover","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarScrubber","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSegmentedControl","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSlider","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchBarSpacer","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TouchEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TouchList","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"toUint32","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"toUint8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uint"},{"name":"toUnicode","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"toValuesTree","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configuration"},{"name":"toWorkspaceFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"toWorkspaceFolders","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"toWorkspaceIdentifier","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"trace","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"traceDeprecation","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"traceProcessWarnings","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"TrackedRangeStickiness","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"TrackedRangeStickiness","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"TrackEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"trackFocus","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"transcode","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"buffer"},{"name":"transform","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/stream"},{"name":"Transform","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"Transform","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"TransformableMarker","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"transformAndReviveIncomingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"transformErrorForSerialization","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/errors"},{"name":"transformIncomingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"transformOutgoingURIs","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"TransformStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TransitionEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Translations","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/common/extensionPoints"},{"name":"translationsConfigFile","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"transparent","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TransposeAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"Tray","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"TreeDragOverBubble","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeDragOverReactions","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeElement","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/documentSymbols/outlineModel"},{"name":"TreeError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"treeIndentGuidesStroke","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"TreeItem","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItem","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TreeItem2","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"TreeItemCollapsibleState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"TreeMouseEventTarget","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeNode","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"TreeResourceNavigator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"TreeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"TreeViewPane","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/treeView"},{"name":"TreeVisibility","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"TreeWalker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"TRIGGER_RENAME_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"TriggerAction","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/quickinput/browser/pickerQuickAccess"},{"name":"triggerAsyncId","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"async_hooks"},{"name":"triggerDownload","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"TriggerParameterHintsAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/parameterHints/parameterHints"},{"name":"Triggers","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskSystem"},{"name":"TriggerSuggestAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/suggestController"},{"name":"trim","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"TrimFinalNewLinesParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"trimTrailingWhitespace","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/trimTrailingWhitespaceCommand"},{"name":"TrimTrailingWhitespaceAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"TrimTrailingWhitespaceCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/commands/trimTrailingWhitespaceCommand"},{"name":"TrimWhitespaceParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/saveParticipants"},{"name":"true","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"trueMachineIdKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetry"},{"name":"truncate","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"truncate","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"truncateSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"TRUSTED_DOMAINS_CONTENT_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"TRUSTED_DOMAINS_STORAGE_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomains"},{"name":"TrustedDomainsFileSystemProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/url/common/trustedDomainsFileSystemProvider"},{"name":"try","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"TunnelCloseableContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelDto","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTunnelService"},{"name":"TunnelFactoryContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/tunnelFactory"},{"name":"TunnelModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"TunnelPanel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelPanelDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/tunnelService"},{"name":"TunnelService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/node/tunnelService"},{"name":"TunnelType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/remote/common/remoteExplorerService"},{"name":"TunnelTypeContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"TunnelViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/browser/tunnelView"},{"name":"twistiePixels","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/baseDebugView"},{"name":"type","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"type","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Type","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/comment/lineCommentCommand"},{"name":"typeAndModifierIdPattern","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/tokenClassificationRegistry"},{"name":"TypeDefinitionProviderRegistry","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"TypeError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"typeof","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"TypeOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorTypeOperations"},{"name":"types","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"util"},{"name":"TypeWithAutoClosingCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorTypeOperations"},{"name":"ucs2","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"UIEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"UIKind","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"UIKind","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"UILabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"Uint16Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint32Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8Array","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8ClampedArray","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Uint8Matrix","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes/linkComputer"},{"name":"umask","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"undefined","kind":"var","kindModifiers":"","sortText":"4"},{"name":"UndoIgnoreExtensionRecommendationAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UndoRedoElementType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedo"},{"name":"UndoRedoService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/undoRedo/common/undoRedoService"},{"name":"UndoWebviewEditorCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/electron-browser/webviewCommands"},{"name":"unescape","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"unescape","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"querystring"},{"name":"Unicode11Addon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-unicode11/typings/xterm-addon-unicode11"},{"name":"unicodeEscapesToPCRE2","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/node/ripgrepTextSearchEngine"},{"name":"UninstallAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"unique","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"uniqueFilter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/arrays"},{"name":"unknown","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"UNKNOWN_SOURCE_LABEL","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugSource"},{"name":"UnknownExtensionRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"unlink","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"unlink","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"unlinkSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"UnloadReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/lifecycle/electron-main/lifecycleMainService"},{"name":"unmnemonicLabel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"untildify","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/labels"},{"name":"UNTITLED_WORKSPACE_NAME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"UntitledTextEditorInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorInput"},{"name":"UntitledTextEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorModel"},{"name":"UntitledTextEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/untitled/common/untitledTextEditorService"},{"name":"unwatchFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"unzip","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"unzipSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"UpdateAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UpdateAllAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions"},{"name":"UpdateChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateIpc"},{"name":"updateColorThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"UpdateContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/update/browser/update"},{"name":"updateFileIconThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"updateIgnoredSettings","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/settingsMerge"},{"name":"updateProblemMatchers","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/jsonSchema_v2"},{"name":"updateProductIconThemeConfigurationSchemas","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/themeConfiguration"},{"name":"updateTreeMetadata","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase"},{"name":"UpdateType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/common/update"},{"name":"updateViewTypeSchema","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"UpperCaseAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/linesOperations/linesOperations"},{"name":"uppercaseFirstLetter","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"uptime","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"uptime","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Uri","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Uri","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/editor.api"},{"name":"URI","kind":"alias","kindModifiers":"","sortText":"0"},{"name":"URIError","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"UriIterator","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"uriToFsPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uri"},{"name":"URITransformer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/uriIpc"},{"name":"URITransformerService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostUriTransformerService"},{"name":"url","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"inspector"},{"name":"URL","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"URL","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"URLHandlerChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLHandlerChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLHandlerRouter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/common/urlIpc"},{"name":"URLSearchParams","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"URLSearchParams","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"url"},{"name":"URLService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/url/node/urlService"},{"name":"USE_ICACLS","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"USE_SPLIT_JSON_SETTING","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferences"},{"name":"useFakeTimers","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"useFakeXMLHttpRequest","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/sinon/index"},{"name":"USER_DATA_SYNC_SCHEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"USER_MANIFEST_CACHE_FILE","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/extensions/common/extensions"},{"name":"USER_STANDALONE_CONFIGURATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"USER_TASKS_GROUP_KEY","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/taskService"},{"name":"userAgent","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/platform"},{"name":"UserConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"UserDataAutoSyncChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService"},{"name":"UserDataAutoSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userDataSync/electron-browser/userDataAutoSyncService"},{"name":"UserDataSycnUtilServiceChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncAuthentication","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncAuthentication"},{"name":"UserDataSyncBackupStoreService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncBackupStoreService"},{"name":"UserDataSyncChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"UserDataSyncEnablementService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncEnablementService"},{"name":"UserDataSyncError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"UserDataSyncErrorCode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"userDataSyncLogChannelId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/logs/common/logConstants"},{"name":"UserDataSyncLogService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncLog"},{"name":"UserDataSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncService"},{"name":"UserDataSyncService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService"},{"name":"UserDataSyncStoreError","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSync"},{"name":"UserDataSyncStoreService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncStoreService"},{"name":"UserDataSyncTestServer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/test/common/userDataSyncClient"},{"name":"UserDataSyncTrigger","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger"},{"name":"UserDataSyncUtilServiceClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/userDataSync/common/userDataSyncIpc"},{"name":"UserDataSyncViewContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncView"},{"name":"UserDataSyncWorkbenchContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync"},{"name":"userInfo","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"os"},{"name":"UserSettings","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationModels"},{"name":"UserSettingsLabelProvider","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/keybindingLabels"},{"name":"UserSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"userSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"useSlashForPath","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"USLayoutResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding"},{"name":"USUAL_WORD_SEPARATORS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model/wordHelper"},{"name":"UTF16be","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16be_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16le","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF16le_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8_BOM","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"UTF8_BOM_CHARACTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/strings"},{"name":"UTF8_with_bom","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/encoding"},{"name":"utimes","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"utimesSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"UV_UDP_REUSEADDR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"V4MAPPED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"dns"},{"name":"valid","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"ValidAnnotatedEditOperation","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/model"},{"name":"validateConstraint","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"validateConstraints","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"ValidatedEditorOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"validateFileName","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"validateFileName","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/fileActions"},{"name":"validatePaths","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/code/node/paths"},{"name":"validateProperty","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"validateTelemetryData","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/telemetry/common/telemetryUtils"},{"name":"ValidationState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"ValidationStatus","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/parsers"},{"name":"ValidityState","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"validRange","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"semver-umd"},{"name":"values","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/map"},{"name":"values","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/collections"},{"name":"var","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Variable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetParser"},{"name":"Variable","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugModel"},{"name":"VARIABLES_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"VariablesDataSource","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"variableSetEmitter","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"VariablesRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"VariablesView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/variablesView"},{"name":"verbose","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/vscode-sqlite3/index"},{"name":"Verbose","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"Verbosity","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/editor"},{"name":"VerifiedTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem"},{"name":"verify","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"Verify","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"crypto"},{"name":"version","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"version","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"punycode"},{"name":"version","kind":"const","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/spdlog/index"},{"name":"version","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"versions","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"VerticalRevealType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"VerticalScrollbar","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/scrollbar/verticalScrollbar"},{"name":"VideoPlaybackQuality","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"View","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewImpl"},{"name":"VIEW_CONTAINER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/browser/explorerViewlet"},{"name":"VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"ViewColumn","kind":"enum","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"ViewColumn","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"ViewColumn","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"viewColumnToEditorGroup","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/shared/editor"},{"name":"ViewConfigurationChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewContainerLocation","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"ViewContentPriority","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/views"},{"name":"ViewContentSizeChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewContentWidgets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets"},{"name":"ViewContext","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewContext"},{"name":"ViewController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewController"},{"name":"ViewCursor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewCursors/viewCursor"},{"name":"ViewCursors","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewCursors/viewCursors"},{"name":"ViewCursorStateChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewDecorationsChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewDescriptorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/views/browser/viewDescriptorService"},{"name":"ViewEventDispatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEventDispatcher"},{"name":"ViewEventEmitter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewEventHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewEventHandler"},{"name":"ViewEventsCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewEventType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewFlushedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewFocusChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewIdentifierMap","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewLanguageConfigurationEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLayout","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLayout"},{"name":"Viewlet","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/search/common/search"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/common/extensions"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/scm/common/scm"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/files"},{"name":"VIEWLET_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/remote/common/remote.contribution"},{"name":"ViewletActivityAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions"},{"name":"ViewletDescriptor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ViewletRegistry","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/viewlet"},{"name":"ViewLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"ViewLineData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewLineMappingChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLineOptions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLine"},{"name":"ViewLineRenderingData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewLines","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/lines/viewLines"},{"name":"ViewLinesChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLinesDeletedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLinesInsertedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewLineToken","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewLineTokenFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewLineTokens","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/core/viewLineToken"},{"name":"ViewMenuActions","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewMenuActions"},{"name":"ViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModelImpl"},{"name":"ViewModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debugViewModel"},{"name":"ViewModelDecoration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewModelDecorations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModelDecorations"},{"name":"ViewOutgoingEvents","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOutgoingEvents"},{"name":"ViewOverlayLine","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ViewOverlays","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewOverlays"},{"name":"ViewOverlayWidgets","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets"},{"name":"ViewPane","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewPaneContainer"},{"name":"ViewPaneContainer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/viewPaneContainer"},{"name":"ViewPart","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewPart"},{"name":"Viewport","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewModel/viewModel"},{"name":"ViewportData","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/viewLayout/viewLinesViewportData"},{"name":"ViewQuickAccessProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess"},{"name":"ViewRevealRangeRequestEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"viewsContainersContribution","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/browser/viewsExtensionPoint"},{"name":"ViewScrollChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/parts/views/views"},{"name":"ViewsWelcomeContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution"},{"name":"viewsWelcomeExtensionPointDescriptor","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewsWelcomeExtensionPointFields","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint"},{"name":"ViewThemeChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewTokensChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"ViewTokensColorsChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"viewTypeSchamaAddition","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/editor/browser/editorAssociationsSetting"},{"name":"ViewZoneDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"ViewZones","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/viewParts/viewZones/viewZones"},{"name":"ViewZonesChangedEvent","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/viewEvents"},{"name":"VirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/markers/browser/markersTreeViewer"},{"name":"VirtualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree"},{"name":"virtualMachineHint","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/id"},{"name":"VirualDelegate","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer"},{"name":"VisibleLinesCollection","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/browser/view/viewLayer"},{"name":"VisibleRanges","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/view/renderingContext"},{"name":"visit","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/json"},{"name":"void","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"VRDisplay","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRDisplayCapabilities","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRDisplayEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VREyeParameters","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRFieldOfView","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRFrameData","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VRPose","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"vs","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"vs_code_editor_walkthrough","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough"},{"name":"vs_code_welcome_page","kind":"property","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page"},{"name":"vs_dark","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/standalone/common/themes"},{"name":"VS_DARK_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VS_HC_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VS_LIGHT_THEME","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/common/workbenchThemeService"},{"name":"VSBuffer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"VTTCue","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"VTTRegion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"W_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WAIT_BETWEEN_RESEND","kind":"property","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Library/Sender"},{"name":"WALK_THROUGH_FOCUS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart"},{"name":"WalkThroughArrowDown","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughActions"},{"name":"WalkThroughArrowUp","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughActions"},{"name":"WalkThroughContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughContentProvider"},{"name":"WalkThroughInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughInput"},{"name":"WalkThroughModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughInput"},{"name":"WalkThroughPageDown","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughActions"},{"name":"WalkThroughPageUp","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughActions"},{"name":"WalkThroughPart","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart"},{"name":"WalkThroughSnippetContentProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughContentProvider"},{"name":"warn","kind":"method","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"console"},{"name":"Warning","kind":"enum member","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/Declarations/Contracts/Generated/SeverityLevel"},{"name":"watch","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"watch","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/chokidar/types/index"},{"name":"WATCH_VIEW_ID","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/common/debug"},{"name":"WatcherChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherIpc"},{"name":"WatcherChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherIpc"},{"name":"WatcherChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/unix/watcherIpc"},{"name":"WatcherChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/node/watcher/nsfw/watcherIpc"},{"name":"WatchExpressionsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/watchExpressionsView"},{"name":"WatchExpressionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/watchExpressionsView"},{"name":"watchFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"watchFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"watchFolder","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/watcher"},{"name":"WatchingProblemCollector","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tasks/common/problemCollectors"},{"name":"WatermarkContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/watermark/browser/watermark"},{"name":"WaveShaperNode","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WeakMap","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WeakMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/tree/tree"},{"name":"WeakSet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebAssembly","kind":"module","kindModifiers":"declare","sortText":"4"},{"name":"WebAuthentication","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebAuthnAssertion","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webContents","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebContents","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"webFrame","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebGL2RenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLActiveInfo","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebglAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-webgl/typings/xterm-addon-webgl"},{"name":"WebGLBuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLContextEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLFramebuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLObject","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLProgram","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLQuery","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLRenderbuffer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLRenderingContext","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLSampler","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLShader","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLShaderPrecisionFormat","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLSync","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLTexture","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLTransformFeedback","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLUniformLocation","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebGLVertexArrayObject","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebIssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/browser/issueService"},{"name":"webkitCancelAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitConvertPointFromNodeToPage","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitConvertPointFromPageToNode","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"WebKitCSSMatrix","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebKitPoint","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webkitRequestAnimationFrame","kind":"function","kindModifiers":"declare","sortText":"4"},{"name":"webkitRTCPeerConnection","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"webkitURL","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebLinksAddon","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/xterm-addon-web-links/typings/xterm-addon-web-links"},{"name":"WebRequest","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebResourceIdentityService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/resource/common/resourceIdentityService"},{"name":"WebSocket","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WebSocketNodeSocket","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/parts/ipc/node/ipc.net"},{"name":"WebTelemetryAppender","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/telemetry/browser/telemetryService"},{"name":"webviewDeveloperCategory","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"WebviewEditor","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditor"},{"name":"WebviewEditorCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHost.protocol"},{"name":"WebViewEditorFindNextCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"WebViewEditorFindPreviousCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewCommands"},{"name":"WebviewEditorInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory"},{"name":"WebviewEditorService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService"},{"name":"WebviewFindWidget","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewFindWidget"},{"name":"webviewHasOwnEditFunctionsContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"webviewHasOwnEditFunctionsContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webview"},{"name":"WebviewIconManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewIconManager"},{"name":"WebviewInput","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewEditorInput"},{"name":"WebviewMessageChannels","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/baseWebviewElement"},{"name":"WebviewPortMappingManager","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/portMapping"},{"name":"WebviewResourceResponse","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"WebviewResourceScheme","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/resourceLoader"},{"name":"WebviewService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/browser/webviewService"},{"name":"webviewTag","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"electron"},{"name":"WebviewThemeDataProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/webview/common/themeing"},{"name":"WebWorkerExtensionHostStarter","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter"},{"name":"WelcomeInputFactory","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomeOverlayAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay"},{"name":"WelcomePageAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"welcomePageBackground","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomePageContribution","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/welcome/page/browser/welcomePage"},{"name":"WelcomeView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/debug/browser/welcomeView"},{"name":"WheelEvent","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"whenDeleted","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"whenProviderRegistered","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/files/common/files"},{"name":"while","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"WholeWordsCheckbox","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/findinput/findInputCheckboxes"},{"name":"Widget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/ui/widget"},{"name":"widgetShadow","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"WidgetVerticalAlignment","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager"},{"name":"WillSaveStateReason","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/storage/common/storage"},{"name":"win32","kind":"module","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"path"},{"name":"win32","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/path"},{"name":"win32","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/processes"},{"name":"Win32UpdateService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/update/electron-main/updateService.win32"},{"name":"window","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"window","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Window","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"WINDOW_ACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WINDOW_INACTIVE_BORDER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WindowDriverChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverRegistryChannel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowDriverRegistryChannelClient","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/driver/node/driver"},{"name":"WindowMode","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windows"},{"name":"windowOpenNoOpener","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/browser/dom"},{"name":"windowSettings","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/configuration/common/configurationRegistry"},{"name":"WindowsExternalTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService"},{"name":"WindowsKeyboardMapper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"windowsKeyboardMappingEquals","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"WindowsMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/windows/electron-main/windowsMainService"},{"name":"WindowsNativeResolvedKeybinding","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper"},{"name":"WindowsShellHelper","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/electron-browser/windowsShellHelper"},{"name":"WindowsShellType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/terminal/browser/terminal"},{"name":"windowsStore","kind":"property","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"process"},{"name":"Winreg","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"with","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"withEditorModel","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/common/editorTestUtils"},{"name":"withFormatting","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/jsonEdit"},{"name":"withNullAsUndefined","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"withTestCodeEditor","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/test/browser/testCodeEditor"},{"name":"withTestNotebook","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/notebook/test/testNotebookEditor"},{"name":"withUndefinedAsNull","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/types"},{"name":"WordCharacterClass","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"WordCharacterClassifier","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/wordCharacterClassifier"},{"name":"WordContextKey","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/wordContextKey"},{"name":"WordDistance","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/suggest/wordDistance"},{"name":"WordLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"WordNavigationType","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordPartLeftCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"WordPartOperations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/controller/cursorWordOperations"},{"name":"WordPartRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordPartOperations/wordPartOperations"},{"name":"WordRightCommand","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/wordOperations/wordOperations"},{"name":"WordSelectionRangeProvider","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/smartSelect/wordSelections"},{"name":"Workbench","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/workbench"},{"name":"WORKBENCH_BACKGROUND","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/theme"},{"name":"WorkbenchAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchColorsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/theme/common/colorRegistry"},{"name":"WorkbenchCompressibleAsyncDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchCompressibleObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchConfigurationNodeBase","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/common/configuration"},{"name":"WorkbenchContextKeysHandler","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkbenchDataTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"workbenchInstantiationService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/browser/workbenchTestServices"},{"name":"workbenchInstantiationService","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/test/electron-browser/workbenchTestServices"},{"name":"WorkbenchIssueService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/issue/electron-browser/issueService"},{"name":"WorkbenchKeybindingService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/keybinding/browser/keybindingService"},{"name":"WorkbenchList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListAutomaticKeyboardNavigation","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListAutomaticKeyboardNavigationKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListDoubleSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListFocusContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListHasSelectionOrFocus","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListMultiSelection","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListSupportsKeyboardNavigation","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchListSupportsMultiSelectContextKey","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchModeServiceImpl","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/mode/common/workbenchModeService"},{"name":"WorkbenchObjectTree","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchPagedList","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/list/browser/listService"},{"name":"WorkbenchReferencesController","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch"},{"name":"WorkbenchState","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WorkbenchStateContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkbenchThemeService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/themes/browser/workbenchThemeService"},{"name":"worker","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"Worker","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"Worker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"Worker","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"workerData","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"worker_threads"},{"name":"WorkerExtHostDebugService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostDebugService"},{"name":"WorkerExtHostTask","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTask"},{"name":"WorkerExtHostTerminalService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTerminalService"},{"name":"workers","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"cluster"},{"name":"WorkingCopyCapabilities","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"WorkingCopyFileOperationParticipant","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant"},{"name":"WorkingCopyFileService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyFileService"},{"name":"WorkingCopyService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/workingCopy/common/workingCopyService"},{"name":"Worklet","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"workspace","kind":"module","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"Workspace","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WORKSPACE_EXTENSION","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"WORKSPACE_FILTER","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/common/workspaces"},{"name":"WORKSPACE_SCOPES","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WORKSPACE_STANDALONE_CONFIGURATIONS","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WorkspaceBasedVariableResolver","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/snippet/snippetVariables"},{"name":"WorkspaceChangeExtHostRelauncher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution"},{"name":"WorkspaceConfiguration","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configuration"},{"name":"WorkspaceConfigurationEditorModel","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/preferences/common/preferencesModels"},{"name":"WorkspaceConfigurationModelParser","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configurationModels"},{"name":"WorkspaceEdit","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"vscode"},{"name":"WorkspaceEdit","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypes"},{"name":"WorkspaceEdit","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"WorkspaceFileEdit","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"WorkspaceFolder","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspace/common/workspace"},{"name":"WorkspaceFolderCountContext","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/browser/contextkeys"},{"name":"WorkspaceRecommendations","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations"},{"name":"WorkspaceRecommendedExtensionsView","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews"},{"name":"WorkspaceService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/browser/configurationService"},{"name":"WorkspaceSettingsRenderer","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/preferences/browser/preferencesRenderers"},{"name":"workspaceSettingsSchemaId","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/services/configuration/common/configuration"},{"name":"WorkspacesHistoryMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService"},{"name":"WorkspacesMainService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesMainService"},{"name":"WorkspacesService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/workspaces/electron-main/workspacesService"},{"name":"WorkspaceSymbol","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/api/common/extHostTypeConverters"},{"name":"WorkspaceSymbolProviderRegistry","kind":"module","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/search/common/search"},{"name":"WorkspaceTags","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTags"},{"name":"WorkspaceTagsService","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/tags/electron-browser/workspaceTagsService"},{"name":"WorkspaceTextEdit","kind":"interface","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/modes"},{"name":"WorkspaceWatcher","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/files/common/workspaceWatcher"},{"name":"wrap","kind":"method","kindModifiers":"static,declare","sortText":"5","hasAction":true,"source":"module"},{"name":"WrappingIndent","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/config/editorOptions"},{"name":"WrappingIndent","kind":"enum","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/common/standalone/standaloneEnums"},{"name":"wrapWithCorrelationContext","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/applicationinsights/out/applicationinsights"},{"name":"Writable","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"stream"},{"name":"WritableStream","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"write","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFile","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFile","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"writeFileSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeFileSync","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/pfs"},{"name":"writeHeapSnapshot","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"v8"},{"name":"writeProfile","kind":"function","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"v8-inspect-profiler"},{"name":"writer","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"repl"},{"name":"WriteStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"WriteStream","kind":"class","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"tty"},{"name":"writeSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writeTransientState","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/contrib/codeEditor/browser/toggleWordWrap"},{"name":"writeUInt16LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt32BE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt32LE","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writeUInt8","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/common/buffer"},{"name":"writev","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"writevSync","kind":"function","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"fs"},{"name":"WSA_E_CANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSA_E_NO_MORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEACCES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEADDRINUSE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEADDRNOTAVAIL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEAFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEALREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEBADF","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECANCELLED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNABORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAECONNRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDESTADDRREQ","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDISCON","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEDQUOT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEFAULT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEHOSTDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEHOSTUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINPROGRESS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINTR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVAL","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVALIDPROCTABLE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEINVALIDPROVIDER","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEISCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAELOOP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEMFILE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEMSGSIZE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENAMETOOLONG","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETRESET","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENETUNREACH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOBUFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOMORE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOPROTOOPT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTCONN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTEMPTY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAENOTSOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEOPNOTSUPP","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPFNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROCLIM","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROTONOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROTOTYPE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEPROVIDERFAILEDINIT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEREFUSED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEREMOTE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESHUTDOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESOCKTNOSUPPORT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAESTALE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAETIMEDOUT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAETOOMANYREFS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEUSERS","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAEWOULDBLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSANOTINITIALISED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASERVICE_NOT_FOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASYSCALLFAILURE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSASYSNOTREADY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSATYPE_NOT_FOUND","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"WSAVERNOTSUPPORTED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"X_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"constants"},{"name":"x01","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x02","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x03","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x04","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x05","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x06","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x07","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x08","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x09","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x10","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x11","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x12","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x13","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x14","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x15","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x16","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x17","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x18","kind":"const","kindModifiers":"","sortText":"4"},{"name":"x19","kind":"const","kindModifiers":"","sortText":"4"},{"name":"xdescribe","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"xdgRuntimeDir","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/environment/node/environmentService"},{"name":"xit","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLDocument","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequest","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequestEventTarget","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLHttpRequestUpload","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XMLSerializer","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathEvaluator","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathExpression","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XPathResult","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"XSLTProcessor","kind":"var","kindModifiers":"declare","sortText":"4"},{"name":"yield","kind":"keyword","kindModifiers":"","sortText":"4"},{"name":"Z_ASCII","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BEST_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BEST_SPEED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BINARY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BLOCK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_BUF_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DATA_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFAULT_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFAULT_STRATEGY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_DEFLATED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_ERRNO","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FILTERED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FINISH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FIXED","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_FULL_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_HUFFMAN_ONLY","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_MEM_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NEED_DICT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NO_COMPRESSION","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_NO_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_OK","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_PARTIAL_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_RLE","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_STREAM_END","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_STREAM_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_SYNC_FLUSH","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_TEXT","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_TREES","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_UNKNOWN","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"Z_VERSION_ERROR","kind":"const","kindModifiers":"declare","sortText":"5","hasAction":true,"source":"zlib"},{"name":"zip","kind":"function","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/base/node/zip"},{"name":"ZipFile","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yauzl/index"},{"name":"ZipFile","kind":"class","kindModifiers":"export,declare","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/node_modules/@types/yazl/index"},{"name":"ZoneWidget","kind":"class","kindModifiers":"abstract,export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/editor/contrib/zoneWidget/zoneWidget"},{"name":"ZoomInAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ZoomOutAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"},{"name":"ZoomResetAction","kind":"class","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/workbench/electron-browser/actions/windowActions"}]}}'; diff --git a/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts b/src/vs/workbench/api/test/browser/extHostDocumentData.test.ts similarity index 99% rename from src/vs/workbench/test/browser/api/extHostDocumentData.test.ts rename to src/vs/workbench/api/test/browser/extHostDocumentData.test.ts index 228f929ca15..a3cada12b00 100644 --- a/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDocumentData.test.ts @@ -365,7 +365,7 @@ enum AssertDocumentLineMappingDirection { suite('ExtHostDocumentData updates line mapping', () => { - function positionToStr(position: { line: number; character: number; }): string { + function positionToStr(position: { line: number; character: number }): string { return '(' + position.line + ',' + position.character + ')'; } diff --git a/src/vs/workbench/test/browser/api/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts similarity index 99% rename from src/vs/workbench/test/browser/api/extHostDocumentSaveParticipant.test.ts rename to src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts index 4859a1f9086..60d1caefa3d 100644 --- a/src/vs/workbench/test/browser/api/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts @@ -9,7 +9,7 @@ import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocum import { TextDocumentSaveReason, TextEdit, Position, EndOfLine } from 'vs/workbench/api/common/extHostTypes'; import { MainThreadTextEditorsShape, IWorkspaceEditDto, IWorkspaceTextEditDto, MainThreadBulkEditsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/common/extHostDocumentSaveParticipant'; -import { SingleProxyRPCProtocol } from './testRPCProtocol'; +import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { SaveReason } from 'vs/workbench/common/editor'; import type * as vscode from 'vscode'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/test/browser/api/extHostDocumentsAndEditors.test.ts b/src/vs/workbench/api/test/browser/extHostDocumentsAndEditors.test.ts similarity index 94% rename from src/vs/workbench/test/browser/api/extHostDocumentsAndEditors.test.ts rename to src/vs/workbench/api/test/browser/extHostDocumentsAndEditors.test.ts index 95248a34a40..22e8c4a4a11 100644 --- a/src/vs/workbench/test/browser/api/extHostDocumentsAndEditors.test.ts +++ b/src/vs/workbench/api/test/browser/extHostDocumentsAndEditors.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { TestRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { NullLogService } from 'vs/platform/log/common/log'; suite('ExtHostDocumentsAndEditors', () => { diff --git a/src/vs/workbench/test/browser/api/extHostFileSystemEventService.test.ts b/src/vs/workbench/api/test/browser/extHostFileSystemEventService.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/extHostFileSystemEventService.test.ts rename to src/vs/workbench/api/test/browser/extHostFileSystemEventService.test.ts diff --git a/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts similarity index 81% rename from src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts rename to src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts index f73188ba2d1..da08c10521e 100644 --- a/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/api/test/browser/extHostLanguageFeatures.test.ts @@ -11,7 +11,7 @@ import * as types from 'vs/workbench/api/common/extHostTypes'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { Position as EditorPosition, Position } from 'vs/editor/common/core/position'; import { Range as EditorRange } from 'vs/editor/common/core/range'; -import { TestRPCProtocol } from './testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { MarkerService } from 'vs/platform/markers/common/markerService'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguageFeatures'; @@ -20,28 +20,28 @@ import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import * as modes from 'vs/editor/common/languages'; -import { getCodeLensModel } from 'vs/editor/contrib/codelens/codelens'; -import { getDefinitionsAtPosition, getImplementationsAtPosition, getTypeDefinitionsAtPosition, getDeclarationsAtPosition, getReferencesAtPosition } from 'vs/editor/contrib/gotoSymbol/goToSymbol'; -import { getHoverPromise } from 'vs/editor/contrib/hover/getHover'; -import { getOccurrencesAtPosition } from 'vs/editor/contrib/wordHighlighter/wordHighlighter'; -import { getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; +import * as languages from 'vs/editor/common/languages'; +import { getCodeLensModel } from 'vs/editor/contrib/codelens/browser/codelens'; +import { getDefinitionsAtPosition, getImplementationsAtPosition, getTypeDefinitionsAtPosition, getDeclarationsAtPosition, getReferencesAtPosition } from 'vs/editor/contrib/gotoSymbol/browser/goToSymbol'; +import { getHoverPromise } from 'vs/editor/contrib/hover/browser/getHover'; +import { getOccurrencesAtPosition } from 'vs/editor/contrib/wordHighlighter/browser/wordHighlighter'; +import { getCodeActions } from 'vs/editor/contrib/codeAction/browser/codeAction'; import { getWorkspaceSymbols } from 'vs/workbench/contrib/search/common/search'; -import { rename } from 'vs/editor/contrib/rename/rename'; -import { provideSignatureHelp } from 'vs/editor/contrib/parameterHints/provideSignatureHelp'; -import { provideSuggestionItems, CompletionOptions } from 'vs/editor/contrib/suggest/suggest'; -import { getDocumentFormattingEditsUntilResult, getDocumentRangeFormattingEditsUntilResult, getOnTypeFormattingEdits } from 'vs/editor/contrib/format/format'; -import { getLinks } from 'vs/editor/contrib/links/getLinks'; +import { rename } from 'vs/editor/contrib/rename/browser/rename'; +import { provideSignatureHelp } from 'vs/editor/contrib/parameterHints/browser/provideSignatureHelp'; +import { provideSuggestionItems, CompletionOptions } from 'vs/editor/contrib/suggest/browser/suggest'; +import { getDocumentFormattingEditsUntilResult, getDocumentRangeFormattingEditsUntilResult, getOnTypeFormattingEdits } from 'vs/editor/contrib/format/browser/format'; +import { getLinks } from 'vs/editor/contrib/links/browser/getLinks'; import { MainContext, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import type * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { NullLogService } from 'vs/platform/log/common/log'; import { ITextModel, EndOfLineSequence } from 'vs/editor/common/model'; -import { getColors } from 'vs/editor/contrib/colorPicker/color'; +import { getColors } from 'vs/editor/contrib/colorPicker/browser/color'; import { CancellationToken } from 'vs/base/common/cancellation'; import { nullExtensionDescription as defaultExtension } from 'vs/workbench/services/extensions/common/extensions'; -import { provideSelectionRanges } from 'vs/editor/contrib/smartSelect/smartSelect'; +import { provideSelectionRanges } from 'vs/editor/contrib/smartSelect/browser/smartSelect'; import { mock } from 'vs/base/test/common/mock'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { dispose } from 'vs/base/common/lifecycle'; @@ -50,7 +50,9 @@ import { NullApiDeprecationService } from 'vs/workbench/api/common/extHostApiDep import { Progress } from 'vs/platform/progress/common/progress'; import { IExtHostFileSystemInfo } from 'vs/workbench/api/common/extHostFileSystemInfo'; import { URITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService'; -import { OutlineModel } from 'vs/editor/contrib/documentSymbols/outlineModel'; +import { OutlineModel } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; suite('ExtHostLanguageFeatures', function () { @@ -60,6 +62,7 @@ suite('ExtHostLanguageFeatures', function () { let mainThread: MainThreadLanguageFeatures; let disposables: vscode.Disposable[] = []; let rpcProtocol: TestRPCProtocol; + let languageFeaturesService: ILanguageFeaturesService; let originalErrorHandler: (e: any) => any; suiteSetup(() => { @@ -76,11 +79,14 @@ suite('ExtHostLanguageFeatures', function () { rpcProtocol = new TestRPCProtocol(); + languageFeaturesService = new LanguageFeaturesService(); + // Use IInstantiationService to get typechecking when instantiating let inst: IInstantiationService; { let instantiationService = new TestInstantiationService(); instantiationService.stub(IMarkerService, MarkerService); + instantiationService.set(ILanguageFeaturesService, languageFeaturesService); inst = instantiationService; } @@ -128,7 +134,7 @@ suite('ExtHostLanguageFeatures', function () { // --- outline test('DocumentSymbols, register/deregister', async () => { - assert.strictEqual(modes.DocumentSymbolProviderRegistry.all(model).length, 0); + assert.strictEqual(languageFeaturesService.documentSymbolProvider.all(model).length, 0); let d1 = extHost.registerDocumentSymbolProvider(defaultExtension, defaultSelector, new class implements vscode.DocumentSymbolProvider { provideDocumentSymbols() { return []; @@ -136,7 +142,7 @@ suite('ExtHostLanguageFeatures', function () { }); await rpcProtocol.sync(); - assert.strictEqual(modes.DocumentSymbolProviderRegistry.all(model).length, 1); + assert.strictEqual(languageFeaturesService.documentSymbolProvider.all(model).length, 1); d1.dispose(); return rpcProtocol.sync(); @@ -155,7 +161,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = (await OutlineModel.create(model, CancellationToken.None)).asListOfDocumentSymbols(); + const value = (await OutlineModel.create(languageFeaturesService.documentSymbolProvider, model, CancellationToken.None)).asListOfDocumentSymbols(); assert.strictEqual(value.length, 1); }); @@ -167,7 +173,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = (await OutlineModel.create(model, CancellationToken.None)).asListOfDocumentSymbols(); + const value = (await OutlineModel.create(languageFeaturesService.documentSymbolProvider, model, CancellationToken.None)).asListOfDocumentSymbols(); assert.strictEqual(value.length, 1); let entry = value[0]; assert.strictEqual(entry.name, 'test'); @@ -198,7 +204,7 @@ suite('ExtHostLanguageFeatures', function () { await rpcProtocol.sync(); - const value = (await OutlineModel.create(model, CancellationToken.None)).asListOfDocumentSymbols(); + const value = (await OutlineModel.create(languageFeaturesService.documentSymbolProvider, model, CancellationToken.None)).asListOfDocumentSymbols(); assert.strictEqual(value.length, 6); assert.deepStrictEqual(value.map(s => s.name), ['containers', 'container 0', 'name', 'ports', 'ports 0', 'containerPort']); @@ -220,7 +226,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getCodeLensModel(model, CancellationToken.None); + const value = await getCodeLensModel(languageFeaturesService.codeLensProvider, model, CancellationToken.None); assert.strictEqual(value.lenses.length, 1); }); @@ -238,7 +244,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getCodeLensModel(model, CancellationToken.None); + const value = await getCodeLensModel(languageFeaturesService.codeLensProvider, model, CancellationToken.None); assert.strictEqual(value.lenses.length, 1); const [data] = value.lenses; const symbol = await Promise.resolve(data.provider.resolveCodeLens!(model, data.symbol, CancellationToken.None)); @@ -255,7 +261,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getCodeLensModel(model, CancellationToken.None); + const value = await getCodeLensModel(languageFeaturesService.codeLensProvider, model, CancellationToken.None); assert.strictEqual(value.lenses.length, 1); let [data] = value.lenses; const symbol = await Promise.resolve(data.provider.resolveCodeLens!(model, data.symbol, CancellationToken.None)); @@ -274,7 +280,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getDefinitionsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + let value = await getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 1); let [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 2, startColumn: 3, endLineNumber: 4, endColumn: 5 }); @@ -295,7 +301,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getDefinitionsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + const value = await getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 2); }); @@ -314,7 +320,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getDefinitionsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + const value = await getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 2); // let [first, second] = value; assert.strictEqual(value[0].uri.authority, 'second'); @@ -335,7 +341,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getDefinitionsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + const value = await getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 1); }); @@ -350,7 +356,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getDeclarationsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + let value = await getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 1); let [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 2, startColumn: 3, endLineNumber: 4, endColumn: 5 }); @@ -368,7 +374,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getImplementationsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + let value = await getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 1); let [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 2, startColumn: 3, endLineNumber: 4, endColumn: 5 }); @@ -386,7 +392,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getTypeDefinitionsAtPosition(model, new EditorPosition(1, 1), CancellationToken.None); + let value = await getTypeDefinitionsAtPosition(languageFeaturesService.typeDefinitionProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 1); let [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 2, startColumn: 3, endLineNumber: 4, endColumn: 5 }); @@ -404,7 +410,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - getHoverPromise(model, new EditorPosition(1, 1), CancellationToken.None).then(value => { + getHoverPromise(languageFeaturesService.hoverProvider, model, new EditorPosition(1, 1), CancellationToken.None).then(value => { assert.strictEqual(value.length, 1); let [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 5 }); @@ -421,7 +427,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - getHoverPromise(model, new EditorPosition(1, 1), CancellationToken.None).then(value => { + getHoverPromise(languageFeaturesService.hoverProvider, model, new EditorPosition(1, 1), CancellationToken.None).then(value => { assert.strictEqual(value.length, 1); let [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 4, startColumn: 1, endLineNumber: 9, endColumn: 8 }); @@ -444,9 +450,9 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getHoverPromise(model, new EditorPosition(1, 1), CancellationToken.None); + const value = await getHoverPromise(languageFeaturesService.hoverProvider, model, new EditorPosition(1, 1), CancellationToken.None); assert.strictEqual(value.length, 2); - let [first, second] = (value as modes.Hover[]); + let [first, second] = (value as languages.Hover[]); assert.strictEqual(first.contents[0].value, 'registered second'); assert.strictEqual(second.contents[0].value, 'registered first'); }); @@ -466,7 +472,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - getHoverPromise(model, new EditorPosition(1, 1), CancellationToken.None).then(value => { + getHoverPromise(languageFeaturesService.hoverProvider, model, new EditorPosition(1, 1), CancellationToken.None).then(value => { assert.strictEqual(value.length, 1); }); }); @@ -482,11 +488,11 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = (await getOccurrencesAtPosition(model, new EditorPosition(1, 2), CancellationToken.None))!; + const value = (await getOccurrencesAtPosition(languageFeaturesService.documentHighlightProvider, model, new EditorPosition(1, 2), CancellationToken.None))!; assert.strictEqual(value.length, 1); const [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 5 }); - assert.strictEqual(entry.kind, modes.DocumentHighlightKind.Text); + assert.strictEqual(entry.kind, languages.DocumentHighlightKind.Text); }); test('Occurrences, order 1/2', async () => { @@ -503,11 +509,11 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = (await getOccurrencesAtPosition(model, new EditorPosition(1, 2), CancellationToken.None))!; + const value = (await getOccurrencesAtPosition(languageFeaturesService.documentHighlightProvider, model, new EditorPosition(1, 2), CancellationToken.None))!; assert.strictEqual(value.length, 1); const [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 5 }); - assert.strictEqual(entry.kind, modes.DocumentHighlightKind.Text); + assert.strictEqual(entry.kind, languages.DocumentHighlightKind.Text); }); test('Occurrences, order 2/2', async () => { @@ -524,11 +530,11 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = (await getOccurrencesAtPosition(model, new EditorPosition(1, 2), CancellationToken.None))!; + const value = (await getOccurrencesAtPosition(languageFeaturesService.documentHighlightProvider, model, new EditorPosition(1, 2), CancellationToken.None))!; assert.strictEqual(value.length, 1); const [entry] = value; assert.deepStrictEqual(entry.range, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 3 }); - assert.strictEqual(entry.kind, modes.DocumentHighlightKind.Text); + assert.strictEqual(entry.kind, languages.DocumentHighlightKind.Text); }); test('Occurrences, evil provider', async () => { @@ -546,7 +552,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getOccurrencesAtPosition(model, new EditorPosition(1, 2), CancellationToken.None); + const value = await getOccurrencesAtPosition(languageFeaturesService.documentHighlightProvider, model, new EditorPosition(1, 2), CancellationToken.None); assert.strictEqual(value!.length, 1); }); @@ -567,7 +573,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getReferencesAtPosition(model, new EditorPosition(1, 2), false, CancellationToken.None); + let value = await getReferencesAtPosition(languageFeaturesService.referenceProvider, model, new EditorPosition(1, 2), false, CancellationToken.None); assert.strictEqual(value.length, 2); let [first, second] = value; assert.strictEqual(first.uri.path, '/second'); @@ -583,7 +589,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getReferencesAtPosition(model, new EditorPosition(1, 2), false, CancellationToken.None); + let value = await getReferencesAtPosition(languageFeaturesService.referenceProvider, model, new EditorPosition(1, 2), false, CancellationToken.None); assert.strictEqual(value.length, 1); let [item] = value; assert.deepStrictEqual(item.range, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }); @@ -604,7 +610,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await getReferencesAtPosition(model, new EditorPosition(1, 2), false, CancellationToken.None); + const value = await getReferencesAtPosition(languageFeaturesService.referenceProvider, model, new EditorPosition(1, 2), false, CancellationToken.None); assert.strictEqual(value.length, 1); }); @@ -622,7 +628,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const { validActions: actions } = await getCodeActions(model, model.getFullModelRange(), { type: modes.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 2); const [first, second] = actions; assert.strictEqual(first.action.title, 'Testing1'); @@ -646,7 +652,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const { validActions: actions } = await getCodeActions(model, model.getFullModelRange(), { type: modes.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); const [first] = actions; assert.strictEqual(first.action.title, 'Testing1'); @@ -669,7 +675,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const { validActions: actions } = await getCodeActions(model, model.getFullModelRange(), { type: modes.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); }); @@ -687,7 +693,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const { validActions: actions } = await getCodeActions(model, model.getFullModelRange(), { type: modes.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); + const { validActions: actions } = await getCodeActions(languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: languages.CodeActionTriggerType.Invoke }, Progress.None, CancellationToken.None); assert.strictEqual(actions.length, 1); }); @@ -760,7 +766,7 @@ suite('ExtHostLanguageFeatures', function () { await rpcProtocol.sync(); try { - await rename(model, new EditorPosition(1, 1), 'newName'); + await rename(languageFeaturesService.renameProvider, model, new EditorPosition(1, 1), 'newName'); throw Error(); } catch (err) { @@ -777,7 +783,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await rename(model, new EditorPosition(1, 1), 'newName'); + const value = await rename(languageFeaturesService.renameProvider, model, new EditorPosition(1, 1), 'newName'); assert.strictEqual(value.rejectReason, 'evil'); }); @@ -798,7 +804,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await rename(model, new EditorPosition(1, 1), 'newName'); + const value = await rename(languageFeaturesService.renameProvider, model, new EditorPosition(1, 1), 'newName'); assert.strictEqual(value.edits.length, 1); }); @@ -820,7 +826,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = await rename(model, new EditorPosition(1, 1), 'newName'); + const value = await rename(languageFeaturesService.renameProvider, model, new EditorPosition(1, 1), 'newName'); // least relevant rename provider assert.strictEqual(value.edits.length, 2); }); @@ -854,7 +860,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - await rename(model, new EditorPosition(1, 1), 'newName'); + await rename(languageFeaturesService.renameProvider, model, new EditorPosition(1, 1), 'newName'); assert.deepStrictEqual(called, [true, true, true, false]); }); @@ -885,7 +891,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - await rename(model, new EditorPosition(1, 1), 'newName'); + await rename(languageFeaturesService.renameProvider, model, new EditorPosition(1, 1), 'newName'); // first provider has NO prepare which means it is taken by default assert.deepStrictEqual(called, [false, false, true]); @@ -912,7 +918,7 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - const value = await provideSignatureHelp(model, new EditorPosition(1, 1), { triggerKind: modes.SignatureHelpTriggerKind.Invoke, isRetrigger: false }, CancellationToken.None); + const value = await provideSignatureHelp(languageFeaturesService.signatureHelpProvider, model, new EditorPosition(1, 1), { triggerKind: languages.SignatureHelpTriggerKind.Invoke, isRetrigger: false }, CancellationToken.None); assert.ok(value); }); @@ -925,7 +931,7 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - const value = await provideSignatureHelp(model, new EditorPosition(1, 1), { triggerKind: modes.SignatureHelpTriggerKind.Invoke, isRetrigger: false }, CancellationToken.None); + const value = await provideSignatureHelp(languageFeaturesService.signatureHelpProvider, model, new EditorPosition(1, 1), { triggerKind: languages.SignatureHelpTriggerKind.Invoke, isRetrigger: false }, CancellationToken.None); assert.strictEqual(value, undefined); }); @@ -946,7 +952,7 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - const { items } = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); + const { items } = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(languages.CompletionItemKind.Snippet))); assert.strictEqual(items.length, 1); assert.strictEqual(items[0].completion.insertText, 'testing2'); }); @@ -966,7 +972,7 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - const { items } = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); + const { items } = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(languages.CompletionItemKind.Snippet))); assert.strictEqual(items.length, 1); assert.strictEqual(items[0].completion.insertText, 'weak-selector'); }); @@ -986,7 +992,7 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - const { items } = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); + const { items } = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(languages.CompletionItemKind.Snippet))); assert.strictEqual(items.length, 2); assert.strictEqual(items[0].completion.insertText, 'strong-1'); // sort by label assert.strictEqual(items[1].completion.insertText, 'strong-2'); @@ -1008,7 +1014,7 @@ suite('ExtHostLanguageFeatures', function () { await rpcProtocol.sync(); - const { items } = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); + const { items } = await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(languages.CompletionItemKind.Snippet))); assert.strictEqual(items[0].container.incomplete, false); }); @@ -1021,7 +1027,7 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))).then(model => { + await provideSuggestionItems(languageFeaturesService.completionProvider, model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(languages.CompletionItemKind.Snippet))).then(model => { assert.strictEqual(model.items[0].container.incomplete, true); }); }); @@ -1029,7 +1035,7 @@ suite('ExtHostLanguageFeatures', function () { // --- format const NullWorkerService = new class extends mock() { - override computeMoreMinimalEdits(resource: URI, edits: modes.TextEdit[] | null | undefined): Promise { + override computeMoreMinimalEdits(resource: URI, edits: languages.TextEdit[] | null | undefined): Promise { return Promise.resolve(withNullAsUndefined(edits)); } }; @@ -1042,7 +1048,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = (await getDocumentFormattingEditsUntilResult(NullWorkerService, model, { insertSpaces: true, tabSize: 4 }, CancellationToken.None))!; + let value = (await getDocumentFormattingEditsUntilResult(NullWorkerService, languageFeaturesService, model, { insertSpaces: true, tabSize: 4 }, CancellationToken.None))!; assert.strictEqual(value.length, 2); let [first, second] = value; assert.strictEqual(first.text, 'testing'); @@ -1060,7 +1066,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - return getDocumentFormattingEditsUntilResult(NullWorkerService, model, { insertSpaces: true, tabSize: 4 }, CancellationToken.None); + return getDocumentFormattingEditsUntilResult(NullWorkerService, languageFeaturesService, model, { insertSpaces: true, tabSize: 4 }, CancellationToken.None); }); test('Format Doc, order', async () => { @@ -1084,7 +1090,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = (await getDocumentFormattingEditsUntilResult(NullWorkerService, model, { insertSpaces: true, tabSize: 4 }, CancellationToken.None))!; + let value = (await getDocumentFormattingEditsUntilResult(NullWorkerService, languageFeaturesService, model, { insertSpaces: true, tabSize: 4 }, CancellationToken.None))!; assert.strictEqual(value.length, 1); let [first] = value; assert.strictEqual(first.text, 'testing'); @@ -1099,7 +1105,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - const value = (await getDocumentRangeFormattingEditsUntilResult(NullWorkerService, model, new EditorRange(1, 1, 1, 1), { insertSpaces: true, tabSize: 4 }, CancellationToken.None))!; + const value = (await getDocumentRangeFormattingEditsUntilResult(NullWorkerService, languageFeaturesService, model, new EditorRange(1, 1, 1, 1), { insertSpaces: true, tabSize: 4 }, CancellationToken.None))!; assert.strictEqual(value.length, 1); const [first] = value; assert.strictEqual(first.text, 'testing'); @@ -1123,7 +1129,7 @@ suite('ExtHostLanguageFeatures', function () { } })); await rpcProtocol.sync(); - const value = (await getDocumentRangeFormattingEditsUntilResult(NullWorkerService, model, new EditorRange(1, 1, 1, 1), { insertSpaces: true, tabSize: 4 }, CancellationToken.None))!; + const value = (await getDocumentRangeFormattingEditsUntilResult(NullWorkerService, languageFeaturesService, model, new EditorRange(1, 1, 1, 1), { insertSpaces: true, tabSize: 4 }, CancellationToken.None))!; assert.strictEqual(value.length, 1); const [first] = value; assert.strictEqual(first.text, 'range2'); @@ -1141,7 +1147,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - return getDocumentRangeFormattingEditsUntilResult(NullWorkerService, model, new EditorRange(1, 1, 1, 1), { insertSpaces: true, tabSize: 4 }, CancellationToken.None); + return getDocumentRangeFormattingEditsUntilResult(NullWorkerService, languageFeaturesService, model, new EditorRange(1, 1, 1, 1), { insertSpaces: true, tabSize: 4 }, CancellationToken.None); }); test('Format on Type, data conversion', async () => { @@ -1153,7 +1159,7 @@ suite('ExtHostLanguageFeatures', function () { }, [';'])); await rpcProtocol.sync(); - const value = (await getOnTypeFormattingEdits(NullWorkerService, model, new EditorPosition(1, 1), ';', { insertSpaces: true, tabSize: 2 }, CancellationToken.None))!; + const value = (await getOnTypeFormattingEdits(NullWorkerService, languageFeaturesService, model, new EditorPosition(1, 1), ';', { insertSpaces: true, tabSize: 2 }, CancellationToken.None))!; assert.strictEqual(value.length, 1); const [first] = value; assert.strictEqual(first.text, ';'); @@ -1171,7 +1177,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let { links } = await getLinks(model, CancellationToken.None); + let { links } = await getLinks(languageFeaturesService.linkProvider, model, CancellationToken.None); assert.strictEqual(links.length, 1); let [first] = links; assert.strictEqual(first.url?.toString(), 'foo:bar#3'); @@ -1194,7 +1200,7 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let { links } = await getLinks(model, CancellationToken.None); + let { links } = await getLinks(languageFeaturesService.linkProvider, model, CancellationToken.None); assert.strictEqual(links.length, 1); let [first] = links; assert.strictEqual(first.url?.toString(), 'foo:bar#3'); @@ -1207,13 +1213,13 @@ suite('ExtHostLanguageFeatures', function () { provideDocumentColors(): vscode.ColorInformation[] { return [new types.ColorInformation(new types.Range(0, 0, 0, 20), new types.Color(0.1, 0.2, 0.3, 0.4))]; } - provideColorPresentations(color: vscode.Color, context: { range: vscode.Range, document: vscode.TextDocument; }): vscode.ColorPresentation[] { + provideColorPresentations(color: vscode.Color, context: { range: vscode.Range; document: vscode.TextDocument }): vscode.ColorPresentation[] { return []; } })); await rpcProtocol.sync(); - let value = await getColors(model, CancellationToken.None); + let value = await getColors(languageFeaturesService.colorProvider, model, CancellationToken.None); assert.strictEqual(value.length, 1); let [first] = value; assert.deepStrictEqual(first.colorInfo.color, { red: 0.1, green: 0.2, blue: 0.3, alpha: 0.4 }); @@ -1233,7 +1239,7 @@ suite('ExtHostLanguageFeatures', function () { await rpcProtocol.sync(); - provideSelectionRanges(model, [new Position(1, 17)], { selectLeadingAndTrailingWhitespace: true }, CancellationToken.None).then(ranges => { + provideSelectionRanges(languageFeaturesService.selectionRangeProvider, model, [new Position(1, 17)], { selectLeadingAndTrailingWhitespace: true }, CancellationToken.None).then(ranges => { assert.strictEqual(ranges.length, 1); assert.ok(ranges[0].length >= 2); }); diff --git a/src/vs/workbench/test/browser/api/extHostMessagerService.test.ts b/src/vs/workbench/api/test/browser/extHostMessagerService.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/extHostMessagerService.test.ts rename to src/vs/workbench/api/test/browser/extHostMessagerService.test.ts diff --git a/src/vs/workbench/test/browser/api/extHostNotebook.test.ts b/src/vs/workbench/api/test/browser/extHostNotebook.test.ts similarity index 99% rename from src/vs/workbench/test/browser/api/extHostNotebook.test.ts rename to src/vs/workbench/api/test/browser/extHostNotebook.test.ts index f7bc550ce7a..9930ad289b2 100644 --- a/src/vs/workbench/test/browser/api/extHostNotebook.test.ts +++ b/src/vs/workbench/api/test/browser/extHostNotebook.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { TestRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { NullLogService } from 'vs/platform/log/common/log'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts b/src/vs/workbench/api/test/browser/extHostNotebookConcatDocument.test.ts similarity index 98% rename from src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts rename to src/vs/workbench/api/test/browser/extHostNotebookConcatDocument.test.ts index b969649d253..b2bddc7f279 100644 --- a/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts +++ b/src/vs/workbench/api/test/browser/extHostNotebookConcatDocument.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { TestRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import { NullLogService } from 'vs/platform/log/common/log'; @@ -405,7 +405,7 @@ suite('NotebookConcatDocument', function () { assertLines(barLangDoc, 'barLang-document', 'barLang-document2'); }); - function assertOffsetAtPosition(doc: vscode.NotebookConcatTextDocument, offset: number, expected: { line: number, character: number }, reverse = true) { + function assertOffsetAtPosition(doc: vscode.NotebookConcatTextDocument, offset: number, expected: { line: number; character: number }, reverse = true) { const actual = doc.positionAt(offset); assert.strictEqual(actual.line, expected.line); @@ -459,7 +459,7 @@ suite('NotebookConcatDocument', function () { }); - function assertLocationAtPosition(doc: vscode.NotebookConcatTextDocument, pos: { line: number, character: number }, expected: { uri: URI, line: number, character: number }, reverse = true) { + function assertLocationAtPosition(doc: vscode.NotebookConcatTextDocument, pos: { line: number; character: number }, expected: { uri: URI; line: number; character: number }, reverse = true) { const actual = doc.locationAt(new Position(pos.line, pos.character)); assert.strictEqual(actual.uri.toString(), expected.uri.toString()); diff --git a/src/vs/workbench/test/browser/api/extHostNotebookKernel.test.ts b/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts similarity index 91% rename from src/vs/workbench/test/browser/api/extHostNotebookKernel.test.ts rename to src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts index aecd1accc70..4c4bd0a21ce 100644 --- a/src/vs/workbench/test/browser/api/extHostNotebookKernel.test.ts +++ b/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts @@ -6,11 +6,11 @@ import * as assert from 'assert'; import { Barrier } from 'vs/base/common/async'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { URI } from 'vs/base/common/uri'; +import { URI, UriComponents } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { NullLogService } from 'vs/platform/log/common/log'; -import { ICellExecuteUpdateDto, INotebookKernelDto2, MainContext, MainThreadCommandsShape, MainThreadNotebookDocumentsShape, MainThreadNotebookKernelsShape, MainThreadNotebookShape } from 'vs/workbench/api/common/extHost.protocol'; +import { ICellExecuteUpdateDto, ICellExecutionCompleteDto, INotebookKernelDto2, MainContext, MainThreadCommandsShape, MainThreadNotebookDocumentsShape, MainThreadNotebookKernelsShape, MainThreadNotebookShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; @@ -25,7 +25,7 @@ import { CellKind, CellUri, NotebookCellsChangeType } from 'vs/workbench/contrib import { CellExecutionUpdateType } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; -import { TestRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { mock } from 'vs/workbench/test/common/workbenchTestServices'; suite('NotebookKernel', function () { @@ -43,13 +43,17 @@ suite('NotebookKernel', function () { const kernelData = new Map(); const disposables = new DisposableStore(); + const cellExecuteCreate: { notebook: UriComponents; cell: number }[] = []; const cellExecuteUpdates: ICellExecuteUpdateDto[] = []; + const cellExecuteComplete: ICellExecutionCompleteDto[] = []; teardown(function () { disposables.clear(); }); setup(async function () { + cellExecuteCreate.length = 0; cellExecuteUpdates.length = 0; + cellExecuteComplete.length = 0; kernelData.clear(); rpcProtocol = new TestRPCProtocol(); @@ -67,9 +71,15 @@ suite('NotebookKernel', function () { assert.strictEqual(kernelData.has(handle), true); kernelData.set(handle, { ...kernelData.get(handle)!, ...data, }); } - override $updateExecutions(data: SerializableObjectWithBuffers): void { + override $createExecution(handle: number, controllerId: string, uri: UriComponents, cellHandle: number): void { + cellExecuteCreate.push({ notebook: uri, cell: cellHandle }); + } + override $updateExecution(handle: number, data: SerializableObjectWithBuffers): void { cellExecuteUpdates.push(...data.value); } + override $completeExecution(handle: number, data: SerializableObjectWithBuffers): void { + cellExecuteComplete.push(data.value); + } }); rpcProtocol.set(MainContext.MainThreadNotebookDocuments, new class extends mock() { diff --git a/src/vs/workbench/test/browser/api/extHostTesting.test.ts b/src/vs/workbench/api/test/browser/extHostTesting.test.ts similarity index 83% rename from src/vs/workbench/test/browser/api/extHostTesting.test.ts rename to src/vs/workbench/api/test/browser/extHostTesting.test.ts index a5d8dc2bbf9..3a88b6731cb 100644 --- a/src/vs/workbench/test/browser/api/extHostTesting.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTesting.test.ts @@ -15,7 +15,7 @@ import * as convert from 'vs/workbench/api/common/extHostTypeConverters'; import { Location, Position, Range, TestMessage, TestResultState, TestRunProfileKind, TestRunRequest as TestRunRequestImpl, TestTag } from 'vs/workbench/api/common/extHostTypes'; import { TestDiffOpType, TestItemExpandState, TestMessageType } from 'vs/workbench/contrib/testing/common/testCollection'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; -import { TestItemImpl, testStubs } from 'vs/workbench/contrib/testing/common/testStubs'; +import { TestItemImpl, testStubs } from 'vs/workbench/contrib/testing/test/common/testStubs'; import { TestSingleUseCollection } from 'vs/workbench/contrib/testing/test/common/ownedTestCollection'; import type { TestItem, TestRunRequest } from 'vscode'; @@ -78,34 +78,34 @@ suite('ExtHost Testing', () => { const a = single.root.children.get('id-a') as TestItemImpl; const b = single.root.children.get('id-b') as TestItemImpl; assert.deepStrictEqual(single.collectDiff(), [ - [ - TestDiffOpType.Add, - { controllerId: 'ctrlId', parent: null, expand: TestItemExpandState.BusyExpanding, item: { ...convert.TestItem.from(single.root) } } - ], - [ - TestDiffOpType.Add, - { controllerId: 'ctrlId', parent: single.root.id, expand: TestItemExpandState.BusyExpanding, item: { ...convert.TestItem.from(a) } } - ], - [ - TestDiffOpType.Add, - { controllerId: 'ctrlId', parent: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.NotExpandable, item: convert.TestItem.from(a.children.get('id-aa') as TestItemImpl) } - ], - [ - TestDiffOpType.Add, - { controllerId: 'ctrlId', parent: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.NotExpandable, item: convert.TestItem.from(a.children.get('id-ab') as TestItemImpl) } - ], - [ - TestDiffOpType.Update, - { extId: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.Expanded } - ], - [ - TestDiffOpType.Add, - { controllerId: 'ctrlId', parent: single.root.id, expand: TestItemExpandState.NotExpandable, item: convert.TestItem.from(b) } - ], - [ - TestDiffOpType.Update, - { extId: single.root.id, expand: TestItemExpandState.Expanded } - ], + { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrlId', parent: null, expand: TestItemExpandState.BusyExpanding, item: { ...convert.TestItem.from(single.root) } } + }, + { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrlId', parent: single.root.id, expand: TestItemExpandState.BusyExpanding, item: { ...convert.TestItem.from(a) } } + }, + { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrlId', parent: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.NotExpandable, item: convert.TestItem.from(a.children.get('id-aa') as TestItemImpl) } + }, + { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrlId', parent: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.NotExpandable, item: convert.TestItem.from(a.children.get('id-ab') as TestItemImpl) } + }, + { + op: TestDiffOpType.Update, + item: { extId: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.Expanded } + }, + { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrlId', parent: single.root.id, expand: TestItemExpandState.NotExpandable, item: convert.TestItem.from(b) } + }, + { + op: TestDiffOpType.Update, + item: { extId: single.root.id, expand: TestItemExpandState.Expanded } + }, ]); }); @@ -130,9 +130,10 @@ suite('ExtHost Testing', () => { single.root.children.get('id-a')!.description = 'Hello world'; /* item a */ assert.deepStrictEqual(single.collectDiff(), [ - [ - TestDiffOpType.Update, - { extId: new TestId(['ctrlId', 'id-a']).toString(), item: { description: 'Hello world' } }], + { + op: TestDiffOpType.Update, + item: { extId: new TestId(['ctrlId', 'id-a']).toString(), item: { description: 'Hello world' } }, + } ]); }); @@ -142,7 +143,7 @@ suite('ExtHost Testing', () => { single.root.children.delete('id-a'); assert.deepStrictEqual(single.collectDiff(), [ - [TestDiffOpType.Remove, new TestId(['ctrlId', 'id-a']).toString()], + { op: TestDiffOpType.Remove, itemId: new TestId(['ctrlId', 'id-a']).toString() }, ]); assert.deepStrictEqual( [...single.tree.keys()].sort(), @@ -158,12 +159,14 @@ suite('ExtHost Testing', () => { single.root.children.get('id-a')!.children.add(child); assert.deepStrictEqual(single.collectDiff(), [ - [TestDiffOpType.Add, { - controllerId: 'ctrlId', - parent: new TestId(['ctrlId', 'id-a']).toString(), - expand: TestItemExpandState.NotExpandable, - item: convert.TestItem.from(child), - }], + { + op: TestDiffOpType.Add, item: { + controllerId: 'ctrlId', + parent: new TestId(['ctrlId', 'id-a']).toString(), + expand: TestItemExpandState.NotExpandable, + item: convert.TestItem.from(child), + } + }, ]); assert.deepStrictEqual( [...single.tree.values()].map(n => n.actual.id).sort(), @@ -183,31 +186,35 @@ suite('ExtHost Testing', () => { single.root.children.get('id-a')!.children.add(child); assert.deepStrictEqual(single.collectDiff(), [ - [TestDiffOpType.AddTag, { ctrlLabel: 'root', id: 'ctrlId\0tag1' }], - [TestDiffOpType.AddTag, { ctrlLabel: 'root', id: 'ctrlId\0tag2' }], - [TestDiffOpType.Add, { - controllerId: 'ctrlId', - parent: new TestId(['ctrlId', 'id-a']).toString(), - expand: TestItemExpandState.NotExpandable, - item: convert.TestItem.from(child), - }], + { op: TestDiffOpType.AddTag, tag: { ctrlLabel: 'root', id: 'ctrlId\0tag1' } }, + { op: TestDiffOpType.AddTag, tag: { ctrlLabel: 'root', id: 'ctrlId\0tag2' } }, + { + op: TestDiffOpType.Add, item: { + controllerId: 'ctrlId', + parent: new TestId(['ctrlId', 'id-a']).toString(), + expand: TestItemExpandState.NotExpandable, + item: convert.TestItem.from(child), + } + }, ]); child.tags = [tag2, tag3]; assert.deepStrictEqual(single.collectDiff(), [ - [TestDiffOpType.AddTag, { ctrlLabel: 'root', id: 'ctrlId\0tag3' }], - [TestDiffOpType.Update, { - extId: new TestId(['ctrlId', 'id-a', 'id-ac']).toString(), - item: { tags: ['ctrlId\0tag2', 'ctrlId\0tag3'] } - }], - [TestDiffOpType.RemoveTag, 'ctrlId\0tag1'], + { op: TestDiffOpType.AddTag, tag: { ctrlLabel: 'root', id: 'ctrlId\0tag3' } }, + { + op: TestDiffOpType.Update, item: { + extId: new TestId(['ctrlId', 'id-a', 'id-ac']).toString(), + item: { tags: ['ctrlId\0tag2', 'ctrlId\0tag3'] } + } + }, + { op: TestDiffOpType.RemoveTag, id: 'ctrlId\0tag1' }, ]); const a = single.root.children.get('id-a')!; a.tags = [tag2]; a.children.replace([]); - assert.deepStrictEqual(single.collectDiff().filter(t => t[0] === TestDiffOpType.RemoveTag), [ - [TestDiffOpType.RemoveTag, 'ctrlId\0tag3'], + assert.deepStrictEqual(single.collectDiff().filter(t => t.op === TestDiffOpType.RemoveTag), [ + { op: TestDiffOpType.RemoveTag, id: 'ctrlId\0tag3' }, ]); }); @@ -224,18 +231,18 @@ suite('ExtHost Testing', () => { ]); assert.deepStrictEqual(single.collectDiff(), [ - [ - TestDiffOpType.Update, - { extId: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.Expanded, item: { label: 'Hello world' } }, - ], + { + op: TestDiffOpType.Update, + item: { extId: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.Expanded, item: { label: 'Hello world' } }, + }, ]); newA.label = 'still connected'; assert.deepStrictEqual(single.collectDiff(), [ - [ - TestDiffOpType.Update, - { extId: new TestId(['ctrlId', 'id-a']).toString(), item: { label: 'still connected' } } - ], + { + op: TestDiffOpType.Update, + item: { extId: new TestId(['ctrlId', 'id-a']).toString(), item: { label: 'still connected' } } + }, ]); oldA.label = 'no longer connected'; @@ -255,28 +262,28 @@ suite('ExtHost Testing', () => { single.root.children.replace([newA, single.root.children.get('id-b')!]); assert.deepStrictEqual(single.collectDiff(), [ - [ - TestDiffOpType.Update, - { extId: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.Expanded }, - ], - [ - TestDiffOpType.Update, - { extId: TestId.fromExtHostTestItem(oldAB, 'ctrlId').toString(), item: { label: 'Hello world' } }, - ], + { + op: TestDiffOpType.Update, + item: { extId: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.Expanded }, + }, + { + op: TestDiffOpType.Update, + item: { extId: TestId.fromExtHostTestItem(oldAB, 'ctrlId').toString(), item: { label: 'Hello world' } }, + }, ]); oldAA.label = 'still connected1'; newAB.label = 'still connected2'; oldAB.label = 'not connected3'; assert.deepStrictEqual(single.collectDiff(), [ - [ - TestDiffOpType.Update, - { extId: new TestId(['ctrlId', 'id-a', 'id-aa']).toString(), item: { label: 'still connected1' } } - ], - [ - TestDiffOpType.Update, - { extId: new TestId(['ctrlId', 'id-a', 'id-ab']).toString(), item: { label: 'still connected2' } } - ], + { + op: TestDiffOpType.Update, + item: { extId: new TestId(['ctrlId', 'id-a', 'id-aa']).toString(), item: { label: 'still connected1' } } + }, + { + op: TestDiffOpType.Update, + item: { extId: new TestId(['ctrlId', 'id-a', 'id-ab']).toString(), item: { label: 'still connected2' } } + }, ]); assert.strictEqual(newAB.parent, newA); @@ -291,22 +298,22 @@ suite('ExtHost Testing', () => { const a = single.root.children.get('id-a') as TestItemImpl; a.children.add(b); assert.deepStrictEqual(single.collectDiff(), [ - [ - TestDiffOpType.Remove, - new TestId(['ctrlId', 'id-b']).toString(), - ], - [ - TestDiffOpType.Add, - { controllerId: 'ctrlId', parent: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.NotExpandable, item: convert.TestItem.from(b) } - ], + { + op: TestDiffOpType.Remove, + itemId: new TestId(['ctrlId', 'id-b']).toString(), + }, + { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrlId', parent: new TestId(['ctrlId', 'id-a']).toString(), expand: TestItemExpandState.NotExpandable, item: convert.TestItem.from(b) } + }, ]); b.label = 'still connected'; assert.deepStrictEqual(single.collectDiff(), [ - [ - TestDiffOpType.Update, - { extId: new TestId(['ctrlId', 'id-a', 'id-b']).toString(), item: { label: 'still connected' } } - ], + { + op: TestDiffOpType.Update, + item: { extId: new TestId(['ctrlId', 'id-a', 'id-b']).toString(), item: { label: 'still connected' } } + }, ]); assert.deepStrictEqual([...single.root.children], [single.root.children.get('id-a')]); diff --git a/src/vs/workbench/test/browser/api/extHostTextEditor.test.ts b/src/vs/workbench/api/test/browser/extHostTextEditor.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/extHostTextEditor.test.ts rename to src/vs/workbench/api/test/browser/extHostTextEditor.test.ts diff --git a/src/vs/workbench/test/browser/api/extHostTreeViews.test.ts b/src/vs/workbench/api/test/browser/extHostTreeViews.test.ts similarity index 99% rename from src/vs/workbench/test/browser/api/extHostTreeViews.test.ts rename to src/vs/workbench/api/test/browser/extHostTreeViews.test.ts index db66293a7e9..058a03faa02 100644 --- a/src/vs/workbench/test/browser/api/extHostTreeViews.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTreeViews.test.ts @@ -10,7 +10,7 @@ import { ExtHostTreeViews } from 'vs/workbench/api/common/extHostTreeViews'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { MainThreadTreeViewsShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { TreeDataProvider, TreeItem } from 'vscode'; -import { TestRPCProtocol } from './testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -35,7 +35,7 @@ suite('ExtHostTreeView', function () { }); } - override $reveal(treeViewId: string, itemInfo: { item: ITreeItem, parentChain: ITreeItem[] } | undefined, options: IRevealOptions): Promise { + override $reveal(treeViewId: string, itemInfo: { item: ITreeItem; parentChain: ITreeItem[] } | undefined, options: IRevealOptions): Promise { return Promise.resolve(); } diff --git a/src/vs/workbench/test/browser/api/extHostTypeConverter.test.ts b/src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/extHostTypeConverter.test.ts rename to src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts diff --git a/src/vs/workbench/test/browser/api/extHostTypes.test.ts b/src/vs/workbench/api/test/browser/extHostTypes.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/extHostTypes.test.ts rename to src/vs/workbench/api/test/browser/extHostTypes.test.ts diff --git a/src/vs/workbench/test/browser/api/extHostWebview.test.ts b/src/vs/workbench/api/test/browser/extHostWebview.test.ts similarity index 97% rename from src/vs/workbench/test/browser/api/extHostWebview.test.ts rename to src/vs/workbench/api/test/browser/extHostWebview.test.ts index 2a514c5f7fe..d47cfdd98bc 100644 --- a/src/vs/workbench/test/browser/api/extHostWebview.test.ts +++ b/src/vs/workbench/api/test/browser/extHostWebview.test.ts @@ -10,15 +10,15 @@ import { mock } from 'vs/base/test/common/mock'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { NullLogService } from 'vs/platform/log/common/log'; import { MainThreadWebviewManager } from 'vs/workbench/api/browser/mainThreadWebviewManager'; -import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { NullApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ExtHostWebviews } from 'vs/workbench/api/common/extHostWebview'; import { ExtHostWebviewPanels } from 'vs/workbench/api/common/extHostWebviewPanels'; -import { decodeAuthority, webviewResourceBaseHost } from 'vs/workbench/api/common/shared/webview'; +import { decodeAuthority, webviewResourceBaseHost } from 'vs/workbench/common/webview'; import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import type * as vscode from 'vscode'; -import { SingleProxyRPCProtocol } from './testRPCProtocol'; +import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; suite('ExtHostWebview', () => { diff --git a/src/vs/workbench/test/browser/api/extHostWorkspace.test.ts b/src/vs/workbench/api/test/browser/extHostWorkspace.test.ts similarity index 99% rename from src/vs/workbench/test/browser/api/extHostWorkspace.test.ts rename to src/vs/workbench/api/test/browser/extHostWorkspace.test.ts index 983a78c7311..5c05a247db3 100644 --- a/src/vs/workbench/test/browser/api/extHostWorkspace.test.ts +++ b/src/vs/workbench/api/test/browser/extHostWorkspace.test.ts @@ -15,10 +15,10 @@ import { IMainContext, IWorkspaceData, MainContext, ITextSearchComplete } from ' import { RelativePattern } from 'vs/workbench/api/common/extHostTypes'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { mock } from 'vs/base/test/common/mock'; -import { TestRPCProtocol } from './testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { ExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; -import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { ITextQueryBuilderOptions } from 'vs/workbench/services/search/common/queryBuilder'; import { IPatternInfo } from 'vs/workbench/services/search/common/search'; import { isLinux, isWindows } from 'vs/base/common/platform'; import { IExtHostFileSystemInfo } from 'vs/workbench/api/common/extHostFileSystemInfo'; @@ -567,7 +567,7 @@ suite('ExtHostWorkspace', function () { }; } - function asUpdateWorkspaceFolderData(uri: URI, name?: string): { uri: URI, name?: string } { + function asUpdateWorkspaceFolderData(uri: URI, name?: string): { uri: URI; name?: string } { return { uri, name }; } diff --git a/src/vs/workbench/test/browser/api/mainThreadCommands.test.ts b/src/vs/workbench/api/test/browser/mainThreadCommands.test.ts similarity index 97% rename from src/vs/workbench/test/browser/api/mainThreadCommands.test.ts rename to src/vs/workbench/api/test/browser/mainThreadCommands.test.ts index 3b2f85bdaff..fe6133d11ad 100644 --- a/src/vs/workbench/test/browser/api/mainThreadCommands.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadCommands.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; -import { SingleProxyRPCProtocol } from './testRPCProtocol'; +import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { mock } from 'vs/base/test/common/mock'; diff --git a/src/vs/workbench/test/browser/api/mainThreadConfiguration.test.ts b/src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts similarity index 99% rename from src/vs/workbench/test/browser/api/mainThreadConfiguration.test.ts rename to src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts index 23455e4ef1b..c367473c822 100644 --- a/src/vs/workbench/test/browser/api/mainThreadConfiguration.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts @@ -11,7 +11,7 @@ import { Extensions, IConfigurationRegistry, ConfigurationScope } from 'vs/platf import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { MainThreadConfiguration } from 'vs/workbench/api/browser/mainThreadConfiguration'; -import { SingleProxyRPCProtocol } from './testRPCProtocol'; +import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/workbench/test/browser/api/mainThreadDiagnostics.test.ts b/src/vs/workbench/api/test/browser/mainThreadDiagnostics.test.ts similarity index 98% rename from src/vs/workbench/test/browser/api/mainThreadDiagnostics.test.ts rename to src/vs/workbench/api/test/browser/mainThreadDiagnostics.test.ts index c07beb56cab..e30482a8eac 100644 --- a/src/vs/workbench/test/browser/api/mainThreadDiagnostics.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadDiagnostics.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { MarkerService } from 'vs/platform/markers/common/markerService'; import { MainThreadDiagnostics } from 'vs/workbench/api/browser/mainThreadDiagnostics'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { mock } from 'vs/workbench/test/common/workbenchTestServices'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/test/browser/api/mainThreadDocumentContentProviders.test.ts b/src/vs/workbench/api/test/browser/mainThreadDocumentContentProviders.test.ts similarity index 96% rename from src/vs/workbench/test/browser/api/mainThreadDocumentContentProviders.test.ts rename to src/vs/workbench/api/test/browser/mainThreadDocumentContentProviders.test.ts index e7be0a94ee2..bf3ddf7797a 100644 --- a/src/vs/workbench/test/browser/api/mainThreadDocumentContentProviders.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadDocumentContentProviders.test.ts @@ -10,7 +10,7 @@ import { createTextModel } from 'vs/editor/test/common/testTextModel'; import { mock } from 'vs/base/test/common/mock'; import { IModelService } from 'vs/editor/common/services/model'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; -import { TestRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { TextEdit } from 'vs/editor/common/languages'; suite('MainThreadDocumentContentProviders', function () { diff --git a/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts b/src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts similarity index 100% rename from src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts rename to src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts diff --git a/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts similarity index 95% rename from src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts rename to src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts index cd228df490d..cbe44917b29 100644 --- a/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/browser/mainThreadDocumentsAndEditors'; -import { SingleProxyRPCProtocol } from './testRPCProtocol'; +import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelService } from 'vs/editor/common/services/modelService'; import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; @@ -32,6 +32,8 @@ import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/te import { TextModel } from 'vs/editor/common/model/textModel'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; suite('MainThreadDocumentsAndEditors', () => { @@ -61,6 +63,7 @@ suite('MainThreadDocumentsAndEditors', () => { const notificationService = new TestNotificationService(); const undoRedoService = new UndoRedoService(dialogService, notificationService); const themeService = new TestThemeService(); + const logService = new NullLogService(); modelService = new ModelService( configService, new TestTextResourcePropertiesService(configService), @@ -68,7 +71,9 @@ suite('MainThreadDocumentsAndEditors', () => { new NullLogService(), undoRedoService, disposables.add(new LanguageService()), - new TestLanguageConfigurationService() + new TestLanguageConfigurationService(), + new LanguageFeatureDebounceService(logService), + new LanguageFeaturesService() ); codeEditorService = new TestCodeEditorService(themeService); textFileService = new class extends mock() { diff --git a/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts b/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts similarity index 96% rename from src/vs/workbench/test/browser/api/mainThreadEditors.test.ts rename to src/vs/workbench/api/test/browser/mainThreadEditors.test.ts index 5757c84c5d5..4e65fc009ee 100644 --- a/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadEditors.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/browser/mainThreadDocumentsAndEditors'; -import { SingleProxyRPCProtocol, TestRPCProtocol } from './testRPCProtocol'; +import { SingleProxyRPCProtocol, TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelService } from 'vs/editor/common/services/modelService'; import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; @@ -55,6 +55,8 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; import { LanguageService } from 'vs/editor/common/services/languageService'; +import { LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; suite('MainThreadEditors', () => { @@ -83,17 +85,19 @@ suite('MainThreadEditors', () => { const notificationService = new TestNotificationService(); const undoRedoService = new UndoRedoService(dialogService, notificationService); const themeService = new TestThemeService(); + const logService = new NullLogService(); modelService = new ModelService( configService, new TestTextResourcePropertiesService(configService), themeService, - new NullLogService(), + logService, undoRedoService, disposables.add(new LanguageService()), - new TestLanguageConfigurationService() + new TestLanguageConfigurationService(), + new LanguageFeatureDebounceService(logService), + new LanguageFeaturesService() ); - const services = new ServiceCollection(); services.set(IBulkEditService, new SyncDescriptor(BulkEditService)); services.set(ILabelService, new SyncDescriptor(LabelService)); diff --git a/src/vs/workbench/test/browser/api/mainThreadTreeViews.test.ts b/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts similarity index 94% rename from src/vs/workbench/test/browser/api/mainThreadTreeViews.test.ts rename to src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts index 9701933e506..17554ed9ecc 100644 --- a/src/vs/workbench/test/browser/api/mainThreadTreeViews.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { ExtHostTreeViewsShape, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostTreeViewsShape } from 'vs/workbench/api/common/extHost.protocol'; import { mock } from 'vs/base/test/common/mock'; import { ITreeItem, IViewsRegistry, Extensions, ViewContainerLocation, IViewContainersRegistry, ITreeViewDescriptor, ITreeView, ViewContainer, IViewDescriptorService, TreeItemCollapsibleState } from 'vs/workbench/common/views'; import { NullLogService } from 'vs/platform/log/common/log'; @@ -19,6 +19,7 @@ import { ViewDescriptorService } from 'vs/workbench/services/views/browser/viewD import { CustomTreeView } from 'vs/workbench/browser/parts/views/treeView'; import { ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; suite('MainThreadHostTreeView', function () { const testTreeViewId = 'testTreeView'; @@ -73,7 +74,7 @@ suite('MainThreadHostTreeView', function () { } drain(): any { return null; } }, new TestViewsService(), new TestNotificationService(), testExtensionService, new NullLogService()); - mainThreadTreeViews.$registerTreeViewDataProvider(testTreeViewId, { showCollapseAll: false, canSelectMany: false, dragAndDropMimeTypes: [], hasHandleDrag: false }); + mainThreadTreeViews.$registerTreeViewDataProvider(testTreeViewId, { showCollapseAll: false, canSelectMany: false, dropMimeTypes: [], dragMimeTypes: [], hasHandleDrag: false }); await testExtensionService.whenInstalledExtensionsRegistered(); }); diff --git a/src/vs/workbench/test/browser/api/mainThreadWorkspace.test.ts b/src/vs/workbench/api/test/browser/mainThreadWorkspace.test.ts similarity index 98% rename from src/vs/workbench/test/browser/api/mainThreadWorkspace.test.ts rename to src/vs/workbench/api/test/browser/mainThreadWorkspace.test.ts index 39d82eb14b0..565c0dc80ae 100644 --- a/src/vs/workbench/test/browser/api/mainThreadWorkspace.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadWorkspace.test.ts @@ -8,7 +8,7 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { ISearchService, IFileQuery } from 'vs/workbench/services/search/common/search'; import { MainThreadWorkspace } from 'vs/workbench/api/browser/mainThreadWorkspace'; import * as assert from 'assert'; -import { SingleProxyRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { SingleProxyRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; diff --git a/src/vs/workbench/test/browser/api/testRPCProtocol.ts b/src/vs/workbench/api/test/common/testRPCProtocol.ts similarity index 95% rename from src/vs/workbench/test/browser/api/testRPCProtocol.ts rename to src/vs/workbench/api/test/common/testRPCProtocol.ts index 15571671139..52a307debc9 100644 --- a/src/vs/workbench/test/browser/api/testRPCProtocol.ts +++ b/src/vs/workbench/api/test/common/testRPCProtocol.ts @@ -5,7 +5,7 @@ import { Proxied, ProxyIdentifier, SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { CharCode } from 'vs/base/common/charCode'; -import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { isThenable } from 'vs/base/common/async'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; @@ -37,8 +37,8 @@ export class TestRPCProtocol implements IExtHostContext, IExtHostRpcService { private _idle?: Promise; private _completeIdle?: Function; - private readonly _locals: { [id: string]: any; }; - private readonly _proxies: { [id: string]: any; }; + private readonly _locals: { [id: string]: any }; + private readonly _proxies: { [id: string]: any }; constructor() { this._locals = Object.create(null); diff --git a/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts b/src/vs/workbench/api/test/node/extHostSearch.test.ts similarity index 99% rename from src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts rename to src/vs/workbench/api/test/node/extHostSearch.test.ts index da3a8cdc6ed..02bfbb101ee 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts +++ b/src/vs/workbench/api/test/node/extHostSearch.test.ts @@ -22,7 +22,7 @@ import { NativeExtHostSearch } from 'vs/workbench/api/node/extHostSearch'; import { IFileMatch, IFileQuery, IPatternInfo, IRawFileMatch2, ISearchCompleteStats, ISearchQuery, ITextQuery, QueryType, resultIsMatch } from 'vs/workbench/services/search/common/search'; import { TextSearchManager } from 'vs/workbench/services/search/common/textSearchManager'; import { NativeTextSearchManager } from 'vs/workbench/services/search/node/textSearchManager'; -import { TestRPCProtocol } from 'vs/workbench/test/browser/api/testRPCProtocol'; +import { TestRPCProtocol } from 'vs/workbench/api/test/common/testRPCProtocol'; import type * as vscode from 'vscode'; let rpcProtocol: TestRPCProtocol; @@ -78,7 +78,7 @@ suite('ExtHostSearch', () => { await rpcProtocol.sync(); } - async function runFileSearch(query: IFileQuery, cancel = false): Promise<{ results: URI[]; stats: ISearchCompleteStats; }> { + async function runFileSearch(query: IFileQuery, cancel = false): Promise<{ results: URI[]; stats: ISearchCompleteStats }> { let stats: ISearchCompleteStats; try { const cancellation = new CancellationTokenSource(); @@ -103,7 +103,7 @@ suite('ExtHostSearch', () => { }; } - async function runTextSearch(query: ITextQuery): Promise<{ results: IFileMatch[], stats: ISearchCompleteStats; }> { + async function runTextSearch(query: ITextQuery): Promise<{ results: IFileMatch[]; stats: ISearchCompleteStats }> { let stats: ISearchCompleteStats; try { const cancellation = new CancellationTokenSource(); diff --git a/src/vs/workbench/test/node/api/extHostTunnelService.test.ts b/src/vs/workbench/api/test/node/extHostTunnelService.test.ts similarity index 97% rename from src/vs/workbench/test/node/api/extHostTunnelService.test.ts rename to src/vs/workbench/api/test/node/extHostTunnelService.test.ts index 2137f867466..65cdf732d04 100644 --- a/src/vs/workbench/test/node/api/extHostTunnelService.test.ts +++ b/src/vs/workbench/api/test/node/extHostTunnelService.test.ts @@ -112,7 +112,7 @@ const procSockets = lrwx------ 1 alex alex 64 Dec 8 15:22 /proc/4496/fd/3 -> socket:[2331511] lrwx------ 1 alex alex 64 Dec 8 15:22 /proc/4496/fd/31 -> socket:[2338285]`; -const processes: { pid: number, cwd: string, cmd: string }[] = [ +const processes: { pid: number; cwd: string; cmd: string }[] = [ { pid: 230, cwd: '/mnt/c/WINDOWS/system32', @@ -121,7 +121,7 @@ const processes: { pid: number, cwd: string, cmd: string }[] = [ { pid: 2504, cwd: '/mnt/c/Users/alros/AppData/Local/Programs/Microsoft VS Code Insiders', - cmd: '/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/node/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/out/bootstrap-fork--type=extensionHost--uriTransformerPath=/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/out/vs/server/uriTransformer.js--useHostProxy=', + cmd: '/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/node/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/out/bootstrap-fork--type=extensionHost--transformURIs--useHostProxy=', }, { pid: 2515, @@ -185,7 +185,7 @@ const processes: { pid: number, cwd: string, cmd: string }[] = [ { pid: 314, cwd: '/mnt/c/Users/alros/AppData/Local/Programs/Microsoft VS Code Insiders', - cmd: '/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/node/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/out/vs/server/main.js--port=0--use-host-proxy--enable-remote-auto-shutdown--print-ip-address' + cmd: '/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/node/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/out/server-main.js--port=0--use-host-proxy--enable-remote-auto-shutdown--print-ip-address' }, { pid: 3172, @@ -205,7 +205,7 @@ const processes: { pid: number, cwd: string, cmd: string }[] = [ { pid: 4496, cwd: '/mnt/c/Users/alros/AppData/Local/Programs/Microsoft VS Code Insiders', - cmd: '/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/node--inspect-brk=0.0.0.0:6899/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/out/bootstrap-fork--type=extensionHost--uriTransformerPath=/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/out/vs/server/uriTransformer.js--useHostProxy=' + cmd: '/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/node--inspect-brk=0.0.0.0:6899/home/alex/.vscode-server-insiders/bin/bc13785d3dd99b4b0e9da9aed17bb79809a50804/out/bootstrap-fork--type=extensionHost--transformURIs--useHostProxy=' }, { pid: 4507, diff --git a/src/vs/workbench/services/extensions/worker/extensionHostWorker.ts b/src/vs/workbench/api/worker/extensionHostWorker.ts similarity index 90% rename from src/vs/workbench/services/extensions/worker/extensionHostWorker.ts rename to src/vs/workbench/api/worker/extensionHostWorker.ts index 8996ce43e35..f439c2929ff 100644 --- a/src/vs/workbench/services/extensions/worker/extensionHostWorker.ts +++ b/src/vs/workbench/api/worker/extensionHostWorker.ts @@ -6,9 +6,8 @@ import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { VSBuffer } from 'vs/base/common/buffer'; import { Emitter } from 'vs/base/common/event'; -import { isMessageOfType, MessageType, createMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; -import { IInitData } from 'vs/workbench/api/common/extHost.protocol'; -import { ExtensionHostMain } from 'vs/workbench/services/extensions/common/extensionHostMain'; +import { isMessageOfType, MessageType, createMessageOfType, IExtensionHostInitData } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; +import { ExtensionHostMain } from 'vs/workbench/api/common/extensionHostMain'; import { IHostUtils } from 'vs/workbench/api/common/extHostExtensionService'; import { NestedWorker } from 'vs/workbench/services/extensions/worker/polyfillNestedWorker'; import * as path from 'vs/base/common/path'; @@ -31,8 +30,8 @@ declare namespace self { let addEventListener: any; let removeEventListener: any; let dispatchEvent: any; - let indexedDB: { open: any, [k: string]: any }; - let caches: { open: any, [k: string]: any }; + let indexedDB: { open: any;[k: string]: any }; + let caches: { open: any;[k: string]: any }; let importScripts: any; let fetch: _Fetch; let XMLHttpRequest: any; @@ -200,13 +199,13 @@ class ExtensionWorker { interface IRendererConnection { protocol: IMessagePassingProtocol; - initData: IInitData; + initData: IExtensionHostInitData; } function connectToRenderer(protocol: IMessagePassingProtocol): Promise { return new Promise(resolve => { const once = protocol.onMessage(raw => { once.dispose(); - const initData = JSON.parse(raw.toString()); + const initData = JSON.parse(raw.toString()); protocol.send(createMessageOfType(MessageType.Initialized)); resolve({ protocol, initData }); }); @@ -216,12 +215,25 @@ function connectToRenderer(protocol: IMessagePassingProtocol): Promise nativeClose(); +interface IInitMessage { + readonly type: 'vscode.init'; + readonly data: ReadonlyMap; +} + +function isInitMessage(a: any): a is IInitMessage { + return !!a && typeof a === 'object' && a.type === 'vscode.init' && a.data instanceof Map; +} + export function create(): { onmessage: (message: any) => void } { performance.mark(`code/extHost/willConnectToRenderer`); const res = new ExtensionWorker(); return { - onmessage(messagePorts: ReadonlyMap) { + onmessage(message: any) { + if (!isInitMessage(message)) { + return; // silently ignore foreign messages + } + connectToRenderer(res.protocol).then(data => { performance.mark(`code/extHost/didWaitForInitData`); const extHostMain = new ExtensionHostMain( @@ -229,7 +241,7 @@ export function create(): { onmessage: (message: any) => void } { data.initData, hostUtil, null, - messagePorts + message.data ); onTerminate = (reason: string) => extHostMain.terminate(reason); diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index c2d7cd310c6..b39efac8d7c 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -5,22 +5,28 @@ import { localize } from 'vs/nls'; import Severity from 'vs/base/common/severity'; -import { MenuId, MenuRegistry, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; +import { MenuId, MenuRegistry, registerAction2, Action2, ICommandActionTitle } from 'vs/platform/actions/common/actions'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWorkbenchLayoutService, Parts, Position } from 'vs/workbench/services/layout/browser/layoutService'; +import { IWorkbenchLayoutService, Parts, Position, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; -import { isWindows, isLinux, isWeb } from 'vs/base/common/platform'; +import { isWindows, isLinux, isWeb, isMacintosh, isNative } from 'vs/base/common/platform'; import { IsMacNativeContext } from 'vs/platform/contextkey/common/contextkeys'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { InEditorZenModeContext, IsCenteredLayoutContext, EditorAreaVisibleContext } from 'vs/workbench/common/editor'; -import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { SideBarVisibleContext } from 'vs/workbench/common/viewlet'; -import { IViewDescriptorService, IViewsService, FocusedViewContext, ViewContainerLocation, IViewDescriptor, ViewContainerLocationToString } from 'vs/workbench/common/views'; +import { ContextKeyExpr, ContextKeyExpression, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IViewDescriptorService, IViewsService, ViewContainerLocation, IViewDescriptor, ViewContainerLocationToString } from 'vs/workbench/common/views'; import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; +import { ToggleAuxiliaryBarAction } from 'vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions'; +import { TogglePanelAction } from 'vs/workbench/browser/parts/panel/panelActions'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { AuxiliaryBarVisibleContext, PanelAlignmentContext, PanelVisibleContext, SideBarVisibleContext, FocusedViewContext, InEditorZenModeContext, IsCenteredLayoutContext, EditorAreaVisibleContext, IsFullscreenContext } from 'vs/workbench/common/contextkeys'; +import { Codicon } from 'vs/base/common/codicons'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; +import { ThemeIcon } from 'vs/platform/theme/common/themeService'; // --- Close Side Bar @@ -110,6 +116,54 @@ registerAction2(class extends Action2 { } }); +// --- Set Sidebar Position +const sidebarPositionConfigurationKey = 'workbench.sideBar.location'; + +class MoveSidebarPositionAction extends Action2 { + constructor(id: string, title: ICommandActionTitle, private readonly position: Position) { + super({ + id, + title, + f1: false + }); + } + + async run(accessor: ServicesAccessor): Promise { + const layoutService = accessor.get(IWorkbenchLayoutService); + const configurationService = accessor.get(IConfigurationService); + + const position = layoutService.getSideBarPosition(); + if (position !== this.position) { + return configurationService.updateValue(sidebarPositionConfigurationKey, positionToString(this.position)); + } + } +} + +class MoveSidebarRightAction extends MoveSidebarPositionAction { + static readonly ID = 'workbench.action.moveSideBarRight'; + + constructor() { + super(MoveSidebarRightAction.ID, { + value: localize('moveSidebarRight', "Move Side Bar Right"), + original: 'Move Side Bar Right' + }, Position.RIGHT); + } +} + +class MoveSidebarLeftAction extends MoveSidebarPositionAction { + static readonly ID = 'workbench.action.moveSideBarLeft'; + + constructor() { + super(MoveSidebarLeftAction.ID, { + value: localize('moveSidebarLeft', "Move Side Bar Left"), + original: 'Move Side Bar Left' + }, Position.LEFT); + } +} + +registerAction2(MoveSidebarRightAction); +registerAction2(MoveSidebarLeftAction); + // --- Toggle Sidebar Position export class ToggleSidebarPositionAction extends Action2 { @@ -117,8 +171,6 @@ export class ToggleSidebarPositionAction extends Action2 { static readonly ID = 'workbench.action.toggleSidebarPosition'; static readonly LABEL = localize('toggleSidebarPosition', "Toggle Side Bar Position"); - private static readonly sidebarPositionConfigurationKey = 'workbench.sideBar.location'; - static getLabel(layoutService: IWorkbenchLayoutService): string { return layoutService.getSideBarPosition() === Position.LEFT ? localize('moveSidebarRight', "Move Side Bar Right") : localize('moveSidebarLeft', "Move Side Bar Left"); } @@ -139,7 +191,7 @@ export class ToggleSidebarPositionAction extends Action2 { const position = layoutService.getSideBarPosition(); const newPositionValue = (position === Position.LEFT) ? 'right' : 'left'; - return configurationService.updateValue(ToggleSidebarPositionAction.sidebarPositionConfigurationKey, newPositionValue); + return configurationService.updateValue(sidebarPositionConfigurationKey, newPositionValue); } } @@ -441,7 +493,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ // --- Toggle Menu Bar if (isWindows || isLinux || isWeb) { - registerAction2(class extends Action2 { + registerAction2(class ToggleMenubarAction extends Action2 { constructor() { super({ @@ -519,14 +571,15 @@ registerAction2(class extends Action2 { viewId = focusedViewId; } - viewId = await this.getView(quickInputService, viewDescriptorService, paneCompositePartService, viewId!); + try { + viewId = await this.getView(quickInputService, viewDescriptorService, paneCompositePartService, viewId!); + if (!viewId) { + return; + } - if (!viewId) { - return; - } - - const moveFocusedViewAction = new MoveFocusedViewAction(); - instantiationService.invokeFunction(accessor => moveFocusedViewAction.run(accessor, viewId)); + const moveFocusedViewAction = new MoveFocusedViewAction(); + instantiationService.invokeFunction(accessor => moveFocusedViewAction.run(accessor, viewId)); + } catch { } } private getViewItems(viewDescriptorService: IViewDescriptorService, paneCompositePartService: IPaneCompositePartService): Array { @@ -580,6 +633,31 @@ registerAction2(class extends Action2 { }); }); + + const sidePanels = paneCompositePartService.getPinnedPaneCompositeIds(ViewContainerLocation.AuxiliaryBar); + sidePanels.forEach(panel => { + const container = viewDescriptorService.getViewContainerById(panel)!; + const containerModel = viewDescriptorService.getViewContainerModel(container); + + let hasAddedView = false; + containerModel.visibleViewDescriptors.forEach(viewDescriptor => { + if (viewDescriptor.canMoveView) { + if (!hasAddedView) { + results.push({ + type: 'separator', + label: localize('sidePanelContainer', "Side Panel / {0}", containerModel.title) + }); + hasAddedView = true; + } + + results.push({ + id: viewDescriptor.id, + label: viewDescriptor.name + }); + } + }); + }); + return results; } @@ -669,6 +747,13 @@ class MoveFocusedViewAction extends Action2 { }); } + if (!(isViewSolo && currentLocation === ViewContainerLocation.AuxiliaryBar)) { + items.push({ + id: '_.auxiliarybar.newcontainer', + label: localize('moveFocusedView.newContainerInSidePanel', "New Side Panel Entry") + }); + } + items.push({ type: 'separator', label: localize('sidebar', "Side Bar") @@ -711,6 +796,27 @@ class MoveFocusedViewAction extends Action2 { }; })); + items.push({ + type: 'separator', + label: localize('sidePanel', "Side Panel") + }); + + const pinnedAuxPanels = paneCompositePartService.getPinnedPaneCompositeIds(ViewContainerLocation.AuxiliaryBar); + items.push(...pinnedAuxPanels + .filter(panel => { + if (panel === viewDescriptorService.getViewContainerByViewId(focusedViewId)!.id) { + return false; + } + + return !viewDescriptorService.getViewContainerById(panel)!.rejectAddedViews; + }) + .map(panel => { + return { + id: panel, + label: viewDescriptorService.getViewContainerModel(viewDescriptorService.getViewContainerById(panel)!)!.title + }; + })); + quickPick.items = items; quickPick.onDidAccept(() => { @@ -722,6 +828,9 @@ class MoveFocusedViewAction extends Action2 { } else if (destination.id === '_.sidebar.newcontainer') { viewDescriptorService.moveViewToLocation(viewDescriptor!, ViewContainerLocation.Sidebar); viewsService.openView(focusedViewId, true); + } else if (destination.id === '_.auxiliarybar.newcontainer') { + viewDescriptorService.moveViewToLocation(viewDescriptor!, ViewContainerLocation.AuxiliaryBar); + viewsService.openView(focusedViewId, true); } else if (destination.id) { viewDescriptorService.moveViewsToContainer([viewDescriptor], viewDescriptorService.getViewContainerById(destination.id)!); viewsService.openView(focusedViewId, true); @@ -794,6 +903,7 @@ abstract class BaseResizeViewAction extends Action2 { const isEditorFocus = layoutService.hasFocus(Parts.EDITOR_PART); const isSidebarFocus = layoutService.hasFocus(Parts.SIDEBAR_PART); const isPanelFocus = layoutService.hasFocus(Parts.PANEL_PART); + const isAuxiliaryBarFocus = layoutService.hasFocus(Parts.AUXILIARYBAR_PART); if (isSidebarFocus) { part = Parts.SIDEBAR_PART; @@ -801,6 +911,8 @@ abstract class BaseResizeViewAction extends Action2 { part = Parts.PANEL_PART; } else if (isEditorFocus) { part = Parts.EDITOR_PART; + } else if (isAuxiliaryBarFocus) { + part = Parts.AUXILIARYBAR_PART; } } else { part = partToResize; @@ -908,3 +1020,232 @@ registerAction2(IncreaseViewHeightAction); registerAction2(DecreaseViewSizeAction); registerAction2(DecreaseViewWidthAction); registerAction2(DecreaseViewHeightAction); + +const menubarIcon = registerIcon('menuBar', Codicon.layoutMenubar, localize('menuBarIcon', "Represents the menu bar")); +const activityBarLeftIcon = registerIcon('activity-bar-left', Codicon.layoutActivitybarLeft, localize('activityBarLeft', "Represents the activity bar in the left position")); +const activityBarRightIcon = registerIcon('activity-bar-right', Codicon.layoutActivitybarRight, localize('activityBarRight', "Represents the activity bar in the right position")); +const panelLeftIcon = registerIcon('panel-left', Codicon.layoutSidebarLeft, localize('panelLeft', "Represents the side bar or side panel in the left position")); +const panelRightIcon = registerIcon('panel-right', Codicon.layoutSidebarRight, localize('panelRight', "Represents the side bar or side panel in the right position")); +const panelIcon = registerIcon('panel-bottom', Codicon.layoutPanel, localize('panelBottom', "Represents the bottom panel")); +const statusBarIcon = registerIcon('statusBar', Codicon.layoutStatusbar, localize('statusBarIcon', "Represents the status bar")); + +const panelAlignmentLeftIcon = registerIcon('panel-align-left', Codicon.layoutPanelLeft, localize('panelBottomLeft', "Represents the bottom panel alignment set to the left")); +const panelAlignmentRightIcon = registerIcon('panel-align-right', Codicon.layoutPanelRight, localize('panelBottomRight', "Represents the bottom panel alignment set to the right")); +const panelAlignmentCenterIcon = registerIcon('panel-align-center', Codicon.layoutPanelCenter, localize('panelBottomCenter', "Represents the bottom panel alignment set to the center")); +const panelAlignmentJustifyIcon = registerIcon('panel-align-justify', Codicon.layoutPanelJustify, localize('panelBottomJustify', "Represents the bottom panel alignment set to justified")); + +const fullscreenIcon = registerIcon('fullscreen', Codicon.screenFull, localize('fullScreenIcon', "Represents full screen")); +const centerLayoutIcon = registerIcon('centerLayoutIcon', Codicon.layoutCentered, localize('centerLayoutIcon', "Represents centered layout mode")); +const zenModeIcon = registerIcon('zenMode', Codicon.target, localize('zenModeIcon', "Represents zen mode")); + +type ContextualLayoutVisualIcon = { iconA: ThemeIcon; iconB: ThemeIcon; whenA: ContextKeyExpression }; +type LayoutVisualIcon = ThemeIcon | ContextualLayoutVisualIcon; + +function isContextualLayoutVisualIcon(icon: LayoutVisualIcon): icon is ContextualLayoutVisualIcon { + return (icon as ContextualLayoutVisualIcon).iconA !== undefined; +} + +interface CustomizeLayoutItem { + id: string; + active: ContextKeyExpression; + label: string; + activeIcon: Codicon; + visualIcon?: LayoutVisualIcon; + activeAriaLabel: string; + inactiveIcon?: Codicon; + inactiveAriaLabel?: string; + useButtons: boolean; +} + +const CreateToggleLayoutItem = (id: string, active: ContextKeyExpression, label: string, visualIcon?: LayoutVisualIcon): CustomizeLayoutItem => { + return { + id, + active, + label, + visualIcon, + activeIcon: Codicon.eye, + inactiveIcon: Codicon.eyeClosed, + activeAriaLabel: localize('visible', "Visible"), + inactiveAriaLabel: localize('hidden', "Hidden"), + useButtons: true, + }; +}; + +const CreateOptionLayoutItem = (id: string, active: ContextKeyExpression, label: string, visualIcon?: LayoutVisualIcon): CustomizeLayoutItem => { + return { + id, + active, + label, + visualIcon, + activeIcon: Codicon.check, + activeAriaLabel: localize('active', "Active"), + useButtons: false + }; +}; + +const MenuBarToggledContext = ContextKeyExpr.and(IsMacNativeContext.toNegated(), ContextKeyExpr.notEquals('config.window.menuBarVisibility', 'hidden'), ContextKeyExpr.notEquals('config.window.menuBarVisibility', 'toggle'), ContextKeyExpr.notEquals('config.window.menuBarVisibility', 'compact')) as ContextKeyExpression; +const ToggleVisibilityActions: CustomizeLayoutItem[] = []; +if (!isMacintosh || !isNative) { + ToggleVisibilityActions.push(CreateToggleLayoutItem('workbench.action.toggleMenuBar', MenuBarToggledContext, localize('menuBar', "Menu Bar"), menubarIcon)); +} + +ToggleVisibilityActions.push(...[ + CreateToggleLayoutItem(ToggleActivityBarVisibilityAction.ID, ContextKeyExpr.equals('config.workbench.activityBar.visible', true), localize('activityBar', "Activity Bar"), { whenA: ContextKeyExpr.equals('config.workbench.sideBar.location', 'left'), iconA: activityBarLeftIcon, iconB: activityBarRightIcon }), + CreateToggleLayoutItem(ToggleSidebarVisibilityAction.ID, SideBarVisibleContext, localize('sideBar', "Side Bar"), { whenA: ContextKeyExpr.equals('config.workbench.sideBar.location', 'left'), iconA: panelLeftIcon, iconB: panelRightIcon }), + CreateToggleLayoutItem(TogglePanelAction.ID, PanelVisibleContext, localize('panel', "Panel"), panelIcon), + CreateToggleLayoutItem(ToggleAuxiliaryBarAction.ID, AuxiliaryBarVisibleContext, localize('sidePanel', "Side Panel"), { whenA: ContextKeyExpr.equals('config.workbench.sideBar.location', 'left'), iconA: panelRightIcon, iconB: panelLeftIcon }), + CreateToggleLayoutItem(ToggleStatusbarVisibilityAction.ID, ContextKeyExpr.equals('config.workbench.statusBar.visible', true), localize('statusBar', "Status Bar"), statusBarIcon), +]); + +const MoveSideBarActions: CustomizeLayoutItem[] = [ + CreateOptionLayoutItem(MoveSidebarLeftAction.ID, ContextKeyExpr.equals('config.workbench.sideBar.location', 'left'), localize('leftSideBar', "Left"), panelLeftIcon), + CreateOptionLayoutItem(MoveSidebarRightAction.ID, ContextKeyExpr.equals('config.workbench.sideBar.location', 'right'), localize('rightSideBar', "Right"), panelRightIcon), +]; + +const AlignPanelActions: CustomizeLayoutItem[] = [ + CreateOptionLayoutItem('workbench.action.alignPanelLeft', PanelAlignmentContext.isEqualTo('left'), localize('leftPanel', "Left"), panelAlignmentLeftIcon), + CreateOptionLayoutItem('workbench.action.alignPanelRight', PanelAlignmentContext.isEqualTo('right'), localize('rightPanel', "Right"), panelAlignmentRightIcon), + CreateOptionLayoutItem('workbench.action.alignPanelCenter', PanelAlignmentContext.isEqualTo('center'), localize('centerPanel', "Center"), panelAlignmentCenterIcon), + CreateOptionLayoutItem('workbench.action.alignPanelJustify', PanelAlignmentContext.isEqualTo('justify'), localize('justifyPanel', "Justify"), panelAlignmentJustifyIcon), +]; + +const MiscLayoutOptions: CustomizeLayoutItem[] = [ + CreateOptionLayoutItem('workbench.action.toggleFullScreen', IsFullscreenContext, localize('fullscreen', "Full Screen"), fullscreenIcon), + CreateOptionLayoutItem('workbench.action.toggleZenMode', InEditorZenModeContext, localize('zenMode', "Zen Mode"), zenModeIcon), + CreateOptionLayoutItem('workbench.action.toggleCenteredLayout', IsCenteredLayoutContext, localize('centeredLayout', "Centered Layout"), centerLayoutIcon), +]; + +const LayoutContextKeySet = new Set(); +for (const { active } of [...ToggleVisibilityActions, ...MoveSideBarActions, ...AlignPanelActions, ...MiscLayoutOptions]) { + for (const key of active.keys()) { + LayoutContextKeySet.add(key); + } +} + +registerAction2(class CustomizeLayoutAction extends Action2 { + constructor() { + super({ + id: 'workbench.action.customizeLayout', + title: localize('customizeLayout', "Customize Layout..."), + f1: true, + menu: [ + { + id: MenuId.LayoutControlMenu, + group: 'z_end', + } + ] + }); + } + + getItems(contextKeyService: IContextKeyService): (IQuickPickItem | IQuickPickSeparator)[] { + const toQuickPickItem = (item: CustomizeLayoutItem): IQuickPickItem => { + const toggled = item.active.evaluate(contextKeyService.getContext(null)); + let label = item.useButtons ? + item.label : + item.label + (toggled && item.activeIcon ? ` $(${item.activeIcon.id})` : (!toggled && item.inactiveIcon ? ` $(${item.inactiveIcon.id})` : '')); + const ariaLabel = + item.label + (toggled && item.activeAriaLabel ? ` (${item.activeAriaLabel})` : (!toggled && item.inactiveAriaLabel ? ` (${item.inactiveAriaLabel})` : '')); + + if (item.visualIcon) { + let icon = item.visualIcon; + if (isContextualLayoutVisualIcon(icon)) { + const useIconA = icon.whenA.evaluate(contextKeyService.getContext(null)); + icon = useIconA ? icon.iconA : icon.iconB; + } + + label = `$(${icon.id}) ${label}`; + } + + return { + type: 'item', + id: item.id, + label, + ariaLabel, + buttons: !item.useButtons ? undefined : [ + { + alwaysVisible: false, + tooltip: ariaLabel, + iconClass: toggled ? item.activeIcon.classNames : item.inactiveIcon?.classNames + } + ] + }; + }; + return [ + { + type: 'separator', + label: localize('toggleVisibility', "Visibility") + }, + ...ToggleVisibilityActions.map(toQuickPickItem), + { + type: 'separator', + label: localize('sideBarPosition', "Side Bar Position") + }, + ...MoveSideBarActions.map(toQuickPickItem), + { + type: 'separator', + label: localize('panelAlignment', "Panel Alignment") + }, + ...AlignPanelActions.map(toQuickPickItem), + { + type: 'separator', + label: localize('layoutModes', "Modes"), + }, + ...MiscLayoutOptions.map(toQuickPickItem), + ]; + } + + run(accessor: ServicesAccessor): void { + const contextKeyService = accessor.get(IContextKeyService); + const commandService = accessor.get(ICommandService); + const quickInputService = accessor.get(IQuickInputService); + const quickPick = quickInputService.createQuickPick(); + quickPick.items = this.getItems(contextKeyService); + quickPick.ignoreFocusOut = true; + quickPick.hideInput = true; + quickPick.title = localize('customizeLayoutQuickPickTitle', "Customize Layout"); + + quickPick.buttons = [ + { + alwaysVisible: true, + iconClass: Codicon.close.classNames, + tooltip: localize('close', "Close") + } + ]; + + const disposables = new DisposableStore(); + let selectedItem: CustomizeLayoutItem | undefined = undefined; + disposables.add(contextKeyService.onDidChangeContext(changeEvent => { + if (changeEvent.affectsSome(LayoutContextKeySet)) { + quickPick.items = this.getItems(contextKeyService); + if (selectedItem) { + quickPick.activeItems = quickPick.items.filter(item => (item as CustomizeLayoutItem).id === selectedItem?.id) as IQuickPickItem[]; + } + + quickInputService.focus(); + } + })); + + quickPick.onDidAccept(event => { + if (quickPick.selectedItems.length) { + selectedItem = quickPick.selectedItems[0] as CustomizeLayoutItem; + commandService.executeCommand(selectedItem.id); + } + }); + + quickPick.onDidTriggerItemButton(event => { + if (event.item) { + selectedItem = event.item as CustomizeLayoutItem; + commandService.executeCommand(selectedItem.id); + } + }); + + // Only one button, close + quickPick.onDidTriggerButton(() => { + quickPick.hide(); + }); + + quickPick.onDispose(() => disposables.dispose()); + + quickPick.show(); + } +}); diff --git a/src/vs/workbench/browser/actions/navigationActions.ts b/src/vs/workbench/browser/actions/navigationActions.ts index d963f97c00d..86fca131e3f 100644 --- a/src/vs/workbench/browser/actions/navigationActions.ts +++ b/src/vs/workbench/browser/actions/navigationActions.ts @@ -35,6 +35,7 @@ abstract class BaseNavigationAction extends Action { const isEditorFocus = this.layoutService.hasFocus(Parts.EDITOR_PART); const isPanelFocus = this.layoutService.hasFocus(Parts.PANEL_PART); const isSidebarFocus = this.layoutService.hasFocus(Parts.SIDEBAR_PART); + const isAuxiliaryBarFocus = this.layoutService.hasFocus(Parts.AUXILIARYBAR_PART); let neighborPart: Parts | undefined; if (isEditorFocus) { @@ -54,6 +55,10 @@ abstract class BaseNavigationAction extends Action { neighborPart = this.layoutService.getVisibleNeighborPart(Parts.SIDEBAR_PART, this.direction); } + if (isAuxiliaryBarFocus) { + neighborPart = neighborPart = this.layoutService.getVisibleNeighborPart(Parts.AUXILIARYBAR_PART, this.direction); + } + if (neighborPart === Parts.EDITOR_PART) { if (!this.navigateBackToEditorGroup(this.toGroupDirection(this.direction))) { this.navigateToEditorGroup(this.direction === Direction.Right ? GroupLocation.FIRST : GroupLocation.LAST); @@ -62,6 +67,8 @@ abstract class BaseNavigationAction extends Action { this.navigateToSidebar(); } else if (neighborPart === Parts.PANEL_PART) { this.navigateToPanel(); + } else if (neighborPart === Parts.AUXILIARYBAR_PART) { + this.navigateToAuxiliaryBar(); } } @@ -100,6 +107,26 @@ abstract class BaseNavigationAction extends Action { return !!viewlet; } + private async navigateToAuxiliaryBar(): Promise { + if (!this.layoutService.isVisible(Parts.AUXILIARYBAR_PART)) { + return false; + } + + const activePanel = this.paneCompositeService.getActivePaneComposite(ViewContainerLocation.AuxiliaryBar); + if (!activePanel) { + return false; + } + + const activePanelId = activePanel.getId(); + + const res = await this.paneCompositeService.openPaneComposite(activePanelId, ViewContainerLocation.AuxiliaryBar, true); + if (!res) { + return false; + } + + return res; + } + private navigateAcrossEditorGroup(direction: GroupDirection): boolean { return this.doNavigateToEditorGroup({ direction }); } diff --git a/src/vs/workbench/browser/actions/windowActions.ts b/src/vs/workbench/browser/actions/windowActions.ts index c70953f97e4..cfa947c598c 100644 --- a/src/vs/workbench/browser/actions/windowActions.ts +++ b/src/vs/workbench/browser/actions/windowActions.ts @@ -8,17 +8,17 @@ import { IWindowOpenable } from 'vs/platform/windows/common/windows'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { MenuRegistry, MenuId, Action2, registerAction2, IAction2Options } from 'vs/platform/actions/common/actions'; import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { IsFullscreenContext } from 'vs/workbench/browser/contextkeys'; +import { IsFullscreenContext } from 'vs/workbench/common/contextkeys'; import { IsMacNativeContext, IsDevelopmentContext, IsWebContext, IsIOSContext } from 'vs/platform/contextkey/common/contextkeys'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IQuickInputButton, IQuickInputService, IQuickPickSeparator, IKeyMods, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { ILabelService } from 'vs/platform/label/common/label'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { IRecent, isRecentFolder, isRecentWorkspace, IWorkspacesService, IWorkspaceIdentifier, isFolderBackupInfo, isWorkspaceBackupInfo } from 'vs/platform/workspaces/common/workspaces'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { IRecent, isRecentFolder, isRecentWorkspace, IWorkspacesService, isFolderBackupInfo, isWorkspaceBackupInfo } from 'vs/platform/workspaces/common/workspaces'; import { URI } from 'vs/base/common/uri'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { FileKind } from 'vs/platform/files/common/files'; @@ -37,7 +37,7 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation export const inRecentFilesPickerContextKey = 'inRecentFilesPicker'; interface IRecentlyOpenedPick extends IQuickPickItem { - resource: URI, + resource: URI; openable: IWindowOpenable; remoteAuthority: string | undefined; } diff --git a/src/vs/workbench/browser/actions/workspaceActions.ts b/src/vs/workbench/browser/actions/workspaceActions.ts index 569fb24ec17..5bbdf9eba37 100644 --- a/src/vs/workbench/browser/actions/workspaceActions.ts +++ b/src/vs/workbench/browser/actions/workspaceActions.ts @@ -5,20 +5,20 @@ import { localize } from 'vs/nls'; import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; -import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, hasWorkspaceFileExtension } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { ADD_ROOT_FOLDER_COMMAND_ID, ADD_ROOT_FOLDER_LABEL, PICK_WORKSPACE_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { MenuRegistry, MenuId, Action2, registerAction2, ILocalizedString } from 'vs/platform/actions/common/actions'; -import { EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, OpenFolderWorkspaceSupportContext, WorkbenchStateContext, WorkspaceFolderCountContext } from 'vs/workbench/browser/contextkeys'; +import { EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, OpenFolderWorkspaceSupportContext, WorkbenchStateContext, WorkspaceFolderCountContext } from 'vs/workbench/common/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { IWorkspacesService, hasWorkspaceFileExtension } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IsMacNativeContext } from 'vs/platform/contextkey/common/contextkeys'; @@ -324,6 +324,19 @@ MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { when: OpenFolderWorkspaceSupportContext }); +MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { + group: '2_open', + command: { + // When we do not support opening folders/workspaces + // but we are in a workspace context, we add a + // "Open Folder" action that adds the folder as workspace + id: AddRootFolderAction.ID, + title: localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder...") + }, + order: 2, + when: ContextKeyExpr.and(OpenFolderWorkspaceSupportContext.toNegated(), WorkbenchStateContext.isEqualTo('workspace')) +}); + MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { group: '2_open', command: { diff --git a/src/vs/workbench/browser/actions/workspaceCommands.ts b/src/vs/workbench/browser/actions/workspaceCommands.ts index be9a6ff6c0b..a3f6d422ce0 100644 --- a/src/vs/workbench/browser/actions/workspaceCommands.ts +++ b/src/vs/workbench/browser/actions/workspaceCommands.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { hasWorkspaceFileExtension, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { dirname, removeTrailingPathSeparator } from 'vs/base/common/resources'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -16,12 +16,12 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IQuickInputService, IPickOptions, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IFileDialogService, IPickAndOpenOptions } from 'vs/platform/dialogs/common/dialogs'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { IOpenEmptyWindowOptions, IOpenWindowOptions, IWindowOpenable } from 'vs/platform/windows/common/windows'; -import { hasWorkspaceFileExtension, IRecent, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { IRecent, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { ILocalizedString } from 'vs/platform/actions/common/actions'; diff --git a/src/vs/workbench/browser/codeeditor.ts b/src/vs/workbench/browser/codeeditor.ts index 9738fc2a492..bb0e244ca06 100644 --- a/src/vs/workbench/browser/codeeditor.ts +++ b/src/vs/workbench/browser/codeeditor.ts @@ -13,8 +13,7 @@ import { attachStylerCallback } from 'vs/platform/theme/common/styler'; import { buttonBackground, buttonForeground, editorBackground, editorForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { hasWorkspaceFileExtension } from 'vs/platform/workspaces/common/workspaces'; +import { hasWorkspaceFileExtension, IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; @@ -23,7 +22,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IRange } from 'vs/editor/common/core/range'; -import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/cursorEvents'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { TrackedRangeStickiness, IModelDecorationsChangeAccessor } from 'vs/editor/common/model'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; diff --git a/src/vs/workbench/browser/composite.ts b/src/vs/workbench/browser/composite.ts index 2239c0b9793..d5e691faaf9 100644 --- a/src/vs/workbench/browser/composite.ts +++ b/src/vs/workbench/browser/composite.ts @@ -9,7 +9,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; 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 { IConstructorSignature0, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IConstructorSignature, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { trackFocus, Dimension } from 'vs/base/browser/dom'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -43,9 +43,7 @@ export abstract class Composite extends Component implements IComposite { } protected fireOnDidFocus(): void { - if (this._onDidFocus) { - this._onDidFocus.fire(); - } + this._onDidFocus?.fire(); } private _onDidBlur: Emitter | undefined; @@ -62,19 +60,21 @@ export abstract class Composite extends Component implements IComposite { return this._hasFocus; } - private registerFocusTrackEvents(): { onDidFocus: Emitter, onDidBlur: Emitter } { + private registerFocusTrackEvents(): { onDidFocus: Emitter; onDidBlur: Emitter } { const container = assertIsDefined(this.getContainer()); const focusTracker = this._register(trackFocus(container)); const onDidFocus = this._onDidFocus = this._register(new Emitter()); this._register(focusTracker.onDidFocus(() => { this._hasFocus = true; + onDidFocus.fire(); })); const onDidBlur = this._onDidBlur = this._register(new Emitter()); this._register(focusTracker.onDidBlur(() => { this._hasFocus = false; + onDidBlur.fire(); })); @@ -243,7 +243,7 @@ export abstract class Composite extends Component implements IComposite { export abstract class CompositeDescriptor { constructor( - private readonly ctor: IConstructorSignature0, + private readonly ctor: IConstructorSignature, readonly id: string, readonly name: string, readonly cssClass?: string, diff --git a/src/vs/workbench/browser/contextkeys.ts b/src/vs/workbench/browser/contextkeys.ts index 878df5e5db6..df9b2c329d5 100644 --- a/src/vs/workbench/browser/contextkeys.ts +++ b/src/vs/workbench/browser/contextkeys.ts @@ -3,45 +3,27 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { localize } from 'vs/nls'; import { Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IContextKeyService, IContextKey, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { InputFocusedContext, IsMacContext, IsLinuxContext, IsWindowsContext, IsWebContext, IsMacNativeContext, IsDevelopmentContext, IsIOSContext } from 'vs/platform/contextkey/common/contextkeys'; -import { ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, TEXT_DIFF_EDITOR_ID, SplitEditorsVertically, InEditorZenModeContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, EditorInputCapabilities, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, SIDE_BY_SIDE_EDITOR_ID, DEFAULT_EDITOR_ASSOCIATION } from 'vs/workbench/common/editor'; -import { trackFocus, addDisposableListener, EventType, WebFileSystemAccess } from 'vs/base/browser/dom'; +import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext } from 'vs/workbench/common/contextkeys'; +import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, DEFAULT_EDITOR_ASSOCIATION } from 'vs/workbench/common/editor'; +import { trackFocus, addDisposableListener, EventType } from 'vs/base/browser/dom'; import { preferredSideBySideGroupDirection, GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { WorkbenchState, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { SideBarVisibleContext } from 'vs/workbench/common/viewlet'; -import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; -import { PanelMaximizedContext, PanelVisibleContext } from 'vs/workbench/common/panel'; -import { getRemoteName, getVirtualWorkspaceScheme } from 'vs/platform/remote/common/remoteHosts'; +import { IWorkbenchLayoutService, Parts, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; +import { getRemoteName } from 'vs/platform/remote/common/remoteHosts'; +import { getVirtualWorkspaceScheme } from 'vs/platform/workspace/common/virtualWorkspace'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { isNative } from 'vs/base/common/platform'; import { IEditorResolverService } from 'vs/workbench/services/editor/common/editorResolverService'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { Schemas } from 'vs/base/common/network'; -import { AuxiliaryBarVisibleContext } from 'vs/workbench/common/auxiliarybar'; - -export const WorkbenchStateContext = new RawContextKey('workbenchState', undefined, { type: 'string', description: localize('workbenchState', "The kind of workspace opened in the window, either 'empty' (no workspace), 'folder' (single folder) or 'workspace' (multi-root workspace)") }); -export const WorkspaceFolderCountContext = new RawContextKey('workspaceFolderCount', 0, localize('workspaceFolderCount', "The number of root folders in the workspace")); - -export const OpenFolderWorkspaceSupportContext = new RawContextKey('openFolderWorkspaceSupport', true, true); -export const EnterMultiRootWorkspaceSupportContext = new RawContextKey('enterMultiRootWorkspaceSupport', true, true); -export const EmptyWorkspaceSupportContext = new RawContextKey('emptyWorkspaceSupport', true, true); - -export const DirtyWorkingCopiesContext = new RawContextKey('dirtyWorkingCopies', false, localize('dirtyWorkingCopies', "Whether there are any working copies with unsaved changes")); - -export const RemoteNameContext = new RawContextKey('remoteName', '', localize('remoteName', "The name of the remote the window is connected to or an empty string if not connected to any remote")); -export const VirtualWorkspaceContext = new RawContextKey('virtualWorkspace', '', localize('virtualWorkspace', "The scheme of the current workspace if is from a virtual file system or an empty string.")); - -export const IsFullscreenContext = new RawContextKey('isFullscreen', false, localize('isFullscreen', "Whether the window is in fullscreen mode")); - -// Support for FileSystemAccess web APIs (https://wicg.github.io/file-system-access) -export const HasWebFileSystemAccess = new RawContextKey('hasWebFileSystemAccess', false, true); +import { WebFileSystemAccess } from 'vs/platform/files/browser/webFileSystemAccess'; export class WorkbenchContextKeysHandler extends Disposable { private inputFocusedContext: IContextKey; @@ -82,7 +64,9 @@ export class WorkbenchContextKeysHandler extends Disposable { private isCenteredLayoutContext: IContextKey; private sideBarVisibleContext: IContextKey; private editorAreaVisibleContext: IContextKey; + private panelPositionContext: IContextKey; private panelVisibleContext: IContextKey; + private panelAlignmentContext: IContextKey; private panelMaximizedContext: IContextKey; private auxiliaryBarVisibleContext: IContextKey; private editorTabsVisibleContext: IContextKey; @@ -197,10 +181,14 @@ export class WorkbenchContextKeysHandler extends Disposable { this.sideBarVisibleContext = SideBarVisibleContext.bindTo(this.contextKeyService); // Panel + this.panelPositionContext = PanelPositionContext.bindTo(this.contextKeyService); + this.panelPositionContext.set(positionToString(this.layoutService.getPanelPosition())); this.panelVisibleContext = PanelVisibleContext.bindTo(this.contextKeyService); this.panelVisibleContext.set(this.layoutService.isVisible(Parts.PANEL_PART)); this.panelMaximizedContext = PanelMaximizedContext.bindTo(this.contextKeyService); this.panelMaximizedContext.set(this.layoutService.isPanelMaximized()); + this.panelAlignmentContext = PanelAlignmentContext.bindTo(this.contextKeyService); + this.panelAlignmentContext.set(this.layoutService.getPanelAlignment()); // Auxiliary Bar this.auxiliaryBarVisibleContext = AuxiliaryBarVisibleContext.bindTo(this.contextKeyService); @@ -244,6 +232,9 @@ export class WorkbenchContextKeysHandler extends Disposable { this._register(this.layoutService.onDidChangeZenMode(enabled => this.inZenModeContext.set(enabled))); this._register(this.layoutService.onDidChangeFullscreen(fullscreen => this.isFullscreenContext.set(fullscreen))); this._register(this.layoutService.onDidChangeCenteredLayout(centered => this.isCenteredLayoutContext.set(centered))); + this._register(this.layoutService.onDidChangePanelPosition(position => this.panelPositionContext.set(position))); + + this._register(this.layoutService.onDidChangePanelAlignment(alignment => this.panelAlignmentContext.set(alignment))); this._register(this.paneCompositeService.onDidPaneCompositeClose(() => this.updateSideBarContextKeys())); this._register(this.paneCompositeService.onDidPaneCompositeOpen(() => this.updateSideBarContextKeys())); diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index bb7117b98cd..7b0dbc38972 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { VSBuffer } from 'vs/base/common/buffer'; import Severity from 'vs/base/common/severity'; -import { hasWorkspaceFileExtension, IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { basename, isEqual } from 'vs/base/common/resources'; import { ByteSize, IFileService } from 'vs/platform/files/common/files'; import { IWindowOpenable } from 'vs/platform/windows/common/windows'; @@ -19,7 +19,7 @@ import { DataTransfers, IDragAndDropData } from 'vs/base/browser/dnd'; import { DragMouseEvent } from 'vs/base/browser/mouseEvent'; import { Mimes } from 'vs/base/common/mime'; import { isWindows } from 'vs/base/common/platform'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IEditorIdentifier, GroupIdentifier, isEditorIdentifier } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -31,8 +31,13 @@ import { Emitter } from 'vs/base/common/event'; import { coalesce } from 'vs/base/common/arrays'; import { parse, stringify } from 'vs/base/common/marshalling'; import { ILabelService } from 'vs/platform/label/common/label'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { hasWorkspaceFileExtension, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { withNullAsUndefined } from 'vs/base/common/types'; +import { ITreeDataTransfer } from 'vs/workbench/common/views'; +import { selectionFragment } from 'vs/platform/opener/common/opener'; +import { IListDragAndDrop } from 'vs/base/browser/ui/list/list'; +import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; +import { ITreeDragOverReaction } from 'vs/base/browser/ui/tree/tree'; //#region Editor / Resources DND @@ -46,6 +51,11 @@ export class DraggedEditorGroupIdentifier { constructor(readonly identifier: GroupIdentifier) { } } +export class DraggedTreeItemsIdentifier { + + constructor(readonly identifier: string) { } +} + export const CodeDataTransfers = { EDITORS: 'CodeEditors', FILES: 'CodeFiles' @@ -74,14 +84,7 @@ export function extractEditorsDropData(e: DragEvent): Array 0) { // mitigate https://github.com/microsoft/vscode/issues/124946 - editors.push({ resource: URI.parse(resourceRaw) }); - } - } - } + editors.push(...createDraggedEditorInputFromRawResourcesData(rawResourcesData)); } catch (error) { // Invalid transfer } @@ -127,6 +130,45 @@ export function extractEditorsDropData(e: DragEvent): Array 0) { // mitigate https://github.com/microsoft/vscode/issues/124946 + const resource = URI.parse(resourceRaw); + editors.push({ + resource, + options: { + selection: selectionFragment(resource) + } + }); + } + } + } + + return editors; +} + +export async function extractTreeDropData(dataTransfer: ITreeDataTransfer): Promise> { + const editors: IDraggedResourceEditorInput[] = []; + const resourcesKey = DataTransfers.RESOURCES.toLowerCase(); + + // Data Transfer: Resources + if (dataTransfer.has(resourcesKey)) { + try { + const rawResourcesData = await dataTransfer.get(resourcesKey)?.asString(); + editors.push(...createDraggedEditorInputFromRawResourcesData(rawResourcesData)); + } catch (error) { + // Invalid transfer + } + } + return editors; } @@ -364,7 +406,8 @@ export function fillEditorsDragData(accessor: ServicesAccessor, resourcesOrEdito if (isEditorIdentifier(resourceOrEditor)) { editor = resourceOrEditor.editor.toUntyped({ preserveViewState: resourceOrEditor.groupId }); } else if (URI.isUri(resourceOrEditor)) { - editor = { resource: resourceOrEditor }; + const selection = selectionFragment(resourceOrEditor); + editor = { resource: resourceOrEditor, options: selection ? { selection } : undefined }; } else if (!resourceOrEditor.isDirectory) { editor = { resource: resourceOrEditor.resource }; } @@ -730,7 +773,7 @@ export class CompositeDragAndDropObserver extends Disposable { return this._register(disposableStore); } - registerDraggable(element: HTMLElement, draggedItemProvider: () => { type: ViewType, id: string }, callbacks: ICompositeDragAndDropObserverCallbacks): IDisposable { + registerDraggable(element: HTMLElement, draggedItemProvider: () => { type: ViewType; id: string }, callbacks: ICompositeDragAndDropObserverCallbacks): IDisposable { element.draggable = true; const disposableStore = new DisposableStore(); @@ -825,4 +868,41 @@ export function toggleDropEffect(dataTransfer: DataTransfer | null, dropEffect: dataTransfer.dropEffect = shouldHaveIt ? dropEffect : 'none'; } +export class ResourceListDnDHandler implements IListDragAndDrop { + constructor( + private readonly toResource: (e: T) => URI | null, + @IInstantiationService private readonly instantiationService: IInstantiationService + ) { } + + getDragURI(element: T): string | null { + const resource = this.toResource(element); + return resource ? resource.toString() : null; + } + + getDragLabel(elements: T[]): string | undefined { + const resources = coalesce(elements.map(this.toResource)); + return resources.length === 1 ? basename(resources[0]) : resources.length > 1 ? String(resources.length) : undefined; + } + + onDragStart(data: IDragAndDropData, originalEvent: DragEvent): void { + const resources: URI[] = []; + for (const element of (data as ElementsDragAndDropData).elements) { + const resource = this.toResource(element); + if (resource) { + resources.push(resource); + } + } + if (resources.length) { + // Apply some datatransfer types to allow for dragging the element outside of the application + this.instantiationService.invokeFunction(accessor => fillEditorsDragData(accessor, resources, originalEvent)); + } + } + + onDragOver(data: IDragAndDropData, targetElement: T, targetIndex: number, originalEvent: DragEvent): boolean | ITreeDragOverReaction { + return false; + } + + drop(data: IDragAndDropData, targetElement: T, targetIndex: number, originalEvent: DragEvent): void { } +} + //#endregion diff --git a/src/vs/workbench/browser/editor.ts b/src/vs/workbench/browser/editor.ts index 59d57883a1f..10c2190c88a 100644 --- a/src/vs/workbench/browser/editor.ts +++ b/src/vs/workbench/browser/editor.ts @@ -9,7 +9,7 @@ import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; -import { IConstructorSignature0, IInstantiationService, BrandedService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IConstructorSignature, IInstantiationService, BrandedService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { insert } from 'vs/base/common/arrays'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { Promises } from 'vs/base/common/async'; @@ -17,6 +17,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { URI } from 'vs/base/common/uri'; +import { Schemas } from 'vs/base/common/network'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; //#region Editor Pane Registry @@ -53,11 +54,11 @@ export class EditorPaneDescriptor implements IEditorPaneDescriptor { typeId: string, name: string ): EditorPaneDescriptor { - return new EditorPaneDescriptor(ctor as IConstructorSignature0, typeId, name); + return new EditorPaneDescriptor(ctor as IConstructorSignature, typeId, name); } private constructor( - private readonly ctor: IConstructorSignature0, + private readonly ctor: IConstructorSignature, readonly typeId: string, readonly name: string ) { } @@ -199,11 +200,29 @@ export function whenEditorClosed(accessor: ServicesAccessor, resources: URI[]): // Remove from resources to wait for being closed based on the // resources from editors that got closed remainingResources = remainingResources.filter(resource => { + + // Closing editor matches resource directly: remove from remaining if (uriIdentityService.extUri.isEqual(resource, primaryResource) || uriIdentityService.extUri.isEqual(resource, secondaryResource)) { - return false; // remove - the closing editor matches this resource + return false; } - return true; // keep - not yet closed + // Closing editor is untitled with associated resource + // that matches resource directly: remove from remaining + // but only if the editor was not replaced, otherwise + // saving an untitled with associated resource would + // release the `--wait` call. + // (see https://github.com/microsoft/vscode/issues/141237) + if (event.context !== EditorCloseContext.REPLACE) { + if ( + (primaryResource?.scheme === Schemas.untitled && uriIdentityService.extUri.isEqual(resource, primaryResource.with({ scheme: resource.scheme }))) || + (secondaryResource?.scheme === Schemas.untitled && uriIdentityService.extUri.isEqual(resource, secondaryResource.with({ scheme: resource.scheme }))) + ) { + return false; + } + } + + // Editor is not yet closed, so keep it in waiting mode + return true; }); // All resources to wait for being closed are closed diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index d8b42c1c39b..e0b778dd82f 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -6,7 +6,7 @@ import { URI } from 'vs/base/common/uri'; import { dirname, isEqual, basenameOrAuthority } from 'vs/base/common/resources'; import { IconLabel, IIconLabelValueOptions, IIconLabelCreationOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IModelService } from 'vs/editor/common/services/model'; @@ -24,7 +24,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { normalizeDriveLetter } from 'vs/base/common/labels'; export interface IResourceLabelProps { - resource?: URI | { primary?: URI, secondary?: URI }; + resource?: URI | { primary?: URI; secondary?: URI }; name?: string | string[]; description?: string; } @@ -51,7 +51,7 @@ export interface IResourceLabelOptions extends IIconLabelValueOptions { /** * File decorations to use for the label. */ - readonly fileDecorations?: { colors: boolean, badges: boolean }; + readonly fileDecorations?: { colors: boolean; badges: boolean }; /** * Will take the provided label as is and e.g. not override it for untitled files. @@ -492,7 +492,7 @@ class ResourceLabelWidget extends IconLabel { this.setLabel(''); } - private render(options: { updateIcon: boolean, updateDecoration: boolean }): boolean { + private render(options: { updateIcon: boolean; updateDecoration: boolean }): boolean { if (this.isHidden) { if (this.needsRedraw !== Redraw.Full) { this.needsRedraw = (options.updateIcon || options.updateDecoration) ? Redraw.Full : Redraw.Basic; @@ -525,12 +525,23 @@ class ResourceLabelWidget extends IconLabel { if (this.options?.title !== undefined) { iconLabelOptions.title = this.options.title; - } else if (resource && resource.scheme !== Schemas.data /* do not accidentally inline Data URIs */) { + } + + if (resource && resource.scheme !== Schemas.data /* do not accidentally inline Data URIs */ + && ( + (!this.options?.title) + || ((typeof this.options.title !== 'string') && !this.options.title.markdownNotSupportedFallback) + )) { + if (!this.computedPathLabel) { this.computedPathLabel = this.labelService.getUriLabel(resource); } - iconLabelOptions.title = this.computedPathLabel; + if (!iconLabelOptions.title || (typeof iconLabelOptions.title === 'string')) { + iconLabelOptions.title = this.computedPathLabel; + } else if (!iconLabelOptions.title.markdownNotSupportedFallback) { + iconLabelOptions.title.markdownNotSupportedFallback = this.computedPathLabel; + } } if (this.options && !this.options.hideIcon) { diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 6f46aeaa46c..ec3d442dc52 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -13,7 +13,7 @@ import { IUntypedEditorInput, pathsToEditors } from 'vs/workbench/common/editor' import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; import { SidebarPart } from 'vs/workbench/browser/parts/sidebar/sidebarPart'; import { PanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; -import { Position, Parts, PanelOpensMaximizedOptions, IWorkbenchLayoutService, positionToString, panelOpensMaximizedFromString, PanelAlignment } from 'vs/workbench/services/layout/browser/layoutService'; +import { Position, Parts, PanelOpensMaximizedOptions, IWorkbenchLayoutService, positionFromString, positionToString, panelOpensMaximizedFromString, PanelAlignment } from 'vs/workbench/services/layout/browser/layoutService'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IStorageService, StorageScope, WillSaveStateReason } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -23,7 +23,7 @@ import { StartupKind, ILifecycleService } from 'vs/workbench/services/lifecycle/ import { getTitleBarStyle, getMenuBarVisibility, IPath } from 'vs/platform/windows/common/windows'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IEditor } from 'vs/editor/common/editorCommon'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { SerializableGrid, ISerializableView, ISerializedGrid, Orientation, ISerializedNode, ISerializedLeafNode, Direction, IViewSize, Sizing } from 'vs/base/browser/ui/grid/grid'; @@ -45,7 +45,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { ILogService } from 'vs/platform/log/common/log'; import { DeferredPromise, Promises } from 'vs/base/common/async'; import { IBannerService } from 'vs/workbench/services/banner/browser/bannerService'; -import { getVirtualWorkspaceScheme } from 'vs/platform/remote/common/remoteHosts'; +import { getVirtualWorkspaceScheme } from 'vs/platform/workspace/common/virtualWorkspace'; import { Schemas } from 'vs/base/common/network'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ActivitybarPart } from 'vs/workbench/browser/parts/activitybar/activitybarPart'; @@ -54,36 +54,36 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { LayoutStateKeys, LayoutStateModel, WorkbenchLayoutSettings } from 'vs/workbench/browser/layoutState'; interface IWorkbenchLayoutWindowRuntimeState { - fullscreen: boolean, - maximized: boolean, - hasFocus: boolean, - windowBorder: boolean, + fullscreen: boolean; + maximized: boolean; + hasFocus: boolean; + windowBorder: boolean; menuBar: { - toggled: boolean - }, + toggled: boolean; + }; zenMode: { - transitionDisposables: DisposableStore - } + transitionDisposables: DisposableStore; + }; } interface IWorkbenchLayoutWindowInitializationState { views: { - defaults: string[] | undefined + defaults: string[] | undefined; containerToRestore: { - sideBar?: string, - panel?: string, - auxiliaryBar?: string, - } - }, + sideBar?: string; + panel?: string; + auxiliaryBar?: string; + }; + }; editor: { - restoreEditors: boolean, - editorsToOpen: Promise | IUntypedEditorInput[] - } + restoreEditors: boolean; + editorsToOpen: Promise | IUntypedEditorInput[]; + }; } interface IWorkbenchLayoutWindowState { - runtime: IWorkbenchLayoutWindowRuntimeState, - initialization: IWorkbenchLayoutWindowInitializationState, + runtime: IWorkbenchLayoutWindowRuntimeState; + initialization: IWorkbenchLayoutWindowInitializationState; } enum WorkbenchLayoutClasses { @@ -97,7 +97,7 @@ enum WorkbenchLayoutClasses { WINDOW_BORDER = 'border' } -interface IInitialFilesToOpen { filesToOpenOrCreate?: IPath[], filesToDiff?: IPath[]; } +interface IInitialFilesToOpen { filesToOpenOrCreate?: IPath[]; filesToDiff?: IPath[] } export abstract class Layout extends Disposable implements IWorkbenchLayoutService { @@ -114,9 +114,15 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private readonly _onDidChangeCenteredLayout = this._register(new Emitter()); readonly onDidChangeCenteredLayout = this._onDidChangeCenteredLayout.event; + private readonly _onDidChangePanelAlignment = this._register(new Emitter()); + readonly onDidChangePanelAlignment = this._onDidChangePanelAlignment.event; + private readonly _onDidChangeWindowMaximized = this._register(new Emitter()); readonly onDidChangeWindowMaximized = this._onDidChangeWindowMaximized.event; + private readonly _onDidChangePanelPosition = this._register(new Emitter()); + readonly onDidChangePanelPosition = this._onDidChangePanelPosition.event; + private readonly _onDidChangePartVisibility = this._register(new Emitter()); readonly onDidChangePartVisibility = this._onDidChangePartVisibility.event; @@ -165,7 +171,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private editorPartView!: ISerializableView; private statusBarPartView!: ISerializableView; - private environmentService!: IWorkbenchEnvironmentService; + private environmentService!: IBrowserWorkbenchEnvironmentService; private extensionService!: IExtensionService; private configurationService!: IConfigurationService; private storageService!: IStorageService; @@ -197,7 +203,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi protected initLayout(accessor: ServicesAccessor): void { // Services - this.environmentService = accessor.get(IWorkbenchEnvironmentService); + this.environmentService = accessor.get(IBrowserWorkbenchEnvironmentService); this.configurationService = accessor.get(IConfigurationService); this.hostService = accessor.get(IHostService); this.contextService = accessor.get(IWorkspaceContextService); @@ -244,6 +250,9 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // Revalidate center layout when active editor changes: diff editor quits centered mode. this._register(this.editorService.onDidActiveEditorChange(() => this.centerEditorLayout(this.stateModel.getRuntimeValue(LayoutStateKeys.EDITOR_CENTERED)))); + // Configuration changes + this._register(this.configurationService.onDidChangeConfiguration(() => this.doUpdateLayoutConfiguration())); + // Fullscreen changes this._register(onDidChangeFullscreen(() => this.onFullscreenChanged())); @@ -426,6 +435,10 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.setSideBarPosition(change.value as Position); } + if (change.key === LayoutStateKeys.PANEL_POSITION) { + this.setPanelPosition(change.value as Position); + } + if (change.key === LayoutStateKeys.PANEL_ALIGNMENT) { this.setPanelAlignment(change.value as PanelAlignment); } @@ -508,7 +521,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.updateWindowBorder(true); } - private getDefaultLayoutViews(environmentService: IWorkbenchEnvironmentService, storageService: IStorageService): string[] | undefined { + private getDefaultLayoutViews(environmentService: IBrowserWorkbenchEnvironmentService, storageService: IStorageService): string[] | undefined { const defaultLayout = environmentService.options?.defaultLayout; if (!defaultLayout) { return undefined; @@ -610,7 +623,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } // Then check for files to open, create or diff from main side - const { filesToOpenOrCreate, filesToDiff } = this.environmentService.configuration; + const { filesToOpenOrCreate, filesToDiff } = this.environmentService; if (filesToOpenOrCreate || filesToDiff) { return { filesToOpenOrCreate, filesToDiff }; } @@ -684,9 +697,9 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi if (this.windowState.initialization.views.defaults?.length) { mark('code/willOpenDefaultViews'); - const locationsRestored: { id: string; order: number; }[] = []; + const locationsRestored: { id: string; order: number }[] = []; - const tryOpenView = (view: { id: string; order: number; }): boolean => { + const tryOpenView = (view: { id: string; order: number }): boolean => { const location = this.viewDescriptorService.getViewLocationById(view.id); if (location !== null) { const container = this.viewDescriptorService.getViewContainerByViewId(view.id); @@ -984,15 +997,18 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } getMaximumEditorDimensions(): Dimension { + const panelPosition = this.getPanelPosition(); + const isColumn = panelPosition === Position.RIGHT || panelPosition === Position.LEFT; const takenWidth = (this.isVisible(Parts.ACTIVITYBAR_PART) ? this.activityBarPartView.minimumWidth : 0) + (this.isVisible(Parts.SIDEBAR_PART) ? this.sideBarPartView.minimumWidth : 0) + + (this.isVisible(Parts.PANEL_PART) && isColumn ? this.panelPartView.minimumWidth : 0) + (this.isVisible(Parts.AUXILIARYBAR_PART) ? this.auxiliaryBarPartView.minimumWidth : 0); const takenHeight = (this.isVisible(Parts.TITLEBAR_PART) ? this.titleBarPartView.minimumHeight : 0) + (this.isVisible(Parts.STATUSBAR_PART) ? this.statusBarPartView.minimumHeight : 0) + - (this.isVisible(Parts.PANEL_PART) ? this.panelPartView.minimumHeight : 0); + (this.isVisible(Parts.PANEL_PART) && !isColumn ? this.panelPartView.minimumHeight : 0); const availableWidth = this.dimension.width - takenWidth; const availableHeight = this.dimension.height - takenHeight; @@ -1177,7 +1193,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi [Parts.AUXILIARYBAR_PART]: this.auxiliaryBarPartView }; - const fromJSON = ({ type }: { type: Parts; }) => viewMap[type]; + const fromJSON = ({ type }: { type: Parts }) => viewMap[type]; const workbenchGrid = SerializableGrid.deserialize( this.createGridDescriptor(), { fromJSON }, @@ -1215,7 +1231,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // Panel Size const panelSize = this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_HIDDEN) ? this.workbenchGrid.getViewCachedVisibleSize(this.panelPartView) - : this.workbenchGrid.getViewSize(this.panelPartView).height; + : (this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION) === Position.BOTTOM ? this.workbenchGrid.getViewSize(this.panelPartView).height : this.workbenchGrid.getViewSize(this.panelPartView).width); this.stateModel.setInitializationValue(LayoutStateKeys.PANEL_SIZE, panelSize as number); // Auxiliary Bar Size @@ -1308,8 +1324,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.workbenchGrid.resizeView(this.panelPartView, { - width: viewSize.width, - height: viewSize.height + sizeChangePxHeight + width: viewSize.width + (this.getPanelPosition() !== Position.BOTTOM ? sizeChangePxWidth : 0), + height: viewSize.height + (this.getPanelPosition() !== Position.BOTTOM ? 0 : sizeChangePxHeight) }); break; @@ -1320,7 +1336,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi width: viewSize.width + sizeChangePxWidth, height: viewSize.height }); - + break; case Parts.EDITOR_PART: viewSize = this.workbenchGrid.getViewSize(this.editorPartView); @@ -1491,9 +1507,21 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } setPanelAlignment(alignment: PanelAlignment, skipLayout?: boolean): void { + // Panel alignment only applies to a panel in the bottom position + if (this.getPanelPosition() !== Position.BOTTOM) { + this.setPanelPosition(Position.BOTTOM); + } + + // the workbench grid currently prevents us from supporting panel maximization with non-center panel alignment + if (alignment !== 'center' && this.isPanelMaximized()) { + this.toggleMaximizedPanel(); + } + this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_ALIGNMENT, alignment); this.adjustPartPositions(this.getSideBarPosition(), alignment); + + this._onDidChangePanelAlignment.fire(alignment); } private setPanelHidden(hidden: boolean, skipLayout?: boolean): void { @@ -1572,18 +1600,23 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi toggleMaximizedPanel(): void { const size = this.workbenchGrid.getViewSize(this.panelPartView); + const panelPosition = this.getPanelPosition(); const isMaximized = this.isPanelMaximized(); if (!isMaximized) { if (this.isVisible(Parts.PANEL_PART)) { - this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT, size.height); + if (panelPosition === Position.BOTTOM) { + this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT, size.height); + } else { + this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH, size.width); + } } this.setEditorHidden(true); } else { this.setEditorHidden(false); this.workbenchGrid.resizeView(this.panelPartView, { - width: size.width, - height: this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT) + width: panelPosition === Position.BOTTOM ? size.width : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH), + height: panelPosition === Position.BOTTOM ? this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT) : size.height }); } this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_WAS_LAST_MAXIMIZED, !isMaximized); @@ -1592,7 +1625,12 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi /** * Returns whether or not the panel opens maximized */ - private panelOpensMaximized() { + private panelOpensMaximized(): boolean { + // the workbench grid currently prevents us from supporting panel maximization with non-center panel alignment + if (this.getPanelAlignment() !== 'center') { + return false; + } + const panelOpensMaximized = panelOpensMaximizedFromString(this.configurationService.getValue(WorkbenchLayoutSettings.PANEL_OPENS_MAXIMIZED)); const panelLastIsMaximized = this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_WAS_LAST_MAXIMIZED); @@ -1674,14 +1712,15 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } isPanelMaximized(): boolean { - return !this.isVisible(Parts.EDITOR_PART); + // the workbench grid currently prevents us from supporting panel maximization with non-center panel alignment + return (this.getPanelAlignment() === 'center' || this.getPanelPosition() !== Position.BOTTOM) && !this.isVisible(Parts.EDITOR_PART); } getSideBarPosition(): Position { return this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_POSITON); } - private getPanelAlignment(): PanelAlignment { + getPanelAlignment(): PanelAlignment { return this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_ALIGNMENT); } @@ -1708,6 +1747,74 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.configurationService.updateValue('window.menuBarVisibility', newVisibilityValue); } + getPanelPosition(): Position { + return this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION); + } + + setPanelPosition(position: Position): void { + if (!this.isVisible(Parts.PANEL_PART)) { + this.setPanelHidden(false); + } + + const panelPart = this.getPart(Parts.PANEL_PART); + const oldPositionValue = positionToString(this.getPanelPosition()); + const newPositionValue = positionToString(position); + + this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_POSITION, position); + + // Adjust CSS + const panelContainer = assertIsDefined(panelPart.getContainer()); + panelContainer.classList.remove(oldPositionValue); + panelContainer.classList.add(newPositionValue); + + // Update Styles + panelPart.updateStyles(); + + // Layout + const size = this.workbenchGrid.getViewSize(this.panelPartView); + const sideBarSize = this.workbenchGrid.getViewSize(this.sideBarPartView); + const auxiliaryBarSize = this.workbenchGrid.getViewSize(this.auxiliaryBarPartView); + + const editorHidden = !this.isVisible(Parts.EDITOR_PART); + + // Save last non-maximized size for panel before move + if (newPositionValue !== oldPositionValue && !editorHidden) { + + // Save the current size of the panel for the new orthogonal direction + // If moving down, save the width of the panel + // Otherwise, save the height of the panel + if (position === Position.BOTTOM) { + this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH, size.width); + } else if (positionFromString(oldPositionValue) === Position.BOTTOM) { + this.stateModel.setRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT, size.height); + } + } + + const sideBarVisible = this.isVisible(Parts.SIDEBAR_PART); + const auxiliaryBarVisible = this.isVisible(Parts.AUXILIARYBAR_PART); + + if (position === Position.BOTTOM) { + this.workbenchGrid.moveView(this.panelPartView, editorHidden ? size.height : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_HEIGHT), this.editorPartView, Direction.Down); + } else if (position === Position.RIGHT) { + this.workbenchGrid.moveView(this.panelPartView, editorHidden ? size.width : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH), this.editorPartView, Direction.Right); + } else { + this.workbenchGrid.moveView(this.panelPartView, editorHidden ? size.width : this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_LAST_NON_MAXIMIZED_WIDTH), this.editorPartView, Direction.Left); + } + + // Reset sidebar to original size before shifting the panel + this.workbenchGrid.resizeView(this.sideBarPartView, sideBarSize); + if (!sideBarVisible) { + this.setSideBarHidden(true); + } + + this.workbenchGrid.resizeView(this.auxiliaryBarPartView, auxiliaryBarSize); + if (!auxiliaryBarVisible) { + this.setAuxiliaryBarHidden(true); + } + + this._onDidChangePanelPosition.fire(newPositionValue); + } + isWindowMaximized() { return this.windowState.runtime.maximized; } @@ -1753,7 +1860,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return undefined; } - private arrangeEditorNodes(nodes: { editor: ISerializedNode, sideBar?: ISerializedNode, auxiliaryBar?: ISerializedNode }, availableHeight: number, availableWidth: number): ISerializedNode { + private arrangeEditorNodes(nodes: { editor: ISerializedNode; sideBar?: ISerializedNode; auxiliaryBar?: ISerializedNode }, availableHeight: number, availableWidth: number): ISerializedNode { if (!nodes.sideBar && !nodes.auxiliaryBar) { nodes.editor.size = availableHeight; return nodes.editor; @@ -1788,49 +1895,69 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi }; } - private arrangeMiddleSectionNodes(nodes: { editor: ISerializedNode, panel: ISerializedNode, activityBar: ISerializedNode, sideBar: ISerializedNode, auxiliaryBar: ISerializedNode }, availableWidth: number, availableHeight: number): ISerializedNode[] { + private arrangeMiddleSectionNodes(nodes: { editor: ISerializedNode; panel: ISerializedNode; activityBar: ISerializedNode; sideBar: ISerializedNode; auxiliaryBar: ISerializedNode }, availableWidth: number, availableHeight: number): ISerializedNode[] { const activityBarSize = this.stateModel.getRuntimeValue(LayoutStateKeys.ACTIVITYBAR_HIDDEN) ? 0 : nodes.activityBar.size; const sideBarSize = this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_HIDDEN) ? 0 : nodes.sideBar.size; const auxiliaryBarSize = this.stateModel.getRuntimeValue(LayoutStateKeys.AUXILIARYBAR_HIDDEN) ? 0 : nodes.auxiliaryBar.size; const panelSize = this.stateModel.getInitializationValue(LayoutStateKeys.PANEL_SIZE) ? 0 : nodes.panel.size; const result = [] as ISerializedNode[]; - const panelAlignment = this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_ALIGNMENT); - const sideBarPosition = this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_POSITON); - const sideBarNextToEditor = !(panelAlignment === 'center' || (sideBarPosition === Position.LEFT && panelAlignment === 'right') || (sideBarPosition === Position.RIGHT && panelAlignment === 'left')); - const auxiliaryBarNextToEditor = !(panelAlignment === 'center' || (sideBarPosition === Position.RIGHT && panelAlignment === 'right') || (sideBarPosition === Position.LEFT && panelAlignment === 'left')); - - const editorSectionWidth = availableWidth - activityBarSize - (sideBarNextToEditor ? 0 : sideBarSize) - (auxiliaryBarNextToEditor ? 0 : auxiliaryBarSize); - result.push({ - type: 'branch', - data: [this.arrangeEditorNodes({ - editor: nodes.editor, - sideBar: sideBarNextToEditor ? nodes.sideBar : undefined, - auxiliaryBar: auxiliaryBarNextToEditor ? nodes.auxiliaryBar : undefined - }, availableHeight - panelSize, editorSectionWidth), nodes.panel], - size: editorSectionWidth - }); - - if (!sideBarNextToEditor) { - if (sideBarPosition === Position.LEFT) { - result.splice(0, 0, nodes.sideBar); + if (this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION) !== Position.BOTTOM) { + result.push(nodes.editor); + nodes.editor.size = availableWidth - activityBarSize - sideBarSize - panelSize - auxiliaryBarSize; + if (this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION) === Position.RIGHT) { + result.push(nodes.panel); } else { - result.push(nodes.sideBar); + result.splice(0, 0, nodes.panel); } - } - if (!auxiliaryBarNextToEditor) { - if (sideBarPosition === Position.RIGHT) { - result.splice(0, 0, nodes.auxiliaryBar); - } else { + if (this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_POSITON) === Position.LEFT) { result.push(nodes.auxiliaryBar); + result.splice(0, 0, nodes.sideBar); + result.splice(0, 0, nodes.activityBar); + } else { + result.splice(0, 0, nodes.auxiliaryBar); + result.push(nodes.sideBar); + result.push(nodes.activityBar); } - } - - if (sideBarPosition === Position.LEFT) { - result.splice(0, 0, nodes.activityBar); } else { - result.push(nodes.activityBar); + const panelAlignment = this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_ALIGNMENT); + const sideBarPosition = this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_POSITON); + const sideBarNextToEditor = !(panelAlignment === 'center' || (sideBarPosition === Position.LEFT && panelAlignment === 'right') || (sideBarPosition === Position.RIGHT && panelAlignment === 'left')); + const auxiliaryBarNextToEditor = !(panelAlignment === 'center' || (sideBarPosition === Position.RIGHT && panelAlignment === 'right') || (sideBarPosition === Position.LEFT && panelAlignment === 'left')); + + const editorSectionWidth = availableWidth - activityBarSize - (sideBarNextToEditor ? 0 : sideBarSize) - (auxiliaryBarNextToEditor ? 0 : auxiliaryBarSize); + result.push({ + type: 'branch', + data: [this.arrangeEditorNodes({ + editor: nodes.editor, + sideBar: sideBarNextToEditor ? nodes.sideBar : undefined, + auxiliaryBar: auxiliaryBarNextToEditor ? nodes.auxiliaryBar : undefined + }, availableHeight - panelSize, editorSectionWidth), nodes.panel], + size: editorSectionWidth + }); + + if (!sideBarNextToEditor) { + if (sideBarPosition === Position.LEFT) { + result.splice(0, 0, nodes.sideBar); + } else { + result.push(nodes.sideBar); + } + } + + if (!auxiliaryBarNextToEditor) { + if (sideBarPosition === Position.RIGHT) { + result.splice(0, 0, nodes.auxiliaryBar); + } else { + result.push(nodes.auxiliaryBar); + } + } + + if (sideBarPosition === Position.LEFT) { + result.splice(0, 0, nodes.activityBar); + } else { + result.push(nodes.activityBar); + } } return result; @@ -1934,15 +2061,17 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi panelVisible: boolean; statusbarVisible: boolean; sideBarPosition: string; + panelPosition: string; }; type StartupLayoutEventClassification = { - activityBarVisible: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - sideBarVisible: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - auxiliaryBarVisible: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - panelVisible: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - statusbarVisible: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - sideBarPosition: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + activityBarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + sideBarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + auxiliaryBarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + panelVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + statusbarVisible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + sideBarPosition: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + panelPosition: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; const layoutDescriptor: StartupLayoutEvent = { @@ -1952,6 +2081,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi panelVisible: !this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_HIDDEN), statusbarVisible: !this.stateModel.getRuntimeValue(LayoutStateKeys.STATUSBAR_HIDDEN), sideBarPosition: positionToString(this.stateModel.getRuntimeValue(LayoutStateKeys.SIDEBAR_POSITON)), + panelPosition: positionToString(this.stateModel.getRuntimeValue(LayoutStateKeys.PANEL_POSITION)), }; this.telemetryService.publicLog2('startupLayout', layoutDescriptor); diff --git a/src/vs/workbench/browser/layoutState.ts b/src/vs/workbench/browser/layoutState.ts index 214b45d9c03..f46899008c2 100644 --- a/src/vs/workbench/browser/layoutState.ts +++ b/src/vs/workbench/browser/layoutState.ts @@ -12,12 +12,12 @@ import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/ import { PanelAlignment, Position, positionFromString, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; interface IWorkbenchLayoutStateKey { - name: string, - runtime: boolean, - defaultValue: any, - scope: StorageScope, - target: StorageTarget - zenModeIgnore?: boolean, + name: string; + runtime: boolean; + defaultValue: any; + scope: StorageScope; + target: StorageTarget; + zenModeIgnore?: boolean; } type StorageKeyType = string | boolean | number | object; @@ -65,6 +65,7 @@ export const LayoutStateKeys = { // Part Positions SIDEBAR_POSITON: new RuntimeStateKey('sideBar.position', StorageScope.GLOBAL, StorageTarget.USER, Position.LEFT), + PANEL_POSITION: new RuntimeStateKey('panel.position', StorageScope.WORKSPACE, StorageTarget.USER, Position.BOTTOM), PANEL_ALIGNMENT: new RuntimeStateKey('panel.alignment', StorageScope.GLOBAL, StorageTarget.USER, 'center'), // Part Visibility @@ -82,7 +83,7 @@ interface ILayoutStateChangeEvent { value: T; } export class LayoutStateModel extends Disposable { - static readonly STORAGE_PREFIX = 'workbench.state.'; + static readonly STORAGE_PREFIX = 'workbench.'; private stateCache = new Map(); private readonly _onDidChangeState: Emitter> = this._register(new Emitter>()); @@ -94,7 +95,7 @@ export class LayoutStateModel extends Disposable { private readonly contextService: IWorkspaceContextService, private readonly container: HTMLElement) { super(); - this.configurationService.onDidChangeConfiguration(configurationChange => this.updateStateFromLegacySettings(configurationChange)); + this._register(this.configurationService.onDidChangeConfiguration(configurationChange => this.updateStateFromLegacySettings(configurationChange))); } private updateStateFromLegacySettings(configurationChangeEvent: IConfigurationChangeEvent): void { @@ -108,10 +109,6 @@ export class LayoutStateModel extends Disposable { this.setRuntimeValueAndFire(LayoutStateKeys.STATUSBAR_HIDDEN, !this.configurationService.getValue(LegacyWorkbenchLayoutSettings.STATUSBAR_VISIBLE)); } - if (configurationChangeEvent.affectsConfiguration(LegacyWorkbenchLayoutSettings.PANEL_ALIGNMENT)) { - this.setRuntimeValueAndFire(LayoutStateKeys.PANEL_ALIGNMENT, this.configurationService.getValue(LegacyWorkbenchLayoutSettings.PANEL_ALIGNMENT)); - } - if (configurationChangeEvent.affectsConfiguration(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION)) { this.setRuntimeValueAndFire(LayoutStateKeys.SIDEBAR_POSITON, positionFromString(this.configurationService.getValue(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION) ?? 'left')); } @@ -127,8 +124,6 @@ export class LayoutStateModel extends Disposable { this.configurationService.updateValue(LegacyWorkbenchLayoutSettings.ACTIVITYBAR_VISIBLE, !value); } else if (key === LayoutStateKeys.STATUSBAR_HIDDEN) { this.configurationService.updateValue(LegacyWorkbenchLayoutSettings.STATUSBAR_VISIBLE, !value); - } else if (key === LayoutStateKeys.PANEL_ALIGNMENT) { - this.configurationService.updateValue(LegacyWorkbenchLayoutSettings.PANEL_ALIGNMENT, value); } else if (key === LayoutStateKeys.SIDEBAR_POSITON) { this.configurationService.updateValue(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION, positionToString(value as Position)); } @@ -150,15 +145,15 @@ export class LayoutStateModel extends Disposable { // Apply legacy settings this.stateCache.set(LayoutStateKeys.ACTIVITYBAR_HIDDEN.name, !this.configurationService.getValue(LegacyWorkbenchLayoutSettings.ACTIVITYBAR_VISIBLE)); this.stateCache.set(LayoutStateKeys.STATUSBAR_HIDDEN.name, !this.configurationService.getValue(LegacyWorkbenchLayoutSettings.STATUSBAR_VISIBLE)); - this.stateCache.set(LayoutStateKeys.PANEL_ALIGNMENT.name, this.configurationService.getValue(LegacyWorkbenchLayoutSettings.PANEL_ALIGNMENT)); this.stateCache.set(LayoutStateKeys.SIDEBAR_POSITON.name, positionFromString(this.configurationService.getValue(LegacyWorkbenchLayoutSettings.SIDEBAR_POSITION) ?? 'left')); // Set dynamic defaults: part sizing and side bar visibility const workbenchDimensions = getClientArea(this.container); + LayoutStateKeys.PANEL_POSITION.defaultValue = positionFromString(this.configurationService.getValue(WorkbenchLayoutSettings.PANEL_POSITION) ?? 'bottom'); LayoutStateKeys.GRID_SIZE.defaultValue = { height: workbenchDimensions.height, width: workbenchDimensions.width }; LayoutStateKeys.SIDEBAR_SIZE.defaultValue = Math.min(300, workbenchDimensions.width / 4); LayoutStateKeys.AUXILIARYBAR_SIZE.defaultValue = Math.min(300, workbenchDimensions.width / 4); - LayoutStateKeys.PANEL_SIZE.defaultValue = workbenchDimensions.height / 3; + LayoutStateKeys.PANEL_SIZE.defaultValue = (this.stateCache.get(LayoutStateKeys.PANEL_POSITION.name) ?? LayoutStateKeys.PANEL_POSITION.defaultValue) === 'bottom' ? workbenchDimensions.height / 3 : workbenchDimensions.width / 4; LayoutStateKeys.SIDEBAR_HIDDEN.defaultValue = this.contextService.getWorkbenchState() === WorkbenchState.EMPTY; @@ -169,6 +164,23 @@ export class LayoutStateModel extends Disposable { this.stateCache.set(stateKey.name, stateKey.defaultValue); } } + + // Register for runtime key changes + this._register(this.storageService.onDidChangeValue(storageChangeEvent => { + let key: keyof typeof LayoutStateKeys; + for (key in LayoutStateKeys) { + const stateKey = LayoutStateKeys[key] as WorkbenchLayoutStateKey; + if (stateKey instanceof RuntimeStateKey && stateKey.scope === StorageScope.GLOBAL && stateKey.target === StorageTarget.USER) { + if (`${LayoutStateModel.STORAGE_PREFIX}${stateKey.name}` === storageChangeEvent.key) { + const value = this.loadKeyFromStorage(stateKey) ?? stateKey.defaultValue; + if (this.stateCache.get(stateKey.name) !== value) { + this.stateCache.set(stateKey.name, value); + this._onDidChangeState.fire({ key: stateKey, value }); + } + } + } + } + })); } save(workspace: boolean, global: boolean): void { @@ -250,6 +262,7 @@ export class LayoutStateModel extends Disposable { } export enum WorkbenchLayoutSettings { + PANEL_POSITION = 'workbench.panel.defaultLocation', PANEL_OPENS_MAXIMIZED = 'workbench.panel.opensMaximized', ZEN_MODE_CONFIG = 'zenMode', ZEN_MODE_SILENT_NOTIFICATIONS = 'zenMode.silentNotifications', @@ -260,5 +273,4 @@ enum LegacyWorkbenchLayoutSettings { ACTIVITYBAR_VISIBLE = 'workbench.activityBar.visible', // Deprecated to UI State STATUSBAR_VISIBLE = 'workbench.statusBar.visible', // Deprecated to UI State SIDEBAR_POSITION = 'workbench.sideBar.location', // Deprecated to UI State - PANEL_ALIGNMENT = 'workbench.experimental.panel.alignment', // Deprecated to UI State } diff --git a/src/vs/workbench/browser/panecomposite.ts b/src/vs/workbench/browser/panecomposite.ts index 9cdf1fd3b83..9d642b89346 100644 --- a/src/vs/workbench/browser/panecomposite.ts +++ b/src/vs/workbench/browser/panecomposite.ts @@ -5,7 +5,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Composite, CompositeDescriptor, CompositeRegistry } from 'vs/workbench/browser/composite'; -import { IConstructorSignature0, BrandedService, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IConstructorSignature, BrandedService, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; import { Dimension } from 'vs/base/browser/dom'; import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -153,11 +153,11 @@ export class PaneCompositeDescriptor extends CompositeDescriptor iconUrl?: URI ): PaneCompositeDescriptor { - return new PaneCompositeDescriptor(ctor as IConstructorSignature0, id, name, cssClass, order, requestedIndex, iconUrl); + return new PaneCompositeDescriptor(ctor as IConstructorSignature, id, name, cssClass, order, requestedIndex, iconUrl); } private constructor( - ctor: IConstructorSignature0, + ctor: IConstructorSignature, id: string, name: string, cssClass?: string, diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index cf9c3325160..87699c28b96 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -24,8 +24,8 @@ import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/bro import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { isMacintosh, isWeb } from 'vs/base/common/platform'; -import { getCurrentAuthenticationSessionInfo, IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; -import { AuthenticationSession } from 'vs/editor/common/languages'; +import { getCurrentAuthenticationSessionInfo } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { AuthenticationSession, IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -102,10 +102,10 @@ export class ViewContainerActivityAction extends ActivityAction { private logAction(action: string) { type ActivityBarActionClassification = { - viewletId: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - action: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + viewletId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; - this.telemetryService.publicLog2<{ viewletId: String, action: String; }, ActivityBarActionClassification>('activityBarAction', { viewletId: this.activity.id, action }); + this.telemetryService.publicLog2<{ viewletId: String; action: String }, ActivityBarActionClassification>('activityBarAction', { viewletId: this.activity.id, action }); } } @@ -224,7 +224,7 @@ export class AccountsActivityActionViewItem extends MenuActivityActionViewItem { try { const sessions = await this.authenticationService.getSessions(providerId); - const groupedSessions: { [label: string]: AuthenticationSession[]; } = {}; + const groupedSessions: { [label: string]: AuthenticationSession[] } = {}; sessions.forEach(session => { if (groupedSessions[session.account.label]) { groupedSessions[session.account.label].push(session); diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index b2b74a071ec..2694ca8a427 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -23,7 +23,8 @@ import { IStorageService, StorageScope, IStorageValueChangeEvent, StorageTarget import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ToggleCompositePinnedAction, ICompositeBarColors, ActivityAction, ICompositeActivity, IActivityHoverOptions } from 'vs/workbench/browser/parts/compositeBarActions'; -import { IViewDescriptorService, ViewContainer, IViewContainerModel, ViewContainerLocation, getEnabledViewContainerContextKey } from 'vs/workbench/common/views'; +import { IViewDescriptorService, ViewContainer, IViewContainerModel, ViewContainerLocation } from 'vs/workbench/common/views'; +import { getEnabledViewContainerContextKey } from 'vs/workbench/common/contextkeys'; import { IContextKeyService, ContextKeyExpr, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { assertIsDefined, isString } from 'vs/base/common/types'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -48,7 +49,7 @@ interface IPlaceholderViewContainer { readonly iconUrl?: UriComponents; readonly themeIcon?: ThemeIcon; readonly isBuiltin?: boolean; - readonly views?: { when?: string; }[]; + readonly views?: { when?: string }[]; } interface IPinnedViewContainer { @@ -66,7 +67,7 @@ interface ICachedViewContainer { readonly order?: number; visible: boolean; isBuiltin?: boolean; - views?: { when?: string; }[]; + views?: { when?: string }[]; } export class ActivitybarPart extends Part implements IPaneCompositeSelectorPart { @@ -107,7 +108,7 @@ export class ActivitybarPart extends Part implements IPaneCompositeSelectorPart private readonly accountsActivity: ICompositeActivity[] = []; - private readonly compositeActions = new Map(); + private readonly compositeActions = new Map(); private readonly viewContainerDisposables = new Map(); private readonly keyboardNavigationDisposables = this._register(new DisposableStore()); @@ -258,7 +259,7 @@ export class ActivitybarPart extends Part implements IPaneCompositeSelectorPart })); } - private onDidChangeViewContainers(added: readonly { container: ViewContainer, location: ViewContainerLocation; }[], removed: readonly { container: ViewContainer, location: ViewContainerLocation; }[]) { + private onDidChangeViewContainers(added: readonly { container: ViewContainer; location: ViewContainerLocation }[], removed: readonly { container: ViewContainer; location: ViewContainerLocation }[]) { removed.filter(({ location }) => location === ViewContainerLocation.Sidebar).forEach(({ container }) => this.onDidDeregisterViewContainer(container)); this.onDidRegisterViewContainers(added.filter(({ location }) => location === ViewContainerLocation.Sidebar).map(({ container }) => container)); } @@ -563,7 +564,7 @@ export class ActivitybarPart extends Part implements IPaneCompositeSelectorPart this.updateGlobalActivity(ACCOUNTS_ACTIVITY_ID); } - private getCompositeActions(compositeId: string): { activityAction: ViewContainerActivityAction, pinnedAction: ToggleCompositePinnedAction; } { + private getCompositeActions(compositeId: string): { activityAction: ViewContainerActivityAction; pinnedAction: ToggleCompositePinnedAction } { let compositeActions = this.compositeActions.get(compositeId); if (!compositeActions) { const viewContainer = this.getViewContainer(compositeId); @@ -849,7 +850,7 @@ export class ActivitybarPart extends Part implements IPaneCompositeSelectorPart const viewContainer = this.getViewContainer(compositeItem.id); if (viewContainer) { const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); - const views: { when: string | undefined; }[] = []; + const views: { when: string | undefined }[] = []; for (const { when } of viewContainerModel.allViewDescriptors) { views.push({ when: when ? when.serialize() : undefined }); } diff --git a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css index c8f26273529..d0a2aefcb34 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css @@ -119,16 +119,6 @@ right: 0; } -/* Adjust position for Windows https://github.com/microsoft/vscode/issues/140647 */ - -.monaco-workbench.windows:not(.maximized) .activitybar.left > .content :not(.monaco-menu) > .monaco-action-bar .action-item .active-item-indicator:before{ - left: 1px; -} - -.monaco-workbench.windows:not(.maximized) .activitybar.right > .content :not(.monaco-menu) > .monaco-action-bar .action-item .active-item-indicator:before { - right: 2px; -} - /* Hides outline on HC as focus is handled by border */ .monaco-workbench.hc-black .activitybar.left > .content :not(.monaco-menu) > .monaco-action-bar .action-item:focus:before, .monaco-workbench.hc-black .activitybar.right > .content :not(.monaco-menu) > .monaco-action-bar .action-item:focus:before { diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts index b13222f2aaa..39d150021b6 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions.ts @@ -9,7 +9,7 @@ import { MenuId, MenuRegistry, SyncActionDescriptor } from 'vs/platform/actions/ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { Registry } from 'vs/platform/registry/common/platform'; import { CATEGORIES, Extensions as WorkbenchExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; -import { AuxiliaryBarVisibleContext } from 'vs/workbench/common/auxiliarybar'; +import { AuxiliaryBarVisibleContext } from 'vs/workbench/common/contextkeys'; import { ViewContainerLocation, ViewContainerLocationToString } from 'vs/workbench/common/views'; import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts index 2f35766e6e5..41f6a9c5846 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts @@ -16,7 +16,7 @@ import { activeContrastBorder, contrastBorder, editorBackground } from 'vs/platf import { IThemeService, registerThemingParticipant } 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/auxiliarybar'; +import { ActiveAuxiliaryContext, AuxiliaryBarFocusContext } from 'vs/workbench/common/contextkeys'; import { SIDE_BAR_BACKGROUND, SIDE_BAR_BORDER, SIDE_BAR_TITLE_FOREGROUND } from 'vs/workbench/common/theme'; import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/browser/parts/banner/bannerPart.ts b/src/vs/workbench/browser/parts/banner/bannerPart.ts index 0de6530c073..b28390d2680 100644 --- a/src/vs/workbench/browser/parts/banner/bannerPart.ts +++ b/src/vs/workbench/browser/parts/banner/bannerPart.ts @@ -19,15 +19,16 @@ import { Link } from 'vs/platform/opener/browser/link'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { Emitter } from 'vs/base/common/event'; import { IBannerItem, IBannerService } from 'vs/workbench/services/banner/browser/bannerService'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { BANNER_BACKGROUND, BANNER_FOREGROUND, BANNER_ICON_FOREGROUND } from 'vs/workbench/common/theme'; import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { URI } from 'vs/base/common/uri'; import { widgetClose } from 'vs/platform/theme/common/iconRegistry'; +import { BannerFocused } from 'vs/workbench/common/contextkeys'; // Theme support @@ -56,8 +57,6 @@ registerThemingParticipant((theme, collector) => { // Banner Part -const CONTEXT_BANNER_FOCUSED = new RawContextKey('bannerFocused', false, localize('bannerFocused', "Whether the banner has keyboard focus")); - export class BannerPart extends Part implements IBannerService { declare readonly _serviceBrand: undefined; @@ -76,7 +75,7 @@ export class BannerPart extends Part implements IBannerService { return this.visible ? this.height : 0; } - private _onDidChangeSize = this._register(new Emitter<{ width: number; height: number; } | undefined>()); + private _onDidChangeSize = this._register(new Emitter<{ width: number; height: number } | undefined>()); override get onDidChange() { return this._onDidChangeSize.event; } //#endregion @@ -114,7 +113,7 @@ export class BannerPart extends Part implements IBannerService { // Track focus const scopedContextKeyService = this.contextKeyService.createScoped(this.element); - CONTEXT_BANNER_FOCUSED.bindTo(scopedContextKeyService).set(true); + BannerFocused.bindTo(scopedContextKeyService).set(true); return this.element; } @@ -276,7 +275,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'workbench.banner.focusBanner', weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.Escape, - when: CONTEXT_BANNER_FOCUSED, + when: BannerFocused, handler: (accessor: ServicesAccessor) => { const bannerService = accessor.get(IBannerService); bannerService.focus(); @@ -288,7 +287,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.RightArrow, secondary: [KeyCode.DownArrow], - when: CONTEXT_BANNER_FOCUSED, + when: BannerFocused, handler: (accessor: ServicesAccessor) => { const bannerService = accessor.get(IBannerService); bannerService.focusNextAction(); @@ -300,7 +299,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.LeftArrow, secondary: [KeyCode.UpArrow], - when: CONTEXT_BANNER_FOCUSED, + when: BannerFocused, handler: (accessor: ServicesAccessor) => { const bannerService = accessor.get(IBannerService); bannerService.focusPreviousAction(); diff --git a/src/vs/workbench/browser/parts/compositeBar.ts b/src/vs/workbench/browser/parts/compositeBar.ts index 4cd79b5b3e0..68f6ebacaa8 100644 --- a/src/vs/workbench/browser/parts/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositeBar.ts @@ -325,7 +325,7 @@ export class CompositeBar extends Widget implements ICompositeBar { this.updateCompositeSwitcher(); } - addComposite({ id, name, order, requestedIndex }: { id: string; name: string, order?: number, requestedIndex?: number; }): void { + addComposite({ id, name, order, requestedIndex }: { id: string; name: string; order?: number; requestedIndex?: number }): void { // Add to the model if (this.model.add(id, name, order, requestedIndex)) { this.computeSizes([this.model.findItem(id)]); @@ -629,7 +629,7 @@ export class CompositeBar extends Widget implements ICompositeBar { this._onDidChange.fire(); } - private getOverflowingComposites(): { id: string, name?: string; }[] { + private getOverflowingComposites(): { id: string; name?: string }[] { let overflowingIds = this.model.visibleItems.filter(item => item.pinned).map(item => item.id); // Show the active composite even if it is not pinned diff --git a/src/vs/workbench/browser/parts/compositeBarActions.ts b/src/vs/workbench/browser/parts/compositeBarActions.ts index 597a0173dfd..3e853a32ef1 100644 --- a/src/vs/workbench/browser/parts/compositeBarActions.ts +++ b/src/vs/workbench/browser/parts/compositeBarActions.ts @@ -454,7 +454,7 @@ export class CompositeOverflowActivityActionViewItem extends ActivityActionViewI constructor( action: ActivityAction, - private getOverflowingComposites: () => { id: string, name?: string }[], + private getOverflowingComposites: () => { id: string; name?: string }[], private getActiveCompositeId: () => string | undefined, private getBadge: (compositeId: string) => IBadge, private getCompositeOpenAction: (compositeId: string) => IAction, diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index b8da6f894d9..b6fddb4625f 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -31,6 +31,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { Dimension, append, $, hide, show } from 'vs/base/browser/dom'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; import { assertIsDefined, withNullAsUndefined } from 'vs/base/common/types'; +import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; export interface ICompositeTitleLabel { @@ -53,7 +54,7 @@ interface CompositeItem { export abstract class CompositePart extends Part { - protected readonly onDidCompositeOpen = this._register(new Emitter<{ composite: IComposite, focus: boolean; }>()); + protected readonly onDidCompositeOpen = this._register(new Emitter<{ composite: IComposite; focus: boolean }>()); protected readonly onDidCompositeClose = this._register(new Emitter()); protected toolBar: ToolBar | undefined; @@ -436,7 +437,7 @@ export abstract class CompositePart extends Part { return this.activeComposite.getActionViewItem(action); } - return undefined; + return createActionViewItem(this.instantiationService, action); } protected actionsContextProvider(): unknown { diff --git a/src/vs/workbench/browser/parts/dialogs/dialogHandler.ts b/src/vs/workbench/browser/parts/dialogs/dialogHandler.ts index 530ce5e5c28..fc96b5aada9 100644 --- a/src/vs/workbench/browser/parts/dialogs/dialogHandler.ts +++ b/src/vs/workbench/browser/parts/dialogs/dialogHandler.ts @@ -19,7 +19,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { fromNow } from 'vs/base/common/date'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; export class BrowserDialogHandler implements IDialogHandler { diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 930e4c331e6..276c37b1bd0 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -34,7 +34,6 @@ import { BreadcrumbsFilePicker, BreadcrumbsOutlinePicker, BreadcrumbsPicker } fr import { IEditorPartOptions, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; import { ACTIVE_GROUP, ACTIVE_GROUP_TYPE, IEditorService, SIDE_GROUP, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; import { PixelRatio } from 'vs/base/browser/browser'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -197,7 +196,6 @@ export class BreadcrumbsControl { @IThemeService private readonly _themeService: IThemeService, @IQuickInputService private readonly _quickInputService: IQuickInputService, @IFileService private readonly _fileService: IFileService, - @ITelemetryService private readonly _telemetryService: ITelemetryService, @IEditorService private readonly _editorService: IEditorService, @ILabelService private readonly _labelService: ILabelService, @IConfigurationService configurationService: IConfigurationService, @@ -314,8 +312,8 @@ export class BreadcrumbsControl { const configListener = this._cfShowIcons.onDidChange(updateBreadcrumbs); updateBreadcrumbs(); this._breadcrumbsDisposables.clear(); - this._breadcrumbsDisposables.add(model); this._breadcrumbsDisposables.add(listener); + this._breadcrumbsDisposables.add(model); this._breadcrumbsDisposables.add(configListener); this._breadcrumbsDisposables.add(toDisposable(() => this._widget.setItems([]))); @@ -361,10 +359,6 @@ export class BreadcrumbsControl { const { element } = event.item as FileItem | OutlineItem; this._editorGroup.focus(); - type BreadcrumbSelect = { type: string }; - type BreadcrumbSelectClassification = { type: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; }; - this._telemetryService.publicLog2('breadcrumbs/select', { type: event.item instanceof OutlineItem ? 'symbol' : 'file' }); - const group = this._getEditorGroup(event.payload); if (group !== undefined) { // reveal the item @@ -386,7 +380,7 @@ export class BreadcrumbsControl { let picker: BreadcrumbsPicker; let pickerAnchor: { x: number; y: number }; - interface IHideData { didPick?: boolean, source?: BreadcrumbsControl } + interface IHideData { didPick?: boolean; source?: BreadcrumbsControl } this._contextViewService.showContextView({ render: (parent: HTMLElement) => { diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts index e1dc382fdda..5d4c050eeea 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsModel.ts @@ -25,7 +25,7 @@ export class FileElement { ) { } } -type FileInfo = { path: FileElement[], folder?: IWorkspaceFolder }; +type FileInfo = { path: FileElement[]; folder?: IWorkspaceFolder }; export class OutlineElement2 { constructor( @@ -39,7 +39,6 @@ export class BreadcrumbsModel { private readonly _disposables = new DisposableStore(); private readonly _fileInfo: FileInfo; - private readonly _cfgEnabled: BreadcrumbsConfig; private readonly _cfgFilePath: BreadcrumbsConfig<'on' | 'off' | 'last'>; private readonly _cfgSymbolPath: BreadcrumbsConfig<'on' | 'off' | 'last'>; @@ -56,7 +55,6 @@ export class BreadcrumbsModel { @IWorkspaceContextService private readonly _workspaceService: IWorkspaceContextService, @IOutlineService private readonly _outlineService: IOutlineService, ) { - this._cfgEnabled = BreadcrumbsConfig.IsEnabled.bindTo(configurationService); this._cfgFilePath = BreadcrumbsConfig.FilePath.bindTo(configurationService); this._cfgSymbolPath = BreadcrumbsConfig.SymbolPath.bindTo(configurationService); @@ -73,12 +71,11 @@ export class BreadcrumbsModel { } dispose(): void { - this._cfgEnabled.dispose(); + this._disposables.dispose(); this._cfgFilePath.dispose(); this._cfgSymbolPath.dispose(); this._currentOutline.dispose(); this._outlineDisposables.dispose(); - this._disposables.dispose(); this._onDidUpdate.dispose(); } diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts index 20305cf15cb..81fb175ec5b 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts @@ -30,7 +30,6 @@ import { localize } from 'vs/nls'; import { IOutline, IOutlineComparator } from 'vs/workbench/services/outline/browser/outline'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; interface ILayoutInfo { @@ -69,7 +68,6 @@ export abstract class BreadcrumbsPicker { @IInstantiationService protected readonly _instantiationService: IInstantiationService, @IThemeService protected readonly _themeService: IThemeService, @IConfigurationService protected readonly _configurationService: IConfigurationService, - @ITelemetryService private readonly _telemetryService: ITelemetryService, ) { this._domNode = document.createElement('div'); this._domNode.className = 'monaco-breadcrumbs-picker show-file-icons'; @@ -109,10 +107,6 @@ export abstract class BreadcrumbsPicker { if (!didReveal) { return; } - // send telemetry - interface OpenEvent { type: string } - interface OpenEventGDPR { type: { classification: 'SystemMetaData', purpose: 'FeatureInsight' } } - this._telemetryService.publicLog2('breadcrumbs/open', { type: element instanceof OutlineElement2 ? 'symbol' : 'file' }); })); this._disposables.add(this._tree.onDidChangeFocus(e => { this._previewDispoables.value = this._previewElement(e.elements[0]); @@ -167,7 +161,7 @@ class FileVirtualDelegate implements IListVirtualDelegate { - getId(element: IWorkspace | IWorkspaceFolder | IFileStat | URI): { toString(): string; } { + getId(element: IWorkspace | IWorkspaceFolder | IFileStat | URI): { toString(): string } { if (URI.isUri(element)) { return element.toString(); } else if (isWorkspace(element)) { @@ -226,7 +220,7 @@ class FileRenderer implements ITreeRenderer, index: number, templateData: IResourceLabel): void { - const fileDecorations = this._configService.getValue<{ colors: boolean, badges: boolean; }>('explorer.decorations'); + const fileDecorations = this._configService.getValue<{ colors: boolean; badges: boolean }>('explorer.decorations'); const { element } = node; let resource: URI; let fileKind: FileKind; @@ -253,7 +247,7 @@ class FileRenderer implements ITreeRenderer { - getKeyboardNavigationLabel(element: IWorkspaceFolder | IFileStat): { toString(): string; } { + getKeyboardNavigationLabel(element: IWorkspaceFolder | IFileStat): { toString(): string } { return element.name; } } @@ -354,9 +348,8 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker { @IConfigurationService configService: IConfigurationService, @IWorkspaceContextService private readonly _workspaceService: IWorkspaceContextService, @IEditorService private readonly _editorService: IEditorService, - @ITelemetryService telemetryService: ITelemetryService, ) { - super(parent, resource, instantiationService, themeService, configService, telemetryService); + super(parent, resource, instantiationService, themeService, configService); } _createTree(container: HTMLElement) { diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 228ace2329f..1153a8b9e54 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -7,10 +7,12 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { localize } from 'vs/nls'; import { URI } from 'vs/base/common/uri'; import { IEditorPaneRegistry, EditorPaneDescriptor } from 'vs/workbench/browser/editor'; +import { IEditorFactoryRegistry, EditorExtensions } from 'vs/workbench/common/editor'; import { - IEditorFactoryRegistry, TextCompareEditorActiveContext, ActiveEditorPinnedContext, EditorExtensions, EditorGroupEditorsCountContext, ActiveEditorStickyContext, ActiveEditorAvailableEditorIdsContext, - MultipleEditorGroupsContext, ActiveEditorDirtyContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, ActiveEditorGroupEmptyContext, EditorTabsVisibleContext -} from 'vs/workbench/common/editor'; + TextCompareEditorActiveContext, ActiveEditorPinnedContext, EditorGroupEditorsCountContext, ActiveEditorStickyContext, ActiveEditorAvailableEditorIdsContext, + MultipleEditorGroupsContext, ActiveEditorDirtyContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, + ActiveEditorGroupEmptyContext, EditorTabsVisibleContext +} from 'vs/workbench/common/contextkeys'; import { SideBySideEditorInput, SideBySideEditorInputSerializer } from 'vs/workbench/common/editor/sideBySideEditorInput'; import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor'; import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; @@ -27,7 +29,7 @@ import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, JoinTwoGroupsAction, RevertAndCloseEditorAction, NavigateBetweenGroupsAction, FocusActiveGroupAction, FocusFirstGroupAction, ResetGroupSizesAction, MaximizeGroupAction, MinimizeOtherGroupsAction, FocusPreviousGroup, FocusNextGroup, - CloseLeftEditorsInGroupAction, OpenNextEditor, OpenPreviousEditor, NavigateBackwardsAction, NavigateForwardAction, NavigateLastAction, ReopenClosedEditorAction, + CloseLeftEditorsInGroupAction, OpenNextEditor, OpenPreviousEditor, NavigateBackwardsAction, NavigateForwardAction, NavigatePreviousAction, ReopenClosedEditorAction, QuickAccessPreviousRecentlyUsedEditorInGroupAction, QuickAccessPreviousEditorFromHistoryAction, ShowAllEditorsByAppearanceAction, ClearEditorHistoryAction, MoveEditorRightInGroupAction, OpenNextEditorInGroup, OpenPreviousEditorInGroup, OpenNextRecentlyUsedEditorAction, OpenPreviousRecentlyUsedEditorAction, MoveEditorToPreviousGroupAction, MoveEditorToNextGroupAction, MoveEditorToFirstGroupAction, MoveEditorLeftInGroupAction, ClearRecentFilesAction, OpenLastEditorInGroup, @@ -36,13 +38,16 @@ import { JoinAllGroupsAction, FocusLeftGroup, FocusAboveGroup, FocusRightGroup, FocusBelowGroup, EditorLayoutSingleAction, EditorLayoutTwoColumnsAction, EditorLayoutThreeColumnsAction, EditorLayoutTwoByTwoGridAction, EditorLayoutTwoRowsAction, EditorLayoutThreeRowsAction, EditorLayoutTwoColumnsBottomAction, EditorLayoutTwoRowsRightAction, NewEditorGroupLeftAction, NewEditorGroupRightAction, NewEditorGroupAboveAction, NewEditorGroupBelowAction, SplitEditorOrthogonalAction, CloseEditorInAllGroupsAction, NavigateToLastEditLocationAction, ToggleGroupSizesAction, ShowAllEditorsByMostRecentlyUsedAction, - QuickAccessPreviousRecentlyUsedEditorAction, OpenPreviousRecentlyUsedEditorInGroupAction, OpenNextRecentlyUsedEditorInGroupAction, QuickAccessLeastRecentlyUsedEditorAction, QuickAccessLeastRecentlyUsedEditorInGroupAction, ReOpenInTextEditorAction, DuplicateGroupDownAction, DuplicateGroupLeftAction, DuplicateGroupRightAction, DuplicateGroupUpAction, ToggleEditorTypeAction, SplitEditorToAboveGroupAction, SplitEditorToBelowGroupAction, SplitEditorToFirstGroupAction, SplitEditorToLastGroupAction, SplitEditorToLeftGroupAction, SplitEditorToNextGroupAction, SplitEditorToPreviousGroupAction, SplitEditorToRightGroupAction + QuickAccessPreviousRecentlyUsedEditorAction, OpenPreviousRecentlyUsedEditorInGroupAction, OpenNextRecentlyUsedEditorInGroupAction, QuickAccessLeastRecentlyUsedEditorAction, QuickAccessLeastRecentlyUsedEditorInGroupAction, + ReOpenInTextEditorAction, DuplicateGroupDownAction, DuplicateGroupLeftAction, DuplicateGroupRightAction, DuplicateGroupUpAction, ToggleEditorTypeAction, SplitEditorToAboveGroupAction, SplitEditorToBelowGroupAction, + SplitEditorToFirstGroupAction, SplitEditorToLastGroupAction, SplitEditorToLeftGroupAction, SplitEditorToNextGroupAction, SplitEditorToPreviousGroupAction, SplitEditorToRightGroupAction, NavigateForwardInEditsAction, + NavigateBackwardsInEditsAction, NavigateForwardInNavigationsAction, NavigateBackwardsInNavigationsAction, NavigatePreviousInNavigationsAction, NavigatePreviousInEditsAction, NavigateToLastNavigationLocationAction } from 'vs/workbench/browser/parts/editor/editorActions'; import { - CLOSE_EDITORS_AND_GROUP_COMMAND_ID, CLOSE_EDITORS_IN_GROUP_COMMAND_ID, CLOSE_EDITORS_TO_THE_RIGHT_COMMAND_ID, CLOSE_EDITOR_COMMAND_ID, CLOSE_EDITOR_GROUP_COMMAND_ID, - CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID, CLOSE_PINNED_EDITOR_COMMAND_ID, CLOSE_SAVED_EDITORS_COMMAND_ID, GOTO_NEXT_CHANGE, GOTO_PREVIOUS_CHANGE, KEEP_EDITOR_COMMAND_ID, - PIN_EDITOR_COMMAND_ID, SHOW_EDITORS_IN_GROUP, SPLIT_EDITOR_DOWN, SPLIT_EDITOR_LEFT, SPLIT_EDITOR_RIGHT, SPLIT_EDITOR_UP, TOGGLE_DIFF_IGNORE_TRIM_WHITESPACE, - TOGGLE_DIFF_SIDE_BY_SIDE, TOGGLE_KEEP_EDITORS_COMMAND_ID, UNPIN_EDITOR_COMMAND_ID, setup as registerEditorCommands, REOPEN_WITH_COMMAND_ID, TOGGLE_LOCK_GROUP_COMMAND_ID, UNLOCK_GROUP_COMMAND_ID, SPLIT_EDITOR_IN_GROUP, JOIN_EDITOR_IN_GROUP, FOCUS_FIRST_SIDE_EDITOR, FOCUS_SECOND_SIDE_EDITOR, TOGGLE_SPLIT_EDITOR_IN_GROUP_LAYOUT + CLOSE_EDITORS_AND_GROUP_COMMAND_ID, CLOSE_EDITORS_IN_GROUP_COMMAND_ID, CLOSE_EDITORS_TO_THE_RIGHT_COMMAND_ID, CLOSE_EDITOR_COMMAND_ID, CLOSE_EDITOR_GROUP_COMMAND_ID, CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID, + CLOSE_PINNED_EDITOR_COMMAND_ID, CLOSE_SAVED_EDITORS_COMMAND_ID, GOTO_NEXT_CHANGE, GOTO_PREVIOUS_CHANGE, KEEP_EDITOR_COMMAND_ID, PIN_EDITOR_COMMAND_ID, SHOW_EDITORS_IN_GROUP, SPLIT_EDITOR_DOWN, SPLIT_EDITOR_LEFT, + SPLIT_EDITOR_RIGHT, SPLIT_EDITOR_UP, TOGGLE_DIFF_IGNORE_TRIM_WHITESPACE, TOGGLE_DIFF_SIDE_BY_SIDE, TOGGLE_KEEP_EDITORS_COMMAND_ID, UNPIN_EDITOR_COMMAND_ID, setup as registerEditorCommands, REOPEN_WITH_COMMAND_ID, + TOGGLE_LOCK_GROUP_COMMAND_ID, UNLOCK_GROUP_COMMAND_ID, SPLIT_EDITOR_IN_GROUP, JOIN_EDITOR_IN_GROUP, FOCUS_FIRST_SIDE_EDITOR, FOCUS_SECOND_SIDE_EDITOR, TOGGLE_SPLIT_EDITOR_IN_GROUP_LAYOUT } from 'vs/workbench/browser/parts/editor/editorCommands'; import { inQuickPickContext, getQuickNavigateHandler } from 'vs/workbench/browser/quickaccess'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -241,8 +246,15 @@ registry.registerWorkbenchAction(SyncActionDescriptor.from(NewEditorGroupAboveAc registry.registerWorkbenchAction(SyncActionDescriptor.from(NewEditorGroupBelowAction), 'View: New Editor Group Below', CATEGORIES.View.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateForwardAction, { primary: 0, win: { primary: KeyMod.Alt | KeyCode.RightArrow }, mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.Minus }, linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Minus } }), 'Go Forward'); registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateBackwardsAction, { primary: 0, win: { primary: KeyMod.Alt | KeyCode.LeftArrow }, mac: { primary: KeyMod.WinCtrl | KeyCode.Minus }, linux: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.Minus } }), 'Go Back'); +registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigatePreviousAction), 'Go Previous'); +registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateForwardInEditsAction), 'Go Forward in Edit Locations'); +registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateBackwardsInEditsAction), 'Go Back in Edit Locations'); +registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigatePreviousInEditsAction), 'Go Previous in Edit Locations'); registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateToLastEditLocationAction, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyCode.KeyQ) }), 'Go to Last Edit Location'); -registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateLastAction), 'Go Last'); +registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateForwardInNavigationsAction), 'Go Forward in Navigation Locations'); +registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateBackwardsInNavigationsAction), 'Go Back in Navigation Locations'); +registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigatePreviousInNavigationsAction), 'Go Previous in Navigation Locations'); +registry.registerWorkbenchAction(SyncActionDescriptor.from(NavigateToLastNavigationLocationAction), 'Go to Last Navigation Location'); registry.registerWorkbenchAction(SyncActionDescriptor.from(ClearEditorHistoryAction), 'Clear Editor History'); registry.registerWorkbenchAction(SyncActionDescriptor.from(RevertAndCloseEditorAction), 'View: Revert and Close Editor', CATEGORIES.View.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(EditorLayoutSingleAction), 'View: Single Column Editor Layout', CATEGORIES.View.value); @@ -339,7 +351,7 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: CLOSE_SAVED_EDI MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: TOGGLE_KEEP_EDITORS_COMMAND_ID, title: localize('toggleKeepEditors', "Keep Editors Open"), toggled: ContextKeyExpr.not('config.workbench.editor.enablePreview') }, group: '7_settings', order: 10 }); MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: TOGGLE_LOCK_GROUP_COMMAND_ID, title: localize('lockGroup', "Lock Group"), toggled: ActiveEditorGroupLockedContext }, group: '8_lock', order: 10, when: MultipleEditorGroupsContext }); -interface IEditorToolItem { id: string; title: string; icon?: { dark?: URI; light?: URI; } | ThemeIcon; } +interface IEditorToolItem { id: string; title: string; icon?: { dark?: URI; light?: URI } | ThemeIcon } function appendEditorToolItem(primary: IEditorToolItem, when: ContextKeyExpression | undefined, order: number, alternative?: IEditorToolItem, precondition?: ContextKeyExpression | undefined): void { const item: IMenuItem = { diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 8a788971951..0716208ce63 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -10,7 +10,7 @@ import { IEditorIdentifier, IEditorCommandsContext, CloseDirection, SaveReason, import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; -import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { GoFilter, IHistoryService } from 'vs/workbench/services/history/common/history'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { CLOSE_EDITOR_COMMAND_ID, MOVE_ACTIVE_EDITOR_COMMAND_ID, ActiveEditorMoveCopyArguments, SPLIT_EDITOR_LEFT, SPLIT_EDITOR_RIGHT, SPLIT_EDITOR_UP, SPLIT_EDITOR_DOWN, splitEditor, LAYOUT_EDITOR_GROUPS_COMMAND_ID, UNPIN_EDITOR_COMMAND_ID, COPY_ACTIVE_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; @@ -527,7 +527,7 @@ export class CloseLeftEditorsInGroupAction extends Action { } } - private getTarget(context?: IEditorIdentifier): { editor: EditorInput | null, group: IEditorGroup | undefined } { + private getTarget(context?: IEditorIdentifier): { editor: EditorInput | null; group: IEditorGroup | undefined } { if (context) { return { editor: context.editor, group: this.editorGroupService.getGroup(context.groupId) }; } @@ -1260,28 +1260,108 @@ export class OpenLastEditorInGroup extends AbstractNavigateEditorAction { export class NavigateForwardAction extends Action { static readonly ID = 'workbench.action.navigateForward'; - static readonly LABEL = localize('navigateNext', "Go Forward"); + static readonly LABEL = localize('navigateForward', "Go Forward"); - constructor(id: string, label: string, @IHistoryService private readonly historyService: IHistoryService) { + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { super(id, label); } override async run(): Promise { - this.historyService.forward(); + await this.historyService.goForward(GoFilter.NONE); } } export class NavigateBackwardsAction extends Action { static readonly ID = 'workbench.action.navigateBack'; - static readonly LABEL = localize('navigatePrevious', "Go Back"); + static readonly LABEL = localize('navigateBack', "Go Back"); - constructor(id: string, label: string, @IHistoryService private readonly historyService: IHistoryService) { + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { super(id, label); } override async run(): Promise { - this.historyService.back(); + await this.historyService.goBack(GoFilter.NONE); + } +} + +export class NavigatePreviousAction extends Action { + + static readonly ID = 'workbench.action.navigateLast'; + static readonly LABEL = localize('navigatePrevious', "Go Previous"); + + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { + super(id, label); + } + + override async run(): Promise { + await this.historyService.goPrevious(GoFilter.NONE); + } +} + +export class NavigateForwardInEditsAction extends Action { + + static readonly ID = 'workbench.action.navigateForwardInEditLocations'; + static readonly LABEL = localize('navigateForwardInEdits', "Go Forward in Edit Locations"); + + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { + super(id, label); + } + + override async run(): Promise { + await this.historyService.goForward(GoFilter.EDITS); + } +} + +export class NavigateBackwardsInEditsAction extends Action { + + static readonly ID = 'workbench.action.navigateBackInEditLocations'; + static readonly LABEL = localize('navigateBackInEdits', "Go Back in Edit Locations"); + + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { + super(id, label); + } + + override async run(): Promise { + await this.historyService.goBack(GoFilter.EDITS); + } +} + +export class NavigatePreviousInEditsAction extends Action { + + static readonly ID = 'workbench.action.navigatePreviousInEditLocations'; + static readonly LABEL = localize('navigatePreviousInEdits', "Go Previous in Edit Locations"); + + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { + super(id, label); + } + + override async run(): Promise { + await this.historyService.goPrevious(GoFilter.EDITS); } } @@ -1290,26 +1370,88 @@ export class NavigateToLastEditLocationAction extends Action { static readonly ID = 'workbench.action.navigateToLastEditLocation'; static readonly LABEL = localize('navigateToLastEditLocation', "Go to Last Edit Location"); - constructor(id: string, label: string, @IHistoryService private readonly historyService: IHistoryService) { + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { super(id, label); } override async run(): Promise { - this.historyService.openLastEditLocation(); + await this.historyService.goLast(GoFilter.EDITS); } } -export class NavigateLastAction extends Action { +export class NavigateForwardInNavigationsAction extends Action { - static readonly ID = 'workbench.action.navigateLast'; - static readonly LABEL = localize('navigateLast', "Go Last"); + static readonly ID = 'workbench.action.navigateForwardInNavigationLocations'; + static readonly LABEL = localize('navigateForwardInNavigations', "Go Forward in Navigation Locations"); - constructor(id: string, label: string, @IHistoryService private readonly historyService: IHistoryService) { + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { super(id, label); } override async run(): Promise { - this.historyService.last(); + await this.historyService.goForward(GoFilter.NAVIGATION); + } +} + +export class NavigateBackwardsInNavigationsAction extends Action { + + static readonly ID = 'workbench.action.navigateBackInNavigationLocations'; + static readonly LABEL = localize('navigateBackInNavigations', "Go Back in Navigation Locations"); + + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { + super(id, label); + } + + override async run(): Promise { + await this.historyService.goBack(GoFilter.NAVIGATION); + } +} + +export class NavigatePreviousInNavigationsAction extends Action { + + static readonly ID = 'workbench.action.navigatePreviousInNavigationLocations'; + static readonly LABEL = localize('navigatePreviousInNavigationLocations', "Go Previous in Navigation Locations"); + + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { + super(id, label); + } + + override async run(): Promise { + await this.historyService.goPrevious(GoFilter.NAVIGATION); + } +} + +export class NavigateToLastNavigationLocationAction extends Action { + + static readonly ID = 'workbench.action.navigateToLastNavigationLocation'; + static readonly LABEL = localize('navigateToLastNavigationLocation', "Go to Last Navigation Location"); + + constructor( + id: string, + label: string, + @IHistoryService private readonly historyService: IHistoryService + ) { + super(id, label); + } + + override async run(): Promise { + await this.historyService.goLast(GoFilter.NAVIGATION); } } @@ -1327,7 +1469,7 @@ export class ReopenClosedEditorAction extends Action { } override async run(): Promise { - this.historyService.reopenLastClosedEditor(); + await this.historyService.reopenLastClosedEditor(); } } diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index ad93a12afc5..c1863ed8dc5 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -7,7 +7,8 @@ import { localize } from 'vs/nls'; import { isObject, isString, isUndefined, isNumber, withNullAsUndefined } from 'vs/base/common/types'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { TextCompareEditorVisibleContext, IEditorIdentifier, IEditorCommandsContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, CloseDirection, IVisibleEditorPane, ActiveEditorStickyContext, EditorsOrder, EditorInputCapabilities, isEditorIdentifier, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, GroupIdentifier, TextCompareEditorActiveContext, SideBySideEditorActiveContext, isEditorInputWithOptionsAndGroup, IUntitledTextResourceEditorInput } from 'vs/workbench/common/editor'; +import { IEditorIdentifier, IEditorCommandsContext, CloseDirection, IVisibleEditorPane, EditorsOrder, EditorInputCapabilities, isEditorIdentifier, GroupIdentifier, isEditorInputWithOptionsAndGroup, IUntitledTextResourceEditorInput } from 'vs/workbench/common/editor'; +import { TextCompareEditorVisibleContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, ActiveEditorStickyContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, TextCompareEditorActiveContext, SideBySideEditorActiveContext } from 'vs/workbench/common/contextkeys'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { EditorGroupColumn, columnToEditorGroup } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { ACTIVE_GROUP_TYPE, IEditorService, SIDE_GROUP, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService'; @@ -26,7 +27,7 @@ import { CommandsRegistry, ICommandHandler, ICommandService } from 'vs/platform/ import { MenuRegistry, MenuId, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { ActiveGroupEditorsByMostRecentlyUsedQuickAccess } from 'vs/workbench/browser/parts/editor/editorQuickAccess'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { IOpenerService, matchesScheme } from 'vs/platform/opener/common/opener'; import { EditorResolution, IEditorOptions, IResourceEditorInput, ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { Schemas } from 'vs/base/common/network'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; @@ -491,22 +492,23 @@ function registerOpenEditorAPICommands(): void { } }); - CommandsRegistry.registerCommand(API_OPEN_EDITOR_COMMAND_ID, async function (accessor: ServicesAccessor, resourceArg: UriComponents, columnAndOptions?: [EditorGroupColumn?, ITextEditorOptions?], label?: string, context?: IOpenEvent) { + CommandsRegistry.registerCommand(API_OPEN_EDITOR_COMMAND_ID, async function (accessor: ServicesAccessor, resourceArg: UriComponents | string, columnAndOptions?: [EditorGroupColumn?, ITextEditorOptions?], label?: string, context?: IOpenEvent) { const editorService = accessor.get(IEditorService); const editorGroupService = accessor.get(IEditorGroupsService); const openerService = accessor.get(IOpenerService); const pathService = accessor.get(IPathService); - const resource = URI.revive(resourceArg); + const resourceOrString = typeof resourceArg === 'string' ? resourceArg : URI.revive(resourceArg); const [columnArg, optionsArg] = columnAndOptions ?? []; // use editor options or editor view column or resource scheme // as a hint to use the editor service for opening directly - if (optionsArg || typeof columnArg === 'number' || resource.scheme === Schemas.untitled) { + if (optionsArg || typeof columnArg === 'number' || matchesScheme(resourceOrString, Schemas.untitled)) { const [options, column] = mixinContext(context, optionsArg, columnArg); + const resource = URI.isUri(resourceOrString) ? resourceOrString : URI.parse(resourceOrString); let input: IResourceEditorInput | IUntitledTextResourceEditorInput; - if (resource.scheme === Schemas.untitled && resource.path.length > 1) { + if (matchesScheme(resource, Schemas.untitled) && resource.path.length > 1) { // special case for untitled: we are getting a resource with meaningful // path from an extension to use for the untitled editor. as such, we // have to assume it as an associated resource to use when saving. we @@ -523,13 +525,13 @@ function registerOpenEditorAPICommands(): void { } // do not allow to execute commands from here - else if (resource.scheme === 'command') { + else if (matchesScheme(resourceOrString, Schemas.command)) { return; } // finally, delegate to opener service else { - await openerService.open(resource, { openToSide: context?.sideBySide, editorOptions: context?.editorOptions }); + await openerService.open(resourceOrString, { openToSide: context?.sideBySide, editorOptions: context?.editorOptions }); } }); @@ -1025,7 +1027,7 @@ function registerSplitEditorInGroupCommands(): void { constructor() { super({ id: SPLIT_EDITOR_IN_GROUP, - title: localize('splitEditorInGroup', "Split Editor in Group"), + title: { value: localize('splitEditorInGroup', "Split Editor in Group"), original: 'Split Editor in Group' }, category: CATEGORIES.View, precondition: ActiveEditorCanSplitInGroupContext, f1: true, @@ -1071,7 +1073,7 @@ function registerSplitEditorInGroupCommands(): void { constructor() { super({ id: JOIN_EDITOR_IN_GROUP, - title: localize('joinEditorInGroup', "Join Editor in Group"), + title: { value: localize('joinEditorInGroup', "Join Editor in Group"), original: 'Join Editor in Group' }, category: CATEGORIES.View, precondition: SideBySideEditorActiveContext, f1: true, @@ -1091,7 +1093,7 @@ function registerSplitEditorInGroupCommands(): void { constructor() { super({ id: TOGGLE_SPLIT_EDITOR_IN_GROUP, - title: localize('toggleJoinEditorInGroup', "Toggle Split Editor in Group"), + title: { value: localize('toggleJoinEditorInGroup', "Toggle Split Editor in Group"), original: 'Toggle Split Editor in Group' }, category: CATEGORIES.View, precondition: ContextKeyExpr.or(ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext), f1: true @@ -1113,7 +1115,7 @@ function registerSplitEditorInGroupCommands(): void { constructor() { super({ id: TOGGLE_SPLIT_EDITOR_IN_GROUP_LAYOUT, - title: localize('toggleSplitEditorInGroupLayout', "Toggle Split Editor in Group Layout"), + title: { value: localize('toggleSplitEditorInGroupLayout', "Toggle Split Editor in Group Layout"), original: 'Toggle Split Editor in Group Layout' }, category: CATEGORIES.View, precondition: SideBySideEditorActiveContext, f1: true @@ -1141,7 +1143,7 @@ function registerFocusSideEditorsCommands(): void { constructor() { super({ id: FOCUS_FIRST_SIDE_EDITOR, - title: localize('focusLeftSideEditor', "Focus First Side in Active Editor"), + title: { value: localize('focusLeftSideEditor', "Focus First Side in Active Editor"), original: 'Focus First Side in Active Editor' }, category: CATEGORIES.View, precondition: ContextKeyExpr.or(SideBySideEditorActiveContext, TextCompareEditorActiveContext), f1: true @@ -1164,7 +1166,7 @@ function registerFocusSideEditorsCommands(): void { constructor() { super({ id: FOCUS_SECOND_SIDE_EDITOR, - title: localize('focusRightSideEditor', "Focus Second Side in Active Editor"), + title: { value: localize('focusRightSideEditor', "Focus Second Side in Active Editor"), original: 'Focus Second Side in Active Editor' }, category: CATEGORIES.View, precondition: ContextKeyExpr.or(SideBySideEditorActiveContext, TextCompareEditorActiveContext), f1: true @@ -1187,7 +1189,7 @@ function registerFocusSideEditorsCommands(): void { constructor() { super({ id: FOCUS_OTHER_SIDE_EDITOR, - title: localize('focusOtherSideEditor', "Focus Other Side in Active Editor"), + title: { value: localize('focusOtherSideEditor', "Focus Other Side in Active Editor"), original: 'Focus Other Side in Active Editor' }, category: CATEGORIES.View, precondition: ContextKeyExpr.or(SideBySideEditorActiveContext, TextCompareEditorActiveContext), f1: true @@ -1252,7 +1254,7 @@ function registerOtherEditorCommands(): void { constructor() { super({ id: TOGGLE_LOCK_GROUP_COMMAND_ID, - title: localize('toggleEditorGroupLock', "Toggle Editor Group Lock"), + title: { value: localize('toggleEditorGroupLock', "Toggle Editor Group Lock"), original: 'Toggle Editor Group Lock' }, category: CATEGORIES.View, precondition: MultipleEditorGroupsContext, f1: true @@ -1267,7 +1269,7 @@ function registerOtherEditorCommands(): void { constructor() { super({ id: LOCK_GROUP_COMMAND_ID, - title: localize('lockEditorGroup', "Lock Editor Group"), + title: { value: localize('lockEditorGroup', "Lock Editor Group"), original: 'Lock Editor Group' }, category: CATEGORIES.View, precondition: ContextKeyExpr.and(MultipleEditorGroupsContext, ActiveEditorGroupLockedContext.toNegated()), f1: true @@ -1282,7 +1284,7 @@ function registerOtherEditorCommands(): void { constructor() { super({ id: UNLOCK_GROUP_COMMAND_ID, - title: localize('unlockEditorGroup', "Unlock Editor Group"), + title: { value: localize('unlockEditorGroup', "Unlock Editor Group"), original: 'Unlock Editor Group' }, precondition: ContextKeyExpr.and(MultipleEditorGroupsContext, ActiveEditorGroupLockedContext), category: CATEGORIES.View, f1: true @@ -1345,7 +1347,7 @@ function registerOtherEditorCommands(): void { }); } -function getEditorsContext(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): { editors: IEditorCommandsContext[], groups: Array } { +function getEditorsContext(accessor: ServicesAccessor, resourceOrContext?: URI | IEditorCommandsContext, context?: IEditorCommandsContext): { editors: IEditorCommandsContext[]; groups: Array } { const editorGroupService = accessor.get(IEditorGroupsService); const listService = accessor.get(IListService); @@ -1382,7 +1384,7 @@ function getCommandsContext(resourceOrContext?: URI | IEditorCommandsContext, co return undefined; } -function resolveCommandsContext(editorGroupService: IEditorGroupsService, context?: IEditorCommandsContext): { group: IEditorGroup, editor?: EditorInput } { +function resolveCommandsContext(editorGroupService: IEditorGroupsService, context?: IEditorCommandsContext): { group: IEditorGroup; editor?: EditorInput } { // Resolve from context let group = context && typeof context.groupId === 'number' ? editorGroupService.getGroup(context.groupId) : undefined; diff --git a/src/vs/workbench/browser/parts/editor/editorConfiguration.ts b/src/vs/workbench/browser/parts/editor/editorConfiguration.ts index 5812b5340e3..07c01315c59 100644 --- a/src/vs/workbench/browser/parts/editor/editorConfiguration.ts +++ b/src/vs/workbench/browser/parts/editor/editorConfiguration.ts @@ -42,7 +42,7 @@ export class DynamicEditorGroupAutoLockConfiguration extends Disposable implemen // (atleast 20 times) while the extensions are getting registered. // As such push out the dynamic editor auto lock configuration // until after extensions registered. - (async ()=> { + (async () => { await extensionService.whenInstalledExtensionsRegistered(); this.updateConfiguration(); diff --git a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts index 71c66435f04..37ac0c7c64e 100644 --- a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts +++ b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts @@ -4,13 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/editordroptarget'; -import { LocalSelectionTransfer, DraggedEditorIdentifier, ResourcesDropHandler, DraggedEditorGroupIdentifier, DragAndDropObserver, containsDragType, CodeDataTransfers, extractFilesDropData } from 'vs/workbench/browser/dnd'; +import { LocalSelectionTransfer, DraggedEditorIdentifier, ResourcesDropHandler, DraggedEditorGroupIdentifier, DragAndDropObserver, containsDragType, CodeDataTransfers, extractFilesDropData, DraggedTreeItemsIdentifier, extractTreeDropData } from 'vs/workbench/browser/dnd'; import { addDisposableListener, EventType, EventHelper, isAncestor } from 'vs/base/browser/dom'; import { IEditorGroupsAccessor, IEditorGroupView, fillActiveEditorViewState } from 'vs/workbench/browser/parts/editor/editor'; import { EDITOR_DRAG_AND_DROP_BACKGROUND } from 'vs/workbench/common/theme'; import { IThemeService, Themable } from 'vs/platform/theme/common/themeService'; import { activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { IEditorIdentifier, EditorInputCapabilities } from 'vs/workbench/common/editor'; +import { IEditorIdentifier, EditorInputCapabilities, IUntypedEditorInput } from 'vs/workbench/common/editor'; import { isMacintosh, isWeb } from 'vs/base/common/platform'; import { GroupDirection, IEditorGroupsService, MergeGroupMode } from 'vs/workbench/services/editor/common/editorGroupsService'; import { toDisposable } from 'vs/base/common/lifecycle'; @@ -21,6 +21,8 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { assertIsDefined, assertAllDefined } from 'vs/base/common/types'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; +import { ITreeViewsDragAndDropService } from 'vs/workbench/services/views/common/treeViewsDragAndDropService'; +import { ITreeDataTransfer } from 'vs/workbench/common/views'; interface IDropOperation { splitDirection?: GroupDirection; @@ -40,6 +42,7 @@ class DropOverlay extends Themable { private readonly editorTransfer = LocalSelectionTransfer.getInstance(); private readonly groupTransfer = LocalSelectionTransfer.getInstance(); + private readonly treeItemsTransfer = LocalSelectionTransfer.getInstance(); constructor( private accessor: IEditorGroupsAccessor, @@ -47,7 +50,8 @@ class DropOverlay extends Themable { @IThemeService themeService: IThemeService, @IInstantiationService private instantiationService: IInstantiationService, @IEditorService private readonly editorService: IEditorService, - @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService + @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, + @ITreeViewsDragAndDropService private readonly treeViewsDragAndDropService: ITreeViewsDragAndDropService ) { super(themeService); @@ -202,7 +206,7 @@ class DropOverlay extends Themable { return undefined; } - private handleDrop(event: DragEvent, splitDirection?: GroupDirection): void { + private async handleDrop(event: DragEvent, splitDirection?: GroupDirection): Promise { // Determine target group const ensureTargetGroup = () => { @@ -292,6 +296,34 @@ class DropOverlay extends Themable { } } + // Check for tree items + else if (this.treeItemsTransfer.hasData(DraggedTreeItemsIdentifier.prototype)) { + const data = this.treeItemsTransfer.getData(DraggedTreeItemsIdentifier.prototype); + if (Array.isArray(data)) { + const editors: IUntypedEditorInput[] = []; + for (const id of data) { + const dataTransferItem = await this.treeViewsDragAndDropService.removeDragOperationTransfer(id.identifier); + if (dataTransferItem) { + const extractedDropData = await extractTreeDropData(dataTransferItem); + editors.push(...extractedDropData.map(editor => { + return { + ...editor, + resource: editor.resource, + options: { + ...editor.options, + pinned: true + } + }; + })); + } + } + + this.editorService.openEditors(editors, ensureTargetGroup(), { validateTrust: true }); + } + + this.treeItemsTransfer.clearData(DraggedTreeItemsIdentifier.prototype); + } + // Web: check for file transfer else if (isWeb && containsDragType(event, DataTransfers.FILES)) { let targetGroup: IEditorGroupView | undefined = undefined; @@ -451,7 +483,7 @@ class DropOverlay extends Themable { this.currentDropOperation = { splitDirection }; } - private doPositionOverlay(options: { top: string, left: string, width: string, height: string }): void { + private doPositionOverlay(options: { top: string; left: string; width: string; height: string }): void { const [container, overlay] = assertAllDefined(this.container, this.overlay); // Container diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 7d2c5f327e8..5ad34a3c872 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -5,7 +5,8 @@ import 'vs/css!./media/editorgroupview'; import { EditorGroupModel, IEditorOpenOptions, IGroupModelChangeEvent, ISerializedEditorGroupModel, isGroupEditorCloseEvent, isGroupEditorOpenEvent, isSerializedEditorGroupModel } from 'vs/workbench/common/editor/editorGroupModel'; -import { GroupIdentifier, CloseDirection, IEditorCloseEvent, ActiveEditorDirtyContext, IEditorPane, EditorGroupEditorsCountContext, SaveReason, IEditorPartOptionsChangeEvent, EditorsOrder, IVisibleEditorPane, ActiveEditorStickyContext, ActiveEditorPinnedContext, EditorResourceAccessor, EditorInputCapabilities, IUntypedEditorInput, DEFAULT_EDITOR_ASSOCIATION, ActiveEditorGroupLockedContext, SideBySideEditor, EditorCloseContext, IEditorWillMoveEvent, IEditorWillOpenEvent, IMatchEditorOptions, GroupModelChangeKind, IActiveEditorChangeEvent, IFindEditorOptions } from 'vs/workbench/common/editor'; +import { GroupIdentifier, CloseDirection, IEditorCloseEvent, IEditorPane, SaveReason, IEditorPartOptionsChangeEvent, EditorsOrder, IVisibleEditorPane, EditorResourceAccessor, EditorInputCapabilities, IUntypedEditorInput, DEFAULT_EDITOR_ASSOCIATION, SideBySideEditor, EditorCloseContext, IEditorWillMoveEvent, IEditorWillOpenEvent, IMatchEditorOptions, GroupModelChangeKind, IActiveEditorChangeEvent, IFindEditorOptions } from 'vs/workbench/common/editor'; +import { ActiveEditorGroupLockedContext, ActiveEditorDirtyContext, EditorGroupEditorsCountContext, ActiveEditorStickyContext, ActiveEditorPinnedContext } from 'vs/workbench/common/contextkeys'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; import { Event, Emitter, Relay } from 'vs/base/common/event'; @@ -338,7 +339,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { // Toolbar actions const containerToolbarMenu = this._register(this.menuService.createMenu(MenuId.EmptyEditorGroup, this.scopedContextKeyService)); const updateContainerToolbar = () => { - const actions: { primary: IAction[], secondary: IAction[]; } = { primary: [], secondary: [] }; + const actions: { primary: IAction[]; secondary: IAction[] } = { primary: [], secondary: [] }; this.containerToolBarMenuDisposable.value = combinedDisposable( @@ -376,7 +377,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { } // Find target anchor - let anchor: HTMLElement | { x: number, y: number; } = this.element; + let anchor: HTMLElement | { x: number; y: number } = this.element; if (e instanceof MouseEvent) { const event = new StandardMouseEvent(e); anchor = { x: event.posx, y: event.posy }; @@ -860,7 +861,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { return this.model.contains(candidate, options); } - getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean; }): EditorInput[] { + getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): EditorInput[] { return this.model.getEditors(order, options); } @@ -1058,7 +1059,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { return showEditorResult; } - private doShowEditor(editor: EditorInput, context: { active: boolean, isNew: boolean; }, options?: IEditorOptions, internalOptions?: IInternalEditorOpenOptions): Promise { + private doShowEditor(editor: EditorInput, context: { active: boolean; isNew: boolean }, options?: IEditorOptions, internalOptions?: IInternalEditorOpenOptions): Promise { // Show in editor control if the active editor changed let openEditorPromise: Promise; @@ -1185,7 +1186,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { //#region openEditors() - async openEditors(editors: { editor: EditorInput, options?: IEditorOptions; }[]): Promise { + async openEditors(editors: { editor: EditorInput; options?: IEditorOptions }[]): Promise { // Guard against invalid editors. Disposed editors // should never open because they emit no events @@ -1237,7 +1238,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { //#region moveEditor() - moveEditors(editors: { editor: EditorInput, options?: IEditorOptions; }[], target: EditorGroupView): void { + moveEditors(editors: { editor: EditorInput; options?: IEditorOptions }[], target: EditorGroupView): void { // Optimization: knowing that we move many editors, we // delay the title update to a later point for this group @@ -1336,7 +1337,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { //#region copyEditor() - copyEditors(editors: { editor: EditorInput, options?: IEditorOptions; }[], target: EditorGroupView): void { + copyEditors(editors: { editor: EditorInput; options?: IEditorOptions }[], target: EditorGroupView): void { // Optimization: knowing that we move many editors, we // delay the title update to a later point for this group @@ -1548,7 +1549,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { return this.handleDirtyClosing(editors); } - private async doHandleDirtyClosing(editor: EditorInput, options?: { skipAutoSave: boolean; }): Promise { + private async doHandleDirtyClosing(editor: EditorInput, options?: { skipAutoSave: boolean }): Promise { if (!editor.isDirty() || editor.isSaving()) { return false; // editor must be dirty and not saving } @@ -1941,7 +1942,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { get maximumWidth(): number { return this.editorPane.maximumWidth; } get maximumHeight(): number { return this.editorPane.maximumHeight; } - private _onDidChange = this._register(new Relay<{ width: number; height: number; } | undefined>()); + private _onDidChange = this._register(new Relay<{ width: number; height: number } | undefined>()); readonly onDidChange = this._onDidChange.event; layout(width: number, height: number): void { diff --git a/src/vs/workbench/browser/parts/editor/editorPanes.ts b/src/vs/workbench/browser/parts/editor/editorPanes.ts index 045805ca565..4558ce5618e 100644 --- a/src/vs/workbench/browser/parts/editor/editorPanes.ts +++ b/src/vs/workbench/browser/parts/editor/editorPanes.ts @@ -62,7 +62,7 @@ export class EditorPanes extends Disposable { private readonly _onDidFocus = this._register(new Emitter()); readonly onDidFocus = this._onDidFocus.event; - private _onDidChangeSizeConstraints = this._register(new Emitter<{ width: number; height: number; } | undefined>()); + private _onDidChangeSizeConstraints = this._register(new Emitter<{ width: number; height: number } | undefined>()); readonly onDidChangeSizeConstraints = this._onDidChangeSizeConstraints.event; //#endregion @@ -251,7 +251,7 @@ export class EditorPanes extends Disposable { this._onDidChangeSizeConstraints.fire(undefined); } - private async doSetInput(editorPane: EditorPane, editor: EditorInput, options: IEditorOptions | undefined, context: IEditorOpenContext): Promise<{ changed: boolean, cancelled: boolean }> { + private async doSetInput(editorPane: EditorPane, editor: EditorInput, options: IEditorOptions | undefined, context: IEditorOpenContext): Promise<{ changed: boolean; cancelled: boolean }> { // If the input did not change, return early and only // apply the options unless the options instruct us to diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index 4b8e0a2acef..0d0753f3385 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -49,7 +49,7 @@ class GridWidgetView implements IView { get minimumHeight(): number { return this.gridWidget ? this.gridWidget.minimumHeight : 0; } get maximumHeight(): number { return this.gridWidget ? this.gridWidget.maximumHeight : Number.POSITIVE_INFINITY; } - private _onDidChange = new Relay<{ width: number; height: number; } | undefined>(); + private _onDidChange = new Relay<{ width: number; height: number } | undefined>(); readonly onDidChange = this._onDidChange.event; private _gridWidget: Grid | undefined; @@ -115,9 +115,9 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro private readonly _onDidMoveGroup = this._register(new Emitter()); readonly onDidMoveGroup = this._onDidMoveGroup.event; - private readonly onDidSetGridWidget = this._register(new Emitter<{ width: number; height: number; } | undefined>()); + private readonly onDidSetGridWidget = this._register(new Emitter<{ width: number; height: number } | undefined>()); - private readonly _onDidChangeSizeConstraints = this._register(new Relay<{ width: number; height: number; } | undefined>()); + private readonly _onDidChangeSizeConstraints = this._register(new Relay<{ width: number; height: number } | undefined>()); readonly onDidChangeSizeConstraints = Event.any(this.onDidSetGridWidget.event, this._onDidChangeSizeConstraints.event); private readonly _onDidChangeEditorPartOptions = this._register(new Emitter()); @@ -336,13 +336,13 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro return groupView; } - getSize(group: IEditorGroupView | GroupIdentifier): { width: number, height: number } { + getSize(group: IEditorGroupView | GroupIdentifier): { width: number; height: number } { const groupView = this.assertGroupView(group); return this.gridWidget.getViewSize(groupView); } - setSize(group: IEditorGroupView | GroupIdentifier, size: { width: number, height: number }): void { + setSize(group: IEditorGroupView | GroupIdentifier, size: { width: number; height: number }): void { const groupView = this.assertGroupView(group); this.gridWidget.resizeView(groupView, size); @@ -833,7 +833,7 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro get minimumHeight(): number { return Math.min(this.centeredLayoutWidget.minimumHeight, this.layoutService.getMaximumEditorDimensions().height); } get maximumHeight(): number { return this.centeredLayoutWidget.maximumHeight; } - readonly snap = true; + get snap(): boolean { return this.layoutService.getPanelAlignment() === 'center'; } override get onDidChange(): Event { return Event.any(this.centeredLayoutWidget.onDidChange, this.onDidSetGridWidget.event); } readonly priority: LayoutPriority = LayoutPriority.High; @@ -903,7 +903,7 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro let lastOpenHorizontalPosition: Position | undefined; let lastOpenVerticalPosition: Position | undefined; const openPartAtPosition = (position: Position) => { - if (!this.layoutService.isVisible(Parts.PANEL_PART) && position === Position.BOTTOM) { + if (!this.layoutService.isVisible(Parts.PANEL_PART) && position === this.layoutService.getPanelPosition()) { this.layoutService.setPartHidden(false, Parts.PANEL_PART); } else if (!this.layoutService.isVisible(Parts.AUXILIARYBAR_PART) && position === (this.layoutService.getSideBarPosition() === Position.RIGHT ? Position.LEFT : Position.RIGHT)) { this.layoutService.setPartHidden(false, Parts.AUXILIARYBAR_PART); diff --git a/src/vs/workbench/browser/parts/editor/editorPlaceholder.ts b/src/vs/workbench/browser/parts/editor/editorPlaceholder.ts index ed580266550..264dbcf122c 100644 --- a/src/vs/workbench/browser/parts/editor/editorPlaceholder.ts +++ b/src/vs/workbench/browser/parts/editor/editorPlaceholder.ts @@ -18,8 +18,7 @@ import { DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/ import { IStorageService } from 'vs/platform/storage/common/storage'; import { assertIsDefined, assertAllDefined } from 'vs/base/common/types'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { EditorOpenContext, IEditorOptions } from 'vs/platform/editor/common/editor'; import { EditorPaneDescriptor } from 'vs/workbench/browser/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/browser/parts/editor/editorQuickAccess.ts b/src/vs/workbench/browser/parts/editor/editorQuickAccess.ts index 38ae51a2dd2..5b6bbdd10a1 100644 --- a/src/vs/workbench/browser/parts/editor/editorQuickAccess.ts +++ b/src/vs/workbench/browser/parts/editor/editorQuickAccess.ts @@ -11,7 +11,7 @@ import { IEditorGroupsService, GroupsOrder } from 'vs/workbench/services/editor/ import { EditorsOrder, IEditorIdentifier, EditorResourceAccessor, SideBySideEditor, GroupIdentifier } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { prepareQuery, scoreItemFuzzy, compareItemsByFuzzyScore, FuzzyScorerCache } from 'vs/base/common/fuzzyScorer'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index c8efdcdcfb6..f60356c71d7 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -18,14 +18,14 @@ import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { Disposable, MutableDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IEditorAction } from 'vs/editor/common/editorCommon'; import { EndOfLineSequence } from 'vs/editor/common/model'; -import { TrimTrailingWhitespaceAction } from 'vs/editor/contrib/linesOperations/linesOperations'; -import { IndentUsingSpaces, IndentUsingTabs, DetectIndentation, IndentationToSpacesAction, IndentationToTabsAction } from 'vs/editor/contrib/indentation/indentation'; +import { TrimTrailingWhitespaceAction } from 'vs/editor/contrib/linesOperations/browser/linesOperations'; +import { IndentUsingSpaces, IndentUsingTabs, DetectIndentation, IndentationToSpacesAction, IndentationToTabsAction } from 'vs/editor/contrib/indentation/browser/indentation'; import { BaseBinaryResourceEditor } from 'vs/workbench/browser/parts/editor/binaryEditor'; import { BinaryResourceDiffEditor } from 'vs/workbench/browser/parts/editor/binaryDiffEditor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IFileService, FILES_ASSOCIATIONS_CONFIG } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ILanguageService, ILanguageSelection } from 'vs/editor/common/services/language'; +import { ILanguageService, ILanguageSelection } from 'vs/editor/common/languages/language'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { TabFocus } from 'vs/editor/browser/config/tabFocus'; @@ -179,15 +179,15 @@ class StateChange { } type StateDelta = ( - { type: 'selectionStatus'; selectionStatus: string | undefined; } - | { type: 'languageId'; languageId: string | undefined; } - | { type: 'encoding'; encoding: string | undefined; } - | { type: 'EOL'; EOL: string | undefined; } - | { type: 'indentation'; indentation: string | undefined; } - | { type: 'tabFocusMode'; tabFocusMode: boolean; } - | { type: 'columnSelectionMode'; columnSelectionMode: boolean; } - | { type: 'screenReaderMode'; screenReaderMode: boolean; } - | { type: 'metadata'; metadata: string | undefined; } + { type: 'selectionStatus'; selectionStatus: string | undefined } + | { type: 'languageId'; languageId: string | undefined } + | { type: 'encoding'; encoding: string | undefined } + | { type: 'EOL'; EOL: string | undefined } + | { type: 'indentation'; indentation: string | undefined } + | { type: 'tabFocusMode'; tabFocusMode: boolean } + | { type: 'columnSelectionMode'; columnSelectionMode: boolean } + | { type: 'screenReaderMode'; screenReaderMode: boolean } + | { type: 'metadata'; metadata: string | undefined } ); class State { @@ -378,7 +378,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution { return this.quickInputService.pick([{ label: localize('noWritableCodeEditor', "The active code editor is read-only.") }]); } - const picks: QuickPickInput[] = [ + const picks: QuickPickInput[] = [ activeTextEditorControl.getAction(IndentUsingSpaces.ID), activeTextEditorControl.getAction(IndentUsingTabs.ID), activeTextEditorControl.getAction(DetectIndentation.ID), diff --git a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts index 1c4551af28b..058cee7dea4 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/sidebysideeditor'; import { localize } from 'vs/nls'; import { Dimension, $, clearNode, multibyteAwareBtoa } from 'vs/base/browser/dom'; import { Registry } from 'vs/platform/registry/common/platform'; -import { IEditorControl, IEditorPane, IEditorOpenContext, EditorExtensions, SIDE_BY_SIDE_EDITOR_ID, SideBySideEditor as Side } from 'vs/workbench/common/editor'; +import { IEditorControl, IEditorPane, IEditorOpenContext, EditorExtensions, SIDE_BY_SIDE_EDITOR_ID, SideBySideEditor as Side, IEditorPaneSelection, IEditorPaneWithSelection, IEditorPaneSelectionChangeEvent, isEditorPaneWithSelection, EditorPaneSelectionCompareResult } from 'vs/workbench/common/editor'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; @@ -45,7 +45,20 @@ function isSideBySideEditorViewState(thing: unknown): thing is ISideBySideEditor return typeof candidate?.primary === 'object' && typeof candidate.secondary === 'object'; } -export class SideBySideEditor extends AbstractEditorWithViewState { +interface ISideBySideEditorOptions extends IEditorOptions { + + /** + * Whether the editor options should apply to + * the primary or secondary side. + * + * If a target side is provided, that side will + * also receive keyboard focus unless focus is + * to be preserved. + */ + target?: Side.PRIMARY | Side.SECONDARY; +} + +export class SideBySideEditor extends AbstractEditorWithViewState implements IEditorPaneWithSelection { static readonly ID: string = SIDE_BY_SIDE_EDITOR_ID; @@ -79,11 +92,14 @@ export class SideBySideEditor extends AbstractEditorWithViewState()); + private onDidCreateEditors = this._register(new Emitter<{ width: number; height: number } | undefined>()); - private _onDidChangeSizeConstraints = this._register(new Relay<{ width: number; height: number; } | undefined>()); + private _onDidChangeSizeConstraints = this._register(new Relay<{ width: number; height: number } | undefined>()); override readonly onDidChangeSizeConstraints = Event.any(this.onDidCreateEditors.event, this._onDidChangeSizeConstraints.event); + private readonly _onDidChangeSelection = this._register(new Emitter()); + readonly onDidChangeSelection = this._onDidChangeSelection.event; + //#endregion private primaryEditorPane: EditorPane | undefined = undefined; @@ -229,7 +245,7 @@ export class SideBySideEditor extends AbstractEditorWithViewState { + override async setInput(input: SideBySideEditorInput, options: ISideBySideEditorOptions | undefined, context: IEditorOpenContext, token: CancellationToken): Promise { const oldInput = this.input; await super.setInput(input, options, context, token); @@ -260,21 +276,37 @@ export class SideBySideEditor extends AbstractEditorWithViewState this._onDidChangeSelection.fire(e))); + } + // Track for disposal this.editorDisposables.add(editorPane); @@ -325,7 +362,27 @@ export class SideBySideEditor extends AbstractEditorWithViewState extends AbstractEditorWithViewState { +export abstract class BaseTextEditor extends AbstractEditorWithViewState implements IEditorPaneWithSelection { private static readonly VIEW_STATE_PREFERENCE_KEY = 'textEditorViewState'; + protected readonly _onDidChangeSelection = this._register(new Emitter()); + readonly onDidChangeSelection = this._onDidChangeSelection.event; + private editorControl: IEditor | undefined; private editorContainer: HTMLElement | undefined; private hasPendingConfigurationChange: boolean | undefined; @@ -126,18 +131,44 @@ export abstract class BaseTextEditor extends Abstrac protected createEditor(parent: HTMLElement): void { - // Editor for Text + // Create editor control this.editorContainer = parent; this.editorControl = this._register(this.createEditorControl(parent, this.computeConfiguration(this.textResourceConfigurationService.getValue(this.getActiveResource())))); - // Model & Language changes + // Listeners + this.registerCodeEditorListeners(); + } + + private registerCodeEditorListeners(): void { const codeEditor = getCodeEditor(this.editorControl); if (codeEditor) { this._register(codeEditor.onDidChangeModelLanguage(() => this.updateEditorConfiguration())); this._register(codeEditor.onDidChangeModel(() => this.updateEditorConfiguration())); + this._register(codeEditor.onDidChangeCursorPosition(e => this._onDidChangeSelection.fire({ reason: this.toEditorPaneSelectionChangeReason(e) }))); + this._register(codeEditor.onDidChangeModelContent(() => this._onDidChangeSelection.fire({ reason: EditorPaneSelectionChangeReason.EDIT }))); } } + private toEditorPaneSelectionChangeReason(e: ICursorPositionChangedEvent): EditorPaneSelectionChangeReason { + switch (e.source) { + case TextEditorSelectionSource.PROGRAMMATIC: return EditorPaneSelectionChangeReason.PROGRAMMATIC; + case TextEditorSelectionSource.NAVIGATION: return EditorPaneSelectionChangeReason.NAVIGATION; + default: return EditorPaneSelectionChangeReason.USER; + } + } + + getSelection(): IEditorPaneSelection | undefined { + const codeEditor = getCodeEditor(this.editorControl); + if (codeEditor) { + const selection = codeEditor.getSelection(); + if (selection) { + return new TextEditorPaneSelection(selection); + } + } + + return undefined; + } + /** * This method creates and returns the text editor control to be used. Subclasses can override to * provide their own editor control that should be used (e.g. a DiffEditor). @@ -163,6 +194,8 @@ export abstract class BaseTextEditor extends Abstrac } override setOptions(options: ITextEditorOptions | undefined): void { + super.setOptions(options); + if (options) { applyTextEditorOptions(options, assertIsDefined(this.getControl()), ScrollType.Smooth); } @@ -174,6 +207,7 @@ export abstract class BaseTextEditor extends Abstrac const editorControl = assertIsDefined(this.editorControl); if (visible) { this.consumePendingConfigurationChangeEvent(); + editorControl.onVisible(); } else { editorControl.onHide(); @@ -259,6 +293,7 @@ export abstract class BaseTextEditor extends Abstrac if (Object.keys(editorSettingsToApply).length > 0) { this.lastAppliedEditorOptions = editorConfiguration; + this.editorControl.updateOptions(editorSettingsToApply); } } @@ -285,3 +320,45 @@ export abstract class BaseTextEditor extends Abstrac super.dispose(); } } + +export class TextEditorPaneSelection implements IEditorPaneSelection { + + private static readonly TEXT_EDITOR_SELECTION_THRESHOLD = 10; // number of lines to move in editor to justify for significant change + + constructor( + private readonly textSelection: Selection + ) { } + + compare(other: IEditorPaneSelection): EditorPaneSelectionCompareResult { + if (!(other instanceof TextEditorPaneSelection)) { + return EditorPaneSelectionCompareResult.DIFFERENT; + } + + const thisLineNumber = Math.min(this.textSelection.selectionStartLineNumber, this.textSelection.positionLineNumber); + const otherLineNumber = Math.min(other.textSelection.selectionStartLineNumber, other.textSelection.positionLineNumber); + + if (thisLineNumber === otherLineNumber) { + return EditorPaneSelectionCompareResult.IDENTICAL; + } + + if (Math.abs(thisLineNumber - otherLineNumber) < TextEditorPaneSelection.TEXT_EDITOR_SELECTION_THRESHOLD) { + return EditorPaneSelectionCompareResult.SIMILAR; // when in close proximity, treat selection as being similar + } + + return EditorPaneSelectionCompareResult.DIFFERENT; + } + + restore(options: IEditorOptions): ITextEditorOptions { + const textEditorOptions: ITextEditorOptions = { + ...options, + selection: this.textSelection, + selectionRevealType: TextEditorSelectionRevealType.CenterIfOutsideViewport + }; + + return textEditorOptions; + } + + toString(): string { + return `line: ${this.textSelection.startLineNumber}-${this.textSelection.endLineNumber}, col: ${this.textSelection.startColumn}-${this.textSelection.endColumn}`; + } +} diff --git a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts index 9b09dd9faca..9dfdeab2369 100644 --- a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts @@ -23,7 +23,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; import { EditorOption, IEditorOptions as ICodeEditorOptions } from 'vs/editor/common/config/editorOptions'; import { ModelConstants } from 'vs/editor/common/model'; diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 973965880de..a209674f7de 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -30,9 +30,9 @@ import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; import { BreadcrumbsConfig } from 'vs/workbench/browser/parts/editor/breadcrumbs'; import { BreadcrumbsControl, IBreadcrumbsControlOptions } from 'vs/workbench/browser/parts/editor/breadcrumbsControl'; import { IEditorGroupsAccessor, IEditorGroupTitleHeight, IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; -import { IEditorCommandsContext, EditorResourceAccessor, IEditorPartOptions, SideBySideEditor, ActiveEditorPinnedContext, ActiveEditorStickyContext, EditorsOrder, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, EditorInputCapabilities, SideBySideEditorActiveContext } from 'vs/workbench/common/editor'; +import { IEditorCommandsContext, EditorResourceAccessor, IEditorPartOptions, SideBySideEditor, EditorsOrder, EditorInputCapabilities } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey, ActiveEditorPinnedContext, ActiveEditorStickyContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext } from 'vs/workbench/common/contextkeys'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; import { IFileService } from 'vs/platform/files/common/files'; import { withNullAsUndefined, withUndefinedAsNull, assertIsDefined } from 'vs/base/common/types'; @@ -340,7 +340,7 @@ export abstract class TitleControl extends Themable { this.sideBySideEditorContext.set(editor.typeId === SideBySideEditorInput.ID); // Find target anchor - let anchor: HTMLElement | { x: number, y: number; } = node; + let anchor: HTMLElement | { x: number; y: number } = node; if (e instanceof MouseEvent) { const event = new StandardMouseEvent(e); anchor = { x: event.posx, y: event.posy }; diff --git a/src/vs/workbench/browser/parts/notifications/notificationsActions.ts b/src/vs/workbench/browser/parts/notifications/notificationsActions.ts index 679c182c6ef..7922f858004 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsActions.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsActions.ts @@ -154,10 +154,10 @@ interface NotificationActionMetrics { } type NotificationActionMetricsClassification = { - id: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - actionLabel: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - source: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - silent: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + id: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + actionLabel: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + silent: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; export class NotificationActionRunner extends ActionRunner { diff --git a/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts b/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts index 4f3ee08b85b..56d5ebde2f0 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts @@ -11,7 +11,7 @@ import { INotificationsModel, INotificationChangeEvent, NotificationChangeType, import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; import { Emitter } from 'vs/base/common/event'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { NotificationsCenterVisibleContext, INotificationsCenterController } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; +import { INotificationsCenterController } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; import { NotificationsList } from 'vs/workbench/browser/parts/notifications/notificationsList'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { isAncestor, Dimension } from 'vs/base/browser/dom'; @@ -23,6 +23,7 @@ import { ClearAllNotificationsAction, HideNotificationsCenterAction, Notificatio import { IAction } from 'vs/base/common/actions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { assertAllDefined, assertIsDefined } from 'vs/base/common/types'; +import { NotificationsCenterVisibleContext } from 'vs/workbench/common/contextkeys'; export class NotificationsCenter extends Themable implements INotificationsCenterController { diff --git a/src/vs/workbench/browser/parts/notifications/notificationsCommands.ts b/src/vs/workbench/browser/parts/notifications/notificationsCommands.ts index 094565d7e26..ee0cd3f780c 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsCommands.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsCommands.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { INotificationViewItem, isNotificationViewItem, NotificationsModel } from 'vs/workbench/common/notifications'; @@ -13,6 +13,7 @@ import { localize } from 'vs/nls'; import { IListService, WorkbenchList } from 'vs/platform/list/browser/listService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NotificationMetrics, NotificationMetricsClassification, notificationToMetrics } from 'vs/workbench/browser/parts/notifications/notificationsTelemetry'; +import { NotificationFocusedContext, NotificationsCenterVisibleContext, NotificationsToastsVisibleContext } from 'vs/workbench/common/contextkeys'; // Center export const SHOW_NOTIFICATIONS_CENTER = 'notifications.showList'; @@ -34,10 +35,6 @@ const TOGGLE_NOTIFICATION = 'notification.toggle'; export const CLEAR_NOTIFICATION = 'notification.clear'; export const CLEAR_ALL_NOTIFICATIONS = 'notifications.clearAll'; -export const NotificationFocusedContext = new RawContextKey('notificationFocus', true, localize('notificationFocus', "Whether a notification has keyboard focus")); -export const NotificationsCenterVisibleContext = new RawContextKey('notificationCenterVisible', false, localize('notificationCenterVisible', "Whether the notifications center is visible")); -export const NotificationsToastsVisibleContext = new RawContextKey('notificationToastsVisible', false, localize('notificationToastsVisible', "Whether a notification toast is visible")); - export interface INotificationsCenterController { readonly isVisible: boolean; diff --git a/src/vs/workbench/browser/parts/notifications/notificationsList.ts b/src/vs/workbench/browser/parts/notifications/notificationsList.ts index cc95aea004a..58e32d35e78 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsList.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsList.ts @@ -15,10 +15,10 @@ import { contrastBorder, focusBorder } from 'vs/platform/theme/common/colorRegis import { INotificationViewItem } from 'vs/workbench/common/notifications'; import { NotificationsListDelegate, NotificationRenderer } from 'vs/workbench/browser/parts/notifications/notificationsViewer'; import { NotificationActionRunner, CopyNotificationMessageAction } from 'vs/workbench/browser/parts/notifications/notificationsActions'; -import { NotificationFocusedContext } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { assertIsDefined, assertAllDefined } from 'vs/base/common/types'; import { Codicon } from 'vs/base/common/codicons'; +import { NotificationFocusedContext } from 'vs/workbench/common/contextkeys'; export interface INotificationsListOptions extends IListOptions { widgetAriaLabel?: string; diff --git a/src/vs/workbench/browser/parts/notifications/notificationsTelemetry.ts b/src/vs/workbench/browser/parts/notifications/notificationsTelemetry.ts index e2ed3e54215..33947641bbd 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsTelemetry.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsTelemetry.ts @@ -16,9 +16,9 @@ export interface NotificationMetrics { } export type NotificationMetricsClassification = { - id: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - silent: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - source?: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + id: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + silent: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + source?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; export function notificationToMetrics(message: NotificationMessage, source: string | undefined, silent: boolean): NotificationMetrics { diff --git a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts index 6716e45b671..5a5517629d4 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts @@ -16,7 +16,7 @@ import { NOTIFICATIONS_TOAST_BORDER, NOTIFICATIONS_BACKGROUND } from 'vs/workben import { IThemeService, Themable } from 'vs/platform/theme/common/themeService'; import { widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { NotificationsToastsVisibleContext, INotificationsToastController } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; +import { INotificationsToastController } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Severity, NotificationsFilter } from 'vs/platform/notification/common/notification'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; @@ -24,6 +24,7 @@ import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecyc import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IntervalCounter } from 'vs/base/common/async'; import { assertIsDefined } from 'vs/base/common/types'; +import { NotificationsToastsVisibleContext } from 'vs/workbench/common/contextkeys'; interface INotificationToast { item: INotificationViewItem; diff --git a/src/vs/workbench/browser/parts/paneCompositePart.ts b/src/vs/workbench/browser/parts/paneCompositePart.ts index d80ef752be3..b27fa6cd2f4 100644 --- a/src/vs/workbench/browser/parts/paneCompositePart.ts +++ b/src/vs/workbench/browser/parts/paneCompositePart.ts @@ -17,7 +17,7 @@ import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { ViewContainerLocation, ViewContainerLocations } from 'vs/workbench/common/views'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; -import { IDisposable } from 'vs/workbench/workbench.web.api'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { IView } from 'vs/base/browser/ui/grid/grid'; export interface IPaneCompositePart extends IView { @@ -81,8 +81,8 @@ export interface IPaneCompositeSelectorPart { export class PaneCompositeParts implements IPaneCompositePartService { declare readonly _serviceBrand: undefined; - onDidPaneCompositeOpen: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation; }>; - onDidPaneCompositeClose: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation; }>; + onDidPaneCompositeOpen: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation }>; + onDidPaneCompositeClose: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation }>; private paneCompositeParts = new Map(); private paneCompositeSelectorParts = new Map(); diff --git a/src/vs/workbench/browser/parts/panel/media/basepanelpart.css b/src/vs/workbench/browser/parts/panel/media/basepanelpart.css index 3fb564d74d0..6cb382b8a5d 100644 --- a/src/vs/workbench/browser/parts/panel/media/basepanelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/basepanelpart.css @@ -147,6 +147,10 @@ align-items: center; } +.monaco-workbench .part.basepanel > .composite.title> .panel-switcher-container > .monaco-action-bar .action-item.icon .badge { + margin-left: 0px; +} + .monaco-workbench .part.basepanel > .composite.title> .panel-switcher-container > .monaco-action-bar .badge .badge-content { padding: 3px 5px; border-radius: 11px; @@ -201,16 +205,16 @@ /* Rotate icons when panel is on right */ .monaco-workbench .part.basepanel.right .title-actions .codicon-split-horizontal::before, -.monaco-workbench .part.basepanel.right .title-actions .codicon-panel-maximize::before, -.monaco-workbench .part.basepanel.right .title-actions .codicon-panel-restore::before { +.monaco-workbench .part.basepanel.right .global-actions .codicon-panel-maximize::before, +.monaco-workbench .part.basepanel.right .global-actions .codicon-panel-restore::before { display: inline-block; transform: rotate(-90deg); } /* Rotate icons when panel is on left */ .monaco-workbench .part.basepanel.left .title-actions .codicon-split-horizontal::before, -.monaco-workbench .part.basepanel.left .title-actions .codicon-panel-maximize::before, -.monaco-workbench .part.basepanel.left .title-actions .codicon-panel-restore::before { +.monaco-workbench .part.basepanel.left .global-actions .codicon-panel-maximize::before, +.monaco-workbench .part.basepanel.left .global-actions .codicon-panel-restore::before { display: inline-block; transform: rotate(90deg); } diff --git a/src/vs/workbench/browser/parts/panel/panelActions.ts b/src/vs/workbench/browser/parts/panel/panelActions.ts index 3e2bbd66abc..771a36c6caf 100644 --- a/src/vs/workbench/browser/parts/panel/panelActions.ts +++ b/src/vs/workbench/browser/parts/panel/panelActions.ts @@ -8,19 +8,18 @@ import { localize } from 'vs/nls'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { Action } from 'vs/base/common/actions'; import { Registry } from 'vs/platform/registry/common/platform'; -import { SyncActionDescriptor, MenuId, MenuRegistry, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; +import { SyncActionDescriptor, MenuId, MenuRegistry, registerAction2, Action2, IAction2Options, ICommandActionTitle } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions as WorkbenchExtensions, CATEGORIES } from 'vs/workbench/common/actions'; import { IWorkbenchLayoutService, PanelAlignment, Parts, Position, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; import { ActivityAction, ToggleCompositePinnedAction, ICompositeBar } from 'vs/workbench/browser/parts/compositeBarActions'; import { IActivity } from 'vs/workbench/common/activity'; -import { ActivePanelContext, PanelMaximizedContext, PanelPositionContext, PanelVisibleContext } from 'vs/workbench/common/panel'; +import { PanelAlignmentContext, PanelMaximizedContext, PanelPositionContext, PanelVisibleContext } from 'vs/workbench/common/contextkeys'; import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { Codicon } from 'vs/base/common/codicons'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; -import { ViewContainerLocationToString, ViewContainerLocation, IViewDescriptorService } from 'vs/workbench/common/views'; +import { ViewContainerLocationToString, ViewContainerLocation, IViewDescriptorService, IViewsService } from 'vs/workbench/common/views'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; -import { ICommandService } from 'vs/platform/commands/common/commands'; import { INotificationService } from 'vs/platform/notification/common/notification'; const maximizeIcon = registerIcon('panel-maximize', Codicon.chevronUp, localize('maximizeIcon', 'Icon to maximize a panel.')); @@ -90,72 +89,93 @@ const AlignPanelActionId = { interface PanelActionConfig { id: string; when: ContextKeyExpression; - alias: string; - label: string; + title: ICommandActionTitle; shortLabel: string; value: T; } -function createPanelActionConfig(id: string, alias: string, label: string, shortLabel: string, value: T, when: ContextKeyExpression): PanelActionConfig { +function createPanelActionConfig(id: string, title: ICommandActionTitle, shortLabel: string, value: T, when: ContextKeyExpression): PanelActionConfig { return { id, - alias, - label, + title, shortLabel, value, when, }; } -function createPositionPanelActionConfig(id: string, alias: string, label: string, shortLabel: string, position: Position): PanelActionConfig { - return createPanelActionConfig(id, alias, label, shortLabel, position, PanelPositionContext.notEqualsTo(positionToString(position))); +function createPositionPanelActionConfig(id: string, title: ICommandActionTitle, shortLabel: string, position: Position): PanelActionConfig { + return createPanelActionConfig(id, title, shortLabel, position, PanelPositionContext.notEqualsTo(positionToString(position))); } -function createAlignmentPanelActionConfig(id: string, alias: string, label: string, shortLabel: string, alignment: PanelAlignment): PanelActionConfig { - return createPanelActionConfig(id, alias, label, shortLabel, alignment, ContextKeyExpr.notEquals('config.workbench.experimental.panel.alignment', alignment)); +function createAlignmentPanelActionConfig(id: string, title: ICommandActionTitle, shortLabel: string, alignment: PanelAlignment): PanelActionConfig { + return createPanelActionConfig(id, title, shortLabel, alignment, PanelAlignmentContext.notEqualsTo(alignment)); } export const PositionPanelActionConfigs: PanelActionConfig[] = [ - createPositionPanelActionConfig(PositionPanelActionId.LEFT, 'View: Move Panel Left', localize('positionPanelLeft', 'Move Panel Left'), localize('positionPanelLeftShort', "Left"), Position.LEFT), - createPositionPanelActionConfig(PositionPanelActionId.RIGHT, 'View: Move Panel Right', localize('positionPanelRight', 'Move Panel Right'), localize('positionPanelRightShort', "Right"), Position.RIGHT), - createPositionPanelActionConfig(PositionPanelActionId.BOTTOM, 'View: Move Panel To Bottom', localize('positionPanelBottom', 'Move Panel To Bottom'), localize('positionPanelBottomShort', "Bottom"), Position.BOTTOM), + createPositionPanelActionConfig(PositionPanelActionId.LEFT, { value: localize('positionPanelLeft', 'Move Panel Left'), original: 'Move Panel Left' }, localize('positionPanelLeftShort', "Left"), Position.LEFT), + createPositionPanelActionConfig(PositionPanelActionId.RIGHT, { value: localize('positionPanelRight', 'Move Panel Right'), original: 'Move Panel Right' }, localize('positionPanelRightShort', "Right"), Position.RIGHT), + createPositionPanelActionConfig(PositionPanelActionId.BOTTOM, { value: localize('positionPanelBottom', 'Move Panel To Bottom'), original: 'Move Panel To Bottom' }, localize('positionPanelBottomShort', "Bottom"), Position.BOTTOM), ]; -export const AlignPanelActionConfigs: PanelActionConfig[] = [ - createAlignmentPanelActionConfig(AlignPanelActionId.LEFT, 'View: Align Panel Left', localize('alignPanelLeft', 'Align Panel Left'), localize('alignPanelLeftShort', "Left"), 'left'), - createAlignmentPanelActionConfig(AlignPanelActionId.RIGHT, 'View: Align Panel Right', localize('alignPanelRight', 'Align Panel Right'), localize('alignPanelRightShort', "Right"), 'right'), - createAlignmentPanelActionConfig(AlignPanelActionId.CENTER, 'View: Center Panel', localize('alignPanelCenter', 'Center Panel'), localize('alignPanelCenterShort', "Center"), 'center'), - createAlignmentPanelActionConfig(AlignPanelActionId.JUSTIFY, 'View: Justify Panel', localize('alignPanelJustify', 'Justify Panel'), localize('alignPanelJustifyShort', "Justify"), 'justify'), +const AlignPanelActionConfigs: PanelActionConfig[] = [ + createAlignmentPanelActionConfig(AlignPanelActionId.LEFT, { value: localize('alignPanelLeft', 'Set Panel Alignment to Left'), original: 'Set Panel Alignment to Left' }, localize('alignPanelLeftShort', "Left"), 'left'), + createAlignmentPanelActionConfig(AlignPanelActionId.RIGHT, { value: localize('alignPanelRight', 'Set Panel Alignment to Right'), original: 'Set Panel Alignment to Right' }, localize('alignPanelRightShort', "Right"), 'right'), + createAlignmentPanelActionConfig(AlignPanelActionId.CENTER, { value: localize('alignPanelCenter', 'Set Panel Alignment to Center'), original: 'Set Panel Alignment to Center' }, localize('alignPanelCenterShort', "Center"), 'center'), + createAlignmentPanelActionConfig(AlignPanelActionId.JUSTIFY, { value: localize('alignPanelJustify', 'Set Panel Alignment to Justify'), original: 'Set Panel Alignment to Justify' }, localize('alignPanelJustifyShort', "Justify"), 'justify'), ]; -const alignmentByActionId = new Map(AlignPanelActionConfigs.map(config => [config.id, config.value])); +const positionByActionId = new Map(PositionPanelActionConfigs.map(config => [config.id, config.value])); +export class SetPanelPositionAction extends Action { + constructor( + id: string, + label: string, + @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService + ) { + super(id, label); + } + + override async run(): Promise { + const position = positionByActionId.get(this.id); + this.layoutService.setPanelPosition(position === undefined ? Position.BOTTOM : position); + } +} + +MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, { + submenu: MenuId.MenubarPanelPositionMenu, + title: localize('positionPanel', "Panel Position"), + group: '3_workbench_layout_move', + order: 4 +}); PositionPanelActionConfigs.forEach(positionPanelAction => { - const { id, label } = positionPanelAction; + const { id, title, shortLabel, value, when } = positionPanelAction; registerAction2(class extends Action2 { constructor() { super({ id, - title: label, + title, category: CATEGORIES.View, f1: true }); } run(accessor: ServicesAccessor): void { - const notificationService = accessor.get(INotificationService); - const commandService = accessor.get(ICommandService); - - notificationService.warn(localize('deprecatedPanelMoveMessage', "Moving the panel with this command has been deprecated in favor of \"Move Views From Panel To Side Panel\" and \"Move Views From Side Panel To Panel\" for similar functionality.")); - if (positionPanelAction.value === Position.BOTTOM) { - commandService.executeCommand('workbench.action.moveSidePanelToPanel'); - } else { - commandService.executeCommand('workbench.action.movePanelToSidePanel'); - } + const layoutService = accessor.get(IWorkbenchLayoutService); + layoutService.setPanelPosition(value === undefined ? Position.BOTTOM : value); } }); + + MenuRegistry.appendMenuItem(MenuId.MenubarPanelPositionMenu, { + command: { + id, + title: shortLabel, + toggled: when.negate() + }, + order: 5 + }); }); MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, { @@ -166,12 +186,12 @@ MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, { }); AlignPanelActionConfigs.forEach(alignPanelAction => { - const { id, label, shortLabel, value, when } = alignPanelAction; + const { id, title, shortLabel, value, when } = alignPanelAction; registerAction2(class extends Action2 { constructor() { super({ id, - title: label, + title: title, category: CATEGORIES.View, toggled: when.negate(), f1: true @@ -193,21 +213,6 @@ AlignPanelActionConfigs.forEach(alignPanelAction => { }); }); -export class SetPanelAlignmentAction extends Action { - constructor( - id: string, - label: string, - @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService - ) { - super(id, label); - } - - override async run(): Promise { - const alignment = alignmentByActionId.get(this.id); - this.layoutService.setPanelAlignment(alignment === undefined ? 'center' : alignment); - } -} - export class PanelActivityAction extends ActivityAction { constructor( @@ -330,16 +335,26 @@ registerAction2(class extends Action2 { category: CATEGORIES.View, f1: true, icon: maximizeIcon, + // the workbench grid currently prevents us from supporting panel maximization with non-center panel alignment + precondition: ContextKeyExpr.or(PanelAlignmentContext.isEqualTo('center'), PanelPositionContext.notEqualsTo('bottom')), toggled: { condition: PanelMaximizedContext, icon: restoreIcon, tooltip: localize('minimizePanel', "Restore Panel Size") }, menu: [{ id: MenuId.PanelTitle, group: 'navigation', - order: 1 + order: 1, + // the workbench grid currently prevents us from supporting panel maximization with non-center panel alignment + when: ContextKeyExpr.or(PanelAlignmentContext.isEqualTo('center'), PanelPositionContext.notEqualsTo('bottom')) }] }); } run(accessor: ServicesAccessor) { const layoutService = accessor.get(IWorkbenchLayoutService); + const notificationService = accessor.get(INotificationService); + if (layoutService.getPanelAlignment() !== 'center' && layoutService.getPanelPosition() === Position.BOTTOM) { + notificationService.warn(localize('panelMaxNotSupported', "Maximizing the panel is only supported when it is center aligned.")); + return; + } + if (!layoutService.isVisible(Parts.PANEL_PART)) { layoutService.setPartHidden(false, Parts.PANEL_PART); // If the panel is not already maximized, maximize it @@ -383,7 +398,7 @@ MenuRegistry.appendMenuItems([ command: { id: TogglePanelAction.ID, title: localize({ key: 'miShowPanel', comment: ['&& denotes a mnemonic'] }, "Show &&Panel"), - toggled: ActivePanelContext + toggled: PanelVisibleContext }, order: 5 } @@ -394,7 +409,7 @@ MenuRegistry.appendMenuItems([ command: { id: TogglePanelAction.ID, title: localize({ key: 'miShowPanel', comment: ['&& denotes a mnemonic'] }, "Show &&Panel"), - toggled: ActivePanelContext + toggled: PanelVisibleContext }, order: 4 } @@ -412,12 +427,38 @@ MenuRegistry.appendMenuItems([ } ]); +class MoveViewsBetweenPanelsAction extends Action2 { + constructor(private readonly source: ViewContainerLocation, private readonly destination: ViewContainerLocation, desc: Readonly) { + super(desc); + } + + run(accessor: ServicesAccessor, ...args: any[]): void { + const viewDescriptorService = accessor.get(IViewDescriptorService); + const layoutService = accessor.get(IWorkbenchLayoutService); + const viewsService = accessor.get(IViewsService); + + const srcContainers = viewDescriptorService.getViewContainersByLocation(this.source); + const destContainers = viewDescriptorService.getViewContainersByLocation(this.destination); + + if (srcContainers.length) { + const activeViewContainer = viewsService.getVisibleViewContainer(this.source); + + srcContainers.forEach(viewContainer => viewDescriptorService.moveViewContainerToLocation(viewContainer, this.destination)); + layoutService.setPartHidden(false, this.destination === ViewContainerLocation.Panel ? Parts.PANEL_PART : Parts.AUXILIARYBAR_PART); + + if (activeViewContainer && destContainers.length === 0) { + viewsService.openViewContainer(activeViewContainer.id, true); + } + } + } +} + // --- Move Panel Views To Side Panel -export class MovePanelToSidePanelAction extends Action2 { +export class MovePanelToSidePanelAction extends MoveViewsBetweenPanelsAction { static readonly ID = 'workbench.action.movePanelToSidePanel'; constructor() { - super({ + super(ViewContainerLocation.Panel, ViewContainerLocation.AuxiliaryBar, { id: MovePanelToSidePanelAction.ID, title: { value: localize('movePanelToSidePanel', "Move Views From Panel To Side Panel"), @@ -433,29 +474,17 @@ export class MovePanelToSidePanelAction extends Action2 { }] }); } - run(accessor: ServicesAccessor, ...args: any[]): void { - const viewDescriptorService = accessor.get(IViewDescriptorService); - const layoutService = accessor.get(IWorkbenchLayoutService); - - const panelContainers = viewDescriptorService.getViewContainersByLocation(ViewContainerLocation.Panel); - - if (panelContainers.length) { - panelContainers.forEach(viewContainer => viewDescriptorService.moveViewContainerToLocation(viewContainer, ViewContainerLocation.AuxiliaryBar)); - layoutService.setPartHidden(false, Parts.AUXILIARYBAR_PART); - } - } - } registerAction2(MovePanelToSidePanelAction); // --- Move Panel Views To Side Panel -export class MoveSidePanelToPanelAction extends Action2 { +export class MoveSidePanelToPanelAction extends MoveViewsBetweenPanelsAction { static readonly ID = 'workbench.action.moveSidePanelToPanel'; constructor() { - super({ + super(ViewContainerLocation.AuxiliaryBar, ViewContainerLocation.Panel, { id: MoveSidePanelToPanelAction.ID, title: { value: localize('moveSidePanelToPanel', "Move Views From Side Panel To Panel"), @@ -465,17 +494,5 @@ export class MoveSidePanelToPanelAction extends Action2 { f1: true }); } - run(accessor: ServicesAccessor, ...args: any[]): void { - const viewDescriptorService = accessor.get(IViewDescriptorService); - const layoutService = accessor.get(IWorkbenchLayoutService); - - const auxiliaryBarContainers = viewDescriptorService.getViewContainersByLocation(ViewContainerLocation.AuxiliaryBar); - - if (auxiliaryBarContainers.length) { - auxiliaryBarContainers.forEach(viewContainer => viewDescriptorService.moveViewContainerToLocation(viewContainer, ViewContainerLocation.Panel)); - layoutService.setPartHidden(false, Parts.PANEL_PART); - } - } - } registerAction2(MoveSidePanelToPanelAction); diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 3a2a44cc558..a54e908fcee 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -10,15 +10,15 @@ import { IAction, Separator, toAction } from 'vs/base/common/actions'; import { Event } from 'vs/base/common/event'; import { Registry } from 'vs/platform/registry/common/platform'; import { ActionsOrientation, prepareActions } from 'vs/base/browser/ui/actionbar/actionbar'; -import { ActivePanelContext, PanelFocusContext } from 'vs/workbench/common/panel'; +import { ActivePanelContext, PanelFocusContext, getEnabledViewContainerContextKey } from 'vs/workbench/common/contextkeys'; import { CompositePart, ICompositeTitleLabel } from 'vs/workbench/browser/parts/compositePart'; -import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; +import { IWorkbenchLayoutService, Parts, Position } from 'vs/workbench/services/layout/browser/layoutService'; import { IStorageService, StorageScope, IStorageValueChangeEvent, StorageTarget } from 'vs/platform/storage/common/storage'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; 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, MovePanelToSidePanelAction } from 'vs/workbench/browser/parts/panel/panelActions'; +import { PanelActivityAction, TogglePanelAction, PlaceHolderPanelActivityAction, PlaceHolderToggleCompositePinnedAction, PositionPanelActionConfigs, SetPanelPositionAction, MovePanelToSidePanelAction } 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'; @@ -31,7 +31,7 @@ import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { isUndefinedOrNull, assertIsDefined } from 'vs/base/common/types'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { ViewContainer, IViewDescriptorService, IViewContainerModel, ViewContainerLocation, getEnabledViewContainerContextKey } from 'vs/workbench/common/views'; +import { ViewContainer, IViewDescriptorService, IViewContainerModel, ViewContainerLocation } from 'vs/workbench/common/views'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { Before2D, CompositeDragAndDropObserver, ICompositeDragAndDrop, toggleDropEffect } from 'vs/workbench/browser/dnd'; import { IActivity } from 'vs/workbench/common/activity'; @@ -52,7 +52,7 @@ interface ICachedPanel { pinned: boolean; order?: number; visible: boolean; - views?: { when?: string; }[]; + views?: { when?: string }[]; } interface IPlaceholderViewContainer { @@ -61,8 +61,8 @@ interface IPlaceholderViewContainer { } interface IPanelPartOptions extends IPartOptions { - hasTitle: true, - borderWidth?: (() => number), + hasTitle: true; + borderWidth?: (() => number); useIcons?: boolean; } @@ -87,7 +87,18 @@ export abstract class BasePanelPart extends CompositePart impleme } get preferredWidth(): number | undefined { - return this.layoutService.dimension.width * 0.4; + const activeComposite = this.getActivePaneComposite(); + + if (!activeComposite) { + return; + } + + const width = activeComposite.getOptimalWidth(); + if (typeof width !== 'number') { + return; + } + + return Math.max(width, 300); } //#endregion @@ -96,7 +107,7 @@ export abstract class BasePanelPart extends CompositePart impleme readonly onDidPaneCompositeClose = this.onDidCompositeClose.event as Event; private compositeBar: CompositeBar; - private readonly compositeActions = new Map(); + private readonly compositeActions = new Map(); private readonly panelDisposables: Map = new Map(); @@ -241,12 +252,12 @@ export abstract class BasePanelPart extends CompositePart impleme } if (isActive) { + this.compositeBar.activateComposite(panel.id); + // Only try to open the panel if it has been created and visible if (!activePanel && this.element && this.layoutService.isVisible(this.partId)) { this.doOpenPanel(panel.id); } - - this.compositeBar.activateComposite(panel.id); } } } @@ -674,7 +685,7 @@ export abstract class BasePanelPart extends CompositePart impleme return viewContainer && this.viewDescriptorService.getViewContainerLocation(viewContainer) === this.viewContainerLocation ? viewContainer : undefined; } - private getCompositeActions(compositeId: string): { activityAction: PanelActivityAction, pinnedAction: ToggleCompositePinnedAction; } { + private getCompositeActions(compositeId: string): { activityAction: PanelActivityAction; pinnedAction: ToggleCompositePinnedAction } { let compositeActions = this.compositeActions.get(compositeId); if (!compositeActions) { // const panel = this.getPaneComposite(compositeId); @@ -919,7 +930,7 @@ export class PanelPart extends BasePanelPart { protected getActivityHoverOptions(): IActivityHoverOptions { return { - position: () => !this.layoutService.isPanelMaximized() ? HoverPosition.ABOVE : HoverPosition.BELOW, + position: () => this.layoutService.getPanelPosition() === Position.BOTTOM && !this.layoutService.isPanelMaximized() ? HoverPosition.ABOVE : HoverPosition.BELOW, }; } @@ -928,6 +939,10 @@ export class PanelPart extends BasePanelPart { actions.push(...[ new Separator(), toAction({ id: MovePanelToSidePanelAction.ID, label: localize('moveToSidePanel', "Move Views to Side Panel"), run: () => this.instantiationService.invokeFunction(accessor => new MovePanelToSidePanelAction().run(accessor)) }), + ...PositionPanelActionConfigs + // show the contextual menu item if it is not in that position + .filter(({ when }) => this.contextKeyService.contextMatchesRules(when)) + .map(({ id, title }) => this.instantiationService.createInstance(SetPanelPositionAction, id, title.value)), this.instantiationService.createInstance(TogglePanelAction, TogglePanelAction.ID, localize('hidePanel', "Hide Panel")) ]); } @@ -955,7 +970,12 @@ export class PanelPart extends BasePanelPart { } override layout(width: number, height: number, top: number, left: number): void { - const dimensions = new Dimension(width, height); + let dimensions: Dimension; + if (this.layoutService.getPanelPosition() === Position.RIGHT) { + dimensions = new Dimension(width - 1, height); // Take into account the 1px border when layouting + } else { + dimensions = new Dimension(width, height); + } // Layout contents super.layout(dimensions.width, dimensions.height, top, left); diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index 6a621b3b61b..aea0b4f74c3 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -9,7 +9,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { CompositePart } from 'vs/workbench/browser/parts/compositePart'; import { PaneCompositeRegistry, Extensions as ViewletExtensions, PaneCompositeDescriptor, PaneComposite } from 'vs/workbench/browser/panecomposite'; import { IWorkbenchLayoutService, Parts, Position as SideBarPosition } from 'vs/workbench/services/layout/browser/layoutService'; -import { SidebarFocusContext, ActiveViewletContext } from 'vs/workbench/common/viewlet'; +import { SidebarFocusContext, ActiveViewletContext } from 'vs/workbench/common/contextkeys'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -175,7 +175,7 @@ export class SidebarPart extends CompositePart implements IPaneCo this.titleLabelElement!.draggable = true; - const draggedItemProvider = (): { type: 'view' | 'composite', id: string } => { + const draggedItemProvider = (): { type: 'view' | 'composite'; id: string } => { const activeViewlet = this.getActivePaneComposite()!; return { type: 'composite', id: activeViewlet.getId() }; }; @@ -285,7 +285,7 @@ export class SidebarPart extends CompositePart implements IPaneCo if (activeViewlet) { const contextMenuActions = activeViewlet ? activeViewlet.getContextMenuActions() : []; if (contextMenuActions.length) { - const anchor: { x: number, y: number } = { x: event.posx, y: event.posy }; + const anchor: { x: number; y: number } = { x: event.posx, y: event.posy }; this.contextMenuService.showContextMenu({ getAnchor: () => anchor, getActions: () => contextMenuActions.slice(), diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarActions.ts b/src/vs/workbench/browser/parts/statusbar/statusbarActions.ts index e5ade225105..1af3a67ebc2 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarActions.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarActions.ts @@ -14,9 +14,7 @@ import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { StatusbarViewModel } from 'vs/workbench/browser/parts/statusbar/statusbarModel'; -import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; - -export const CONTEXT_STATUS_BAR_FOCUSED = new RawContextKey('statusBarFocused', false, localize('statusBarFocused', "Whether the status bar has keyboard focus")); +import { StatusBarFocused } from 'vs/workbench/common/contextkeys'; export class ToggleStatusbarEntryVisibilityAction extends Action { @@ -51,7 +49,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.LeftArrow, secondary: [KeyCode.UpArrow], - when: CONTEXT_STATUS_BAR_FOCUSED, + when: StatusBarFocused, handler: (accessor: ServicesAccessor) => { const statusBarService = accessor.get(IStatusbarService); statusBarService.focusPreviousEntry(); @@ -63,7 +61,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.RightArrow, secondary: [KeyCode.DownArrow], - when: CONTEXT_STATUS_BAR_FOCUSED, + when: StatusBarFocused, handler: (accessor: ServicesAccessor) => { const statusBarService = accessor.get(IStatusbarService); statusBarService.focusNextEntry(); @@ -74,7 +72,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'workbench.statusBar.focusFirst', weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.Home, - when: CONTEXT_STATUS_BAR_FOCUSED, + when: StatusBarFocused, handler: (accessor: ServicesAccessor) => { const statusBarService = accessor.get(IStatusbarService); statusBarService.focus(false); @@ -86,7 +84,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'workbench.statusBar.focusLast', weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.End, - when: CONTEXT_STATUS_BAR_FOCUSED, + when: StatusBarFocused, handler: (accessor: ServicesAccessor) => { const statusBarService = accessor.get(IStatusbarService); statusBarService.focus(false); @@ -98,7 +96,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'workbench.statusBar.clearFocus', weight: KeybindingWeight.WorkbenchContrib, primary: KeyCode.Escape, - when: CONTEXT_STATUS_BAR_FOCUSED, + when: StatusBarFocused, handler: (accessor: ServicesAccessor) => { const statusBarService = accessor.get(IStatusbarService); const editorService = accessor.get(IEditorService); diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts b/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts index a768fa05818..007370f3ff6 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts @@ -105,7 +105,7 @@ export class StatusbarEntryItem extends Disposable { // Update: Hover if (!this.entry || !this.isEqualTooltip(this.entry, entry)) { - const hoverContents = { markdown: entry.tooltip, markdownNotSupportedFallback: undefined }; + const hoverContents = isMarkdownString(entry.tooltip) ? { markdown: entry.tooltip, markdownNotSupportedFallback: undefined } : entry.tooltip; if (this.hover) { this.hover.update(hoverContents); } else { diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarModel.ts b/src/vs/workbench/browser/parts/statusbar/statusbarModel.ts index b4b8d744c8f..ae7029312ad 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarModel.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarModel.ts @@ -74,7 +74,7 @@ export class StatusbarViewModel extends Disposable { private static readonly HIDDEN_ENTRIES_KEY = 'workbench.statusbar.hidden'; - private readonly _onDidChangeEntryVisibility = this._register(new Emitter<{ id: string, visible: boolean }>()); + private readonly _onDidChangeEntryVisibility = this._register(new Emitter<{ id: string; visible: boolean }>()); readonly onDidChangeEntryVisibility = this._onDidChangeEntryVisibility.event; private _entries: IStatusbarViewModelEntry[] = []; // Intentionally not using a map here since multiple entries can have the same ID diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 850dc4c4993..1bc4589ba42 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -30,9 +30,10 @@ import { hash } from 'vs/base/common/hash'; import { IHoverService } from 'vs/workbench/services/hover/browser/hover'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IHoverDelegate, IHoverDelegateOptions, IHoverWidget } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; -import { CONTEXT_STATUS_BAR_FOCUSED, HideStatusbarEntryAction, ToggleStatusbarEntryVisibilityAction } from 'vs/workbench/browser/parts/statusbar/statusbarActions'; +import { HideStatusbarEntryAction, ToggleStatusbarEntryVisibilityAction } from 'vs/workbench/browser/parts/statusbar/statusbarActions'; import { IStatusbarEntryPriority, IStatusbarEntryLocation, IStatusbarViewModelEntry, StatusbarViewModel, isStatusbarEntryLocation } from 'vs/workbench/browser/parts/statusbar/statusbarModel'; import { StatusbarEntryItem } from 'vs/workbench/browser/parts/statusbar/statusbarItem'; +import { StatusBarFocused } from 'vs/workbench/common/contextkeys'; interface IPendingStatusbarEntry { readonly id: string; @@ -285,7 +286,7 @@ export class StatusbarPart extends Part implements IStatusbarService { // Track focus within container const scopedContextKeyService = this.contextKeyService.createScoped(this.element); - CONTEXT_STATUS_BAR_FOCUSED.bindTo(scopedContextKeyService).set(true); + StatusBarFocused.bindTo(scopedContextKeyService).set(true); // Left items container this.leftItemsContainer = document.createElement('div'); diff --git a/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css b/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css index 3a31b368db3..78eb4c61d12 100644 --- a/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css +++ b/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css @@ -162,7 +162,12 @@ } .monaco-workbench .part.titlebar > .window-controls-container.show-layout-control > .layout-dropdown-container { - display: inline-block; + display: flex; + justify-content: center; +} + +.monaco-workbench:not(.mac):not(.web) .part.titlebar > .window-controls-container.show-layout-control > .layout-dropdown-container { + width: 46px; } .monaco-workbench .part.titlebar > .window-controls-container.show-layout-control > .layout-dropdown-container .codicon { diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 95ccdf43cb7..2ddc43cd2b8 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -40,7 +40,7 @@ import { IsMacNativeContext, IsWebContext } from 'vs/platform/contextkey/common/ import { ICommandService } from 'vs/platform/commands/common/commands'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -export type IOpenRecentAction = IAction & { uri: URI, remoteAuthority?: string }; +export type IOpenRecentAction = IAction & { uri: URI; remoteAuthority?: string }; MenuRegistry.appendMenuItem(MenuId.MenubarMainMenu, { submenu: MenuId.MenubarFileMenu, @@ -221,7 +221,7 @@ export abstract class MenubarControl extends Disposable { this.menuUpdater.schedule(); } - protected calculateActionLabel(action: { id: string; label: string; }): string { + protected calculateActionLabel(action: { id: string; label: string }): string { let label = action.label; switch (action.id) { default: diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 829ea03e13d..2b49ca74090 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -17,7 +17,7 @@ import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/co import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { EditorResourceAccessor, Verbosity, SideBySideEditor } from 'vs/workbench/common/editor'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { TITLE_BAR_ACTIVE_BACKGROUND, TITLE_BAR_ACTIVE_FOREGROUND, TITLE_BAR_INACTIVE_FOREGROUND, TITLE_BAR_INACTIVE_BACKGROUND, TITLE_BAR_BORDER, WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; @@ -42,7 +42,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { Schemas } from 'vs/base/common/network'; import { withNullAsUndefined } from 'vs/base/common/types'; import { Codicon } from 'vs/base/common/codicons'; -import { getVirtualWorkspaceLocation } from 'vs/platform/remote/common/remoteHosts'; +import { getVirtualWorkspaceLocation } from 'vs/platform/workspace/common/virtualWorkspace'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdownActionViewItem'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; @@ -98,7 +98,7 @@ export class TitlebarPart extends Part implements ITitleService { @IContextMenuService private readonly contextMenuService: IContextMenuService, @IConfigurationService protected readonly configurationService: IConfigurationService, @IEditorService private readonly editorService: IEditorService, - @IWorkbenchEnvironmentService protected readonly environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService protected readonly environmentService: IBrowserWorkbenchEnvironmentService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IInstantiationService protected readonly instantiationService: IInstantiationService, @IKeybindingService private readonly keybindingService: IKeybindingService, diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 8d4c90f4a5b..9ca06e7d6e1 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -8,7 +8,7 @@ import { toDisposable, IDisposable, Disposable, DisposableStore } from 'vs/base/ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { MenuId, IMenuService, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; +import { MenuId, IMenuService, registerAction2, Action2, IMenu } from 'vs/platform/actions/common/actions'; import { IContextKeyService, ContextKeyExpr, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ITreeView, ITreeViewDescriptor, IViewsRegistry, Extensions, IViewDescriptorService, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeItemLabel, ViewContainer, ViewContainerLocation, ResolvableTreeItem, ITreeViewDragAndDropController, ITreeDataTransfer } from 'vs/workbench/common/views'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; @@ -49,7 +49,7 @@ import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { IHoverDelegate, IHoverDelegateOptions } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; import { IMarkdownString } from 'vs/base/common/htmlContent'; -import { IIconLabelMarkdownString } from 'vs/base/browser/ui/iconLabel/iconLabel'; +import { ITooltipMarkdownString } from 'vs/base/browser/ui/iconLabel/iconLabelHover'; import { renderMarkdownAsPlaintext } from 'vs/base/browser/markdownRenderer'; import { API_OPEN_DIFF_EDITOR_COMMAND_ID, API_OPEN_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; import { Codicon } from 'vs/base/common/codicons'; @@ -57,7 +57,7 @@ import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cance import { Command } from 'vs/editor/common/languages'; import { isCancellationError } from 'vs/base/common/errors'; import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; -import { CodeDataTransfers, fillEditorsDragData } from 'vs/workbench/browser/dnd'; +import { CodeDataTransfers, DraggedTreeItemsIdentifier, fillEditorsDragData, LocalSelectionTransfer } from 'vs/workbench/browser/dnd'; import { Schemas } from 'vs/base/common/network'; import { ITreeViewsDragAndDropService } from 'vs/workbench/services/views/common/treeViewsDragAndDropService'; import { generateUuid } from 'vs/base/common/uuid'; @@ -589,6 +589,7 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { } })); + this._register(treeMenus.onDidChange((changed) => this.tree?.rerender(changed))); } private async resolveCommand(element: ITreeItem | undefined): Promise { @@ -799,7 +800,7 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { } class TreeViewIdentityProvider implements IIdentityProvider { - getId(element: ITreeItem): { toString(): string; } { + getId(element: ITreeItem): { toString(): string } { return element.handle; } } @@ -924,7 +925,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer resolve(node.tooltip)); }); }, - markdownNotSupportedFallback: resource ? undefined : label ?? '' // Passing undefined as the fallback for a resource falls back to the old native hover + markdownNotSupportedFallback: resource ? undefined : (label ?? '') // Passing undefined as the fallback for a resource falls back to the old native hover }; } @@ -980,7 +981,7 @@ class TreeRenderer extends Disposable implements ITreeRenderer('explorer.decorations'); + const fileDecorations = this.configurationService.getValue<{ colors: boolean; badges: boolean }>('explorer.decorations'); const labelResource = resource ? resource : URI.parse('missing:_icon_resource'); templateData.resourceLabel.setResource({ name: label, description, resource: labelResource }, { fileKind: this.getFileKind(node), @@ -1017,13 +1018,19 @@ class TreeRenderer extends Disposable implements ITreeRenderer{ $treeViewId: this.treeViewId, $treeItemHandle: node.handle }; - templateData.actionBar.push(this.menus.getResourceActions(node), { icon: true, label: false }); + + const disposableStore = new DisposableStore(); + templateData.elementDisposable = disposableStore; + const menuActions = this.menus.getResourceActions(node); + if (menuActions.menu) { + disposableStore.add(menuActions.menu); + } + templateData.actionBar.push(menuActions.actions, { icon: true, label: false }); + if (this._actionRunner) { templateData.actionBar.actionRunner = this._actionRunner; } this.setAlignment(templateData.container, node); - const disposableStore = new DisposableStore(); - templateData.elementDisposable = disposableStore; disposableStore.add(this.themeService.onDidFileIconThemeChange(() => this.setAlignment(templateData.container, node))); } @@ -1143,6 +1150,8 @@ class MultipleSelectionActionRunner extends ActionRunner { class TreeMenus extends Disposable implements IDisposable { private contextKeyService: IContextKeyService | undefined; + private _onDidChange = new Emitter(); + public readonly onDidChange = this._onDidChange.event; constructor( private id: string, @@ -1151,35 +1160,42 @@ class TreeMenus extends Disposable implements IDisposable { super(); } - getResourceActions(element: ITreeItem): IAction[] { - return this.getActions(MenuId.ViewItemContext, { key: 'viewItem', value: element.contextValue }).primary; + /** + * Caller is now responsible for disposing of the menu! + */ + getResourceActions(element: ITreeItem): { menu?: IMenu; actions: IAction[] } { + const actions = this.getActions(MenuId.ViewItemContext, element, true); + return { menu: actions.menu, actions: actions.primary }; } getResourceContextActions(element: ITreeItem): IAction[] { - return this.getActions(MenuId.ViewItemContext, { key: 'viewItem', value: element.contextValue }).secondary; + return this.getActions(MenuId.ViewItemContext, element).secondary; } public setContextKeyService(service: IContextKeyService) { this.contextKeyService = service; } - private getActions(menuId: MenuId, context: { key: string, value?: string; }): { primary: IAction[]; secondary: IAction[]; } { + private getActions(menuId: MenuId, element: ITreeItem, listen: boolean = false): { menu?: IMenu; primary: IAction[]; secondary: IAction[] } { if (!this.contextKeyService) { return { primary: [], secondary: [] }; } const contextKeyService = this.contextKeyService.createOverlay([ ['view', this.id], - [context.key, context.value] + ['viewItem', element.contextValue] ]); const menu = this.menuService.createMenu(menuId, contextKeyService); const primary: IAction[] = []; const secondary: IAction[] = []; - const result = { primary, secondary }; + const result = { primary, secondary, menu }; createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result, 'inline'); - menu.dispose(); - + if (listen) { + this._register(menu.onDidChange(() => this._onDidChange.fire(element))); + } else { + menu.dispose(); + } return result; } } @@ -1233,7 +1249,7 @@ export class TreeView extends AbstractTreeView { } interface TreeDragSourceInfo { - id: string, + id: string; itemHandles: string[]; } @@ -1241,6 +1257,9 @@ const TREE_DRAG_UUID_MIME = 'tree-dnd'; export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { private readonly treeMimeType: string; + private readonly treeItemsTransfer = LocalSelectionTransfer.getInstance(); + private dragCancellationToken: CancellationTokenSource | undefined; + constructor( private readonly treeId: string, @ILabelService private readonly labelService: ILabelService, @@ -1260,8 +1279,14 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { return; } const uuid = generateUuid(); - this.treeViewsDragAndDropService.addDragOperationTransfer(uuid, this.dndController.handleDrag(itemHandles, uuid)); + + this.dragCancellationToken = new CancellationTokenSource(); + this.treeViewsDragAndDropService.addDragOperationTransfer(uuid, this.dndController.handleDrag(itemHandles, uuid, this.dragCancellationToken.token)); originalEvent.dataTransfer.setData(TREE_DRAG_UUID_MIME, uuid); + this.treeItemsTransfer.setData([new DraggedTreeItemsIdentifier(uuid)], DraggedTreeItemsIdentifier.prototype); + this.dndController.dragMimeTypes.forEach(supportedType => { + originalEvent.dataTransfer?.setData(supportedType, ''); + }); } private addResourceInfoToTransfer(originalEvent: DragEvent, resources: URI[]) { @@ -1302,14 +1327,14 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { onDragOver(data: IDragAndDropData, targetElement: ITreeItem, targetIndex: number, originalEvent: DragEvent): boolean | ITreeDragOverReaction { this.logService.debug(`TreeView dragged mime types: ${originalEvent.dataTransfer?.types.join(', ')}`); const dndController = this.dndController; - if (!dndController || !originalEvent.dataTransfer || (dndController.supportedMimeTypes.length === 0)) { + if (!dndController || !originalEvent.dataTransfer || (dndController.dropMimeTypes.length === 0)) { return false; } const dragContainersSupportedType = originalEvent.dataTransfer.types.some((value, index) => { if (value === this.treeMimeType) { return true; } else { - return dndController.supportedMimeTypes.indexOf(value) >= 0; + return dndController.dropMimeTypes.indexOf(value) >= 0; } }); if (dragContainersSupportedType) { @@ -1365,7 +1390,7 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { for (const dataItem of originalEvent.dataTransfer.items) { const type = dataItem.type; if (dataItem.kind === 'string') { - if ((type === this.treeMimeType) || (type === TREE_DRAG_UUID_MIME) || (dndController.supportedMimeTypes.indexOf(type) >= 0)) { + if ((type === this.treeMimeType) || (type === TREE_DRAG_UUID_MIME) || (dndController.dropMimeTypes.indexOf(type) >= 0)) { dataItem.getAsString(dataValue => { if (type === this.treeMimeType) { treeSourceInfo = JSON.parse(dataValue); @@ -1373,7 +1398,8 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { willDropUuid = dataValue; } else { treeDataTransfer.set(type, { - asString: () => Promise.resolve(dataValue) + asString: () => Promise.resolve(dataValue), + value: undefined }); } decrementStringCount(); @@ -1387,7 +1413,7 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { const additionalWillDropPromise = this.treeViewsDragAndDropService.removeDragOperationTransfer(willDropUuid); if (!additionalWillDropPromise) { - return dndController.handleDrop(treeDataTransfer, targetNode, willDropUuid, treeSourceInfo?.id, treeSourceInfo?.itemHandles); + return dndController.handleDrop(treeDataTransfer, targetNode, new CancellationTokenSource().token, willDropUuid, treeSourceInfo?.id, treeSourceInfo?.itemHandles); } return additionalWillDropPromise.then(additionalDataTransfer => { if (additionalDataTransfer) { @@ -1395,8 +1421,15 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { treeDataTransfer.set(item[0], item[1]); } } - return dndController.handleDrop(treeDataTransfer, targetNode, willDropUuid, treeSourceInfo?.id, treeSourceInfo?.itemHandles); + return dndController.handleDrop(treeDataTransfer, targetNode, new CancellationTokenSource().token, willDropUuid, treeSourceInfo?.id, treeSourceInfo?.itemHandles); }); } + + onDragEnd(originalEvent: DragEvent): void { + // Check if the drag was cancelled. + if (originalEvent.dataTransfer?.dropEffect === 'none') { + this.dragCancellationToken?.cancel(); + } + } } diff --git a/src/vs/workbench/browser/parts/views/viewPane.ts b/src/vs/workbench/browser/parts/views/viewPane.ts index 51b3f5551ce..fa70a4f92f9 100644 --- a/src/vs/workbench/browser/parts/views/viewPane.ts +++ b/src/vs/workbench/browser/parts/views/viewPane.ts @@ -50,8 +50,8 @@ export interface IViewPaneOptions extends IPaneOptions { } type WelcomeActionClassification = { - viewId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - uri: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + viewId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + uri: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; const viewPaneContainerExpandedIcon = registerIcon('view-pane-container-expanded', Codicon.chevronDown, nls.localize('viewPaneContainerExpandedIcon', 'Icon for an expanded view pane container.')); @@ -565,7 +565,7 @@ export abstract class ViewPane extends Pane implements IView { const button = new Button(buttonContainer, { title: node.title, supportIcons: true }); button.label = node.label; button.onDidClick(_ => { - this.telemetryService.publicLog2<{ viewId: string, uri: string }, WelcomeActionClassification>('views.welcomeAction', { viewId: this.id, uri: node.href }); + this.telemetryService.publicLog2<{ viewId: string; uri: string }, WelcomeActionClassification>('views.welcomeAction', { viewId: this.id, uri: node.href }); this.openerService.open(node.href, { allowCommands: true }); }, null, disposables); disposables.add(button); diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index e2dd174a6f1..59872456427 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -36,9 +36,10 @@ import { ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { Component } from 'vs/workbench/common/component'; import { PANEL_SECTION_BORDER, PANEL_SECTION_DRAG_AND_DROP_BACKGROUND, PANEL_SECTION_HEADER_BACKGROUND, PANEL_SECTION_HEADER_BORDER, PANEL_SECTION_HEADER_FOREGROUND, SIDE_BAR_DRAG_AND_DROP_BACKGROUND, SIDE_BAR_SECTION_HEADER_BACKGROUND, SIDE_BAR_SECTION_HEADER_BORDER, SIDE_BAR_SECTION_HEADER_FOREGROUND } from 'vs/workbench/common/theme'; -import { FocusedViewContext, IAddedViewDescriptorRef, ICustomViewDescriptor, IView, IViewContainerModel, IViewDescriptor, IViewDescriptorRef, IViewDescriptorService, IViewPaneContainer, IViewsService, ViewContainer, ViewContainerLocation, ViewContainerLocationToString, ViewVisibilityState } from 'vs/workbench/common/views'; +import { IAddedViewDescriptorRef, ICustomViewDescriptor, IView, IViewContainerModel, IViewDescriptor, IViewDescriptorRef, IViewDescriptorService, IViewPaneContainer, IViewsService, ViewContainer, ViewContainerLocation, ViewContainerLocationToString, ViewVisibilityState } from 'vs/workbench/common/views'; +import { FocusedViewContext } from 'vs/workbench/common/contextkeys'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; +import { IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService'; export const ViewsSubMenu = new MenuId('Views'); MenuRegistry.appendMenuItem(MenuId.ViewContainerTitle, { @@ -72,7 +73,7 @@ const enum DropDirection { RIGHT } -type BoundingRect = { top: number, left: number, bottom: number, right: number }; +type BoundingRect = { top: number; left: number; bottom: number; right: number }; class ViewPaneDropOverlay extends Themable { @@ -270,7 +271,7 @@ class ViewPaneDropOverlay extends Themable { this.overlay.style.borderRightWidth = direction === DropDirection.RIGHT ? '2px' : '0px'; } - private doPositionOverlay(options: { top?: string, bottom?: string, left?: string, right?: string, width: string, height: string }): void { + private doPositionOverlay(options: { top?: string; bottom?: string; left?: string; right?: string; width: string; height: string }): void { // Container this.container.style.height = '100%'; @@ -434,7 +435,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { }; }; - const inBounds = (bounds: BoundingRect, pos: { x: number, y: number }) => { + const inBounds = (bounds: BoundingRect, pos: { x: number; y: number }) => { return pos.x >= bounds.left && pos.x <= bounds.right && pos.y >= bounds.top && pos.y <= bounds.bottom; }; @@ -579,7 +580,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { event.stopPropagation(); event.preventDefault(); - let anchor: { x: number, y: number; } = { x: event.posx, y: event.posy }; + let anchor: { x: number; y: number } = { x: event.posx, y: event.posy }; this.contextMenuService.showContextMenu({ getAnchor: () => anchor, getActions: () => this.menuActions?.getContextMenuActions() ?? [] @@ -616,7 +617,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { case ViewContainerLocation.AuxiliaryBar: return Orientation.VERTICAL; case ViewContainerLocation.Panel: - return Orientation.HORIZONTAL; + return this.layoutService.getPanelPosition() === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; } return Orientation.VERTICAL; @@ -646,7 +647,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { return optimalWidth + additionalMargin; } - addPanes(panes: { pane: ViewPane, size: number, index?: number; }[]): void { + addPanes(panes: { pane: ViewPane; size: number; index?: number }[]): void { const wasMerged = this.isViewMergedWithContainer(); for (const { pane: pane, size, index } of panes) { @@ -742,7 +743,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { const actions: IAction[] = viewPane.menuActions.getContextMenuActions(); - let anchor: { x: number, y: number } = { x: event.posx, y: event.posy }; + let anchor: { x: number; y: number } = { x: event.posx, y: event.posy }; this.contextMenuService.showContextMenu({ getAnchor: () => anchor, getActions: () => actions @@ -765,7 +766,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { } protected onDidAddViewDescriptors(added: IAddedViewDescriptorRef[]): ViewPane[] { - const panesToAdd: { pane: ViewPane, size: number, index: number }[] = []; + const panesToAdd: { pane: ViewPane; size: number; index: number }[] = []; for (const { viewDescriptor, collapsed, index, size } of added) { const pane = this.createView(viewDescriptor, @@ -822,10 +823,10 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { if (this.viewContainerModel.activeViewDescriptors.some(viewDescriptor => viewDescriptor.id === viewId)) { const visible = !this.viewContainerModel.isVisible(viewId); type ViewsToggleVisibilityClassification = { - viewId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - visible: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + viewId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + visible: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; - this.telemetryService.publicLog2<{ viewId: String, visible: boolean }, ViewsToggleVisibilityClassification>('views.toggleVisibility', { viewId, visible }); + this.telemetryService.publicLog2<{ viewId: String; visible: boolean }, ViewsToggleVisibilityClassification>('views.toggleVisibility', { viewId, visible }); this.viewContainerModel.setVisible(viewId, visible); } } @@ -1261,7 +1262,7 @@ registerAction2(class MoveViews extends Action2 { }); } - async run(accessor: ServicesAccessor, options: { viewIds: string[], destinationId: string }): Promise { + async run(accessor: ServicesAccessor, options: { viewIds: string[]; destinationId: string }): Promise { if (!Array.isArray(options?.viewIds) || typeof options?.destinationId !== 'string') { return Promise.reject('Invalid arguments'); } diff --git a/src/vs/workbench/browser/parts/views/viewsService.ts b/src/vs/workbench/browser/parts/views/viewsService.ts index 4ecd0454eb0..e0a65e456a6 100644 --- a/src/vs/workbench/browser/parts/views/viewsService.ts +++ b/src/vs/workbench/browser/parts/views/viewsService.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable, IDisposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { IViewDescriptorService, ViewContainer, IViewDescriptor, IView, ViewContainerLocation, IViewsService, IViewPaneContainer, getVisbileViewContextKey, getEnabledViewContainerContextKey, FocusedViewContext } from 'vs/workbench/common/views'; +import { IViewDescriptorService, ViewContainer, IViewDescriptor, IView, ViewContainerLocation, IViewsService, IViewPaneContainer } from 'vs/workbench/common/views'; +import { FocusedViewContext, getVisbileViewContextKey, getEnabledViewContainerContextKey } from 'vs/workbench/common/contextkeys'; import { Registry } from 'vs/platform/registry/common/platform'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -38,10 +39,10 @@ export class ViewsService extends Disposable implements IViewsService { private readonly viewDisposable: Map; private readonly viewPaneContainers: Map; - private readonly _onDidChangeViewVisibility: Emitter<{ id: string, visible: boolean }> = this._register(new Emitter<{ id: string, visible: boolean }>()); - readonly onDidChangeViewVisibility: Event<{ id: string, visible: boolean }> = this._onDidChangeViewVisibility.event; + private readonly _onDidChangeViewVisibility: Emitter<{ id: string; visible: boolean }> = this._register(new Emitter<{ id: string; visible: boolean }>()); + readonly onDidChangeViewVisibility: Event<{ id: string; visible: boolean }> = this._onDidChangeViewVisibility.event; - private readonly _onDidChangeViewContainerVisibility = this._register(new Emitter<{ id: string, visible: boolean, location: ViewContainerLocation }>()); + private readonly _onDidChangeViewContainerVisibility = this._register(new Emitter<{ id: string; visible: boolean; location: ViewContainerLocation }>()); readonly onDidChangeViewContainerVisibility = this._onDidChangeViewContainerVisibility.event; private readonly visibleViewContextKeys: Map>; @@ -102,7 +103,7 @@ export class ViewsService extends Disposable implements IViewsService { return contextKey; } - private onDidChangeContainers(added: ReadonlyArray<{ container: ViewContainer, location: ViewContainerLocation }>, removed: ReadonlyArray<{ container: ViewContainer, location: ViewContainerLocation }>): void { + private onDidChangeContainers(added: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }>, removed: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }>): void { for (const { container, location } of removed) { this.deregisterPaneComposite(container, location); } @@ -157,7 +158,7 @@ export class ViewsService extends Disposable implements IViewsService { return this.paneCompositeService.openPaneComposite(compositeId, location, focus); } - private getComposite(compositeId: string, location: ViewContainerLocation): { id: string, name: string } | undefined { + private getComposite(compositeId: string, location: ViewContainerLocation): { id: string; name: string } | undefined { return this.paneCompositeService.getPaneComposite(compositeId, location); } @@ -268,7 +269,7 @@ export class ViewsService extends Disposable implements IViewsService { const location = this.viewDescriptorService.getViewContainerLocation(viewContainer); if (location === ViewContainerLocation.Sidebar) { this.layoutService.setPartHidden(true, Parts.SIDEBAR_PART); - } else if (location === ViewContainerLocation.Panel) { + } else if (location === ViewContainerLocation.Panel || location === ViewContainerLocation.AuxiliaryBar) { this.paneCompositeService.hideActivePaneComposite(location); } @@ -431,10 +432,14 @@ export class ViewsService extends Disposable implements IViewsService { const focusedViewId = FocusedViewContext.getValue(contextKeyService); if (focusedViewId === viewDescriptor.id) { + + const viewLocation = viewDescriptorService.getViewLocationById(viewDescriptor.id); if (viewDescriptorService.getViewLocationById(viewDescriptor.id) === ViewContainerLocation.Sidebar) { + // focus the editor if the view is focused and in the side bar editorGroupService.activeGroup.focus(); - } else { - layoutService.setPartHidden(true, Parts.PANEL_PART); + } else if (viewLocation !== null) { + // otherwise hide the part where the view lives if focused + layoutService.setPartHidden(true, getPartByLocation(viewLocation)); } } else { viewsService.openView(viewDescriptor.id, true); @@ -626,7 +631,7 @@ function getPaneCompositeExtension(viewContainerLocation: ViewContainerLocation) } } -function getPartByLocation(viewContainerLocation: ViewContainerLocation): Parts.AUXILIARYBAR_PART | Parts.SIDEBAR_PART | Parts.PANEL_PART { +export function getPartByLocation(viewContainerLocation: ViewContainerLocation): Parts.AUXILIARYBAR_PART | Parts.SIDEBAR_PART | Parts.PANEL_PART { switch (viewContainerLocation) { case ViewContainerLocation.AuxiliaryBar: return Parts.AUXILIARYBAR_PART; diff --git a/src/vs/workbench/browser/quickaccess.ts b/src/vs/workbench/browser/quickaccess.ts index 2f527dab11a..a7e0980b6d2 100644 --- a/src/vs/workbench/browser/quickaccess.ts +++ b/src/vs/workbench/browser/quickaccess.ts @@ -21,11 +21,11 @@ export interface IWorkbenchQuickAccessConfiguration { commandPalette: { history: number; preserveInput: boolean; - }, + }; quickOpen: { enableExperimentalNewVersion: boolean; preserveInput: boolean; - } + }; }; } diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/browser/web.api.ts similarity index 60% rename from src/vs/workbench/workbench.web.api.ts rename to src/vs/workbench/browser/web.api.ts index ab8bbf4f72e..44593e92807 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/browser/web.api.ts @@ -3,363 +3,81 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/workbench/workbench.web.main'; -import { main } from 'vs/workbench/browser/web.main'; -import { UriComponents, URI } from 'vs/base/common/uri'; -import { IWebSocketFactory, IWebSocket } from 'vs/platform/remote/browser/browserSocketFactory'; -import { IURLCallbackProvider } from 'vs/workbench/services/url/browser/urlService'; -import { LogLevel } from 'vs/platform/log/common/log'; -import { IUpdateProvider, IUpdate } from 'vs/workbench/services/update/browser/updateService'; -import { Event, Emitter } from 'vs/base/common/event'; -import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IWorkspaceProvider, IWorkspace } from 'vs/workbench/services/host/browser/browserHostService'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { IProductConfiguration } from 'vs/base/common/product'; -import { mark } from 'vs/base/common/performance'; -import { ICredentialsProvider } from 'vs/platform/credentials/common/credentials'; -import { TunnelProviderFeatures } from 'vs/platform/remote/common/tunnel'; -import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; -import { DeferredPromise } from 'vs/base/common/async'; -import { asArray } from 'vs/base/common/arrays'; - -interface IResourceUriProvider { - (uri: URI): URI; -} +import type { PerformanceMark } from 'vs/base/common/performance'; +import type { UriComponents, URI } from 'vs/base/common/uri'; +import type { IWebSocketFactory } from 'vs/platform/remote/browser/browserSocketFactory'; +import type { IURLCallbackProvider } from 'vs/workbench/services/url/browser/urlService'; +import type { LogLevel } from 'vs/platform/log/common/log'; +import type { IUpdateProvider } from 'vs/workbench/services/update/browser/updateService'; +import type { Event } from 'vs/base/common/event'; +import type { IWorkspaceProvider } from 'vs/workbench/services/host/browser/browserHostService'; +import type { IProductConfiguration } from 'vs/base/common/product'; +import type { ICredentialsProvider } from 'vs/platform/credentials/common/credentials'; +import type { TunnelProviderFeatures } from 'vs/platform/tunnel/common/tunnel'; /** - * The identifier of an extension in the format: `PUBLISHER.NAME`. - * For example: `vscode.csharp` + * The `IWorkbench` interface is the API facade for web embedders + * to call into the workbench. + * + * Note: Changes to this interface need to be announced and adopted. */ -type ExtensionId = string; +export interface IWorkbench { -type MarketplaceExtension = ExtensionId | { readonly id: ExtensionId, preRelease?: boolean, migrateStorageFrom?: ExtensionId }; + commands: { -interface ICommonTelemetryPropertiesResolver { - (): { [key: string]: any }; -} + /** + * Allows to execute any command if known with the provided arguments. + * + * @param command Identifier of the command to execute. + * @param rest Parameters passed to the command function. + * @return A promise that resolves to the returned value of the given command. + */ + executeCommand(command: string, ...args: any[]): Promise; + }; -interface IExternalUriResolver { - (uri: URI): Promise; -} + env: { -/** - * External URL opener - */ -interface IExternalURLOpener { + /** + * @returns the scheme to use for opening the associated desktop + * experience via protocol handler. + */ + readonly uriScheme: string; + + /** + * Retrieve performance marks that have been collected during startup. This function + * returns tuples of source and marks. A source is a dedicated context, like + * the renderer or an extension host. + * + * *Note* that marks can be collected on different machines and in different processes + * and that therefore "different clocks" are used. So, comparing `startTime`-properties + * across contexts should be taken with a grain of salt. + * + * @returns A promise that resolves to tuples of source and marks. + */ + retrievePerformanceMarks(): Promise<[string, readonly PerformanceMark[]][]>; + + /** + * Allows to open a `URI` with the standard opener service of the + * workbench. + */ + openUri(target: URI): Promise; + }; /** - * Overrides the behavior when an external URL is about to be opened. - * Returning false means that the URL wasn't handled, and the default - * handling behavior should be used: `window.open(href, '_blank', 'noopener');` + * Triggers shutdown of the workbench programmatically. After this method is + * called, the workbench is not usable anymore and the page needs to reload + * or closed. * - * @returns true if URL was handled, false otherwise. - */ - openExternal(href: string): boolean | Promise; -} - -interface ITunnelProvider { - - /** - * Support for creating tunnels. - */ - tunnelFactory?: ITunnelFactory; - - /** - * Support for filtering candidate ports. - */ - showPortCandidate?: IShowPortCandidate; - - /** - * The features that the tunnel provider supports. - */ - features?: TunnelProviderFeatures; -} - -interface ITunnelFactory { - (tunnelOptions: ITunnelOptions, tunnelCreationOptions: TunnelCreationOptions): Promise | undefined; -} - -interface ITunnelOptions { - - remoteAddress: { port: number, host: string }; - - /** - * The desired local port. If this port can't be used, then another will be chosen. - */ - localAddressPort?: number; - - label?: string; - - /** - * @deprecated Use privacy instead - */ - public?: boolean; - - privacy?: string; - - protocol?: string; -} - -interface TunnelCreationOptions { - - /** - * True when the local operating system will require elevation to use the requested local port. - */ - elevationRequired?: boolean; -} - -interface ITunnel { - - remoteAddress: { port: number, host: string }; - - /** - * The complete local address(ex. localhost:1234) - */ - localAddress: string; - - /** - * @deprecated Use privacy instead - */ - public?: boolean; - - privacy?: string; - - /** - * If protocol is not provided, it is assumed to be http, regardless of the localAddress - */ - protocol?: string; - - /** - * Implementers of Tunnel should fire onDidDispose when dispose is called. - */ - onDidDispose: Event; - - dispose(): Promise | void; -} - -interface IShowPortCandidate { - (host: string, port: number, detail: string): Promise; -} - -enum Menu { - CommandPalette, - StatusBarWindowIndicatorMenu, -} - -function asMenuId(menu: Menu): MenuId { - switch (menu) { - case Menu.CommandPalette: return MenuId.CommandPalette; - case Menu.StatusBarWindowIndicatorMenu: return MenuId.StatusBarWindowIndicatorMenu; - } -} - -interface ICommand { - - /** - * An identifier for the command. Commands can be executed from extensions - * using the `vscode.commands.executeCommand` API using that command ID. - */ - id: string, - - /** - * The optional label of the command. If provided, the command will appear - * in the command palette. - */ - label?: string, - - /** - * The optional menus to append this command to. Only valid if `label` is - * provided as well. - * @default Menu.CommandPalette - */ - menu?: Menu | Menu[], - - /** - * A function that is being executed with any arguments passed over. The - * return type will be send back to the caller. + * This will also remove any `beforeUnload` handlers that would bring up a + * confirmation dialog. * - * Note: arguments and return type should be serializable so that they can - * be exchanged across processes boundaries. + * The returned promise should be awaited on to ensure any data to persist + * has been persisted. */ - handler: (...args: any[]) => unknown; + shutdown: () => Promise; } -interface IHomeIndicator { - - /** - * The link to open when clicking the home indicator. - */ - href: string; - - /** - * The icon name for the home indicator. This needs to be one of the existing - * icons from our Codicon icon set. For example `code`. - */ - icon: string; - - /** - * A tooltip that will appear while hovering over the home indicator. - */ - title: string; -} - -interface IWelcomeBanner { - - /** - * Welcome banner message to appear as text. - */ - message: string; - - /** - * Optional icon for the banner. This is either the URL to an icon to use - * or the name of one of the existing icons from our Codicon icon set. - * - * If not provided a default icon will be used. - */ - icon?: string | UriComponents; - - /** - * Optional actions to appear as links after the welcome banner message. - */ - actions?: IWelcomeBannerAction[]; -} - -interface IWelcomeBannerAction { - - /** - * The link to open when clicking. Supports command invocation when - * using the `command:` value. - */ - href: string; - - /** - * The label to show for the action link. - */ - label: string; - - /** - * A tooltip that will appear while hovering over the action link. - */ - title?: string; -} - -interface IWindowIndicator { - - /** - * Triggering this event will cause the window indicator to update. - */ - readonly onDidChange?: Event; - - /** - * Label of the window indicator may include octicons - * e.g. `$(remote) label` - */ - label: string; - - /** - * Tooltip of the window indicator should not include - * octicons and be descriptive. - */ - tooltip: string; - - /** - * If provided, overrides the default command that - * is executed when clicking on the window indicator. - */ - command?: string; -} - -enum ColorScheme { - DARK = 'dark', - LIGHT = 'light', - HIGH_CONTRAST = 'hc' -} - -interface IInitialColorTheme { - - /** - * Initial color theme type. - */ - readonly themeType: ColorScheme; - - /** - * A list of workbench colors to apply initially. - */ - readonly colors?: { [colorId: string]: string }; -} - -interface IDefaultView { - readonly id: string; -} - -interface IPosition { - readonly line: number; - readonly column: number; -} - -interface IRange { - - /** - * The start position. It is before or equal to end position. - */ - readonly start: IPosition; - - /** - * The end position. It is after or equal to start position. - */ - readonly end: IPosition; -} - -interface IDefaultEditor { - readonly uri: UriComponents; - readonly selection?: IRange; - readonly openOnlyIfExists?: boolean; - readonly openWith?: string; -} - -interface IDefaultLayout { - readonly views?: IDefaultView[]; - readonly editors?: IDefaultEditor[]; - - /** - * Forces this layout to be applied even if this isn't - * the first time the workspace has been opened - */ - readonly force?: boolean; -} - -interface IProductQualityChangeHandler { - - /** - * Handler is being called when the user wants to switch between - * `insider` or `stable` product qualities. - */ - (newQuality: 'insider' | 'stable'): void; -} - -/** - * Settings sync options - */ -interface ISettingsSyncOptions { - - /** - * Is settings sync enabled - */ - readonly enabled: boolean; - - /** - * Version of extensions sync state. - * Extensions sync state will be reset if version is provided and different from previous version. - */ - readonly extensionsSyncStateVersion?: string; - - /** - * Handler is being called when the user changes Settings Sync enablement. - */ - enablementHandler?(enablement: boolean): void; -} - -interface IWorkbenchConstructionOptions { +export interface IWorkbenchConstructionOptions { //#region Connection related configuration @@ -404,13 +122,13 @@ interface IWorkbenchConstructionOptions { /** * Endpoints to be used for proxying authentication code exchange calls in the browser. */ - readonly codeExchangeProxyEndpoints?: { [providerId: string]: string } + readonly codeExchangeProxyEndpoints?: { [providerId: string]: string }; /** * [TEMPORARY]: This will be removed soon. * Endpoints to be used for proxying repository tarball download calls in the browser. */ - readonly _tarballProxyEndpoints?: { [providerId: string]: string } + readonly _tarballProxyEndpoints?: { [providerId: string]: string }; //#endregion @@ -555,7 +273,333 @@ interface IWorkbenchConstructionOptions { } -interface IDevelopmentOptions { +export interface IResourceUriProvider { + (uri: URI): URI; +} + +/** + * The identifier of an extension in the format: `PUBLISHER.NAME`. For example: `vscode.csharp` + */ +export type ExtensionId = string; + +export type MarketplaceExtension = ExtensionId | { readonly id: ExtensionId; preRelease?: boolean; migrateStorageFrom?: ExtensionId }; + +export interface ICommonTelemetryPropertiesResolver { + (): { [key: string]: any }; +} + +export interface IExternalUriResolver { + (uri: URI): Promise; +} + +export interface IExternalURLOpener { + + /** + * Overrides the behavior when an external URL is about to be opened. + * Returning false means that the URL wasn't handled, and the default + * handling behavior should be used: `window.open(href, '_blank', 'noopener');` + * + * @returns true if URL was handled, false otherwise. + */ + openExternal(href: string): boolean | Promise; +} + +export interface ITunnelProvider { + + /** + * Support for creating tunnels. + */ + tunnelFactory?: ITunnelFactory; + + /** + * Support for filtering candidate ports. + */ + showPortCandidate?: IShowPortCandidate; + + /** + * The features that the tunnel provider supports. + */ + features?: TunnelProviderFeatures; +} + +export interface ITunnelFactory { + (tunnelOptions: ITunnelOptions, tunnelCreationOptions: TunnelCreationOptions): Promise | undefined; +} + +export interface ITunnelOptions { + + remoteAddress: { port: number; host: string }; + + /** + * The desired local port. If this port can't be used, then another will be chosen. + */ + localAddressPort?: number; + + label?: string; + + /** + * @deprecated Use privacy instead + */ + public?: boolean; + + privacy?: string; + + protocol?: string; +} + +export interface TunnelCreationOptions { + + /** + * True when the local operating system will require elevation to use the requested local port. + */ + elevationRequired?: boolean; +} + +export interface ITunnel { + + remoteAddress: { port: number; host: string }; + + /** + * The complete local address(ex. localhost:1234) + */ + localAddress: string; + + /** + * @deprecated Use privacy instead + */ + public?: boolean; + + privacy?: string; + + /** + * If protocol is not provided, it is assumed to be http, regardless of the localAddress + */ + protocol?: string; + + /** + * Implementers of Tunnel should fire onDidDispose when dispose is called. + */ + onDidDispose: Event; + + dispose(): Promise | void; +} + +export interface IShowPortCandidate { + (host: string, port: number, detail: string): Promise; +} + +export enum Menu { + CommandPalette, + StatusBarWindowIndicatorMenu, +} + +export interface ICommand { + + /** + * An identifier for the command. Commands can be executed from extensions + * using the `vscode.commands.executeCommand` API using that command ID. + */ + id: string; + + /** + * The optional label of the command. If provided, the command will appear + * in the command palette. + */ + label?: string; + + /** + * The optional menus to append this command to. Only valid if `label` is + * provided as well. + * @default Menu.CommandPalette + */ + menu?: Menu | Menu[]; + + /** + * A function that is being executed with any arguments passed over. The + * return type will be send back to the caller. + * + * Note: arguments and return type should be serializable so that they can + * be exchanged across processes boundaries. + */ + handler: (...args: any[]) => unknown; +} + +export interface IHomeIndicator { + + /** + * The link to open when clicking the home indicator. + */ + href: string; + + /** + * The icon name for the home indicator. This needs to be one of the existing + * icons from our Codicon icon set. For example `code`. + */ + icon: string; + + /** + * A tooltip that will appear while hovering over the home indicator. + */ + title: string; +} + +export interface IWelcomeBanner { + + /** + * Welcome banner message to appear as text. + */ + message: string; + + /** + * Optional icon for the banner. This is either the URL to an icon to use + * or the name of one of the existing icons from our Codicon icon set. + * + * If not provided a default icon will be used. + */ + icon?: string | UriComponents; + + /** + * Optional actions to appear as links after the welcome banner message. + */ + actions?: IWelcomeBannerAction[]; +} + +export interface IWelcomeBannerAction { + + /** + * The link to open when clicking. Supports command invocation when + * using the `command:` value. + */ + href: string; + + /** + * The label to show for the action link. + */ + label: string; + + /** + * A tooltip that will appear while hovering over the action link. + */ + title?: string; +} + +export interface IWindowIndicator { + + /** + * Triggering this event will cause the window indicator to update. + */ + readonly onDidChange?: Event; + + /** + * Label of the window indicator may include octicons + * e.g. `$(remote) label` + */ + label: string; + + /** + * Tooltip of the window indicator should not include + * octicons and be descriptive. + */ + tooltip: string; + + /** + * If provided, overrides the default command that + * is executed when clicking on the window indicator. + */ + command?: string; +} + +export enum ColorScheme { + DARK = 'dark', + LIGHT = 'light', + HIGH_CONTRAST = 'hc' +} + +export interface IInitialColorTheme { + + /** + * Initial color theme type. + */ + readonly themeType: ColorScheme; + + /** + * A list of workbench colors to apply initially. + */ + readonly colors?: { [colorId: string]: string }; +} + +export interface IDefaultView { + readonly id: string; +} + +export interface IPosition { + readonly line: number; + readonly column: number; +} + +export interface IRange { + + /** + * The start position. It is before or equal to end position. + */ + readonly start: IPosition; + + /** + * The end position. It is after or equal to start position. + */ + readonly end: IPosition; +} + +export interface IDefaultEditor { + readonly uri: UriComponents; + readonly selection?: IRange; + readonly openOnlyIfExists?: boolean; + readonly openWith?: string; +} + +export interface IDefaultLayout { + readonly views?: IDefaultView[]; + readonly editors?: IDefaultEditor[]; + + /** + * Forces this layout to be applied even if this isn't + * the first time the workspace has been opened + */ + readonly force?: boolean; +} + +export interface IProductQualityChangeHandler { + + /** + * Handler is being called when the user wants to switch between + * `insider` or `stable` product qualities. + */ + (newQuality: 'insider' | 'stable'): void; +} + +/** + * Settings sync options + */ +export interface ISettingsSyncOptions { + + /** + * Is settings sync enabled + */ + readonly enabled: boolean; + + /** + * Version of extensions sync state. + * Extensions sync state will be reset if version is provided and different from previous version. + */ + readonly extensionsSyncStateVersion?: string; + + /** + * Handler is being called when the user changes Settings Sync enablement. + */ + enablementHandler?(enablement: boolean): void; +} + +export interface IDevelopmentOptions { /** * Current logging level. Default is `LogLevel.Info`. @@ -578,266 +622,3 @@ interface IDevelopmentOptions { readonly enableSmokeTestDriver?: boolean; } -interface IPerformanceMark { - - /** - * The name of a performace marker. - */ - readonly name: string; - - /** - * The UNIX timestamp at which the marker has been set. - */ - readonly startTime: number; -} - -interface IWorkbench { - - commands: { - - /** - * @see [executeCommand](#commands.executeCommand) - */ - executeCommand(command: string, ...args: any[]): Promise; - } - - env: { - - /** - * @see [getUriScheme](#env.getUriScheme) - */ - readonly uriScheme: string; - - /** - * @see [retrievePerformanceMarks](#commands.retrievePerformanceMarks) - */ - retrievePerformanceMarks(): Promise<[string, readonly IPerformanceMark[]][]>; - - /** - * @see [openUri](#env.openUri) - */ - openUri(target: URI): Promise; - } - - /** - * Triggers shutdown of the workbench programmatically. After this method is - * called, the workbench is not usable anymore and the page needs to reload - * or closed. - * - * This will also remove any `beforeUnload` handlers that would bring up a - * confirmation dialog. - * - * The returned promise should be awaited on to ensure any data to persist - * has been persisted. - */ - shutdown: () => Promise; -} - -/** - * Creates the workbench with the provided options in the provided container. - * - * @param domElement the container to create the workbench in - * @param options for setting up the workbench - */ -let created = false; -const workbenchPromise = new DeferredPromise(); -function create(domElement: HTMLElement, options: IWorkbenchConstructionOptions): IDisposable { - - // Mark start of workbench - mark('code/didLoadWorkbenchMain'); - - // Assert that the workbench is not created more than once. We currently - // do not support this and require a full context switch to clean-up. - if (created) { - throw new Error('Unable to create the VSCode workbench more than once.'); - } else { - created = true; - } - - // Register commands if any - if (Array.isArray(options.commands)) { - for (const c of options.commands) { - const command: ICommand = c; - - CommandsRegistry.registerCommand(command.id, (accessor, ...args) => { - // we currently only pass on the arguments but not the accessor - // to the command to reduce our exposure of internal API. - return command.handler(...args); - }); - - // Commands with labels appear in the command palette - if (command.label) { - for (const menu of asArray(command.menu ?? Menu.CommandPalette)) { - MenuRegistry.appendMenuItem(asMenuId(menu), { command: { id: command.id, title: command.label } }); - } - } - } - } - - CommandsRegistry.registerCommand('_workbench.getTarballProxyEndpoints', () => (options._tarballProxyEndpoints ?? {})); - - // Startup workbench and resolve waiters - let instantiatedWorkbench: IWorkbench | undefined = undefined; - main(domElement, options).then(workbench => { - instantiatedWorkbench = workbench; - workbenchPromise.complete(workbench); - }); - - return toDisposable(() => { - if (instantiatedWorkbench) { - instantiatedWorkbench.shutdown(); - } else { - workbenchPromise.p.then(instantiatedWorkbench => instantiatedWorkbench.shutdown()); - } - }); -} - - -//#region API Facade - -namespace commands { - - /** - * Allows to execute any command if known with the provided arguments. - * - * @param command Identifier of the command to execute. - * @param rest Parameters passed to the command function. - * @return A promise that resolves to the returned value of the given command. - */ - export async function executeCommand(command: string, ...args: any[]): Promise { - const workbench = await workbenchPromise.p; - - return workbench.commands.executeCommand(command, ...args); - } -} - -namespace env { - - /** - * Retrieve performance marks that have been collected during startup. This function - * returns tuples of source and marks. A source is a dedicated context, like - * the renderer or an extension host. - * - * *Note* that marks can be collected on different machines and in different processes - * and that therefore "different clocks" are used. So, comparing `startTime`-properties - * across contexts should be taken with a grain of salt. - * - * @returns A promise that resolves to tuples of source and marks. - */ - export async function retrievePerformanceMarks(): Promise<[string, readonly IPerformanceMark[]][]> { - const workbench = await workbenchPromise.p; - - return workbench.env.retrievePerformanceMarks(); - } - - /** - * @returns the scheme to use for opening the associated desktop - * experience via protocol handler. - */ - export async function getUriScheme(): Promise { - const workbench = await workbenchPromise.p; - - return workbench.env.uriScheme; - } - - /** - * Allows to open a `URI` with the standard opener service of the - * workbench. - */ - export async function openUri(target: URI): Promise { - const workbench = await workbenchPromise.p; - - return workbench.env.openUri(target); - } -} - -export { - - // Factory - create, - IWorkbenchConstructionOptions, - IWorkbench, - - // Basic Types - URI, - UriComponents, - Event, - Emitter, - IDisposable, - Disposable, - - // Workspace - IWorkspace, - IWorkspaceProvider, - - // WebSockets - IWebSocketFactory, - IWebSocket, - - // Resources - IResourceUriProvider, - - // Credentials - ICredentialsProvider, - - // Callbacks - IURLCallbackProvider, - - // LogLevel - LogLevel, - - // SettingsSync - ISettingsSyncOptions, - - // Updates/Quality - IUpdateProvider, - IUpdate, - IProductQualityChangeHandler, - - // Telemetry - ICommonTelemetryPropertiesResolver, - - // External Uris - IExternalUriResolver, - - // External URL Opener - IExternalURLOpener, - - // Tunnel - ITunnelProvider, - ITunnelFactory, - ITunnel, - ITunnelOptions, - - // Ports - IShowPortCandidate, - - // Commands - ICommand, - commands, - Menu, - - // Branding - IHomeIndicator, - IWelcomeBanner, - IWelcomeBannerAction, - IProductConfiguration, - IWindowIndicator, - IInitialColorTheme, - - // Default layout - IDefaultView, - IDefaultEditor, - IDefaultLayout, - IPosition, - IRange as ISelection, - - // Env - IPerformanceMark, - env, - - // Development - IDevelopmentOptions -}; - -//#endregion diff --git a/src/vs/workbench/browser/web.factory.ts b/src/vs/workbench/browser/web.factory.ts new file mode 100644 index 00000000000..4b271e566d4 --- /dev/null +++ b/src/vs/workbench/browser/web.factory.ts @@ -0,0 +1,122 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IWorkbench, IWorkbenchConstructionOptions, Menu } from 'vs/workbench/browser/web.api'; +import { BrowserMain } from 'vs/workbench/browser/web.main'; +import { URI } from 'vs/base/common/uri'; +import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { mark, PerformanceMark } from 'vs/base/common/performance'; +import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; +import { DeferredPromise } from 'vs/base/common/async'; +import { asArray } from 'vs/base/common/arrays'; + +let created = false; +const workbenchPromise = new DeferredPromise(); + +/** + * Creates the workbench with the provided options in the provided container. + * + * @param domElement the container to create the workbench in + * @param options for setting up the workbench + */ +export function create(domElement: HTMLElement, options: IWorkbenchConstructionOptions): IDisposable { + + // Mark start of workbench + mark('code/didLoadWorkbenchMain'); + + // Assert that the workbench is not created more than once. We currently + // do not support this and require a full context switch to clean-up. + if (created) { + throw new Error('Unable to create the VSCode workbench more than once.'); + } else { + created = true; + } + + // Register commands if any + if (Array.isArray(options.commands)) { + for (const command of options.commands) { + + CommandsRegistry.registerCommand(command.id, (accessor, ...args) => { + // we currently only pass on the arguments but not the accessor + // to the command to reduce our exposure of internal API. + return command.handler(...args); + }); + + // Commands with labels appear in the command palette + if (command.label) { + for (const menu of asArray(command.menu ?? Menu.CommandPalette)) { + MenuRegistry.appendMenuItem(asMenuId(menu), { command: { id: command.id, title: command.label } }); + } + } + } + } + + CommandsRegistry.registerCommand('_workbench.getTarballProxyEndpoints', () => (options._tarballProxyEndpoints ?? {})); + + // Startup workbench and resolve waiters + let instantiatedWorkbench: IWorkbench | undefined = undefined; + new BrowserMain(domElement, options).open().then(workbench => { + instantiatedWorkbench = workbench; + workbenchPromise.complete(workbench); + }); + + return toDisposable(() => { + if (instantiatedWorkbench) { + instantiatedWorkbench.shutdown(); + } else { + workbenchPromise.p.then(instantiatedWorkbench => instantiatedWorkbench.shutdown()); + } + }); +} + +function asMenuId(menu: Menu): MenuId { + switch (menu) { + case Menu.CommandPalette: return MenuId.CommandPalette; + case Menu.StatusBarWindowIndicatorMenu: return MenuId.StatusBarWindowIndicatorMenu; + } +} + +export namespace commands { + + /** + * {@linkcode IWorkbench.commands IWorkbench.commands.executeCommand} + */ + export async function executeCommand(command: string, ...args: any[]): Promise { + const workbench = await workbenchPromise.p; + + return workbench.commands.executeCommand(command, ...args); + } +} + +export namespace env { + + /** + * {@linkcode IWorkbench.env IWorkbench.env.retrievePerformanceMarks} + */ + export async function retrievePerformanceMarks(): Promise<[string, readonly PerformanceMark[]][]> { + const workbench = await workbenchPromise.p; + + return workbench.env.retrievePerformanceMarks(); + } + + /** + * {@linkcode IWorkbench.env IWorkbench.env.getUriScheme} + */ + export async function getUriScheme(): Promise { + const workbench = await workbenchPromise.p; + + return workbench.env.uriScheme; + } + + /** + * {@linkcode IWorkbench.env IWorkbench.env.openUri} + */ + export async function openUri(target: URI): Promise { + const workbench = await workbenchPromise.p; + + return workbench.env.openUri(target); + } +} diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 5180434eba9..2e1995f1b09 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { mark } from 'vs/base/common/performance'; -import { domContentLoaded, detectFullscreen, getCookieValue, WebFileSystemAccess } from 'vs/base/browser/dom'; +import { domContentLoaded, detectFullscreen, getCookieValue } from 'vs/base/browser/dom'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { ILogService, ConsoleLogger, MultiplexLogService, getLogLevel } from 'vs/platform/log/common/log'; import { ConsoleLogInAutomationLogger } from 'vs/platform/log/browser/log'; import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; -import { BrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; +import { BrowserWorkbenchEnvironmentService, IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { Workbench } from 'vs/workbench/browser/workbench'; import { RemoteFileSystemProviderClient } from 'vs/workbench/services/remote/common/remoteFileSystemProviderClient'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -21,18 +21,17 @@ import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remot import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IWorkbenchFileService } from 'vs/workbench/services/files/common/files'; import { FileService } from 'vs/platform/files/common/fileService'; -import { Schemas } from 'vs/base/common/network'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { Schemas, connectionTokenCookieName } from 'vs/base/common/network'; +import { IAnyWorkspaceIdentifier, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { onUnexpectedError } from 'vs/base/common/errors'; import { setFullscreen } from 'vs/base/browser/browser'; import { URI } from 'vs/base/common/uri'; -import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; import { ConfigurationCache } from 'vs/workbench/services/configuration/common/configurationCache'; import { ISignService } from 'vs/platform/sign/common/sign'; import { SignService } from 'vs/platform/sign/browser/signService'; -import type { IWorkbenchConstructionOptions, IWorkspace, IWorkbench } from 'vs/workbench/workbench.web.api'; +import { IWorkbenchConstructionOptions, IWorkbench } from 'vs/workbench/browser/web.api'; import { BrowserStorageService } from 'vs/platform/storage/browser/storageService'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { BufferLogService } from 'vs/platform/log/common/bufferLog'; @@ -68,9 +67,10 @@ import { mixin, safeStringify } from 'vs/base/common/objects'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; import { IndexedDB } from 'vs/base/browser/indexedDB'; import { BrowserCredentialsService } from 'vs/workbench/services/credentials/browser/credentialsService'; -import { ProxyChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IWorkspace } from 'vs/workbench/services/host/browser/browserHostService'; +import { WebFileSystemAccess } from 'vs/platform/files/browser/webFileSystemAccess'; -class BrowserMain extends Disposable { +export class BrowserMain extends Disposable { private readonly onWillShutdownDisposables = this._register(new DisposableStore()); @@ -107,7 +107,7 @@ class BrowserMain extends Disposable { this._register(instantiationService.createInstance(BrowserWindow)); // Logging - services.logService.trace('workbench configuration', safeStringify(this.configuration)); + services.logService.trace('workbench#open with configuration', safeStringify(this.configuration)); // Return API Facade return instantiationService.invokeFunction(accessor => { @@ -144,7 +144,7 @@ class BrowserMain extends Disposable { this._register(workbench.onDidShutdown(() => this.dispose())); } - private async initServices(): Promise<{ serviceCollection: ServiceCollection, configurationService: IWorkbenchConfigurationService, logService: ILogService }> { + private async initServices(): Promise<{ serviceCollection: ServiceCollection; configurationService: IWorkbenchConfigurationService; logService: ILogService }> { const serviceCollection = new ServiceCollection(); @@ -166,15 +166,15 @@ class BrowserMain extends Disposable { // Environment const logsPath = URI.file(toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, '')).with({ scheme: 'vscode-log' }); - const environmentService = new BrowserWorkbenchEnvironmentService({ workspaceId: payload.id, logsPath, ...this.configuration }, productService); - serviceCollection.set(IWorkbenchEnvironmentService, environmentService); + const environmentService = new BrowserWorkbenchEnvironmentService(payload.id, logsPath, this.configuration, productService); + serviceCollection.set(IBrowserWorkbenchEnvironmentService, environmentService); // Log const logService = new BufferLogService(getLogLevel(environmentService)); serviceCollection.set(ILogService, logService); // Remote - const connectionToken = environmentService.options.connectionToken || getCookieValue('vscode-tkn'); + const connectionToken = environmentService.options.connectionToken || getCookieValue(connectionTokenCookieName); const remoteAuthorityResolverService = new RemoteAuthorityResolverService(connectionToken, this.configuration.resourceUriProvider); serviceCollection.set(IRemoteAuthorityResolverService, remoteAuthorityResolverService); @@ -243,7 +243,7 @@ class BrowserMain extends Disposable { const workspaceTrustEnablementService = new WorkspaceTrustEnablementService(configurationService, environmentService); serviceCollection.set(IWorkspaceTrustEnablementService, workspaceTrustEnablementService); - const workspaceTrustManagementService = new WorkspaceTrustManagementService(configurationService, remoteAuthorityResolverService, storageService, uriIdentityService, environmentService, configurationService, workspaceTrustEnablementService); + const workspaceTrustManagementService = new WorkspaceTrustManagementService(configurationService, remoteAuthorityResolverService, storageService, uriIdentityService, environmentService, configurationService, workspaceTrustEnablementService, logService); serviceCollection.set(IWorkspaceTrustManagementService, workspaceTrustManagementService); // Update workspace trust so that configuration is updated accordingly @@ -269,10 +269,7 @@ class BrowserMain extends Disposable { // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Credentials Service - const credentialsService = environmentService.remoteAuthority - // If we have a remote authority, we can use the CredentialsService on the remote side - ? ProxyChannel.toService(remoteAgentService.getConnection()!.getChannel('credentials')) - : new BrowserCredentialsService(environmentService); + const credentialsService = new BrowserCredentialsService(environmentService, remoteAgentService, productService); serviceCollection.set(ICredentialsService, credentialsService); // Userdata Initialize Service @@ -364,18 +361,23 @@ class BrowserMain extends Disposable { const hostService = accessor.get(IHostService); const storageService = accessor.get(IStorageService); const credentialsService = accessor.get(ICredentialsService); + const logService = accessor.get(ILogService); const result = await dialogService.confirm({ message: localize('reset user data message', "Would you like to reset your data (settings, keybindings, extensions, snippets and UI State) and reload?") }); if (result.confirmed) { - await provider?.reset(); - if (storageService instanceof BrowserStorageService) { - await storageService.clear(); - } - - if (credentialsService.clear) { - await credentialsService.clear(); + try { + await provider?.reset(); + if (storageService instanceof BrowserStorageService) { + await storageService.clear(); + } + if (typeof credentialsService.clear === 'function') { + await credentialsService.clear(); + } + } catch (error) { + logService.error(error); + throw error; } } @@ -384,7 +386,7 @@ class BrowserMain extends Disposable { }); } - private async createStorageService(payload: IWorkspaceInitializationPayload, logService: ILogService): Promise { + private async createStorageService(payload: IAnyWorkspaceIdentifier, logService: ILogService): Promise { const storageService = new BrowserStorageService(payload, logService); try { @@ -402,7 +404,7 @@ class BrowserMain extends Disposable { } } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, uriIdentityService: IUriIdentityService, logService: ILogService): Promise { + private async createWorkspaceService(payload: IAnyWorkspaceIdentifier, environmentService: IWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, uriIdentityService: IUriIdentityService, logService: ILogService): Promise { const configurationCache = new ConfigurationCache([Schemas.file, Schemas.userData, Schemas.tmp] /* Cache all non native resources */, environmentService, fileService); const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache }, environmentService, fileService, remoteAgentService, uriIdentityService, logService); @@ -418,7 +420,7 @@ class BrowserMain extends Disposable { } } - private resolveWorkspaceInitializationPayload(): IWorkspaceInitializationPayload { + private resolveWorkspaceInitializationPayload(): IAnyWorkspaceIdentifier { let workspace: IWorkspace | undefined = undefined; if (this.configuration.workspaceProvider) { workspace = this.configuration.workspaceProvider.workspace; @@ -437,9 +439,3 @@ class BrowserMain extends Disposable { return { id: 'empty-window' }; } } - -export function main(domElement: HTMLElement, options: IWorkbenchConstructionOptions): Promise { - const workbench = new BrowserMain(domElement, options); - - return workbench.open(); -} diff --git a/src/vs/workbench/browser/window.ts b/src/vs/workbench/browser/window.ts index 36de699c0a6..d4a40dba3df 100644 --- a/src/vs/workbench/browser/window.ts +++ b/src/vs/workbench/browser/window.ts @@ -18,7 +18,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { registerWindowDriver } from 'vs/platform/driver/browser/driver'; import { ILabelService } from 'vs/platform/label/common/label'; import { IOpenerService, matchesScheme } from 'vs/platform/opener/common/opener'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { BrowserLifecycleService } from 'vs/workbench/services/lifecycle/browser/lifecycleService'; import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; @@ -30,7 +30,7 @@ export class BrowserWindow extends Disposable { @ILifecycleService private readonly lifecycleService: BrowserLifecycleService, @IDialogService private readonly dialogService: IDialogService, @ILabelService private readonly labelService: ILabelService, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService ) { super(); diff --git a/src/vs/workbench/browser/workbench.contribution.ts b/src/vs/workbench/browser/workbench.contribution.ts index 3f619452c63..bf561fbf839 100644 --- a/src/vs/workbench/browser/workbench.contribution.ts +++ b/src/vs/workbench/browser/workbench.contribution.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import product from 'vs/platform/product/common/product'; import { Registry } from 'vs/platform/registry/common/platform'; import { localize } from 'vs/nls'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; @@ -286,8 +285,7 @@ const registry = Registry.as(ConfigurationExtensions.Con 'type': 'string', 'enum': ['left', 'bottom', 'right'], 'default': 'bottom', - 'description': localize('panelDefaultLocation', "Controls the default location of the panel (terminal, debug console, output, problems). It can either show at the bottom, right, or left of the workbench."), - 'deprecationMessage': localize('panelDefaultLocationDeprecated', "With the introduction of the side panel, the panel position is no longer able to be moved in favor of moving view containers between the panels.") + 'description': localize('panelDefaultLocation', "Controls the default location of the panel (terminal, debug console, output, problems) in a new workspace. It can either show at the bottom, right, or left of the editor area."), }, 'workbench.panel.opensMaximized': { 'type': 'string', @@ -363,19 +361,6 @@ const registry = Registry.as(ConfigurationExtensions.Con 'default': false, 'description': localize('layoutControlEnabled', "Controls whether the layout control button in the custom title bar is enabled."), }, - 'workbench.experimental.panel.alignment': { - 'type': 'string', - 'enum': ['left', 'center', 'right', 'justify'], - 'enumDescriptions': [ - localize('panel.alignment.left', "The panel spans from the far left of the window to the right side of the editor area."), - localize('panel.alignment.center', "The panel spans beneath the editor area."), - localize('panel.alignment.right', "The panel spans from the left side of the editor area to the far right of the window."), - localize('panel.alignment.justify', "The panel spans the full width of the window."), - ], - 'default': 'center', - 'description': localize('panelAlignment', "Controls the alignment of the panel (terminal, debug console, output, problems) and whether or not it spans beneath the side bar and side panel. Note that this setting only takes effect when the panel is positioned at the bottom of the screen."), - 'included': product.quality !== 'stable' - }, } }); diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts index c6755a2a284..f2c5bf51ade 100644 --- a/src/vs/workbench/browser/workbench.ts +++ b/src/vs/workbench/browser/workbench.ts @@ -110,7 +110,7 @@ export class Workbench extends Layout { }); } - private previousUnexpectedError: { message: string | undefined, time: number } = { message: undefined, time: 0 }; + private previousUnexpectedError: { message: string | undefined; time: number } = { message: undefined, time: 0 }; private handleUnexpectedError(error: unknown, logService: ILogService): void { const message = toErrorMessage(error, true); if (!message) { @@ -342,7 +342,7 @@ export class Workbench extends Layout { { id: Parts.ACTIVITYBAR_PART, role: 'none', classes: ['activitybar', this.getSideBarPosition() === Position.LEFT ? 'left' : 'right'] }, // Use role 'none' for some parts to make screen readers less chatty #114892 { id: Parts.SIDEBAR_PART, role: 'none', classes: ['sidebar', this.getSideBarPosition() === Position.LEFT ? 'left' : 'right'] }, { id: Parts.EDITOR_PART, role: 'main', classes: ['editor'], options: { restorePreviousState: this.willRestoreEditors() } }, - { id: Parts.PANEL_PART, role: 'none', classes: ['panel', 'basepanel', positionToString(Position.BOTTOM)] }, + { id: Parts.PANEL_PART, role: 'none', classes: ['panel', 'basepanel', positionToString(this.getPanelPosition())] }, { id: Parts.AUXILIARYBAR_PART, role: 'none', classes: ['auxiliarybar', 'basepanel', this.getSideBarPosition() === Position.LEFT ? 'right' : 'left'] }, { id: Parts.STATUSBAR_PART, role: 'status', classes: ['statusbar'] } ].forEach(({ id, role, classes, options }) => { diff --git a/src/vs/workbench/buildfile.desktop.js b/src/vs/workbench/buildfile.desktop.js index 61d279dc021..5f40e47276b 100644 --- a/src/vs/workbench/buildfile.desktop.js +++ b/src/vs/workbench/buildfile.desktop.js @@ -16,6 +16,6 @@ exports.collectModules = function () { createModuleDescription('vs/platform/terminal/node/ptyHostMain'), - createModuleDescription('vs/workbench/services/extensions/node/extensionHostProcess'), + createModuleDescription('vs/workbench/api/node/extensionHostProcess'), ]; }; diff --git a/src/vs/workbench/buildfile.web.js b/src/vs/workbench/buildfile.web.js index 7fbfce273e9..3770c48ecc0 100644 --- a/src/vs/workbench/buildfile.web.js +++ b/src/vs/workbench/buildfile.web.js @@ -9,6 +9,6 @@ const { createModuleDescription, createEditorWorkerModuleDescription } = require exports.collectModules = function () { return [ createEditorWorkerModuleDescription('vs/workbench/contrib/output/common/outputLinkComputer'), - createModuleDescription('vs/code/browser/workbench/workbench', ['vs/workbench/workbench.web.api']), + createModuleDescription('vs/code/browser/workbench/workbench', ['vs/workbench/workbench.web.main']), ]; }; diff --git a/src/vs/workbench/common/auxiliarybar.ts b/src/vs/workbench/common/auxiliarybar.ts deleted file mode 100644 index fcafd982be5..00000000000 --- a/src/vs/workbench/common/auxiliarybar.ts +++ /dev/null @@ -1,11 +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 { localize } from 'vs/nls'; -import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; - -export const ActiveAuxiliaryContext = new RawContextKey('activeAuxiliary', '', localize('activeAuxiliary', "The identifier of the active auxiliary panel")); -export const AuxiliaryBarFocusContext = new RawContextKey('auxiliaryBarFocus', false, localize('auxiliaryBarFocus', "Whether the auxiliary bar has keyboard focus")); -export const AuxiliaryBarVisibleContext = new RawContextKey('auxiliaryBarVisible', false, localize('auxiliaryBarVisible', "Whether the auxiliary bar is visible")); diff --git a/src/vs/workbench/common/contextkeys.ts b/src/vs/workbench/common/contextkeys.ts new file mode 100644 index 00000000000..3b3a86f2627 --- /dev/null +++ b/src/vs/workbench/common/contextkeys.ts @@ -0,0 +1,248 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; +import { IContextKeyService, IContextKey, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { basename, dirname, extname, isEqual } from 'vs/base/common/resources'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IModelService } from 'vs/editor/common/services/model'; + +//#region < --- Workbench --- > + +export const WorkbenchStateContext = new RawContextKey('workbenchState', undefined, { type: 'string', description: localize('workbenchState', "The kind of workspace opened in the window, either 'empty' (no workspace), 'folder' (single folder) or 'workspace' (multi-root workspace)") }); +export const WorkspaceFolderCountContext = new RawContextKey('workspaceFolderCount', 0, localize('workspaceFolderCount', "The number of root folders in the workspace")); + +export const OpenFolderWorkspaceSupportContext = new RawContextKey('openFolderWorkspaceSupport', true, true); +export const EnterMultiRootWorkspaceSupportContext = new RawContextKey('enterMultiRootWorkspaceSupport', true, true); +export const EmptyWorkspaceSupportContext = new RawContextKey('emptyWorkspaceSupport', true, true); + +export const DirtyWorkingCopiesContext = new RawContextKey('dirtyWorkingCopies', false, localize('dirtyWorkingCopies', "Whether there are any working copies with unsaved changes")); + +export const RemoteNameContext = new RawContextKey('remoteName', '', localize('remoteName', "The name of the remote the window is connected to or an empty string if not connected to any remote")); +export const VirtualWorkspaceContext = new RawContextKey('virtualWorkspace', '', localize('virtualWorkspace', "The scheme of the current workspace if is from a virtual file system or an empty string.")); + +export const IsFullscreenContext = new RawContextKey('isFullscreen', false, localize('isFullscreen', "Whether the window is in fullscreen mode")); + +export const HasWebFileSystemAccess = new RawContextKey('hasWebFileSystemAccess', false, true); // Support for FileSystemAccess web APIs (https://wicg.github.io/file-system-access) + +//#endregion + + +//#region < --- Editor --- > + +// Editor State Context Keys +export const ActiveEditorDirtyContext = new RawContextKey('activeEditorIsDirty', false, localize('activeEditorIsDirty', "Whether the active editor has unsaved changes")); +export const ActiveEditorPinnedContext = new RawContextKey('activeEditorIsNotPreview', false, localize('activeEditorIsNotPreview', "Whether the active editor is not in preview mode")); +export const ActiveEditorStickyContext = new RawContextKey('activeEditorIsPinned', false, localize('activeEditorIsPinned', "Whether the active editor is pinned")); +export const ActiveEditorReadonlyContext = new RawContextKey('activeEditorIsReadonly', false, localize('activeEditorIsReadonly', "Whether the active editor is readonly")); +export const ActiveEditorCanRevertContext = new RawContextKey('activeEditorCanRevert', false, localize('activeEditorCanRevert', "Whether the active editor can revert")); +export const ActiveEditorCanSplitInGroupContext = new RawContextKey('activeEditorCanSplitInGroup', true); + +// Editor Kind Context Keys +export const ActiveEditorContext = new RawContextKey('activeEditor', null, { type: 'string', description: localize('activeEditor', "The identifier of the active editor") }); +export const ActiveEditorAvailableEditorIdsContext = new RawContextKey('activeEditorAvailableEditorIds', '', localize('activeEditorAvailableEditorIds', "The available editor identifiers that are usable for the active editor")); +export const TextCompareEditorVisibleContext = new RawContextKey('textCompareEditorVisible', false, localize('textCompareEditorVisible', "Whether a text compare editor is visible")); +export const TextCompareEditorActiveContext = new RawContextKey('textCompareEditorActive', false, localize('textCompareEditorActive', "Whether a text compare editor is active")); +export const SideBySideEditorActiveContext = new RawContextKey('sideBySideEditorActive', false, localize('sideBySideEditorActive', "Whether a side by side editor is active")); + +// Editor Group Context Keys +export const EditorGroupEditorsCountContext = new RawContextKey('groupEditorsCount', 0, localize('groupEditorsCount', "The number of opened editor groups")); +export const ActiveEditorGroupEmptyContext = new RawContextKey('activeEditorGroupEmpty', false, localize('activeEditorGroupEmpty', "Whether the active editor group is empty")); +export const ActiveEditorGroupIndexContext = new RawContextKey('activeEditorGroupIndex', 0, localize('activeEditorGroupIndex', "The index of the active editor group")); +export const ActiveEditorGroupLastContext = new RawContextKey('activeEditorGroupLast', false, localize('activeEditorGroupLast', "Whether the active editor group is the last group")); +export const ActiveEditorGroupLockedContext = new RawContextKey('activeEditorGroupLocked', false, localize('activeEditorGroupLocked', "Whether the active editor group is locked")); +export const MultipleEditorGroupsContext = new RawContextKey('multipleEditorGroups', false, localize('multipleEditorGroups', "Whether there are multiple editor groups opened")); +export const SingleEditorGroupsContext = MultipleEditorGroupsContext.toNegated(); + +// Editor Layout Context Keys +export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false, localize('editorIsOpen', "Whether an editor is open")); +export const InEditorZenModeContext = new RawContextKey('inZenMode', false, localize('inZenMode', "Whether Zen mode is enabled")); +export const IsCenteredLayoutContext = new RawContextKey('isCenteredLayout', false, localize('isCenteredLayout', "Whether centered layout is enabled")); +export const SplitEditorsVertically = new RawContextKey('splitEditorsVertically', false, localize('splitEditorsVertically', "Whether editors split vertically")); +export const EditorAreaVisibleContext = new RawContextKey('editorAreaVisible', true, localize('editorAreaVisible', "Whether the editor area is visible")); +export const EditorTabsVisibleContext = new RawContextKey('editorTabsVisible', true, localize('editorTabsVisible', "Whether editor tabs are visible")); + +//#endregion + + +//#region < --- Side Bar --- > + +export const SideBarVisibleContext = new RawContextKey('sideBarVisible', false, localize('sideBarVisible', "Whether the sidebar is visible")); +export const SidebarFocusContext = new RawContextKey('sideBarFocus', false, localize('sideBarFocus', "Whether the sidebar has keyboard focus")); +export const ActiveViewletContext = new RawContextKey('activeViewlet', '', localize('activeViewlet', "The identifier of the active viewlet")); + +//#endregion + + +//#region < --- Status Bar --- > + +export const StatusBarFocused = new RawContextKey('statusBarFocused', false, localize('statusBarFocused', "Whether the status bar has keyboard focus")); + +//#endregion + + +//#region < --- Banner --- > + +export const BannerFocused = new RawContextKey('bannerFocused', false, localize('bannerFocused', "Whether the banner has keyboard focus")); + +//#endregion + + +//#region < --- Notifications --- > + +export const NotificationFocusedContext = new RawContextKey('notificationFocus', true, localize('notificationFocus', "Whether a notification has keyboard focus")); +export const NotificationsCenterVisibleContext = new RawContextKey('notificationCenterVisible', false, localize('notificationCenterVisible', "Whether the notifications center is visible")); +export const NotificationsToastsVisibleContext = new RawContextKey('notificationToastsVisible', false, localize('notificationToastsVisible', "Whether a notification toast is visible")); + +//#endregion + + +//#region < --- Auxiliary Bar --- > + +export const ActiveAuxiliaryContext = new RawContextKey('activeAuxiliary', '', localize('activeAuxiliary', "The identifier of the active auxiliary panel")); +export const AuxiliaryBarFocusContext = new RawContextKey('auxiliaryBarFocus', false, localize('auxiliaryBarFocus', "Whether the auxiliary bar has keyboard focus")); +export const AuxiliaryBarVisibleContext = new RawContextKey('auxiliaryBarVisible', false, localize('auxiliaryBarVisible', "Whether the auxiliary bar is visible")); + +//#endregion + + +//#region < --- Panel --- > + +export const ActivePanelContext = new RawContextKey('activePanel', '', localize('activePanel', "The identifier of the active panel")); +export const PanelFocusContext = new RawContextKey('panelFocus', false, localize('panelFocus', "Whether the panel has keyboard focus")); +export const PanelPositionContext = new RawContextKey('panelPosition', 'bottom', localize('panelPosition', "The position of the panel, always 'bottom'")); +export const PanelAlignmentContext = new RawContextKey('panelAlignment', 'center', localize('panelAlignment', "The alignment of the panel, either 'center', 'left', 'right' or 'justify'")); +export const PanelVisibleContext = new RawContextKey('panelVisible', false, localize('panelVisible', "Whether the panel is visible")); +export const PanelMaximizedContext = new RawContextKey('panelMaximized', false, localize('panelMaximized', "Whether the panel is maximized")); + +//#endregion + + +//#region < --- Views --- > + +export const FocusedViewContext = new RawContextKey('focusedView', '', localize('focusedView', "The identifier of the view that has keyboard focus")); +export function getVisbileViewContextKey(viewId: string): string { return `view.${viewId}.visible`; } +export function getEnabledViewContainerContextKey(viewContainerId: string): string { return `viewContainer.${viewContainerId}.enabled`; } + +//#endregion + + +//#region < --- Resources --- > + +export class ResourceContextKey implements IContextKey { + + // NOTE: DO NOT CHANGE THE DEFAULT VALUE TO ANYTHING BUT + // UNDEFINED! IT IS IMPORTANT THAT DEFAULTS ARE INHERITED + // FROM THE PARENT CONTEXT AND ONLY UNDEFINED DOES THIS + + static readonly Scheme = new RawContextKey('resourceScheme', undefined, { type: 'string', description: localize('resourceScheme', "The scheme of the rsource") }); + static readonly Filename = new RawContextKey('resourceFilename', undefined, { type: 'string', description: localize('resourceFilename', "The file name of the resource") }); + static readonly Dirname = new RawContextKey('resourceDirname', undefined, { type: 'string', description: localize('resourceDirname', "The folder name the resource is contained in") }); + static readonly Path = new RawContextKey('resourcePath', undefined, { type: 'string', description: localize('resourcePath', "The full path of the resource") }); + static readonly LangId = new RawContextKey('resourceLangId', undefined, { type: 'string', description: localize('resourceLangId', "The language identifier of the resource") }); + static readonly Resource = new RawContextKey('resource', undefined, { type: 'URI', description: localize('resource', "The full value of the resource including scheme and path") }); + static readonly Extension = new RawContextKey('resourceExtname', undefined, { type: 'string', description: localize('resourceExtname', "The extension name of the resource") }); + static readonly HasResource = new RawContextKey('resourceSet', undefined, { type: 'boolean', description: localize('resourceSet', "Whether a resource is present or not") }); + static readonly IsFileSystemResource = new RawContextKey('isFileSystemResource', undefined, { type: 'boolean', description: localize('isFileSystemResource', "Whether the resource is backed by a file system provider") }); + + private readonly _disposables = new DisposableStore(); + + private readonly _resourceKey: IContextKey; + private readonly _schemeKey: IContextKey; + private readonly _filenameKey: IContextKey; + private readonly _dirnameKey: IContextKey; + private readonly _pathKey: IContextKey; + private readonly _langIdKey: IContextKey; + private readonly _extensionKey: IContextKey; + private readonly _hasResource: IContextKey; + private readonly _isFileSystemResource: IContextKey; + + constructor( + @IContextKeyService private readonly _contextKeyService: IContextKeyService, + @IFileService private readonly _fileService: IFileService, + @ILanguageService private readonly _languageService: ILanguageService, + @IModelService private readonly _modelService: IModelService, + ) { + this._schemeKey = ResourceContextKey.Scheme.bindTo(this._contextKeyService); + this._filenameKey = ResourceContextKey.Filename.bindTo(this._contextKeyService); + this._dirnameKey = ResourceContextKey.Dirname.bindTo(this._contextKeyService); + this._pathKey = ResourceContextKey.Path.bindTo(this._contextKeyService); + this._langIdKey = ResourceContextKey.LangId.bindTo(this._contextKeyService); + this._resourceKey = ResourceContextKey.Resource.bindTo(this._contextKeyService); + this._extensionKey = ResourceContextKey.Extension.bindTo(this._contextKeyService); + this._hasResource = ResourceContextKey.HasResource.bindTo(this._contextKeyService); + this._isFileSystemResource = ResourceContextKey.IsFileSystemResource.bindTo(this._contextKeyService); + + this._disposables.add(_fileService.onDidChangeFileSystemProviderRegistrations(() => { + const resource = this.get(); + this._isFileSystemResource.set(Boolean(resource && _fileService.hasProvider(resource))); + })); + + this._disposables.add(_modelService.onModelAdded(model => { + if (isEqual(model.uri, this.get())) { + this._setLangId(); + } + })); + this._disposables.add(_modelService.onModelLanguageChanged(e => { + if (isEqual(e.model.uri, this.get())) { + this._setLangId(); + } + })); + } + + dispose(): void { + this._disposables.dispose(); + } + + private _setLangId(): void { + const value = this.get(); + if (!value) { + this._langIdKey.set(null); + return; + } + const langId = this._modelService.getModel(value)?.getLanguageId() ?? this._languageService.guessLanguageIdByFilepathOrFirstLine(value); + this._langIdKey.set(langId); + } + + set(value: URI | null) { + if (isEqual(this.get(), value ?? undefined)) { + return; + } + this._contextKeyService.bufferChangeEvents(() => { + this._resourceKey.set(value); + this._schemeKey.set(value ? value.scheme : null); + this._filenameKey.set(value ? basename(value) : null); + this._dirnameKey.set(value ? dirname(value).fsPath : null); + this._pathKey.set(value ? value.fsPath : null); + this._setLangId(); + this._extensionKey.set(value ? extname(value) : null); + this._hasResource.set(Boolean(value)); + this._isFileSystemResource.set(value ? this._fileService.hasProvider(value) : false); + }); + } + + reset(): void { + this._contextKeyService.bufferChangeEvents(() => { + this._resourceKey.reset(); + this._schemeKey.reset(); + this._filenameKey.reset(); + this._dirnameKey.reset(); + this._pathKey.reset(); + this._langIdKey.reset(); + this._extensionKey.reset(); + this._hasResource.reset(); + this._isFileSystemResource.reset(); + }); + } + + get(): URI | undefined { + return this._resourceKey.get() ?? undefined; + } +} + +//#endregion diff --git a/src/vs/workbench/common/contributions.ts b/src/vs/workbench/common/contributions.ts index 56ab4b25eb4..02a61714ec8 100644 --- a/src/vs/workbench/common/contributions.ts +++ b/src/vs/workbench/common/contributions.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IInstantiationService, IConstructorSignature0, ServicesAccessor, BrandedService } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, IConstructorSignature, ServicesAccessor, BrandedService } from 'vs/platform/instantiation/common/instantiation'; import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { runWhenIdle, IdleDeadline } from 'vs/base/common/async'; @@ -42,9 +42,9 @@ class WorkbenchContributionsRegistry implements IWorkbenchContributionsRegistry private instantiationService: IInstantiationService | undefined; private lifecycleService: ILifecycleService | undefined; - private readonly toBeInstantiated = new Map[]>(); + private readonly toBeInstantiated = new Map[]>(); - registerWorkbenchContribution(ctor: IConstructorSignature0, phase: LifecyclePhase = LifecyclePhase.Starting): void { + registerWorkbenchContribution(ctor: IConstructorSignature, phase: LifecyclePhase = LifecyclePhase.Starting): void { // Instantiate directly if we are already matching the provided phase if (this.instantiationService && this.lifecycleService && this.lifecycleService.phase >= phase) { @@ -59,7 +59,7 @@ class WorkbenchContributionsRegistry implements IWorkbenchContributionsRegistry this.toBeInstantiated.set(phase, toBeInstantiated); } - toBeInstantiated.push(ctor as IConstructorSignature0); + toBeInstantiated.push(ctor as IConstructorSignature); } } @@ -116,7 +116,7 @@ class WorkbenchContributionsRegistry implements IWorkbenchContributionsRegistry } } - private safeCreateInstance(instantiationService: IInstantiationService, ctor: IConstructorSignature0): void { + private safeCreateInstance(instantiationService: IInstantiationService, ctor: IConstructorSignature): void { try { instantiationService.createInstance(ctor); } catch (error) { diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 1ba69ebd262..7066137dbe6 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -11,8 +11,8 @@ import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle' import { IDiffEditor } from 'vs/editor/common/editorCommon'; import { IEditorOptions, ITextEditorOptions, IResourceEditorInput, ITextResourceEditorInput, IBaseTextResourceEditorInput, IBaseUntypedEditorInput } from 'vs/platform/editor/common/editor'; import type { EditorInput } from 'vs/workbench/common/editor/editorInput'; -import { IInstantiationService, IConstructorSignature0, ServicesAccessor, BrandedService } from 'vs/platform/instantiation/common/instantiation'; -import { IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService, IConstructorSignature, ServicesAccessor, BrandedService } from 'vs/platform/instantiation/common/instantiation'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Registry } from 'vs/platform/registry/common/platform'; import { IEncodingSupport, ILanguageSupport } from 'vs/workbench/services/textfile/common/textfiles'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -37,38 +37,6 @@ export const DEFAULT_EDITOR_ASSOCIATION = { providerDisplayName: localize('builtinProviderDisplayName', "Built-in") }; -// Editor State Context Keys -export const ActiveEditorDirtyContext = new RawContextKey('activeEditorIsDirty', false, localize('activeEditorIsDirty', "Whether the active editor has unsaved changes")); -export const ActiveEditorPinnedContext = new RawContextKey('activeEditorIsNotPreview', false, localize('activeEditorIsNotPreview', "Whether the active editor is not in preview mode")); -export const ActiveEditorStickyContext = new RawContextKey('activeEditorIsPinned', false, localize('activeEditorIsPinned', "Whether the active editor is pinned")); -export const ActiveEditorReadonlyContext = new RawContextKey('activeEditorIsReadonly', false, localize('activeEditorIsReadonly', "Whether the active editor is readonly")); -export const ActiveEditorCanRevertContext = new RawContextKey('activeEditorCanRevert', false, localize('activeEditorCanRevert', "Whether the active editor can revert")); -export const ActiveEditorCanSplitInGroupContext = new RawContextKey('activeEditorCanSplitInGroup', true); - -// Editor Kind Context Keys -export const ActiveEditorContext = new RawContextKey('activeEditor', null, { type: 'string', description: localize('activeEditor', "The identifier of the active editor") }); -export const ActiveEditorAvailableEditorIdsContext = new RawContextKey('activeEditorAvailableEditorIds', '', localize('activeEditorAvailableEditorIds', "The available editor identifiers that are usable for the active editor")); -export const TextCompareEditorVisibleContext = new RawContextKey('textCompareEditorVisible', false, localize('textCompareEditorVisible', "Whether a text compare editor is visible")); -export const TextCompareEditorActiveContext = new RawContextKey('textCompareEditorActive', false, localize('textCompareEditorActive', "Whether a text compare editor is active")); -export const SideBySideEditorActiveContext = new RawContextKey('sideBySideEditorActive', false, localize('sideBySideEditorActive', "Whether a side by side editor is active")); - -// Editor Group Context Keys -export const EditorGroupEditorsCountContext = new RawContextKey('groupEditorsCount', 0, localize('groupEditorsCount', "The number of opened editor groups")); -export const ActiveEditorGroupEmptyContext = new RawContextKey('activeEditorGroupEmpty', false, localize('activeEditorGroupEmpty', "Whether the active editor group is empty")); -export const ActiveEditorGroupIndexContext = new RawContextKey('activeEditorGroupIndex', 0, localize('activeEditorGroupIndex', "The index of the active editor group")); -export const ActiveEditorGroupLastContext = new RawContextKey('activeEditorGroupLast', false, localize('activeEditorGroupLast', "Whether the active editor group is the last group")); -export const ActiveEditorGroupLockedContext = new RawContextKey('activeEditorGroupLocked', false, localize('activeEditorGroupLocked', "Whether the active editor group is locked")); -export const MultipleEditorGroupsContext = new RawContextKey('multipleEditorGroups', false, localize('multipleEditorGroups', "Whether there are multiple editor groups opened")); -export const SingleEditorGroupsContext = MultipleEditorGroupsContext.toNegated(); - -// Editor Layout Context Keys -export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false, localize('editorIsOpen', "Whether an editor is open")); -export const InEditorZenModeContext = new RawContextKey('inZenMode', false, localize('inZenMode', "Whether Zen mode is enabled")); -export const IsCenteredLayoutContext = new RawContextKey('isCenteredLayout', false, localize('isCenteredLayout', "Whether centered layout is enabled")); -export const SplitEditorsVertically = new RawContextKey('splitEditorsVertically', false, localize('splitEditorsVertically', "Whether editors split vertically")); -export const EditorAreaVisibleContext = new RawContextKey('editorAreaVisible', true, localize('editorAreaVisible', "Whether the editor area is visible")); -export const EditorTabsVisibleContext = new RawContextKey('editorTabsVisible', true, localize('editorTabsVisible', "Whether editor tabs are visible")); - /** * Side by side editor id. */ @@ -124,6 +92,15 @@ export interface IEditorPane extends IComposite { */ readonly onDidChangeControl: Event; + /** + * An optional event to notify when the selection inside the editor + * pane changed in case the editor has a selection concept. + * + * For example, in a text editor pane, the selection changes whenever + * the cursor is set to a new location. + */ + readonly onDidChangeSelection?: Event; + /** * The assigned input of this editor. */ @@ -162,7 +139,7 @@ export interface IEditorPane extends IComposite { /** * An event to notify whenever minimum/maximum width/height changes. */ - readonly onDidChangeSizeConstraints: Event<{ width: number; height: number; } | undefined>; + readonly onDidChangeSizeConstraints: Event<{ width: number; height: number } | undefined>; /** * The context key service for this editor. Should be overridden by @@ -189,12 +166,131 @@ export interface IEditorPane extends IComposite { */ getViewState(): object | undefined; + /** + * An optional method to return the current selection in + * the editor pane in case the editor pane has a selection + * concept. + * + * Clients of this method will typically react to the + * `onDidChangeSelection` event to receive the current + * selection as needed. + */ + getSelection?(): IEditorPaneSelection | undefined; + /** * Finds out if this editor is visible or not. */ isVisible(): boolean; } +export interface IEditorPaneSelectionChangeEvent { + + /** + * More details for how the selection was made. + */ + reason: EditorPaneSelectionChangeReason; +} + +export const enum EditorPaneSelectionChangeReason { + + /** + * The selection was changed as a result of a programmatic + * method invocation. + * + * For a text editor pane, this for example can be a selection + * being restored from previous view state automatically. + */ + PROGRAMMATIC = 1, + + /** + * The selection was changed by the user. + * + * This typically means the user changed the selection + * with mouse or keyboard. + */ + USER, + + /** + * The selection was changed as a result of editing in + * the editor pane. + * + * For a text editor pane, this for example can be typing + * in the text of the editor pane. + */ + EDIT, + + /** + * The selection was changed as a result of a navigation + * action. + * + * For a text editor pane, this for example can be invoking + * "Go to definition" on a symbol. + */ + NAVIGATION +} + +export interface IEditorPaneSelection { + + /** + * Asks to compare this selection to another selection. + */ + compare(otherSelection: IEditorPaneSelection): EditorPaneSelectionCompareResult; + + /** + * Asks to massage the provided `options` in a way + * that the selection can be restored when the editor + * is opened again. + * + * For a text editor this means to apply the selected + * line and column as text editor options. + */ + restore(options: IEditorOptions): IEditorOptions; + + /** + * Only used for logging to print more info about the selection. + */ + toString?(): string; +} + +export const enum EditorPaneSelectionCompareResult { + + /** + * The selections are identical. + */ + IDENTICAL = 1, + + /** + * The selections are similar. + * + * For a text editor this can mean that the one + * selection is in close proximity to the other + * selection. + * + * Upstream clients may decide in this case to + * not treat the selection different from the + * previous one because it is not distinct enough. + */ + SIMILAR = 2, + + /** + * The selections are entirely different. + */ + DIFFERENT = 3 +} + +export interface IEditorPaneWithSelection extends IEditorPane { + + readonly onDidChangeSelection: Event; + + getSelection(): IEditorPaneSelection | undefined; +} + +export function isEditorPaneWithSelection(editorPane: IEditorPane | undefined): editorPane is IEditorPaneWithSelection { + const candidate = editorPane as IEditorPaneWithSelection | undefined; + + return !!candidate && typeof candidate.getSelection === 'function' && !!candidate.onDidChangeSelection; +} + /** * Try to retrieve the view state for the editor pane that * has the provided editor input opened, if at all. @@ -854,7 +950,7 @@ export const enum GroupModelChangeKind { export interface IWorkbenchEditorConfiguration { workbench?: { - editor?: IEditorPartConfiguration, + editor?: IEditorPartConfiguration; iconTheme?: string; }; } @@ -893,7 +989,7 @@ interface IEditorPartConfiguration { decorations?: { badges?: boolean; colors?: boolean; - } + }; } export interface IEditorPartOptions extends IEditorPartConfiguration { @@ -975,8 +1071,8 @@ class EditorResourceAccessorImpl { */ getOriginalUri(editor: EditorInput | IUntypedEditorInput | undefined | null): URI | undefined; getOriginalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options: IEditorResourceAccessorOptions & { supportSideBySide?: SideBySideEditor.PRIMARY | SideBySideEditor.SECONDARY | SideBySideEditor.ANY }): URI | undefined; - getOriginalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options: IEditorResourceAccessorOptions & { supportSideBySide: SideBySideEditor.BOTH }): URI | { primary?: URI, secondary?: URI } | undefined; - getOriginalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options?: IEditorResourceAccessorOptions): URI | { primary?: URI, secondary?: URI } | undefined { + getOriginalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options: IEditorResourceAccessorOptions & { supportSideBySide: SideBySideEditor.BOTH }): URI | { primary?: URI; secondary?: URI } | undefined; + getOriginalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options?: IEditorResourceAccessorOptions): URI | { primary?: URI; secondary?: URI } | undefined { if (!editor) { return undefined; } @@ -1011,7 +1107,7 @@ class EditorResourceAccessorImpl { return this.filterUri(originalResource, options.filterByScheme); } - private getSideEditors(editor: EditorInput | IUntypedEditorInput): { primary: EditorInput | IUntypedEditorInput | undefined, secondary: EditorInput | IUntypedEditorInput | undefined } { + private getSideEditors(editor: EditorInput | IUntypedEditorInput): { primary: EditorInput | IUntypedEditorInput | undefined; secondary: EditorInput | IUntypedEditorInput | undefined } { if (isSideBySideEditorInput(editor) || isResourceSideBySideEditorInput(editor)) { return { primary: editor.primary, secondary: editor.secondary }; } @@ -1038,8 +1134,8 @@ class EditorResourceAccessorImpl { */ getCanonicalUri(editor: EditorInput | IUntypedEditorInput | undefined | null): URI | undefined; getCanonicalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options: IEditorResourceAccessorOptions & { supportSideBySide?: SideBySideEditor.PRIMARY | SideBySideEditor.SECONDARY | SideBySideEditor.ANY }): URI | undefined; - getCanonicalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options: IEditorResourceAccessorOptions & { supportSideBySide: SideBySideEditor.BOTH }): URI | { primary?: URI, secondary?: URI } | undefined; - getCanonicalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options?: IEditorResourceAccessorOptions): URI | { primary?: URI, secondary?: URI } | undefined { + getCanonicalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options: IEditorResourceAccessorOptions & { supportSideBySide: SideBySideEditor.BOTH }): URI | { primary?: URI; secondary?: URI } | undefined; + getCanonicalUri(editor: EditorInput | IUntypedEditorInput | undefined | null, options?: IEditorResourceAccessorOptions): URI | { primary?: URI; secondary?: URI } | undefined { if (!editor) { return undefined; } @@ -1122,7 +1218,7 @@ class EditorFactoryRegistry implements IEditorFactoryRegistry { private fileEditorFactory: IFileEditorFactory | undefined; - private readonly editorSerializerConstructors = new Map>(); + private readonly editorSerializerConstructors = new Map>(); private readonly editorSerializerInstances = new Map(); start(accessor: ServicesAccessor): void { @@ -1135,7 +1231,7 @@ class EditorFactoryRegistry implements IEditorFactoryRegistry { this.editorSerializerConstructors.clear(); } - private createEditorSerializer(editorTypeId: string, ctor: IConstructorSignature0, instantiationService: IInstantiationService): void { + private createEditorSerializer(editorTypeId: string, ctor: IConstructorSignature, instantiationService: IInstantiationService): void { const instance = instantiationService.createInstance(ctor); this.editorSerializerInstances.set(editorTypeId, instance); } @@ -1152,7 +1248,7 @@ class EditorFactoryRegistry implements IEditorFactoryRegistry { return assertIsDefined(this.fileEditorFactory); } - registerEditorSerializer(editorTypeId: string, ctor: IConstructorSignature0): IDisposable { + registerEditorSerializer(editorTypeId: string, ctor: IConstructorSignature): IDisposable { if (this.editorSerializerConstructors.has(editorTypeId) || this.editorSerializerInstances.has(editorTypeId)) { throw new Error(`A editor serializer with type ID '${editorTypeId}' was already registered.`); } diff --git a/src/vs/workbench/common/editor/diffEditorInput.ts b/src/vs/workbench/common/editor/diffEditorInput.ts index 0781546d6b8..30dd2cb35c6 100644 --- a/src/vs/workbench/common/editor/diffEditorInput.ts +++ b/src/vs/workbench/common/editor/diffEditorInput.ts @@ -105,7 +105,7 @@ export class DiffEditorInput extends SideBySideEditorInput implements IDiffEdito // a label that resembles the difference between the two const originalMediumDescription = this.original.getDescription(Verbosity.MEDIUM); const modifiedMediumDescription = this.modified.getDescription(Verbosity.MEDIUM); - if (originalMediumDescription && modifiedMediumDescription) { + if (typeof originalMediumDescription === 'string' && typeof modifiedMediumDescription === 'string') { const [shortenedOriginalMediumDescription, shortenedModifiedMediumDescription] = shorten([originalMediumDescription, modifiedMediumDescription]); mediumDescription = this.computeLabel(shortenedOriginalMediumDescription, shortenedModifiedMediumDescription); } diff --git a/src/vs/workbench/common/editor/editorGroupModel.ts b/src/vs/workbench/common/editor/editorGroupModel.ts index 64caf9ed75f..fd51551b8f6 100644 --- a/src/vs/workbench/common/editor/editorGroupModel.ts +++ b/src/vs/workbench/common/editor/editorGroupModel.ts @@ -73,7 +73,7 @@ export interface IMatchOptions { export interface IGroupModelChangeEvent { /** - * The kind of change that occured in the group model. + * The kind of change that occurred in the group model. */ readonly kind: GroupModelChangeKind; @@ -139,7 +139,7 @@ export interface IGroupEditorCloseEvent extends IGroupEditorChangeEvent { /** * Signifies the context in which the editor * is being closed. This allows for understanding - * if a replace or reopen is occuring + * if a replace or reopen is occurring */ readonly context: EditorCloseContext; diff --git a/src/vs/workbench/common/editor/editorOptions.ts b/src/vs/workbench/common/editor/editorOptions.ts index a9113b39f74..95d1d01425f 100644 --- a/src/vs/workbench/common/editor/editorOptions.ts +++ b/src/vs/workbench/common/editor/editorOptions.ts @@ -5,7 +5,7 @@ import { IRange } from 'vs/editor/common/core/range'; import { IEditor, IEditorViewState, ScrollType } from 'vs/editor/common/editorCommon'; -import { ITextEditorOptions, TextEditorSelectionRevealType } from 'vs/platform/editor/common/editor'; +import { ITextEditorOptions, TextEditorSelectionRevealType, TextEditorSelectionSource } from 'vs/platform/editor/common/editor'; export function applyTextEditorOptions(options: ITextEditorOptions, editor: IEditor, scrollType: ScrollType): boolean { @@ -25,8 +25,12 @@ export function applyTextEditorOptions(options: ITextEditorOptions, editor: IEdi endColumn: options.selection.endColumn ?? options.selection.startColumn }; - editor.setSelection(range); + // Apply selection and give it a `TextEditorSelectionSource` + // so that listeners can distinguish this selection change + // from others. + editor.setSelection(range, TextEditorSelectionSource.NAVIGATION); + // Reveal selection if (options.selectionRevealType === TextEditorSelectionRevealType.NearTop) { editor.revealRangeNearTop(range, scrollType); } else if (options.selectionRevealType === TextEditorSelectionRevealType.NearTopIfOutsideViewport) { diff --git a/src/vs/workbench/common/editor/sideBySideEditorInput.ts b/src/vs/workbench/common/editor/sideBySideEditorInput.ts index 008a4e327cd..f6ee22f5204 100644 --- a/src/vs/workbench/common/editor/sideBySideEditorInput.ts +++ b/src/vs/workbench/common/editor/sideBySideEditorInput.ts @@ -9,7 +9,6 @@ import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorInputCapabilities, GroupIdentifier, ISaveOptions, IRevertOptions, EditorExtensions, IEditorFactoryRegistry, IEditorSerializer, ISideBySideEditorInput, IUntypedEditorInput, isResourceSideBySideEditorInput, isDiffEditorInput, isResourceDiffEditorInput, IResourceSideBySideEditorInput, findViewStateForEditor, IMoveResult, isEditorInput, isResourceEditorInput, Verbosity } from 'vs/workbench/common/editor'; -import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -290,7 +289,7 @@ interface ISerializedSideBySideEditorInput { export abstract class AbstractSideBySideEditorInputSerializer implements IEditorSerializer { canSerialize(editorInput: EditorInput): boolean { - const input = editorInput as SideBySideEditorInput | DiffEditorInput; + const input = editorInput as SideBySideEditorInput; if (input.primary && input.secondary) { const [secondaryInputSerializer, primaryInputSerializer] = this.getSerializers(input.secondary.typeId, input.primary.typeId); diff --git a/src/vs/workbench/common/editor/textEditorModel.ts b/src/vs/workbench/common/editor/textEditorModel.ts index 81ac7335e67..4fe469247c9 100644 --- a/src/vs/workbench/common/editor/textEditorModel.ts +++ b/src/vs/workbench/common/editor/textEditorModel.ts @@ -8,7 +8,7 @@ import { EditorModel } from 'vs/workbench/common/editor/editorModel'; import { ILanguageSupport } from 'vs/workbench/services/textfile/common/textfiles'; import { URI } from 'vs/base/common/uri'; import { ITextEditorModel, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; -import { ILanguageService, ILanguageSelection } from 'vs/editor/common/services/language'; +import { ILanguageService, ILanguageSelection } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { MutableDisposable } from 'vs/base/common/lifecycle'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; diff --git a/src/vs/workbench/common/editor/textResourceEditorModel.ts b/src/vs/workbench/common/editor/textResourceEditorModel.ts index da90779d2f7..c9ec05a73dc 100644 --- a/src/vs/workbench/common/editor/textResourceEditorModel.ts +++ b/src/vs/workbench/common/editor/textResourceEditorModel.ts @@ -5,7 +5,7 @@ import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; import { URI } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { ILanguageDetectionService } from 'vs/workbench/services/languageDetection/common/languageDetectionWorkerService'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; diff --git a/src/vs/workbench/common/notifications.ts b/src/vs/workbench/common/notifications.ts index 78e0be0b845..87f21476aff 100644 --- a/src/vs/workbench/common/notifications.ts +++ b/src/vs/workbench/common/notifications.ts @@ -506,7 +506,7 @@ export class NotificationViewItem extends Disposable implements INotificationVie private _sticky: boolean | undefined, private _silent: boolean | undefined, private _message: INotificationMessage, - private _source: string | { label: string, id: string; } | undefined, + private _source: string | { label: string; id: string } | undefined, progress: INotificationProgressProperties | undefined, actions?: INotificationActions ) { diff --git a/src/vs/workbench/common/panel.ts b/src/vs/workbench/common/panel.ts deleted file mode 100644 index 2c29fb16de3..00000000000 --- a/src/vs/workbench/common/panel.ts +++ /dev/null @@ -1,13 +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 { localize } from 'vs/nls'; -import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; - -export const ActivePanelContext = new RawContextKey('activePanel', '', localize('activePanel', "The identifier of the active panel")); -export const PanelFocusContext = new RawContextKey('panelFocus', false, localize('panelFocus', "Whether the panel has keyboard focus")); -export const PanelPositionContext = new RawContextKey('panelPosition', 'bottom', localize('panelPosition', "The position of the panel, either 'left', 'right' or 'bottom'")); -export const PanelVisibleContext = new RawContextKey('panelVisible', false, localize('panelVisible', "Whether the panel is visible")); -export const PanelMaximizedContext = new RawContextKey('panelMaximized', false, localize('panelMaximized', "Whether the panel is maximized")); diff --git a/src/vs/workbench/common/resources.ts b/src/vs/workbench/common/resources.ts index b5e32bcb171..bab45fa5187 100644 --- a/src/vs/workbench/common/resources.ts +++ b/src/vs/workbench/common/resources.ts @@ -3,130 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { localize } from 'vs/nls'; import { URI } from 'vs/base/common/uri'; import { deepClone, equals } from 'vs/base/common/objects'; import { Emitter } from 'vs/base/common/event'; -import { basename, dirname, extname, relativePath, isEqual } from 'vs/base/common/resources'; -import { RawContextKey, IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { IFileService } from 'vs/platform/files/common/files'; -import { DisposableStore, Disposable } from 'vs/base/common/lifecycle'; +import { relativePath } from 'vs/base/common/resources'; +import { Disposable } from 'vs/base/common/lifecycle'; import { ParsedExpression, IExpression, parse } from 'vs/base/common/glob'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { IModelService } from 'vs/editor/common/services/model'; - -export class ResourceContextKey implements IContextKey { - - // NOTE: DO NOT CHANGE THE DEFAULT VALUE TO ANYTHING BUT - // UNDEFINED! IT IS IMPORTANT THAT DEFAULTS ARE INHERITED - // FROM THE PARENT CONTEXT AND ONLY UNDEFINED DOES THIS - - static readonly Scheme = new RawContextKey('resourceScheme', undefined, { type: 'string', description: localize('resourceScheme', "The scheme of the rsource") }); - static readonly Filename = new RawContextKey('resourceFilename', undefined, { type: 'string', description: localize('resourceFilename', "The file name of the resource") }); - static readonly Dirname = new RawContextKey('resourceDirname', undefined, { type: 'string', description: localize('resourceDirname', "The folder name the resource is contained in") }); - static readonly Path = new RawContextKey('resourcePath', undefined, { type: 'string', description: localize('resourcePath', "The full path of the resource") }); - static readonly LangId = new RawContextKey('resourceLangId', undefined, { type: 'string', description: localize('resourceLangId', "The language identifier of the resource") }); - static readonly Resource = new RawContextKey('resource', undefined, { type: 'URI', description: localize('resource', "The full value of the resource including scheme and path") }); - static readonly Extension = new RawContextKey('resourceExtname', undefined, { type: 'string', description: localize('resourceExtname', "The extension name of the resource") }); - static readonly HasResource = new RawContextKey('resourceSet', undefined, { type: 'boolean', description: localize('resourceSet', "Whether a resource is present or not") }); - static readonly IsFileSystemResource = new RawContextKey('isFileSystemResource', undefined, { type: 'boolean', description: localize('isFileSystemResource', "Whether the resource is backed by a file system provider") }); - - private readonly _disposables = new DisposableStore(); - - private readonly _resourceKey: IContextKey; - private readonly _schemeKey: IContextKey; - private readonly _filenameKey: IContextKey; - private readonly _dirnameKey: IContextKey; - private readonly _pathKey: IContextKey; - private readonly _langIdKey: IContextKey; - private readonly _extensionKey: IContextKey; - private readonly _hasResource: IContextKey; - private readonly _isFileSystemResource: IContextKey; - - constructor( - @IContextKeyService private readonly _contextKeyService: IContextKeyService, - @IFileService private readonly _fileService: IFileService, - @ILanguageService private readonly _languageService: ILanguageService, - @IModelService private readonly _modelService: IModelService, - ) { - this._schemeKey = ResourceContextKey.Scheme.bindTo(this._contextKeyService); - this._filenameKey = ResourceContextKey.Filename.bindTo(this._contextKeyService); - this._dirnameKey = ResourceContextKey.Dirname.bindTo(this._contextKeyService); - this._pathKey = ResourceContextKey.Path.bindTo(this._contextKeyService); - this._langIdKey = ResourceContextKey.LangId.bindTo(this._contextKeyService); - this._resourceKey = ResourceContextKey.Resource.bindTo(this._contextKeyService); - this._extensionKey = ResourceContextKey.Extension.bindTo(this._contextKeyService); - this._hasResource = ResourceContextKey.HasResource.bindTo(this._contextKeyService); - this._isFileSystemResource = ResourceContextKey.IsFileSystemResource.bindTo(this._contextKeyService); - - this._disposables.add(_fileService.onDidChangeFileSystemProviderRegistrations(() => { - const resource = this.get(); - this._isFileSystemResource.set(Boolean(resource && _fileService.hasProvider(resource))); - })); - - this._disposables.add(_modelService.onModelAdded(model => { - if (isEqual(model.uri, this.get())) { - this._setLangId(); - } - })); - this._disposables.add(_modelService.onModelLanguageChanged(e => { - if (isEqual(e.model.uri, this.get())) { - this._setLangId(); - } - })); - } - - dispose(): void { - this._disposables.dispose(); - } - - private _setLangId(): void { - const value = this.get(); - if (!value) { - this._langIdKey.set(null); - return; - } - const langId = this._modelService.getModel(value)?.getLanguageId() ?? this._languageService.guessLanguageIdByFilepathOrFirstLine(value); - this._langIdKey.set(langId); - } - - set(value: URI | null) { - if (isEqual(this.get(), value ?? undefined)) { - return; - } - this._contextKeyService.bufferChangeEvents(() => { - this._resourceKey.set(value); - this._schemeKey.set(value ? value.scheme : null); - this._filenameKey.set(value ? basename(value) : null); - this._dirnameKey.set(value ? dirname(value).fsPath : null); - this._pathKey.set(value ? value.fsPath : null); - this._setLangId(); - this._extensionKey.set(value ? extname(value) : null); - this._hasResource.set(Boolean(value)); - this._isFileSystemResource.set(value ? this._fileService.hasProvider(value) : false); - }); - } - - reset(): void { - this._contextKeyService.bufferChangeEvents(() => { - this._resourceKey.reset(); - this._schemeKey.reset(); - this._filenameKey.reset(); - this._dirnameKey.reset(); - this._pathKey.reset(); - this._langIdKey.reset(); - this._extensionKey.reset(); - this._hasResource.reset(); - this._isFileSystemResource.reset(); - }); - } - - get(): URI | undefined { - return this._resourceKey.get() ?? undefined; - } -} export class ResourceGlobMatcher extends Disposable { diff --git a/src/vs/workbench/common/viewlet.ts b/src/vs/workbench/common/viewlet.ts deleted file mode 100644 index 24207a4b570..00000000000 --- a/src/vs/workbench/common/viewlet.ts +++ /dev/null @@ -1,11 +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 { localize } from 'vs/nls'; -import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; - -export const SideBarVisibleContext = new RawContextKey('sideBarVisible', false, localize('sideBarVisible', "Whether the sidebar is visible")); -export const SidebarFocusContext = new RawContextKey('sideBarFocus', false, localize('sideBarFocus', "Whether the sidebar has keyboard focus")); -export const ActiveViewletContext = new RawContextKey('activeViewlet', '', localize('activeViewlet', "The identifier of the active viewlet")); diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 5b4875a790c..dd2a97af53d 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -6,7 +6,7 @@ import { Command } from 'vs/editor/common/languages'; import { UriComponents, URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; -import { RawContextKey, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { localize } from 'vs/nls'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -62,7 +62,6 @@ type OpenCommandActionDescriptor = { /** * View Container Contexts */ -export function getEnabledViewContainerContextKey(viewContainerId: string): string { return `viewContainer.${viewContainerId}.enabled`; } export interface IViewContainerDescriptor { @@ -128,12 +127,12 @@ export interface IViewContainersRegistry { /** * An event that is triggered when a view container is registered. */ - readonly onDidRegister: Event<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }>; + readonly onDidRegister: Event<{ viewContainer: ViewContainer; viewContainerLocation: ViewContainerLocation }>; /** * An event that is triggered when a view container is deregistered. */ - readonly onDidDeregister: Event<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }>; + readonly onDidDeregister: Event<{ viewContainer: ViewContainer; viewContainerLocation: ViewContainerLocation }>; /** * All registered view containers @@ -149,7 +148,7 @@ export interface IViewContainersRegistry { * * @returns the registered ViewContainer. */ - registerViewContainer(viewContainerDescriptor: IViewContainerDescriptor, location: ViewContainerLocation, options?: { isDefault?: boolean, donotRegisterOpenCommand?: boolean }): ViewContainer; + registerViewContainer(viewContainerDescriptor: IViewContainerDescriptor, location: ViewContainerLocation, options?: { isDefault?: boolean; donotRegisterOpenCommand?: boolean }): ViewContainer; /** * Deregisters the given view container @@ -193,11 +192,11 @@ interface RelaxedViewContainer extends ViewContainer { class ViewContainersRegistryImpl extends Disposable implements IViewContainersRegistry { - private readonly _onDidRegister = this._register(new Emitter<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }>()); - readonly onDidRegister: Event<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }> = this._onDidRegister.event; + private readonly _onDidRegister = this._register(new Emitter<{ viewContainer: ViewContainer; viewContainerLocation: ViewContainerLocation }>()); + readonly onDidRegister: Event<{ viewContainer: ViewContainer; viewContainerLocation: ViewContainerLocation }> = this._onDidRegister.event; - private readonly _onDidDeregister = this._register(new Emitter<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }>()); - readonly onDidDeregister: Event<{ viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation }> = this._onDidDeregister.event; + private readonly _onDidDeregister = this._register(new Emitter<{ viewContainer: ViewContainer; viewContainerLocation: ViewContainerLocation }>()); + readonly onDidDeregister: Event<{ viewContainer: ViewContainer; viewContainerLocation: ViewContainerLocation }> = this._onDidDeregister.event; private readonly viewContainers: Map = new Map(); private readonly defaultViewContainers: ViewContainer[] = []; @@ -206,7 +205,7 @@ class ViewContainersRegistryImpl extends Disposable implements IViewContainersRe return flatten([...this.viewContainers.values()]); } - registerViewContainer(viewContainerDescriptor: IViewContainerDescriptor, viewContainerLocation: ViewContainerLocation, options?: { isDefault?: boolean, donotRegisterOpenCommand?: boolean }): ViewContainer { + registerViewContainer(viewContainerDescriptor: IViewContainerDescriptor, viewContainerLocation: ViewContainerLocation, options?: { isDefault?: boolean; donotRegisterOpenCommand?: boolean }): ViewContainer { const existing = this.get(viewContainerDescriptor.id); if (existing) { return existing; @@ -288,14 +287,14 @@ export interface IViewDescriptor { readonly workspace?: boolean; - readonly focusCommand?: { id: string, keybindings?: IKeybindings }; + readonly focusCommand?: { id: string; keybindings?: IKeybindings }; // For contributed remote explorer views readonly group?: string; readonly remoteAuthority?: string | string[]; - readonly openCommandActionDescriptor?: OpenCommandActionDescriptor + readonly openCommandActionDescriptor?: OpenCommandActionDescriptor; } export interface ICustomTreeViewDescriptor extends ITreeViewDescriptor { @@ -321,7 +320,7 @@ export interface IAddedViewDescriptorRef extends IViewDescriptorRef { } export interface IAddedViewDescriptorState { - viewDescriptor: IViewDescriptor, + viewDescriptor: IViewDescriptor; collapsed?: boolean; visible?: boolean; } @@ -333,18 +332,18 @@ export interface IViewContainerModel { readonly title: string; readonly icon: ThemeIcon | URI | undefined; readonly keybindingId: string | undefined; - readonly onDidChangeContainerInfo: Event<{ title?: boolean, icon?: boolean, keybindingId?: boolean }>; + readonly onDidChangeContainerInfo: Event<{ title?: boolean; icon?: boolean; keybindingId?: boolean }>; readonly allViewDescriptors: ReadonlyArray; - readonly onDidChangeAllViewDescriptors: Event<{ added: ReadonlyArray, removed: ReadonlyArray }>; + readonly onDidChangeAllViewDescriptors: Event<{ added: ReadonlyArray; removed: ReadonlyArray }>; readonly activeViewDescriptors: ReadonlyArray; - readonly onDidChangeActiveViewDescriptors: Event<{ added: ReadonlyArray, removed: ReadonlyArray }>; + readonly onDidChangeActiveViewDescriptors: Event<{ added: ReadonlyArray; removed: ReadonlyArray }>; readonly visibleViewDescriptors: ReadonlyArray; readonly onDidAddVisibleViewDescriptors: Event; - readonly onDidRemoveVisibleViewDescriptors: Event - readonly onDidMoveVisibleViewDescriptors: Event<{ from: IViewDescriptorRef; to: IViewDescriptorRef; }> + readonly onDidRemoveVisibleViewDescriptors: Event; + readonly onDidMoveVisibleViewDescriptors: Event<{ from: IViewDescriptorRef; to: IViewDescriptorRef }>; isVisible(id: string): boolean; setVisible(id: string, visible: boolean, size?: number): void; @@ -353,7 +352,7 @@ export interface IViewContainerModel { setCollapsed(id: string, collapsed: boolean): void; getSize(id: string): number | undefined; - setSize(id: string, size: number): void + setSize(id: string, size: number): void; move(from: string, to: string): void; } @@ -375,15 +374,15 @@ export interface IViewContentDescriptor { export interface IViewsRegistry { - readonly onViewsRegistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }[]>; + readonly onViewsRegistered: Event<{ views: IViewDescriptor[]; viewContainer: ViewContainer }[]>; - readonly onViewsDeregistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }>; + readonly onViewsDeregistered: Event<{ views: IViewDescriptor[]; viewContainer: ViewContainer }>; - readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>; + readonly onDidChangeContainer: Event<{ views: IViewDescriptor[]; from: ViewContainer; to: ViewContainer }>; registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void; - registerViews2(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void; + registerViews2(views: { views: IViewDescriptor[]; viewContainer: ViewContainer }[]): void; deregisterViews(views: IViewDescriptor[], viewContainer: ViewContainer): void; @@ -412,14 +411,14 @@ function compareViewContentDescriptors(a: IViewContentDescriptor, b: IViewConten class ViewsRegistry extends Disposable implements IViewsRegistry { - private readonly _onViewsRegistered = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }[]>()); + private readonly _onViewsRegistered = this._register(new Emitter<{ views: IViewDescriptor[]; viewContainer: ViewContainer }[]>()); readonly onViewsRegistered = this._onViewsRegistered.event; - private readonly _onViewsDeregistered: Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], viewContainer: ViewContainer }>()); - readonly onViewsDeregistered: Event<{ views: IViewDescriptor[], viewContainer: ViewContainer }> = this._onViewsDeregistered.event; + private readonly _onViewsDeregistered: Emitter<{ views: IViewDescriptor[]; viewContainer: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[]; viewContainer: ViewContainer }>()); + readonly onViewsDeregistered: Event<{ views: IViewDescriptor[]; viewContainer: ViewContainer }> = this._onViewsDeregistered.event; - private readonly _onDidChangeContainer: Emitter<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>()); - readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }> = this._onDidChangeContainer.event; + private readonly _onDidChangeContainer: Emitter<{ views: IViewDescriptor[]; from: ViewContainer; to: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[]; from: ViewContainer; to: ViewContainer }>()); + readonly onDidChangeContainer: Event<{ views: IViewDescriptor[]; from: ViewContainer; to: ViewContainer }> = this._onDidChangeContainer.event; private readonly _onDidChangeViewWelcomeContent: Emitter = this._register(new Emitter()); readonly onDidChangeViewWelcomeContent: Event = this._onDidChangeViewWelcomeContent.event; @@ -432,7 +431,7 @@ class ViewsRegistry extends Disposable implements IViewsRegistry { this.registerViews2([{ views, viewContainer }]); } - registerViews2(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void { + registerViews2(views: { views: IViewDescriptor[]; viewContainer: ViewContainer }[]): void { views.forEach(({ views, viewContainer }) => this.addViews(views, viewContainer)); this._onViewsRegistered.fire(views); } @@ -576,7 +575,7 @@ export interface IViewsService { readonly _serviceBrand: undefined; // View Container APIs - readonly onDidChangeViewContainerVisibility: Event<{ id: string, visible: boolean, location: ViewContainerLocation }>; + readonly onDidChangeViewContainerVisibility: Event<{ id: string; visible: boolean; location: ViewContainerLocation }>; isViewContainerVisible(id: string): boolean; openViewContainer(id: string, focus?: boolean): Promise; closeViewContainer(id: string): void; @@ -584,7 +583,7 @@ export interface IViewsService { getActiveViewPaneContainerWithId(viewContainerId: string): IViewPaneContainer | null; // View APIs - readonly onDidChangeViewVisibility: Event<{ id: string, visible: boolean }>; + readonly onDidChangeViewVisibility: Event<{ id: string; visible: boolean }>; isViewVisible(id: string): boolean; openView(id: string, focus?: boolean): Promise; closeView(id: string): void; @@ -593,12 +592,6 @@ export interface IViewsService { getViewProgressIndicator(id: string): IProgressIndicator | undefined; } -/** - * View Contexts - */ -export const FocusedViewContext = new RawContextKey('focusedView', '', localize('focusedView', "The identifier of the view that has keyboard focus")); -export function getVisbileViewContextKey(viewId: string): string { return `view.${viewId}.visible`; } - export const IViewDescriptorService = createDecorator('viewDescriptorService'); export enum ViewVisibilityState { @@ -612,7 +605,7 @@ export interface IViewDescriptorService { // ViewContainers readonly viewContainers: ReadonlyArray; - readonly onDidChangeViewContainers: Event<{ added: ReadonlyArray<{ container: ViewContainer, location: ViewContainerLocation }>, removed: ReadonlyArray<{ container: ViewContainer, location: ViewContainerLocation }> }>; + readonly onDidChangeViewContainers: Event<{ added: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }>; removed: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }> }>; getDefaultViewContainer(location: ViewContainerLocation): ViewContainer | undefined; getViewContainerById(id: string): ViewContainer | null; @@ -622,7 +615,7 @@ export interface IViewDescriptorService { getViewContainersByLocation(location: ViewContainerLocation): ViewContainer[]; getViewContainerModel(viewContainer: ViewContainer): IViewContainerModel; - readonly onDidChangeContainerLocation: Event<{ viewContainer: ViewContainer, from: ViewContainerLocation, to: ViewContainerLocation }>; + readonly onDidChangeContainerLocation: Event<{ viewContainer: ViewContainer; from: ViewContainerLocation; to: ViewContainerLocation }>; moveViewContainerToLocation(viewContainer: ViewContainer, location: ViewContainerLocation, requestedIndex?: number): void; // Views @@ -631,10 +624,10 @@ export interface IViewDescriptorService { getDefaultContainerById(id: string): ViewContainer | null; getViewLocationById(id: string): ViewContainerLocation | null; - readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>; + readonly onDidChangeContainer: Event<{ views: IViewDescriptor[]; from: ViewContainer; to: ViewContainer }>; moveViewsToContainer(views: IViewDescriptor[], viewContainer: ViewContainer, visibilityState?: ViewVisibilityState): void; - readonly onDidChangeLocation: Event<{ views: IViewDescriptor[], from: ViewContainerLocation, to: ViewContainerLocation }>; + readonly onDidChangeLocation: Event<{ views: IViewDescriptor[]; from: ViewContainerLocation; to: ViewContainerLocation }>; moveViewToLocation(view: IViewDescriptor, location: ViewContainerLocation): void; reset(): void; @@ -644,6 +637,7 @@ export interface IViewDescriptorService { export interface ITreeDataTransferItem { asString(): Thenable; + value: any; } export type ITreeDataTransfer = Map; @@ -720,8 +714,8 @@ export interface ITreeViewDescriptor extends IViewDescriptor { } export type TreeViewItemHandleArg = { - $treeViewId: string, - $treeItemHandle: string + $treeViewId: string; + $treeItemHandle: string; }; export enum TreeItemCollapsibleState { @@ -839,13 +833,14 @@ export interface ITreeViewDataProvider { } export interface ITreeViewDragAndDropController { - readonly supportedMimeTypes: string[]; - handleDrag(sourceTreeItemHandles: string[], operationUuid: string): Promise; - handleDrop(elements: ITreeDataTransfer, target: ITreeItem, operationUuid?: string, sourceTreeId?: string, sourceTreeItemHandles?: string[]): Promise; + readonly dropMimeTypes: string[]; + readonly dragMimeTypes: string[]; + handleDrag(sourceTreeItemHandles: string[], operationUuid: string, token: CancellationToken): Promise; + handleDrop(elements: ITreeDataTransfer, target: ITreeItem, token: CancellationToken, operationUuid?: string, sourceTreeId?: string, sourceTreeItemHandles?: string[]): Promise; } export interface IEditableData { - validationMessage: (value: string) => { content: string, severity: Severity } | null; + validationMessage: (value: string) => { content: string; severity: Severity } | null; placeholder?: string | null; startingValue?: string | null; onFinish: (value: string, success: boolean) => Promise; diff --git a/src/vs/workbench/api/common/shared/webview.ts b/src/vs/workbench/common/webview.ts similarity index 93% rename from src/vs/workbench/api/common/shared/webview.ts rename to src/vs/workbench/common/webview.ts index 5a099003c41..0b58f3a5d4e 100644 --- a/src/vs/workbench/api/common/shared/webview.ts +++ b/src/vs/workbench/common/webview.ts @@ -6,12 +6,11 @@ import { CharCode } from 'vs/base/common/charCode'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import type * as vscode from 'vscode'; export interface WebviewInitData { readonly remote: { readonly isRemote: boolean; - readonly authority: string | undefined + readonly authority: string | undefined; }; } @@ -41,9 +40,9 @@ export const webviewGenericCspSource = `https://*.${webviewResourceBaseHost}`; * @param remoteInfo Optional information about the remote that specifies where `resource` should be resolved from. */ export function asWebviewUri( - resource: vscode.Uri, - remoteInfo?: { authority: string | undefined, isRemote: boolean } -): vscode.Uri { + resource: URI, + remoteInfo?: { authority: string | undefined; isRemote: boolean } +): URI { if (resource.scheme === Schemas.http || resource.scheme === Schemas.https) { return resource; } diff --git a/src/vs/workbench/contrib/audioCues/browser/audioCueContribution.ts b/src/vs/workbench/contrib/audioCues/browser/audioCueContribution.ts index 951e9df8c74..13265027a42 100644 --- a/src/vs/workbench/contrib/audioCues/browser/audioCueContribution.ts +++ b/src/vs/workbench/contrib/audioCues/browser/audioCueContribution.ts @@ -7,26 +7,27 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IDebugService } from 'vs/workbench/contrib/debug/common/debug'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { Event } from 'vs/base/common/event'; -import { isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; +import { Emitter, Event } from 'vs/base/common/event'; +import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { raceTimeout } from 'vs/base/common/async'; import { FileAccess } from 'vs/base/common/network'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers'; -import { FoldingController } from 'vs/editor/contrib/folding/folding'; -import { FoldingModel } from 'vs/editor/contrib/folding/foldingModel'; +import { FoldingController } from 'vs/editor/contrib/folding/browser/folding'; +import { FoldingModel } from 'vs/editor/contrib/folding/browser/foldingModel'; +import { URI } from 'vs/base/common/uri'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; export class AudioCueContribution extends DisposableStore implements IWorkbenchContribution { private audioCuesEnabled = false; private readonly store = this.add(new DisposableStore()); constructor( - @IDebugService readonly debugService: IDebugService, - @IEditorService readonly editorService: IEditorService, + @IEditorService private readonly editorService: IEditorService, @IConfigurationService private readonly _configurationService: IConfigurationService, @IAccessibilityService private readonly accessibilityService: IAccessibilityService, - @IMarkerService private readonly markerService: IMarkerService, + @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); @@ -71,124 +72,105 @@ export class AudioCueContribution extends DisposableStore implements IWorkbenchC Event.runAndSubscribeWithStore( this.editorService.onDidActiveEditorChange, (_, store) => { - let lastLineNumber = -1; - let hadBreakpoint = false; - let hadMarker = false; - let hadFoldedArea = false; - const activeTextEditorControl = this.editorService.activeTextEditorControl; - if ( - isCodeEditor(activeTextEditorControl) || - isDiffEditor(activeTextEditorControl) - ) { - const editor = isDiffEditor(activeTextEditorControl) - ? activeTextEditorControl.getOriginalEditor() - : activeTextEditorControl; - let foldingModel: FoldingModel | null = null; - editor - .getContribution(FoldingController.ID) - ?.getFoldingModel() - ?.then((newFoldingModel) => { - foldingModel = newFoldingModel; - update(); - }); + const editor = isDiffEditor(activeTextEditorControl) + ? activeTextEditorControl.getOriginalEditor() + : isCodeEditor(activeTextEditorControl) + ? activeTextEditorControl + : undefined; - const update = () => { - const model = editor.getModel(); - if (!model) { - return; - } - const position = editor.getPosition(); - if (!position) { - return; - } - const lineNumber = position.lineNumber; - - const uri = model.uri; - - const breakpoints = this.debugService - .getModel() - .getBreakpoints({ uri, lineNumber }); - const hasBreakpoints = breakpoints.length > 0; - - if (hasBreakpoints && !hadBreakpoint) { - this.handleBreakpointOnLine(); - } - hadBreakpoint = hasBreakpoints; - - const hasMarker = this.markerService - .read({ resource: uri }) - .some( - (m) => - m.severity === MarkerSeverity.Error && - m.startLineNumber <= lineNumber && - lineNumber <= m.endLineNumber - ); - - if (hasMarker && !hadMarker) { - this.handleErrorOnLine(); - } - hadMarker = hasMarker; - - const regionAtLine = foldingModel?.getRegionAtLine(lineNumber); - const hasFolding = regionAtLine?.startLineNumber === lineNumber; - if (hasFolding && !hadFoldedArea) { - this.handleFoldedAreasOnLine(); - } - hadFoldedArea = hasFolding; - }; - - store.add( - editor.onDidChangeCursorPosition(() => { - const model = editor.getModel(); - if (!model) { - return; - } - const position = editor.getPosition(); - if (!position) { - return; - } - const lineNumber = position.lineNumber; - if (lineNumber === lastLineNumber) { - return; - } - lastLineNumber = lineNumber; - hadMarker = false; - hadBreakpoint = false; - hadFoldedArea = false; - update(); - }) - ); - store.add( - this.markerService.onMarkerChanged(() => { - update(); - }) - ); - store.add( - this.debugService.getModel().onDidChangeBreakpoints(() => { - update(); - }) - ); - - update(); + if (editor) { + this.handleCurrentEditor(editor, store); } } ) ); } - private handleBreakpointOnLine(): void { - this.playSound('break'); - } + private handleCurrentEditor(editor: ICodeEditor, store: DisposableStore): void { + const features: Feature[] = [ + this.instantiationService.createInstance(ErrorFeature), + this.instantiationService.createInstance(FoldedAreaFeature), + this.instantiationService.createInstance(BreakpointFeature), + ]; - private handleErrorOnLine(): void { - this.playSound('error'); - } + const featuresPerEditor = new Map( + features.map((feature) => [ + feature, + feature.createForEditor(editor, editor.getModel()!.uri), + ]) + ); - private handleFoldedAreasOnLine(): void { - this.playSound('foldedAreas'); + interface State { + lineNumber: number; + featureStates: Map; + } + + const computeNewState = (): State | undefined => { + if (!editor.hasModel()) { + return undefined; + } + const position = editor.getPosition(); + + const lineNumber = position.lineNumber; + const featureStates = new Map( + features.map((feature) => [ + feature, + featuresPerEditor.get(feature)!.isActive(lineNumber), + ]) + ); + return { + lineNumber, + featureStates + }; + }; + + let lastState: State | undefined; + const updateState = () => { + const newState = computeNewState(); + + for (const feature of features) { + if ( + newState && + newState.featureStates.get(feature) && + (!lastState?.featureStates?.get(feature) || + newState.lineNumber !== lastState.lineNumber) + ) { + this.playSound(feature.audioCueFilename); + } + } + + lastState = newState; + }; + + for (const feature of featuresPerEditor.values()) { + if (feature.onChange) { + store.add(feature.onChange(updateState)); + } + } + + { + let lastLineNumber = -1; + store.add( + editor.onDidChangeCursorPosition(() => { + const position = editor.getPosition(); + if (!position) { + return; + } + const lineNumber = position.lineNumber; + if (lineNumber === lastLineNumber) { + return; + } + lastLineNumber = lineNumber; + + updateState(); + }) + ); + } + + updateState(); } private async playSound(fileName: string) { @@ -212,3 +194,109 @@ export class AudioCueContribution extends DisposableStore implements IWorkbenchC } } } + +interface Feature { + audioCueFilename: string; + createForEditor( + editor: ICodeEditor, + uri: URI + ): FeatureResult; +} + +interface FeatureResult { + isActive(lineNumber: number): boolean; + onChange?: Event; +} + +class ErrorFeature implements Feature { + public readonly audioCueFilename = 'error'; + + constructor(@IMarkerService private readonly markerService: IMarkerService) { } + + createForEditor( + editor: ICodeEditor, + uri: URI + ): FeatureResult { + return { + isActive: (lineNumber) => { + const hasMarker = this.markerService + .read({ resource: uri }) + .some( + (m) => + m.severity === MarkerSeverity.Error && + m.startLineNumber <= lineNumber && + lineNumber <= m.endLineNumber + ); + return hasMarker; + }, + onChange: Event.map( + Event.filter( + this.markerService.onMarkerChanged, + (changedUris) => { + const curUri = editor.getModel()?.uri?.toString(); + return ( + !!curUri && changedUris.some((u) => u.toString() === curUri) + ); + } + ), + (x) => undefined + ), + }; + } +} + +class FoldedAreaFeature implements Feature { + public readonly audioCueFilename = 'foldedAreas'; + + createForEditor( + editor: ICodeEditor, + uri: URI + ): FeatureResult { + const emitter = new Emitter(); + let foldingModel: FoldingModel | null = null; + editor + .getContribution(FoldingController.ID) + ?.getFoldingModel() + ?.then((newFoldingModel) => { + foldingModel = newFoldingModel; + emitter.fire(); + }); + + return { + isActive: lineNumber => { + const regionAtLine = foldingModel?.getRegionAtLine(lineNumber); + const hasFolding = !regionAtLine + ? false + : regionAtLine.isCollapsed && + regionAtLine.startLineNumber === lineNumber; + return hasFolding; + }, + onChange: emitter.event, + }; + } +} + +class BreakpointFeature implements Feature { + public readonly audioCueFilename = 'break'; + + constructor(@IDebugService private readonly debugService: IDebugService) { } + + createForEditor( + editor: ICodeEditor, + uri: URI + ): FeatureResult { + return { + isActive: (lineNumber) => { + const breakpoints = this.debugService + .getModel() + .getBreakpoints({ uri, lineNumber }); + const hasBreakpoints = breakpoints.length > 0; + return hasBreakpoints; + }, + onChange: Event.map( + this.debugService.getModel().onDidChangeBreakpoints, + () => undefined + ), + }; + } +} diff --git a/src/vs/workbench/contrib/audioCues/browser/media/break.opus b/src/vs/workbench/contrib/audioCues/browser/media/break.opus index e025dd7e784..a500eec2fb8 100644 Binary files a/src/vs/workbench/contrib/audioCues/browser/media/break.opus and b/src/vs/workbench/contrib/audioCues/browser/media/break.opus differ diff --git a/src/vs/workbench/contrib/audioCues/browser/media/error.opus b/src/vs/workbench/contrib/audioCues/browser/media/error.opus index eade1900ece..9f0170086f9 100644 Binary files a/src/vs/workbench/contrib/audioCues/browser/media/error.opus and b/src/vs/workbench/contrib/audioCues/browser/media/error.opus differ diff --git a/src/vs/workbench/contrib/audioCues/browser/media/foldedAreas.opus b/src/vs/workbench/contrib/audioCues/browser/media/foldedAreas.opus index f840aaa2953..c5be7c1b84c 100644 Binary files a/src/vs/workbench/contrib/audioCues/browser/media/foldedAreas.opus and b/src/vs/workbench/contrib/audioCues/browser/media/foldedAreas.opus differ diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkTextEdits.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkTextEdits.ts index e71acf2ad3d..737c8d2a00d 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkTextEdits.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkTextEdits.ts @@ -6,10 +6,10 @@ import { dispose, IDisposable, IReference } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { EndOfLineSequence, IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { EndOfLineSequence, ITextModel } from 'vs/editor/common/model'; import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; import { IProgress } from 'vs/platform/progress/common/progress'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; @@ -20,14 +20,14 @@ import { IModelService } from 'vs/editor/common/services/model'; import { ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService'; import { CancellationToken } from 'vs/base/common/cancellation'; -type ValidationResult = { canApply: true } | { canApply: false, reason: URI }; +type ValidationResult = { canApply: true } | { canApply: false; reason: URI }; class ModelEditTask implements IDisposable { readonly model: ITextModel; private _expectedModelVersionId: number | undefined; - protected _edits: IIdentifiedSingleEditOperation[]; + protected _edits: ISingleEditOperation[]; protected _newEol: EndOfLineSequence | undefined; constructor(private readonly _modelReference: IReference) { diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution.ts index 8e853adb557..9ebd49c836a 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution.ts @@ -8,7 +8,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { IBulkEditService, ResourceEdit } from 'vs/editor/browser/services/bulkEditService'; import { BulkEditPane } from 'vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane'; -import { IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewsRegistry, FocusedViewContext, IViewsService } from 'vs/workbench/common/views'; +import { IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewsRegistry, IViewsService } from 'vs/workbench/common/views'; +import { FocusedViewContext } from 'vs/workbench/common/contextkeys'; import { localize } from 'vs/nls'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { RawContextKey, IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -171,9 +172,6 @@ registerAction2(class ApplyAction extends Action2 { icon: Codicon.check, precondition: ContextKeyExpr.and(BulkEditPreviewContribution.ctxEnabled, BulkEditPane.ctxHasCheckedChanges), menu: [{ - id: MenuId.BulkEditTitle, - group: 'navigation' - }, { id: MenuId.BulkEditContext, order: 1 }], @@ -205,9 +203,6 @@ registerAction2(class DiscardAction extends Action2 { icon: Codicon.clearAll, precondition: BulkEditPreviewContribution.ctxEnabled, menu: [{ - id: MenuId.BulkEditTitle, - group: 'navigation' - }, { id: MenuId.BulkEditContext, order: 2 }] diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.css b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.css index 287c5ec0963..7e994763d64 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.css +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.css @@ -16,18 +16,36 @@ padding: 10px 20px } -.monaco-workbench .bulk-edit-panel [data-state="message"] .message, -.monaco-workbench .bulk-edit-panel [data-state="data"] .tree +.monaco-workbench .bulk-edit-panel[data-state="message"] .message, +.monaco-workbench .bulk-edit-panel[data-state="data"] .content { - display: inherit; + display: flex; } -.monaco-workbench .bulk-edit-panel [data-state="data"] .message, -.monaco-workbench .bulk-edit-panel [data-state="message"] .tree +.monaco-workbench .bulk-edit-panel[data-state="data"] .message, +.monaco-workbench .bulk-edit-panel[data-state="message"] .content { display: none; } +.monaco-workbench .bulk-edit-panel .content { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.monaco-workbench .bulk-edit-panel .content .buttons { + padding-left: 20px; + padding-top: 10px; +} + +.monaco-workbench .bulk-edit-panel .content .buttons .monaco-button { + display: inline-flex; + width: inherit; + margin: 0 4px; + padding: 4px 8px; +} + .monaco-workbench .bulk-edit-panel .monaco-tl-contents { display: flex; } diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts index f95ce165dd3..c6af0ffa259 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane.ts @@ -38,6 +38,7 @@ import { IViewDescriptorService } from 'vs/workbench/common/views'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ResourceEdit } from 'vs/editor/browser/services/bulkEditService'; +import { ButtonBar } from 'vs/base/browser/ui/button/button'; const enum State { Data = 'data', @@ -114,12 +115,13 @@ export class BulkEditPane extends ViewPane { ); this._disposables.add(resourceLabels); + const contentContainer = document.createElement('div'); + contentContainer.className = 'content'; + parent.appendChild(contentContainer); + // tree const treeContainer = document.createElement('div'); - treeContainer.className = 'tree'; - treeContainer.style.width = '100%'; - treeContainer.style.height = '100%'; - parent.appendChild(treeContainer); + contentContainer.appendChild(treeContainer); this._treeDataSource = this._instaService.createInstance(BulkEditDataSource); this._treeDataSource.groupByFile = this._storageService.getBoolean(BulkEditPane._memGroupByFile, StorageScope.GLOBAL, true); @@ -144,6 +146,21 @@ export class BulkEditPane extends ViewPane { this._disposables.add(this._tree.onContextMenu(this._onContextMenu, this)); this._disposables.add(this._tree.onDidOpen(e => this._openElementAsEditor(e))); + // buttons + const buttonsContainer = document.createElement('div'); + buttonsContainer.className = 'buttons'; + contentContainer.appendChild(buttonsContainer); + const buttonBar = new ButtonBar(buttonsContainer); + this._disposables.add(buttonBar); + + const btnConfirm = buttonBar.addButton({ supportIcons: true }); + btnConfirm.label = localize('ok', 'Apply'); + btnConfirm.onDidClick(() => this.accept(), this, this._disposables); + + const btnCancel = buttonBar.addButton({ /* secondary: true */ }); + btnCancel.label = localize('cancel', 'Discard'); + btnCancel.onDidClick(() => this.discard(), this, this._disposables); + // message this._message = document.createElement('span'); this._message.className = 'message'; @@ -156,7 +173,9 @@ export class BulkEditPane extends ViewPane { protected override layoutBody(height: number, width: number): void { super.layoutBody(height, width); - this._tree.layout(height, width); + const treeHeight = height - 50; + this._tree.getHTMLElement().parentElement!.style.height = `${treeHeight}px`; + this._tree.layout(treeHeight, width); } private _setState(state: State): void { diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts index 2f039a462ca..e562290513f 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts @@ -5,18 +5,17 @@ import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { URI } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { WorkspaceEditMetadata } from 'vs/editor/common/languages'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { coalesceInPlace } from 'vs/base/common/arrays'; import { Range } from 'vs/editor/common/core/range'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IFileService } from 'vs/platform/files/common/files'; import { Emitter, Event } from 'vs/base/common/event'; -import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; import { ConflictDetector } from 'vs/workbench/contrib/bulkEdit/browser/conflicts'; import { ResourceMap } from 'vs/base/common/map'; import { localize } from 'vs/nls'; @@ -306,12 +305,12 @@ export class BulkFileOperations { return result; } - getFileEdits(uri: URI): IIdentifiedSingleEditOperation[] { + getFileEdits(uri: URI): ISingleEditOperation[] { for (let file of this.fileOperations) { if (file.uri.toString() === uri.toString()) { - const result: IIdentifiedSingleEditOperation[] = []; + const result: ISingleEditOperation[] = []; let ignoreAll = false; for (const edit of file.originalEdits.values()) { @@ -361,7 +360,7 @@ export class BulkEditPreviewProvider implements ITextModelContentProvider { private readonly _disposables = new DisposableStore(); private readonly _ready: Promise; - private readonly _modelPreviewEdits = new Map(); + private readonly _modelPreviewEdits = new Map(); private readonly _instanceId = generateUuid(); constructor( diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree.ts index 695b272d0ae..c796f5e0ce4 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree.ts @@ -28,7 +28,7 @@ import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { Iterable } from 'vs/base/common/iterator'; import { ResourceFileEdit } from 'vs/editor/browser/services/bulkEditService'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; // --- VIEW MODEL @@ -359,7 +359,7 @@ export class BulkEditAccessibilityProvider implements IListAccessibilityProvider export class BulkEditIdentityProvider implements IIdentityProvider { - getId(element: BulkEditElement): { toString(): string; } { + getId(element: BulkEditElement): { toString(): string } { if (element instanceof FileElement) { return element.edit.uri + (element.parent instanceof CategoryElement ? JSON.stringify(element.parent.category.metadata) : ''); } else if (element instanceof TextEditElement) { diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts index 7eed240c403..2b22fc4d10c 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts @@ -17,7 +17,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { PeekContext } from 'vs/editor/contrib/peekView/peekView'; +import { PeekContext } from 'vs/editor/contrib/peekView/browser/peekView'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { Range } from 'vs/editor/common/core/range'; @@ -25,6 +25,7 @@ import { IPosition } from 'vs/editor/common/core/position'; import { MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { Codicon } from 'vs/base/common/codicons'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; +import { isCancellationError } from 'vs/base/common/errors'; const _ctxHasCallHierarchyProvider = new RawContextKey('editorHasCallHierarchyProvider', false, localize('editorHasCallHierarchyProvider', 'Whether a call hierarchy provider is available')); const _ctxCallHierarchyVisible = new RawContextKey('callHierarchyVisible', false, localize('callHierarchyVisible', 'Whether call hierarchy peek is currently showing')); @@ -145,9 +146,12 @@ class CallHierarchyController implements IEditorContribution { else { this._widget!.showMessage(localize('no.item', "No results")); } - }).catch(e => { + }).catch(err => { + if (isCancellationError(err)) { + this.endCallHierarchy(); + return; + } this._widget!.showMessage(localize('error', "Failed to show call hierarchy")); - console.error(e); }); } diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts index fb4d080f952..5c6550e648e 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/callHierarchy'; -import * as peekView from 'vs/editor/contrib/peekView/peekView'; +import * as peekView from 'vs/editor/contrib/peekView/browser/peekView'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CallHierarchyDirection, CallHierarchyModel } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts index f17983a8256..bce1b7846dd 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -86,7 +86,7 @@ export class IdentityProvider implements IIdentityProvider { public getDirection: () => CallHierarchyDirection ) { } - getId(element: Call): { toString(): string; } { + getId(element: Call): { toString(): string } { let res = this.getDirection() + JSON.stringify(element.item.uri) + JSON.stringify(element.item.range); if (element.parent) { res += this.getId(element.parent); diff --git a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts index 8c35d2f97ee..181d4cf3335 100644 --- a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts +++ b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts @@ -7,7 +7,7 @@ import { IRange } from 'vs/editor/common/core/range'; import { SymbolKind, ProviderResult, SymbolTag } from 'vs/editor/common/languages'; import { ITextModel } from 'vs/editor/common/model'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { LanguageFeatureRegistry } from 'vs/editor/common/languages/languageFeatureRegistry'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; import { URI } from 'vs/base/common/uri'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { isNonEmptyArray } from 'vs/base/common/arrays'; @@ -32,7 +32,7 @@ export interface CallHierarchyItem { uri: URI; range: IRange; selectionRange: IRange; - tags?: SymbolTag[] + tags?: SymbolTag[]; } export interface IncomingCall { diff --git a/src/vs/workbench/contrib/codeActions/common/codeActions.contribution.ts b/src/vs/workbench/contrib/codeActions/browser/codeActions.contribution.ts similarity index 89% rename from src/vs/workbench/contrib/codeActions/common/codeActions.contribution.ts rename to src/vs/workbench/contrib/codeActions/browser/codeActions.contribution.ts index 36a0a7d2a17..afcf9915643 100644 --- a/src/vs/workbench/contrib/codeActions/common/codeActions.contribution.ts +++ b/src/vs/workbench/contrib/codeActions/browser/codeActions.contribution.ts @@ -5,14 +5,14 @@ import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { CodeActionsContribution, editorConfiguration } from 'vs/workbench/contrib/codeActions/common/codeActionsContribution'; import { CodeActionsExtensionPoint, codeActionsExtensionPointDescriptor } from 'vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint'; -import { CodeActionDocumentationContribution } from 'vs/workbench/contrib/codeActions/common/documentationContribution'; import { DocumentationExtensionPoint, documentationExtensionPointDescriptor } from 'vs/workbench/contrib/codeActions/common/documentationExtensionPoint'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; +import { CodeActionsContribution, editorConfiguration } from './codeActionsContribution'; +import { CodeActionDocumentationContribution } from './documentationContribution'; const codeActionsExtensionPoint = ExtensionsRegistry.registerExtensionPoint(codeActionsExtensionPointDescriptor); const documentationExtensionPoint = ExtensionsRegistry.registerExtensionPoint(documentationExtensionPointDescriptor); diff --git a/src/vs/workbench/contrib/codeActions/common/codeActionsContribution.ts b/src/vs/workbench/contrib/codeActions/browser/codeActionsContribution.ts similarity index 95% rename from src/vs/workbench/contrib/codeActions/common/codeActionsContribution.ts rename to src/vs/workbench/contrib/codeActions/browser/codeActionsContribution.ts index 2d8d20d36e1..86ef656cdbc 100644 --- a/src/vs/workbench/contrib/codeActions/common/codeActionsContribution.ts +++ b/src/vs/workbench/contrib/codeActions/browser/codeActionsContribution.ts @@ -7,16 +7,16 @@ import { flatten } from 'vs/base/common/arrays'; import { Emitter } from 'vs/base/common/event'; import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import { Disposable } from 'vs/base/common/lifecycle'; -import { codeActionCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/codeAction'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/types'; +import { editorConfigurationBaseNode } from 'vs/editor/common/config/editorConfigurationSchema'; +import { codeActionCommandId, refactorCommandId, sourceActionCommandId } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; import * as nls from 'vs/nls'; -import { Extensions, IConfigurationNode, IConfigurationRegistry, ConfigurationScope, IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; +import { ConfigurationScope, Extensions, IConfigurationNode, IConfigurationPropertySchema, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { CodeActionsExtensionPoint, ContributedCodeAction } from 'vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint'; import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { editorConfigurationBaseNode } from 'vs/editor/common/config/editorConfigurationSchema'; const codeActionsOnSaveDefaultProperties = Object.freeze({ 'source.fixAll': { diff --git a/src/vs/workbench/contrib/codeActions/common/documentationContribution.ts b/src/vs/workbench/contrib/codeActions/browser/documentationContribution.ts similarity index 71% rename from src/vs/workbench/contrib/codeActions/common/documentationContribution.ts rename to src/vs/workbench/contrib/codeActions/browser/documentationContribution.ts index 46069b28989..2bef8ca40d5 100644 --- a/src/vs/workbench/contrib/codeActions/common/documentationContribution.ts +++ b/src/vs/workbench/contrib/codeActions/browser/documentationContribution.ts @@ -7,16 +7,17 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable } from 'vs/base/common/lifecycle'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; +import * as languages from 'vs/editor/common/languages'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/types'; -import { ContextKeyExpr, IContextKeyService, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; +import { ContextKeyExpr, ContextKeyExpression, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { DocumentationExtensionPoint } from 'vs/workbench/contrib/codeActions/common/documentationExtensionPoint'; import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { DocumentationExtensionPoint } from './documentationExtensionPoint'; -export class CodeActionDocumentationContribution extends Disposable implements IWorkbenchContribution, modes.CodeActionProvider { +export class CodeActionDocumentationContribution extends Disposable implements IWorkbenchContribution, languages.CodeActionProvider { private contributions: { title: string; @@ -32,10 +33,11 @@ export class CodeActionDocumentationContribution extends Disposable implements I constructor( extensionPoint: IExtensionPoint, @IContextKeyService private readonly contextKeyService: IContextKeyService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); - this._register(modes.CodeActionProviderRegistry.register('*', this)); + this._register(languageFeaturesService.codeActionProvider.register('*', this)); extensionPoint.setHandler(points => { this.contributions = []; @@ -61,11 +63,11 @@ export class CodeActionDocumentationContribution extends Disposable implements I }); } - async provideCodeActions(_model: ITextModel, _range: Range | Selection, context: modes.CodeActionContext, _token: CancellationToken): Promise { + async provideCodeActions(_model: ITextModel, _range: Range | Selection, context: languages.CodeActionContext, _token: CancellationToken): Promise { return this.emptyCodeActionsList; } - public _getAdditionalMenuItems(context: modes.CodeActionContext, actions: readonly modes.CodeAction[]): modes.Command[] { + public _getAdditionalMenuItems(context: languages.CodeActionContext, actions: readonly languages.CodeAction[]): languages.Command[] { if (context.only !== CodeActionKind.Refactor.value) { if (!actions.some(action => action.kind && CodeActionKind.Refactor.contains(new CodeActionKind(action.kind)))) { return []; diff --git a/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts b/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts index 344afbe6f33..e2b59f9d4b2 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts @@ -20,7 +20,7 @@ import { EditorCommand, registerEditorContribution, registerEditorCommand } from import { IEditorOptions, EditorOption } from 'vs/editor/common/config/editorOptions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode'; +import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts b/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts index c4201763be0..4973e670f3b 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts @@ -9,7 +9,7 @@ import { registerDiffEditorContribution } from 'vs/editor/browser/editorExtensio import { IDiffEditorContribution } from 'vs/editor/common/editorCommon'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { FloatingClickWidget } from 'vs/workbench/browser/codeeditor'; -import { IDiffComputationResult } from 'vs/editor/common/services/editorWorker'; +import { IDiffComputationResult } from 'vs/editor/common/diff/diffComputer'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts index d87fb733b2c..7b54eef8f20 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts @@ -10,9 +10,9 @@ import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findIn import { Widget } from 'vs/base/browser/ui/widget'; import { Delayer } from 'vs/base/common/async'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { IMessage as InputBoxMessage } from 'vs/base/browser/ui/inputbox/inputBox'; -import { SimpleButton, findPreviousMatchIcon, findNextMatchIcon } from 'vs/editor/contrib/find/findWidget'; +import { SimpleButton, findPreviousMatchIcon, findNextMatchIcon } from 'vs/editor/contrib/find/browser/findWidget'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { editorWidgetBackground, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; diff --git a/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts b/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts index 6b7df05dd5f..4dd4f7e3bb3 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens.ts @@ -16,8 +16,8 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import { FontStyle, StandardTokenType, TokenMetadata, DocumentSemanticTokensProviderRegistry, SemanticTokensLegend, SemanticTokens, ColorId, DocumentRangeSemanticTokensProviderRegistry } from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { FontStyle, StandardTokenType, TokenMetadata, SemanticTokensLegend, SemanticTokens, ColorId } from 'vs/editor/common/languages'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { editorHoverBackground, editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; @@ -32,6 +32,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { SEMANTIC_HIGHLIGHTING_SETTING_ID, IEditorSemanticHighlightingOptions } from 'vs/editor/common/services/modelService'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { Schemas } from 'vs/base/common/network'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const $ = dom.$; @@ -49,6 +50,7 @@ class InspectEditorTokensController extends Disposable implements IEditorContrib private _languageService: ILanguageService; private _notificationService: INotificationService; private _configurationService: IConfigurationService; + private _languageFeaturesService: ILanguageFeaturesService; private _widget: InspectEditorTokensWidget | null; constructor( @@ -57,7 +59,8 @@ class InspectEditorTokensController extends Disposable implements IEditorContrib @ILanguageService languageService: ILanguageService, @IWorkbenchThemeService themeService: IWorkbenchThemeService, @INotificationService notificationService: INotificationService, - @IConfigurationService configurationService: IConfigurationService + @IConfigurationService configurationService: IConfigurationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService ) { super(); this._editor = editor; @@ -66,6 +69,7 @@ class InspectEditorTokensController extends Disposable implements IEditorContrib this._languageService = languageService; this._notificationService = notificationService; this._configurationService = configurationService; + this._languageFeaturesService = languageFeaturesService; this._widget = null; this._register(this._editor.onDidChangeModel((e) => this.stop())); @@ -89,7 +93,7 @@ class InspectEditorTokensController extends Disposable implements IEditorContrib // disable in notebooks return; } - this._widget = new InspectEditorTokensWidget(this._editor, this._textMateService, this._languageService, this._themeService, this._notificationService, this._configurationService); + this._widget = new InspectEditorTokensWidget(this._editor, this._textMateService, this._languageService, this._themeService, this._notificationService, this._configurationService, this._languageFeaturesService); } public stop(): void { @@ -136,8 +140,8 @@ interface ISemanticTokenInfo { type: string; modifiers: string[]; range: Range; - metadata?: IDecodedMetadata, - definitions: TokenStyleDefinitions + metadata?: IDecodedMetadata; + definitions: TokenStyleDefinitions; } interface IDecodedMetadata { @@ -174,7 +178,7 @@ function renderTokenText(tokenText: string): string { return result; } -type SemanticTokensResult = { tokens: SemanticTokens, legend: SemanticTokensLegend }; +type SemanticTokensResult = { tokens: SemanticTokens; legend: SemanticTokensLegend }; class InspectEditorTokensWidget extends Disposable implements IContentWidget { @@ -190,6 +194,7 @@ class InspectEditorTokensWidget extends Disposable implements IContentWidget { private readonly _textMateService: ITextMateService; private readonly _notificationService: INotificationService; private readonly _configurationService: IConfigurationService; + private readonly _languageFeaturesService: ILanguageFeaturesService; private readonly _model: ITextModel; private readonly _domNode: HTMLElement; private readonly _currentRequestCancellationTokenSource: CancellationTokenSource; @@ -200,7 +205,8 @@ class InspectEditorTokensWidget extends Disposable implements IContentWidget { languageService: ILanguageService, themeService: IWorkbenchThemeService, notificationService: INotificationService, - configurationService: IConfigurationService + configurationService: IConfigurationService, + languageFeaturesService: ILanguageFeaturesService ) { super(); this._isDisposed = false; @@ -210,6 +216,7 @@ class InspectEditorTokensWidget extends Disposable implements IContentWidget { this._textMateService = textMateService; this._notificationService = notificationService; this._configurationService = configurationService; + this._languageFeaturesService = languageFeaturesService; this._model = this._editor.getModel(); this._domNode = document.createElement('div'); this._domNode.className = 'token-inspect-widget'; @@ -528,7 +535,7 @@ class InspectEditorTokensWidget extends Disposable implements IContentWidget { return null; } - const tokenProviders = DocumentSemanticTokensProviderRegistry.ordered(this._model); + const tokenProviders = this._languageFeaturesService.documentSemanticTokensProvider.ordered(this._model); if (tokenProviders.length) { const provider = tokenProviders[0]; const tokens = await Promise.resolve(provider.provideDocumentSemanticTokens(this._model, null, this._currentRequestCancellationTokenSource.token)); @@ -536,7 +543,7 @@ class InspectEditorTokensWidget extends Disposable implements IContentWidget { return { tokens, legend: provider.getLegend() }; } } - const rangeTokenProviders = DocumentRangeSemanticTokensProviderRegistry.ordered(this._model); + const rangeTokenProviders = this._languageFeaturesService.documentRangeSemanticTokensProvider.ordered(this._model); if (rangeTokenProviders.length) { const provider = rangeTokenProviders[0]; const lineNumber = position.lineNumber; diff --git a/src/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint.ts b/src/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint.ts index eb107933048..54435f773cf 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint.ts @@ -10,7 +10,7 @@ import * as types from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { CharacterPair, CommentRule, EnterAction, ExplicitLanguageConfiguration, FoldingRules, IAutoClosingPair, IAutoClosingPairConditional, IndentAction, IndentationRule, OnEnterRule } from 'vs/editor/common/languages/languageConfiguration'; import { LanguageConfigurationRegistry } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { Extensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsOutline.ts b/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsOutline.ts index d3d81321a7f..8a23eaaeb0a 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsOutline.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsOutline.ts @@ -12,8 +12,7 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle import { IEditorPane } from 'vs/workbench/common/editor'; import { DocumentSymbolComparator, DocumentSymbolAccessibilityProvider, DocumentSymbolRenderer, DocumentSymbolFilter, DocumentSymbolGroupRenderer, DocumentSymbolIdentityProvider, DocumentSymbolNavigationLabelProvider, DocumentSymbolVirtualDelegate } from 'vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree'; import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; -import { OutlineGroup, OutlineElement, OutlineModel, TreeElement, IOutlineMarker, IOutlineModelService } from 'vs/editor/contrib/documentSymbols/outlineModel'; -import { DocumentSymbolProviderRegistry } from 'vs/editor/common/languages'; +import { OutlineGroup, OutlineElement, OutlineModel, TreeElement, IOutlineMarker, IOutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { raceCancellation, TimeoutTimer, timeout, Barrier } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -26,13 +25,14 @@ import { ScrollType } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; import { IEditorOptions, TextEditorSelectionRevealType } from 'vs/platform/editor/common/editor'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { IDataSource } from 'vs/base/browser/ui/tree/tree'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { localize } from 'vs/nls'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markerDecorations'; import { MarkerSeverity } from 'vs/platform/markers/common/markers'; import { isEqual } from 'vs/base/common/resources'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; type DocumentSymbolItem = OutlineGroup | OutlineElement; @@ -132,6 +132,7 @@ class DocumentSymbolsOutline implements IOutline { private readonly _editor: ICodeEditor, target: OutlineTarget, firstLoadBarrier: Barrier, + @ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService, @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, @IOutlineModelService private readonly _outlineModelService: IOutlineModelService, @IConfigurationService private readonly _configurationService: IConfigurationService, @@ -181,7 +182,7 @@ class DocumentSymbolsOutline implements IOutline { // update as language, model, providers changes - this._disposables.add(DocumentSymbolProviderRegistry.onDidChange(_ => this._createOutline())); + this._disposables.add(_languageFeaturesService.documentSymbolProvider.onDidChange(_ => this._createOutline())); this._disposables.add(this._editor.onDidChangeModel(_ => this._createOutline())); this._disposables.add(this._editor.onDidChangeModelLanguage(_ => this._createOutline())); @@ -212,6 +213,10 @@ class DocumentSymbolsOutline implements IOutline { return !this._outlineModel || TreeElement.empty(this._outlineModel); } + get uri() { + return this._outlineModel?.uri; + } + async reveal(entry: DocumentSymbolItem, options: IEditorOptions, sideBySide: boolean): Promise { const model = OutlineModel.get(entry); if (!model || !(entry instanceof OutlineElement)) { @@ -265,7 +270,7 @@ class DocumentSymbolsOutline implements IOutline { return; } const buffer = this._editor.getModel(); - if (!DocumentSymbolProviderRegistry.has(buffer)) { + if (!this._languageFeaturesService.documentSymbolProvider.has(buffer)) { return; } @@ -308,9 +313,6 @@ class DocumentSymbolsOutline implements IOutline { } } - // copy the model - model = model.adopt(); - // feature: show markers with outline element this._applyMarkersToOutline(model); this._outlineDisposables.add(this._markerDecorationsService.onDidChangeMarker(textModel => { diff --git a/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts b/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts index 6e37842b2a0..b87cfe3abf8 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./documentSymbolsTree'; -import 'vs/editor/contrib/symbolIcons/symbolIcons'; // The codicon symbol colors are defined here and must be loaded to get colors +import 'vs/editor/contrib/symbolIcons/browser/symbolIcons'; // The codicon symbol colors are defined here and must be loaded to get colors import * as dom from 'vs/base/browser/dom'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { IIdentityProvider, IKeyboardNavigationLabelProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; @@ -12,7 +12,7 @@ import { ITreeNode, ITreeRenderer, ITreeFilter } from 'vs/base/browser/ui/tree/t import { createMatches, FuzzyScore } from 'vs/base/common/filters'; import { Range } from 'vs/editor/common/core/range'; import { SymbolKind, SymbolKinds, SymbolTag } from 'vs/editor/common/languages'; -import { OutlineElement, OutlineGroup, OutlineModel } from 'vs/editor/contrib/documentSymbols/outlineModel'; +import { OutlineElement, OutlineGroup, OutlineModel } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; import { localize } from 'vs/nls'; import { IconLabel, IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -29,7 +29,7 @@ export type DocumentSymbolItem = OutlineGroup | OutlineElement; export class DocumentSymbolNavigationLabelProvider implements IKeyboardNavigationLabelProvider { - getKeyboardNavigationLabel(element: DocumentSymbolItem): { toString(): string; } { + getKeyboardNavigationLabel(element: DocumentSymbolItem): { toString(): string } { if (element instanceof OutlineGroup) { return element.label; } else { @@ -55,7 +55,7 @@ export class DocumentSymbolAccessibilityProvider implements IListAccessibilityPr } export class DocumentSymbolIdentityProvider implements IIdentityProvider { - getId(element: DocumentSymbolItem): { toString(): string; } { + getId(element: DocumentSymbolItem): { toString(): string } { return element.id; } } diff --git a/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess.ts b/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess.ts index 6a1c90985a8..cec3c9c01f8 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import { IKeyMods, IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IRange } from 'vs/editor/common/core/range'; -import { AbstractGotoLineQuickAccessProvider } from 'vs/editor/contrib/quickAccess/gotoLineQuickAccess'; +import { AbstractGotoLineQuickAccessProvider } from 'vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess'; import { Registry } from 'vs/platform/registry/common/platform'; import { IQuickAccessRegistry, Extensions as QuickaccesExtensions } from 'vs/platform/quickinput/common/quickAccess'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -16,7 +16,7 @@ import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/editorNavigationQuickAccess'; +import { IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -44,7 +44,7 @@ export class GotoLineQuickAccessProvider extends AbstractGotoLineQuickAccessProv return this.editorService.activeTextEditorControl; } - protected override gotoLocation(context: IQuickAccessTextEditorContext, options: { range: IRange, keyMods: IKeyMods, forceSideBySide?: boolean, preserveFocus?: boolean }): void { + protected override gotoLocation(context: IQuickAccessTextEditorContext, options: { range: IRange; keyMods: IKeyMods; forceSideBySide?: boolean; preserveFocus?: boolean }): void { // Check for sideBySide use if ((options.keyMods.alt || (this.configuration.openEditorPinned && options.keyMods.ctrlCmd) || options.forceSideBySide) && this.editorService.activeEditor) { diff --git a/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts b/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts index f834cf2b3f8..703b333927a 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess.ts @@ -10,7 +10,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IRange } from 'vs/editor/common/core/range'; import { Registry } from 'vs/platform/registry/common/platform'; import { IQuickAccessRegistry, Extensions as QuickaccessExtensions } from 'vs/platform/quickinput/common/quickAccess'; -import { AbstractGotoSymbolQuickAccessProvider, IGotoSymbolQuickPickItem } from 'vs/editor/contrib/quickAccess/gotoSymbolQuickAccess'; +import { AbstractGotoSymbolQuickAccessProvider, IGotoSymbolQuickPickItem } from 'vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkbenchEditorConfiguration } from 'vs/workbench/common/editor'; import { ITextModel } from 'vs/editor/common/model'; @@ -25,12 +25,13 @@ import { fuzzyScore, createMatches } from 'vs/base/common/filters'; import { onUnexpectedError } from 'vs/base/common/errors'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/editorNavigationQuickAccess'; +import { IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess'; import { IOutlineService, OutlineTarget } from 'vs/workbench/services/outline/browser/outline'; import { isCompositeEditor } from 'vs/editor/browser/editorBrowser'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/outlineModel'; +import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class GotoSymbolQuickAccessProvider extends AbstractGotoSymbolQuickAccessProvider { @@ -40,10 +41,11 @@ export class GotoSymbolQuickAccessProvider extends AbstractGotoSymbolQuickAccess @IEditorService private readonly editorService: IEditorService, @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @IConfigurationService private readonly configurationService: IConfigurationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, @IOutlineService private readonly outlineService: IOutlineService, @IOutlineModelService outlineModelService: IOutlineModelService, ) { - super(outlineModelService, { + super(languageFeaturesService, outlineModelService, { openSideBySideDirection: () => this.configuration.openSideBySideDirection }); } @@ -72,7 +74,7 @@ export class GotoSymbolQuickAccessProvider extends AbstractGotoSymbolQuickAccess return this.editorService.activeTextEditorControl; } - protected override gotoLocation(context: IQuickAccessTextEditorContext, options: { range: IRange, keyMods: IKeyMods, forceSideBySide?: boolean, preserveFocus?: boolean }): void { + protected override gotoLocation(context: IQuickAccessTextEditorContext, options: { range: IRange; keyMods: IKeyMods; forceSideBySide?: boolean; preserveFocus?: boolean }): void { // Check for sideBySide use if ((options.keyMods.alt || (this.configuration.openEditorPinned && options.keyMods.ctrlCmd) || options.forceSideBySide) && this.editorService.activeEditor) { diff --git a/src/vs/workbench/contrib/codeEditor/browser/saveParticipants.ts b/src/vs/workbench/contrib/codeEditor/browser/saveParticipants.ts index 044b1f3606b..b2aeea97c69 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/saveParticipants.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/saveParticipants.ts @@ -14,11 +14,11 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ITextModel } from 'vs/editor/common/model'; import { CodeActionTriggerType, CodeActionProvider } from 'vs/editor/common/languages'; -import { getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; -import { applyCodeAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/types'; -import { formatDocumentRangesWithSelectedProvider, formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/format'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { getCodeActions } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { applyCodeAction } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; +import { formatDocumentRangesWithSelectedProvider, formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/browser/format'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -31,6 +31,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { getModifiedRanges } from 'vs/workbench/contrib/format/browser/formatModified'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class TrimWhitespaceParticipant implements ITextFileSaveParticipant { @@ -41,7 +42,7 @@ export class TrimWhitespaceParticipant implements ITextFileSaveParticipant { // Nothing } - async participate(model: ITextFileEditorModel, env: { reason: SaveReason; }): Promise { + async participate(model: ITextFileEditorModel, env: { reason: SaveReason }): Promise { if (!model.textEditorModel) { return; } @@ -107,7 +108,7 @@ export class FinalNewLineParticipant implements ITextFileSaveParticipant { // Nothing } - async participate(model: ITextFileEditorModel, _env: { reason: SaveReason; }): Promise { + async participate(model: ITextFileEditorModel, _env: { reason: SaveReason }): Promise { if (!model.textEditorModel) { return; } @@ -145,7 +146,7 @@ export class TrimFinalNewLinesParticipant implements ITextFileSaveParticipant { // Nothing } - async participate(model: ITextFileEditorModel, env: { reason: SaveReason; }): Promise { + async participate(model: ITextFileEditorModel, env: { reason: SaveReason }): Promise { if (!model.textEditorModel) { return; } @@ -219,7 +220,7 @@ class FormatOnSaveParticipant implements ITextFileSaveParticipant { // Nothing } - async participate(model: ITextFileEditorModel, env: { reason: SaveReason; }, progress: IProgress, token: CancellationToken): Promise { + async participate(model: ITextFileEditorModel, env: { reason: SaveReason }, progress: IProgress, token: CancellationToken): Promise { if (!model.textEditorModel) { return; } @@ -230,7 +231,7 @@ class FormatOnSaveParticipant implements ITextFileSaveParticipant { const textEditorModel = model.textEditorModel; const overrides = { overrideIdentifier: textEditorModel.getLanguageId(), resource: textEditorModel.uri }; - const nestedProgress = new Progress<{ displayName?: string, extensionId?: ExtensionIdentifier }>(provider => { + const nestedProgress = new Progress<{ displayName?: string; extensionId?: ExtensionIdentifier }>(provider => { progress.report({ message: localize( { key: 'formatting2', comment: ['[configure]({1}) is a link. Only translate `configure`. Do not change brackets and parentheses or {1}'] }, @@ -271,9 +272,10 @@ class CodeActionOnSaveParticipant implements ITextFileSaveParticipant { constructor( @IConfigurationService private readonly configurationService: IConfigurationService, @IInstantiationService private readonly instantiationService: IInstantiationService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { } - async participate(model: ITextFileEditorModel, env: { reason: SaveReason; }, progress: IProgress, token: CancellationToken): Promise { + async participate(model: ITextFileEditorModel, env: { reason: SaveReason }, progress: IProgress, token: CancellationToken): Promise { if (!model.textEditorModel) { return; } @@ -373,7 +375,7 @@ class CodeActionOnSaveParticipant implements ITextFileSaveParticipant { } private getActionsToRun(model: ITextModel, codeActionKind: CodeActionKind, excludes: readonly CodeActionKind[], progress: IProgress, token: CancellationToken) { - return getCodeActions(model, model.getFullModelRange(), { + return getCodeActions(this.languageFeaturesService.codeActionProvider, model, model.getFullModelRange(), { type: CodeActionTriggerType.Auto, filter: { include: codeActionKind, excludes: excludes, includeSourceActions: true }, }, progress, token); diff --git a/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions.ts b/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions.ts index aabd7b36535..29d6921a6b0 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions.ts @@ -5,9 +5,9 @@ import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; -import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; import { TabCompletionController } from 'vs/workbench/contrib/snippets/browser/tabCompletion'; @@ -32,6 +32,8 @@ export function getSimpleEditorOptions(): IEditorOptions { renderLineHighlight: 'none', fixedOverflowWidgets: true, acceptSuggestionOnEnter: 'smart', + dragAndDrop: false, + revealHorizontalRightPadding: 5, minimap: { enabled: false }, diff --git a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts index 59b8dd18cef..138f276bff7 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts @@ -19,11 +19,11 @@ import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; -import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ColorIdentifier, editorSelectionBackground, inputBackground, inputBorder, inputForeground, inputPlaceholderForeground, selectionBackground } from 'vs/platform/theme/common/colorRegistry'; @@ -39,6 +39,7 @@ import { HistoryNavigator } from 'vs/base/common/history'; import { createAndBindHistoryNavigationWidgetScopedContextKeyService, IHistoryNavigationContext } from 'vs/platform/history/browser/contextScopedHistoryWidget'; import { IHistoryNavigationWidget } from 'vs/base/browser/history'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export interface SuggestResultsProvider { /** @@ -46,7 +47,7 @@ export interface SuggestResultsProvider { * * @param query the full text of the input. */ - provideResults: (query: string) => (Partial & ({ label: string }) | string)[]; + provideResults: (query: string) => (Partial & ({ label: string }) | string)[]; /** * Trigger characters for this input. Suggestions will appear when one of these is typed, @@ -125,6 +126,7 @@ export class SuggestEnabledInput extends Widget implements IThemable { @IInstantiationService defaultInstantiationService: IInstantiationService, @IModelService modelService: IModelService, @IContextKeyService contextKeyService: IContextKeyService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); @@ -195,9 +197,9 @@ export class SuggestEnabledInput extends Widget implements IThemable { this.setValue(options.value || ''); - this._register(modes.CompletionProviderRegistry.register({ scheme: scopeHandle.scheme, pattern: '**/' + scopeHandle.path, hasAccessToAllModels: true }, { + this._register(languageFeaturesService.completionProvider.register({ scheme: scopeHandle.scheme, pattern: '**/' + scopeHandle.path, hasAccessToAllModels: true }, { triggerCharacters: validatedSuggestProvider.triggerCharacters, - provideCompletionItems: (model: ITextModel, position: Position, _context: modes.CompletionContext) => { + provideCompletionItems: (model: ITextModel, position: Position, _context: languages.CompletionContext) => { let query = model.getValue(); const zeroIndexedColumn = position.column - 1; @@ -211,9 +213,9 @@ export class SuggestEnabledInput extends Widget implements IThemable { } return { - suggestions: suggestionProvider.provideResults(query).map((result): modes.CompletionItem => { + suggestions: suggestionProvider.provideResults(query).map((result): languages.CompletionItem => { let label: string; - let rest: Partial | undefined; + let rest: Partial | undefined; if (typeof result === 'string') { label = result; } else { @@ -226,7 +228,7 @@ export class SuggestEnabledInput extends Widget implements IThemable { insertText: label, range: Range.fromPositions(position.delta(0, -alreadyTypedCount), position), sortText: validatedSuggestProvider.sortKey(label), - kind: modes.CompletionItemKind.Keyword, + kind: languages.CompletionItemKind.Keyword, ...rest }; }) @@ -297,13 +299,13 @@ export class SuggestEnabledInput extends Widget implements IThemable { } export interface ISuggestEnabledHistoryOptions { - id: string, - ariaLabel: string, - parent: HTMLElement, - suggestionProvider: SuggestResultsProvider, - resourceHandle: string, - suggestOptions: SuggestEnabledInputOptions, - history: string[], + id: string; + ariaLabel: string; + parent: HTMLElement; + suggestionProvider: SuggestResultsProvider; + resourceHandle: string; + suggestOptions: SuggestEnabledInputOptions; + history: string[]; } export class SuggestEnabledInputWithHistory extends SuggestEnabledInput implements IHistoryNavigationWidget { @@ -314,8 +316,9 @@ export class SuggestEnabledInputWithHistory extends SuggestEnabledInput implemen @IInstantiationService instantiationService: IInstantiationService, @IModelService modelService: IModelService, @IContextKeyService contextKeyService: IContextKeyService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { - super(id, parent, suggestionProvider, ariaLabel, resourceHandle, suggestOptions, instantiationService, modelService, contextKeyService); + super(id, parent, suggestionProvider, ariaLabel, resourceHandle, suggestOptions, instantiationService, modelService, contextKeyService, languageFeaturesService); this.history = new HistoryNavigator(history, 100); } @@ -391,8 +394,9 @@ export class ContextScopedSuggestEnabledInputWithHistory extends SuggestEnabledI @IInstantiationService instantiationService: IInstantiationService, @IModelService modelService: IModelService, @IContextKeyService contextKeyService: IContextKeyService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { - super(options, instantiationService, modelService, contextKeyService); + super(options, instantiationService, modelService, contextKeyService, languageFeaturesService); const { historyNavigationBackwardsEnablement, historyNavigationForwardsEnablement } = this.historyContext; this._register(this.inputWidget.onDidChangeCursorPosition(({ position }) => { diff --git a/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection.ts b/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection.ts index d448b27ecd1..e0ad88ffb76 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection.ts @@ -10,7 +10,7 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch.ts b/src/vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch.ts index 43694ac1cc0..f338f336250 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch.ts @@ -6,7 +6,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { ReferencesController } from 'vs/editor/contrib/gotoSymbol/peek/referencesController'; +import { ReferencesController } from 'vs/editor/contrib/gotoSymbol/browser/peek/referencesController'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard.ts index 4441bbf6157..7e1393bfc9e 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard.ts @@ -10,7 +10,7 @@ import * as platform from 'vs/base/common/platform'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution, EditorAction, ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions'; import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; -import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution, Handler } from 'vs/editor/common/editorCommon'; import { EndOfLinePreference } from 'vs/editor/common/model'; @@ -97,7 +97,7 @@ class SelectionClipboardPastePreventer implements IWorkbenchContribution { document.addEventListener('mouseup', (e) => { if (e.button === 1) { // middle button - const config = configurationService.getValue<{ selectionClipboard: boolean; }>('editor'); + const config = configurationService.getValue<{ selectionClipboard: boolean }>('editor'); if (!config.selectionClipboard) { // selection clipboard is disabled // try to stop the upcoming paste diff --git a/src/vs/workbench/contrib/comments/browser/commentNode.ts b/src/vs/workbench/contrib/comments/browser/commentNode.ts index bae1f3ed23f..539541adc86 100644 --- a/src/vs/workbench/contrib/comments/browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/browser/commentNode.ts @@ -5,15 +5,15 @@ import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { Action, IActionRunner, IAction, Separator } from 'vs/base/common/actions'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; 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'; @@ -38,11 +38,12 @@ import { Codicon } from 'vs/base/common/codicons'; import { MarshalledId } from 'vs/base/common/marshalling'; import { TimestampWidget } from 'vs/workbench/contrib/comments/browser/timestamp'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; export class CommentNode extends Disposable { private _domNode: HTMLElement; private _body: HTMLElement; - private _md: HTMLElement; + private _md: HTMLElement | undefined; private _clearTimeout: any; private _editAction: Action | null = null; @@ -55,8 +56,8 @@ export class CommentNode extends Disposable { private _commentEditorDisposables: IDisposable[] = []; private _commentEditorModel: ITextModel | null = null; private _isPendingLabel!: HTMLElement; - private _detail: HTMLElement | undefined; - private _timestamp: TimestampWidget | undefined; + private _timestamp: HTMLElement | undefined; + private _timestampWidget: TimestampWidget | undefined; private _contextKeyService: IContextKeyService; private _commentContextValue: IContextKey; @@ -73,8 +74,8 @@ export class CommentNode extends Disposable { public isEditing: boolean = false; constructor( - private commentThread: modes.CommentThread, - public comment: modes.Comment, + private commentThread: languages.CommentThread, + public comment: languages.Comment, private owner: string, private resource: URI, private parentEditor: ICodeEditor, @@ -108,47 +109,53 @@ export class CommentNode extends Disposable { this.createHeader(this._commentDetailsContainer); this._body = dom.append(this._commentDetailsContainer, dom.$(`div.comment-body.${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`)); - this._md = this.markdownRenderer.render(comment.body).element; - this._body.appendChild(this._md); + this.updateCommentBody(this.comment.body); if (this.comment.commentReactions && this.comment.commentReactions.length && this.comment.commentReactions.filter(reaction => !!reaction.count).length) { this.createReactionsContainer(this._commentDetailsContainer); } - this._domNode.setAttribute('aria-label', `${comment.userName}, ${comment.body.value}`); + this._domNode.setAttribute('aria-label', `${comment.userName}, ${this.commentBodyValue}`); this._domNode.setAttribute('role', 'treeitem'); this._clearTimeout = null; this._register(dom.addDisposableListener(this._domNode, dom.EventType.CLICK, () => this.isEditing || this._onDidClick.fire(this))); } + private updateCommentBody(body: string | IMarkdownString) { + this._body.innerText = ''; + this._md = undefined; + if (typeof body === 'string') { + this._body.innerText = body; + } else { + this._md = this.markdownRenderer.render(body).element; + this._body.appendChild(this._md); + } + } + public get onDidClick(): Event { return this._onDidClick.event; } - private createDetail(container: HTMLElement) { - this._detail = dom.append(container, dom.$('span.detail')); - this.updateDetail(this.comment.detail); + private createTimestamp(container: HTMLElement) { + this._timestamp = dom.append(container, dom.$('span.timestamp-container')); + this.updateTimestamp(this.comment.timestamp); } - private updateDetail(detail?: Date | string) { - if (!this._detail) { + private updateTimestamp(raw?: string) { + if (!this._timestamp) { return; } - if (!detail) { - this._timestamp?.dispose(); - this._detail.innerText = ''; - } else if (typeof detail === 'string') { - this._timestamp?.dispose(); - this._detail.innerText = detail; + const timestamp = raw !== undefined ? new Date(raw) : undefined; + if (!timestamp) { + this._timestampWidget?.dispose(); } else { - this._detail.innerText = ''; - if (!this._timestamp) { - this._timestamp = new TimestampWidget(this.configurationService, this._detail, detail); - this._register(this._timestamp); + if (!this._timestampWidget) { + this._timestampWidget = new TimestampWidget(this.configurationService, this._timestamp, timestamp); + this._register(this._timestampWidget); } else { - this._timestamp.setTimestamp(detail); + this._timestampWidget.setTimestamp(timestamp); } } } @@ -157,7 +164,7 @@ export class CommentNode extends Disposable { const header = dom.append(commentDetailsContainer, dom.$(`div.comment-title.${MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`)); const author = dom.append(header, dom.$('strong.author')); author.innerText = this.comment.userName; - this.createDetail(header); + this.createTimestamp(header); this._isPendingLabel = dom.append(header, dom.$('span.isPending')); if (this.comment.label) { @@ -170,7 +177,7 @@ export class CommentNode extends Disposable { this.createActionsToolbar(); } - private getToolbarActions(menu: IMenu): { primary: IAction[], secondary: IAction[] } { + private getToolbarActions(menu: IMenu): { primary: IAction[]; secondary: IAction[] } { const contributedActions = menu.getActions({ shouldForwardArgs: true }); const primary: IAction[] = []; const secondary: IAction[] = []; @@ -262,7 +269,7 @@ export class CommentNode extends Disposable { } } - private createReactionPicker(reactionGroup: modes.CommentReaction[]): ToggleReactionsAction { + private createReactionPicker(reactionGroup: languages.CommentReaction[]): ToggleReactionsAction { let toggleReactionActionViewItem: DropdownMenuActionViewItem; let toggleReactionAction = this._register(new ToggleReactionsAction(() => { if (toggleReactionActionViewItem) { @@ -362,6 +369,10 @@ export class CommentNode extends Disposable { } } + get commentBodyValue(): string { + return (typeof this.comment.body === 'string') ? this.comment.body : this.comment.body.value; + } + private createCommentEditor(editContainer: HTMLElement): void { const container = dom.append(editContainer, dom.$('.edit-textarea')); this._commentEditor = this.instantiationService.createInstance(SimpleCommentEditor, container, SimpleCommentEditor.getEditorOptions(), this.parentEditor, this.parentThread); @@ -369,7 +380,7 @@ export class CommentNode extends Disposable { this._commentEditorModel = this.modelService.createModel('', this.languageService.createByFilepathOrFirstLine(resource), resource, false); this._commentEditor.setModel(this._commentEditorModel); - this._commentEditor.setValue(this.comment.body.value); + this._commentEditor.setValue(this.commentBodyValue); this._commentEditor.layout({ width: container.clientWidth - 14, height: 90 }); this._commentEditor.focus(); @@ -385,14 +396,14 @@ export class CommentNode extends Disposable { let commentThread = this.commentThread; commentThread.input = { uri: this._commentEditor.getModel()!.uri, - value: this.comment.body.value + value: this.commentBodyValue }; this.commentService.setActiveCommentThread(commentThread); this._commentEditorDisposables.push(this._commentEditor.onDidFocusEditorWidget(() => { commentThread.input = { uri: this._commentEditor!.getModel()!.uri, - value: this.comment.body.value + value: this.commentBodyValue }; this.commentService.setActiveCommentThread(commentThread); })); @@ -481,7 +492,7 @@ export class CommentNode extends Disposable { this._actionsToolbarContainer.classList.remove('hidden'); this._actionsToolbarContainer.classList.add('tabfocused'); this._domNode.tabIndex = 0; - if (this.comment.mode === modes.CommentMode.Editing) { + if (this.comment.mode === languages.CommentMode.Editing) { this._commentEditor?.focus(); } } else { @@ -506,16 +517,14 @@ export class CommentNode extends Disposable { })); } - update(newComment: modes.Comment) { + update(newComment: languages.Comment) { if (newComment.body !== this.comment.body) { - this._body.removeChild(this._md); - this._md = this.markdownRenderer.render(newComment.body).element; - this._body.appendChild(this._md); + this.updateCommentBody(newComment.body); } if (newComment.mode !== undefined && newComment.mode !== this.comment.mode) { - if (newComment.mode === modes.CommentMode.Editing) { + if (newComment.mode === languages.CommentMode.Editing) { this.switchToEditMode(); } else { this.removeCommentEditor(); @@ -549,8 +558,8 @@ export class CommentNode extends Disposable { this._commentContextValue.reset(); } - if (this.comment.detail) { - this.updateDetail(this.comment.detail); + if (this.comment.timestamp) { + this.updateTimestamp(this.comment.timestamp); } } @@ -565,7 +574,7 @@ export class CommentNode extends Disposable { } } -function fillInActions(groups: [string, Array][], target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, useAlternativeActions: boolean, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void { +function fillInActions(groups: [string, Array][], target: IAction[] | { primary: IAction[]; secondary: IAction[] }, useAlternativeActions: boolean, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void { for (let tuple of groups) { let [group, actions] = tuple; if (useAlternativeActions) { diff --git a/src/vs/workbench/contrib/comments/browser/commentService.ts b/src/vs/workbench/contrib/comments/browser/commentService.ts index 3fdbfab97dd..a4ce66f7391 100644 --- a/src/vs/workbench/contrib/comments/browser/commentService.ts +++ b/src/vs/workbench/contrib/comments/browser/commentService.ts @@ -3,15 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CommentThreadChangedEvent, CommentInfo, Comment, CommentReaction, CommentingRanges, CommentThread } from 'vs/editor/common/languages'; +import { CommentThreadChangedEvent, CommentInfo, Comment, CommentReaction, CommentingRanges, CommentThread, CommentOptions } from 'vs/editor/common/languages'; import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Event, Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { URI } from 'vs/base/common/uri'; +import { URI, UriComponents } from 'vs/base/common/uri'; import { Range, IRange } from 'vs/editor/common/core/range'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ICommentThreadChangedEvent } from 'vs/workbench/contrib/comments/common/commentModel'; -import { MainThreadCommentController } from 'vs/workbench/api/browser/mainThreadComments'; import { CommentMenus } from 'vs/workbench/contrib/comments/browser/commentMenus'; export const ICommentService = createDecorator('commentService'); @@ -31,22 +30,39 @@ export interface IWorkspaceCommentThreadsEvent { commentThreads: CommentThread[]; } +export interface ICommentController { + id: string; + features: { + reactionGroup?: CommentReaction[]; + reactionHandler?: boolean; + options?: CommentOptions; + }; + options?: CommentOptions; + contextValue?: string; + createCommentThreadTemplate(resource: UriComponents, range: IRange): void; + updateCommentThreadTemplate(threadHandle: number, range: IRange): Promise; + deleteCommentThreadMain(commentThreadId: string): void; + toggleReaction(uri: URI, thread: CommentThread, comment: Comment, reaction: CommentReaction, token: CancellationToken): Promise; + getDocumentComments(resource: URI, token: CancellationToken): Promise; + getCommentingRanges(resource: URI, token: CancellationToken): Promise; +} + export interface ICommentService { readonly _serviceBrand: undefined; readonly onDidSetResourceCommentInfos: Event; readonly onDidSetAllCommentThreads: Event; readonly onDidUpdateCommentThreads: Event; readonly onDidChangeActiveCommentThread: Event; - readonly onDidUpdateCommentingRanges: Event<{ owner: string; }> - readonly onDidChangeActiveCommentingRange: Event<{ range: Range, commentingRangesInfo: CommentingRanges }>; + readonly onDidUpdateCommentingRanges: Event<{ owner: string }>; + readonly onDidChangeActiveCommentingRange: Event<{ range: Range; commentingRangesInfo: CommentingRanges }>; readonly onDidSetDataProvider: Event; readonly onDidDeleteDataProvider: Event; setDocumentComments(resource: URI, commentInfos: ICommentInfo[]): void; setWorkspaceComments(owner: string, commentsByResource: CommentThread[]): void; removeWorkspaceComments(owner: string): void; - registerCommentController(owner: string, commentControl: MainThreadCommentController): void; + registerCommentController(owner: string, commentControl: ICommentController): void; unregisterCommentController(owner: string): void; - getCommentController(owner: string): MainThreadCommentController | undefined; + getCommentController(owner: string): ICommentController | undefined; createCommentThreadTemplate(owner: string, resource: URI, range: Range): void; updateCommentThreadTemplate(owner: string, threadHandle: number, range: Range): Promise; getCommentMenus(owner: string): CommentMenus; @@ -78,22 +94,22 @@ export class CommentService extends Disposable implements ICommentService { private readonly _onDidUpdateCommentThreads: Emitter = this._register(new Emitter()); readonly onDidUpdateCommentThreads: Event = this._onDidUpdateCommentThreads.event; - private readonly _onDidUpdateCommentingRanges: Emitter<{ owner: string; }> = this._register(new Emitter<{ owner: string; }>()); - readonly onDidUpdateCommentingRanges: Event<{ owner: string; }> = this._onDidUpdateCommentingRanges.event; + private readonly _onDidUpdateCommentingRanges: Emitter<{ owner: string }> = this._register(new Emitter<{ owner: string }>()); + readonly onDidUpdateCommentingRanges: Event<{ owner: string }> = this._onDidUpdateCommentingRanges.event; private readonly _onDidChangeActiveCommentThread = this._register(new Emitter()); readonly onDidChangeActiveCommentThread = this._onDidChangeActiveCommentThread.event; private readonly _onDidChangeActiveCommentingRange: Emitter<{ - range: Range, commentingRangesInfo: - CommentingRanges + range: Range; commentingRangesInfo: + CommentingRanges; }> = this._register(new Emitter<{ - range: Range, commentingRangesInfo: - CommentingRanges + range: Range; commentingRangesInfo: + CommentingRanges; }>()); - readonly onDidChangeActiveCommentingRange: Event<{ range: Range, commentingRangesInfo: CommentingRanges }> = this._onDidChangeActiveCommentingRange.event; + readonly onDidChangeActiveCommentingRange: Event<{ range: Range; commentingRangesInfo: CommentingRanges }> = this._onDidChangeActiveCommentingRange.event; - private _commentControls = new Map(); + private _commentControls = new Map(); private _commentMenus = new Map(); constructor( @@ -118,7 +134,7 @@ export class CommentService extends Disposable implements ICommentService { this._onDidSetAllCommentThreads.fire({ ownerId: owner, commentThreads: [] }); } - registerCommentController(owner: string, commentControl: MainThreadCommentController): void { + registerCommentController(owner: string, commentControl: ICommentController): void { this._commentControls.set(owner, commentControl); this._onDidSetDataProvider.fire(); } @@ -128,7 +144,7 @@ export class CommentService extends Disposable implements ICommentService { this._onDidDeleteDataProvider.fire(owner); } - getCommentController(owner: string): MainThreadCommentController | undefined { + getCommentController(owner: string): ICommentController | undefined { return this._commentControls.get(owner); } diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts index 9247d145ca0..86c559f36ad 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts @@ -17,12 +17,12 @@ import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/brows import { IPosition } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; -import { peekViewBorder } from 'vs/editor/contrib/peekView/peekView'; -import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; +import { peekViewBorder } from 'vs/editor/contrib/peekView/browser/peekView'; +import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/browser/zoneWidget'; import * as nls from 'vs/nls'; import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenu, MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/actions'; @@ -142,7 +142,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget public get owner(): string { return this._owner; } - public get commentThread(): modes.CommentThread { + public get commentThread(): languages.CommentThread { return this._commentThread; } @@ -152,12 +152,12 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget private _commentMenus: CommentMenus; - private _commentOptions: modes.CommentOptions | undefined; + private _commentOptions: languages.CommentOptions | undefined; constructor( editor: ICodeEditor, private _owner: string, - private _commentThread: modes.CommentThread, + private _commentThread: languages.CommentThread, private _pendingComment: string | null, @IInstantiationService private instantiationService: IInstantiationService, @ILanguageService private languageService: ILanguageService, @@ -188,7 +188,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget } this._resizeObserver = null; - this._isExpanded = _commentThread.collapsibleState === modes.CommentThreadCollapsibleState.Expanded; + this._isExpanded = _commentThread.collapsibleState === languages.CommentThreadCollapsibleState.Expanded; this._commentThreadDisposables = []; this._submitActionsDisposables = []; this._formActions = null; @@ -315,7 +315,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget } public collapse(): Promise { - this._commentThread.collapsibleState = modes.CommentThreadCollapsibleState.Collapsed; + this._commentThread.collapsibleState = languages.CommentThreadCollapsibleState.Collapsed; if (this._commentThread.comments && this._commentThread.comments.length === 0) { this.deleteCommentThread(); return Promise.resolve(); @@ -334,18 +334,18 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget toggleExpand(lineNumber: number) { if (this._isExpanded) { - this._commentThread.collapsibleState = modes.CommentThreadCollapsibleState.Collapsed; + this._commentThread.collapsibleState = languages.CommentThreadCollapsibleState.Collapsed; this.hide(); if (!this._commentThread.comments || !this._commentThread.comments.length) { this.deleteCommentThread(); } } else { - this._commentThread.collapsibleState = modes.CommentThreadCollapsibleState.Expanded; + this._commentThread.collapsibleState = languages.CommentThreadCollapsibleState.Expanded; this.show({ lineNumber: lineNumber, column: 1 }, 2); } } - async update(commentThread: modes.CommentThread) { + async update(commentThread: languages.CommentThread) { const oldCommentsLen = this._commentElements.length; const newCommentsLen = commentThread.comments ? commentThread.comments.length : 0; this._threadIsEmpty.set(!newCommentsLen); @@ -391,7 +391,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget lastCommentElement = newElement.domNode; } - if (currentComment.mode === modes.CommentMode.Editing) { + if (currentComment.mode === languages.CommentMode.Editing) { newElement.switchToEditMode(); newCommentsInEditMode.push(newElement); } @@ -424,7 +424,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this.show({ lineNumber, column: 1 }, 2); } - if (this._commentThread.collapsibleState === modes.CommentThreadCollapsibleState.Expanded) { + if (this._commentThread.collapsibleState === languages.CommentThreadCollapsibleState.Expanded) { this.show({ lineNumber, column: 1 }, 2); } else { this.hide(); @@ -487,7 +487,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this._commentElements.push(newCommentNode); this._commentsElement.appendChild(newCommentNode.domNode); - if (comment.mode === modes.CommentMode.Editing) { + if (comment.mode === languages.CommentMode.Editing) { newCommentNode.switchToEditMode(); } } @@ -507,7 +507,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget subtree: true }); - if (this._commentThread.collapsibleState === modes.CommentThreadCollapsibleState.Expanded) { + if (this._commentThread.collapsibleState === languages.CommentThreadCollapsibleState.Expanded) { this.show({ lineNumber: lineNumber, column: 1 }, 2); } @@ -601,7 +601,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this._commentThreadDisposables.push(commentEditor.getModel()!.onDidChangeContent(() => { let modelContent = commentEditor.getValue(); if (this._commentThread.input && this._commentThread.input.uri === commentEditor.getModel()!.uri && this._commentThread.input.value !== modelContent) { - let newInput: modes.CommentInput = this._commentThread.input; + let newInput: languages.CommentInput = this._commentThread.input; newInput.value = modelContent; this._commentThread.input = newInput; } @@ -658,14 +658,14 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget })); this._commentThreadDisposables.push(this._commentThread.onDidChangeCollasibleState(state => { - if (state === modes.CommentThreadCollapsibleState.Expanded && !this._isExpanded) { + if (state === languages.CommentThreadCollapsibleState.Expanded && !this._isExpanded) { const lineNumber = this._commentThread.range.startLineNumber; this.show({ lineNumber, column: 1 }, 2); return; } - if (state === modes.CommentThreadCollapsibleState.Collapsed && this._isExpanded) { + if (state === languages.CommentThreadCollapsibleState.Collapsed && this._isExpanded) { this.hide(); return; } @@ -722,7 +722,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this._commentFormActions.setActions(menu); } - private createNewCommentNode(comment: modes.Comment): CommentNode { + private createNewCommentNode(comment: languages.Comment): CommentNode { let newCommentNode = this._scopedInstatiationService.createInstance(CommentNode, this._commentThread, comment, diff --git a/src/vs/workbench/contrib/comments/browser/commentsEditorContribution.ts b/src/vs/workbench/contrib/comments/browser/commentsEditorContribution.ts index 0d7091625b0..e8abd1ef104 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsEditorContribution.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsEditorContribution.ts @@ -18,8 +18,8 @@ import { IRange, Range } from 'vs/editor/common/core/range'; import { IEditorContribution, IModelChangedEvent } from 'vs/editor/common/editorCommon'; import { IModelDecorationOptions } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import * as modes from 'vs/editor/common/languages'; -import { peekViewResultsBackground, peekViewResultsSelectionBackground, peekViewTitleBackground } from 'vs/editor/contrib/peekView/peekView'; +import * as languages from 'vs/editor/common/languages'; +import { peekViewResultsBackground, peekViewResultsSelectionBackground, peekViewTitleBackground } from 'vs/editor/contrib/peekView/browser/peekView'; import * as nls from 'vs/nls'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; @@ -63,7 +63,7 @@ class CommentingRangeDecoration { return this._decorationId; } - constructor(private _editor: ICodeEditor, private _ownerId: string, private _extensionId: string | undefined, private _label: string | undefined, private _range: IRange, commentingOptions: ModelDecorationOptions, private commentingRangesInfo: modes.CommentingRanges) { + constructor(private _editor: ICodeEditor, private _ownerId: string, private _extensionId: string | undefined, private _label: string | undefined, private _range: IRange, commentingOptions: ModelDecorationOptions, private commentingRangesInfo: languages.CommentingRanges) { const startLineNumber = _range.startLineNumber; const endLineNumber = _range.endLineNumber; let commentingRangeDecorations = [{ @@ -77,7 +77,7 @@ class CommentingRangeDecoration { this._decorationId = this._editor.deltaDecorations([], commentingRangeDecorations)[0]; } - public getCommentAction(): { ownerId: string, extensionId: string | undefined, label: string | undefined, commentingRangesInfo: modes.CommentingRanges } { + public getCommentAction(): { ownerId: string; extensionId: string | undefined; label: string | undefined; commentingRangesInfo: languages.CommentingRanges } { return { extensionId: this._extensionId, label: this._label, @@ -402,7 +402,7 @@ export class CommentController implements IEditorContribution { this.beginCompute(); } - private displayCommentThread(owner: string, thread: modes.CommentThread, pendingComment: string | null): void { + private displayCommentThread(owner: string, thread: languages.CommentThread, pendingComment: string | null): void { const zoneWidget = this.instantiationService.createInstance(ReviewZoneWidget, this.editor, owner, thread, pendingComment); zoneWidget.display(thread.range.startLineNumber); this._commentWidgets.push(zoneWidget); @@ -496,7 +496,7 @@ export class CommentController implements IEditorContribution { return Promise.resolve(); } - private getCommentProvidersQuickPicks(commentInfos: { ownerId: string, extensionId: string | undefined, label: string | undefined, commentingRangesInfo: modes.CommentingRanges | undefined }[]) { + private getCommentProvidersQuickPicks(commentInfos: { ownerId: string; extensionId: string | undefined; label: string | undefined; commentingRangesInfo: languages.CommentingRanges | undefined }[]) { const picks: QuickPickInput[] = commentInfos.map((commentInfo) => { const { ownerId, extensionId, label } = commentInfo; @@ -509,7 +509,7 @@ export class CommentController implements IEditorContribution { return picks; } - private getContextMenuActions(commentInfos: { ownerId: string, extensionId: string | undefined, label: string | undefined, commentingRangesInfo: modes.CommentingRanges }[], lineNumber: number): IAction[] { + private getContextMenuActions(commentInfos: { ownerId: string; extensionId: string | undefined; label: string | undefined; commentingRangesInfo: languages.CommentingRanges }[], lineNumber: number): IAction[] { const actions: IAction[] = []; commentInfos.forEach(commentInfo => { @@ -587,7 +587,7 @@ export class CommentController implements IEditorContribution { } if (pendingComment) { - thread.collapsibleState = modes.CommentThreadCollapsibleState.Expanded; + thread.collapsibleState = languages.CommentThreadCollapsibleState.Expanded; } this.displayCommentThread(info.owner, thread, pendingComment); diff --git a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts index 77336343b88..473b6f842ca 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts @@ -121,29 +121,34 @@ export class CommentNodeRenderer implements IListRenderer renderElement(node: ITreeNode, index: number, templateData: ICommentThreadTemplateData, height: number | undefined): void { templateData.userName.textContent = node.element.comment.userName; templateData.commentText.innerText = ''; - const disposables = new DisposableStore(); - templateData.disposables.push(disposables); - const renderedComment = renderMarkdown(node.element.comment.body, { - inline: true, - actionHandler: { - callback: (content) => { - this.openerService.open(content, { allowCommands: node.element.comment.body.isTrusted }).catch(onUnexpectedError); - }, - disposables: disposables + if (typeof node.element.comment.body === 'string') { + templateData.commentText.innerText = node.element.comment.body; + } else { + const commentBody = node.element.comment.body; + const disposables = new DisposableStore(); + templateData.disposables.push(disposables); + const renderedComment = renderMarkdown(commentBody, { + inline: true, + actionHandler: { + callback: (content) => { + this.openerService.open(content, { allowCommands: commentBody.isTrusted }).catch(onUnexpectedError); + }, + disposables: disposables + } + }); + templateData.disposables.push(renderedComment); + + const images = renderedComment.element.getElementsByTagName('img'); + for (let i = 0; i < images.length; i++) { + const image = images[i]; + const textDescription = dom.$(''); + textDescription.textContent = image.alt ? nls.localize('imageWithLabel', "Image: {0}", image.alt) : nls.localize('image', "Image"); + image.parentNode!.replaceChild(textDescription, image); } - }); - templateData.disposables.push(renderedComment); - const images = renderedComment.element.getElementsByTagName('img'); - for (let i = 0; i < images.length; i++) { - const image = images[i]; - const textDescription = dom.$(''); - textDescription.textContent = image.alt ? nls.localize('imageWithLabel', "Image: {0}", image.alt) : nls.localize('image', "Image"); - image.parentNode!.replaceChild(textDescription, image); + templateData.commentText.appendChild(renderedComment.element); + templateData.commentText.title = renderedComment.element.textContent ?? ''; } - - templateData.commentText.appendChild(renderedComment.element); - templateData.commentText.title = renderedComment.element.textContent ?? ''; } disposeTemplate(templateData: ICommentThreadTemplateData): void { diff --git a/src/vs/workbench/contrib/comments/browser/commentsView.ts b/src/vs/workbench/contrib/comments/browser/commentsView.ts index df677b00713..9e582d4a057 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsView.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsView.ts @@ -183,7 +183,7 @@ export class CommentsPanel extends ViewPane { element.range.startLineNumber, element.range.startColumn, basename(element.resource), - element.comment.body.value + (typeof element.comment.body === 'string') ? element.comment.body : element.comment.body.value ); } return ''; diff --git a/src/vs/workbench/contrib/comments/browser/simpleCommentEditor.ts b/src/vs/workbench/contrib/comments/browser/simpleCommentEditor.ts index 7a7f85df84a..98ea69aa939 100644 --- a/src/vs/workbench/contrib/comments/browser/simpleCommentEditor.ts +++ b/src/vs/workbench/contrib/comments/browser/simpleCommentEditor.ts @@ -13,9 +13,9 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; // Allowed Editor Contributions: import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; -import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { TabCompletionController } from 'vs/workbench/contrib/snippets/browser/tabCompletion'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -24,6 +24,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICommentThreadWidget } from 'vs/workbench/contrib/comments/common/commentThreadWidget'; import { CommentContextKeys } from 'vs/workbench/contrib/comments/common/commentContextKeys'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export const ctxCommentEditorFocused = new RawContextKey('commentEditorFocused', false); @@ -46,7 +47,8 @@ export class SimpleCommentEditor extends CodeEditorWidget { @IThemeService themeService: IThemeService, @INotificationService notificationService: INotificationService, @IAccessibilityService accessibilityService: IAccessibilityService, - @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService + @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { const codeEditorWidgetOptions: ICodeEditorWidgetOptions = { isSimpleWidget: true, @@ -59,7 +61,7 @@ export class SimpleCommentEditor extends CodeEditorWidget { ] }; - super(domElement, options, codeEditorWidgetOptions, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService); + super(domElement, options, codeEditorWidgetOptions, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService, accessibilityService, languageConfigurationService, languageFeaturesService); this._commentEditorFocused = ctxCommentEditorFocused.bindTo(contextKeyService); this._commentEditorEmpty = CommentContextKeys.commentIsEmpty.bindTo(contextKeyService); diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts index 1feb70a01bd..f6fe05027fa 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts @@ -32,7 +32,7 @@ export class CustomEditorInput extends LazilyResolvedWebviewEditorInput { resource: URI, viewType: string, group: GroupIdentifier | undefined, - options?: { readonly customClasses?: string, readonly oldResource?: URI }, + options?: { readonly customClasses?: string; readonly oldResource?: URI }, ): EditorInput { return instantiationService.invokeFunction(accessor => { // If it's an untitled file we must populate the untitledDocumentData @@ -67,7 +67,7 @@ export class CustomEditorInput extends LazilyResolvedWebviewEditorInput { viewType: string, id: string, webview: IOverlayWebview, - options: { startsDirty?: boolean, backupId?: string, untitledDocumentData?: VSBuffer, readonly oldResource?: URI }, + options: { startsDirty?: boolean; backupId?: string; untitledDocumentData?: VSBuffer; readonly oldResource?: URI }, @IWebviewWorkbenchService webviewWorkbenchService: IWebviewWorkbenchService, @IInstantiationService private readonly instantiationService: IInstantiationService, @ILabelService private readonly labelService: ILabelService, diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts b/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts index 126cc09d23c..3304e1334a0 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts @@ -107,7 +107,7 @@ export class CustomEditorInputSerializer extends WebviewEditorInputSerializer { } } -function reviveWebview(webviewService: IWebviewService, data: { id: string, state: any, webviewOptions: WebviewOptions, contentOptions: WebviewContentOptions, extension?: WebviewExtensionDescription, }) { +function reviveWebview(webviewService: IWebviewService, data: { id: string; state: any; webviewOptions: WebviewOptions; contentOptions: WebviewContentOptions; extension?: WebviewExtensionDescription }) { const webview = webviewService.createWebviewOverlay(data.id, { purpose: WebviewContentPurpose.CustomEditor, enableFindWidget: data.webviewOptions.enableFindWidget, diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts index 0a869fa4edc..9861c11998f 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts @@ -5,7 +5,7 @@ import { coalesce } from 'vs/base/common/arrays'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { extname, isEqual } from 'vs/base/common/resources'; import { assertIsDefined } from 'vs/base/common/types'; @@ -19,15 +19,15 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IStorageService } from 'vs/platform/storage/common/storage'; import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { DEFAULT_EDITOR_ASSOCIATION, EditorExtensions, GroupIdentifier, IEditorFactoryRegistry, IResourceDiffEditorInput } from 'vs/workbench/common/editor'; -import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; +import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { CONTEXT_ACTIVE_CUSTOM_EDITOR_ID, CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE, CustomEditorCapabilities, CustomEditorInfo, CustomEditorInfoCollection, ICustomEditorService } from 'vs/workbench/contrib/customEditor/common/customEditor'; import { CustomEditorModelManager } from 'vs/workbench/contrib/customEditor/common/customEditorModelManager'; import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorResolverService, IEditorType, RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { ContributedCustomEditors } from '../common/contributedCustomEditors'; import { CustomEditorInput } from './customEditorInput'; @@ -36,7 +36,7 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ private readonly _contributedEditors: ContributedCustomEditors; private _untitledCounter = 0; - private readonly _editorResolverDisposables: IDisposable[] = []; + private readonly _editorResolverDisposables = this._register(new DisposableStore()); private readonly _editorCapabilities = new Map(); private readonly _models = new CustomEditorModelManager(); @@ -109,13 +109,14 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ private registerContributionPoints(): void { // Clear all previous contributions we know - this._editorResolverDisposables.forEach(d => d.dispose()); + this._editorResolverDisposables.clear(); + for (const contributedEditor of this._contributedEditors) { for (const globPattern of contributedEditor.selector) { if (!globPattern.filenamePattern) { continue; } - this._editorResolverDisposables.push(this._register(this.editorResolverService.registerEditor( + this._editorResolverDisposables.add(this.editorResolverService.registerEditor( globPattern.filenamePattern, { id: contributedEditor.id, @@ -135,7 +136,7 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ (diffEditorInput, group) => { return { editor: this.createDiffEditorInput(diffEditorInput, contributedEditor.id, group) }; } - ))); + )); } } } diff --git a/src/vs/workbench/contrib/customEditor/common/customEditor.ts b/src/vs/workbench/contrib/customEditor/common/customEditor.ts index 18cbdd958ca..aab705ab761 100644 --- a/src/vs/workbench/contrib/customEditor/common/customEditor.ts +++ b/src/vs/workbench/contrib/customEditor/common/customEditor.ts @@ -37,11 +37,11 @@ export interface ICustomEditorService { getUserConfiguredCustomEditors(resource: URI): CustomEditorInfoCollection; registerCustomEditorCapabilities(viewType: string, options: CustomEditorCapabilities): IDisposable; - getCustomEditorCapabilities(viewType: string): CustomEditorCapabilities | undefined + getCustomEditorCapabilities(viewType: string): CustomEditorCapabilities | undefined; } export interface ICustomEditorModelManager { - getAllModels(resource: URI): Promise + getAllModels(resource: URI): Promise; get(resource: URI, viewType: string): Promise; diff --git a/src/vs/workbench/contrib/customEditor/common/customEditorModelManager.ts b/src/vs/workbench/contrib/customEditor/common/customEditorModelManager.ts index 94628c1b486..b93540ddfaf 100644 --- a/src/vs/workbench/contrib/customEditor/common/customEditorModelManager.ts +++ b/src/vs/workbench/contrib/customEditor/common/customEditorModelManager.ts @@ -11,9 +11,9 @@ import { ICustomEditorModel, ICustomEditorModelManager } from 'vs/workbench/cont export class CustomEditorModelManager implements ICustomEditorModelManager { private readonly _references = new Map, - counter: number + readonly viewType: string; + readonly model: Promise; + counter: number; }>(); public async getAllModels(resource: URI): Promise { diff --git a/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts b/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts index 5042a44eede..807a53b14b2 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointEditorContribution.ts @@ -52,8 +52,8 @@ const breakpointHelperDecoration: IModelDecorationOptions = { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }; -export function createBreakpointDecorations(model: ITextModel, breakpoints: ReadonlyArray, state: State, breakpointsActivated: boolean, showBreakpointsInOverviewRuler: boolean): { range: Range; options: IModelDecorationOptions; }[] { - const result: { range: Range; options: IModelDecorationOptions; }[] = []; +export function createBreakpointDecorations(model: ITextModel, breakpoints: ReadonlyArray, state: State, breakpointsActivated: boolean, showBreakpointsInOverviewRuler: boolean): { range: Range; options: IModelDecorationOptions }[] { + const result: { range: Range; options: IModelDecorationOptions }[] = []; breakpoints.forEach((breakpoint) => { if (breakpoint.lineNumber > model.getLineCount()) { return; @@ -165,7 +165,7 @@ export class BreakpointEditorContribution implements IBreakpointEditorContributi private ignoreDecorationsChangedEvent = false; private ignoreBreakpointsChangeEvent = false; private breakpointDecorations: IBreakpointDecoration[] = []; - private candidateDecorations: { decorationId: string, inlineWidget: InlineBreakpointWidget }[] = []; + private candidateDecorations: { decorationId: string; inlineWidget: InlineBreakpointWidget }[] = []; private setDecorationsScheduler: RunOnceScheduler; constructor( diff --git a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts index 412b4df834b..4be819c4cb4 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts @@ -11,7 +11,7 @@ import * as lifecycle from 'vs/base/common/lifecycle'; import * as dom from 'vs/base/browser/dom'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { ICodeEditor, IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; -import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget'; +import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/browser/zoneWidget'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IDebugService, IBreakpoint, BreakpointWidgetContext as Context, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, DEBUG_SCHEME, CONTEXT_IN_BREAKPOINT_WIDGET, IBreakpointUpdateData, IBreakpointEditorContribution, BREAKPOINT_EDITOR_CONTRIBUTION_ID } from 'vs/workbench/contrib/debug/common/debug'; import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; @@ -22,10 +22,10 @@ import { ServicesAccessor, EditorCommand, registerEditorCommand } from 'vs/edito import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IModelService } from 'vs/editor/common/services/model'; import { URI as uri } from 'vs/base/common/uri'; -import { CompletionProviderRegistry, CompletionList, CompletionContext, CompletionItemKind } from 'vs/editor/common/languages'; +import { CompletionList, CompletionContext, CompletionItemKind } from 'vs/editor/common/languages'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ITextModel } from 'vs/editor/common/model'; -import { provideSuggestionItems, CompletionOptions } from 'vs/editor/contrib/suggest/suggest'; +import { provideSuggestionItems, CompletionOptions } from 'vs/editor/contrib/suggest/browser/suggest'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { editorForeground } from 'vs/platform/theme/common/colorRegistry'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -38,6 +38,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEditorOptions, EditorOption } from 'vs/editor/common/config/editorOptions'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const $ = dom.$; const IPrivateBreakpointWidgetService = createDecorator('privateBreakpointWidgetService'); @@ -97,7 +98,8 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi @IInstantiationService private readonly instantiationService: IInstantiationService, @IModelService private readonly modelService: IModelService, @ICodeEditorService private readonly codeEditorService: ICodeEditorService, - @IConfigurationService private readonly _configurationService: IConfigurationService + @IConfigurationService private readonly _configurationService: IConfigurationService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { super(editor, { showFrame: true, showArrow: false, frameWidth: 1, isAccessible: true }); @@ -245,12 +247,12 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi this.input.getModel().onDidChangeContent(() => setDecorations()); this.themeService.onDidColorThemeChange(() => setDecorations()); - this.toDispose.push(CompletionProviderRegistry.register({ scheme: DEBUG_SCHEME, hasAccessToAllModels: true }, { + this.toDispose.push(this.languageFeaturesService.completionProvider.register({ scheme: DEBUG_SCHEME, hasAccessToAllModels: true }, { provideCompletionItems: (model: ITextModel, position: Position, _context: CompletionContext, token: CancellationToken): Promise => { let suggestionsPromise: Promise; const underlyingModel = this.editor.getModel(); if (underlyingModel && (this.context === Context.CONDITION || (this.context === Context.LOG_MESSAGE && isCurlyBracketOpen(this.input)))) { - suggestionsPromise = provideSuggestionItems(underlyingModel, new Position(this.lineNumber, 1), new CompletionOptions(undefined, new Set().add(CompletionItemKind.Snippet)), _context, token).then(suggestions => { + suggestionsPromise = provideSuggestionItems(this.languageFeaturesService.completionProvider, underlyingModel, new Position(this.lineNumber, 1), new CompletionOptions(undefined, new Set().add(CompletionItemKind.Snippet)), _context, token).then(suggestions => { let overwriteBefore = 0; if (this.context === Context.CONDITION) { @@ -293,6 +295,7 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi options.fontFamily = editorConfig.fontFamily; options.lineHeight = editorConfig.lineHeight; options.fontLigatures = editorConfig.fontLigatures; + options.ariaLabel = this.placeholder; return options; } diff --git a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts index d911c850057..13f110597de 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts @@ -1010,7 +1010,7 @@ export function openBreakpointSource(breakpoint: IBreakpoint, sideBySide: boolea }, sideBySide ? SIDE_GROUP : ACTIVE_GROUP); } -export function getBreakpointMessageAndIcon(state: State, breakpointsActivated: boolean, breakpoint: BreakpointItem, labelService?: ILabelService): { message?: string, icon: ThemeIcon } { +export function getBreakpointMessageAndIcon(state: State, breakpointsActivated: boolean, breakpoint: BreakpointItem, labelService?: ILabelService): { message?: string; icon: ThemeIcon } { const debugActive = state === State.Running || state === State.Stopped; const breakpointIcon = breakpoint instanceof DataBreakpoint ? icons.dataBreakpoint : breakpoint instanceof FunctionBreakpoint ? icons.functionBreakpoint : breakpoint.logMessage ? icons.logBreakpoint : icons.breakpoint; diff --git a/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts b/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts index 167e3114c04..0305d93dbcb 100644 --- a/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActionViewItems.ts @@ -32,10 +32,10 @@ export class StartDebugActionViewItem extends BaseActionViewItem { private container!: HTMLElement; private start!: HTMLElement; private selectBox: SelectBox; - private debugOptions: { label: string, handler: (() => Promise) }[] = []; + private debugOptions: { label: string; handler: (() => Promise) }[] = []; private toDispose: IDisposable[]; private selected = 0; - private providers: { label: string, type: string, pick: () => Promise<{ launch: ILaunch, config: IConfig } | undefined> }[] = []; + private providers: { label: string; type: string; pick: () => Promise<{ launch: ILaunch; config: IConfig } | undefined> }[] = []; constructor( private context: unknown, diff --git a/src/vs/workbench/contrib/debug/browser/debugAdapterManager.ts b/src/vs/workbench/contrib/debug/browser/debugAdapterManager.ts index 9111e615692..2a01435a6f5 100644 --- a/src/vs/workbench/contrib/debug/browser/debugAdapterManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugAdapterManager.ts @@ -11,7 +11,7 @@ import * as strings from 'vs/base/common/strings'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorModel } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import * as nls from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -331,7 +331,7 @@ export class AdapterManager extends Disposable implements IAdapterManager { } candidates.sort((first, second) => first.label.localeCompare(second.label)); - const picks: { label: string, debugger?: Debugger, type?: string }[] = candidates.map(c => ({ label: c.label, debugger: c })); + const picks: { label: string; debugger?: Debugger; type?: string }[] = candidates.map(c => ({ label: c.label, debugger: c })); if (picks.length === 0 && languageLabel) { if (languageLabel.indexOf(' ') >= 0) { @@ -350,7 +350,7 @@ export class AdapterManager extends Disposable implements IAdapterManager { const placeHolder = nls.localize('selectDebug', "Select environment"); picks.push({ label: languageLabel ? nls.localize('installLanguage', "Install an extension for {0}...", languageLabel) : nls.localize('installExt', "Install extension...") }); - return this.quickInputService.pick<{ label: string, debugger?: Debugger }>(picks, { activeItem: picks[0], placeHolder }) + return this.quickInputService.pick<{ label: string; debugger?: Debugger }>(picks, { activeItem: picks[0], placeHolder }) .then(picked => { if (picked && picked.debugger) { return picked.debugger; diff --git a/src/vs/workbench/contrib/debug/browser/debugCommands.ts b/src/vs/workbench/contrib/debug/browser/debugCommands.ts index 8478a0b5c46..4a022554117 100644 --- a/src/vs/workbench/contrib/debug/browser/debugCommands.ts +++ b/src/vs/workbench/contrib/debug/browser/debugCommands.ts @@ -20,7 +20,7 @@ import { openBreakpointSource } from 'vs/workbench/contrib/debug/browser/breakpo import { INotificationService } from 'vs/platform/notification/common/notification'; import { InputFocusedContext } from 'vs/platform/contextkey/common/contextkeys'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; -import { PanelFocusContext } from 'vs/workbench/common/panel'; +import { PanelFocusContext } from 'vs/workbench/common/contextkeys'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfiguration'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; diff --git a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts index 951b024a5ef..e3eaf0b1438 100644 --- a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts @@ -18,7 +18,7 @@ import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configur import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IDebugConfigurationProvider, ICompound, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, CONTEXT_DEBUG_CONFIGURATION_TYPE, IConfigPresentation } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugConfigurationProvider, ICompound, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, CONTEXT_DEBUG_CONFIGURATION_TYPE, IConfigPresentation, DebugConfigurationProviderTriggerKind } from 'vs/workbench/contrib/debug/common/debug'; import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { launchSchemaId } from 'vs/workbench/services/configuration/common/configuration'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; @@ -34,7 +34,6 @@ import { sequence } from 'vs/base/common/async'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { flatten, distinct } from 'vs/base/common/arrays'; import { getVisibleAndSorted } from 'vs/workbench/contrib/debug/common/debugUtils'; -import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/api/common/extHostTypes'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { AdapterManager } from 'vs/workbench/contrib/debug/browser/debugAdapterManager'; import { debugConfigure } from 'vs/workbench/contrib/debug/browser/debugIcons'; @@ -49,7 +48,7 @@ const DEBUG_SELECTED_ROOT = 'debug.selectedroot'; const DEBUG_SELECTED_TYPE = 'debug.selectedtype'; const DEBUG_RECENT_DYNAMIC_CONFIGURATIONS = 'debug.recentdynamicconfigurations'; -interface IDynamicPickItem { label: string, launch: ILaunch, config: IConfig } +interface IDynamicPickItem { label: string; launch: ILaunch; config: IConfig } export class ConfigurationManager implements IConfigurationManager { private launches!: ILaunch[]; @@ -164,7 +163,7 @@ export class ConfigurationManager implements IConfigurationManager { return results.reduce((first, second) => first.concat(second), []); } - async getDynamicProviders(): Promise<{ label: string, type: string, getProvider: () => Promise, pick: () => Promise<{ launch: ILaunch, config: IConfig } | undefined> }[]> { + async getDynamicProviders(): Promise<{ label: string; type: string; getProvider: () => Promise; pick: () => Promise<{ launch: ILaunch; config: IConfig } | undefined> }[]> { const extensions = await this.extensionService.getExtensions(); const onDebugDynamicConfigurationsName = 'onDebugDynamicConfigurations'; const debugDynamicExtensionsTypes = extensions.reduce((acc, e) => { @@ -263,7 +262,7 @@ export class ConfigurationManager implements IConfigurationManager { } getAllConfigurations(): { launch: ILaunch; name: string; presentation?: IConfigPresentation }[] { - const all: { launch: ILaunch, name: string, presentation?: IConfigPresentation }[] = []; + const all: { launch: ILaunch; name: string; presentation?: IConfigPresentation }[] = []; for (const l of this.launches) { for (const name of l.getConfigurationNames()) { const config = l.getConfiguration(name) || l.getCompound(name); @@ -286,7 +285,7 @@ export class ConfigurationManager implements IConfigurationManager { } } - getRecentDynamicConfigurations(): { name: string, type: string }[] { + getRecentDynamicConfigurations(): { name: string; type: string }[] { return JSON.parse(this.storageService.get(DEBUG_RECENT_DYNAMIC_CONFIGURATIONS, StorageScope.WORKSPACE, '[]')); } @@ -345,7 +344,7 @@ export class ConfigurationManager implements IConfigurationManager { return this.launches.find(l => l.workspace && this.uriIdentityService.extUri.isEqual(l.workspace.uri, workspaceUri)); } - get selectedConfiguration(): { launch: ILaunch | undefined, name: string | undefined, getConfig: () => Promise, type: string | undefined } { + get selectedConfiguration(): { launch: ILaunch | undefined; name: string | undefined; getConfig: () => Promise; type: string | undefined } { return { launch: this.selectedLaunch, name: this.selectedName, @@ -574,7 +573,7 @@ class Launch extends AbstractLaunch implements ILaunch { return this.configurationService.inspect('launch', { resource: this.workspace.uri }).workspaceFolderValue; } - async openConfigFile(preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditorPane | null, created: boolean }> { + async openConfigFile(preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditorPane | null; created: boolean }> { const resource = this.uri; let created = false; let content = ''; @@ -659,7 +658,7 @@ class WorkspaceLaunch extends AbstractLaunch implements ILaunch { return this.configurationService.inspect('launch').workspaceValue; } - async openConfigFile(preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditorPane | null, created: boolean }> { + async openConfigFile(preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditorPane | null; created: boolean }> { const launchExistInFile = !!this.getConfig(); if (!launchExistInFile) { // Launch property in workspace config not found: create one by collecting launch configs from debugConfigProviders @@ -714,7 +713,7 @@ class UserLaunch extends AbstractLaunch implements ILaunch { return this.configurationService.inspect('launch').userValue; } - async openConfigFile(preserveFocus: boolean): Promise<{ editor: IEditorPane | null, created: boolean }> { + async openConfigFile(preserveFocus: boolean): Promise<{ editor: IEditorPane | null; created: boolean }> { const editor = await this.preferencesService.openUserSettings({ jsonEditor: true, preserveFocus, revealSetting: { key: 'launch' } }); return ({ editor: withUndefinedAsNull(editor), diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts index f1f8e7f8606..bcb3748c6a1 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts @@ -14,7 +14,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { openBreakpointSource } from 'vs/workbench/contrib/debug/browser/breakpointsView'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { PanelFocusContext } from 'vs/workbench/common/panel'; +import { PanelFocusContext } from 'vs/workbench/common/contextkeys'; import { IViewsService } from 'vs/workbench/common/views'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { Action } from 'vs/base/common/actions'; @@ -25,32 +25,29 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { DisassemblyViewInput } from 'vs/workbench/contrib/debug/common/disassemblyViewInput'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -class ToggleBreakpointAction extends EditorAction2 { +class ToggleBreakpointAction extends EditorAction { constructor() { super({ id: 'editor.debug.action.toggleBreakpoint', - title: { - value: nls.localize('toggleBreakpointAction', "Debug: Toggle Breakpoint"), - original: 'Debug: Toggle Breakpoint', - mnemonicTitle: nls.localize({ key: 'miToggleBreakpoint', comment: ['&& denotes a mnemonic'] }, "Toggle &&Breakpoint") - }, - f1: true, + label: nls.localize('toggleBreakpointAction', "Debug: Toggle Breakpoint"), + alias: 'Debug: Toggle Breakpoint', precondition: CONTEXT_DEBUGGERS_AVAILABLE, - keybinding: { - when: EditorContextKeys.editorTextFocus, + kbOpts: { + kbExpr: EditorContextKeys.editorTextFocus, primary: KeyCode.F9, weight: KeybindingWeight.EditorContrib }, - menu: { + menuOpts: { when: CONTEXT_DEBUGGERS_AVAILABLE, - id: MenuId.MenubarDebugMenu, + title: nls.localize({ key: 'miToggleBreakpoint', comment: ['&& denotes a mnemonic'] }, "Toggle &&Breakpoint"), + menuId: MenuId.MenubarDebugMenu, group: '4_new_breakpoint', order: 1 } }); } - async runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, ...args: any[]): Promise { + async run(accessor: ServicesAccessor, editor: ICodeEditor): Promise { // TODO: add disassembly F9 if (editor.hasModel()) { const debugService = accessor.get(IDebugService); @@ -71,19 +68,16 @@ class ToggleBreakpointAction extends EditorAction2 { } } -class ConditionalBreakpointAction extends EditorAction2 { +class ConditionalBreakpointAction extends EditorAction { constructor() { super({ id: 'editor.debug.action.conditionalBreakpoint', - title: { - value: nls.localize('conditionalBreakpointEditorAction', "Debug: Add Conditional Breakpoint..."), - original: 'Debug: Add Conditional Breakpoint...', - mnemonicTitle: nls.localize({ key: 'miConditionalBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Conditional Breakpoint...") - }, - f1: true, + label: nls.localize('conditionalBreakpointEditorAction', "Debug: Add Conditional Breakpoint..."), + alias: 'Debug: Add Conditional Breakpoint...', precondition: CONTEXT_DEBUGGERS_AVAILABLE, - menu: { - id: MenuId.MenubarNewBreakpointMenu, + menuOpts: { + menuId: MenuId.MenubarNewBreakpointMenu, + title: nls.localize({ key: 'miConditionalBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Conditional Breakpoint..."), group: '1_breakpoints', order: 1, when: CONTEXT_DEBUGGERS_AVAILABLE @@ -91,7 +85,7 @@ class ConditionalBreakpointAction extends EditorAction2 { }); } - runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, ...args: any[]): void { + async run(accessor: ServicesAccessor, editor: ICodeEditor): Promise { const debugService = accessor.get(IDebugService); const position = editor.getPosition(); @@ -101,28 +95,27 @@ class ConditionalBreakpointAction extends EditorAction2 { } } -class LogPointAction extends EditorAction2 { +class LogPointAction extends EditorAction { constructor() { super({ id: 'editor.debug.action.addLogPoint', - title: { - value: nls.localize('logPointEditorAction', "Debug: Add Logpoint..."), - original: 'Debug: Add Logpoint...', - mnemonicTitle: nls.localize({ key: 'miLogPoint', comment: ['&& denotes a mnemonic'] }, "&&Logpoint...") - }, + label: nls.localize('logPointEditorAction', "Debug: Add Logpoint..."), precondition: CONTEXT_DEBUGGERS_AVAILABLE, - f1: true, - menu: { - id: MenuId.MenubarNewBreakpointMenu, - group: '1_breakpoints', - order: 4, - when: CONTEXT_DEBUGGERS_AVAILABLE - } + alias: 'Debug: Add Logpoint...', + menuOpts: [ + { + menuId: MenuId.MenubarNewBreakpointMenu, + title: nls.localize({ key: 'miLogPoint', comment: ['&& denotes a mnemonic'] }, "&&Logpoint..."), + group: '1_breakpoints', + order: 4, + when: CONTEXT_DEBUGGERS_AVAILABLE, + } + ] }); } - runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, ...args: any[]): void { + async run(accessor: ServicesAccessor, editor: ICodeEditor): Promise { const debugService = accessor.get(IDebugService); const position = editor.getPosition(); @@ -462,11 +455,11 @@ class CloseExceptionWidgetAction extends EditorAction { } } -registerAction2(ToggleBreakpointAction); -registerAction2(ConditionalBreakpointAction); -registerAction2(LogPointAction); registerAction2(OpenDisassemblyViewAction); registerAction2(ToggleDisassemblyViewSourceCodeAction); +registerEditorAction(ToggleBreakpointAction); +registerEditorAction(ConditionalBreakpointAction); +registerEditorAction(LogPointAction); registerEditorAction(RunToCursorAction); registerEditorAction(StepIntoTargetsAction); registerEditorAction(SelectionToReplAction); diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts index 1f286744226..c34123a78a3 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorContribution.ts @@ -12,22 +12,21 @@ import { setProperty } from 'vs/base/common/jsonEdit'; import { Constants } from 'vs/base/common/uint'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IKeyboardEvent, StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { InlineValueContext, InlineValuesProviderRegistry, StandardTokenType } from 'vs/editor/common/languages'; +import { InlineValueContext, StandardTokenType } from 'vs/editor/common/languages'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { distinct, flatten } from 'vs/base/common/arrays'; import { onUnexpectedExternalError } from 'vs/base/common/errors'; -import { DEFAULT_WORD_REGEXP } from 'vs/editor/common/model/wordHelper'; +import { DEFAULT_WORD_REGEXP } from 'vs/editor/common/core/wordHelper'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType, IPartialEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; import { Range } from 'vs/editor/common/core/range'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IDebugEditorContribution, IDebugService, State, IStackFrame, IDebugConfiguration, IExpression, IExceptionInfo, IDebugSession, CONTEXT_EXCEPTION_WIDGET_VISIBLE } from 'vs/workbench/contrib/debug/common/debug'; import { ExceptionWidget } from 'vs/workbench/contrib/debug/browser/exceptionWidget'; import { FloatingClickWidget } from 'vs/workbench/browser/codeeditor'; import { Position } from 'vs/editor/common/core/position'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { memoize } from 'vs/base/common/decorators'; import { IEditorHoverOptions, EditorOption } from 'vs/editor/common/config/editorOptions'; import { DebugHoverWidget } from 'vs/workbench/contrib/debug/browser/debugHover'; @@ -35,8 +34,8 @@ import { IModelDeltaDecoration, InjectedTextCursorStops, ITextModel } from 'vs/e import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { basename } from 'vs/base/common/path'; -import { ModesHoverController } from 'vs/editor/contrib/hover/hover'; -import { HoverStartMode } from 'vs/editor/contrib/hover/hoverOperation'; +import { ModesHoverController } from 'vs/editor/contrib/hover/browser/hover'; +import { HoverStartMode } from 'vs/editor/contrib/hover/browser/hoverOperation'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { Event } from 'vs/base/common/event'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; @@ -45,12 +44,16 @@ import { Expression } from 'vs/workbench/contrib/debug/common/debugModel'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { addDisposableListener } from 'vs/base/browser/dom'; import { DomEmitter } from 'vs/base/browser/event'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; const LAUNCH_JSON_REGEX = /\.vscode\/launch\.json$/; const MAX_NUM_INLINE_VALUES = 100; // JS Global scope can have 700+ entries. We want to limit ourselves for perf reasons const MAX_INLINE_DECORATOR_LENGTH = 150; // Max string length of each inline decorator when debugging. If exceeded ... is added const MAX_TOKENIZATION_LINE_LEN = 500; // If line is too long, then inline values for the line are skipped +const DEAFULT_INLINE_DEBOUNCE_DELAY = 200; + export const debugInlineForeground = registerColor('editor.inlineValuesForeground', { dark: '#ffffff80', light: '#00000080', @@ -217,18 +220,21 @@ export class DebugEditorContribution implements IDebugEditorContribution { private altListener: IDisposable | undefined; private altPressed = false; private oldDecorations: string[] = []; + private readonly debounceInfo: IFeatureDebounceInformation; constructor( private editor: ICodeEditor, @IDebugService private readonly debugService: IDebugService, @IInstantiationService private readonly instantiationService: IInstantiationService, @ICommandService private readonly commandService: ICommandService, - @ITelemetryService private readonly telemetryService: ITelemetryService, @IConfigurationService private readonly configurationService: IConfigurationService, @IHostService private readonly hostService: IHostService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, + @ILanguageFeatureDebounceService featureDebounceService: ILanguageFeatureDebounceService ) { + this.debounceInfo = featureDebounceService.for(languageFeaturesService.inlineValuesProvider, 'InlineValues', { min: DEAFULT_INLINE_DEBOUNCE_DELAY }); this.hoverWidget = this.instantiationService.createInstance(DebugHoverWidget, this.editor); this.toDispose = []; this.registerListeners(); @@ -279,7 +285,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { // Inline value provider should get called on view port change const model = this.editor.getModel(); - if (model && InlineValuesProviderRegistry.has(model)) { + if (model && this.languageFeaturesService.inlineValuesProvider.has(model)) { this.updateInlineValuesScheduler.schedule(); } })); @@ -523,10 +529,6 @@ export class DebugEditorContribution implements IDebugEditorContribution { } async addLaunchConfiguration(): Promise { - /* __GDPR__ - "debug/addLaunchConfiguration" : {} - */ - this.telemetryService.publicLog('debug/addLaunchConfiguration'); const model = this.editor.getModel(); if (!model) { return; @@ -603,9 +605,10 @@ export class DebugEditorContribution implements IDebugEditorContribution { @memoize private get updateInlineValuesScheduler(): RunOnceScheduler { + const model = this.editor.getModel(); return new RunOnceScheduler( async () => await this.updateInlineValueDecorations(this.debugService.getViewModel().focusedStackFrame), - 200 + model ? this.debounceInfo.get(model) : DEAFULT_INLINE_DEBOUNCE_DELAY ); } @@ -616,7 +619,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { const model = this.editor.getModel(); const inlineValuesSetting = this.configurationService.getValue('debug').inlineValues; - const inlineValuesTurnedOn = inlineValuesSetting === true || (inlineValuesSetting === 'auto' && model && InlineValuesProviderRegistry.has(model)); + const inlineValuesTurnedOn = inlineValuesSetting === true || (inlineValuesSetting === 'auto' && model && this.languageFeaturesService.inlineValuesProvider.has(model)); if (!inlineValuesTurnedOn || !model || !stackFrame || model.uri.toString() !== stackFrame.source.uri.toString()) { if (!this.removeInlineValuesScheduler.isScheduled()) { this.removeInlineValuesScheduler.schedule(); @@ -628,7 +631,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { let allDecorations: IModelDeltaDecoration[]; - if (InlineValuesProviderRegistry.has(model)) { + if (this.languageFeaturesService.inlineValuesProvider.has(model)) { const findVariable = async (_key: string, caseSensitiveLookup: boolean): Promise => { const scopes = await stackFrame.getMostSpecificScopes(stackFrame.range); @@ -650,7 +653,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { const token = new CancellationTokenSource().token; const ranges = this.editor.getVisibleRangesPlusViewportAboveBelow(); - const providers = InlineValuesProviderRegistry.ordered(model).reverse(); + const providers = this.languageFeaturesService.inlineValuesProvider.ordered(model).reverse(); allDecorations = []; const lineDecorations = new Map(); @@ -710,8 +713,13 @@ export class DebugEditorContribution implements IDebugEditorContribution { onUnexpectedExternalError(err); })))); + const startTime = Date.now(); + await Promise.all(promises); + // update debounce info + this.updateInlineValuesScheduler.delay = this.debounceInfo.update(model, Date.now() - startTime); + // sort line segments and concatenate them into a decoration lineDecorations.forEach((segments, line) => { diff --git a/src/vs/workbench/contrib/debug/browser/debugHover.ts b/src/vs/workbench/contrib/debug/browser/debugHover.ts index b72f6138bc1..a6189c1f160 100644 --- a/src/vs/workbench/contrib/debug/browser/debugHover.ts +++ b/src/vs/workbench/contrib/debug/browser/debugHover.ts @@ -30,10 +30,10 @@ import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { coalesce } from 'vs/base/common/arrays'; import { IAsyncDataSource } from 'vs/base/browser/ui/tree/tree'; import { VariablesRenderer } from 'vs/workbench/contrib/debug/browser/variablesView'; -import { EvaluatableExpressionProviderRegistry } from 'vs/editor/common/languages'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { isMacintosh } from 'vs/base/common/platform'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const $ = dom.$; @@ -89,7 +89,8 @@ export class DebugHoverWidget implements IContentWidget { private editor: ICodeEditor, @IDebugService private readonly debugService: IDebugService, @IInstantiationService private readonly instantiationService: IInstantiationService, - @IThemeService private readonly themeService: IThemeService + @IThemeService private readonly themeService: IThemeService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { this.toDispose = []; @@ -203,8 +204,8 @@ export class DebugHoverWidget implements IContentWidget { let rng: IRange | undefined = undefined; let matchingExpression: string | undefined; - if (EvaluatableExpressionProviderRegistry.has(model)) { - const supports = EvaluatableExpressionProviderRegistry.ordered(model); + if (this.languageFeaturesService.evaluatableExpressionProvider.has(model)) { + const supports = this.languageFeaturesService.evaluatableExpressionProvider.ordered(model); const promises = supports.map(support => { return Promise.resolve(support.provideEvaluatableExpression(model, pos, cancellationSource.token)).then(expression => { diff --git a/src/vs/workbench/contrib/debug/browser/debugMemory.ts b/src/vs/workbench/contrib/debug/browser/debugMemory.ts index 69225a04eba..e659c1ae498 100644 --- a/src/vs/workbench/contrib/debug/browser/debugMemory.ts +++ b/src/vs/workbench/contrib/debug/browser/debugMemory.ts @@ -239,6 +239,7 @@ class MemoryRegionView extends Disposable implements IMemoryRegion { super(); this.writable = parent.writable; + this._register(parent); this._register(parent.onDidInvalidate(e => { const fromOffset = clamp(e.fromOffset - range.fromOffset, 0, this.width); const toOffset = clamp(e.toOffset - range.fromOffset, 0, this.width); diff --git a/src/vs/workbench/contrib/debug/browser/debugProgress.ts b/src/vs/workbench/contrib/debug/browser/debugProgress.ts index 67c9753590f..4b94190fd0e 100644 --- a/src/vs/workbench/contrib/debug/browser/debugProgress.ts +++ b/src/vs/workbench/contrib/debug/browser/debugProgress.ts @@ -49,7 +49,7 @@ export class DebugProgressContribution implements IWorkbenchContribution { delay: 500 }, progressStep => { let total = 0; - const reportProgress = (progress: { message?: string, percentage?: number }) => { + const reportProgress = (progress: { message?: string; percentage?: number }) => { let increment = undefined; if (typeof progress.percentage === 'number') { increment = progress.percentage - total; diff --git a/src/vs/workbench/contrib/debug/browser/debugService.ts b/src/vs/workbench/contrib/debug/browser/debugService.ts index b2e3f0a6d49..20e627b3d56 100644 --- a/src/vs/workbench/contrib/debug/browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugService.ts @@ -82,7 +82,7 @@ export class DebugService implements IDebugService { private previousState: State | undefined; private sessionCancellationTokens = new Map(); private activity: IDisposable | undefined; - private chosenEnvironments: { [key: string]: string; }; + private chosenEnvironments: { [key: string]: string }; constructor( @IEditorService private readonly editorService: IEditorService, @@ -530,7 +530,7 @@ export class DebugService implements IDebugService { /** * instantiates the new session, initializes the session, registers session listeners and reports telemetry */ - private async doCreateSession(sessionId: string, root: IWorkspaceFolder | undefined, configuration: { resolved: IConfig, unresolved: IConfig | undefined; }, options?: IDebugSessionOptions): Promise { + private async doCreateSession(sessionId: string, root: IWorkspaceFolder | undefined, configuration: { resolved: IConfig; unresolved: IConfig | undefined }, options?: IDebugSessionOptions): Promise { const session = this.instantiationService.createInstance(DebugSession, sessionId, configuration, root, this.model, options); if (options?.startedByUser && this.model.getSessions().some(s => s.getLabel() === session.getLabel())) { @@ -972,7 +972,7 @@ export class DebugService implements IDebugService { this.model.addFunctionBreakpoint(name || '', id); } - async updateFunctionBreakpoint(id: string, update: { name?: string, hitCondition?: string, condition?: string; }): Promise { + async updateFunctionBreakpoint(id: string, update: { name?: string; hitCondition?: string; condition?: string }): Promise { this.model.updateFunctionBreakpoint(id, update); this.debugStorage.storeBreakpoints(this.model); await this.sendFunctionBreakpoints(); @@ -1214,7 +1214,7 @@ export class DebugService implements IDebugService { } } -export function getStackFrameThreadAndSessionToFocus(model: IDebugModel, stackFrame: IStackFrame | undefined, thread?: IThread, session?: IDebugSession, avoidSession?: IDebugSession): { stackFrame: IStackFrame | undefined, thread: IThread | undefined, session: IDebugSession | undefined; } { +export function getStackFrameThreadAndSessionToFocus(model: IDebugModel, stackFrame: IStackFrame | undefined, thread?: IThread, session?: IDebugSession, avoidSession?: IDebugSession): { stackFrame: IStackFrame | undefined; thread: IThread | undefined; session: IDebugSession | undefined } { if (!session) { if (stackFrame || thread) { session = stackFrame ? stackFrame.thread.session : thread!.session; diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index cc89d00e774..5448a5f7d6e 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -74,7 +74,7 @@ export class DebugSession implements IDebugSession { constructor( private id: string, - private _configuration: { resolved: IConfig, unresolved: IConfig | undefined }, + private _configuration: { resolved: IConfig; unresolved: IConfig | undefined }, public root: IWorkspaceFolder | undefined, private model: DebugModel, options: IDebugSessionOptions | undefined, @@ -172,7 +172,7 @@ export class DebugSession implements IDebugSession { return this._options.debugUI?.simple ?? false; } - setConfiguration(configuration: { resolved: IConfig, unresolved: IConfig | undefined }) { + setConfiguration(configuration: { resolved: IConfig; unresolved: IConfig | undefined }) { this._configuration = configuration; } @@ -464,7 +464,7 @@ export class DebugSession implements IDebugSession { } } - async dataBreakpointInfo(name: string, variablesReference?: number): Promise<{ dataId: string | null, description: string, canPersist?: boolean } | undefined> { + async dataBreakpointInfo(name: string, variablesReference?: number): Promise<{ dataId: string | null; description: string; canPersist?: boolean } | undefined> { if (!this.raw) { throw new Error(localize('noDebugAdapter', "No debugger available, can not send '{0}'", 'data breakpoints info')); } @@ -751,7 +751,7 @@ export class DebugSession implements IDebugSession { }, sessionCancelationToken); } - async stepInTargets(frameId: number): Promise<{ id: number, label: string }[] | undefined> { + async stepInTargets(frameId: number): Promise<{ id: number; label: string }[] | undefined> { if (!this.raw) { return Promise.reject(new Error(localize('noDebugAdapter', "No debugger available, can not send '{0}'", 'stepInTargets'))); } @@ -1301,7 +1301,7 @@ export class DebugSession implements IDebugSession { this.repl.appendToRepl(this, data, severity, source); } - logToRepl(sev: severity, args: any[], frame?: { uri: URI, line: number, column: number }) { + logToRepl(sev: severity, args: any[], frame?: { uri: URI; line: number; column: number }) { this.repl.logToRepl(this, sev, args, frame); } } diff --git a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts index 16930d7599c..f57588fdbe6 100644 --- a/src/vs/workbench/contrib/debug/browser/debugToolBar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolBar.ts @@ -258,7 +258,7 @@ export class DebugToolBar extends Themable implements IWorkbenchContribution { // Debug toolbar const debugViewTitleItems: IDisposable[] = []; -const registerDebugToolBarItem = (id: string, title: string, order: number, icon?: { light?: URI, dark?: URI; } | ThemeIcon, when?: ContextKeyExpression, precondition?: ContextKeyExpression, alt?: ICommandAction) => { +const registerDebugToolBarItem = (id: string, title: string, order: number, icon?: { light?: URI; dark?: URI } | ThemeIcon, when?: ContextKeyExpression, precondition?: ContextKeyExpression, alt?: ICommandAction) => { MenuRegistry.appendMenuItem(MenuId.DebugToolBar, { group: 'navigation', when, diff --git a/src/vs/workbench/contrib/debug/browser/debugViewlet.ts b/src/vs/workbench/contrib/debug/browser/debugViewlet.ts index 5843e54f7b3..a90416994e1 100644 --- a/src/vs/workbench/contrib/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/contrib/debug/browser/debugViewlet.ts @@ -27,7 +27,7 @@ import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActio import { IViewDescriptorService, IViewsService } from 'vs/workbench/common/views'; import { WelcomeView } from 'vs/workbench/contrib/debug/browser/welcomeView'; import { debugConfigure } from 'vs/workbench/contrib/debug/browser/debugIcons'; -import { WorkbenchStateContext } from 'vs/workbench/browser/contextkeys'; +import { WorkbenchStateContext } from 'vs/workbench/common/contextkeys'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { FOCUS_SESSION_ID, SELECT_AND_START_ID, DEBUG_CONFIGURE_COMMAND_ID, DEBUG_CONFIGURE_LABEL, DEBUG_START_LABEL, DEBUG_START_COMMAND_ID } from 'vs/workbench/contrib/debug/browser/debugCommands'; import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -120,7 +120,7 @@ export class DebugViewPaneContainer extends ViewPaneContainer { } } - override addPanes(panes: { pane: ViewPane, size: number, index?: number }[]): void { + override addPanes(panes: { pane: ViewPane; size: number; index?: number }[]): void { super.addPanes(panes); for (const { pane: pane } of panes) { @@ -208,7 +208,7 @@ registerAction2(class extends Action2 { launch = launches[0]; } else { const picks = launches.map(l => ({ label: l.name, launch: l })); - const picked = await quickInputService.pick<{ label: string, launch: ILaunch }>(picks, { + const picked = await quickInputService.pick<{ label: string; launch: ILaunch }>(picks, { activeItem: picks[0], placeHolder: nls.localize({ key: 'selectWorkspaceFolder', comment: ['User picks a workspace folder or a workspace configuration file here. Workspace configuration files can contain settings and thus a launch.json configuration can be written into one.'] }, "Select a workspace folder to create a launch.json file in or add it to the workspace config file") }); diff --git a/src/vs/workbench/contrib/debug/browser/disassemblyView.ts b/src/vs/workbench/contrib/debug/browser/disassemblyView.ts index 1524eacfe04..7cf0d618cd4 100644 --- a/src/vs/workbench/contrib/debug/browser/disassemblyView.ts +++ b/src/vs/workbench/contrib/debug/browser/disassemblyView.ts @@ -633,7 +633,7 @@ class InstructionRenderer extends Disposable implements ITableRenderer= 1 && lineNumber <= textModel.getLineCount()) { const lineContent = textModel.getLineContent(lineNumber); sourceSB.appendASCIIString(` ${lineNumber}: `); - sourceSB.appendASCIIString(lineContent.replace(/[ ]/g, ' ') + '\n'); + sourceSB.appendASCIIString(lineContent + '\n'); if (instruction.endLine && lineNumber < instruction.endLine) { lineNumber++; diff --git a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts index 14186010923..34d3b84ec38 100644 --- a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/exceptionWidget'; import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; -import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget'; +import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/browser/zoneWidget'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IExceptionInfo, IDebugSession, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID } from 'vs/workbench/contrib/debug/common/debug'; import { RunOnceScheduler } from 'vs/base/common/async'; diff --git a/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts b/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts index ec366aff788..07e670d0f60 100644 --- a/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts +++ b/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts @@ -13,9 +13,8 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { isFolderToOpen, isWorkspaceToOpen } from 'vs/platform/windows/common/windows'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { hasWorkspaceFileExtension, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, toWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IWorkspaceContextService, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, toWorkspaceIdentifier, hasWorkspaceFileExtension } from 'vs/platform/workspace/common/workspace'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IWorkspace, IWorkspaceProvider } from 'vs/workbench/services/host/browser/browserHostService'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -31,7 +30,7 @@ class BrowserExtensionHostDebugService extends ExtensionHostDebugChannelClient i constructor( @IRemoteAgentService remoteAgentService: IRemoteAgentService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService environmentService: IBrowserWorkbenchEnvironmentService, @ILogService logService: ILogService, @IHostService hostService: IHostService, @IWorkspaceContextService contextService: IWorkspaceContextService, @@ -129,7 +128,7 @@ class BrowserExtensionHostDebugService extends ExtensionHostDebugChannelClient i const lastExtensionDevelopmentWorkspace = this.storageService.get(BrowserExtensionHostDebugService.LAST_EXTENSION_DEVELOPMENT_WORKSPACE_KEY, StorageScope.GLOBAL); if (lastExtensionDevelopmentWorkspace) { try { - const serializedWorkspace: { workspaceUri?: UriComponents, folderUri?: UriComponents } = JSON.parse(lastExtensionDevelopmentWorkspace); + const serializedWorkspace: { workspaceUri?: UriComponents; folderUri?: UriComponents } = JSON.parse(lastExtensionDevelopmentWorkspace); if (serializedWorkspace.workspaceUri) { debugWorkspace = { workspaceUri: URI.revive(serializedWorkspace.workspaceUri) }; } else if (serializedWorkspace.folderUri) { diff --git a/src/vs/workbench/contrib/debug/browser/linkDetector.ts b/src/vs/workbench/contrib/debug/browser/linkDetector.ts index 7f30bb7ec46..cab19a5d584 100644 --- a/src/vs/workbench/contrib/debug/browser/linkDetector.ts +++ b/src/vs/workbench/contrib/debug/browser/linkDetector.ts @@ -16,7 +16,7 @@ import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { localize } from 'vs/nls'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { ITunnelService } from 'vs/platform/tunnel/common/tunnel'; const CONTROL_CODES = '\\u0000-\\u0020\\u007f-\\u009f'; const WEB_LINK_REGEX = new RegExp('(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\\/\\/|data:|www\\.)[^\\s' + CONTROL_CODES + '"]{2,}[^\\s' + CONTROL_CODES + '"\')}\\],:;.!?]', 'ug'); diff --git a/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css index b3adfc060e3..493c9270e85 100644 --- a/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css +++ b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css @@ -242,7 +242,6 @@ .debug-pane .inputBoxContainer { box-sizing: border-box; flex-grow: 1; - display: none; } .debug-pane .debug-watch .monaco-inputbox { diff --git a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index 5c1d0d8332e..aea2140dc84 100644 --- a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -8,7 +8,6 @@ import { Event, Emitter } from 'vs/base/common/event'; import * as objects from 'vs/base/common/objects'; import { Action } from 'vs/base/common/actions'; import * as errors from 'vs/base/common/errors'; -import { ICustomEndpointTelemetryService, ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { formatPII, isUri } from 'vs/workbench/contrib/debug/common/debugUtils'; import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger } from 'vs/workbench/contrib/debug/common/debug'; import { IExtensionHostDebugService, IOpenExtensionWindowResult } from 'vs/platform/debug/common/extensionHostDebug'; @@ -33,7 +32,7 @@ interface ILaunchVSCodeArgument { interface ILaunchVSCodeArguments { args: ILaunchVSCodeArgument[]; debugRenderer?: boolean; - env?: { [key: string]: string | null; }; + env?: { [key: string]: string | null }; } /** @@ -83,8 +82,6 @@ export class RawDebugSession implements IDisposable { debugAdapter: IDebugAdapter, public readonly dbgr: IDebugger, private readonly sessionId: string, - @ITelemetryService private readonly telemetryService: ITelemetryService, - @ICustomEndpointTelemetryService private readonly customTelemetryService: ICustomEndpointTelemetryService, @IExtensionHostDebugService private readonly extensionHostDebugService: IExtensionHostDebugService, @IOpenerService private readonly openerService: IOpenerService, @INotificationService private readonly notificationService: INotificationService, @@ -733,11 +730,6 @@ export class RawDebugSession implements IDisposable { const error: DebugProtocol.Message | undefined = errorResponse?.body?.error; const errorMessage = errorResponse?.message || ''; - if (error && error.sendTelemetry) { - const telemetryMessage = error ? formatPII(error.format, true, error.variables) : errorMessage; - this.telemetryDebugProtocolErrorResponse(telemetryMessage); - } - const userMessage = error ? formatPII(error.format, false, error.variables) : errorMessage; const url = error?.url; if (error && url) { @@ -778,23 +770,6 @@ export class RawDebugSession implements IDisposable { }); } - private telemetryDebugProtocolErrorResponse(telemetryMessage: string | undefined) { - /* __GDPR__ - "debugProtocolErrorResponse" : { - "error" : { "classification": "CallstackOrException", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLogError('debugProtocolErrorResponse', { error: telemetryMessage }); - const telemetryEndpoint = this.dbgr.getCustomTelemetryEndpoint(); - if (telemetryEndpoint) { - /* __GDPR__TODO__ - The message is sent in the name of the adapter but the adapter doesn't know about it. - However, since adapters are an open-ended set, we can not declared the events statically either. - */ - this.customTelemetryService.publicLogError(telemetryEndpoint, 'debugProtocolErrorResponse', { error: telemetryMessage }); - } - } - dispose(): void { dispose(this.toDispose); } diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index c89ad4576e6..ef6e935b94b 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -30,10 +30,10 @@ import { Range } from 'vs/editor/common/core/range'; import { IDecorationOptions } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel } from 'vs/editor/common/model'; -import { CompletionContext, CompletionItem, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemKinds, CompletionList, CompletionProviderRegistry } from 'vs/editor/common/languages'; +import { CompletionContext, CompletionItem, CompletionItemInsertTextRule, CompletionItemKind, CompletionItemKinds, CompletionList } from 'vs/editor/common/languages'; import { IModelService } from 'vs/editor/common/services/model'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfiguration'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { localize } from 'vs/nls'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { Action2, IMenu, IMenuService, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; @@ -64,6 +64,7 @@ import { ReplAccessibilityProvider, ReplDataSource, ReplDelegate, ReplEvaluation import { CONTEXT_DEBUG_STATE, CONTEXT_IN_DEBUG_REPL, CONTEXT_MULTI_SESSION_REPL, DEBUG_SCHEME, getStateLabel, IDebugConfiguration, IDebugService, IDebugSession, IReplElement, REPL_VIEW_ID, State } from 'vs/workbench/contrib/debug/common/debug'; import { ReplGroup } from 'vs/workbench/contrib/debug/common/replModel'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const $ = dom.$; @@ -125,7 +126,8 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget { @IKeybindingService keybindingService: IKeybindingService, @IOpenerService openerService: IOpenerService, @ITelemetryService telemetryService: ITelemetryService, - @IMenuService menuService: IMenuService + @IMenuService menuService: IMenuService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); @@ -219,7 +221,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget { this.completionItemProvider.dispose(); } if (session.capabilities.supportsCompletionsRequest) { - this.completionItemProvider = CompletionProviderRegistry.register({ scheme: DEBUG_SCHEME, pattern: '**/replinput', hasAccessToAllModels: true }, { + this.completionItemProvider = this.languageFeaturesService.completionProvider.register({ scheme: DEBUG_SCHEME, pattern: '**/replinput', hasAccessToAllModels: true }, { triggerCharacters: session.capabilities.completionTriggerCharacters || ['.'], provideCompletionItems: async (_: ITextModel, position: Position, _context: CompletionContext, token: CancellationToken): Promise => { // Disable history navigation because up and down are used to navigate through the suggest widget @@ -285,7 +287,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget { await this.selectSession(); } - getFilterStats(): { total: number, filtered: number } { + getFilterStats(): { total: number; filtered: number } { // This could be called before the tree is created when setting this.filterState.filterText value return { total: this.tree?.getNode().children.length ?? 0, diff --git a/src/vs/workbench/contrib/debug/browser/replFilter.ts b/src/vs/workbench/contrib/debug/browser/replFilter.ts index e888619b0ba..84b1faf07e3 100644 --- a/src/vs/workbench/contrib/debug/browser/replFilter.ts +++ b/src/vs/workbench/contrib/debug/browser/replFilter.ts @@ -28,8 +28,8 @@ import { Variable } from 'vs/workbench/contrib/debug/common/debugModel'; type ParsedQuery = { - type: 'include' | 'exclude', - query: string, + type: 'include' | 'exclude'; + query: string; }; export class ReplFilter implements ITreeFilter { @@ -81,7 +81,7 @@ export class ReplFilter implements ITreeFilter { } export interface IFilterStatsProvider { - getFilterStats(): { total: number, filtered: number }; + getFilterStats(): { total: number; filtered: number }; } export class ReplFilterState { @@ -105,7 +105,7 @@ export class ReplFilterState { return this._filterText; } - get filterStats(): { total: number, filtered: number } { + get filterStats(): { total: number; filtered: number } { return this._stats; } diff --git a/src/vs/workbench/contrib/debug/browser/welcomeView.ts b/src/vs/workbench/contrib/debug/browser/welcomeView.ts index 39db5b47969..c936f453d32 100644 --- a/src/vs/workbench/contrib/debug/browser/welcomeView.ts +++ b/src/vs/workbench/contrib/debug/browser/welcomeView.ts @@ -17,7 +17,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IViewDescriptorService, IViewsRegistry, Extensions, ViewContentGroups } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { WorkbenchStateContext } from 'vs/workbench/browser/contextkeys'; +import { WorkbenchStateContext } from 'vs/workbench/common/contextkeys'; import { OpenFolderAction, OpenFileAction, OpenFileFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; import { isMacintosh, isWeb } from 'vs/base/common/platform'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 4b691f887ed..2cee07d84b4 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -21,7 +21,6 @@ import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryEndpoint } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/api/common/extHostTypes'; import { IEditorPane } from 'vs/workbench/common/editor'; import { DebugCompoundRoot } from 'vs/workbench/contrib/debug/common/debugCompoundRoot'; import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; @@ -202,7 +201,7 @@ export interface IDebugSessionOptions { export interface IDataBreakpointInfoResponse { dataId: string | null; description: string; - canPersist?: boolean, + canPersist?: boolean; accessTypes?: DebugProtocol.DataBreakpointAccessType[]; } @@ -227,7 +226,7 @@ export interface IValidMemoryRange extends IMemoryRange { type: MemoryRangeType.Valid; offset: number; length: number; - data: VSBuffer + data: VSBuffer; } export interface IUnreadableMemoryRange extends IMemoryRange { @@ -301,7 +300,7 @@ export interface IDebugSession extends ITreeElement { getSourceForUri(modelUri: uri): Source | undefined; getSource(raw?: DebugProtocol.Source): Source; - setConfiguration(configuration: { resolved: IConfig, unresolved: IConfig | undefined }): void; + setConfiguration(configuration: { resolved: IConfig; unresolved: IConfig | undefined }): void; rawUpdate(data: IRawModelUpdate): void; getThread(threadId: number): IThread | undefined; @@ -314,7 +313,7 @@ export interface IDebugSession extends ITreeElement { removeReplExpressions(): void; addReplExpression(stackFrame: IStackFrame | undefined, name: string): Promise; appendToRepl(data: string | IExpression, severity: severity, source?: IReplElementSource): void; - logToRepl(sev: severity, args: any[], frame?: { uri: uri, line: number, column: number }): void; + logToRepl(sev: severity, args: any[], frame?: { uri: uri; line: number; column: number }): void; // session events readonly onDidEndAdapter: Event; @@ -364,7 +363,7 @@ export interface IDebugSession extends ITreeElement { restartFrame(frameId: number, threadId: number): Promise; next(threadId: number, granularity?: DebugProtocol.SteppingGranularity): Promise; stepIn(threadId: number, targetId?: number, granularity?: DebugProtocol.SteppingGranularity): Promise; - stepInTargets(frameId: number): Promise<{ id: number, label: string }[] | undefined>; + stepInTargets(frameId: number): Promise<{ id: number; label: string }[] | undefined>; stepOut(threadId: number, granularity?: DebugProtocol.SteppingGranularity): Promise; stepBack(threadId: number, granularity?: DebugProtocol.SteppingGranularity): Promise; continue(threadId: number): Promise; @@ -509,7 +508,7 @@ export interface IBreakpoint extends IBaseBreakpoint { readonly column?: number; readonly endColumn?: number; readonly adapterData: any; - readonly sessionAgnosticData: { lineNumber: number, column: number | undefined }; + readonly sessionAgnosticData: { lineNumber: number; column: number | undefined }; } export interface IFunctionBreakpoint extends IBaseBreakpoint { @@ -567,7 +566,7 @@ export interface IViewModel extends ITreeElement { isMultiSessionView(): boolean; onDidFocusSession: Event; - onDidFocusStackFrame: Event<{ stackFrame: IStackFrame | undefined, explicit: boolean }>; + onDidFocusStackFrame: Event<{ stackFrame: IStackFrame | undefined; explicit: boolean }>; onDidSelectExpression: Event<{ expression: IExpression; settingWatch: boolean } | undefined>; onWillUpdateViews: Event; } @@ -579,7 +578,7 @@ export interface IEvaluate { export interface IDebugModel extends ITreeElement { getSession(sessionId: string | undefined, includeInactive?: boolean): IDebugSession | undefined; getSessions(includeInactive?: boolean): IDebugSession[]; - getBreakpoints(filter?: { uri?: uri, lineNumber?: number, column?: number, enabledOnly?: boolean }): ReadonlyArray; + getBreakpoints(filter?: { uri?: uri; lineNumber?: number; column?: number; enabledOnly?: boolean }): ReadonlyArray; areBreakpointsActivated(): boolean; getFunctionBreakpoints(): ReadonlyArray; getDataBreakpoints(): ReadonlyArray; @@ -632,7 +631,7 @@ export interface IDebugConfiguration { confirmOnExit: 'always' | 'never'; disassemblyView: { showSourceCode: boolean; - } + }; } export interface IGlobalConfig { @@ -681,7 +680,7 @@ export interface ICompound { name: string; stopAll?: boolean; preLaunchTask?: string | TaskIdentifier; - configurations: (string | { name: string, folder: string })[]; + configurations: (string | { name: string; folder: string })[]; presentation?: IConfigPresentation; } @@ -767,6 +766,17 @@ export interface IDebuggerContribution extends IPlatformSpecificAdapterContribut when?: string; } +export enum DebugConfigurationProviderTriggerKind { + /** + * `DebugConfigurationProvider.provideDebugConfigurations` is called to provide the initial debug configurations for a newly created launch.json. + */ + Initial = 1, + /** + * `DebugConfigurationProvider.provideDebugConfigurations` is called to provide dynamically generated debug configurations when the user asks for them through the UI (e.g. via the "Select and Start Debugging" command). + */ + Dynamic = 2 +} + export interface IDebugConfigurationProvider { readonly type: string; readonly triggerKind: DebugConfigurationProviderTriggerKind; @@ -806,9 +816,9 @@ export interface IConfigurationManager { getLaunches(): ReadonlyArray; getLaunch(workspaceUri: uri | undefined): ILaunch | undefined; - getAllConfigurations(): { launch: ILaunch, name: string, presentation?: IConfigPresentation }[]; + getAllConfigurations(): { launch: ILaunch; name: string; presentation?: IConfigPresentation }[]; removeRecentDynamicConfigurations(name: string, type: string): void; - getRecentDynamicConfigurations(): { name: string, type: string }[]; + getRecentDynamicConfigurations(): { name: string; type: string }[]; /** * Allows to register on change of selected debug configuration. @@ -816,7 +826,7 @@ export interface IConfigurationManager { onDidSelectConfiguration: Event; hasDebugConfigurationProvider(debugType: string): boolean; - getDynamicProviders(): Promise<{ label: string, type: string, pick: () => Promise<{ launch: ILaunch, config: IConfig } | undefined> }[]>; + getDynamicProviders(): Promise<{ label: string; type: string; pick: () => Promise<{ launch: ILaunch; config: IConfig } | undefined> }[]>; registerDebugConfigurationProvider(debugConfigurationProvider: IDebugConfigurationProvider): IDisposable; unregisterDebugConfigurationProvider(debugConfigurationProvider: IDebugConfigurationProvider): void; @@ -886,7 +896,7 @@ export interface ILaunch { /** * Opens the launch.json file. Creates if it does not exist. */ - openConfigFile(preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditorPane | null, created: boolean }>; + openConfigFile(preserveFocus: boolean, type?: string, token?: CancellationToken): Promise<{ editor: IEditorPane | null; created: boolean }>; } // Debug service interfaces @@ -980,7 +990,7 @@ export interface IDebugService { * Updates an already existing function breakpoint. * Notifies debug adapter of breakpoint changes. */ - updateFunctionBreakpoint(id: string, update: { name?: string, hitCondition?: string, condition?: string }): Promise; + updateFunctionBreakpoint(id: string, update: { name?: string; hitCondition?: string; condition?: string }): Promise; /** * Removes all function breakpoints. If id is passed only removes the function breakpoint with the passed id. @@ -1046,7 +1056,7 @@ export interface IDebugService { * Also saves all files, manages if compounds are present in the configuration * and resolveds configurations via DebugConfigurationProviders. * - * Returns true if the start debugging was successfull. For compound launches, all configurations have to start successfuly for it to return success. + * Returns true if the start debugging was successful. For compound launches, all configurations have to start successfully for it to return success. * On errors the startDebugging will throw an error, however some error and cancelations are handled and in that case will simply return false. */ startDebugging(launch: ILaunch | undefined, configOrName?: IConfig | string, options?: IDebugSessionOptions, saveBeforeStart?: boolean): Promise; diff --git a/src/vs/workbench/contrib/debug/common/debugContentProvider.ts b/src/vs/workbench/contrib/debug/common/debugContentProvider.ts index 0ddee28e990..772193c7f16 100644 --- a/src/vs/workbench/contrib/debug/common/debugContentProvider.ts +++ b/src/vs/workbench/contrib/debug/common/debugContentProvider.ts @@ -8,7 +8,7 @@ import { localize } from 'vs/nls'; import { getMimeTypes } from 'vs/editor/common/services/languagesAssociations'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { DEBUG_SCHEME, IDebugService, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; diff --git a/src/vs/workbench/contrib/debug/common/debugModel.ts b/src/vs/workbench/contrib/debug/common/debugModel.ts index 3fd47ea1867..a6bc155cb17 100644 --- a/src/vs/workbench/contrib/debug/common/debugModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugModel.ts @@ -598,7 +598,7 @@ export class Thread implements IThread { export const getUriForDebugMemory = ( sessionId: string, memoryReference: string, - range?: { fromOffset: number, toOffset: number }, + range?: { fromOffset: number; toOffset: number }, displayName = 'memory' ) => { return URI.from({ @@ -696,7 +696,7 @@ interface IBreakpointSessionData extends DebugProtocol.Breakpoint { supportsLogPoints: boolean; supportsFunctionBreakpoints: boolean; supportsDataBreakpoints: boolean; - supportsInstructionBreakpoints: boolean + supportsInstructionBreakpoints: boolean; sessionId: string; } @@ -867,7 +867,7 @@ export class Breakpoint extends BaseBreakpoint implements IBreakpoint { return this.verified && this.data ? this.data.endColumn : undefined; } - get sessionAgnosticData(): { lineNumber: number, column: number | undefined } { + get sessionAgnosticData(): { lineNumber: number; column: number | undefined } { return { lineNumber: this._lineNumber, column: this._column @@ -1193,7 +1193,7 @@ export class DebugModel implements IDebugModel { } } - fetchCallStack(thread: Thread): { topCallStack: Promise, wholeCallStack: Promise } { + fetchCallStack(thread: Thread): { topCallStack: Promise; wholeCallStack: Promise } { if (thread.session.capabilities.supportsDelayedStackTraceLoading) { // For improved performance load the first stack frame and then load the rest async. let topCallStack = Promise.resolve(); @@ -1229,7 +1229,7 @@ export class DebugModel implements IDebugModel { return { wholeCallStack, topCallStack: wholeCallStack }; } - getBreakpoints(filter?: { uri?: uri, lineNumber?: number, column?: number, enabledOnly?: boolean }): IBreakpoint[] { + getBreakpoints(filter?: { uri?: uri; lineNumber?: number; column?: number; enabledOnly?: boolean }): IBreakpoint[] { if (filter) { const uriStr = filter.uri ? filter.uri.toString() : undefined; return this.breakpoints.filter(bp => { @@ -1471,7 +1471,7 @@ export class DebugModel implements IDebugModel { return newFunctionBreakpoint; } - updateFunctionBreakpoint(id: string, update: { name?: string, hitCondition?: string, condition?: string }): void { + updateFunctionBreakpoint(id: string, update: { name?: string; hitCondition?: string; condition?: string }): void { const functionBreakpoint = this.functionBreakpoints.find(fbp => fbp.getId() === id); if (functionBreakpoint) { if (typeof update.name === 'string') { diff --git a/src/vs/workbench/contrib/debug/common/debugSource.ts b/src/vs/workbench/contrib/debug/common/debugSource.ts index d7b43b14248..ba2495306d2 100644 --- a/src/vs/workbench/contrib/debug/common/debugSource.ts +++ b/src/vs/workbench/contrib/debug/common/debugSource.ts @@ -86,7 +86,7 @@ export class Source { }, sideBySide ? SIDE_GROUP : ACTIVE_GROUP); } - static getEncodedDebugData(modelUri: URI): { name: string, path: string, sessionId?: string, sourceReference?: number } { + static getEncodedDebugData(modelUri: URI): { name: string; path: string; sessionId?: string; sourceReference?: number } { let path: string; let sourceReference: number | undefined; let sessionId: string | undefined; diff --git a/src/vs/workbench/contrib/debug/common/debugStorage.ts b/src/vs/workbench/contrib/debug/common/debugStorage.ts index e08e0730447..53ba25115bd 100644 --- a/src/vs/workbench/contrib/debug/common/debugStorage.ts +++ b/src/vs/workbench/contrib/debug/common/debugStorage.ts @@ -80,7 +80,7 @@ export class DebugStorage { loadWatchExpressions(): Expression[] { let result: Expression[] | undefined; try { - result = JSON.parse(this.storageService.get(DEBUG_WATCH_EXPRESSIONS_KEY, StorageScope.WORKSPACE, '[]')).map((watchStoredData: { name: string, id: string }) => { + result = JSON.parse(this.storageService.get(DEBUG_WATCH_EXPRESSIONS_KEY, StorageScope.WORKSPACE, '[]')).map((watchStoredData: { name: string; id: string }) => { return new Expression(watchStoredData.name, watchStoredData.id); }); } catch (e) { } diff --git a/src/vs/workbench/contrib/debug/common/debugUtils.ts b/src/vs/workbench/contrib/debug/common/debugUtils.ts index 8fefc6931d2..6b58a993556 100644 --- a/src/vs/workbench/contrib/debug/common/debugUtils.ts +++ b/src/vs/workbench/contrib/debug/common/debugUtils.ts @@ -72,7 +72,7 @@ export function isDebuggerMainContribution(dbg: IDebuggerContribution) { return dbg.type && (dbg.label || dbg.program || dbg.runtime); } -export function getExactExpressionStartAndEnd(lineContent: string, looseStart: number, looseEnd: number): { start: number, end: number } { +export function getExactExpressionStartAndEnd(lineContent: string, looseStart: number, looseEnd: number): { start: number; end: number } { let matchingExpression: string | undefined = undefined; let startOffset = 0; @@ -257,6 +257,14 @@ function convertPaths(msg: DebugProtocol.ProtocolMessage, fixSourcePath: (toDA: case 'setBreakpoints': (response).body.breakpoints.forEach(bp => fixSourcePath(false, bp.source)); break; + case 'disassemble': + { + const di = response; + if (di.body) { + di.body.instructions.forEach(di => fixSourcePath(false, di.location)); + } + } + break; default: break; } diff --git a/src/vs/workbench/contrib/debug/common/debugViewModel.ts b/src/vs/workbench/contrib/debug/common/debugViewModel.ts index 68bd9a62171..a3b5fa04742 100644 --- a/src/vs/workbench/contrib/debug/common/debugViewModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugViewModel.ts @@ -17,7 +17,7 @@ export class ViewModel implements IViewModel { private _focusedThread: IThread | undefined; private selectedExpression: { expression: IExpression; settingWatch: boolean } | undefined; private readonly _onDidFocusSession = new Emitter(); - private readonly _onDidFocusStackFrame = new Emitter<{ stackFrame: IStackFrame | undefined, explicit: boolean }>(); + private readonly _onDidFocusStackFrame = new Emitter<{ stackFrame: IStackFrame | undefined; explicit: boolean }>(); private readonly _onDidSelectExpression = new Emitter<{ expression: IExpression; settingWatch: boolean } | undefined>(); private readonly _onWillUpdateViews = new Emitter(); private expressionSelectedContextKey!: IContextKey; @@ -103,7 +103,7 @@ export class ViewModel implements IViewModel { return this._onDidFocusSession.event; } - get onDidFocusStackFrame(): Event<{ stackFrame: IStackFrame | undefined, explicit: boolean }> { + get onDidFocusStackFrame(): Event<{ stackFrame: IStackFrame | undefined; explicit: boolean }> { return this._onDidFocusStackFrame.event; } diff --git a/src/vs/workbench/contrib/debug/common/replModel.ts b/src/vs/workbench/contrib/debug/common/replModel.ts index 59b388ccabf..f3ae6c3098d 100644 --- a/src/vs/workbench/contrib/debug/common/replModel.ts +++ b/src/vs/workbench/contrib/debug/common/replModel.ts @@ -289,7 +289,7 @@ export class ReplModel { this._onDidChangeElements.fire(); } - logToRepl(session: IDebugSession, sev: severity, args: any[], frame?: { uri: URI, line: number, column: number }) { + logToRepl(session: IDebugSession, sev: severity, args: any[], frame?: { uri: URI; line: number; column: number }) { let source: IReplElementSource | undefined; if (frame) { diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index 4950fb63148..d25efaffb6e 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -4,13 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import * as platform from 'vs/base/common/platform'; import { getDriveLetter } from 'vs/base/common/extpath'; -import { LinuxExternalTerminalService, MacExternalTerminalService, WindowsExternalTerminalService } from 'vs/platform/externalTerminal/node/externalTerminalService'; -import { IExternalTerminalService } from 'vs/platform/externalTerminal/common/externalTerminal'; -import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; - - +import * as platform from 'vs/base/common/platform'; function spawnAsPromised(command: string, args: string[]): Promise { return new Promise((resolve, reject) => { @@ -30,24 +25,6 @@ function spawnAsPromised(command: string, args: string[]): Promise { }); } -let externalTerminalService: IExternalTerminalService | undefined = undefined; - -export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, configProvider: ExtHostConfigProvider): Promise { - if (!externalTerminalService) { - if (platform.isWindows) { - externalTerminalService = new WindowsExternalTerminalService(); - } else if (platform.isMacintosh) { - externalTerminalService = new MacExternalTerminalService(); - } else if (platform.isLinux) { - externalTerminalService = new LinuxExternalTerminalService(); - } else { - throw new Error('external terminals not supported on this platform'); - } - } - const config = configProvider.getConfiguration('terminal'); - return externalTerminalService.runInTerminal(args.title!, args.cwd, args.args, args.env || {}, config.external || {}); -} - export async function hasChildProcesses(processId: number | undefined): Promise { if (processId) { @@ -79,7 +56,7 @@ export async function hasChildProcesses(processId: number | undefined): Promise< const enum ShellType { cmd, powershell, bash } -export function prepareCommand(shell: string, args: string[], cwd?: string, env?: { [key: string]: string | null; }): string { +export function prepareCommand(shell: string, args: string[], cwd?: string, env?: { [key: string]: string | null }): string { shell = shell.trim().toLowerCase(); 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 13dfdda0955..dfa763ce7cf 100644 --- a/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts @@ -41,7 +41,7 @@ export function createMockSession(model: DebugModel, name = 'mockSession', optio } as IDebugService, undefined!, undefined!, new TestConfigurationService({ debug: { console: { collapseIdenticalLines: true } } }), undefined!, mockWorkspaceContextService, undefined!, undefined!, undefined!, mockUriIdentityService, new TestInstantiationService(), undefined!, undefined!); } -function createTwoStackFrames(session: DebugSession): { firstStackFrame: StackFrame, secondStackFrame: StackFrame } { +function createTwoStackFrames(session: DebugSession): { firstStackFrame: StackFrame; secondStackFrame: StackFrame } { const thread = new class extends Thread { public override getCallStack(): StackFrame[] { return [firstStackFrame, secondStackFrame]; 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 b3a85c56259..f551035fd81 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts @@ -38,7 +38,7 @@ suite('Debug - ANSI Handling', () => { const instantiationService: TestInstantiationService = workbenchInstantiationService(undefined, disposables); linkDetector = instantiationService.createInstance(LinkDetector); - const colors: { [id: string]: string; } = {}; + const colors: { [id: string]: string } = {}; for (const color in ansiColorMap) { colors[color] = ansiColorMap[color].defaults.dark; } diff --git a/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts b/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts index f95af99c8c8..3e7ed14e6f8 100644 --- a/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts @@ -10,7 +10,7 @@ import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; import { isWindows } from 'vs/base/common/platform'; import { WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { URI } from 'vs/base/common/uri'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { ITunnelService } from 'vs/platform/tunnel/common/tunnel'; import { DisposableStore } from 'vs/base/common/lifecycle'; suite('Debug - Link Detector', () => { diff --git a/src/vs/workbench/contrib/debug/test/browser/mockDebug.ts b/src/vs/workbench/contrib/debug/test/browser/mockDebug.ts index af18ed46c5c..ff77730fe35 100644 --- a/src/vs/workbench/contrib/debug/test/browser/mockDebug.ts +++ b/src/vs/workbench/contrib/debug/test/browser/mockDebug.ts @@ -105,7 +105,7 @@ export class MockDebugService implements IDebugService { moveWatchExpression(id: string, position: number): void { } - updateFunctionBreakpoint(id: string, update: { name?: string, hitCondition?: string, condition?: string }): Promise { + updateFunctionBreakpoint(id: string, update: { name?: string; hitCondition?: string; condition?: string }): Promise { throw new Error('not implemented'); } @@ -194,7 +194,7 @@ export class MockSession implements IDebugSession { return false; } - stepInTargets(frameId: number): Promise<{ id: number; label: string; }[]> { + stepInTargets(frameId: number): Promise<{ id: number; label: string }[]> { throw new Error('Method not implemented.'); } @@ -206,7 +206,7 @@ export class MockSession implements IDebugSession { throw new Error('Method not implemented.'); } - dataBreakpointInfo(name: string, variablesReference?: number | undefined): Promise<{ dataId: string | null; description: string; canPersist?: boolean | undefined; } | undefined> { + dataBreakpointInfo(name: string, variablesReference?: number | undefined): Promise<{ dataId: string | null; description: string; canPersist?: boolean | undefined } | undefined> { throw new Error('Method not implemented.'); } @@ -246,7 +246,7 @@ export class MockSession implements IDebugSession { } appendToRepl(data: string | IExpression, severity: Severity, source?: IReplElementSource): void { } - logToRepl(sev: Severity, args: any[], frame?: { uri: uri; line: number; column: number; }) { } + logToRepl(sev: Severity, args: any[], frame?: { uri: uri; line: number; column: number }) { } configuration: IConfig = { type: 'mock', name: 'mock', request: 'launch' }; unresolvedConfiguration: IConfig = { type: 'mock', name: 'mock', request: 'launch' }; @@ -314,7 +314,7 @@ export class MockSession implements IDebugSession { throw new Error('not implemented'); } - setConfiguration(configuration: { resolved: IConfig, unresolved: IConfig }) { } + setConfiguration(configuration: { resolved: IConfig; unresolved: IConfig }) { } getAllThreads(): IThread[] { return []; 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 d9b6520098c..a31d04c51a3 100644 --- a/src/vs/workbench/contrib/debug/test/browser/repl.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/repl.test.ts @@ -176,7 +176,7 @@ suite('Debug - REPL', () => { model.addSession(session); const adapter = new MockDebugAdapter(); - const raw = new RawDebugSession(adapter, undefined!, '', undefined!, undefined!, undefined!, undefined!, undefined!, undefined!); + const raw = new RawDebugSession(adapter, undefined!, '', undefined!, undefined!, undefined!, undefined!); session.initializeForTest(raw); await session.addReplExpression(undefined, 'before.1'); diff --git a/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts b/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts index 470565e2d7a..57a2abbe29e 100644 --- a/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts @@ -9,13 +9,9 @@ import * as net from 'net'; import * as platform from 'vs/base/common/platform'; import { tmpdir } from 'os'; import { join } from 'vs/base/common/path'; +import * as ports from 'vs/base/node/ports'; import { SocketDebugAdapter, NamedPipeDebugAdapter, StreamDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; -function rndPort(): number { - const min = 8000; - const max = 9000; - return Math.floor(Math.random() * (max - min) + min); -} function sendInitializeRequest(debugAdapter: StreamDebugAdapter): Promise { return new Promise((resolve, reject) => { @@ -48,44 +44,48 @@ function serverConnection(socket: net.Socket) { } suite('Debug - StreamDebugAdapter', () => { - const port = rndPort(); - const pipeName = crypto.randomBytes(10).toString('hex'); - const pipePath = platform.isWindows ? join('\\\\.\\pipe\\', pipeName) : join(tmpdir(), pipeName); - const testCases: { testName: string, debugAdapter: StreamDebugAdapter, connectionDetail: string | number }[] = [ - { - testName: 'NamedPipeDebugAdapter', - debugAdapter: new NamedPipeDebugAdapter({ - type: 'pipeServer', - path: pipePath - }), - connectionDetail: pipePath - }, - { - testName: 'SocketDebugAdapter', - debugAdapter: new SocketDebugAdapter({ - type: 'server', - port - }), - connectionDetail: port - } - ]; + test(`StreamDebugAdapter (NamedPipeDebugAdapter) can initialize a connection`, async () => { - for (const testCase of testCases) { - test(`StreamDebugAdapter (${testCase.testName}) can initialize a connection`, async () => { - const server = net.createServer(serverConnection).listen(testCase.connectionDetail); - const debugAdapter = testCase.debugAdapter; - try { - await debugAdapter.startSession(); - const response: DebugProtocol.Response = await sendInitializeRequest(debugAdapter); - assert.strictEqual(response.command, 'initialize'); - assert.strictEqual(response.request_seq, 1); - assert.strictEqual(response.success, true, response.message); - } finally { - await debugAdapter.stopSession(); - server.close(); - debugAdapter.dispose(); - } + const pipeName = crypto.randomBytes(10).toString('hex'); + const pipePath = platform.isWindows ? join('\\\\.\\pipe\\', pipeName) : join(tmpdir(), pipeName); + const server = net.createServer(serverConnection).listen(pipePath); + const debugAdapter = new NamedPipeDebugAdapter({ + type: 'pipeServer', + path: pipePath }); - } + try { + await debugAdapter.startSession(); + const response: DebugProtocol.Response = await sendInitializeRequest(debugAdapter); + assert.strictEqual(response.command, 'initialize'); + assert.strictEqual(response.request_seq, 1); + assert.strictEqual(response.success, true, response.message); + } finally { + await debugAdapter.stopSession(); + server.close(); + debugAdapter.dispose(); + } + }); + + test(`StreamDebugAdapter (SocketDebugAdapter) can initialize a connection`, async () => { + + const rndPort = Math.floor(Math.random() * 1000 + 8000); + const port = await ports.findFreePort(rndPort, 10 /* try 10 ports */, 3000 /* try up to 3 seconds */, 87 /* skip 87 ports between attempts */); + const server = net.createServer(serverConnection).listen(port); + const debugAdapter = new SocketDebugAdapter({ + type: 'server', + port + }); + try { + await debugAdapter.startSession(); + const response: DebugProtocol.Response = await sendInitializeRequest(debugAdapter); + assert.strictEqual(response.command, 'initialize'); + assert.strictEqual(response.request_seq, 1); + assert.strictEqual(response.success, true, response.message); + } finally { + await debugAdapter.stopSession(); + server.close(); + debugAdapter.dispose(); + } + }); }); diff --git a/src/vs/workbench/contrib/experiments/browser/experimentalPrompt.ts b/src/vs/workbench/contrib/experiments/browser/experimentalPrompt.ts index da48b392a55..a850ee85522 100644 --- a/src/vs/workbench/contrib/experiments/browser/experimentalPrompt.ts +++ b/src/vs/workbench/contrib/experiments/browser/experimentalPrompt.ts @@ -5,7 +5,6 @@ import { INotificationService, Severity, IPromptChoice } from 'vs/platform/notification/common/notification'; import { IExperimentService, IExperiment, ExperimentActionType, IExperimentActionPromptProperties, IExperimentActionPromptCommand, ExperimentState } from 'vs/workbench/contrib/experiments/common/experimentService'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IExtensionsViewPaneContainer, VIEWLET_ID as EXTENSIONS_VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -22,7 +21,6 @@ export class ExperimentalPrompts extends Disposable implements IWorkbenchContrib @IExperimentService private readonly experimentService: IExperimentService, @IPaneCompositePartService private readonly paneCompositeService: IPaneCompositePartService, @INotificationService private readonly notificationService: INotificationService, - @ITelemetryService private readonly telemetryService: ITelemetryService, @IOpenerService private readonly openerService: IOpenerService, @ICommandService private readonly commandService: ICommandService @@ -40,21 +38,6 @@ export class ExperimentalPrompts extends Disposable implements IWorkbenchContrib return; } - const logTelemetry = (commandText?: string) => { - /* __GDPR__ - "experimentalPrompts" : { - "experimentId": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "commandText": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "cancelled": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } - } - */ - this.telemetryService.publicLog('experimentalPrompts', { - experimentId: experiment.id, - commandText, - cancelled: !commandText - }); - }; - const actionProperties = (experiment.action.properties); const promptText = ExperimentalPrompts.getLocalizedText(actionProperties.promptText, language || ''); if (!actionProperties || !promptText) { @@ -69,7 +52,6 @@ export class ExperimentalPrompts extends Disposable implements IWorkbenchContrib return { label: commandText, run: () => { - logTelemetry(commandText); if (command.externalLink) { this.openerService.open(URI.parse(command.externalLink)); } else if (command.curatedExtensionsKey && Array.isArray(command.curatedExtensionsList)) { @@ -92,13 +74,12 @@ export class ExperimentalPrompts extends Disposable implements IWorkbenchContrib this.notificationService.prompt(Severity.Info, promptText, choices, { onCancel: () => { - logTelemetry(); this.experimentService.markAsCompleted(experiment.id); } }); } - static getLocalizedText(text: string | { [key: string]: string; }, displayLanguage: string): string { + static getLocalizedText(text: string | { [key: string]: string }, displayLanguage: string): string { if (typeof text === 'string') { return text; } diff --git a/src/vs/workbench/contrib/experiments/common/experimentService.ts b/src/vs/workbench/contrib/experiments/common/experimentService.ts index 81ec52a88fe..a0d52ac4b52 100644 --- a/src/vs/workbench/contrib/experiments/common/experimentService.ts +++ b/src/vs/workbench/contrib/experiments/common/experimentService.ts @@ -44,7 +44,7 @@ export enum ExperimentActionType { ExtensionSearchResults = 'ExtensionSearchResults' } -export type LocalizedPromptText = { [locale: string]: string; }; +export type LocalizedPromptText = { [locale: string]: string }; export interface IExperimentActionPromptProperties { promptText: string | LocalizedPromptText; @@ -52,7 +52,7 @@ export interface IExperimentActionPromptProperties { } export interface IExperimentActionPromptCommand { - text: string | { [key: string]: string; }; + text: string | { [key: string]: string }; externalLink?: string; curatedExtensionsKey?: string; curatedExtensionsList?: string[]; @@ -105,7 +105,7 @@ interface IRawExperiment { newUser?: boolean; displayLanguage?: string; // Evaluates to true iff all the given user settings are deeply equal - userSetting?: { [key: string]: unknown; }; + userSetting?: { [key: string]: unknown }; // Start the experiment if the number of activation events have happened over the last week: activationEvent?: { event: string | string[]; @@ -237,7 +237,7 @@ export class ExperimentService extends Disposable implements IExperimentService if (context.res.statusCode !== 200) { return null; } - const result = await asJson<{ experiments?: IRawExperiment; }>(context); + const result = await asJson<{ experiments?: IRawExperiment }>(context); return result && Array.isArray(result.experiments) ? result.experiments : []; } catch (_e) { // Bad request or invalid JSON @@ -300,9 +300,9 @@ export class ExperimentService extends Disposable implements IExperimentService const promises = rawExperiments.map(experiment => this.evaluateExperiment(experiment)); return Promise.all(promises).then(() => { type ExperimentsClassification = { - experiments: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + experiments: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; - this.telemetryService.publicLog2<{ experiments: string[]; }, ExperimentsClassification>('experiments', { experiments: this._experiments.map(e => e.id) }); + this.telemetryService.publicLog2<{ experiments: string[] }, ExperimentsClassification>('experiments', { experiments: this._experiments.map(e => e.id) }); }); }); } diff --git a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts index 74119ee2a19..a97d0ace12a 100644 --- a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts +++ b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts @@ -40,7 +40,7 @@ interface ExperimentSettings { state?: ExperimentState; } -let experimentData: { [i: string]: any; } = { +let experimentData: { [i: string]: any } = { experiments: [] }; diff --git a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts index 93490e6e8a8..025369ee34c 100644 --- a/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts +++ b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts @@ -26,7 +26,7 @@ suite('Experimental Prompts', () => { let commandService: TestCommandService; let onExperimentEnabledEvent: Emitter; - let storageData: { [key: string]: any; } = {}; + let storageData: { [key: string]: any } = {}; const promptText = 'Hello there! Can you see this?'; const experiment: IExperiment = { diff --git a/src/vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor.ts b/src/vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor.ts index 6a4e23e9f27..1398da16560 100644 --- a/src/vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor.ts @@ -104,7 +104,7 @@ export abstract class AbstractRuntimeExtensionsEditor extends EditorPane { const extensionsDescriptions = (await this._extensionService.getExtensions()).filter((extension) => { return Boolean(extension.main) || Boolean(extension.browser); }); - let marketplaceMap: { [id: string]: IExtension; } = Object.create(null); + let marketplaceMap: { [id: string]: IExtension } = Object.create(null); const marketPlaceExtensions = await this._extensionsWorkbenchService.queryLocal(); for (let extension of marketPlaceExtensions) { marketplaceMap[ExtensionIdentifier.toKey(extension.identifier.id)] = extension; @@ -113,7 +113,7 @@ export abstract class AbstractRuntimeExtensionsEditor extends EditorPane { let statusMap = this._extensionService.getExtensionsStatus(); // group profile segments by extension - let segments: { [id: string]: number[]; } = Object.create(null); + let segments: { [id: string]: number[] } = Object.create(null); const profileInfo = this._getProfileInfo(); if (profileInfo) { diff --git a/src/vs/workbench/contrib/extensions/browser/dynamicWorkspaceRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/dynamicWorkspaceRecommendations.ts index a94821cd5da..f287d1ebe38 100644 --- a/src/vs/workbench/contrib/extensions/browser/dynamicWorkspaceRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/dynamicWorkspaceRecommendations.ts @@ -16,11 +16,11 @@ import { ExtensionRecommendationReason } from 'vs/workbench/services/extensionRe import { localize } from 'vs/nls'; type DynamicWorkspaceRecommendationsClassification = { - count: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - cache: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + cache: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; -type IStoredDynamicWorkspaceRecommendations = { recommendations: string[], timestamp: number }; +type IStoredDynamicWorkspaceRecommendations = { recommendations: string[]; timestamp: number }; const dynamicWorkspaceRecommendationsStorageKey = 'extensionsAssistant/dynamicWorkspaceRecommendations'; const milliSecondsInADay = 1000 * 60 * 60 * 24; @@ -62,7 +62,7 @@ export class DynamicWorkspaceRecommendations extends ExtensionRecommendations { const cachedDynamicWorkspaceRecommendations = this.getCachedDynamicWorkspaceRecommendations(); if (cachedDynamicWorkspaceRecommendations) { this._recommendations = cachedDynamicWorkspaceRecommendations.map(id => this.toExtensionRecommendation(id, folder)); - this.telemetryService.publicLog2<{ count: number, cache: number }, DynamicWorkspaceRecommendationsClassification>('dynamicWorkspaceRecommendations', { count: this._recommendations.length, cache: 1 }); + this.telemetryService.publicLog2<{ count: number; cache: number }, DynamicWorkspaceRecommendationsClassification>('dynamicWorkspaceRecommendations', { count: this._recommendations.length, cache: 1 }); return; } @@ -82,7 +82,7 @@ export class DynamicWorkspaceRecommendations extends ExtensionRecommendations { if (workspaceTip) { this._recommendations = workspaceTip.recommendations.map(id => this.toExtensionRecommendation(id, folder)); this.storageService.store(dynamicWorkspaceRecommendationsStorageKey, JSON.stringify({ recommendations: workspaceTip.recommendations, timestamp: Date.now() }), StorageScope.WORKSPACE, StorageTarget.MACHINE); - this.telemetryService.publicLog2<{ count: number, cache: number }, DynamicWorkspaceRecommendationsClassification>('dynamicWorkspaceRecommendations', { count: this._recommendations.length, cache: 0 }); + this.telemetryService.publicLog2<{ count: number; cache: number }, DynamicWorkspaceRecommendationsClassification>('dynamicWorkspaceRecommendations', { count: this._recommendations.length, cache: 0 }); return; } } diff --git a/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts index 6bfdcc1c749..6096e57e82a 100644 --- a/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts @@ -24,7 +24,7 @@ export class ExeBasedRecommendations extends ExtensionRecommendations { super(); } - getRecommendations(exe: string): { important: ExtensionRecommendation[], others: ExtensionRecommendation[] } { + getRecommendations(exe: string): { important: ExtensionRecommendation[]; others: ExtensionRecommendation[] } { const important = this._importantTips .filter(tip => tip.exeName.toLowerCase() === exe.toLowerCase()) .map(tip => this.toExtensionRecommendation(tip)); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index 529d21048c2..eacf49efe36 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -55,7 +55,7 @@ import { platform } from 'vs/base/common/process'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { DEFAULT_MARKDOWN_STYLES, renderMarkdownDocument } from 'vs/workbench/contrib/markdown/browser/markdownDocumentRenderer'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { TokenizationRegistry } from 'vs/editor/common/languages'; import { generateTokensCSSForColorMap } from 'vs/editor/common/languages/supports/tokenization'; import { buttonForeground, buttonHoverBackground, editorBackground, textLinkActiveForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; @@ -66,7 +66,7 @@ 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, starEmptyIcon, verifiedPublisherIcon as verifiedPublisherThemeIcon, warningIcon } from 'vs/workbench/contrib/extensions/browser/extensionsIcons'; +import { errorIcon, infoIcon, preReleaseIcon, starEmptyIcon, verifiedPublisherIcon as verifiedPublisherThemeIcon, warningIcon } from 'vs/workbench/contrib/extensions/browser/extensionsIcons'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ViewContainerLocation } from 'vs/workbench/common/views'; @@ -74,8 +74,8 @@ import { IExtensionGalleryService, IGalleryExtension } from 'vs/platform/extensi class NavBar extends Disposable { - private _onChange = this._register(new Emitter<{ id: string | null, focus: boolean; }>()); - get onChange(): Event<{ id: string | null, focus: boolean; }> { return this._onChange.event; } + private _onChange = this._register(new Emitter<{ id: string | null; focus: boolean }>()); + get onChange(): Event<{ id: string | null; focus: boolean }> { return this._onChange.event; } private _currentId: string | null = null; get currentId(): string | null { return this._currentId; } @@ -195,7 +195,9 @@ class PreReleaseTextWidget extends ExtensionWithDifferentGalleryVersionWidget { constructor(container: HTMLElement) { super(); this.element = append(container, $('span.pre-release')); - this.element.textContent = localize('preRelease', "Pre-Release"); + append(this.element, $('span' + ThemeIcon.asCSSSelector(preReleaseIcon))); + const textElement = append(this.element, $('span.pre-release-text')); + textElement.textContent = localize('preRelease', "Pre-Release"); this.render(); } render(): void { @@ -233,7 +235,6 @@ export class ExtensionEditor extends EditorPane { private readonly contentDisposables = this._register(new DisposableStore()); private readonly transientDisposables = this._register(new DisposableStore()); private activeElement: IActiveElement | null = null; - private editorLoadComplete: boolean = false; private dimension: Dimension | undefined; private showPreReleaseVersionContextKey: IContextKey | undefined; @@ -287,10 +288,11 @@ export class ExtensionEditor extends EditorPane { const name = append(title, $('span.name.clickable', { title: localize('name', "Extension name"), role: 'heading', tabIndex: 0 })); const versionWidget = new VersionWidget(title); + const preReleaseWidget = new PreReleaseTextWidget(title); + const preview = append(title, $('span.preview', { title: localize('preview', "Preview") })); preview.textContent = localize('preview', "Preview"); - const preReleaseWidget = new PreReleaseTextWidget(title); const builtin = append(title, $('span.builtin')); builtin.textContent = localize('builtin', "Built-in"); @@ -484,12 +486,11 @@ export class ExtensionEditor extends EditorPane { if (!preRelease && !extension.hasReleaseVersion) { return null; } - return (await this.extensionGalleryService.query({ includePreRelease: preRelease, names: [extension.identifier.id] }, CancellationToken.None)).firstPage[0] || null; + return (await this.extensionGalleryService.getExtensions([{ ...extension.identifier, preRelease, hasPreRelease: extension.hasPreReleaseVersion }], CancellationToken.None))[0] || null; } private async render(extension: IExtension, template: IExtensionEditorTemplate, preserveFocus: boolean): Promise { this.activeElement = null; - this.editorLoadComplete = false; this.transientDisposables.clear(); const token = this.transientDisposables.add(new CancellationTokenSource()).token; @@ -567,7 +568,6 @@ export class ExtensionEditor extends EditorPane { */ this.telemetryService.publicLog('extensionGallery:openExtension', { ...extension.telemetryData, ...recommendationsData }); - this.editorLoadComplete = true; } private renderNavbar(extension: IExtension, manifest: IExtensionManifest | null, template: IExtensionEditorTemplate, preserveFocus: boolean): void { @@ -704,19 +704,7 @@ export class ExtensionEditor extends EditorPane { return this.activeElement as IWebview; } - private onNavbarChange(extension: IExtension, { id, focus }: { id: string | null, focus: boolean; }, template: IExtensionEditorTemplate): void { - if (this.editorLoadComplete) { - /* __GDPR__ - "extensionEditor:navbarChange" : { - "navItem": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "${include}": [ - "${GalleryExtensionTelemetryData}" - ] - } - */ - this.telemetryService.publicLog('extensionEditor:navbarChange', { ...extension.telemetryData, navItem: id }); - } - + private onNavbarChange(extension: IExtension, { id, focus }: { id: string | null; focus: boolean }, template: IExtensionEditorTemplate): void { this.contentDisposables.clear(); template.content.innerText = ''; this.activeElement = null; @@ -1005,7 +993,7 @@ export class ExtensionEditor extends EditorPane { private renderMoreInfo(container: HTMLElement, extension: IExtension): void { const gallery = extension.gallery; const moreInfoContainer = append(container, $('.more-info-container')); - append(moreInfoContainer, $('.additional-details-title', undefined, localize('more info', "More Info"))); + append(moreInfoContainer, $('.additional-details-title', undefined, localize('Marketplace Info', "Marketplace Info"))); const moreInfo = append(moreInfoContainer, $('.more-info')); if (gallery) { append(moreInfo, @@ -1302,7 +1290,7 @@ export class ExtensionEditor extends EditorPane { let viewContainersForLocation: IViewContainer[] = contrib[location]; result.push(...viewContainersForLocation.map(viewContainer => ({ ...viewContainer, location }))); return result; - }, [] as Array<{ id: string, title: string, location: string; }>); + }, [] as Array<{ id: string; title: string; location: string }>); if (!viewContainers.length) { return false; @@ -1327,7 +1315,7 @@ export class ExtensionEditor extends EditorPane { let viewsForLocation: IView[] = contrib[location]; result.push(...viewsForLocation.map(view => ({ ...view, location }))); return result; - }, [] as Array<{ id: string, name: string, location: string; }>); + }, [] as Array<{ id: string; name: string; location: string }>); if (!views.length) { return false; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts index af779934e38..4e95edf7f9e 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts @@ -27,13 +27,13 @@ import { EnablementState, IWorkbenchExtensionManagementService, IWorkbenchExtens import { IExtensionIgnoredRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; type ExtensionRecommendationsNotificationClassification = { - userReaction: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - extensionId?: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight'; }; - source: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + extensionId?: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type ExtensionWorkspaceRecommendationsNotificationClassification = { - userReaction: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; const ignoreImportantExtensionRecommendationStorageKey = 'extensionsAssistant/importantRecommendationsIgnore'; @@ -104,8 +104,8 @@ class RecommendationsNotification { } } -type PendingRecommendationsNotification = { recommendationsNotification: RecommendationsNotification, source: RecommendationSource, token: CancellationToken; }; -type VisibleRecommendationsNotification = { recommendationsNotification: RecommendationsNotification, source: RecommendationSource, from: number; }; +type PendingRecommendationsNotification = { recommendationsNotification: RecommendationsNotification; source: RecommendationSource; token: CancellationToken }; +type VisibleRecommendationsNotification = { recommendationsNotification: RecommendationsNotification; source: RecommendationSource; from: number }; export class ExtensionRecommendationNotificationService implements IExtensionRecommendationNotificationService { @@ -138,7 +138,7 @@ export class ExtensionRecommendationNotificationService implements IExtensionRec ) { } hasToIgnoreRecommendationNotifications(): boolean { - const config = this.configurationService.getValue<{ ignoreRecommendations: boolean, showRecommendationsOnlyOnDemand?: boolean; }>('extensions'); + const config = this.configurationService.getValue<{ ignoreRecommendations: boolean; showRecommendationsOnlyOnDemand?: boolean }>('extensions'); return config.ignoreRecommendations || !!config.showRecommendationsOnlyOnDemand; } @@ -150,13 +150,13 @@ export class ExtensionRecommendationNotificationService implements IExtensionRec } return this.promptRecommendationsNotification(extensionIds, message, searchValue, source, { - onDidInstallRecommendedExtensions: (extensions: IExtension[]) => extensions.forEach(extension => this.telemetryService.publicLog2<{ userReaction: string, extensionId: string, source: string; }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'install', extensionId: extension.identifier.id, source: RecommendationSourceToString(source) })), - onDidShowRecommendedExtensions: (extensions: IExtension[]) => extensions.forEach(extension => this.telemetryService.publicLog2<{ userReaction: string, extensionId: string, source: string; }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'show', extensionId: extension.identifier.id, source: RecommendationSourceToString(source) })), - onDidCancelRecommendedExtensions: (extensions: IExtension[]) => extensions.forEach(extension => this.telemetryService.publicLog2<{ userReaction: string, extensionId: string, source: string; }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'cancelled', extensionId: extension.identifier.id, source: RecommendationSourceToString(source) })), + onDidInstallRecommendedExtensions: (extensions: IExtension[]) => extensions.forEach(extension => this.telemetryService.publicLog2<{ userReaction: string; extensionId: string; source: string }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'install', extensionId: extension.identifier.id, source: RecommendationSourceToString(source) })), + onDidShowRecommendedExtensions: (extensions: IExtension[]) => extensions.forEach(extension => this.telemetryService.publicLog2<{ userReaction: string; extensionId: string; source: string }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'show', extensionId: extension.identifier.id, source: RecommendationSourceToString(source) })), + onDidCancelRecommendedExtensions: (extensions: IExtension[]) => extensions.forEach(extension => this.telemetryService.publicLog2<{ userReaction: string; extensionId: string; source: string }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'cancelled', extensionId: extension.identifier.id, source: RecommendationSourceToString(source) })), onDidNeverShowRecommendedExtensionsAgain: (extensions: IExtension[]) => { for (const extension of extensions) { this.addToImportantRecommendationsIgnore(extension.identifier.id); - this.telemetryService.publicLog2<{ userReaction: string, extensionId: string, source: string; }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'neverShowAgain', extensionId: extension.identifier.id, source: RecommendationSourceToString(source) }); + this.telemetryService.publicLog2<{ userReaction: string; extensionId: string; source: string }, ExtensionRecommendationsNotificationClassification>('extensionRecommendations:popup', { userReaction: 'neverShowAgain', extensionId: extension.identifier.id, source: RecommendationSourceToString(source) }); } this.notificationService.prompt( Severity.Info, @@ -187,10 +187,10 @@ export class ExtensionRecommendationNotificationService implements IExtensionRec const message = (extensions: IExtension[]) => extensions.length === 1 ? localize('singleExtensionRecommended', "'{0}' extension is recommended for this repository. Do you want to install?", extensions[0].displayName) : localize('workspaceRecommended', "Do you want to install the recommended extensions for this repository?"); const result = await this.promptRecommendationsNotification(recommendations, message, '@recommended ', RecommendationSource.WORKSPACE, { - onDidInstallRecommendedExtensions: () => this.telemetryService.publicLog2<{ userReaction: string; }, ExtensionWorkspaceRecommendationsNotificationClassification>('extensionWorkspaceRecommendations:popup', { userReaction: 'install' }), - onDidShowRecommendedExtensions: () => this.telemetryService.publicLog2<{ userReaction: string; }, ExtensionWorkspaceRecommendationsNotificationClassification>('extensionWorkspaceRecommendations:popup', { userReaction: 'show' }), - onDidCancelRecommendedExtensions: () => this.telemetryService.publicLog2<{ userReaction: string; }, ExtensionWorkspaceRecommendationsNotificationClassification>('extensionWorkspaceRecommendations:popup', { userReaction: 'cancelled' }), - onDidNeverShowRecommendedExtensionsAgain: () => this.telemetryService.publicLog2<{ userReaction: string; }, ExtensionWorkspaceRecommendationsNotificationClassification>('extensionWorkspaceRecommendations:popup', { userReaction: 'neverShowAgain' }), + onDidInstallRecommendedExtensions: () => this.telemetryService.publicLog2<{ userReaction: string }, ExtensionWorkspaceRecommendationsNotificationClassification>('extensionWorkspaceRecommendations:popup', { userReaction: 'install' }), + onDidShowRecommendedExtensions: () => this.telemetryService.publicLog2<{ userReaction: string }, ExtensionWorkspaceRecommendationsNotificationClassification>('extensionWorkspaceRecommendations:popup', { userReaction: 'show' }), + onDidCancelRecommendedExtensions: () => this.telemetryService.publicLog2<{ userReaction: string }, ExtensionWorkspaceRecommendationsNotificationClassification>('extensionWorkspaceRecommendations:popup', { userReaction: 'cancelled' }), + onDidNeverShowRecommendedExtensionsAgain: () => this.telemetryService.publicLog2<{ userReaction: string }, ExtensionWorkspaceRecommendationsNotificationClassification>('extensionWorkspaceRecommendations:popup', { userReaction: 'neverShowAgain' }), }); if (result === RecommendationsNotificationResult.Accepted) { @@ -386,16 +386,16 @@ export class ExtensionRecommendationNotificationService implements IExtensionRec } private async getInstallableExtensions(extensionIds: string[]): Promise { - const extensions: IExtension[] = []; + const result: IExtension[] = []; if (extensionIds.length) { - const pager = await this.extensionsWorkbenchService.queryGallery({ names: extensionIds, pageSize: extensionIds.length, source: 'install-recommendations' }, CancellationToken.None); - for (const extension of pager.firstPage) { + const extensions = await this.extensionsWorkbenchService.getExtensions(extensionIds.map(id => ({ id })), { source: 'install-recommendations' }, CancellationToken.None); + for (const extension of extensions) { if (extension.gallery && (await this.extensionManagementService.canInstall(extension.gallery))) { - extensions.push(extension); + result.push(extension); } } } - return extensions; + return result; } private async runAction(action: IAction): Promise { diff --git a/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.ts index 5c6ee68a963..f0689931970 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.ts @@ -7,7 +7,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IExtensionRecommendationReson } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; export type ExtensionRecommendation = { - readonly extensionId: string, + readonly extensionId: string; readonly reason: IExtensionRecommendationReson; }; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts index 86ae3033312..77078e13a0e 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts @@ -27,8 +27,8 @@ import { URI } from 'vs/base/common/uri'; import { WebRecommendations } from 'vs/workbench/contrib/extensions/browser/webRecommendations'; type IgnoreRecommendationClassification = { - recommendationReason: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - extensionId: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + recommendationReason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; }; export class ExtensionRecommendationsService extends Disposable implements IExtensionRecommendationsService { @@ -107,12 +107,12 @@ export class ExtensionRecommendationsService extends Disposable implements IExte if (!isRecommended) { const reason = this.getAllRecommendationsWithReason()[extensionId]; if (reason && reason.reasonId) { - this.telemetryService.publicLog2<{ extensionId: string, recommendationReason: ExtensionRecommendationReason }, IgnoreRecommendationClassification>('extensionsRecommendations:ignoreRecommendation', { extensionId, recommendationReason: reason.reasonId }); + this.telemetryService.publicLog2<{ extensionId: string; recommendationReason: ExtensionRecommendationReason }, IgnoreRecommendationClassification>('extensionsRecommendations:ignoreRecommendation', { extensionId, recommendationReason: reason.reasonId }); } } })); - await this.promptWorkspaceRecommendations(); + this.promptWorkspaceRecommendations(); } private isEnabled(): boolean { @@ -123,11 +123,11 @@ export class ExtensionRecommendationsService extends Disposable implements IExte await Promise.all([this.dynamicWorkspaceRecommendations.activate(), this.exeBasedRecommendations.activate(), this.configBasedRecommendations.activate()]); } - getAllRecommendationsWithReason(): { [id: string]: { reasonId: ExtensionRecommendationReason, reasonText: string }; } { + getAllRecommendationsWithReason(): { [id: string]: { reasonId: ExtensionRecommendationReason; reasonText: string } } { /* Activate proactive recommendations */ this.activateProactiveRecommendations(); - const output: { [id: string]: { reasonId: ExtensionRecommendationReason, reasonText: string }; } = Object.create(null); + const output: { [id: string]: { reasonId: ExtensionRecommendationReason; reasonText: string } } = Object.create(null); const allRecommendations = [ ...this.dynamicWorkspaceRecommendations.recommendations, @@ -150,7 +150,7 @@ export class ExtensionRecommendationsService extends Disposable implements IExte return output; } - async getConfigBasedRecommendations(): Promise<{ important: string[], others: string[] }> { + async getConfigBasedRecommendations(): Promise<{ important: string[]; others: string[] }> { await this.configBasedRecommendations.activate(); return { important: this.toExtensionRecommendations(this.configBasedRecommendations.importantRecommendations), @@ -211,7 +211,7 @@ export class ExtensionRecommendationsService extends Disposable implements IExte return this.toExtensionRecommendations(this.workspaceRecommendations.recommendations); } - async getExeBasedRecommendations(exe?: string): Promise<{ important: string[], others: string[] }> { + async getExeBasedRecommendations(exe?: string): Promise<{ important: string[]; others: string[] }> { await this.exeBasedRecommendations.activate(); const { important, others } = exe ? this.exeBasedRecommendations.getRecommendations(exe) : { important: this.exeBasedRecommendations.importantRecommendations, others: this.exeBasedRecommendations.otherRecommendations }; diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index bed8a3cbae1..86f6c74b06e 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -8,7 +8,7 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { Registry } from 'vs/platform/registry/common/platform'; import { MenuRegistry, MenuId, registerAction2, Action2, ISubmenuItem, IMenuItem, IAction2Options } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ExtensionsLabel, ExtensionsLocalizedLabel, ExtensionsChannelId, IExtensionManagementService, IExtensionGalleryService, PreferencesLocalizedLabel, InstallOperation, InstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { ExtensionsLabel, ExtensionsLocalizedLabel, ExtensionsChannelId, IExtensionManagementService, IExtensionGalleryService, PreferencesLocalizedLabel, InstallOperation, InstallOptions, getIdAndVersion } from 'vs/platform/extensionManagement/common/extensionManagement'; import { EnablementState, IExtensionManagementServerService, IWorkbenchExtensionEnablementService, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; @@ -41,19 +41,18 @@ import { IQuickAccessRegistry, Extensions } from 'vs/platform/quickinput/common/ import { InstallExtensionQuickAccessProvider, ManageExtensionsQuickAccessProvider } from 'vs/workbench/contrib/extensions/browser/extensionsQuickAccess'; import { ExtensionRecommendationsService } from 'vs/workbench/contrib/extensions/browser/extensionRecommendationsService'; import { CONTEXT_SYNC_ENABLEMENT } from 'vs/workbench/services/userDataSync/common/userDataSync'; -import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/clipboard'; +import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/browser/clipboard'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { MultiCommand } from 'vs/editor/browser/editorExtensions'; import { IWebview } from 'vs/workbench/contrib/webview/browser/webview'; import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService'; -import { WorkbenchStateContext } from 'vs/workbench/browser/contextkeys'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { IExtensionRecommendationNotificationService } from 'vs/platform/extensionRecommendations/common/extensionRecommendations'; import { ExtensionRecommendationNotificationService } from 'vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService'; import { IExtensionService, toExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey, WorkbenchStateContext } from 'vs/workbench/common/contextkeys'; import { IAction } from 'vs/base/common/actions'; import { IWorkspaceExtensionsConfigService } from 'vs/workbench/services/extensionRecommendations/common/workspaceExtensionsConfig'; import { Schemas } from 'vs/base/common/network'; @@ -244,9 +243,9 @@ CommandsRegistry.registerCommand('extension.open', async (accessor: ServicesAcce const extensionService = accessor.get(IExtensionsWorkbenchService); const commandService = accessor.get(ICommandService); - const pager = await extensionService.queryGallery({ names: [extensionId], pageSize: 1 }, CancellationToken.None); - if (pager.total === 1) { - return extensionService.open(pager.firstPage[0], { tab }); + const [extension] = await extensionService.getExtensions([{ id: extensionId }], CancellationToken.None); + if (extension) { + return extensionService.open(extension, { tab }); } return commandService.executeCommand('_extensions.manage', extensionId, tab); @@ -290,24 +289,29 @@ CommandsRegistry.registerCommand({ } ] }, - handler: async (accessor, arg: string | UriComponents, options?: { installOnlyNewlyAddedFromExtensionPackVSIX?: boolean, installPreReleaseVersion?: boolean, donotSync?: boolean }) => { - const extensionManagementService = accessor.get(IExtensionManagementService); - const extensionGalleryService = accessor.get(IExtensionGalleryService); + handler: async (accessor, arg: string | UriComponents, options?: { installOnlyNewlyAddedFromExtensionPackVSIX?: boolean; installPreReleaseVersion?: boolean; donotSync?: boolean }) => { + const extensionsWorkbenchService = accessor.get(IExtensionsWorkbenchService); try { if (typeof arg === 'string') { - const [extension] = await extensionGalleryService.getExtensions([{ id: arg }], CancellationToken.None); + const [id, version] = getIdAndVersion(arg); + const [extension] = await extensionsWorkbenchService.getExtensions([{ id, preRelease: options?.installPreReleaseVersion }], CancellationToken.None); if (extension) { const installOptions: InstallOptions = { isMachineScoped: options?.donotSync ? true : undefined, /* do not allow syncing extensions automatically while installing through the command */ - installPreReleaseVersion: options?.installPreReleaseVersion + installPreReleaseVersion: options?.installPreReleaseVersion, + installGivenVersion: !!version }; - await extensionManagementService.installFromGallery(extension, installOptions); + if (version) { + await extensionsWorkbenchService.installVersion(extension, version, installOptions); + } else { + await extensionsWorkbenchService.install(extension, installOptions); + } } else { throw new Error(localize('notFound', "Extension '{0}' not found.", arg)); } } else { const vsix = URI.revive(arg); - await extensionManagementService.install(vsix, { installOnlyNewlyAddedFromExtensionPack: options?.installOnlyNewlyAddedFromExtensionPackVSIX }); + await extensionsWorkbenchService.install(vsix, { installOnlyNewlyAddedFromExtensionPack: options?.installOnlyNewlyAddedFromExtensionPackVSIX }); } } catch (e) { onUnexpectedError(e); @@ -1241,7 +1245,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi }, run: async (accessor: ServicesAccessor, extensionId: string) => { const extensionWorkbenchService = accessor.get(IExtensionsWorkbenchService); - const extension = (await extensionWorkbenchService.queryGallery({ names: [extensionId] }, CancellationToken.None)).firstPage[0]; + const extension = (await extensionWorkbenchService.getExtensions([{ id: extensionId }], CancellationToken.None))[0]; extensionWorkbenchService.open(extension, { showPreReleaseVersion: true }); } }); @@ -1256,7 +1260,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi }, run: async (accessor: ServicesAccessor, extensionId: string) => { const extensionWorkbenchService = accessor.get(IExtensionsWorkbenchService); - const extension = (await extensionWorkbenchService.queryGallery({ names: [extensionId] }, CancellationToken.None)).firstPage[0]; + const extension = (await extensionWorkbenchService.getExtensions([{ id: extensionId }], CancellationToken.None))[0]; extensionWorkbenchService.open(extension, { showPreReleaseVersion: false }); } }); @@ -1307,7 +1311,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi run: async (accessor: ServicesAccessor, extensionId: string) => { const clipboardService = accessor.get(IClipboardService); let extension = this.extensionsWorkbenchService.local.filter(e => areSameExtensions(e.identifier, { id: extensionId }))[0] - || (await this.extensionsWorkbenchService.queryGallery({ names: [extensionId], pageSize: 1 }, CancellationToken.None)).firstPage[0]; + || (await this.extensionsWorkbenchService.getExtensions([{ id: extensionId }], CancellationToken.None))[0]; if (extension) { const name = localize('extensionInfoName', 'Name: {0}', extension.displayName); const id = localize('extensionInfoId', 'Id: {0}', extensionId); @@ -1490,7 +1494,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi private registerExtensionAction(extensionActionOptions: IExtensionActionOptions): IDisposable { const menus = extensionActionOptions.menu ? isArray(extensionActionOptions.menu) ? extensionActionOptions.menu : [extensionActionOptions.menu] : []; let menusWithOutTitles: ({ id: MenuId } & Omit)[] = []; - const menusWithTitles: { id: MenuId, item: IMenuItem }[] = []; + const menusWithTitles: { id: MenuId; item: IMenuItem }[] = []; if (extensionActionOptions.menuTitles) { for (let index = 0; index < menus.length; index++) { const menu = menus[index]; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index d020125415a..ddba3be0665 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -17,7 +17,7 @@ import { ExtensionsConfigurationInitialContent } from 'vs/workbench/contrib/exte import { IGalleryExtension, IExtensionGalleryService, ILocalExtension, InstallOptions, InstallOperation, TargetPlatformToString, ExtensionManagementErrorCode } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionRecommendationReason, IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; -import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { areSameExtensions, getExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, ExtensionIdentifier, IExtensionDescription, IExtensionManifest, isLanguagePackExtension, getWorkspaceSupportTypeMessage } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IFileService, IFileContent } from 'vs/platform/files/common/files'; @@ -59,7 +59,7 @@ import { errorIcon, infoIcon, manageExtensionIcon, syncEnabledIcon, syncIgnoredI import { isIOS, isWeb } from 'vs/base/common/platform'; import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; import { IWorkspaceTrustEnablementService, IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; -import { isVirtualWorkspace } from 'vs/platform/remote/common/remoteHosts'; +import { isVirtualWorkspace } from 'vs/platform/workspace/common/virtualWorkspace'; import { escapeMarkdownSyntaxTokens, IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ViewContainerLocation } from 'vs/workbench/common/views'; @@ -286,6 +286,7 @@ export abstract class AbstractInstallAction extends ExtensionAction { if (runningExtension && !(runningExtension.activationEvents && runningExtension.activationEvents.some(activationEent => activationEent.startsWith('onLanguage')))) { const action = await this.getThemeAction(extension); if (action) { + action.extension = extension; try { return action.run({ showCurrentTheme: true, ignoreFocusLost: true }); } finally { @@ -297,7 +298,7 @@ export abstract class AbstractInstallAction extends ExtensionAction { } - private async getThemeAction(extension: IExtension): Promise { + private async getThemeAction(extension: IExtension): Promise { const colorThemes = await this.workbenchThemeService.getColorThemes(); if (colorThemes.some(theme => isThemeFromExtension(theme, extension))) { return this.instantiationService.createInstance(SetColorThemeAction); @@ -828,7 +829,7 @@ export abstract class ExtensionDropDownAction extends ExtensionAction { return this._actionViewItem; } - public override run({ actionGroups, disposeActionsOnHide }: { actionGroups: IAction[][], disposeActionsOnHide: boolean; }): Promise { + public override run({ actionGroups, disposeActionsOnHide }: { actionGroups: IAction[][]; disposeActionsOnHide: boolean }): Promise { if (this._actionViewItem) { this._actionViewItem.showMenu(actionGroups, disposeActionsOnHide); } @@ -1047,7 +1048,9 @@ export class MenuItemExtensionAction extends ExtensionAction { override async run(): Promise { if (this.extension) { - await this.action.run(this.extension.identifier.id); + await this.action.run(this.extension.local ? getExtensionId(this.extension.local.manifest.publisher, this.extension.local.manifest.name) + : this.extension.gallery ? getExtensionId(this.extension.gallery.publisher, this.extension.gallery.name) + : this.extension.identifier.id); } } } @@ -1093,7 +1096,7 @@ export class SwitchToReleasedVersionAction extends ExtensionAction { } update(): void { - this.enabled = !!this.extension && this.extension.state === ExtensionState.Installed && !!this.extension.local?.isPreReleaseVersion && !!this.extension.hasReleaseVersion; + this.enabled = !!this.extension && !this.extension.isBuiltin && this.extension.state === ExtensionState.Installed && !!this.extension.local?.isPreReleaseVersion && !!this.extension.hasReleaseVersion; } override async run(): Promise { @@ -1114,20 +1117,42 @@ export class InstallAnotherVersionAction extends ExtensionAction { @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @IQuickInputService private readonly quickInputService: IQuickInputService, @IInstantiationService private readonly instantiationService: IInstantiationService, + @IDialogService private readonly dialogService: IDialogService, ) { super(InstallAnotherVersionAction.ID, InstallAnotherVersionAction.LABEL, ExtensionAction.LABEL_ACTION_CLASS); this.update(); } update(): void { - this.enabled = !!this.extension && !this.extension.isBuiltin && !!this.extension.gallery && !!this.extension.server && this.extension.state === ExtensionState.Installed; + this.enabled = !!this.extension && !this.extension.isBuiltin && !!this.extension.gallery && !!this.extension.local && !!this.extension.server && this.extension.state === ExtensionState.Installed; } override async run(): Promise { if (!this.enabled) { return; } - const pick = await this.quickInputService.pick(this.getVersionEntries(), { placeHolder: localize('selectVersion', "Select Version to Install"), matchOnDetail: true }); + const targetPlatform = await this.extension!.server!.extensionManagementService.getTargetPlatform(); + const allVersions = await this.extensionGalleryService.getAllCompatibleVersions(this.extension!.gallery!, this.extension!.local!.isPreReleaseVersion, targetPlatform); + if (!allVersions.length) { + await this.dialogService.show(Severity.Info, localize('no versions', "This extension has no other versions.")); + return; + } + + const picks = allVersions.map((v, i) => { + return { + id: v.version, + label: v.version, + description: `${fromNow(new Date(Date.parse(v.date)), true)}${v.isPreReleaseVersion ? ` (${localize('pre-release', "pre-release")})` : ''}${v.version === this.extension!.version ? ` (${localize('current', "current")})` : ''}`, + latest: i === 0, + ariaLabel: `${v.isPreReleaseVersion ? 'Pre-Release version' : 'Release version'} ${v.version}`, + isPreReleaseVersion: v.isPreReleaseVersion + }; + }); + const pick = await this.quickInputService.pick(picks, + { + placeHolder: localize('selectVersion', "Select Version to Install"), + matchOnDetail: true + }); if (pick) { if (this.extension!.version === pick.id) { return; @@ -1145,20 +1170,6 @@ export class InstallAnotherVersionAction extends ExtensionAction { return null; } - private async getVersionEntries(): Promise<(IQuickPickItem & { latest: boolean, id: string, isPreReleaseVersion: boolean; })[]> { - const targetPlatform = await this.extension!.server!.extensionManagementService.getTargetPlatform(); - const allVersions = await this.extensionGalleryService.getAllCompatibleVersions(this.extension!.gallery!, true, targetPlatform); - return allVersions.map((v, i) => { - return { - id: v.version, - label: v.version, - description: `${fromNow(new Date(Date.parse(v.date)), true)}${v.isPreReleaseVersion ? ` (${localize('pre-release', "pre-release")})` : ''}${v.version === this.extension!.version ? ` (${localize('current', "current")})` : ''}`, - latest: i === 0, - ariaLabel: `${v.isPreReleaseVersion ? 'Pre-Release version' : 'Release version'} ${v.version}`, - isPreReleaseVersion: v.isPreReleaseVersion - }; - }); - } } export class EnableForWorkspaceAction extends ExtensionAction { @@ -1544,7 +1555,7 @@ export class SetColorThemeAction extends ExtensionAction { this.class = this.enabled ? SetColorThemeAction.EnabledClass : SetColorThemeAction.DisabledClass; } - override async run({ showCurrentTheme, ignoreFocusLost }: { showCurrentTheme: boolean, ignoreFocusLost: boolean; } = { showCurrentTheme: false, ignoreFocusLost: false }): Promise { + override async run({ showCurrentTheme, ignoreFocusLost }: { showCurrentTheme: boolean; ignoreFocusLost: boolean } = { showCurrentTheme: false, ignoreFocusLost: false }): Promise { this.colorThemes = await this.workbenchThemeService.getColorThemes(); this.update(); @@ -1595,7 +1606,7 @@ export class SetFileIconThemeAction extends ExtensionAction { this.class = this.enabled ? SetFileIconThemeAction.EnabledClass : SetFileIconThemeAction.DisabledClass; } - override async run({ showCurrentTheme, ignoreFocusLost }: { showCurrentTheme: boolean, ignoreFocusLost: boolean; } = { showCurrentTheme: false, ignoreFocusLost: false }): Promise { + override async run({ showCurrentTheme, ignoreFocusLost }: { showCurrentTheme: boolean; ignoreFocusLost: boolean } = { showCurrentTheme: false, ignoreFocusLost: false }): Promise { this.fileIconThemes = await this.workbenchThemeService.getFileIconThemes(); this.update(); if (!this.enabled) { @@ -1645,7 +1656,7 @@ export class SetProductIconThemeAction extends ExtensionAction { this.class = this.enabled ? SetProductIconThemeAction.EnabledClass : SetProductIconThemeAction.DisabledClass; } - override async run({ showCurrentTheme, ignoreFocusLost }: { showCurrentTheme: boolean, ignoreFocusLost: boolean; } = { showCurrentTheme: false, ignoreFocusLost: false }): Promise { + override async run({ showCurrentTheme, ignoreFocusLost }: { showCurrentTheme: boolean; ignoreFocusLost: boolean } = { showCurrentTheme: false, ignoreFocusLost: false }): Promise { this.productIconThemes = await this.workbenchThemeService.getProductIconThemes(); this.update(); if (!this.enabled) { @@ -1683,21 +1694,16 @@ export class ShowRecommendedExtensionAction extends Action { this.extensionId = extensionId; } - override run(): Promise { - return this.paneCompositeService.openPaneComposite(VIEWLET_ID, ViewContainerLocation.Sidebar, true) - .then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer) - .then(viewlet => { - viewlet.search(`@id:${this.extensionId}`); - viewlet.focus(); - return this.extensionWorkbenchService.queryGallery({ names: [this.extensionId], source: 'install-recommendation', pageSize: 1 }, CancellationToken.None) - .then(pager => { - if (pager && pager.firstPage && pager.firstPage.length) { - const extension = pager.firstPage[0]; - return this.extensionWorkbenchService.open(extension); - } - return null; - }); - }); + override async run(): Promise { + const paneComposite = await this.paneCompositeService.openPaneComposite(VIEWLET_ID, ViewContainerLocation.Sidebar, true); + const paneContainer = paneComposite?.getViewPaneContainer() as IExtensionsViewPaneContainer; + paneContainer.search(`@id:${this.extensionId}`); + paneContainer.focus(); + const [extension] = await this.extensionWorkbenchService.getExtensions([{ id: this.extensionId }], { source: 'install-recommendation' }, CancellationToken.None); + if (extension) { + return this.extensionWorkbenchService.open(extension); + } + return null; } } @@ -1723,9 +1729,8 @@ export class InstallRecommendedExtensionAction extends Action { const viewPaneContainer = viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer; viewPaneContainer.search(`@id:${this.extensionId}`); viewPaneContainer.focus(); - const pager = await this.extensionWorkbenchService.queryGallery({ names: [this.extensionId], source: 'install-recommendation', pageSize: 1 }, CancellationToken.None); - if (pager && pager.firstPage && pager.firstPage.length) { - const extension = pager.firstPage[0]; + const [extension] = await this.extensionWorkbenchService.getExtensions([{ id: this.extensionId }], { source: 'install-recommendation' }, CancellationToken.None); + if (extension) { await this.extensionWorkbenchService.open(extension); try { await this.extensionWorkbenchService.install(extension); @@ -1873,7 +1878,7 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio return Promise.resolve(undefined); } - private getOrCreateExtensionsFile(extensionsFileResource: URI): Promise<{ created: boolean, extensionsFileResource: URI, content: string; }> { + private getOrCreateExtensionsFile(extensionsFileResource: URI): Promise<{ created: boolean; extensionsFileResource: URI; content: string }> { return Promise.resolve(this.fileService.readFile(extensionsFileResource)).then(content => { return { created: false, extensionsFileResource, content: content.value.toString() }; }, err => { @@ -2094,7 +2099,7 @@ export class ToggleSyncExtensionAction extends ExtensionDropDownAction { } } -export type ExtensionStatus = { readonly message: IMarkdownString, readonly icon?: ThemeIcon; }; +export type ExtensionStatus = { readonly message: IMarkdownString; readonly icon?: ThemeIcon }; export class ExtensionStatusAction extends ExtensionAction { @@ -2400,7 +2405,7 @@ export class ReinstallAction extends Action { .then(pick => pick && this.reinstallExtension(pick.extension)); } - private getEntries(): Promise<(IQuickPickItem & { extension: IExtension; })[]> { + private getEntries(): Promise<(IQuickPickItem & { extension: IExtension })[]> { return this.extensionsWorkbenchService.queryLocal() .then(local => { const entries = local @@ -2411,7 +2416,7 @@ export class ReinstallAction extends Action { label: extension.displayName, description: extension.identifier.id, extension, - } as (IQuickPickItem & { extension: IExtension; }); + } as (IQuickPickItem & { extension: IExtension }); }); return entries; }); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider.ts b/src/vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider.ts index 72e577dcc51..3f8c429d93f 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider.ts @@ -9,19 +9,21 @@ import { getLocation, parse } from 'vs/base/common/json'; import { Disposable } from 'vs/base/common/lifecycle'; import { Position } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; -import { CompletionContext, CompletionList, CompletionProviderRegistry, CompletionItemKind, CompletionItem } from 'vs/editor/common/languages'; +import { CompletionContext, CompletionList, CompletionItemKind, CompletionItem } from 'vs/editor/common/languages'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { Range } from 'vs/editor/common/core/range'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class ExtensionsCompletionItemsProvider extends Disposable implements IWorkbenchContribution { constructor( @IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); - this._register(CompletionProviderRegistry.register({ language: 'jsonc', pattern: '**/settings.json' }, { + this._register(languageFeaturesService.completionProvider.register({ language: 'jsonc', pattern: '**/settings.json' }, { provideCompletionItems: async (model: ITextModel, position: Position, _context: CompletionContext, token: CancellationToken): Promise => { const getWordRangeAtPosition = (model: ITextModel, position: Position): Range | null => { const wordAtPosition = model.getWordAtPosition(position); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.ts b/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.ts index aeab6457f34..c7c58e35cb8 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.ts @@ -61,7 +61,7 @@ export class ExtensionDependencyChecker extends Disposable implements IWorkbench private async installMissingDependencies(): Promise { const missingDependencies = await this.getUninstalledMissingDependencies(); if (missingDependencies.length) { - const extensions = (await this.extensionsWorkbenchService.queryGallery({ names: missingDependencies, pageSize: missingDependencies.length }, CancellationToken.None)).firstPage; + const extensions = await this.extensionsWorkbenchService.getExtensions(missingDependencies.map(id => ({ id })), CancellationToken.None); if (extensions.length) { await Promises.settled(extensions.map(extension => this.extensionsWorkbenchService.install(extension))); this.notificationService.notify({ diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts b/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts index 5b16e184b3f..85e500f4c07 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsIcons.ts @@ -25,7 +25,7 @@ export const remoteIcon = registerIcon('extensions-remote', Codicon.remote, loca export const installCountIcon = registerIcon('extensions-install-count', Codicon.cloudDownload, localize('installCountIcon', 'Icon shown along with the install count in the extensions view and editor.')); export const ratingIcon = registerIcon('extensions-rating', Codicon.star, localize('ratingIcon', 'Icon shown along with the rating in the extensions view and editor.')); export const verifiedPublisherIcon = registerIcon('extensions-verified-publisher', Codicon.verifiedFilled, localize('verifiedPublisher', 'Icon used for the verified extension publisher in the extensions view and editor.')); -export const preReleaseIcon = registerIcon('extensions-pre-release', Codicon.circleFilled, localize('preReleaseIcon', 'Icon shown for extensions having pre-release versions in extensions view and editor.')); +export const preReleaseIcon = registerIcon('extensions-pre-release', Codicon.versions, localize('preReleaseIcon', 'Icon shown for extensions having pre-release versions in extensions view and editor.')); export const starFullIcon = registerIcon('extensions-star-full', Codicon.starFull, localize('starFullIcon', 'Full star icon used for the rating in the extensions editor.')); export const starHalfIcon = registerIcon('extensions-star-half', Codicon.starHalf, localize('starHalfIcon', 'Half star icon used for the rating in the extensions editor.')); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index 7a91c7bd0de..90d51d12865 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -57,8 +57,8 @@ export class Delegate implements IListVirtualDelegate { export type ExtensionListRendererOptions = { hoverOptions: { - position: () => HoverPosition - } + position: () => HoverPosition; + }; }; export class Renderer implements IPagedRenderer { @@ -90,9 +90,9 @@ export class Renderer implements IPagedRenderer { const name = append(header, $('span.name')); const installCount = append(header, $('span.install-count')); const ratings = append(header, $('span.ratings')); - const preRelease = append(header, $('span.pre-release')); const syncIgnore = append(header, $('span.sync-ignored')); const activationStatus = append(header, $('span.activation-status')); + const preRelease = append(header, $('span.pre-release')); const headerRemoteBadgeWidget = this.instantiationService.createInstance(RemoteBadgeWidget, header, false); const description = append(details, $('.description.ellipsis')); const footer = append(details, $('.footer')); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess.ts b/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess.ts index 6b7585bfda4..13d7d765be4 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess.ts @@ -54,12 +54,11 @@ export class InstallExtensionQuickAccessProvider extends PickerQuickAccessProvid private async getPicksForExtensionId(filter: string, fallback: IPickerQuickAccessItem, token: CancellationToken): Promise> { try { - const galleryResult = await this.galleryService.query({ names: [filter], pageSize: 1 }, token); + const [galleryExtension] = await this.galleryService.getExtensions([{ id: filter }], token); if (token.isCancellationRequested) { return []; // return early if canceled } - const galleryExtension = galleryResult.firstPage[0]; if (!galleryExtension) { return [fallback]; } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts index d26f1fa4f3d..e390f694942 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts @@ -334,8 +334,8 @@ export async function getExtensions(extensions: string[], extensionsWorkbenchSer } } if (toQuery.length) { - const galleryResult = await extensionsWorkbenchService.queryGallery({ names: toQuery, pageSize: toQuery.length }, CancellationToken.None); - result.push(...galleryResult.firstPage); + const galleryResult = await extensionsWorkbenchService.getExtensions(toQuery.map(id => ({ id })), CancellationToken.None); + result.push(...galleryResult); } return result; } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index ec9ea55b738..dffe193a482 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -15,7 +15,7 @@ import { append, $, Dimension, hide, show } from 'vs/base/browser/dom'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, CloseExtensionDetailsOnViewChangeKey, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, DefaultViewsContext, ExtensionsSortByContext, WORKSPACE_RECOMMENDATIONS_VIEW_ID } from '../common/extensions'; +import { IExtensionsWorkbenchService, IExtensionsViewPaneContainer, VIEWLET_ID, CloseExtensionDetailsOnViewChangeKey, INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID, DefaultViewsContext, ExtensionsSortByContext, WORKSPACE_RECOMMENDATIONS_VIEW_ID, AutoCheckUpdatesConfigurationKey } from '../common/extensions'; import { InstallLocalExtensionsInRemoteAction, InstallRemoteExtensionsInLocalAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; @@ -52,9 +52,8 @@ import { DragAndDropObserver } from 'vs/workbench/browser/dnd'; import { URI } from 'vs/base/common/uri'; import { SIDE_BAR_DRAG_AND_DROP_BACKGROUND } from 'vs/workbench/common/theme'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { VirtualWorkspaceContext, WorkbenchStateContext } from 'vs/workbench/browser/contextkeys'; +import { VirtualWorkspaceContext, WorkbenchStateContext } from 'vs/workbench/common/contextkeys'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { isWeb } from 'vs/base/common/platform'; import { installLocalInRemoteIcon } from 'vs/workbench/contrib/extensions/browser/extensionsIcons'; import { registerAction2, Action2, MenuId } from 'vs/platform/actions/common/actions'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; @@ -66,7 +65,6 @@ const SearchOutdatedExtensionsContext = new RawContextKey('searchOutdat const SearchEnabledExtensionsContext = new RawContextKey('searchEnabledExtensions', false); const SearchDisabledExtensionsContext = new RawContextKey('searchDisabledExtensions', false); const HasInstalledExtensionsContext = new RawContextKey('hasInstalledExtensions', true); -const HasInstalledWebExtensionsContext = new RawContextKey('hasInstalledWebExtensions', false); const BuiltInExtensionsContext = new RawContextKey('builtInExtensions', false); const SearchBuiltInExtensionsContext = new RawContextKey('searchBuiltInExtensions', false); const SearchUnsupportedWorkspaceExtensionsContext = new RawContextKey('searchUnsupportedWorkspaceExtensions', false); @@ -117,22 +115,14 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio if (this.extensionManagementServerService.localExtensionManagementServer) { servers.push(this.extensionManagementServerService.localExtensionManagementServer); } - if (this.extensionManagementServerService.webExtensionManagementServer) { - servers.push(this.extensionManagementServerService.webExtensionManagementServer); - } if (this.extensionManagementServerService.remoteExtensionManagementServer) { servers.push(this.extensionManagementServerService.remoteExtensionManagementServer); } + if (this.extensionManagementServerService.webExtensionManagementServer) { + servers.push(this.extensionManagementServerService.webExtensionManagementServer); + } const getViewName = (viewTitle: string, server: IExtensionManagementServer): string => { - if (servers.length > 1) { - // In Web, use view title as is for remote server, when web extension server is enabled and no web extensions are installed - if (isWeb && server === this.extensionManagementServerService.remoteExtensionManagementServer && - this.extensionManagementServerService.webExtensionManagementServer && !this.contextKeyService.getContextKeyValue('hasInstalledWebExtensions')) { - return viewTitle; - } - return `${server.label} - ${viewTitle}`; - } - return viewTitle; + return servers.length > 1 ? `${server.label} - ${viewTitle}` : viewTitle; }; let installedWebExtensionsContextChangeEvent = Event.None; if (this.extensionManagementServerService.webExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer) { @@ -145,29 +135,14 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio const getInstalledViewName = (): string => getViewName(localize('installed', "Installed"), server); const onDidChangeTitle = Event.map(serverLabelChangeEvent, () => getInstalledViewName()); const id = servers.length > 1 ? `workbench.views.extensions.${server.id}.installed` : `workbench.views.extensions.installed`; - const isWebServer = server === this.extensionManagementServerService.webExtensionManagementServer; - if (!isWebServer) { - /* Empty installed extensions view */ - viewDescriptors.push({ - id: `${id}.empty`, - get name() { return getInstalledViewName(); }, - weight: 100, - order: 1, - when: ContextKeyExpr.and(DefaultViewsContext, ContextKeyExpr.not('hasInstalledExtensions')), - /* Empty installed extensions view shall have fixed height */ - ctorDescriptor: new SyncDescriptor(ServerInstalledExtensionsView, [{ server, fixedHeight: true, onDidChangeTitle }]), - /* Empty installed extensions views shall not be allowed to hidden */ - canToggleVisibility: false - }); - } /* Installed extensions view */ viewDescriptors.push({ id, get name() { return getInstalledViewName(); }, weight: 100, order: 1, - when: ContextKeyExpr.and(DefaultViewsContext, isWebServer ? ContextKeyExpr.has('hasInstalledWebExtensions') : ContextKeyExpr.has('hasInstalledExtensions')), - ctorDescriptor: new SyncDescriptor(ServerInstalledExtensionsView, [{ server, onDidChangeTitle }]), + when: ContextKeyExpr.and(DefaultViewsContext), + ctorDescriptor: new SyncDescriptor(ServerInstalledExtensionsView, [{ server, flexibleHeight: true, onDidChangeTitle }]), /* Installed extensions views shall not be allowed to hidden when there are more than one server */ canToggleVisibility: servers.length === 1 }); @@ -234,7 +209,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio viewDescriptors.push({ id: 'extensions.recommendedList', name: localize('recommendedExtensions', "Recommended"), - ctorDescriptor: new SyncDescriptor(DefaultRecommendedExtensionsView, [{}]), + ctorDescriptor: new SyncDescriptor(DefaultRecommendedExtensionsView, [{ flexibleHeight: true }]), when: ContextKeyExpr.and(DefaultViewsContext, ContextKeyExpr.not('config.extensions.showRecommendationsOnlyOnDemand')), weight: 40, order: 3, @@ -449,7 +424,6 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE private searchEnabledExtensionsContextKey: IContextKey; private searchDisabledExtensionsContextKey: IContextKey; private hasInstalledExtensionsContextKey: IContextKey; - private hasInstalledWebExtensionsContextKey: IContextKey; private builtInExtensionsContextKey: IContextKey; private searchBuiltInExtensionsContextKey: IContextKey; private searchWorkspaceUnsupportedExtensionsContextKey: IContextKey; @@ -474,7 +448,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE @IConfigurationService configurationService: IConfigurationService, @IStorageService storageService: IStorageService, @IWorkspaceContextService contextService: IWorkspaceContextService, - @IContextKeyService contextKeyService: IContextKeyService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, @IContextMenuService contextMenuService: IContextMenuService, @IExtensionService extensionService: IExtensionService, @IViewDescriptorService viewDescriptorService: IViewDescriptorService, @@ -493,22 +467,11 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE this.searchEnabledExtensionsContextKey = SearchEnabledExtensionsContext.bindTo(contextKeyService); this.searchDisabledExtensionsContextKey = SearchDisabledExtensionsContext.bindTo(contextKeyService); this.hasInstalledExtensionsContextKey = HasInstalledExtensionsContext.bindTo(contextKeyService); - this.hasInstalledWebExtensionsContextKey = HasInstalledWebExtensionsContext.bindTo(contextKeyService); this.builtInExtensionsContextKey = BuiltInExtensionsContext.bindTo(contextKeyService); this.searchBuiltInExtensionsContextKey = SearchBuiltInExtensionsContext.bindTo(contextKeyService); this.recommendedExtensionsContextKey = RecommendedExtensionsContext.bindTo(contextKeyService); this._register(this.paneCompositeService.onDidPaneCompositeOpen(e => { if (e.viewContainerLocation === ViewContainerLocation.Sidebar) { this.onViewletOpen(e.composite); } }, this)); this.searchViewletState = this.getMemento(StorageScope.WORKSPACE, StorageTarget.USER); - - if (extensionManagementServerService.webExtensionManagementServer) { - this._register(extensionsWorkbenchService.onChange(() => { - // show installed web extensions view only when it is not visible - // Do not hide the view automatically when it is visible - if (!this.hasInstalledWebExtensionsContextKey.get()) { - this.updateInstalledWebExtensionsContext(); - } - })); - } } get searchValue(): string | undefined { @@ -612,7 +575,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE this.root.classList.toggle('mini', dimension.width <= 200); } if (this.searchBox) { - this.searchBox.layout(new Dimension(dimension.width - 34, 20)); + this.searchBox.layout(new Dimension(dimension.width - 34 - /*padding*/8, 20)); } super.layout(new Dimension(dimension.width, dimension.height - 41)); } @@ -630,16 +593,14 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE async refresh(): Promise { await this.updateInstalledExtensionsContexts(); this.doSearch(true); + if (this.configurationService.getValue(AutoCheckUpdatesConfigurationKey)) { + this.extensionsWorkbenchService.checkForUpdates(); + } } private async updateInstalledExtensionsContexts(): Promise { const result = await this.extensionsWorkbenchService.queryLocal(); this.hasInstalledExtensionsContextKey.set(result.some(r => !r.isBuiltin)); - this.updateInstalledWebExtensionsContext(); - } - - private updateInstalledWebExtensionsContext(): void { - this.hasInstalledWebExtensionsContextKey.set(!!this.extensionManagementServerService.webExtensionManagementServer && this.extensionsWorkbenchService.installed.some(r => r.server === this.extensionManagementServerService.webExtensionManagementServer)); } private triggerSearch(): void { @@ -669,18 +630,19 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE private doSearch(refresh?: boolean): Promise { const value = this.normalizedQuery(); - const isRecommendedExtensionsQuery = ExtensionsListView.isRecommendedExtensionsQuery(value); - this.searchInstalledExtensionsContextKey.set(ExtensionsListView.isInstalledExtensionsQuery(value)); - this.searchOutdatedExtensionsContextKey.set(ExtensionsListView.isOutdatedExtensionsQuery(value)); - this.searchEnabledExtensionsContextKey.set(ExtensionsListView.isEnabledExtensionsQuery(value)); - this.searchDisabledExtensionsContextKey.set(ExtensionsListView.isDisabledExtensionsQuery(value)); - this.searchBuiltInExtensionsContextKey.set(ExtensionsListView.isSearchBuiltInExtensionsQuery(value)); - this.searchWorkspaceUnsupportedExtensionsContextKey.set(ExtensionsListView.isSearchWorkspaceUnsupportedExtensionsQuery(value)); - this.builtInExtensionsContextKey.set(ExtensionsListView.isBuiltInExtensionsQuery(value)); - this.recommendedExtensionsContextKey.set(isRecommendedExtensionsQuery); - this.searchMarketplaceExtensionsContextKey.set(!!value && !ExtensionsListView.isLocalExtensionsQuery(value) && !isRecommendedExtensionsQuery); - this.defaultViewsContextKey.set(!value); - this.updateInstalledWebExtensionsContext(); + this.contextKeyService.bufferChangeEvents(() => { + const isRecommendedExtensionsQuery = ExtensionsListView.isRecommendedExtensionsQuery(value); + this.searchInstalledExtensionsContextKey.set(ExtensionsListView.isInstalledExtensionsQuery(value)); + this.searchOutdatedExtensionsContextKey.set(ExtensionsListView.isOutdatedExtensionsQuery(value)); + this.searchEnabledExtensionsContextKey.set(ExtensionsListView.isEnabledExtensionsQuery(value)); + this.searchDisabledExtensionsContextKey.set(ExtensionsListView.isDisabledExtensionsQuery(value)); + this.searchBuiltInExtensionsContextKey.set(ExtensionsListView.isSearchBuiltInExtensionsQuery(value)); + this.searchWorkspaceUnsupportedExtensionsContextKey.set(ExtensionsListView.isSearchWorkspaceUnsupportedExtensionsQuery(value)); + this.builtInExtensionsContextKey.set(ExtensionsListView.isBuiltInExtensionsQuery(value)); + this.recommendedExtensionsContextKey.set(isRecommendedExtensionsQuery); + this.searchMarketplaceExtensionsContextKey.set(!!value && !ExtensionsListView.isLocalExtensionsQuery(value) && !isRecommendedExtensionsQuery); + this.defaultViewsContextKey.set(!value); + }); return this.progress(Promise.all(this.panes.map(view => (view).show(this.normalizedQuery(), refresh) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts index f22a18988ea..a18904b831f 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts @@ -16,7 +16,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { append, $ } from 'vs/base/browser/dom'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { Delegate, Renderer, IExtensionsViewState, EXTENSION_LIST_ELEMENT_HEIGHT } from 'vs/workbench/contrib/extensions/browser/extensionsList'; +import { Delegate, Renderer, IExtensionsViewState } from 'vs/workbench/contrib/extensions/browser/extensionsList'; import { ExtensionState, IExtension, IExtensionsWorkbenchService, IWorkspaceRecommendedExtensionsView } from 'vs/workbench/contrib/extensions/common/extensions'; import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; @@ -49,17 +49,18 @@ import { IPreferencesService } from 'vs/workbench/services/preferences/common/pr import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; -import { isVirtualWorkspace } from 'vs/platform/remote/common/remoteHosts'; +import { isVirtualWorkspace } from 'vs/platform/workspace/common/virtualWorkspace'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; import { IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService'; import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; import { ILogService } from 'vs/platform/log/common/log'; +import { isOfflineError } from 'vs/base/parts/request/common/request'; // Extensions that are automatically classified as Programming Language extensions, but should be Feature extensions const FORCE_FEATURE_EXTENSIONS = ['vscode.git', 'vscode.git-base', 'vscode.search-result']; type WorkspaceRecommendationsClassification = { - count: { classification: 'SystemMetaData', purpose: 'FeatureInsight', 'isMeasurement': true; }; + count: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; 'isMeasurement': true }; }; class ExtensionsViewState extends Disposable implements IExtensionsViewState { @@ -81,7 +82,7 @@ class ExtensionsViewState extends Disposable implements IExtensionsViewState { export interface ExtensionsListViewOptions { server?: IExtensionManagementServer; - fixedHeight?: boolean; + flexibleHeight?: boolean; onDidChangeTitle?: Event; hideBadge?: boolean; } @@ -102,7 +103,7 @@ export class ExtensionsListView extends ViewPane { } | undefined; private badge: CountBadge | undefined; private list: WorkbenchPagedList | null = null; - private queryRequest: { query: string, request: CancelablePromise>; } | null = null; + private queryRequest: { query: string; request: CancelablePromise> } | null = null; private queryResult: IQueryResult | undefined; private readonly contextMenuActionRunner = this._register(new ActionRunner()); @@ -140,7 +141,7 @@ export class ExtensionsListView extends ViewPane { super({ ...(viewletViewOptions as IViewPaneOptions), showActionsAlways: true, - maximumBodySize: options.fixedHeight ? storageService.getNumber(viewletViewOptions.id, StorageScope.GLOBAL, 0) : undefined + maximumBodySize: options.flexibleHeight ? (storageService.getNumber(`${viewletViewOptions.id}.size`, StorageScope.GLOBAL, 0) ? undefined : 0) : undefined }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); if (this.options.onDidChangeTitle) { this._register(this.options.onDidChangeTitle(title => this.updateTitle(title))); @@ -340,8 +341,8 @@ export class ExtensionsListView extends ViewPane { return this.getPagedModel(this.sortExtensions(result, options)); } - return this.extensionsWorkbenchService.queryGallery({ names: ids, source: 'queryById' }, token) - .then(pager => this.getPagedModel(pager)); + return this.extensionsWorkbenchService.getExtensions(ids.map(id => ({ id })), { source: 'queryById' }, token) + .then(extension => this.getPagedModel(extension)); } private async queryLocal(query: Query, options: IQueryOptions): Promise { @@ -378,7 +379,7 @@ export class ExtensionsListView extends ViewPane { }; } - private filterLocal(local: IExtension[], runningExtensions: IExtensionDescription[], query: Query, options: IQueryOptions): { extensions: IExtension[], canIncludeInstalledExtensions: boolean; } { + private filterLocal(local: IExtension[], runningExtensions: IExtensionDescription[], query: Query, options: IQueryOptions): { extensions: IExtension[]; canIncludeInstalledExtensions: boolean } { let value = query.value; let extensions: IExtension[] = []; let canIncludeInstalledExtensions = true; @@ -461,7 +462,7 @@ export class ExtensionsListView extends ViewPane { return this.sortExtensions(result, options); } - private parseCategories(value: string): { value: string, categories: string[]; } { + private parseCategories(value: string): { value: string; categories: string[] } { const categories: string[] = []; value = value.replace(/\bcategory:("([^"]*)"|([^"]\S*))(\s+|\b|$)/g, (_, quotedCategory, category) => { const entry = (category || quotedCategory || '').toLowerCase(); @@ -738,14 +739,14 @@ export class ExtensionsListView extends ViewPane { private async getCuratedModel(query: Query, options: IQueryOptions, token: CancellationToken): Promise> { const value = query.value.replace(/curated:/g, '').trim(); - const names = await this.experimentService.getCuratedExtensionsList(value); - if (Array.isArray(names) && names.length) { - options.source = `curated:${value}`; - options.names = names; - options.pageSize = names.length; - const pager = await this.extensionsWorkbenchService.queryGallery(options, token); - this.sortFirstPage(pager, names); - return this.getPagedModel(pager || []); + let ids = await this.experimentService.getCuratedExtensionsList(value); + if (Array.isArray(ids) && ids.length) { + ids = ids.map(id => id.toLowerCase()); + const extensions = await this.extensionsWorkbenchService.getExtensions(ids.map(id => ({ id })), { source: `curated:${value}` }, token); + // Sorts the firstPage of the pager in the same order as given array of extension ids + extensions.sort((a, b) => + ids.indexOf(a.identifier.id.toLowerCase()) < ids.indexOf(b.identifier.id.toLowerCase()) ? -1 : 1); + return this.getPagedModel(extensions); } return new PagedModel([]); } @@ -801,16 +802,16 @@ export class ExtensionsListView extends ViewPane { } protected async getInstallableRecommendations(recommendations: string[], options: IQueryOptions, token: CancellationToken): Promise { - const extensions: IExtension[] = []; + const result: IExtension[] = []; if (recommendations.length) { - const pager = await this.extensionsWorkbenchService.queryGallery({ ...options, names: recommendations, pageSize: recommendations.length }, token); - for (const extension of pager.firstPage) { + const extensions = await this.extensionsWorkbenchService.getExtensions(recommendations.map(id => ({ id })), { source: options.source }, token); + for (const extension of extensions) { if (extension.gallery && (await this.extensionManagementService.canInstall(extension.gallery))) { - extensions.push(extension); + result.push(extension); } } } - return extensions; + return result; } protected async getWorkspaceRecommendations(): Promise { @@ -827,7 +828,7 @@ export class ExtensionsListView extends ViewPane { private async getWorkspaceRecommendationsModel(query: Query, options: IQueryOptions, token: CancellationToken): Promise> { const recommendations = await this.getWorkspaceRecommendations(); const installableRecommendations = (await this.getInstallableRecommendations(recommendations, { ...options, source: 'recommendations-workspace' }, token)); - this.telemetryService.publicLog2<{ count: number; }, WorkspaceRecommendationsClassification>('extensionWorkspaceRecommendations:open', { count: installableRecommendations.length }); + this.telemetryService.publicLog2<{ count: number }, WorkspaceRecommendationsClassification>('extensionWorkspaceRecommendations:open', { count: installableRecommendations.length }); const result: IExtension[] = coalesce(recommendations.map(id => installableRecommendations.find(i => areSameExtensions(i.identifier, { id })))); return new PagedModel(result); } @@ -906,14 +907,6 @@ export class ExtensionsListView extends ViewPane { return new PagedModel(this.sortExtensions(result, options)); } - // Sorts the firstPage of the pager in the same order as given array of extension ids - private sortFirstPage(pager: IPager, ids: string[]) { - ids = ids.map(x => x.toLowerCase()); - pager.firstPage.sort((a, b) => { - return ids.indexOf(a.identifier.id.toLowerCase()) < ids.indexOf(b.identifier.id.toLowerCase()) ? -1 : 1; - }); - } - private setModel(model: IPagedModel, error?: any) { if (this.list) { this.list.model = new DelayedPagedModel(model); @@ -932,8 +925,13 @@ export class ExtensionsListView extends ViewPane { if (count === 0 && this.isBodyVisible()) { if (error) { - this.bodyTemplate.messageSeverityIcon.className = SeverityIcon.className(Severity.Error); - this.bodyTemplate.messageBox.textContent = localize('error', "Error while fetching extensions. {0}", getErrorMessage(error)); + if (isOfflineError(error)) { + this.bodyTemplate.messageSeverityIcon.className = SeverityIcon.className(Severity.Warning); + this.bodyTemplate.messageBox.textContent = localize('offline error', "Unable to search the Marketplace when offline, please check your network connection."); + } else { + this.bodyTemplate.messageSeverityIcon.className = SeverityIcon.className(Severity.Error); + this.bodyTemplate.messageBox.textContent = localize('error', "Error while fetching extensions. {0}", getErrorMessage(error)); + } } else { this.bodyTemplate.messageSeverityIcon.className = ''; this.bodyTemplate.messageBox.textContent = localize('no extensions found', "No extensions found."); @@ -944,12 +942,10 @@ export class ExtensionsListView extends ViewPane { this.updateSize(); } - protected updateSize() { - if (this.options.fixedHeight) { - const length = this.list?.model.length || 0; - this.minimumBodySize = Math.min(length, 3) * EXTENSION_LIST_ELEMENT_HEIGHT; - this.maximumBodySize = length * EXTENSION_LIST_ELEMENT_HEIGHT; - this.storageService.store(this.id, this.maximumBodySize, StorageScope.GLOBAL, StorageTarget.MACHINE); + private updateSize() { + if (this.options.flexibleHeight) { + this.maximumBodySize = this.list?.model.length ? Number.POSITIVE_INFINITY : 0; + this.storageService.store(`${this.id}.size`, this.list?.model.length || 0, StorageScope.GLOBAL, StorageTarget.MACHINE); } } @@ -960,7 +956,7 @@ export class ExtensionsListView extends ViewPane { } } - private openExtension(extension: IExtension, options: { sideByside?: boolean, preserveFocus?: boolean, pinned?: boolean; }): void { + private openExtension(extension: IExtension, options: { sideByside?: boolean; preserveFocus?: boolean; pinned?: boolean }): void { extension = this.extensionsWorkbenchService.local.filter(e => areSameExtensions(e.identifier, extension.identifier))[0] || extension; this.extensionsWorkbenchService.open(extension, options).then(undefined, err => this.onError(err)); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts index 60f36bf3e20..a6d3845648d 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.ts @@ -486,10 +486,10 @@ export class ExtensionHoverWidget extends ExtensionWidget { } const markdown = new MarkdownString('', { isTrusted: true, supportThemeIcons: true }); - markdown.appendMarkdown(`**${this.extension.displayName}** _v${this.extension.version}_`); + markdown.appendMarkdown(`**${this.extension.displayName}** ** _v${this.extension.version}_** `); if (this.extension.local?.isPreReleaseVersion || this.extension.gallery?.properties.isPreReleaseVersion) { const extensionPreReleaseIcon = this.themeService.getColorTheme().getColor(extensionPreReleaseIconColor); - markdown.appendMarkdown(`  ${localize('pre-release-label', "Pre-Release")} `); + markdown.appendMarkdown(`** **  $(${preReleaseIcon.id}) ${localize('pre-release-label', "Pre-Release")} `); } markdown.appendText(`\n`); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index e4d5507c248..462dbfb6efd 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -9,12 +9,13 @@ import { Event, Emitter } from 'vs/base/common/event'; import { index, distinct } from 'vs/base/common/arrays'; import { Promises, ThrottledDelayer } from 'vs/base/common/async'; import { canceled, isCancellationError } from 'vs/base/common/errors'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IPager, mapPager, singlePagePager } from 'vs/base/common/paging'; +import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IPager, singlePagePager } from 'vs/base/common/paging'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IExtensionGalleryService, ILocalExtension, IGalleryExtension, IQueryOptions, - InstallExtensionEvent, DidUninstallExtensionEvent, IExtensionIdentifier, InstallOperation, DefaultIconPath, InstallOptions, WEB_EXTENSION_TAG, InstallExtensionResult, isIExtensionIdentifier, IExtensionsControlManifest + InstallExtensionEvent, DidUninstallExtensionEvent, IExtensionIdentifier, InstallOperation, DefaultIconPath, InstallOptions, WEB_EXTENSION_TAG, InstallExtensionResult, + IExtensionsControlManifest, InstallVSIXOptions, IExtensionInfo, IExtensionQueryOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, areSameExtensions, groupByExtension, ExtensionIdentifierWithVersion, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; @@ -34,7 +35,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IFileService } from 'vs/platform/files/common/files'; import { IExtensionManifest, ExtensionType, IExtension as IPlatformExtension } from 'vs/platform/extensions/common/extensions'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IProductService } from 'vs/platform/product/common/productService'; import { FileAccess } from 'vs/base/common/network'; import { IIgnoredExtensionsManagementService } from 'vs/platform/userDataSync/common/ignoredExtensions'; @@ -112,7 +113,7 @@ class Extension implements IExtension { return this.local!.manifest.publisher; } - get publisherDomain(): { link: string, verified: boolean; } | undefined { + get publisherDomain(): { link: string; verified: boolean } | undefined { return this.gallery?.publisherDomain; } @@ -186,7 +187,7 @@ class Extension implements IExtension { } public isMalicious: boolean = false; - public isUnsupported: boolean | { preReleaseExtension: { id: string, displayName: string; }; } = false; + public isUnsupported: boolean | { preReleaseExtension: { id: string; displayName: string } } = false; get installCount(): number | undefined { return this.gallery ? this.gallery.installCount : undefined; @@ -358,8 +359,23 @@ ${this.description} class Extensions extends Disposable { - private readonly _onChange: Emitter<{ extension: Extension, operation?: InstallOperation; } | undefined> = this._register(new Emitter<{ extension: Extension, operation?: InstallOperation; } | undefined>()); - get onChange(): Event<{ extension: Extension, operation?: InstallOperation; } | undefined> { return this._onChange.event; } + static updateExtensionFromControlManifest(extension: Extension, extensionsControlManifest: IExtensionsControlManifest): void { + const isMalicious = extensionsControlManifest.malicious.some(identifier => areSameExtensions(extension.identifier, identifier)); + if (extension.isMalicious !== isMalicious) { + extension.isMalicious = isMalicious; + } + const unsupportedPreRelease = extensionsControlManifest.unsupportedPreReleaseExtensions ? extensionsControlManifest.unsupportedPreReleaseExtensions[extension.identifier.id.toLowerCase()] : undefined; + if (unsupportedPreRelease) { + if (isBoolean(extension.isUnsupported) || !areSameExtensions({ id: extension.isUnsupported.preReleaseExtension.id }, { id: unsupportedPreRelease.id })) { + extension.isUnsupported = { preReleaseExtension: unsupportedPreRelease }; + } + } else if (extension.isUnsupported) { + extension.isUnsupported = false; + } + } + + private readonly _onChange: Emitter<{ extension: Extension; operation?: InstallOperation } | undefined> = this._register(new Emitter<{ extension: Extension; operation?: InstallOperation } | undefined>()); + get onChange(): Event<{ extension: Extension; operation?: InstallOperation } | undefined> { return this._onChange.event; } private installing: Extension[] = []; private uninstalling: Extension[] = []; @@ -389,6 +405,7 @@ class Extensions extends Disposable { } async queryInstalled(): Promise { + const extensionsControlManifest = await this.server.extensionManagementService.getExtensionsControlManifest(); const all = await this.server.extensionManagementService.getInstalled(); // dedup user and system extensions by giving priority to user extensions. @@ -404,104 +421,87 @@ class Extensions extends Disposable { const extension = byId[local.identifier.id] || this.instantiationService.createInstance(Extension, this.stateProvider, this.server, local, undefined); extension.local = local; extension.enablementState = this.extensionEnablementService.getEnablementState(local); + Extensions.updateExtensionFromControlManifest(extension, extensionsControlManifest); return extension; }); this._onChange.fire(undefined); return this.local; } - async syncLocalWithGalleryExtension(gallery: IGalleryExtension, extensionsControlManifest: IExtensionsControlManifest): Promise { - const extension = this.getInstalledExtensionMatchingGallery(gallery); - if (!extension?.local) { - return false; - } - + async syncInstalledExtensionsWithGallery(galleryExtensions: IGalleryExtension[]): Promise { let hasChanged: boolean = false; - - const isMalicious = extensionsControlManifest.malicious.some(identifier => areSameExtensions(extension.identifier, identifier)); - if (extension.isMalicious !== isMalicious) { - extension.isMalicious = isMalicious; - hasChanged = true; - } - - const compatible = await this.getCompatibleExtension(gallery, extension.local.preRelease); - if (compatible) { - extension.gallery = compatible; - hasChanged = true; - } - - if (!extension.local.identifier.uuid) { - let galleryExtension = !extension.outdated ? extension.gallery : undefined; - if (!galleryExtension) { - [galleryExtension] = await this.galleryService.getExtensions([{ ...extension.local.identifier, version: extension.version }], CancellationToken.None); + const extensions = await this.mapInstalledExtensionWithCompatibleGalleryExtension(galleryExtensions); + for (const [extension, gallery] of extensions) { + // update metadata of the extension if it does not exist + if (extension.local && !extension.local.identifier.uuid) { + extension.local = await this.updateMetadata(extension.local, gallery); } - if (!galleryExtension) { - [galleryExtension] = await this.galleryService.getExtensions([extension.local.identifier], CancellationToken.None); - } - if (galleryExtension) { - const local = await this.server.extensionManagementService.updateMetadata(extension.local, { id: galleryExtension.identifier.uuid, publisherDisplayName: galleryExtension.publisherDisplayName, publisherId: galleryExtension.publisherId, isPreReleaseVersion: gallery.properties.isPreReleaseVersion }); - extension.local = local; - } - } - - const unsupportedPreRelease = extensionsControlManifest.unsupportedPreReleaseExtensions ? extensionsControlManifest.unsupportedPreReleaseExtensions[extension.identifier.id.toLowerCase()] : undefined; - if (unsupportedPreRelease) { - if (isBoolean(extension.isUnsupported) || !areSameExtensions({ id: extension.isUnsupported.preReleaseExtension.id }, { id: unsupportedPreRelease.id })) { - extension.isUnsupported = { preReleaseExtension: unsupportedPreRelease }; + if (!extension.gallery || extension.gallery.version !== gallery.version) { + extension.gallery = gallery; + this._onChange.fire({ extension }); hasChanged = true; } - } else if (extension.isUnsupported) { - extension.isUnsupported = false; - hasChanged = true; - } - - if (hasChanged) { - this._onChange.fire({ extension }); } return hasChanged; } - private async getCompatibleExtension(extensionOrIdentifier: IGalleryExtension | IExtensionIdentifier, includePreRelease: boolean): Promise { - if (isIExtensionIdentifier(extensionOrIdentifier)) { - return (await this.galleryService.getExtensions([{ ...extensionOrIdentifier, preRelease: includePreRelease }], { targetPlatform: await this.server.extensionManagementService.getTargetPlatform(), compatible: true }, CancellationToken.None))[0] || null; + private async mapInstalledExtensionWithCompatibleGalleryExtension(galleryExtensions: IGalleryExtension[]): Promise<[Extension, IGalleryExtension][]> { + const mappedExtensions = this.mapInstalledExtensionWithGalleryExtension(galleryExtensions); + const targetPlatform = await this.server.extensionManagementService.getTargetPlatform(); + const compatibleGalleryExtensions: IGalleryExtension[] = []; + const compatibleGalleryExtensionsToFetch: IExtensionInfo[] = []; + await Promise.allSettled(mappedExtensions.map(async ([extension, gallery]) => { + if (extension.local) { + if (await this.galleryService.isExtensionCompatible(gallery, extension.local.preRelease, targetPlatform)) { + compatibleGalleryExtensions.push(gallery); + } else { + compatibleGalleryExtensionsToFetch.push({ ...extension.local.identifier, preRelease: extension.local.preRelease }); + } + } + })); + if (compatibleGalleryExtensionsToFetch.length) { + const result = await this.galleryService.getExtensions(compatibleGalleryExtensionsToFetch, { targetPlatform, compatible: true, queryAllVersions: true }, CancellationToken.None); + compatibleGalleryExtensions.push(...result); } - const extension = extensionOrIdentifier; - if (includePreRelease && extension.hasPreReleaseVersion && !extension.properties.isPreReleaseVersion) { - return this.getCompatibleExtension(extension.identifier, includePreRelease); + return this.mapInstalledExtensionWithGalleryExtension(compatibleGalleryExtensions); + } + + private mapInstalledExtensionWithGalleryExtension(galleryExtensions: IGalleryExtension[]): [Extension, IGalleryExtension][] { + const mappedExtensions: [Extension, IGalleryExtension][] = []; + const byUUID = new Map(), byID = new Map(); + for (const gallery of galleryExtensions) { + byUUID.set(gallery.identifier.uuid, gallery); + byID.set(gallery.identifier.id.toLowerCase(), gallery); } - return this.galleryService.getCompatibleExtension(extension, includePreRelease, await this.server.extensionManagementService.getTargetPlatform()); + for (const installed of this.installed) { + if (installed.uuid) { + const gallery = byUUID.get(installed.uuid); + if (gallery) { + mappedExtensions.push([installed, gallery]); + continue; + } + } + const gallery = byID.get(installed.identifier.id.toLowerCase()); + if (gallery) { + mappedExtensions.push([installed, gallery]); + } + } + return mappedExtensions; + } + + private async updateMetadata(localExtension: ILocalExtension, gallery: IGalleryExtension): Promise { + let isPreReleaseVersion = false; + if (localExtension.manifest.version !== gallery.version) { + const galleryWithLocalVersion: IGalleryExtension | undefined = (await this.galleryService.getExtensions([{ ...localExtension.identifier, version: localExtension.manifest.version }], CancellationToken.None))[0]; + isPreReleaseVersion = !!galleryWithLocalVersion?.properties?.isPreReleaseVersion; + } + return this.server.extensionManagementService.updateMetadata(localExtension, { id: gallery.identifier.uuid, publisherDisplayName: gallery.publisherDisplayName, publisherId: gallery.publisherId, isPreReleaseVersion }); } canInstall(galleryExtension: IGalleryExtension): Promise { return this.server.extensionManagementService.canInstall(galleryExtension); } - private async syncInstalledExtensionWithGallery(extension: Extension): Promise { - if (!this.galleryService.isEnabled()) { - return; - } - const compatible = await this.getCompatibleExtension(extension.identifier, !!extension.local?.preRelease); - if (compatible) { - extension.gallery = compatible; - this._onChange.fire({ extension }); - } - } - - private getInstalledExtensionMatchingGallery(gallery: IGalleryExtension): Extension | null { - for (const installed of this.installed) { - if (installed.uuid) { // Installed from Gallery - if (installed.uuid === gallery.identifier.uuid) { - return installed; - } - } else { - if (areSameExtensions(installed.identifier, gallery.identifier)) { // Installed from other sources - return installed; - } - } - } - return null; - } - private onInstallExtension(event: InstallExtensionEvent): void { const { source } = event; if (source && !URI.isUri(source)) { @@ -545,6 +545,17 @@ class Extensions extends Disposable { } } + private async syncInstalledExtensionWithGallery(extension: Extension): Promise { + if (!this.galleryService.isEnabled()) { + return; + } + const [compatible] = await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: extension.local?.preRelease }], { compatible: true, targetPlatform: await this.server.extensionManagementService.getTargetPlatform() }, CancellationToken.None); + if (compatible) { + extension.gallery = compatible; + this._onChange.fire({ extension }); + } + } + private onUninstallExtension(identifier: IExtensionIdentifier): void { const extension = this.installed.filter(e => areSameExtensions(e.identifier, identifier))[0]; if (extension) { @@ -592,7 +603,7 @@ class Extensions extends Disposable { export class ExtensionsWorkbenchService extends Disposable implements IExtensionsWorkbenchService, IURLHandler { - private static readonly SyncPeriod = 1000 * 60 * 60 * 12; // 12 hours + private static readonly UpdatesCheckInterval = 1000 * 60 * 60 * 12; // 12 hours declare readonly _serviceBrand: undefined; private hasOutdatedExtensionsContextKey: IContextKey; @@ -600,7 +611,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension private readonly localExtensions: Extensions | null = null; private readonly remoteExtensions: Extensions | null = null; private readonly webExtensions: Extensions | null = null; - private syncDelayer: ThrottledDelayer; + private updatesCheckDelayer: ThrottledDelayer; private autoUpdateDelayer: ThrottledDelayer; private readonly _onChange: Emitter = new Emitter(); @@ -652,9 +663,14 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension this._register(this.webExtensions.onChange(e => this._onChange.fire(e ? e.extension : undefined))); } - this.syncDelayer = new ThrottledDelayer(ExtensionsWorkbenchService.SyncPeriod); + this.updatesCheckDelayer = new ThrottledDelayer(ExtensionsWorkbenchService.UpdatesCheckInterval); this.autoUpdateDelayer = new ThrottledDelayer(1000); + this._register(toDisposable(() => { + this.updatesCheckDelayer.cancel(); + this.autoUpdateDelayer.cancel(); + })); + urlService.registerHandler(this); this._register(this.configurationService.onDidChangeConfiguration(e => { @@ -678,7 +694,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension this.queryLocal().then(() => { this.resetIgnoreAutoUpdateExtensions(); - this.eventuallySyncWithGallery(true); + this.eventuallyCheckForUpdates(true); }); this._register(this.onChange(() => { @@ -770,8 +786,18 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension const extensionsControlManifest = await this.extensionManagementService.getExtensionsControlManifest(); try { - const result = await this.galleryService.query(options, token); - return mapPager(result, gallery => this.fromGallery(gallery, extensionsControlManifest)); + const pager = await this.galleryService.query(options, token); + this.syncInstalledExtensionsWithGallery(pager.firstPage); + return { + firstPage: pager.firstPage.map(gallery => this.fromGallery(gallery, extensionsControlManifest)), + total: pager.total, + pageSize: pager.pageSize, + getPage: async (pageIndex, token) => { + const page = await pager.getPage(pageIndex, token); + this.syncInstalledExtensionsWithGallery(page); + return page.map(gallery => this.fromGallery(gallery, extensionsControlManifest)); + } + }; } catch (error) { if (/No extension gallery service configured/.test(error.message)) { return Promise.resolve(singlePagePager([])); @@ -780,6 +806,15 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } } + getExtensions(extensionInfos: IExtensionInfo[], token: CancellationToken): Promise; + getExtensions(extensionInfos: IExtensionInfo[], options: IExtensionQueryOptions, token: CancellationToken): Promise; + async getExtensions(extensionInfos: IExtensionInfo[], arg1: any, arg2?: any): Promise { + const extensionsControlManifest = await this.extensionManagementService.getExtensionsControlManifest(); + const galleryExtensions = await this.galleryService.getExtensions(extensionInfos, arg1, arg2); + this.syncInstalledExtensionsWithGallery(galleryExtensions); + return galleryExtensions.map(gallery => this.fromGallery(gallery, extensionsControlManifest)); + } + private resolveQueryText(text: string): string { text = text.replace(/@web/g, `tag:"${WEB_EXTENSION_TAG}"`); @@ -803,6 +838,30 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return text.substr(0, 350); } + private fromGallery(gallery: IGalleryExtension, extensionsControlManifest: IExtensionsControlManifest): IExtension { + let extension = this.getInstalledExtensionMatchingGallery(gallery); + if (!extension) { + extension = this.instantiationService.createInstance(Extension, ext => this.getExtensionState(ext), undefined, undefined, gallery); + Extensions.updateExtensionFromControlManifest(extension, extensionsControlManifest); + } + return extension; + } + + private getInstalledExtensionMatchingGallery(gallery: IGalleryExtension): IExtension | null { + for (const installed of this.local) { + if (installed.identifier.uuid) { // Installed from Gallery + if (installed.identifier.uuid === gallery.identifier.uuid) { + return installed; + } + } else { + if (areSameExtensions(installed.identifier, gallery.identifier)) { // Installed from other sources + return installed; + } + } + } + return null; + } + async open(extension: IExtension, options?: IExtensionEditorOptions): Promise { const editor = await this.editorService.openEditor(this.instantiationService.createInstance(ExtensionsInput, extension), options, options?.sideByside ? SIDE_GROUP : ACTIVE_GROUP); if (options?.tab && editor instanceof ExtensionEditor) { @@ -908,50 +967,6 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return extension || extensions[0]; } - private fromGallery(gallery: IGalleryExtension, extensionsControlManifest: IExtensionsControlManifest): IExtension { - Promise.all([ - this.localExtensions ? this.localExtensions.syncLocalWithGalleryExtension(gallery, extensionsControlManifest) : Promise.resolve(false), - this.remoteExtensions ? this.remoteExtensions.syncLocalWithGalleryExtension(gallery, extensionsControlManifest) : Promise.resolve(false), - this.webExtensions ? this.webExtensions.syncLocalWithGalleryExtension(gallery, extensionsControlManifest) : Promise.resolve(false) - ]) - .then(result => { - if (result[0] || result[1] || result[2]) { - this.eventuallyAutoUpdateExtensions(); - } - }); - - const installed = this.getInstalledExtensionMatchingGallery(gallery); - if (installed) { - return installed; - } - const extension = this.instantiationService.createInstance(Extension, ext => this.getExtensionState(ext), undefined, undefined, gallery); - if (extensionsControlManifest.malicious.some(identifier => areSameExtensions(extension.identifier, identifier))) { - extension.isMalicious = true; - } - const unsupportedPreRelease = extensionsControlManifest.unsupportedPreReleaseExtensions ? extensionsControlManifest.unsupportedPreReleaseExtensions[extension.identifier.id.toLowerCase()] : undefined; - if (unsupportedPreRelease) { - if (isBoolean(extension.isUnsupported) || !areSameExtensions({ id: extension.isUnsupported.preReleaseExtension.id }, { id: unsupportedPreRelease.id })) { - extension.isUnsupported = { preReleaseExtension: unsupportedPreRelease }; - } - } - return extension; - } - - private getInstalledExtensionMatchingGallery(gallery: IGalleryExtension): IExtension | null { - for (const installed of this.local) { - if (installed.identifier.uuid) { // Installed from Gallery - if (installed.identifier.uuid === gallery.identifier.uuid) { - return installed; - } - } else { - if (areSameExtensions(installed.identifier, gallery.identifier)) { // Installed from other sources - return installed; - } - } - } - return null; - } - private getExtensionState(extension: Extension): ExtensionState { const isInstalling = this.installing.some(i => areSameExtensions(i.identifier, extension.identifier)); if (extension.server) { @@ -979,8 +994,53 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return ExtensionState.Uninstalled; } - checkForUpdates(): Promise { - return Promise.resolve(this.syncDelayer.trigger(() => this.syncWithGallery(), 0)); + async checkForUpdates(): Promise { + const extensions: Extensions[] = []; + if (this.localExtensions) { + extensions.push(this.localExtensions); + } + if (this.remoteExtensions) { + extensions.push(this.remoteExtensions); + } + if (this.webExtensions) { + extensions.push(this.webExtensions); + } + if (!extensions.length) { + return; + } + const infos: IExtensionInfo[] = []; + for (const installed of this.local) { + if (installed.type === ExtensionType.User) { + infos.push({ ...installed.identifier, preRelease: !!installed.local?.preRelease }); + } + } + if (infos.length) { + const targetPlatform = await extensions[0].server.extensionManagementService.getTargetPlatform(); + const galleryExtensions = await this.galleryService.getExtensions(infos, { targetPlatform, compatible: true }, CancellationToken.None); + if (galleryExtensions.length) { + await this.syncInstalledExtensionsWithGallery(galleryExtensions); + } + } + } + + private async syncInstalledExtensionsWithGallery(gallery: IGalleryExtension[]): Promise { + const extensions: Extensions[] = []; + if (this.localExtensions) { + extensions.push(this.localExtensions); + } + if (this.remoteExtensions) { + extensions.push(this.remoteExtensions); + } + if (this.webExtensions) { + extensions.push(this.webExtensions); + } + if (!extensions.length) { + return; + } + const result = await Promise.allSettled(extensions.map(extensions => extensions.syncInstalledExtensionsWithGallery(gallery))); + if (this.isAutoUpdateEnabled() && result.some(r => r.status === 'fulfilled' && r.value)) { + this.eventuallyAutoUpdateExtensions(); + } } private getAutoUpdateValue(): boolean | 'onlyEnabledExtensions' { @@ -996,36 +1056,13 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return this.configurationService.getValue(AutoCheckUpdatesConfigurationKey); } - private eventuallySyncWithGallery(immediate = false): void { - const shouldSync = this.isAutoUpdateEnabled() || this.isAutoCheckUpdatesEnabled(); - const loop = () => (shouldSync ? this.syncWithGallery() : Promise.resolve(undefined)).then(() => this.eventuallySyncWithGallery()); - const delay = immediate ? 0 : ExtensionsWorkbenchService.SyncPeriod; - - this.syncDelayer.trigger(loop, delay) - .then(undefined, err => null); - } - - private async syncWithGallery(): Promise { - const targetPlatform = this.localExtensions ? await this.localExtensions.server.extensionManagementService.getTargetPlatform() - : this.remoteExtensions ? await this.remoteExtensions.server.extensionManagementService.getTargetPlatform() - : this.webExtensions ? await this.webExtensions.server.extensionManagementService.getTargetPlatform() - : undefined; - if (!targetPlatform) { - return; - } - - const identifiers: (IExtensionIdentifier & { preRelease: boolean })[] = []; - for (const installed of this.local) { - if (installed.type === ExtensionType.User) { - identifiers.push({ ...installed.identifier, preRelease: !!installed.local?.preRelease }); + private eventuallyCheckForUpdates(immediate = false): void { + this.updatesCheckDelayer.trigger(async () => { + if (this.isAutoUpdateEnabled() || this.isAutoCheckUpdatesEnabled()) { + await this.checkForUpdates(); } - } - - if (identifiers.length) { - const extensionsControlManifest = await this.extensionManagementService.getExtensionsControlManifest(); - const galleryExtensions = await this.galleryService.getExtensions(identifiers, { targetPlatform, compatible: true }, CancellationToken.None); - galleryExtensions.forEach(gallery => this.fromGallery(gallery, extensionsControlManifest)); - } + this.eventuallyCheckForUpdates(); + }, immediate ? 0 : ExtensionsWorkbenchService.UpdatesCheckInterval).then(undefined, err => null); } private eventuallyAutoUpdateExtensions(): void { @@ -1078,9 +1115,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return false; } - install(extension: URI | IExtension, installOptions?: InstallOptions): Promise { + install(extension: URI | IExtension, installOptions?: InstallOptions | InstallVSIXOptions): Promise { if (extension instanceof URI) { - return this.installWithProgress(() => this.installFromVSIX(extension)); + return this.installWithProgress(() => this.installFromVSIX(extension, installOptions)); } if (extension.isMalicious) { @@ -1198,10 +1235,10 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension }, () => installTask()); } - private async installFromVSIX(vsix: URI): Promise { + private async installFromVSIX(vsix: URI, installOptions?: InstallVSIXOptions): Promise { const manifest = await this.extensionManagementService.getManifest(vsix); const existingExtension = this.local.find(local => areSameExtensions(local.identifier, { id: getGalleryExtensionId(manifest.publisher, manifest.name) })); - const { identifier } = await this.extensionManagementService.install(vsix); + const { identifier } = await this.extensionManagementService.install(vsix, installOptions); if (existingExtension && existingExtension.latestVersion !== manifest.version) { this.ignoreAutoUpdate(new ExtensionIdentifierWithVersion(identifier, manifest.version)); @@ -1219,9 +1256,6 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } else { await this.extensionManagementService.installFromGallery(gallery, installOptions); } - const ids: string[] | undefined = extension.identifier.uuid ? [extension.identifier.uuid] : undefined; - const names: string[] | undefined = extension.identifier.uuid ? undefined : [extension.identifier.id]; - this.queryGallery({ names, ids, pageSize: 1 }, CancellationToken.None); return this.local.filter(local => areSameExtensions(local.identifier, gallery.identifier))[0]; } finally { this.installing = this.installing.filter(e => e !== extension); @@ -1273,7 +1307,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return this.doSetEnablement(allExtensions, enablementState); } - private getExtensionsRecursively(extensions: IExtension[], installed: IExtension[], enablementState: EnablementState, options: { dependencies: boolean, pack: boolean; }, checked: IExtension[] = []): IExtension[] { + private getExtensionsRecursively(extensions: IExtension[], installed: IExtension[], enablementState: EnablementState, options: { dependencies: boolean; pack: boolean }, checked: IExtension[] = []): IExtension[] { const toCheck = extensions.filter(e => checked.indexOf(e) === -1); if (toCheck.length) { for (const extension of toCheck) { @@ -1422,24 +1456,15 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension const extensionId = match[1]; - this.queryLocal().then(local => { - const extension = local.filter(local => areSameExtensions(local.identifier, { id: extensionId }))[0]; - - if (extension) { - return this.hostService.focus() - .then(() => this.open(extension)); + this.queryLocal().then(async local => { + let extension = local.find(local => areSameExtensions(local.identifier, { id: extensionId })); + if (!extension) { + [extension] = await this.getExtensions([{ id: extensionId }], { source: 'uri' }, CancellationToken.None); + } + if (extension) { + await this.hostService.focus(); + await this.open(extension); } - return this.queryGallery({ names: [extensionId], source: 'uri' }, CancellationToken.None).then(result => { - if (result.total < 1) { - return Promise.resolve(null); - } - - const extension = result.firstPage[0]; - - return this.hostService.focus().then(() => { - return this.open(extension); - }); - }); }).then(undefined, error => this.onError(error)); } @@ -1471,8 +1496,4 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension this.ignoredAutoUpdateExtensions = this.ignoredAutoUpdateExtensions.filter(extensionId => this.local.some(local => !!local.local && new ExtensionIdentifierWithVersion(local.identifier, local.version).key() === extensionId)); } - override dispose(): void { - super.dispose(); - this.syncDelayer.cancel(); - } } diff --git a/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts index cb69e494470..66b7f7280ab 100644 --- a/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.ts @@ -24,7 +24,7 @@ import { Mimes } from 'vs/base/common/mime'; import { getMimeTypes } from 'vs/editor/common/services/languagesAssociations'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IExtensionRecommendationNotificationService, RecommendationsNotificationResult, RecommendationSource } from 'vs/platform/extensionRecommendations/common/extensionRecommendations'; import { IWorkbenchAssignmentService } from 'vs/workbench/services/assignment/common/assignmentService'; import { distinct } from 'vs/base/common/arrays'; @@ -36,8 +36,8 @@ import { ViewContainerLocation } from 'vs/workbench/common/views'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; type FileExtensionSuggestionClassification = { - userReaction: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - fileExtension: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + userReaction: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + fileExtension: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; }; const promptedRecommendationsStorageKey = 'fileBasedRecommendations/promptedRecommendations'; @@ -334,7 +334,7 @@ export class FileBasedRecommendations extends ExtensionRecommendations { label: searchMarketplace, run: () => { this.addToPromptedFileExtensions(fileExtension); - this.telemetryService.publicLog2<{ userReaction: string, fileExtension: string }, FileExtensionSuggestionClassification>('fileExtensionSuggestion:popup', { userReaction: 'ok', fileExtension }); + this.telemetryService.publicLog2<{ userReaction: string; fileExtension: string }, FileExtensionSuggestionClassification>('fileExtensionSuggestion:popup', { userReaction: 'ok', fileExtension }); this.paneCompositeService.openPaneComposite(EXTENSIONS_VIEWLET_ID, ViewContainerLocation.Sidebar, true) .then(viewlet => viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer) .then(viewlet => { @@ -351,13 +351,13 @@ export class FileBasedRecommendations extends ExtensionRecommendations { JSON.stringify(fileExtensionSuggestionIgnoreList), StorageScope.GLOBAL, StorageTarget.USER); - this.telemetryService.publicLog2<{ userReaction: string, fileExtension: string }, FileExtensionSuggestionClassification>('fileExtensionSuggestion:popup', { userReaction: 'neverShowAgain', fileExtension }); + this.telemetryService.publicLog2<{ userReaction: string; fileExtension: string }, FileExtensionSuggestionClassification>('fileExtensionSuggestion:popup', { userReaction: 'neverShowAgain', fileExtension }); } }], { sticky: true, onCancel: () => { - this.telemetryService.publicLog2<{ userReaction: string, fileExtension: string }, FileExtensionSuggestionClassification>('fileExtensionSuggestion:popup', { userReaction: 'cancelled', fileExtension }); + this.telemetryService.publicLog2<{ userReaction: string; fileExtension: string }, FileExtensionSuggestionClassification>('fileExtensionSuggestion:popup', { userReaction: 'cancelled', fileExtension }); } } ); diff --git a/src/vs/workbench/contrib/extensions/browser/media/extension.css b/src/vs/workbench/contrib/extensions/browser/media/extension.css index 2d6c3fd773e..045a90e2073 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extension.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extension.css @@ -103,6 +103,7 @@ margin-left: 2px; } +.extension-list-item > .details > .header-container > .header > .activation-status .activationTime, .extension-list-item > .details > .header-container > .header > .activation-status:not(:empty) .codicon { margin-right: 2px; } @@ -197,6 +198,7 @@ .extension-list-item > .details > .footer > .monaco-action-bar > .actions-container .extension-action.label { max-width: 150px; + line-height: 16px; } .extension-list-item .footer .monaco-action-bar .action-item.action-dropdown-item.empty > .action-label { diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css b/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css index 9da14201996..589bbe1742d 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css @@ -9,7 +9,7 @@ display: flex; flex-direction: column; margin: 0px auto; - max-width: 1000px; + max-width: 80%; } .extension-editor .clickable { @@ -89,15 +89,23 @@ } .extension-editor > .header > .details > .title > .pre-release { - font-size: 10px; margin-left: 10px; padding: 0px 4px; border-radius: 4px; - user-select: none; - -webkit-user-select: none; background-color: var(--vscode-extensionIcon-preReleaseForeground); color: #ffffff; - white-space: nowrap; + display: flex; + align-items: center; +} + +.extension-editor > .header > .details > .title > .pre-release > .codicon.codicon-extensions-pre-release { + color: #ffffff; + font-size: 14px; +} + +.extension-editor > .header > .details > .title > .pre-release > .pre-release-text { + font-size: 10px; + padding-left: 3px; } .monaco-workbench.vs .extension-editor > .header > .details > .title > .preview { diff --git a/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts b/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts index 7384fb0a6fb..84ec5199f0a 100644 --- a/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts +++ b/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.ts @@ -78,7 +78,7 @@ export class WorkspaceRecommendations extends ExtensionRecommendations { } } - private async validateExtensions(contents: IExtensionsConfigContent[]): Promise<{ validRecommendations: string[], invalidRecommendations: string[], message: string }> { + private async validateExtensions(contents: IExtensionsConfigContent[]): Promise<{ validRecommendations: string[]; invalidRecommendations: string[]; message: string }> { const validExtensions: string[] = []; const invalidExtensions: string[] = []; @@ -98,8 +98,8 @@ export class WorkspaceRecommendations extends ExtensionRecommendations { if (extensionsToQuery.length) { try { - const queryResult = await this.galleryService.query({ names: extensionsToQuery, pageSize: extensionsToQuery.length }, CancellationToken.None); - const extensions = queryResult.firstPage.map(extension => extension.identifier.id.toLowerCase()); + const galleryExtensions = await this.galleryService.getExtensions(extensionsToQuery.map(id => ({ id })), CancellationToken.None); + const extensions = galleryExtensions.map(extension => extension.identifier.id.toLowerCase()); for (const extensionId of extensionsToQuery) { if (extensions.indexOf(extensionId) === -1) { diff --git a/src/vs/workbench/contrib/extensions/common/extensions.ts b/src/vs/workbench/contrib/extensions/common/extensions.ts index 1f377b2fe1b..b6744153baf 100644 --- a/src/vs/workbench/contrib/extensions/common/extensions.ts +++ b/src/vs/workbench/contrib/extensions/common/extensions.ts @@ -6,7 +6,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Event } from 'vs/base/common/event'; import { IPager } from 'vs/base/common/paging'; -import { IQueryOptions, ILocalExtension, IGalleryExtension, IExtensionIdentifier, InstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IQueryOptions, ILocalExtension, IGalleryExtension, IExtensionIdentifier, InstallOptions, InstallVSIXOptions, IExtensionInfo, IExtensionQueryOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { EnablementState, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -46,7 +46,7 @@ export interface IExtension { readonly identifier: IExtensionIdentifier; readonly publisher: string; readonly publisherDisplayName: string; - readonly publisherDomain?: { link: string, verified: boolean }; + readonly publisherDomain?: { link: string; verified: boolean }; readonly version: string; readonly latestVersion: string; readonly hasPreReleaseVersion: boolean; @@ -77,7 +77,7 @@ export interface IExtension { readonly local?: ILocalExtension; gallery?: IGalleryExtension; readonly isMalicious: boolean; - readonly isUnsupported: boolean | { preReleaseExtension: { id: string, displayName: string } }; + readonly isUnsupported: boolean | { preReleaseExtension: { id: string; displayName: string } }; } export const SERVICE_ID = 'extensionsWorkbenchService'; @@ -94,8 +94,10 @@ export interface IExtensionsWorkbenchService { queryLocal(server?: IExtensionManagementServer): Promise; queryGallery(token: CancellationToken): Promise>; queryGallery(options: IQueryOptions, token: CancellationToken): Promise>; + getExtensions(extensionInfos: IExtensionInfo[], token: CancellationToken): Promise; + getExtensions(extensionInfos: IExtensionInfo[], options: IExtensionQueryOptions, token: CancellationToken): Promise; canInstall(extension: IExtension): Promise; - install(vsix: URI): Promise; + install(vsix: URI, installOptions?: InstallVSIXOptions): Promise; install(extension: IExtension, installOptions?: InstallOptions): Promise; uninstall(extension: IExtension): Promise; installVersion(extension: IExtension, version: string, installOptions?: InstallOptions): Promise; diff --git a/src/vs/workbench/contrib/extensions/common/extensionsUtils.ts b/src/vs/workbench/contrib/extensions/common/extensionsUtils.ts index e8bfa7eb186..b822f481e8c 100644 --- a/src/vs/workbench/contrib/extensions/common/extensionsUtils.ts +++ b/src/vs/workbench/contrib/extensions/common/extensionsUtils.ts @@ -7,7 +7,6 @@ import { localize } from 'vs/nls'; import { Event } from 'vs/base/common/event'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IExtensionManagementService, ILocalExtension, IExtensionIdentifier, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; @@ -31,7 +30,6 @@ export class KeymapExtensions extends Disposable implements IWorkbenchContributi @IExtensionRecommendationsService private readonly tipsService: IExtensionRecommendationsService, @ILifecycleService lifecycleService: ILifecycleService, @INotificationService private readonly notificationService: INotificationService, - @ITelemetryService private readonly telemetryService: ITelemetryService, ) { super(); this._register(lifecycleService.onDidShutdown(() => this.dispose())); @@ -57,19 +55,6 @@ export class KeymapExtensions extends Disposable implements IWorkbenchContributi private promptForDisablingOtherKeymaps(newKeymap: IExtensionStatus, oldKeymaps: IExtensionStatus[]): void { const onPrompt = (confirmed: boolean) => { - const telemetryData: { [key: string]: any; } = { - newKeymap: newKeymap.identifier, - oldKeymaps: oldKeymaps.map(k => k.identifier), - confirmed - }; - /* __GDPR__ - "disableOtherKeymaps" : { - "newKeymap": { "${inline}": [ "${ExtensionIdentifier}" ] }, - "oldKeymaps": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "confirmed" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } - } - */ - this.telemetryService.publicLog('disableOtherKeymaps', telemetryData); if (confirmed) { this.extensionEnablementService.setEnablement(oldKeymaps.map(keymap => keymap.local), EnablementState.DisabledGlobally); } diff --git a/src/vs/workbench/contrib/extensions/electron-sandbox/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-sandbox/extensions.contribution.ts index 19a6f4de8e8..12b0254f02f 100644 --- a/src/vs/workbench/contrib/extensions/electron-sandbox/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-sandbox/extensions.contribution.ts @@ -14,7 +14,8 @@ import { EditorPaneDescriptor, IEditorPaneRegistry } from 'vs/workbench/browser/ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { RuntimeExtensionsEditor, StartExtensionHostProfileAction, StopExtensionHostProfileAction, CONTEXT_PROFILE_SESSION_STATE, CONTEXT_EXTENSION_HOST_PROFILE_RECORDED, SaveExtensionHostProfileAction, IExtensionHostProfileService } from 'vs/workbench/contrib/extensions/electron-sandbox/runtimeExtensionsEditor'; import { DebugExtensionHostAction } from 'vs/workbench/contrib/extensions/electron-sandbox/debugExtensionHostAction'; -import { IEditorSerializer, IEditorFactoryRegistry, ActiveEditorContext, EditorExtensions } from 'vs/workbench/common/editor'; +import { IEditorSerializer, IEditorFactoryRegistry, EditorExtensions } from 'vs/workbench/common/editor'; +import { ActiveEditorContext } from 'vs/workbench/common/contextkeys'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { RuntimeExtensionsInput } from 'vs/workbench/contrib/extensions/common/runtimeExtensionsInput'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/contrib/extensions/electron-sandbox/extensionsAutoProfiler.ts b/src/vs/workbench/contrib/extensions/electron-sandbox/extensionsAutoProfiler.ts index ec49247f46d..e967b931728 100644 --- a/src/vs/workbench/contrib/extensions/electron-sandbox/extensionsAutoProfiler.ts +++ b/src/vs/workbench/contrib/extensions/electron-sandbox/extensionsAutoProfiler.ts @@ -23,6 +23,7 @@ import { ExtensionHostProfiler } from 'vs/workbench/services/extensions/electron import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; import { IFileService } from 'vs/platform/files/common/files'; import { VSBuffer } from 'vs/base/common/buffer'; +import { timeout } from 'vs/base/common/async'; export class ExtensionsAutoProfiler extends Disposable implements IWorkbenchContribution { @@ -55,6 +56,8 @@ export class ExtensionsAutoProfiler extends Disposable implements IWorkbenchCont if (event.isResponsive && this._session) { // stop profiling when responsive again this._session.cancel(); + this._logService.info('UNRESPONSIVE extension host: received responsive event and cancelling profiling session'); + } else if (!event.isResponsive && !this._session) { // start profiling if not yet profiling @@ -73,12 +76,16 @@ export class ExtensionsAutoProfiler extends Disposable implements IWorkbenchCont // connected already return; } + this._logService.info('UNRESPONSIVE extension host: starting to profile NOW'); // wait 5 seconds or until responsive again - await new Promise(resolve => { - cts.token.onCancellationRequested(resolve); - setTimeout(resolve, 5e3); - }); + try { + await timeout(5e3, cts.token); + } catch { + // can throw cancellation error. that is + // OK, we stop profiling and analyse the + // profile anyways + } try { // stop profiling and analyse results @@ -143,7 +150,7 @@ export class ExtensionsAutoProfiler extends Disposable implements IWorkbenchCont // print message to log const path = joinPath(this._environmentServie.tmpDir, `exthost-${Math.random().toString(16).slice(2, 8)}.cpuprofile`); await this._fileService.writeFile(path, VSBuffer.fromString(JSON.stringify(profile.data))); - this._logService.warn(`UNRESPONSIVE extension host, '${top.id}' took ${top.percentage}% of ${duration / 1e3}ms, saved PROFILE here: '${path}'`, data); + this._logService.warn(`UNRESPONSIVE extension host: '${top.id}' took ${top.percentage}% of ${duration / 1e3}ms, saved PROFILE here: '${path}'`, data); /* __GDPR__ diff --git a/src/vs/workbench/contrib/extensions/electron-sandbox/extensionsSlowActions.ts b/src/vs/workbench/contrib/extensions/electron-sandbox/extensionsSlowActions.ts index ece72ff038c..20154ad70e6 100644 --- a/src/vs/workbench/contrib/extensions/electron-sandbox/extensionsSlowActions.ts +++ b/src/vs/workbench/contrib/extensions/electron-sandbox/extensionsSlowActions.ts @@ -104,7 +104,7 @@ export async function createSlowExtensionAction( return undefined; } - const data = <{ total_count: number; }>JSON.parse(rawText); + const data = <{ total_count: number }>JSON.parse(rawText); if (!data || typeof data.total_count !== 'number') { return undefined; } else if (data.total_count === 0) { diff --git a/src/vs/workbench/contrib/extensions/electron-sandbox/remoteExtensionsInit.ts b/src/vs/workbench/contrib/extensions/electron-sandbox/remoteExtensionsInit.ts index 8c65ebcc1bc..13380b3aaf5 100644 --- a/src/vs/workbench/contrib/extensions/electron-sandbox/remoteExtensionsInit.ts +++ b/src/vs/workbench/contrib/extensions/electron-sandbox/remoteExtensionsInit.ts @@ -19,7 +19,7 @@ import { IIgnoredExtensionsManagementService } from 'vs/platform/userDataSync/co import { IRemoteUserData, IUserDataSyncStoreManagementService, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncStoreClient } from 'vs/platform/userDataSync/common/userDataSyncStoreService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -120,7 +120,8 @@ class RemoteExtensionsInitializer extends AbstractExtensionsInitializer { this.logService.trace('No new remote extensions to install.'); return; } - const extensionsToInstall = await this.extensionGalleryService.getExtensions(newExtensions, CancellationToken.None); + const targetPlatform = await this.extensionManagementService.getTargetPlatform(); + const extensionsToInstall = await this.extensionGalleryService.getExtensions(newExtensions, { targetPlatform, compatible: true }, CancellationToken.None); if (extensionsToInstall.length) { await Promise.allSettled(extensionsToInstall.map(async e => { const manifest = await this.extensionGalleryService.getManifest(e, CancellationToken.None); diff --git a/src/vs/workbench/contrib/extensions/electron-sandbox/reportExtensionIssueAction.ts b/src/vs/workbench/contrib/extensions/electron-sandbox/reportExtensionIssueAction.ts index f1755db8c40..9e85ffd28e4 100644 --- a/src/vs/workbench/contrib/extensions/electron-sandbox/reportExtensionIssueAction.ts +++ b/src/vs/workbench/contrib/extensions/electron-sandbox/reportExtensionIssueAction.ts @@ -28,7 +28,7 @@ export class ReportExtensionIssueAction extends Action { description: IExtensionDescription; marketplaceInfo: IExtension; status?: IExtensionsStatus; - unresponsiveProfile?: IExtensionHostProfile + unresponsiveProfile?: IExtensionHostProfile; }, @IOpenerService private readonly openerService: IOpenerService, @IClipboardService private readonly clipboardService: IClipboardService, @@ -51,7 +51,7 @@ export class ReportExtensionIssueAction extends Action { description: IExtensionDescription; marketplaceInfo: IExtension; status?: IExtensionsStatus; - unresponsiveProfile?: IExtensionHostProfile + unresponsiveProfile?: IExtensionHostProfile; }): Promise { let baseUrl = extension.marketplaceInfo && extension.marketplaceInfo.type === ExtensionType.User && extension.description.repository ? extension.description.repository.url : undefined; if (!baseUrl && extension.description.isBuiltin) { diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionRecommendationsService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionRecommendationsService.test.ts index c8adb39dd7b..54ddc028ea9 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionRecommendationsService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionRecommendationsService.test.ts @@ -267,7 +267,7 @@ suite('ExtensionRecommendationsService Test', () => { instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', []); instantiationService.stub(IExtensionGalleryService, 'isEnabled', true); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(...mockExtensionGallery)); - instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', []); + instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', mockExtensionGallery); prompted = false; 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 40311f96288..db09b172dda 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 @@ -10,7 +10,7 @@ import * as ExtensionsActions from 'vs/workbench/contrib/extensions/browser/exte import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService'; import { IExtensionManagementService, IExtensionGalleryService, ILocalExtension, IGalleryExtension, - DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, InstallOperation, IExtensionTipsService, IGalleryMetadata, InstallExtensionResult, getTargetPlatform + DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, InstallOperation, IExtensionTipsService, IGalleryMetadata, InstallExtensionResult, getTargetPlatform, IExtensionsControlManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; @@ -108,7 +108,7 @@ async function setupTest() { return local; }, async canInstall() { return true; }, - async getTargetPlatform() { return getTargetPlatform(platform, arch); } + async getTargetPlatform() { return getTargetPlatform(platform, arch); }, }); instantiationService.stub(IRemoteAgentService, RemoteAgentService); @@ -2415,7 +2415,8 @@ function createExtensionManagementService(installed: ILocalExtension[] = []): IE local.publisherId = metadata.publisherId; return local; }, - async getTargetPlatform() { return getTargetPlatform(platform, arch); } + async getTargetPlatform() { return getTargetPlatform(platform, arch); }, + async getExtensionsControlManifest() { return { malicious: [] }; }, }; } 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 eaf5e61e88f..39f0b2ca026 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 @@ -11,7 +11,7 @@ import { IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/com import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService'; import { IExtensionManagementService, IExtensionGalleryService, ILocalExtension, IGalleryExtension, IQueryOptions, - DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, SortBy, InstallExtensionResult, getTargetPlatform + DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, SortBy, InstallExtensionResult, getTargetPlatform, IExtensionInfo } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IExtensionRecommendationsService, ExtensionRecommendationReason } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; @@ -352,15 +352,15 @@ suite('ExtensionsListView Tests', () => { workspaceRecommendationB, configBasedRecommendationA, ]; - const target = instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(...workspaceRecommendedExtensions)); + const target = instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', workspaceRecommendedExtensions); return testableView.show('@recommended:workspace').then(result => { assert.ok(target.calledOnce); - const options: IQueryOptions = target.args[0][0]; - assert.strictEqual(options.names!.length, workspaceRecommendedExtensions.length); + const extensionInfos: IExtensionInfo[] = target.args[0][0]; + assert.strictEqual(extensionInfos.length, workspaceRecommendedExtensions.length); assert.strictEqual(result.length, workspaceRecommendedExtensions.length); for (let i = 0; i < workspaceRecommendedExtensions.length; i++) { - assert.strictEqual(options.names![i], workspaceRecommendedExtensions[i].identifier.id); + assert.strictEqual(extensionInfos[i].id, workspaceRecommendedExtensions[i].identifier.id); assert.strictEqual(result.get(i).identifier.id, workspaceRecommendedExtensions[i].identifier.id); } }); @@ -373,16 +373,16 @@ suite('ExtensionsListView Tests', () => { configBasedRecommendationB, otherRecommendationA ]; - const target = instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(...allRecommendedExtensions)); + const target = instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', allRecommendedExtensions); return testableView.show('@recommended').then(result => { - const options: IQueryOptions = target.args[0][0]; + const extensionInfos: IExtensionInfo[] = target.args[0][0]; assert.ok(target.calledOnce); - assert.strictEqual(options.names!.length, allRecommendedExtensions.length); + assert.strictEqual(extensionInfos.length, allRecommendedExtensions.length); assert.strictEqual(result.length, allRecommendedExtensions.length); for (let i = 0; i < allRecommendedExtensions.length; i++) { - assert.strictEqual(options.names![i], allRecommendedExtensions[i].identifier.id); + assert.strictEqual(extensionInfos[i].id, allRecommendedExtensions[i].identifier.id); assert.strictEqual(result.get(i).identifier.id, allRecommendedExtensions[i].identifier.id); } }); @@ -399,16 +399,16 @@ suite('ExtensionsListView Tests', () => { configBasedRecommendationB, otherRecommendationA, ]; - const target = instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(...allRecommendedExtensions)); + const target = instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', allRecommendedExtensions); return testableView.show('@recommended:all').then(result => { - const options: IQueryOptions = target.args[0][0]; + const extensionInfos: IExtensionInfo[] = target.args[0][0]; assert.ok(target.calledOnce); - assert.strictEqual(options.names!.length, allRecommendedExtensions.length); + assert.strictEqual(extensionInfos.length, allRecommendedExtensions.length); assert.strictEqual(result.length, allRecommendedExtensions.length); for (let i = 0; i < allRecommendedExtensions.length; i++) { - assert.strictEqual(options.names![i], allRecommendedExtensions[i].identifier.id); + assert.strictEqual(extensionInfos[i].id, allRecommendedExtensions[i].identifier.id); assert.strictEqual(result.get(i).identifier.id, allRecommendedExtensions[i].identifier.id); } }); @@ -420,18 +420,18 @@ suite('ExtensionsListView Tests', () => { fileBasedRecommendationA ]; const experimentTarget = instantiationService.stubPromise(IExperimentService, 'getCuratedExtensionsList', curatedList.map(e => e.identifier.id)); - const queryTarget = instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(...curatedList)); + const queryTarget = instantiationService.stubPromise(IExtensionGalleryService, 'getExtensions', curatedList); return testableView.show('curated:mykey').then(result => { const curatedKey: string = experimentTarget.args[0][0]; - const options: IQueryOptions = queryTarget.args[0][0]; + const extensionInfos: IExtensionInfo[] = queryTarget.args[0][0]; assert.ok(experimentTarget.calledOnce); assert.ok(queryTarget.calledOnce); - assert.strictEqual(options.names!.length, curatedList.length); + assert.strictEqual(extensionInfos.length, curatedList.length); assert.strictEqual(result.length, curatedList.length); for (let i = 0; i < curatedList.length; i++) { - assert.strictEqual(options.names![i], curatedList[i].identifier.id); + assert.strictEqual(extensionInfos[i].id, curatedList[i].identifier.id); assert.strictEqual(result.get(i).identifier.id, curatedList[i].identifier.id); } assert.strictEqual(curatedKey, 'mykey'); diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index a5a52385a93..e8196ac0c88 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -11,7 +11,7 @@ import { IExtensionsWorkbenchService, ExtensionState, AutoCheckUpdatesConfigurat import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService'; import { IExtensionManagementService, IExtensionGalleryService, ILocalExtension, IGalleryExtension, - DidUninstallExtensionEvent, InstallExtensionEvent, IGalleryExtensionAssets, IExtensionIdentifier, InstallOperation, IExtensionTipsService, IGalleryMetadata, InstallExtensionResult, getTargetPlatform + DidUninstallExtensionEvent, InstallExtensionEvent, IGalleryExtensionAssets, IExtensionIdentifier, InstallOperation, IExtensionTipsService, IGalleryMetadata, InstallExtensionResult, getTargetPlatform, IExtensionsControlManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; @@ -34,7 +34,8 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { NativeURLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { ExtensionType, IExtension, ExtensionKind } from 'vs/platform/extensions/common/extensions'; +import { ExtensionType, IExtension } from 'vs/platform/extensions/common/extensions'; +import { ExtensionKind } from 'vs/platform/environment/common/environment'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-sandbox/remoteAgentService'; import { ISharedProcessService } from 'vs/platform/ipc/electron-sandbox/services'; @@ -1519,7 +1520,8 @@ suite('ExtensionsWorkbenchServiceTest', () => { local.publisherId = metadata.publisherId; return local; }, - getTargetPlatform: async () => getTargetPlatform(platform, arch) + getTargetPlatform: async () => getTargetPlatform(platform, arch), + async getExtensionsControlManifest() { return { malicious: [] }; }, }; } }); diff --git a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts index 9147b17ce13..b1cdf5d227a 100644 --- a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts @@ -8,7 +8,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { URI } from 'vs/base/common/uri'; import { MenuId, MenuRegistry, IMenuItem } from 'vs/platform/actions/common/actions'; import { ITerminalGroupService, ITerminalService as IIntegratedTerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; import { IFileService } from 'vs/platform/files/common/files'; import { IListService } from 'vs/platform/list/browser/listService'; import { getMultiSelectedResources, IExplorerService } from 'vs/workbench/contrib/files/browser/files'; diff --git a/src/vs/workbench/contrib/externalTerminal/electron-sandbox/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/electron-sandbox/externalTerminal.contribution.ts index f614f79745a..6da2c2b1ad8 100644 --- a/src/vs/workbench/contrib/externalTerminal/electron-sandbox/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/electron-sandbox/externalTerminal.contribution.ts @@ -106,7 +106,7 @@ export class ExternalTerminalContribution implements IWorkbenchContribution { nls.localize('terminal.explorerKind.integrated', "Use VS Code's integrated terminal."), nls.localize('terminal.explorerKind.external', "Use the configured external terminal.") ], - description: nls.localize('explorer.openInTerminalKind', "Customizes what kind of terminal to launch."), + description: nls.localize('explorer.openInTerminalKind', "When opening a file from the explorer in a terminal, determines what kind of terminal will be launched"), default: 'integrated' }, 'terminal.external.windowsExec': { diff --git a/src/vs/workbench/contrib/externalUriOpener/common/contributedOpeners.ts b/src/vs/workbench/contrib/externalUriOpener/common/contributedOpeners.ts index 24a9f06dcee..6b3229c7bf3 100644 --- a/src/vs/workbench/contrib/externalUriOpener/common/contributedOpeners.ts +++ b/src/vs/workbench/contrib/externalUriOpener/common/contributedOpeners.ts @@ -12,7 +12,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten interface RegisteredExternalOpener { readonly extensionId: string; - isCurrentlyRegistered: boolean + isCurrentlyRegistered: boolean; } interface OpenersMemento { diff --git a/src/vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService.ts b/src/vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService.ts index 6cc9f55b2b0..63b4e36e63e 100644 --- a/src/vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService.ts +++ b/src/vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService.ts @@ -10,7 +10,7 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { LinkedList } from 'vs/base/common/linkedList'; import { isWeb } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -34,12 +34,12 @@ export interface IExternalUriOpener { readonly id: string; readonly label: string; - canOpen(uri: URI, token: CancellationToken): Promise; + canOpen(uri: URI, token: CancellationToken): Promise; openExternalUri(uri: URI, ctx: { sourceUri: URI }, token: CancellationToken): Promise; } export interface IExternalUriOpenerService { - readonly _serviceBrand: undefined + readonly _serviceBrand: undefined; /** * Registers a provider for external resources openers. @@ -50,7 +50,7 @@ export interface IExternalUriOpenerService { * Get the configured IExternalUriOpener for the the uri. * If there is no opener configured, then returns the first opener that can handle the uri. */ - getOpener(uri: URI, ctx: { sourceUri: URI, preferredOpenerId?: string }, token: CancellationToken): Promise; + getOpener(uri: URI, ctx: { sourceUri: URI; preferredOpenerId?: string }, token: CancellationToken): Promise; } export class ExternalUriOpenerService extends Disposable implements IExternalUriOpenerService, IExternalOpener { @@ -76,7 +76,7 @@ export class ExternalUriOpenerService extends Disposable implements IExternalUri return { dispose: remove }; } - private async getOpeners(targetUri: URI, allowOptional: boolean, ctx: { sourceUri: URI, preferredOpenerId?: string }, token: CancellationToken): Promise { + private async getOpeners(targetUri: URI, allowOptional: boolean, ctx: { sourceUri: URI; preferredOpenerId?: string }, token: CancellationToken): Promise { const allOpeners = await this.getAllOpenersForUri(targetUri); if (allOpeners.size === 0) { @@ -104,9 +104,9 @@ export class ExternalUriOpenerService extends Disposable implements IExternalUri } // Then check to see if there is a valid opener - const validOpeners: Array<{ opener: IExternalUriOpener, priority: modes.ExternalUriOpenerPriority }> = []; + const validOpeners: Array<{ opener: IExternalUriOpener; priority: languages.ExternalUriOpenerPriority }> = []; await Promise.all(Array.from(allOpeners.values()).map(async opener => { - let priority: modes.ExternalUriOpenerPriority; + let priority: languages.ExternalUriOpenerPriority; try { priority = await opener.canOpen(ctx.sourceUri, token); } catch (e) { @@ -115,9 +115,9 @@ export class ExternalUriOpenerService extends Disposable implements IExternalUri } switch (priority) { - case modes.ExternalUriOpenerPriority.Option: - case modes.ExternalUriOpenerPriority.Default: - case modes.ExternalUriOpenerPriority.Preferred: + case languages.ExternalUriOpenerPriority.Option: + case languages.ExternalUriOpenerPriority.Default: + case languages.ExternalUriOpenerPriority.Preferred: validOpeners.push({ opener, priority }); break; } @@ -128,20 +128,20 @@ export class ExternalUriOpenerService extends Disposable implements IExternalUri } // See if we have a preferred opener first - const preferred = firstOrDefault(validOpeners.filter(x => x.priority === modes.ExternalUriOpenerPriority.Preferred)); + const preferred = firstOrDefault(validOpeners.filter(x => x.priority === languages.ExternalUriOpenerPriority.Preferred)); if (preferred) { return [preferred.opener]; } // See if we only have optional openers, use the default opener - if (!allowOptional && validOpeners.every(x => x.priority === modes.ExternalUriOpenerPriority.Option)) { + if (!allowOptional && validOpeners.every(x => x.priority === languages.ExternalUriOpenerPriority.Option)) { return []; } return validOpeners.map(value => value.opener); } - async openExternal(href: string, ctx: { sourceUri: URI, preferredOpenerId?: string }, token: CancellationToken): Promise { + async openExternal(href: string, ctx: { sourceUri: URI; preferredOpenerId?: string }, token: CancellationToken): Promise { const targetUri = typeof href === 'string' ? URI.parse(href) : href; @@ -156,7 +156,7 @@ export class ExternalUriOpenerService extends Disposable implements IExternalUri return this.showOpenerPrompt(allOpeners, targetUri, ctx, token); } - async getOpener(targetUri: URI, ctx: { sourceUri: URI, preferredOpenerId?: string }, token: CancellationToken): Promise { + async getOpener(targetUri: URI, ctx: { sourceUri: URI; preferredOpenerId?: string }, token: CancellationToken): Promise { const allOpeners = await this.getOpeners(targetUri, true, ctx, token); if (allOpeners.length >= 1) { return allOpeners[0]; diff --git a/src/vs/workbench/contrib/files/browser/editors/fileEditorInput.ts b/src/vs/workbench/contrib/files/browser/editors/fileEditorInput.ts index 487bdeff880..72bf97553f8 100644 --- a/src/vs/workbench/contrib/files/browser/editors/fileEditorInput.ts +++ b/src/vs/workbench/contrib/files/browser/editors/fileEditorInput.ts @@ -402,7 +402,7 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements untypedInput.languageId = this.getLanguageId(); untypedInput.contents = (() => { const model = this.textFileService.files.get(this.resource); - if (model && model.isDirty()) { + if (model?.isDirty()) { return model.textEditorModel.getValue(); // only if dirty } diff --git a/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts b/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts index 19f04b63abe..2869ee398f1 100644 --- a/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts @@ -139,10 +139,21 @@ export class TextFileEditor extends BaseTextEditor { const textEditor = assertIsDefined(this.getControl()); textEditor.setModel(textFileModel.textEditorModel); - // View state - const editorViewState = this.loadEditorViewState(input, context); - if (editorViewState) { - textEditor.restoreViewState(editorViewState); + // Restore view state (unless provided by options) + if (!options?.viewState) { + const editorViewState = this.loadEditorViewState(input, context); + if (editorViewState) { + if (options?.selection) { + // If we have a selection, make sure to not + // restore any selection from the view state + // to ensure the right selection change event + // is fired and we avoid changing selections + // twice. + editorViewState.cursorState = []; + } + + textEditor.restoreViewState(editorViewState); + } } // Apply options to editor if any diff --git a/src/vs/workbench/contrib/files/browser/explorerService.ts b/src/vs/workbench/contrib/files/browser/explorerService.ts index 59bff887216..a12970017cf 100644 --- a/src/vs/workbench/contrib/files/browser/explorerService.ts +++ b/src/vs/workbench/contrib/files/browser/explorerService.ts @@ -32,7 +32,7 @@ export class ExplorerService implements IExplorerService { private static readonly EXPLORER_FILE_CHANGES_REACT_DELAY = 500; // delay in ms to react to file changes to give our internal events a chance to react first private readonly disposables = new DisposableStore(); - private editable: { stat: ExplorerItem, data: IEditableData } | undefined; + private editable: { stat: ExplorerItem; data: IEditableData } | undefined; private _sortOrder: SortOrder; private _lexicographicOptions: LexicographicOptions; private cutItems: ExplorerItem[] | undefined; @@ -153,7 +153,7 @@ export class ExplorerService implements IExplorerService { return this.view.getContext(respectMultiSelection); } - async applyBulkEdit(edit: ResourceFileEdit[], options: { undoLabel: string, progressLabel: string, confirmBeforeUndo?: boolean, progressLocation?: ProgressLocation.Explorer | ProgressLocation.Window }): Promise { + async applyBulkEdit(edit: ResourceFileEdit[], options: { undoLabel: string; progressLabel: string; confirmBeforeUndo?: boolean; progressLocation?: ProgressLocation.Explorer | ProgressLocation.Window }): Promise { const cancellationTokenSource = new CancellationTokenSource(); const promise = this.progressService.withProgress({ location: options.progressLocation || ProgressLocation.Window, @@ -219,7 +219,7 @@ export class ExplorerService implements IExplorerService { return !!this.cutItems && this.cutItems.indexOf(item) >= 0; } - getEditable(): { stat: ExplorerItem, data: IEditableData } | undefined { + getEditable(): { stat: ExplorerItem; data: IEditableData } | undefined { return this.editable; } diff --git a/src/vs/workbench/contrib/files/browser/explorerViewlet.ts b/src/vs/workbench/contrib/files/browser/explorerViewlet.ts index e126d1b0159..b28bfee2731 100644 --- a/src/vs/workbench/contrib/files/browser/explorerViewlet.ts +++ b/src/vs/workbench/contrib/files/browser/explorerViewlet.ts @@ -29,7 +29,7 @@ import { KeyChord, KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { Registry } from 'vs/platform/registry/common/platform'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { WorkbenchStateContext, RemoteNameContext } from 'vs/workbench/browser/contextkeys'; +import { WorkbenchStateContext, RemoteNameContext } from 'vs/workbench/common/contextkeys'; import { IsIOSContext, IsWebContext } from 'vs/platform/contextkey/common/contextkeys'; import { AddRootFolderAction, OpenFolderAction, OpenFileFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; import { isMacintosh, isWeb } from 'vs/base/common/platform'; diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index c09913cef17..9589960e2da 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -18,14 +18,11 @@ import { FilesExplorerFocusCondition, ExplorerRootContext, ExplorerFolderContext import { ADD_ROOT_FOLDER_COMMAND_ID, ADD_ROOT_FOLDER_LABEL } from 'vs/workbench/browser/actions/workspaceCommands'; import { CLOSE_SAVED_EDITORS_COMMAND_ID, CLOSE_EDITORS_IN_GROUP_COMMAND_ID, CLOSE_EDITOR_COMMAND_ID, CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; import { AutoSaveAfterShortDelayContext } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; import { WorkbenchListDoubleSelection } from 'vs/platform/list/browser/listService'; import { Schemas } from 'vs/base/common/network'; -import { DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, WorkbenchStateContext, WorkspaceFolderCountContext } from 'vs/workbench/browser/contextkeys'; +import { DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, WorkbenchStateContext, WorkspaceFolderCountContext, SidebarFocusContext, ActiveEditorCanRevertContext, ActiveEditorContext, ResourceContextKey } from 'vs/workbench/common/contextkeys'; import { IsWebContext } from 'vs/platform/contextkey/common/contextkeys'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { ActiveEditorCanRevertContext, ActiveEditorContext } from 'vs/workbench/common/editor'; -import { SidebarFocusContext } from 'vs/workbench/common/viewlet'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IExplorerService } from 'vs/workbench/contrib/files/browser/files'; import { Codicon } from 'vs/base/common/codicons'; diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 4bee5f56d39..c98b2d4bf65 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -11,7 +11,7 @@ import { URI } from 'vs/base/common/uri'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { Action } from 'vs/base/common/actions'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { VIEWLET_ID, IFilesConfiguration, VIEW_ID, UndoEnablement } from 'vs/workbench/contrib/files/common/files'; +import { VIEWLET_ID, IFilesConfiguration, VIEW_ID, UndoConfirmLevel } from 'vs/workbench/contrib/files/common/files'; import { IFileService } from 'vs/platform/files/common/files'; import { EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; import { IQuickInputService, ItemActivation } from 'vs/platform/quickinput/common/quickInput'; @@ -22,7 +22,7 @@ import { REVEAL_IN_EXPLORER_COMMAND_ID, SAVE_ALL_IN_GROUP_COMMAND_ID, NEW_UNTITL import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -230,7 +230,7 @@ async function deleteFiles(explorerService: IExplorerService, workingCopyFileSer } } -function getMoveToTrashMessage(distinctElements: ExplorerItem[]): { message: string, detail: string } { +function getMoveToTrashMessage(distinctElements: ExplorerItem[]): { message: string; detail: string } { if (containsBothDirectoryAndFile(distinctElements)) { return { message: nls.localize('confirmMoveTrashMessageFilesAndDirectories', "Are you sure you want to delete the following {0} files/directories and their contents?", distinctElements.length), @@ -252,14 +252,14 @@ function getMoveToTrashMessage(distinctElements: ExplorerItem[]): { message: str }; } - if (distinctElements[0].isDirectory) { + if (distinctElements[0].isDirectory && !distinctElements[0].isSymbolicLink) { return { message: nls.localize('confirmMoveTrashMessageFolder', "Are you sure you want to delete '{0}' and its contents?", distinctElements[0].name), detail: '' }; } return { message: nls.localize('confirmMoveTrashMessageFile', "Are you sure you want to delete '{0}'?", distinctElements[0].name), detail: '' }; } -function getDeleteMessage(distinctElements: ExplorerItem[]): { message: string, detail: string } { +function getDeleteMessage(distinctElements: ExplorerItem[]): { message: string; detail: string } { if (containsBothDirectoryAndFile(distinctElements)) { return { message: nls.localize('confirmDeleteMessageFilesAndDirectories', "Are you sure you want to permanently delete the following {0} files/directories and their contents?", distinctElements.length), @@ -296,7 +296,7 @@ function containsBothDirectoryAndFile(distinctElements: ExplorerItem[]): boolean } -export function findValidPasteFileTarget(explorerService: IExplorerService, targetFolder: ExplorerItem, fileToPaste: { resource: URI, isDirectory?: boolean, allowOverwrite: boolean }, incrementalNaming: 'simple' | 'smart'): URI { +export function findValidPasteFileTarget(explorerService: IExplorerService, targetFolder: ExplorerItem, fileToPaste: { resource: URI; isDirectory?: boolean; allowOverwrite: boolean }, incrementalNaming: 'simple' | 'smart'): URI { let name = resources.basenameOrAuthority(fileToPaste.resource); let candidate = resources.joinPath(targetFolder.resource, name); @@ -622,7 +622,7 @@ export class ShowOpenedFileInNewWindow extends Action { } } -export function validateFileName(pathService: IPathService, item: ExplorerItem, name: string, os: OperatingSystem): { content: string, severity: Severity } | null { +export function validateFileName(pathService: IPathService, item: ExplorerItem, name: string, os: OperatingSystem): { content: string; severity: Severity } | null { // Produce a well formed file name name = getWellFormedFileName(name); @@ -870,6 +870,7 @@ export const renameHandler = async (accessor: ServicesAccessor) => { const notificationService = accessor.get(INotificationService); const remoteAgentService = accessor.get(IRemoteAgentService); const pathService = accessor.get(IPathService); + const configurationService = accessor.get(IConfigurationService); const stats = explorerService.getContext(false); const stat = stats.length > 0 ? stats[0] : undefined; @@ -888,6 +889,7 @@ export const renameHandler = async (accessor: ServicesAccessor) => { if (stat.resource.toString() !== targetResource.toString()) { try { await explorerService.applyBulkEdit([new ResourceFileEdit(stat.resource, targetResource)], { + confirmBeforeUndo: configurationService.getValue().explorer.confirmUndo === UndoConfirmLevel.Verbose, undoLabel: nls.localize('renameBulkEdit', "Rename {0} to {1}", stat.name, value), progressLabel: nls.localize('renamingBulkEdit', "Renaming {0} to {1}", stat.name, value), }); @@ -1029,6 +1031,7 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { if (pasteShouldMove) { const resourceFileEdits = sourceTargetPairs.map(pair => new ResourceFileEdit(pair.source, pair.target)); 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) : nls.localize({ key: 'movingFileBulkEdit', comment: ['Placeholder will be replaced by the name of the file moved.'] }, "Moving {0}", resources.basenameOrAuthority(sourceTargetPairs[0].target)), undoLabel: sourceTargetPairs.length > 1 ? nls.localize({ key: 'moveBulkEdit', comment: ['Placeholder will be replaced by the number of files being moved'] }, "Move {0} files", sourceTargetPairs.length) @@ -1037,8 +1040,9 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { await explorerService.applyBulkEdit(resourceFileEdits, options); } else { const resourceFileEdits = sourceTargetPairs.map(pair => new ResourceFileEdit(pair.source, pair.target, { copy: true })); + const undoLevel = configurationService.getValue().explorer.confirmUndo; const options = { - confirmBeforeUndo: configurationService.getValue().explorer.enableUndo === UndoEnablement.Warn, + confirmBeforeUndo: undoLevel === UndoConfirmLevel.Default || undoLevel === UndoConfirmLevel.Verbose, progressLabel: sourceTargetPairs.length > 1 ? nls.localize({ key: 'copyingBulkEdit', comment: ['Placeholder will be replaced by the number of files being copied'] }, "Copying {0} files", sourceTargetPairs.length) : nls.localize({ key: 'copyingFileBulkEdit', comment: ['Placeholder will be replaced by the name of the file copied.'] }, "Copying {0}", resources.basenameOrAuthority(sourceTargetPairs[0].target)), undoLabel: sourceTargetPairs.length > 1 ? nls.localize({ key: 'copyBulkEdit', comment: ['Placeholder will be replaced by the number of files being copied'] }, "Paste {0} files", sourceTargetPairs.length) diff --git a/src/vs/workbench/contrib/files/browser/fileCommands.ts b/src/vs/workbench/contrib/files/browser/fileCommands.ts index a4563b415f8..38d0cb6243e 100644 --- a/src/vs/workbench/contrib/files/browser/fileCommands.ts +++ b/src/vs/workbench/contrib/files/browser/fileCommands.ts @@ -10,7 +10,7 @@ import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEdit import { IWindowOpenable, IOpenWindowOptions, isWorkspaceToOpen, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, UNTITLED_WORKSPACE_NAME } from 'vs/platform/workspace/common/workspace'; import { ExplorerFocusCondition, TextFileContentProvider, VIEWLET_ID, ExplorerCompressedFocusContext, ExplorerCompressedFirstFocusContext, ExplorerCompressedLastFocusContext, FilesExplorerFocusCondition, ExplorerFolderContext } from 'vs/workbench/contrib/files/common/files'; import { ExplorerViewPaneContainer } from 'vs/workbench/contrib/files/browser/explorerViewlet'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; @@ -35,7 +35,6 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { basename, joinPath, isEqual } from 'vs/base/common/resources'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { UNTITLED_WORKSPACE_NAME } from 'vs/platform/workspaces/common/workspaces'; import { coalesce } from 'vs/base/common/arrays'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/embeddedCodeEditorWidget'; @@ -685,7 +684,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ } ] }, - handler: async (accessor, args?: { viewType: string; }) => { + handler: async (accessor, args?: { viewType: string }) => { const editorService = accessor.get(IEditorService); await editorService.openEditor({ diff --git a/src/vs/workbench/contrib/files/browser/fileImportExport.ts b/src/vs/workbench/contrib/files/browser/fileImportExport.ts index c054249caa6..a13c187fd92 100644 --- a/src/vs/workbench/contrib/files/browser/fileImportExport.ts +++ b/src/vs/workbench/contrib/files/browser/fileImportExport.ts @@ -10,7 +10,7 @@ import { ByteSize, FileSystemProviderCapabilities, IFileService, IFileStatWithMe import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IProgress, IProgressService, IProgressStep, ProgressLocation } from 'vs/platform/progress/common/progress'; import { IExplorerService } from 'vs/workbench/contrib/files/browser/files'; -import { IFilesConfiguration, UndoEnablement, VIEW_ID } from 'vs/workbench/contrib/files/common/files'; +import { IFilesConfiguration, UndoConfirmLevel, VIEW_ID } from 'vs/workbench/contrib/files/common/files'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Limiter, Promises, RunOnceWorker } from 'vs/base/common/async'; import { newWriteableBufferStream, VSBuffer } from 'vs/base/common/buffer'; @@ -23,7 +23,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { extractEditorsDropData } from 'vs/workbench/browser/dnd'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { isWeb } from 'vs/base/common/platform'; -import { triggerDownload, WebFileSystemAccess } from 'vs/base/browser/dom'; +import { triggerDownload } from 'vs/base/browser/dom'; import { ILogService } from 'vs/platform/log/common/log'; import { FileAccess, Schemas } from 'vs/base/common/network'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; @@ -33,6 +33,7 @@ import { once } from 'vs/base/common/functional'; import { coalesce } from 'vs/base/common/arrays'; import { canceled } from 'vs/base/common/errors'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { WebFileSystemAccess } from 'vs/platform/files/browser/webFileSystemAccess'; //#region Browser File Upload (drag and drop, input element) @@ -64,7 +65,7 @@ interface IWebkitDataTransferItemEntry { } interface IWebkitDataTransferItemEntryReader { - readEntries(resolve: (file: IWebkitDataTransferItemEntry[]) => void, reject: () => void): void + readEntries(resolve: (file: IWebkitDataTransferItemEntry[]) => void, reject: () => void): void; } export class BrowserFileUpload { @@ -140,7 +141,7 @@ export class BrowserFileUpload { entries.push(item.webkitGetAsEntry()); } - const results: { isFile: boolean, resource: URI }[] = []; + const results: { isFile: boolean; resource: URI }[] = []; const operation: IBrowserUploadOperation = { startTime: Date.now(), progressScheduler: new RunOnceWorker(steps => { progress.report(steps[steps.length - 1]); }, 1000), @@ -194,7 +195,7 @@ export class BrowserFileUpload { } } - private async doUploadEntry(entry: IWebkitDataTransferItemEntry, parentResource: URI, target: ExplorerItem | undefined, progress: IProgress, operation: IBrowserUploadOperation, token: CancellationToken): Promise<{ isFile: boolean, resource: URI } | undefined> { + private async doUploadEntry(entry: IWebkitDataTransferItemEntry, parentResource: URI, target: ExplorerItem | undefined, progress: IProgress, operation: IBrowserUploadOperation, token: CancellationToken): Promise<{ isFile: boolean; resource: URI } | undefined> { if (token.isCancellationRequested || !entry.name || (!entry.isFile && !entry.isDirectory)) { return undefined; } @@ -315,7 +316,8 @@ export class BrowserFileUpload { // Read the file in chunks using File.stream() web APIs try { - const reader: ReadableStreamDefaultReader = file.stream().getReader(); + // TODO@electron: duplicate type definitions originate from `@types/node/stream/consumers.d.ts` + const reader: ReadableStreamDefaultReader = (file.stream() as unknown as ReadableStream).getReader(); let res = await reader.read(); while (!res.done) { @@ -530,6 +532,7 @@ export class ExternalFileImport { return new ResourceFileEdit(resource, targetFile, { overwrite: true, copy: true }); }); + const undoLevel = this.configurationService.getValue().explorer.confirmUndo; await this.explorerService.applyBulkEdit(resourceFileEdits, { undoLabel: resourcesFiltered.length === 1 ? localize('importFile', "Import {0}", basename(resourcesFiltered[0])) : @@ -538,7 +541,7 @@ export class ExternalFileImport { localize('copyingFile', "Copying {0}", basename(resourcesFiltered[0])) : localize('copyingnFile', "Copying {0} resources", resourcesFiltered.length), progressLocation: ProgressLocation.Window, - confirmBeforeUndo: this.configurationService.getValue().explorer.enableUndo === UndoEnablement.Warn, + confirmBeforeUndo: undoLevel === UndoConfirmLevel.Verbose || undoLevel === UndoConfirmLevel.Default, }); // if we only add one file, just open it directly diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts index 98d9f43ff80..a732c3d55fc 100644 --- a/src/vs/workbench/contrib/files/browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts @@ -10,7 +10,7 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions, Configur import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IFileEditorInput, IEditorFactoryRegistry, EditorExtensions } from 'vs/workbench/common/editor'; import { AutoSaveConfiguration, HotExitConfiguration, FILES_EXCLUDE_CONFIG, FILES_ASSOCIATIONS_CONFIG } from 'vs/platform/files/common/files'; -import { SortOrder, LexicographicOptions, FILE_EDITOR_INPUT_ID, BINARY_TEXT_FILE_MODE, UndoEnablement, IFilesConfiguration } from 'vs/workbench/contrib/files/common/files'; +import { SortOrder, LexicographicOptions, FILE_EDITOR_INPUT_ID, BINARY_TEXT_FILE_MODE, UndoConfirmLevel, IFilesConfiguration } from 'vs/workbench/contrib/files/common/files'; import { TextFileEditorTracker } from 'vs/workbench/contrib/files/browser/editors/textFileEditorTracker'; import { TextFileSaveErrorHandler } from 'vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler'; import { FileEditorInput } from 'vs/workbench/contrib/files/browser/editors/fileEditorInput'; @@ -372,14 +372,19 @@ configurationRegistry.registerConfiguration({ 'default': true }, 'explorer.enableUndo': { + 'type': 'boolean', + 'description': nls.localize('enableUndo', "Controls whether the explorer should support undoing file and folder operations."), + 'default': true + }, + 'explorer.confirmUndo': { 'type': 'string', - 'enum': [UndoEnablement.Warn, UndoEnablement.Allow, UndoEnablement.Disable], - 'description': nls.localize('confirmUndo', "Controls how the explorer participates in undoing file and folder edits."), - 'default': UndoEnablement.Warn, + 'enum': [UndoConfirmLevel.Verbose, UndoConfirmLevel.Default, UndoConfirmLevel.Light], + 'description': nls.localize('confirmUndo', "Controls whether the explorer should ask for confirmation when undoing."), + 'default': UndoConfirmLevel.Default, 'enumDescriptions': [ - nls.localize('enableUndo.warn', 'Explorer will prompt before undoing all file and folder creation events.'), - nls.localize('enableUndo.allow', 'Explorer will undo file and folder creation events without prompting.'), - nls.localize('enableUndo.disable', 'Explorer does not participte in undo events.'), + nls.localize('enableUndo.verbose', 'Explorer will prompt before all undo operations.'), + nls.localize('enableUndo.default', 'Explorer will prompt before destructive undo operations.'), + nls.localize('enableUndo.light', 'Explorer will not prompt before undo operations when focused.'), ], }, 'explorer.expandSingleFolderWorkspaces': { @@ -389,16 +394,17 @@ configurationRegistry.registerConfiguration({ }, 'explorer.sortOrder': { 'type': 'string', - 'enum': [SortOrder.Default, SortOrder.Mixed, SortOrder.FilesFirst, SortOrder.Type, SortOrder.Modified], + 'enum': [SortOrder.Default, SortOrder.Mixed, SortOrder.FilesFirst, SortOrder.Type, SortOrder.Modified, SortOrder.FoldersNestsFiles], 'default': SortOrder.Default, 'enumDescriptions': [ nls.localize('sortOrder.default', 'Files and folders are sorted by their names. Folders are displayed before files.'), nls.localize('sortOrder.mixed', 'Files and folders are sorted by their names. Files are interwoven with folders.'), nls.localize('sortOrder.filesFirst', 'Files and folders are sorted by their names. Files are displayed before folders.'), nls.localize('sortOrder.type', 'Files and folders are grouped by extension type then sorted by their names. Folders are displayed before files.'), - nls.localize('sortOrder.modified', 'Files and folders are sorted by last modified date in descending order. Folders are displayed before files.') + nls.localize('sortOrder.modified', 'Files and folders are sorted by last modified date in descending order. Folders are displayed before files.'), + nls.localize('sortOrder.foldersNestsFiles', 'Files and folders are sorted by their names. Folders are displayed before files. Files with nested children are displayed before other files.') ], - 'description': nls.localize('sortOrder', "Controls the property-based sorting of files and folders in the explorer.") + 'description': nls.localize('sortOrder', "Controls the property-based sorting of files and folders in the explorer. When `#explorer.experimental.fileNesting.enabled#` is enabled, also controls sorting of nested files.") }, 'explorer.sortOrderLexicographicOptions': { 'type': 'string', @@ -459,15 +465,15 @@ configurationRegistry.registerConfiguration({ }, 'explorer.experimental.fileNesting.expand': { 'type': 'boolean', - 'markdownDescription': nls.localize('fileNestingExpand', "Experimental. Controls whether file nests are automatically expended. `#explorer.fileNesting.enabled#` must be set for this to take effect."), + 'markdownDescription': nls.localize('fileNestingExpand', "Experimental. Controls whether file nests are automatically expanded. `#explorer.experimental.fileNesting.enabled#` must be set for this to take effect."), 'default': true, }, 'explorer.experimental.fileNesting.patterns': { 'type': 'object', - 'markdownDescription': nls.localize('fileNestingPatterns', "Experimental. Controls nesting of files in the explorer. `#explorer.fileNesting.enabled#` must be set for this to take effect. Each key describes a parent file pattern and each value should be a comma separated list of children file patterns that will be nested under the parent.\n\nA single `*` in a parent pattern may be used to capture any substring, which can then be matched against using `$(capture)` in a child pattern. Child patterns may also contain one `*` to match any substring."), + 'markdownDescription': nls.localize('fileNestingPatterns', "Experimental. Controls nesting of files in the explorer. `#explorer.experimental.fileNesting.enabled#` must be set for this to take effect. Each key describes a parent file pattern and each value should be a comma separated list of children file patterns that will be nested under the parent.\n\nA single `*` in a parent pattern may be used to capture any substring, which can then be matched against using `$\u200b(capture)` in a child pattern. Child patterns may also contain one `*` to match any substring."), patternProperties: { '^[^*]*\\*?[^*]*$': { - description: nls.localize('fileNesting.description', "Key patterns may contain a single `*` capture group which matches any string. Each value pattern may contain one `$(capture)` token to be substituted with the parent capture group and one `*` token to match any string"), + markdownDescription: nls.localize('fileNesting.description', "Key patterns may contain a single `*` capture group which matches any string. Each value pattern may contain one `$\u200b(capture)` token to be substituted with the parent capture group and one `*` token to match any string"), type: 'string', pattern: '^([^,*]*\\*?[^,*]*)(, ?[^,*]*\\*?[^,*]*)*$', } @@ -479,7 +485,7 @@ configurationRegistry.registerConfiguration({ '*.jsx': '$(capture).js', '*.tsx': '$(capture).ts', 'tsconfig.json': 'tsconfig.*.json', - 'package.json': 'package-lock.json, .npmrc, yarn.lock, .yarnrc', + 'package.json': 'package-lock.json, .npmrc, yarn.lock, .yarnrc, pnpm-lock.yaml', } } } @@ -490,7 +496,7 @@ UndoCommand.addImplementation(110, 'explorer', (accessor: ServicesAccessor) => { const explorerService = accessor.get(IExplorerService); const configurationService = accessor.get(IConfigurationService); - const explorerCanUndo = configurationService.getValue().explorer.enableUndo !== UndoEnablement.Disable; + const explorerCanUndo = configurationService.getValue().explorer.enableUndo; if (explorerService.hasViewFocus() && undoRedoService.canUndo(UNDO_REDO_SOURCE) && explorerCanUndo) { undoRedoService.undo(UNDO_REDO_SOURCE); return true; @@ -504,7 +510,7 @@ RedoCommand.addImplementation(110, 'explorer', (accessor: ServicesAccessor) => { const explorerService = accessor.get(IExplorerService); const configurationService = accessor.get(IConfigurationService); - const explorerCanUndo = configurationService.getValue().explorer.enableUndo !== UndoEnablement.Disable; + const explorerCanUndo = configurationService.getValue().explorer.enableUndo; if (explorerService.hasViewFocus() && undoRedoService.canRedo(UNDO_REDO_SOURCE) && explorerCanUndo) { undoRedoService.redo(UNDO_REDO_SOURCE); return true; diff --git a/src/vs/workbench/contrib/files/browser/files.ts b/src/vs/workbench/contrib/files/browser/files.ts index 41f2da785bf..3baa0f02679 100644 --- a/src/vs/workbench/contrib/files/browser/files.ts +++ b/src/vs/workbench/contrib/files/browser/files.ts @@ -26,7 +26,7 @@ export interface IExplorerService { getContext(respectMultiSelection: boolean): ExplorerItem[]; hasViewFocus(): boolean; setEditable(stat: ExplorerItem, data: IEditableData | null): Promise; - getEditable(): { stat: ExplorerItem, data: IEditableData } | undefined; + getEditable(): { stat: ExplorerItem; data: IEditableData } | undefined; getEditableData(stat: ExplorerItem): IEditableData | undefined; // If undefined is passed checks if any element is currently being edited. isEditable(stat: ExplorerItem | undefined): boolean; @@ -35,7 +35,7 @@ export interface IExplorerService { refresh(): Promise; setToCopy(stats: ExplorerItem[], cut: boolean): Promise; isCut(stat: ExplorerItem): boolean; - applyBulkEdit(edit: ResourceFileEdit[], options: { undoLabel: string, progressLabel: string, confirmBeforeUndo?: boolean, progressLocation?: ProgressLocation.Explorer | ProgressLocation.Window }): Promise; + applyBulkEdit(edit: ResourceFileEdit[], options: { undoLabel: string; progressLabel: string; confirmBeforeUndo?: boolean; progressLocation?: ProgressLocation.Explorer | ProgressLocation.Window }): Promise; /** * Selects and reveal the file element provided by the given resource if its found in the explorer. diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index ed59d0cb520..8a6c9abe5ed 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -20,7 +20,7 @@ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiati import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; import { IDecorationsService } from 'vs/workbench/services/decorations/common/decorations'; import { WorkbenchCompressibleAsyncDataTree } from 'vs/platform/list/browser/listService'; import { DelayedDragHandler } from 'vs/base/browser/dnd'; diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 6c9628dbbae..7d8a01c841f 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -19,7 +19,7 @@ import { ITreeNode, ITreeFilter, TreeVisibility, IAsyncDataSource, ITreeSorter, import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IFilesConfiguration } from 'vs/workbench/contrib/files/common/files'; +import { IFilesConfiguration, UndoConfirmLevel } from 'vs/workbench/contrib/files/common/files'; import { dirname, joinPath, distinctParents } from 'vs/base/common/resources'; import { InputBox, MessageType } from 'vs/base/browser/ui/inputbox/inputBox'; import { localize } from 'vs/nls'; @@ -378,7 +378,7 @@ export class FilesRenderer implements ICompressibleTreeRenderer { break; + case 'foldersNestsFiles': + if (statA.isDirectory && !statB.isDirectory) { + return -1; + } + + if (statB.isDirectory && !statA.isDirectory) { + return 1; + } + + if (statA.hasNests && !statB.hasNests) { + return -1; + } + + if (statB.hasNests && !statA.hasNests) { + return 1; + } + + break; + case 'mixed': break; // not sorting when "mixed" is on @@ -1083,10 +1102,12 @@ export class FileDragAndDrop implements ITreeDragAndDrop { private async doHandleExplorerDropOnCopy(sources: ExplorerItem[], target: ExplorerItem): Promise { // Reuse duplicate action when user copies - const incrementalNaming = this.configurationService.getValue().explorer.incrementalNaming; - const resourceFileEdits = sources.map(({ resource, isDirectory }) => (new ResourceFileEdit(resource, findValidPasteFileTarget(this.explorerService, target, { resource, isDirectory, allowOverwrite: false }, incrementalNaming), { copy: true }))); + 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 labelSufix = getFileOrFolderLabelSufix(sources); await this.explorerService.applyBulkEdit(resourceFileEdits, { + confirmBeforeUndo: explorerConfig.confirmUndo === UndoConfirmLevel.Default || explorerConfig.confirmUndo === UndoConfirmLevel.Verbose, undoLabel: localize('copy', "Copy {0}", labelSufix), progressLabel: localize('copying', "Copying {0}", labelSufix), }); @@ -1105,6 +1126,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { const resourceFileEdits = sources.filter(source => !source.isReadonly).map(source => new ResourceFileEdit(source.resource, joinPath(target.resource, source.name))); const labelSufix = getFileOrFolderLabelSufix(sources); const options = { + confirmBeforeUndo: this.configurationService.getValue().explorer.confirmUndo === UndoConfirmLevel.Verbose, undoLabel: localize('move', "Move {0}", labelSufix), progressLabel: localize('moving', "Moving {0}", labelSufix) }; @@ -1176,7 +1198,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { } } -function getIconLabelNameFromHTMLElement(target: HTMLElement | EventTarget | Element | null): { element: HTMLElement, count: number, index: number } | null { +function getIconLabelNameFromHTMLElement(target: HTMLElement | EventTarget | Element | null): { element: HTMLElement; count: number; index: number } | null { if (!(target instanceof HTMLElement)) { return null; } diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index 842ff2c771c..962cdff6e9f 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -31,7 +31,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId, IMenu, Action2, registerAction2, MenuRegistry } from 'vs/platform/actions/common/actions'; import { OpenEditorsDirtyEditorContext, OpenEditorsGroupContext, OpenEditorsReadonlyEditorContext, SAVE_ALL_LABEL, SAVE_ALL_COMMAND_ID, NEW_UNTITLED_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileCommands'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; import { ResourcesDropHandler, fillEditorsDragData, CodeDataTransfers, containsDragType } from 'vs/workbench/browser/dnd'; import { ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; @@ -378,7 +378,7 @@ export class OpenEditorsView extends ViewPane { return this.elements.findIndex(e => e instanceof OpenEditor && e.editor === editor && e.group.id === group.id); } - private openEditor(element: OpenEditor, options: { preserveFocus?: boolean; pinned?: boolean; sideBySide?: boolean; }): void { + private openEditor(element: OpenEditor, options: { preserveFocus?: boolean; pinned?: boolean; sideBySide?: boolean }): void { if (element) { this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); diff --git a/src/vs/workbench/contrib/files/common/explorerFileNestingTrie.ts b/src/vs/workbench/contrib/files/common/explorerFileNestingTrie.ts index f136710f16b..650938cdc9b 100644 --- a/src/vs/workbench/contrib/files/common/explorerFileNestingTrie.ts +++ b/src/vs/workbench/contrib/files/common/explorerFileNestingTrie.ts @@ -5,7 +5,7 @@ /** * A sort of double-ended trie, used to efficiently query for matches to "star" patterns, where - * a given key representas a parent and may contain a capturing group ("*"), which can then be + * a given key represents a parent and may contain a capturing group ("*"), which can then be * referenced via the token "$(capture)" in associated child patterns. * * The generated tree will have at most two levels, as subtrees are flattened rather than nested. diff --git a/src/vs/workbench/contrib/files/common/explorerModel.ts b/src/vs/workbench/contrib/files/common/explorerModel.ts index 24aecbad112..03a1fab01a8 100644 --- a/src/vs/workbench/contrib/files/common/explorerModel.ts +++ b/src/vs/workbench/contrib/files/common/explorerModel.ts @@ -318,12 +318,6 @@ export class ExplorerItem { const items: ExplorerItem[] = []; if (nestingConfig.enabled) { - const patterns = Object.entries(nestingConfig.patterns).map( - ([parentPattern, childrenPatterns]) => - [parentPattern.trim(), childrenPatterns.split(',').map(p => p.trim())] as [string, string[]]); - - const nester = new ExplorerFileNestingTrie(patterns); - const fileChildren: [string, ExplorerItem][] = []; const dirChildren: [string, ExplorerItem][] = []; for (const child of this.children.entries()) { @@ -334,7 +328,7 @@ export class ExplorerItem { } } - const nested = nester.nest(fileChildren.map(([name]) => name)); + const nested = this.buildFileNester().nest(fileChildren.map(([name]) => name)); for (const [fileEntryName, fileEntryItem] of fileChildren) { const nestedItems = nested.get(fileEntryName); @@ -361,6 +355,18 @@ export class ExplorerItem { return items; } + // TODO:@jkearl, share one nester across all explorer items and only build on config change + private buildFileNester(): ExplorerFileNestingTrie { + const nestingConfig = this.configService.getValue().explorer.experimental.fileNesting; + const patterns = Object.entries(nestingConfig.patterns) + .filter(entry => + typeof (entry[0]) === 'string' && typeof (entry[1]) === 'string' && entry[0] && entry[1]) + .map(([parentPattern, childrenPatterns]) => + [parentPattern.trim(), childrenPatterns.split(',').map(p => p.trim())] as [string, string[]]); + + return new ExplorerFileNestingTrie(patterns); + } + /** * Removes a child element from this folder. */ @@ -407,7 +413,7 @@ export class ExplorerItem { * Tells this stat that it was renamed. This requires changes to all children of this stat (if any) * so that the path property can be updated properly. */ - rename(renamedStat: { name: string, mtime?: number }): void { + rename(renamedStat: { name: string; mtime?: number }): void { // Merge a subset of Properties that can change on rename this.updateName(renamedStat.name); diff --git a/src/vs/workbench/contrib/files/common/files.ts b/src/vs/workbench/contrib/files/common/files.ts index 29db74b405c..95ec6454ad0 100644 --- a/src/vs/workbench/contrib/files/common/files.ts +++ b/src/vs/workbench/contrib/files/common/files.ts @@ -13,7 +13,7 @@ import { ITextModelContentProvider } from 'vs/editor/common/services/resolverSer import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService, ILanguageSelection } from 'vs/editor/common/services/language'; +import { ILanguageService, ILanguageSelection } from 'vs/editor/common/languages/language'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -88,7 +88,8 @@ export interface IFilesConfiguration extends PlatformIFilesConfiguration, IWorkb autoReveal: boolean | 'focusNoScroll'; enableDragAndDrop: boolean; confirmDelete: boolean; - enableUndo: UndoEnablement; + enableUndo: boolean; + confirmUndo: UndoConfirmLevel; expandSingleFolderWorkspaces: boolean; sortOrder: SortOrder; sortOrderLexicographicOptions: LexicographicOptions; @@ -101,9 +102,9 @@ export interface IFilesConfiguration extends PlatformIFilesConfiguration, IWorkb fileNesting: { enabled: boolean; expand: boolean; - patterns: { [parent: string]: string } - } - } + patterns: { [parent: string]: string }; + }; + }; }; editor: IEditorOptions; } @@ -118,13 +119,14 @@ export const enum SortOrder { Mixed = 'mixed', FilesFirst = 'filesFirst', Type = 'type', - Modified = 'modified' + Modified = 'modified', + FoldersNestsFiles = 'foldersNestsFiles', } -export const enum UndoEnablement { - Warn = 'warn', - Allow = 'allow', - Disable = 'disable', +export const enum UndoConfirmLevel { + Verbose = 'verbose', + Default = 'default', + Light = 'light', } export const enum LexicographicOptions { diff --git a/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts b/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts index 29e0cdd9559..a7d49c574cb 100644 --- a/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/electron-sandbox/fileActions.contribution.ts @@ -18,7 +18,7 @@ import { IListService } from 'vs/platform/list/browser/listService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { revealResourcesInOS } from 'vs/workbench/contrib/files/electron-sandbox/fileCommands'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; import { appendToCommandPalette, appendEditorTitleContextMenuItem } from 'vs/workbench/contrib/files/browser/fileActions.contribution'; import { SideBySideEditor, EditorResourceAccessor } from 'vs/workbench/common/editor'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts index f8483b0d965..55fb3414ea4 100644 --- a/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts @@ -90,7 +90,7 @@ suite('Files - FileEditorInput', () => { assert(resolvedModelA === resolved); // OK: Resolved Model cached globally per input try { - DisposableStore.DISABLE_DISPOSED_WARNING = true; // prevent unwanted warning output from occuring + DisposableStore.DISABLE_DISPOSED_WARNING = true; // prevent unwanted warning output from occurring const otherResolved = await sameOtherInput.resolve(); assert(otherResolved === resolvedModelA); // OK: Resolved Model cached globally per input diff --git a/src/vs/workbench/contrib/format/browser/formatActionsMultiple.ts b/src/vs/workbench/contrib/format/browser/formatActionsMultiple.ts index 7a500616e11..3481452d194 100644 --- a/src/vs/workbench/contrib/format/browser/formatActionsMultiple.ts +++ b/src/vs/workbench/contrib/format/browser/formatActionsMultiple.ts @@ -6,13 +6,13 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { DocumentRangeFormattingEditProviderRegistry, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider } from 'vs/editor/common/languages'; +import { DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider } from 'vs/editor/common/languages'; import * as nls from 'vs/nls'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { formatDocumentRangesWithProvider, formatDocumentWithProvider, getRealAndSyntheticDocumentFormattersOrdered, FormattingConflicts, FormattingMode } from 'vs/editor/contrib/format/format'; +import { formatDocumentRangesWithProvider, formatDocumentWithProvider, getRealAndSyntheticDocumentFormattersOrdered, FormattingConflicts, FormattingMode } from 'vs/editor/contrib/format/browser/format'; import { Range } from 'vs/editor/common/core/range'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; @@ -25,10 +25,11 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ITextModel } from 'vs/editor/common/model'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { editorConfigurationBaseNode } from 'vs/editor/common/config/editorConfigurationSchema'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; type FormattingEditProvider = DocumentFormattingEditProvider | DocumentRangeFormattingEditProvider; @@ -305,8 +306,9 @@ registerEditorAction(class FormatDocumentMultipleAction extends EditorAction { } const instaService = accessor.get(IInstantiationService); const telemetryService = accessor.get(ITelemetryService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const model = editor.getModel(); - const provider = getRealAndSyntheticDocumentFormattersOrdered(model); + const provider = getRealAndSyntheticDocumentFormattersOrdered(languageFeaturesService.documentFormattingEditProvider, languageFeaturesService.documentRangeFormattingEditProvider, model); const pick = await instaService.invokeFunction(showFormatterPick, model, provider); if (typeof pick === 'number') { await instaService.invokeFunction(formatDocumentWithProvider, provider[pick], editor, FormattingMode.Explicit, CancellationToken.None); @@ -336,6 +338,7 @@ registerEditorAction(class FormatSelectionMultipleAction extends EditorAction { return; } const instaService = accessor.get(IInstantiationService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const telemetryService = accessor.get(ITelemetryService); const model = editor.getModel(); @@ -344,7 +347,7 @@ registerEditorAction(class FormatSelectionMultipleAction extends EditorAction { range = new Range(range.startLineNumber, 1, range.startLineNumber, model.getLineMaxColumn(range.startLineNumber)); } - const provider = DocumentRangeFormattingEditProviderRegistry.ordered(model); + const provider = languageFeaturesService.documentRangeFormattingEditProvider.ordered(model); const pick = await instaService.invokeFunction(showFormatterPick, model, provider); if (typeof pick === 'number') { await instaService.invokeFunction(formatDocumentRangesWithProvider, provider[pick], editor, range, CancellationToken.None); diff --git a/src/vs/workbench/contrib/format/browser/formatActionsNone.ts b/src/vs/workbench/contrib/format/browser/formatActionsNone.ts index 4bc0210545c..b32e1dc76fb 100644 --- a/src/vs/workbench/contrib/format/browser/formatActionsNone.ts +++ b/src/vs/workbench/contrib/format/browser/formatActionsNone.ts @@ -7,7 +7,6 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction, registerEditorAction, ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { DocumentFormattingEditProviderRegistry } from 'vs/editor/common/languages'; import * as nls from 'vs/nls'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -17,6 +16,7 @@ import { VIEWLET_ID, IExtensionsViewPaneContainer } from 'vs/workbench/contrib/e import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ViewContainerLocation } from 'vs/workbench/common/views'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; async function showExtensionQuery(paneCompositeService: IPaneCompositePartService, query: string) { const viewlet = await paneCompositeService.openPaneComposite(VIEWLET_ID, ViewContainerLocation.Sidebar, true); @@ -51,9 +51,10 @@ registerEditorAction(class FormatDocumentMultipleAction extends EditorAction { const paneCompositeService = accessor.get(IPaneCompositePartService); const notificationService = accessor.get(INotificationService); const dialogService = accessor.get(IDialogService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const model = editor.getModel(); - const formatterCount = DocumentFormattingEditProviderRegistry.all(model).length; + const formatterCount = languageFeaturesService.documentFormattingEditProvider.all(model).length; if (formatterCount > 1) { return commandService.executeCommand('editor.action.formatDocument.multiple'); diff --git a/src/vs/workbench/contrib/format/browser/formatModified.ts b/src/vs/workbench/contrib/format/browser/formatModified.ts index e981b52bab2..787afa34a7c 100644 --- a/src/vs/workbench/contrib/format/browser/formatModified.ts +++ b/src/vs/workbench/contrib/format/browser/formatModified.ts @@ -12,7 +12,7 @@ import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ITextModel } from 'vs/editor/common/model'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { formatDocumentRangesWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/format'; +import { formatDocumentRangesWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/browser/format'; import * as nls from 'vs/nls'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/interactive/browser/docs/interactive.drawio.svg b/src/vs/workbench/contrib/interactive/browser/docs/interactive.drawio.svg new file mode 100644 index 00000000000..1fcd753e4e6 --- /dev/null +++ b/src/vs/workbench/contrib/interactive/browser/docs/interactive.drawio.svg @@ -0,0 +1,243 @@ + + + + + + + + +
+
+
+ + Ext Host + +
+
+
+
+ + Ext Host + +
+
+ + + + +
+
+
+ + UI + +
+
+
+
+ + UI + +
+
+ + + + + + + +
+
+
+ Notebook Editor +
+
+
+
+ + Notebook Editor + +
+
+ + + + +
+
+
+ Text Editor +
+
+
+
+ + Text Editor + +
+
+ + + + +
+
+
+ Interactive Editor +
+
+
+
+ + Interactive Editor + +
+
+ + + + + +
+
+
+ NotebookService +
+
+
+
+ + NotebookService + +
+
+ + + + + + + +
+
+
+ TextModelResolverService +
+
+
+
+ + TextModelResolverService + +
+
+ + + + + + + +
+
+
+ ExthostNotebook +
+
+
+
+ + ExthostNotebook + +
+
+ + + + + + + +
+
+
+ ExthostEditors +
+
+
+
+ + ExthostEditors + +
+
+ + + + + + + + +
+
+
+ ExthostInteractive +
+
+
+
+ + ExthostInteracti... + +
+
+ + + + + + +
+
+
+ NotebookEditor +
+
+
+
+ + Notebook... + +
+
+ + + + + + +
+
+
+ Input +
+
+
+
+ + Input + +
+
+
+ + + + + Viewer does not support full SVG 1.1 + + + +
diff --git a/src/vs/workbench/contrib/interactive/browser/docs/interactive.md b/src/vs/workbench/contrib/interactive/browser/docs/interactive.md new file mode 100644 index 00000000000..efcb2bebc6b --- /dev/null +++ b/src/vs/workbench/contrib/interactive/browser/docs/interactive.md @@ -0,0 +1,12 @@ +# Interactive Window + +The interactive window component enables extensions to offer REPL like experience to its users. VS Code provides the user interface and extensions provide the execution environment, code completions, execution results rendering and so on. + +The interactive window consists of notebook editor at the top and regular monaco editor at the bottom of the viewport. Extensions can extend the interactive window by leveraging the notebook editor API and text editor/document APIs: + +* Extensions register notebook controllers for the notebook document in the intearctive window through `vscode.notebooks.createNotebookController`. The notebook document has a special notebook view type `interactive`, which is contributed by the core instead of extensions. The registered notebook controller is responsible for execution. +* Extensions register auto complete provider for the bottom text editor through `vscode.languages.registerCompletionItemProvider`. The resource scheme for the text editor is `interactive-input` and the language used in the editor is determined by the notebook controller contributed by extensions. + +Users can type in code in the text editor and after users pressing `Shift+Enter`, we will insert a new code cell into the notebook document with the content from the text editor. Then we will request execution for the newly inserted cell. The notebook controller will handle the execution just like it;s in a normal notebook editor. + +![arch](interactive.drawio.svg) diff --git a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts index 7a1ad345772..cedf455a287 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts @@ -19,8 +19,8 @@ import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry' import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; -import { peekViewBorder /*, peekViewEditorBackground, peekViewResultsBackground */ } from 'vs/editor/contrib/peekView/peekView'; -import { Context as SuggestContext } from 'vs/editor/contrib/suggest/suggest'; +import { peekViewBorder /*, peekViewEditorBackground, peekViewResultsBackground */ } from 'vs/editor/contrib/peekView/browser/peekView'; +import { Context as SuggestContext } from 'vs/editor/contrib/suggest/browser/suggest'; import { localize } from 'vs/nls'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -96,7 +96,7 @@ export class InteractiveDocumentContribution extends Disposable implements IWork if (_backupId instanceof VSBuffer) { const backup = _backupId.toString(); try { - const document = JSON.parse(backup) as { cells: { kind: CellKind, language: string, metadata: any, mime: string | undefined, content: string, outputs?: ICellOutput[] }[] }; + const document = JSON.parse(backup) as { cells: { kind: CellKind; language: string; metadata: any; mime: string | undefined; content: string; outputs?: ICellOutput[] }[] }; return { data: { metadata: {}, @@ -266,7 +266,7 @@ export class InteractiveEditorSerializer implements IEditorSerializer { } deserialize(instantiationService: IInstantiationService, raw: string) { - type Data = { resource: URI, inputResource: URI; }; + type Data = { resource: URI; inputResource: URI }; const data = parse(raw); if (!data) { return undefined; @@ -337,7 +337,7 @@ registerAction2(class extends Action2 { }); } - async run(accessor: ServicesAccessor, showOptions?: number | { viewColumn?: number, preserveFocus?: boolean }, resource?: URI, id?: string, title?: string): Promise<{ notebookUri: URI, inputUri: URI; notebookEditorId?: string }> { + async run(accessor: ServicesAccessor, showOptions?: number | { viewColumn?: number; preserveFocus?: boolean }, resource?: URI, id?: string, title?: string): Promise<{ notebookUri: URI; inputUri: URI; notebookEditorId?: string }> { const editorService = accessor.get(IEditorService); const editorGroupService = accessor.get(IEditorGroupsService); const historyService = accessor.get(IInteractiveHistoryService); @@ -355,7 +355,7 @@ registerAction2(class extends Action2 { const editorInput = editors[0].editor as InteractiveEditorInput; const currentGroup = editors[0].groupId; const editor = await editorService.openEditor(editorInput, editorOptions, currentGroup); - const editorControl = editor?.getControl() as { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } | undefined; + const editorControl = editor?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; return { notebookUri: editorInput.resource!, @@ -393,7 +393,7 @@ registerAction2(class extends Action2 { const editorInput = InteractiveEditorInput.create(accessor.get(IInstantiationService), notebookUri, inputUri, title); historyService.clearHistory(notebookUri); const editorPane = await editorService.openEditor(editorInput, editorOptions, group); - const editorControl = editorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } | undefined; + const editorControl = editorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; // Extensions must retain references to these URIs to manipulate the interactive editor return { notebookUri, inputUri, notebookEditorId: editorControl?.notebookEditor?.getId() }; } @@ -428,7 +428,7 @@ registerAction2(class extends Action2 { const editorService = accessor.get(IEditorService); const bulkEditService = accessor.get(IBulkEditService); const historyService = accessor.get(IInteractiveHistoryService); - const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } | undefined; + const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; if (editorControl && editorControl.notebookEditor && editorControl.codeEditor) { const notebookDocument = editorControl.notebookEditor.textModel; @@ -492,7 +492,7 @@ registerAction2(class extends Action2 { async run(accessor: ServicesAccessor): Promise { const editorService = accessor.get(IEditorService); - const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } | undefined; + const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; if (editorControl && editorControl.notebookEditor && editorControl.codeEditor) { const notebookDocument = editorControl.notebookEditor.textModel; @@ -529,7 +529,7 @@ registerAction2(class extends Action2 { async run(accessor: ServicesAccessor): Promise { const editorService = accessor.get(IEditorService); const historyService = accessor.get(IInteractiveHistoryService); - const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } | undefined; + const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; if (editorControl && editorControl.notebookEditor && editorControl.codeEditor) { const notebookDocument = editorControl.notebookEditor.textModel; @@ -568,7 +568,7 @@ registerAction2(class extends Action2 { async run(accessor: ServicesAccessor): Promise { const editorService = accessor.get(IEditorService); const historyService = accessor.get(IInteractiveHistoryService); - const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } | undefined; + const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; if (editorControl && editorControl.notebookEditor && editorControl.codeEditor) { const notebookDocument = editorControl.notebookEditor.textModel; @@ -602,7 +602,7 @@ registerAction2(class extends Action2 { async run(accessor: ServicesAccessor): Promise { const editorService = accessor.get(IEditorService); - const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } | undefined; + const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; if (editorControl && editorControl.notebookEditor && editorControl.codeEditor) { if (editorControl.notebookEditor.getLength() === 0) { @@ -631,7 +631,7 @@ registerAction2(class extends Action2 { async run(accessor: ServicesAccessor): Promise { const editorService = accessor.get(IEditorService); - const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } | undefined; + const editorControl = editorService.activeEditorPane?.getControl() as { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } | undefined; if (editorControl && editorControl.notebookEditor && editorControl.codeEditor) { if (editorControl.notebookEditor.getLength() === 0) { diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveDocumentService.ts b/src/vs/workbench/contrib/interactive/browser/interactiveDocumentService.ts index 31427351f5b..dafe8653915 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveDocumentService.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveDocumentService.ts @@ -12,17 +12,17 @@ export const IInteractiveDocumentService = createDecorator; - onWillRemoveInteractiveDocument: Event<{ notebookUri: URI; inputUri: URI; }>; + onWillAddInteractiveDocument: Event<{ notebookUri: URI; inputUri: URI; languageId: string }>; + onWillRemoveInteractiveDocument: Event<{ notebookUri: URI; inputUri: URI }>; willCreateInteractiveDocument(notebookUri: URI, inputUri: URI, languageId: string): void; willRemoveInteractiveDocument(notebookUri: URI, inputUri: URI): void; } export class InteractiveDocumentService extends Disposable implements IInteractiveDocumentService { declare readonly _serviceBrand: undefined; - private readonly _onWillAddInteractiveDocument = this._register(new Emitter<{ notebookUri: URI; inputUri: URI; languageId: string; }>()); + private readonly _onWillAddInteractiveDocument = this._register(new Emitter<{ notebookUri: URI; inputUri: URI; languageId: string }>()); onWillAddInteractiveDocument = this._onWillAddInteractiveDocument.event; - private readonly _onWillRemoveInteractiveDocument = this._register(new Emitter<{ notebookUri: URI; inputUri: URI; }>()); + private readonly _onWillRemoveInteractiveDocument = this._register(new Emitter<{ notebookUri: URI; inputUri: URI }>()); onWillRemoveInteractiveDocument = this._onWillRemoveInteractiveDocument.event; constructor() { diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts index 7c1665b825c..a0e75bba677 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts @@ -22,7 +22,7 @@ import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; import { IEditorMemento, IEditorOpenContext } from 'vs/workbench/common/editor'; import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; import { InteractiveEditorInput } from 'vs/workbench/contrib/interactive/browser/interactiveEditorInput'; -import { CodeCellLayoutChangeEvent, IActiveNotebookEditorDelegate, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CodeCellLayoutChangeEvent, IActiveNotebookEditorDelegate, ICellViewModel, INotebookEditorViewState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookEditorExtensionsRegistry } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; import { IBorrowValue, INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/notebookEditorService'; import { cellEditorBackground, NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; @@ -30,11 +30,10 @@ import { GroupsOrder, IEditorGroup, IEditorGroupsService } from 'vs/workbench/se import { ExecutionStateCellStatusBarContrib, TimerCellStatusBarContrib } from 'vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController'; import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { INTERACTIVE_INPUT_CURSOR_BOUNDARY } from 'vs/workbench/contrib/interactive/browser/interactiveCommon'; -import { IInteractiveHistoryService } from 'vs/workbench/contrib/interactive/browser/interactiveHistoryService'; import { ComplexNotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; import { NotebookCellExecutionState, NotebookCellsChangeType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -47,13 +46,12 @@ import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewMod import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; -import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { TabCompletionController } from 'vs/workbench/contrib/snippets/browser/tabCompletion'; -import { ModesHoverController } from 'vs/editor/contrib/hover/hover'; -import { MarkerController } from 'vs/editor/contrib/gotoError/gotoError'; -import { INotebookEditorViewState } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { ModesHoverController } from 'vs/editor/contrib/hover/browser/hover'; +import { MarkerController } from 'vs/editor/contrib/gotoError/browser/gotoError'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; @@ -99,7 +97,6 @@ export class InteractiveEditor extends EditorPane { #contextKeyService: IContextKeyService; #notebookKernelService: INotebookKernelService; #keybindingService: IKeybindingService; - #historyService: IInteractiveHistoryService; #menuService: IMenuService; #contextMenuService: IContextMenuService; #editorGroupService: IEditorGroupsService; @@ -124,7 +121,6 @@ export class InteractiveEditor extends EditorPane { @INotebookKernelService notebookKernelService: INotebookKernelService, @ILanguageService languageService: ILanguageService, @IKeybindingService keybindingService: IKeybindingService, - @IInteractiveHistoryService historyService: IInteractiveHistoryService, @IConfigurationService configurationService: IConfigurationService, @IMenuService menuService: IMenuService, @IContextMenuService contextMenuService: IContextMenuService, @@ -144,7 +140,6 @@ export class InteractiveEditor extends EditorPane { this.#notebookKernelService = notebookKernelService; this.#languageService = languageService; this.#keybindingService = keybindingService; - this.#historyService = historyService; this.#menuService = menuService; this.#contextMenuService = contextMenuService; this.#editorGroupService = editorGroupService; @@ -321,7 +316,7 @@ export class InteractiveEditor extends EditorPane { this.#widgetDisposableStore.clear(); - this.#notebookWidget = this.#instantiationService.invokeFunction(this.#notebookWidgetService.retrieveWidget, group, notebookInput, { + this.#notebookWidget = >this.#instantiationService.invokeFunction(this.#notebookWidgetService.retrieveWidget, group, notebookInput, { isEmbedded: true, isReadOnly: true, contributions: NotebookEditorExtensionsRegistry.getSomeEditorContributions([ @@ -460,7 +455,11 @@ export class InteractiveEditor extends EditorPane { } const cursorAtBoundaryContext = INTERACTIVE_INPUT_CURSOR_BOUNDARY.bindTo(this.#contextKeyService); - cursorAtBoundaryContext.set('none'); + if (input.resource && input.historyService.has(input.resource)) { + cursorAtBoundaryContext.set('top'); + } else { + cursorAtBoundaryContext.set('none'); + } this.#widgetDisposableStore.add(this.#codeEditorWidget.onDidChangeCursorPosition(({ position }) => { const viewModel = this.#codeEditorWidget._getViewModel()!; @@ -488,7 +487,7 @@ export class InteractiveEditor extends EditorPane { this.#widgetDisposableStore.add(editorModel.onDidChangeContent(() => { const value = editorModel!.getValue(); if (this.input?.resource && value !== '') { - this.#historyService.replaceLast(this.input.resource, value); + (this.input as InteractiveEditorInput).historyService.replaceLast(this.input.resource, value); } })); @@ -575,7 +574,7 @@ export class InteractiveEditor extends EditorPane { } if (this.#lastCell) { - const runState = this.#notebookExecutionStateService.getCellExecutionState(this.#lastCell.uri)?.state; + const runState = this.#notebookExecutionStateService.getCellExecution(this.#lastCell.uri)?.state; if (runState === NotebookCellExecutionState.Executing) { return; } @@ -718,7 +717,7 @@ export class InteractiveEditor extends EditorPane { super.clearInput(); } - override getControl(): { notebookEditor: NotebookEditorWidget | undefined, codeEditor: CodeEditorWidget; } { + override getControl(): { notebookEditor: NotebookEditorWidget | undefined; codeEditor: CodeEditorWidget } { return { notebookEditor: this.#notebookWidget.value, codeEditor: this.#codeEditorWidget diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditorInput.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditorInput.ts index 1ab30dfcdfa..17d8eaa03cf 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditorInput.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditorInput.ts @@ -14,6 +14,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IUntypedEditorInput } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { IInteractiveDocumentService } from 'vs/workbench/contrib/interactive/browser/interactiveDocumentService'; +import { IInteractiveHistoryService } from 'vs/workbench/contrib/interactive/browser/interactiveHistoryService'; import { IResolvedNotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICompositeNotebookEditorInput, NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; @@ -62,6 +63,7 @@ export class InteractiveEditorInput extends EditorInput implements ICompositeNot } private _textModelService: ITextModelService; private _interactiveDocumentService: IInteractiveDocumentService; + private _historyService: IInteractiveHistoryService; constructor( @@ -72,7 +74,8 @@ export class InteractiveEditorInput extends EditorInput implements ICompositeNot @IModelService modelService: IModelService, @ITextModelService textModelService: ITextModelService, - @IInteractiveDocumentService interactiveDocumentService: IInteractiveDocumentService + @IInteractiveDocumentService interactiveDocumentService: IInteractiveDocumentService, + @IInteractiveHistoryService historyService: IInteractiveHistoryService ) { const input = NotebookEditorInput.create(instantiationService, resource, 'interactive', {}); super(); @@ -85,6 +88,7 @@ export class InteractiveEditorInput extends EditorInput implements ICompositeNot this._inputModelRef = null; this._textModelService = textModelService; this._interactiveDocumentService = interactiveDocumentService; + this._historyService = historyService; this._registerListeners(); } @@ -174,4 +178,8 @@ export class InteractiveEditorInput extends EditorInput implements ICompositeNot this._inputModelRef = null; super.dispose(); } + + get historyService() { + return this._historyService; + } } diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveHistoryService.ts b/src/vs/workbench/contrib/interactive/browser/interactiveHistoryService.ts index 0db13109932..ad21831f2e6 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveHistoryService.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveHistoryService.ts @@ -19,6 +19,7 @@ export interface IInteractiveHistoryService { getNextValue(uri: URI): string | null; replaceLast(uri: URI, value: string): void; clearHistory(uri: URI): void; + has(uri: URI): boolean; } export class InteractiveHistoryService extends Disposable implements IInteractiveHistoryService { @@ -71,4 +72,9 @@ export class InteractiveHistoryService extends Disposable implements IInteractiv clearHistory(uri: URI) { this.#history.delete(uri); } + + has(uri: URI) { + return this.#history.has(uri) ? true : false; + } + } diff --git a/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts b/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts index 52cc36c2eb5..54f96068b69 100644 --- a/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts +++ b/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as dompurify from 'vs/base/browser/dompurify/dompurify'; -import * as marked from 'vs/base/common/marked/marked'; +import { marked } from 'vs/base/common/marked/marked'; import { Schemas } from 'vs/base/common/network'; import { tokenizeToString } from 'vs/editor/common/languages/textToHtmlTokenizer'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export const DEFAULT_MARKDOWN_STYLES = ` @@ -203,10 +203,16 @@ export async function renderMarkdownDocument( allowUnknownProtocols: boolean = false, ): Promise { - const highlight = (code: string, lang: string, callback: ((error: any, code: string) => void) | undefined): any => { + const highlight = (code: string, lang: string | undefined, callback: ((error: any, code: string) => void) | undefined): any => { if (!callback) { return code; } + + if (typeof lang !== 'string') { + callback(null, `${code}`); + return ''; + } + extensionService.whenInstalledExtensionsRegistered().then(async () => { const languageId = languageService.getLanguageIdByLanguageName(lang); const html = await tokenizeToString(languageService, code, languageId); diff --git a/src/vs/workbench/contrib/markers/browser/markers.contribution.ts b/src/vs/workbench/contrib/markers/browser/markers.contribution.ts index 4649c94978c..e75e38cb192 100644 --- a/src/vs/workbench/contrib/markers/browser/markers.contribution.ts +++ b/src/vs/workbench/contrib/markers/browser/markers.contribution.ts @@ -23,7 +23,8 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService import { Disposable } from 'vs/base/common/lifecycle'; import { IStatusbarEntryAccessor, IStatusbarService, StatusbarAlignment, IStatusbarEntry } from 'vs/workbench/services/statusbar/browser/statusbar'; import { IMarkerService, MarkerStatistics } from 'vs/platform/markers/common/markers'; -import { ViewContainer, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewsRegistry, IViewsService, getVisbileViewContextKey, FocusedViewContext } from 'vs/workbench/common/views'; +import { ViewContainer, IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainerLocation, IViewsRegistry, IViewsService } from 'vs/workbench/common/views'; +import { getVisbileViewContextKey, FocusedViewContext } from 'vs/workbench/common/contextkeys'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/markers/browser/markers.ts b/src/vs/workbench/contrib/markers/browser/markers.ts index 785ec070c85..a62b4a553a4 100644 --- a/src/vs/workbench/contrib/markers/browser/markers.ts +++ b/src/vs/workbench/contrib/markers/browser/markers.ts @@ -19,10 +19,10 @@ export interface IMarkersView extends IView { readonly onDidFocusFilter: Event; readonly onDidClearFilterText: Event; readonly filters: MarkersFilters; - readonly onDidChangeFilterStats: Event<{ total: number, filtered: number }>; + readonly onDidChangeFilterStats: Event<{ total: number; filtered: number }>; focusFilter(): void; clearFilterText(): void; - getFilterStats(): { total: number, filtered: number }; + getFilterStats(): { total: number; filtered: number }; getFocusElement(): MarkerElement | undefined; getFocusedSelectedElements(): MarkerElement[] | null; diff --git a/src/vs/workbench/contrib/markers/browser/markersFilterOptions.ts b/src/vs/workbench/contrib/markers/browser/markersFilterOptions.ts index 53c90cd8856..e8e5ca44edf 100644 --- a/src/vs/workbench/contrib/markers/browser/markersFilterOptions.ts +++ b/src/vs/workbench/contrib/markers/browser/markersFilterOptions.ts @@ -14,15 +14,15 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' export class ResourceGlobMatcher { private readonly globalExpression: ParsedExpression; - private readonly expressionsByRoot: TernarySearchTree; + private readonly expressionsByRoot: TernarySearchTree; constructor( globalExpression: IExpression, - rootExpressions: { root: URI, expression: IExpression }[], + rootExpressions: { root: URI; expression: IExpression }[], uriIdentityService: IUriIdentityService ) { this.globalExpression = parse(globalExpression); - this.expressionsByRoot = TernarySearchTree.forUris<{ root: URI, expression: ParsedExpression }>(uri => uriIdentityService.extUri.ignorePathCasing(uri)); + this.expressionsByRoot = TernarySearchTree.forUris<{ root: URI; expression: ParsedExpression }>(uri => uriIdentityService.extUri.ignorePathCasing(uri)); for (const expression of rootExpressions) { this.expressionsByRoot.set(expression.root, { root: expression.root, expression: parse(expression.expression) }); } @@ -48,7 +48,7 @@ export class FilterOptions { readonly showWarnings: boolean = false; readonly showErrors: boolean = false; readonly showInfos: boolean = false; - readonly textFilter: { readonly text: string, readonly negate: boolean }; + readonly textFilter: { readonly text: string; readonly negate: boolean }; readonly excludesMatcher: ResourceGlobMatcher; readonly includesMatcher: ResourceGlobMatcher; @@ -56,7 +56,7 @@ export class FilterOptions { constructor( readonly filter: string, - filesExclude: { root: URI, expression: IExpression }[] | IExpression, + filesExclude: { root: URI; expression: IExpression }[] | IExpression, showWarnings: boolean, showErrors: boolean, showInfos: boolean, diff --git a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts index b44d3b35801..6ef17c8a0bc 100644 --- a/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/contrib/markers/browser/markersTreeViewer.ts @@ -21,7 +21,7 @@ import { QuickFixAction, QuickFixActionViewItem } from 'vs/workbench/contrib/mar import { ILabelService } from 'vs/platform/label/common/label'; import { dirname, basename, isEqual } from 'vs/base/common/resources'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { ITreeFilter, TreeVisibility, TreeFilterResult, ITreeRenderer, ITreeNode, ITreeDragAndDrop, ITreeDragOverReaction } from 'vs/base/browser/ui/tree/tree'; +import { ITreeFilter, TreeVisibility, TreeFilterResult, ITreeRenderer, ITreeNode } from 'vs/base/browser/ui/tree/tree'; import { FilterOptions } from 'vs/workbench/contrib/markers/browser/markersFilterOptions'; import { IMatch } from 'vs/base/common/filters'; import { Event, Emitter } from 'vs/base/common/event'; @@ -30,17 +30,14 @@ import { isUndefinedOrNull } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { Action, IAction } from 'vs/base/common/actions'; import { localize } from 'vs/nls'; -import { IDragAndDropData } from 'vs/base/browser/dnd'; -import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; -import { fillEditorsDragData } from 'vs/workbench/browser/dnd'; import { CancelablePromise, createCancelablePromise, Delayer } from 'vs/base/common/async'; import { IModelService } from 'vs/editor/common/services/model'; import { Range } from 'vs/editor/common/core/range'; -import { getCodeActions, CodeActionSet } from 'vs/editor/contrib/codeAction/codeAction'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/types'; +import { getCodeActions, CodeActionSet } from 'vs/editor/contrib/codeAction/browser/codeAction'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; import { ITextModel } from 'vs/editor/common/model'; import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { applyCodeAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; +import { applyCodeAction } from 'vs/editor/contrib/codeAction/browser/codeActionCommands'; import { SeverityIcon } from 'vs/platform/severityIcon/common/severityIcon'; import { CodeActionTriggerType } from 'vs/editor/common/languages'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -50,6 +47,7 @@ import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { Codicon } from 'vs/base/common/codicons'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { Link } from 'vs/platform/opener/browser/link'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; interface IResourceMarkersTemplateData { resourceLabel: IResourceLabel; @@ -565,7 +563,8 @@ export class MarkerViewModel extends Disposable { private readonly marker: Marker, @IModelService private modelService: IModelService, @IInstantiationService private instantiationService: IInstantiationService, - @IEditorService private readonly editorService: IEditorService + @IEditorService private readonly editorService: IEditorService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { super(); this._register(toDisposable(() => { @@ -626,7 +625,7 @@ export class MarkerViewModel extends Disposable { if (model) { if (!this.codeActionsPromise) { this.codeActionsPromise = createCancelablePromise(cancellationToken => { - return getCodeActions(model, new Range(this.marker.range.startLineNumber, this.marker.range.startColumn, this.marker.range.endLineNumber, this.marker.range.endColumn), { + return getCodeActions(this.languageFeaturesService.codeActionProvider, model, new Range(this.marker.range.startLineNumber, this.marker.range.startColumn, this.marker.range.endLineNumber, this.marker.range.endColumn), { type: CodeActionTriggerType.Invoke, filter: { include: CodeActionKind.QuickFix } }, Progress.None, cancellationToken).then(actions => { return this._register(actions); @@ -693,7 +692,7 @@ export class MarkersViewModel extends Disposable { private readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; - private readonly markersViewStates: Map = new Map(); + private readonly markersViewStates: Map = new Map(); private readonly markersPerResource: Map = new Map(); private bulkUpdate: boolean = false; @@ -797,43 +796,3 @@ export class MarkersViewModel extends Disposable { } } - -export class ResourceDragAndDrop implements ITreeDragAndDrop { - constructor( - private instantiationService: IInstantiationService - ) { } - - onDragOver(data: IDragAndDropData, targetElement: MarkerElement, targetIndex: number, originalEvent: DragEvent): boolean | ITreeDragOverReaction { - return false; - } - - getDragURI(element: MarkerElement): string | null { - if (element instanceof ResourceMarkers) { - return element.resource.toString(); - } - return null; - } - - getDragLabel?(elements: MarkerElement[]): string | undefined { - if (elements.length > 1) { - return String(elements.length); - } - const element = elements[0]; - return element instanceof ResourceMarkers ? basename(element.resource) : undefined; - } - - onDragStart(data: IDragAndDropData, originalEvent: DragEvent): void { - const elements = (data as ElementsDragAndDropData).elements; - const resources = elements - .filter(e => e instanceof ResourceMarkers) - .map(resourceMarker => (resourceMarker as ResourceMarkers).resource); - - if (resources.length) { - // Apply some datatransfer types to allow for dragging the element outside of the application - this.instantiationService.invokeFunction(accessor => fillEditorsDragData(accessor, resources, originalEvent)); - } - } - - drop(data: IDragAndDropData, targetElement: MarkerElement, targetIndex: number, originalEvent: DragEvent): void { - } -} diff --git a/src/vs/workbench/contrib/markers/browser/markersView.ts b/src/vs/workbench/contrib/markers/browser/markersView.ts index 0462db7f342..a734410ac01 100644 --- a/src/vs/workbench/contrib/markers/browser/markersView.ts +++ b/src/vs/workbench/contrib/markers/browser/markersView.ts @@ -30,14 +30,14 @@ import { FilterOptions } from 'vs/workbench/contrib/markers/browser/markersFilte import { IExpression } from 'vs/base/common/glob'; import { deepClone } from 'vs/base/common/objects'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { FilterData, Filter, VirtualDelegate, ResourceMarkersRenderer, MarkerRenderer, RelatedInformationRenderer, MarkersTreeAccessibilityProvider, MarkersViewModel, ResourceDragAndDrop } from 'vs/workbench/contrib/markers/browser/markersTreeViewer'; +import { FilterData, Filter, VirtualDelegate, ResourceMarkersRenderer, MarkerRenderer, RelatedInformationRenderer, MarkersTreeAccessibilityProvider, MarkersViewModel } from 'vs/workbench/contrib/markers/browser/markersTreeViewer'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ActionBar, IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { ResourceLabels } from 'vs/workbench/browser/labels'; -import { IMarker, IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers'; +import { IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { withUndefinedAsNull } from 'vs/base/common/types'; import { MementoObject, Memento } from 'vs/workbench/common/memento'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; @@ -46,7 +46,7 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { editorLightBulbForeground, editorLightBulbAutoFixForeground } from 'vs/platform/theme/common/colorRegistry'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPane'; import { IViewDescriptorService } from 'vs/workbench/common/views'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { IOpenerService, withSelectionFragment } from 'vs/platform/opener/common/opener'; import { Codicon } from 'vs/base/common/codicons'; import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; @@ -56,6 +56,7 @@ import { ResourceMap } from 'vs/base/common/map'; import { EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; import { IMarkersView } from 'vs/workbench/contrib/markers/browser/markers'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; +import { ResourceListDnDHandler } from 'vs/workbench/browser/dnd'; function createResourceMarkersIterator(resourceMarkers: ResourceMarkers): Iterable> { return Iterable.map(resourceMarkers.markers, m => { @@ -84,9 +85,9 @@ export class MarkersView extends ViewPane implements IMarkersView { private readonly panelState: MementoObject; - private _onDidChangeFilterStats = this._register(new Emitter<{ total: number, filtered: number }>()); - readonly onDidChangeFilterStats: Event<{ total: number, filtered: number }> = this._onDidChangeFilterStats.event; - private cachedFilterStats: { total: number; filtered: number; } | undefined = undefined; + private _onDidChangeFilterStats = this._register(new Emitter<{ total: number; filtered: number }>()); + readonly onDidChangeFilterStats: Event<{ total: number; filtered: number }> = this._onDidChangeFilterStats.event; + private cachedFilterStats: { total: number; filtered: number } | undefined = undefined; private currentResourceGotAddedToMarkersData: boolean = false; private readonly markersViewModel: MarkersViewModel; @@ -215,22 +216,9 @@ export class MarkersView extends ViewPane implements IMarkersView { } public openFileAtElement(element: any, preserveFocus: boolean, sideByside: boolean, pinned: boolean): boolean { - const { resource, selection, event, data } = element instanceof Marker ? { resource: element.resource, selection: element.range, event: 'problems.selectDiagnostic', data: this.getTelemetryData(element.marker) } : - element instanceof RelatedInformation ? { resource: element.raw.resource, selection: element.raw, event: 'problems.selectRelatedInformation', data: this.getTelemetryData(element.marker) } : { resource: null, selection: null, event: null, data: null }; - if (resource && selection && event) { - /* __GDPR__ - "problems.selectDiagnostic" : { - "source": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, - "code" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" } - } - */ - /* __GDPR__ - "problems.selectRelatedInformation" : { - "source": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, - "code" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(event, data); + const { resource, selection } = element instanceof Marker ? { resource: element.resource, selection: element.range } : + element instanceof RelatedInformation ? { resource: element.raw.resource, selection: element.raw } : { resource: null, selection: null }; + if (resource && selection) { this.editorService.openEditor({ resource, options: { @@ -345,7 +333,7 @@ export class MarkersView extends ViewPane implements IMarkersView { this.renderMessage(); } - private getFilesExcludeExpressions(): { root: URI, expression: IExpression }[] | IExpression { + private getFilesExcludeExpressions(): { root: URI; expression: IExpression }[] | IExpression { if (!this.filters.excludedFiles) { return []; } @@ -404,7 +392,18 @@ export class MarkersView extends ViewPane implements IMarkersView { filter: this.filter, accessibilityProvider, identityProvider, - dnd: new ResourceDragAndDrop(this.instantiationService), + dnd: this.instantiationService.createInstance(ResourceListDnDHandler, (element) => { + if (element instanceof ResourceMarkers) { + return element.resource; + } + if (element instanceof Marker) { + return withSelectionFragment(element.resource, element.range); + } + if (element instanceof RelatedInformation) { + return withSelectionFragment(element.raw.resource, element.raw); + } + return null; + }), expandOnlyOnTwistieClick: (e: MarkerElement) => e instanceof Marker && e.relatedInformation.length > 0, overrideStyles: { listBackground: this.getBackgroundColor() @@ -426,18 +425,6 @@ export class MarkersView extends ViewPane implements IMarkersView { this._register(Event.debounce(this.tree.onDidOpen, (last, event) => event, 75, true)(options => { this.openFileAtElement(options.element, !!options.editorOptions.preserveFocus, options.sideBySide, !!options.editorOptions.pinned); })); - this._register(this.tree.onDidChangeCollapseState(({ node }) => { - const { element } = node; - if (element instanceof RelatedInformation && !node.collapsed) { - /* __GDPR__ - "problems.expandRelatedInformation" : { - "source": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" }, - "code" : { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('problems.expandRelatedInformation', this.getTelemetryData(element.marker)); - } - })); this._register(this.tree.onContextMenu(this.onContextMenu, this)); @@ -524,7 +511,6 @@ export class MarkersView extends ViewPane implements IMarkersView { // Markers Filters disposables.push(this.filters.onDidChange((event: IMarkersFiltersChangeEvent) => { - this.reportFilteringUsed(); if (event.activeFile) { this.refreshPanel(); } else if (event.filterText || event.excludedFiles || event.showWarnings || event.showErrors || event.showInfos) { @@ -840,7 +826,7 @@ export class MarkersView extends ViewPane implements IMarkersView { return super.getActionViewItem(action); } - getFilterStats(): { total: number; filtered: number; } { + getFilterStats(): { total: number; filtered: number } { if (!this.cachedFilterStats) { this.cachedFilterStats = this.computeFilterStats(); } @@ -848,7 +834,7 @@ export class MarkersView extends ViewPane implements IMarkersView { return this.cachedFilterStats; } - private computeFilterStats(): { total: number; filtered: number; } { + private computeFilterStats(): { total: number; filtered: number } { let filtered = 0; if (this.tree) { const root = this.tree.getNode(); @@ -865,30 +851,6 @@ export class MarkersView extends ViewPane implements IMarkersView { return { total: this.markersModel.total, filtered }; } - private getTelemetryData({ source, code }: IMarker): any { - return { source, code }; - } - - private reportFilteringUsed(): void { - const data = { - errors: this.filters.showErrors, - warnings: this.filters.showWarnings, - infos: this.filters.showInfos, - activeFile: this.filters.activeFile, - excludedFiles: this.filters.excludedFiles, - }; - /* __GDPR__ - "problems.filter" : { - "errors" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "warnings": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "infos": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "activeFile": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "excludedFiles": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } - } - */ - this.telemetryService.publicLog('problems.filter', data); - } - override saveState(): void { this.panelState['filter'] = this.filters.filterText; this.panelState['filterHistory'] = this.filters.filterHistory; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/breakpoints/notebookBreakpoints.ts b/src/vs/workbench/contrib/notebook/browser/contrib/breakpoints/notebookBreakpoints.ts index f1836653a29..908b48c6295 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/breakpoints/notebookBreakpoints.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/breakpoints/notebookBreakpoints.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ +import { RunOnceScheduler } from 'vs/base/common/async'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; @@ -133,22 +134,30 @@ Registry.as(WorkbenchExtensions.Workbench).regi class NotebookCellPausing extends Disposable implements IWorkbenchContribution { private readonly _pausedCells = new Set(); + private _scheduler: RunOnceScheduler; + constructor( @IDebugService private readonly _debugService: IDebugService, @INotebookExecutionStateService private readonly _notebookExecutionStateService: INotebookExecutionStateService, ) { super(); - this._register(_debugService.getModel().onDidChangeCallStack(() => this.onDidChangeCallStack())); + this._register(_debugService.getModel().onDidChangeCallStack(() => { + // First update using the stale callstack if the real callstack is empty, to reduce blinking while stepping. + // After not pausing for 2s, update again with the latest callstack. + this.onDidChangeCallStack(true); + this._scheduler.schedule(); + })); + this._scheduler = this._register(new RunOnceScheduler(() => this.onDidChangeCallStack(false), 2000)); } - private async onDidChangeCallStack(): Promise { + private async onDidChangeCallStack(fallBackOnStaleCallstack: boolean): Promise { const newPausedCells = new Set(); for (const session of this._debugService.getModel().getSessions()) { for (const thread of session.getAllThreads()) { let callStack = thread.getCallStack(); - if (!callStack.length) { + if (fallBackOnStaleCallstack && !callStack.length) { callStack = (thread as Thread).getStaleCallStack(); } @@ -174,12 +183,13 @@ class NotebookCellPausing extends Disposable implements IWorkbenchContribution { private editIsPaused(cellUri: URI, isPaused: boolean) { const parsed = CellUri.parse(cellUri); - if (parsed && isPaused) { - const exeState = this._notebookExecutionStateService.getCellExecutionState(cellUri); - if (exeState) { - this._notebookExecutionStateService.updateNotebookCellExecution(parsed.notebook, parsed.handle, [{ + if (parsed) { + const exeState = this._notebookExecutionStateService.getCellExecution(cellUri); + if (exeState && (exeState.isPaused !== isPaused || !exeState.didPause)) { + exeState.update([{ editType: CellExecutionUpdateType.ExecutionState, - didPause: true + didPause: true, + isPaused }]); } } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/cellCommands/cellCommands.ts b/src/vs/workbench/contrib/notebook/browser/contrib/cellCommands/cellCommands.ts index cdf88189cf5..6eae7cd10c9 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/cellCommands/cellCommands.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/cellCommands/cellCommands.ts @@ -15,7 +15,8 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis import { ResourceNotebookCellEdit } from 'vs/workbench/contrib/bulkEdit/browser/bulkCellEdits'; import { changeCellToKind, computeCellLinesContents, copyCellRange, joinCellsWithSurrounds, moveCellRange } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { cellExecutionArgs, CellOverflowToolbarGroups, CellToolbarOrder, CELL_TITLE_CELL_GROUP_ID, INotebookCellActionContext, INotebookCellToolbarActionContext, INotebookCommandContext, NotebookCellAction, NotebookMultiCellAction, parseMultiCellExecutionArgs } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { CellFocusMode, EXPAND_CELL_INPUT_COMMAND_ID, EXPAND_CELL_OUTPUT_COMMAND_ID, ICellViewModel, INotebookEditor, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_INPUT_COLLAPSED, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_OUTPUT_COLLAPSED, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellFocusMode, EXPAND_CELL_INPUT_COMMAND_ID, EXPAND_CELL_OUTPUT_COMMAND_ID, ICellViewModel, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_INPUT_COLLAPSED, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_OUTPUT_COLLAPSED, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import * as icons from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { CellEditType, CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/contributedStatusBarItemController.ts b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/contributedStatusBarItemController.ts index 82289649e0c..66037ed429c 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/contributedStatusBarItemController.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/contributedStatusBarItemController.ts @@ -8,9 +8,8 @@ import { disposableTimeout, Throttler } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { NotebookVisibleCellObserver } from 'vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/notebookVisibleCellObserver'; -import { ICellViewModel, INotebookEditor, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellViewModel, INotebookEditor, INotebookEditorContribution, INotebookViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { registerNotebookContribution } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; -import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { INotebookCellStatusBarService } from 'vs/workbench/contrib/notebook/common/notebookCellStatusBarService'; import { INotebookCellStatusBarItemList } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -46,7 +45,7 @@ export class ContributedStatusBarItemController extends Disposable implements IN } private _updateVisibleCells(e: { - added: CellViewModel[]; + added: ICellViewModel[]; removed: { handle: number }[]; }): void { const vm = this._notebookEditor._getViewModel(); @@ -82,7 +81,7 @@ class CellStatusBarHelper extends Disposable { private readonly _updateThrottler = new Throttler(); constructor( - private readonly _notebookViewModel: NotebookViewModel, + private readonly _notebookViewModel: INotebookViewModel, private readonly _cell: ICellViewModel, private readonly _notebookCellStatusBarService: INotebookCellStatusBarService ) { diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.ts b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.ts index 83360870d73..e3803c1dce1 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.ts @@ -9,13 +9,24 @@ import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { themeColorFromId, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { ICellVisibilityChangeEvent, NotebookVisibleCellObserver } from 'vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/notebookVisibleCellObserver'; -import { formatCellDuration, ICellViewModel, INotebookEditor, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellViewModel, INotebookEditor, INotebookEditorContribution, INotebookViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { registerNotebookContribution } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; import { cellStatusIconError, cellStatusIconSuccess } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; import { errorStateIcon, executingStateIcon, pendingStateIcon, successStateIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; -import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { CellStatusbarAlignment, INotebookCellStatusBarItem, NotebookCellExecutionState, NotebookCellInternalMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { ICellExecutionEntry, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { INotebookCellExecution, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; + +export function formatCellDuration(duration: number): string { + const minutes = Math.floor(duration / 1000 / 60); + const seconds = Math.floor(duration / 1000) % 60; + const tenths = String(duration - minutes * 60 * 1000 - seconds * 1000).charAt(0); + + if (minutes > 0) { + return `${minutes}m ${seconds}.${tenths}s`; + } else { + return `${seconds}.${tenths}s`; + } +} export class NotebookStatusBarController extends Disposable { private readonly _visibleCells = new Map(); @@ -23,7 +34,7 @@ export class NotebookStatusBarController extends Disposable { constructor( private readonly _notebookEditor: INotebookEditor, - private readonly _itemFactory: (vm: NotebookViewModel, cell: CellViewModel) => IDisposable, + private readonly _itemFactory: (vm: INotebookViewModel, cell: ICellViewModel) => IDisposable, ) { super(); this._observer = this._register(new NotebookVisibleCellObserver(this._notebookEditor)); @@ -85,7 +96,7 @@ class ExecutionStateCellStatusBarItem extends Disposable { private _currentExecutingStateTimer: IDisposable | undefined; constructor( - private readonly _notebookViewModel: NotebookViewModel, + private readonly _notebookViewModel: INotebookViewModel, private readonly _cell: ICellViewModel, @INotebookExecutionStateService private readonly _executionStateService: INotebookExecutionStateService ) { @@ -93,7 +104,7 @@ class ExecutionStateCellStatusBarItem extends Disposable { this._update(); this._register(this._executionStateService.onDidChangeCellExecution(e => { - if (e.affectsCell(this._cell.model)) { + if (e.affectsCell(this._cell.uri)) { this._update(); } })); @@ -111,8 +122,8 @@ class ExecutionStateCellStatusBarItem extends Disposable { * Returns undefined if there should be no change, and an empty array if all items should be removed. */ private _getItemsForCell(): INotebookCellStatusBarItem[] | undefined { - const runState = this._executionStateService.getCellExecutionState(this._cell.uri); - if (this._currentExecutingStateTimer && !runState?.didPause) { + const runState = this._executionStateService.getCellExecution(this._cell.uri); + if (this._currentExecutingStateTimer && !runState?.isPaused) { return; } @@ -121,7 +132,7 @@ class ExecutionStateCellStatusBarItem extends Disposable { // Show the execution spinner for a minimum time if (runState?.state === NotebookCellExecutionState.Executing) { this._currentExecutingStateTimer = this._register(disposableTimeout(() => { - const runState = this._executionStateService.getCellExecutionState(this._cell.uri); + const runState = this._executionStateService.getCellExecution(this._cell.uri); this._currentExecutingStateTimer = undefined; if (runState?.state !== NotebookCellExecutionState.Executing) { this._update(); @@ -132,7 +143,7 @@ class ExecutionStateCellStatusBarItem extends Disposable { return item ? [item] : []; } - private _getItemForState(runState: ICellExecutionEntry | undefined, internalMetadata: NotebookCellInternalMetadata): INotebookCellStatusBarItem | undefined { + private _getItemForState(runState: INotebookCellExecution | undefined, internalMetadata: NotebookCellInternalMetadata): INotebookCellStatusBarItem | undefined { const state = runState?.state; const { lastRunSuccess } = internalMetadata; if (!state && lastRunSuccess) { @@ -159,7 +170,7 @@ class ExecutionStateCellStatusBarItem extends Disposable { priority: Number.MAX_SAFE_INTEGER }; } else if (state === NotebookCellExecutionState.Executing) { - const icon = runState?.didPause ? + const icon = runState?.isPaused ? executingStateIcon : ThemeIcon.modify(executingStateIcon, 'spin'); return { @@ -199,7 +210,7 @@ class TimerCellStatusBarItem extends Disposable { private _scheduler: RunOnceScheduler; constructor( - private readonly _notebookViewModel: NotebookViewModel, + private readonly _notebookViewModel: INotebookViewModel, private readonly _cell: ICellViewModel, @INotebookExecutionStateService private readonly _executionStateService: INotebookExecutionStateService ) { @@ -212,7 +223,7 @@ class TimerCellStatusBarItem extends Disposable { private async _update() { let item: INotebookCellStatusBarItem | undefined; - const runState = this._executionStateService.getCellExecutionState(this._cell.uri); + const runState = this._executionStateService.getCellExecution(this._cell.uri); const state = runState?.state; if (runState?.didPause) { item = undefined; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/notebookVisibleCellObserver.ts b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/notebookVisibleCellObserver.ts index 62c93dcdcc3..ba96e077b99 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/notebookVisibleCellObserver.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/notebookVisibleCellObserver.ts @@ -7,13 +7,12 @@ import { diffSets } from 'vs/base/common/collections'; import { Emitter } from 'vs/base/common/event'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { isDefined } from 'vs/base/common/types'; -import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { ICellViewModel, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { cellRangesToIndexes } from 'vs/workbench/contrib/notebook/common/notebookRange'; export interface ICellVisibilityChangeEvent { - added: CellViewModel[]; - removed: CellViewModel[]; + added: ICellViewModel[]; + removed: ICellViewModel[]; } export class NotebookVisibleCellObserver extends Disposable { @@ -22,9 +21,9 @@ export class NotebookVisibleCellObserver extends Disposable { private readonly _viewModelDisposables = this._register(new DisposableStore()); - private _visibleCells: CellViewModel[] = []; + private _visibleCells: ICellViewModel[] = []; - get visibleCells(): CellViewModel[] { + get visibleCells(): ICellViewModel[] { return this._visibleCells; } @@ -56,20 +55,18 @@ export class NotebookVisibleCellObserver extends Disposable { return; } - const rangesWithEnd = this._notebookEditor.visibleRanges - .map(range => ({ start: range.start, end: range.end + 1 })); - const newVisibleCells = cellRangesToIndexes(rangesWithEnd) - .map(index => this._notebookEditor.cellAt(index) as CellViewModel) + const newVisibleCells = cellRangesToIndexes(this._notebookEditor.visibleRanges) + .map(index => this._notebookEditor.cellAt(index)) .filter(isDefined); const newVisibleHandles = new Set(newVisibleCells.map(cell => cell.handle)); const oldVisibleHandles = new Set(this._visibleCells.map(cell => cell.handle)); const diff = diffSets(oldVisibleHandles, newVisibleHandles); const added = diff.added - .map(handle => this._notebookEditor.getCellByHandle(handle) as CellViewModel) + .map(handle => this._notebookEditor.getCellByHandle(handle)) .filter(isDefined); const removed = diff.removed - .map(handle => this._notebookEditor.getCellByHandle(handle) as CellViewModel) + .map(handle => this._notebookEditor.getCellByHandle(handle)) .filter(isDefined); this._visibleCells = newVisibleCells; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders.ts b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders.ts index 9ed1ba58292..f1834e4ee96 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders.ts @@ -6,7 +6,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Registry } from 'vs/platform/registry/common/platform'; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard.ts b/src/vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard.ts index 56398f263db..90a05458d9e 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard.ts @@ -9,8 +9,9 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { cellRangeToViewCells, expandCellRangesWithHiddenCells, getNotebookEditorFromEditorPane, ICellViewModel, INotebookEditor, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/clipboard'; +import { NOTEBOOK_CELL_EDITABLE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { cellRangeToViewCells, expandCellRangesWithHiddenCells, getNotebookEditorFromEditorPane, ICellViewModel, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/browser/clipboard'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { cloneNotebookCellTextModel, NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { CellEditType, ICellEditOperation, ISelectionState, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer.ts b/src/vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer.ts index 7e28ceec311..f30736a0051 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer.ts @@ -4,19 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { IEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; +import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { RenderOutputType, ICellOutputViewModel, IRenderOutput } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { OutputRendererRegistry } from 'vs/workbench/contrib/notebook/browser/view/output/rendererRegistry'; -import { IOutputItemDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; +import { ICellOutputViewModel, IOutputTransformContribution, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { INotebookDelegateForOutput } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { OutputRendererRegistry } from 'vs/workbench/contrib/notebook/browser/view/output/rendererRegistry'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; -import { INotebookDelegateForOutput, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { IOutputItemDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; abstract class CodeRendererContrib extends Disposable implements IOutputTransformContribution { getType() { diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts b/src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts index 7b9574403d7..6b4c1aeb914 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar.ts @@ -7,24 +7,23 @@ import { groupBy } from 'vs/base/common/arrays'; import { Disposable, DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { compareIgnoreCase, uppercaseFirstLetter } from 'vs/base/common/strings'; -import { HoverProviderRegistry } from 'vs/editor/common/languages'; import * as nls from 'vs/nls'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ILabelService } from 'vs/platform/label/common/label'; import { ILogService } from 'vs/platform/log/common/log'; import { IQuickInputButton, IQuickInputService, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; import { Registry } from 'vs/platform/registry/common/platform'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; -import type { SelectKernelReturnArgs } from 'vs/workbench/api/common/extHostNotebookKernels'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { ViewContainerLocation } from 'vs/workbench/common/views'; import { IExtensionsViewPaneContainer, VIEWLET_ID as EXTENSION_VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { CENTER_ACTIVE_CELL } from 'vs/workbench/contrib/notebook/browser/contrib/navigation/arrow'; import { NOTEBOOK_ACTIONS_CATEGORY, SELECT_KERNEL_ID } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { getNotebookEditorFromEditorPane, INotebookEditor, KERNEL_EXTENSIONS, NOTEBOOK_MISSING_KERNEL_EXTENSION, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_KERNEL_COUNT } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_MISSING_KERNEL_EXTENSION, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_KERNEL_COUNT } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { getNotebookEditorFromEditorPane, INotebookEditor, KERNEL_EXTENSIONS } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; import { configureKernelIcon, selectKernelIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; @@ -34,6 +33,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { IStatusbarEntry, IStatusbarEntryAccessor, IStatusbarService, StatusbarAlignment } from 'vs/workbench/services/statusbar/browser/statusbar'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; registerAction2(class extends Action2 { constructor() { @@ -94,7 +94,13 @@ registerAction2(class extends Action2 { }); } - async run(accessor: ServicesAccessor, context?: SelectKernelReturnArgs | { ui?: boolean, notebookEditor?: NotebookEditorWidget }): Promise { + async run(accessor: ServicesAccessor, context?: + { id: string; extension: string } | + { notebookEditorId: string } | + { id: string; extension: string; notebookEditorId: string } | + { ui?: boolean; notebookEditor?: NotebookEditorWidget } | + undefined + ): Promise { const notebookKernelService = accessor.get(INotebookKernelService); const editorService = accessor.get(IEditorService); const quickInputService = accessor.get(IQuickInputService); @@ -152,7 +158,7 @@ registerAction2(class extends Action2 { } if (!newKernel) { - type KernelPick = IQuickPickItem & { kernel: INotebookKernel; }; + type KernelPick = IQuickPickItem & { kernel: INotebookKernel }; const configButton: IQuickInputButton = { iconClass: ThemeIcon.asClassName(configureKernelIcon), tooltip: nls.localize('notebook.promptKernel.setDefaultTooltip', "Set as default for '{0}' notebooks", editor.textModel.viewType) @@ -254,6 +260,7 @@ class ImplictKernelSelector implements IDisposable { notebook: NotebookTextModel, suggested: INotebookKernel, @INotebookKernelService notebookKernelService: INotebookKernelService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, @ILogService logService: ILogService ) { const disposables = new DisposableStore(); @@ -284,7 +291,7 @@ class ImplictKernelSelector implements IDisposable { // IMPLICITLY select a suggested kernel when users start to hover. This should // be a strong enough hint that the user wants to interact with the notebook. Maybe // add more triggers like goto-providers or completion-providers - disposables.add(HoverProviderRegistry.register({ scheme: Schemas.vscodeNotebookCell, pattern: notebook.uri.path }, { + disposables.add(languageFeaturesService.hoverProvider.register({ scheme: Schemas.vscodeNotebookCell, pattern: notebook.uri.path }, { provideHover() { logService.trace('IMPLICIT kernel selection because of hover'); selectKernel(); @@ -303,7 +310,7 @@ export class KernelStatus extends Disposable implements IWorkbenchContribution { @IEditorService private readonly _editorService: IEditorService, @IStatusbarService private readonly _statusbarService: IStatusbarService, @INotebookKernelService private readonly _notebookKernelService: INotebookKernelService, - @ILogService private readonly _logService: ILogService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, ) { super(); this._register(this._editorService.onDidActiveEditorChange(() => this._updateStatusbar())); @@ -363,7 +370,7 @@ export class KernelStatus extends Disposable implements IWorkbenchContribution { // when non trivial interactions with the notebook happen. kernel = suggested!; isSuggested = true; - this._kernelInfoElement.add(new ImplictKernelSelector(notebook, kernel, this._notebookKernelService, this._logService)); + this._kernelInfoElement.add(this._instantiationService.createInstance(ImplictKernelSelector, notebook, kernel)); } const tooltip = kernel.description ?? kernel.detail ?? kernel.label; this._kernelInfoElement.add(this._statusbarService.addEntry( diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/execute/execution.ts b/src/vs/workbench/contrib/notebook/browser/contrib/execute/execution.ts new file mode 100644 index 00000000000..0572d8ae0e2 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/contrib/execute/execution.ts @@ -0,0 +1,42 @@ +/*--------------------------------------------------------------------------------------------- + * 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 { ILogService } from 'vs/platform/log/common/log'; +import { INotebookEditor, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { registerNotebookContribution } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; +import { INotebookExecutionService } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; +import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; + +export class ExecutionContrib extends Disposable implements INotebookEditorContribution { + static id: string = 'workbench.notebook.executionContrib'; + + constructor( + private readonly _notebookEditor: INotebookEditor, + @INotebookExecutionStateService private readonly _notebookExecutionStateService: INotebookExecutionStateService, + @INotebookExecutionService private readonly _notebookExecutionService: INotebookExecutionService, + @ILogService private readonly _logService: ILogService, + @INotebookKernelService private readonly _notebookKernelService: INotebookKernelService, + ) { + super(); + + this._register(this._notebookKernelService.onDidChangeSelectedNotebooks(e => { + if (e.newKernel && this._notebookEditor.textModel?.uri.toString() === e.notebook.toString()) { + this.cancelAll(); + this._notebookExecutionStateService.forceCancelNotebookExecutions(e.notebook); + } + })); + } + + private cancelAll(): void { + this._logService.debug(`ExecutionContrib#cancelAll`); + const exes = this._notebookExecutionStateService.getCellExecutionStatesForNotebook(this._notebookEditor.textModel!.uri); + this._notebookExecutionService.cancelNotebookCellHandles(this._notebookEditor.textModel!, exes.map(exe => exe.cellHandle)); + } +} + + +registerNotebookContribution(ExecutionContrib.id, ExecutionContrib); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/execute/executionEditorProgress.ts b/src/vs/workbench/contrib/notebook/browser/contrib/execute/executionEditorProgress.ts index fc628ff29b4..4a56e7d6acf 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/execute/executionEditorProgress.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/execute/executionEditorProgress.ts @@ -8,7 +8,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { INotebookEditor, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { registerNotebookContribution } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; import { NotebookCellExecutionState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { ICellExecutionEntry, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { INotebookCellExecution, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; export class ExecutionEditorProgressController extends Disposable implements INotebookEditorContribution { static id: string = 'workbench.notebook.executionEditorProgress'; @@ -40,7 +40,7 @@ export class ExecutionEditorProgressController extends Disposable implements INo const executing = this._notebookExecutionStateService.getCellExecutionStatesForNotebook(this._notebookEditor.textModel?.uri) .filter(exe => exe.state === NotebookCellExecutionState.Executing); - const executionIsVisible = (exe: ICellExecutionEntry) => { + const executionIsVisible = (exe: INotebookCellExecution) => { for (const range of this._notebookEditor.visibleRanges) { for (const cell of this._notebookEditor.getCellsInRange(range)) { if (cell.handle === exe.cellHandle) { @@ -51,7 +51,7 @@ export class ExecutionEditorProgressController extends Disposable implements INo return false; }; - if (!executing.length || executing.some(executionIsVisible)) { + if (!executing.length || executing.some(executionIsVisible) || executing.some(e => e.isPaused)) { this._notebookEditor.hideProgress(); } else { this._notebookEditor.showProgress(); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts index 0862750d598..99a308a9bd4 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts @@ -8,9 +8,10 @@ import { alert as alertFn } from 'vs/base/browser/ui/aria/aria'; import * as strings from 'vs/base/common/strings'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED, INotebookEditor, CellEditState, INotebookEditorContribution, NOTEBOOK_EDITOR_FOCUSED, getNotebookEditorFromEditorPane, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { INotebookEditor, CellEditState, INotebookEditorContribution, getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { Range } from 'vs/editor/common/core/range'; -import { MATCHES_LIMIT } from 'vs/editor/contrib/find/findModel'; +import { MATCHES_LIMIT } from 'vs/editor/contrib/find/browser/findModel'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -21,11 +22,11 @@ import { localize } from 'vs/nls'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { StartFindAction, StartFindReplaceAction } from 'vs/editor/contrib/find/findController'; +import { StartFindAction, StartFindReplaceAction } from 'vs/editor/contrib/find/browser/findController'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { NLS_MATCHES_LOCATION, NLS_NO_RESULTS } from 'vs/editor/contrib/find/findWidget'; +import { NLS_MATCHES_LOCATION, NLS_NO_RESULTS } from 'vs/editor/contrib/find/browser/findWidget'; import { FindModel } from 'vs/workbench/contrib/notebook/browser/contrib/find/findModel'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { FindMatch, ITextModel } from 'vs/editor/common/model'; @@ -86,6 +87,9 @@ export class NotebookFindWidget extends SimpleFindReplaceWidget implements INote this._replaceBtn.setEnabled(currentMatch.isModelMatch); } + const matches = this._findModel.findMatches; + this._replaceAllBtn.setEnabled(matches.find(match => match.modelMatchCount < match.matches.length) === null); + if (e.filters) { this._findInput.updateFilterState((this._state.filters?.markupPreview ?? false) || (this._state.filters?.codeOutput ?? false)); } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/findModel.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/findModel.ts index 480893dc71a..06ff1c4900d 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/findModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/findModel.ts @@ -4,14 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { CancelablePromise, createCancelablePromise, Delayer } from 'vs/base/common/async'; -import { INotebookEditor, CellFindMatch, CellEditState, CellFindMatchWithIndex, OutputFindMatch } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { INotebookEditor, CellFindMatch, CellEditState, CellFindMatchWithIndex, OutputFindMatch, ICellModelDecorations, ICellModelDeltaDecorations } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { Range } from 'vs/editor/common/core/range'; -import { FindDecorations } from 'vs/editor/contrib/find/findDecorations'; +import { FindDecorations } from 'vs/editor/contrib/find/browser/findDecorations'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { FindMatch, IModelDeltaDecoration } from 'vs/editor/common/model'; -import { ICellModelDeltaDecorations, ICellModelDecorations } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; -import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { PrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { CellKind, INotebookSearchOptions, NotebookCellsChangeType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -26,7 +25,7 @@ export class FindModel extends Disposable { protected _findMatchesStarts: PrefixSumComputer | null = null; private _currentMatch: number = -1; private _allMatchesDecorations: ICellModelDecorations[] = []; - private _currentMatchDecorations: { kind: 'input'; decorations: ICellModelDecorations[]; } | { kind: 'output'; index: number } | null = null; + private _currentMatchDecorations: { kind: 'input'; decorations: ICellModelDecorations[] } | { kind: 'output'; index: number } | null = null; private readonly _throttledDelayer: Delayer; private _computePromise: CancelablePromise | null = null; private readonly _modelDisposable = this._register(new DisposableStore()); @@ -333,7 +332,7 @@ export class FindModel extends Disposable { private _updateCurrentMatch(findMatches: CellFindMatchWithIndex[], currentMatchesPosition: number) { this.set(findMatches, false); - this._currentMatch = currentMatchesPosition; + this._currentMatch = currentMatchesPosition % findMatches.length; const nextIndex = this._findMatchesStarts!.getIndexOf(this._currentMatch); this.highlightCurrentFindMatchDecoration(nextIndex.index, nextIndex.remainder); 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 790963d3f67..8b380c1d39c 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.css +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.css @@ -130,12 +130,12 @@ .monaco-workbench .simple-fr-find-part-wrapper .find-filter-button { color: inherit; - margin-left: 2px; - float: left; - cursor: pointer; - box-sizing: border-box; - user-select: none; - -webkit-user-select: none; + margin-left: 2px; + float: left; + cursor: pointer; + box-sizing: border-box; + user-select: none; + -webkit-user-select: none; } .find-filter-button .monaco-action-bar .action-label { @@ -145,3 +145,8 @@ .simple-fr-find-part .find-filter-button > .monaco-action-bar .action-label.notebook-filters { padding: 2px; } + +.monaco-workbench .simple-fr-find-part .monaco-inputbox > .ibwrapper > .input, +.monaco-workbench .simple-fr-replace-part .monaco-inputbox > .ibwrapper > .input { + height: 24px; +} 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 f767b358e0d..5f43f2d36f8 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts @@ -12,8 +12,8 @@ import { Widget } from 'vs/base/browser/ui/widget'; import { Delayer } from 'vs/base/common/async'; import { KeyCode } from 'vs/base/common/keyCodes'; import 'vs/css!./notebookFindReplaceWidget'; -import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/findState'; -import { findNextMatchIcon, findPreviousMatchIcon, findReplaceAllIcon, findReplaceIcon, SimpleButton } from 'vs/editor/contrib/find/findWidget'; +import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/browser/findState'; +import { findNextMatchIcon, findPreviousMatchIcon, findReplaceAllIcon, findReplaceIcon, SimpleButton } from 'vs/editor/contrib/find/browser/findWidget'; import * as nls from 'vs/nls'; import { ContextScopedReplaceInput, createAndBindHistoryNavigationWidgetScopedContextKeyService, IContextScopedHistoryNavigationWidget } from 'vs/platform/history/browser/contextScopedHistoryWidget'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -22,7 +22,7 @@ import { editorWidgetBackground, editorWidgetForeground, inputActiveOptionBackgr 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'; -import { parseReplaceString, ReplacePattern } from 'vs/editor/contrib/find/replacePattern'; +import { parseReplaceString, ReplacePattern } from 'vs/editor/contrib/find/browser/replacePattern'; import { Codicon } from 'vs/base/common/codicons'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Action, ActionRunner, IAction, IActionRunner, Separator } from 'vs/base/common/actions'; @@ -52,7 +52,7 @@ const NOTEBOOK_FIND_FILTERS = nls.localize('notebook.find.filter.filterAction', const NOTEBOOK_FIND_IN_MARKUP_INPUT = nls.localize('notebook.find.filter.findInMarkupInput', "Markdown Source"); const NOTEBOOK_FIND_IN_MARKUP_PREVIEW = nls.localize('notebook.find.filter.findInMarkupPreview', "Rendered Markdown"); const NOTEBOOK_FIND_IN_CODE_INPUT = nls.localize('notebook.find.filter.findInCodeInput', "Code Cell Source"); -const NOTEBOOK_FIND_IN_CODE_OUTPUT = nls.localize('notebook.find.filter.findInCodeOutput', "Code Cell Outputs"); +const NOTEBOOK_FIND_IN_CODE_OUTPUT = nls.localize('notebook.find.filter.findInCodeOutput', "Cell Output"); class NotebookFindFilterActionViewItem extends DropdownMenuActionViewItem { constructor(readonly filters: NotebookFindFilters, action: IAction, actionRunner: IActionRunner, @IContextMenuService contextMenuService: IContextMenuService) { @@ -62,8 +62,7 @@ class NotebookFindFilterActionViewItem extends DropdownMenuActionViewItem { { actionRunner, classNames: action.class, - anchorAlignmentProvider: () => AnchorAlignment.RIGHT, - menuAsChild: true + anchorAlignmentProvider: () => AnchorAlignment.RIGHT } ); } @@ -160,6 +159,12 @@ class NotebookFindInput extends FindInput { this._filtersAction.checked = false; } })); + + this.inputBox.paddingRight = this.caseSensitive.width() + this.wholeWords.width() + this.regex.width() + this.getFilterWidth(); + } + + private getFilterWidth() { + return 2 /*margin left*/ + 2 /*border*/ + 2 /*padding*/ + 16 /* icon width */; } private createFilters(container: HTMLElement): void { @@ -205,7 +210,7 @@ class NotebookFindInput extends FindInput { this._filterButtonContainer.style.backgroundColor = this._filterChecked && this.inputActiveOptionBackground ? this.inputActiveOptionBackground.toString() : ''; } - getCellToolbarActions(menu: IMenu): { primary: IAction[], secondary: IAction[]; } { + getCellToolbarActions(menu: IMenu): { primary: IAction[]; secondary: IAction[] } { const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary }; @@ -450,7 +455,7 @@ export abstract class SimpleFindReplaceWidget extends Widget { this._innerReplaceDomNode.appendChild(this._replaceAllBtn.domNode); } - getCellToolbarActions(menu: IMenu): { primary: IAction[], secondary: IAction[]; } { + getCellToolbarActions(menu: IMenu): { primary: IAction[]; secondary: IAction[] } { const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary }; @@ -545,6 +550,8 @@ export abstract class SimpleFindReplaceWidget extends Widget { this._domNode.classList.toggle('replaceToggled', this._isReplaceVisible); this._toggleReplaceBtn.setExpanded(this._isReplaceVisible); + this.foundMatch = this._state.matchesCount > 0; + this.updateButtons(this.foundMatch); } protected _updateMatchesCount(): void { diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/format/formatting.ts b/src/vs/workbench/contrib/notebook/browser/contrib/format/formatting.ts index 09d2a7dabf9..b66379399c8 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/format/formatting.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/format/formatting.ts @@ -6,7 +6,8 @@ import { registerAction2, Action2, MenuId } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { localize } from 'vs/nls'; -import { NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_EDITOR_EDITABLE, getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_EDITOR_EDITABLE } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -14,7 +15,7 @@ import { NOTEBOOK_ACTIONS_CATEGORY } from 'vs/workbench/contrib/notebook/browser import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { getDocumentFormattingEditsUntilResult, formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/format'; +import { getDocumentFormattingEditsUntilResult, formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/browser/format'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IBulkEditService, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService'; @@ -23,6 +24,7 @@ import { registerEditorAction, EditorAction } from 'vs/editor/browser/editorExte import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Progress } from 'vs/platform/progress/common/progress'; import { flatten } from 'vs/base/common/arrays'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; // format notebook registerAction2(class extends Action2 { @@ -52,6 +54,7 @@ registerAction2(class extends Action2 { const editorService = accessor.get(IEditorService); const textModelService = accessor.get(ITextModelService); const editorWorkerService = accessor.get(IEditorWorkerService); + const languageFeaturesService = accessor.get(ILanguageFeaturesService); const bulkEditService = accessor.get(IBulkEditService); const editor = getNotebookEditorFromEditorPane(editorService.activeEditorPane); @@ -69,7 +72,9 @@ registerAction2(class extends Action2 { const model = ref.object.textEditorModel; const formatEdits = await getDocumentFormattingEditsUntilResult( - editorWorkerService, model, + editorWorkerService, + languageFeaturesService, + model, model.getOptions(), CancellationToken.None ); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted.ts b/src/vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted.ts index 18965b389d0..0a930250070 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted.ts @@ -15,7 +15,7 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag import { CATEGORIES } from 'vs/workbench/common/actions'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { Memento } from 'vs/workbench/common/memento'; -import { HAS_OPENED_NOTEBOOK } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { HAS_OPENED_NOTEBOOK } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/marker/markerProvider.ts b/src/vs/workbench/contrib/notebook/browser/contrib/marker/markerProvider.ts index 080aea7bcf2..13315c8ab5d 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/marker/markerProvider.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/marker/markerProvider.ts @@ -7,7 +7,7 @@ import { URI } from 'vs/base/common/uri'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { IMarkerListProvider, MarkerList, IMarkerNavigationService } from 'vs/editor/contrib/gotoError/markerNavigationService'; +import { IMarkerListProvider, MarkerList, IMarkerNavigationService } from 'vs/editor/contrib/gotoError/browser/markerNavigationService'; import { CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/navigation/arrow.ts b/src/vs/workbench/contrib/notebook/browser/contrib/navigation/arrow.ts index 8d378fbcf0f..763c427e321 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/navigation/arrow.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/navigation/arrow.ts @@ -14,7 +14,8 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { INotebookActionContext, INotebookCellActionContext, NotebookAction, NotebookCellAction, NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { CellEditState, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { CellEditState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellKind, NOTEBOOK_EDITOR_CURSOR_BOUNDARY } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; @@ -168,9 +169,11 @@ registerAction2(class extends NotebookAction { return; } - const firstCell = editor.cellAt(editor.getLength() - 1); - if (firstCell) { - editor.focusNotebookCell(firstCell, 'container'); + const lastIdx = editor.getLength() - 1; + const lastVisibleIdx = editor.getPreviousVisibleCellIndex(lastIdx); + if (lastVisibleIdx) { + const cell = editor.cellAt(lastVisibleIdx); + editor.focusNotebookCell(cell, 'container'); } } }); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts b/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts index 2793a3ce110..44ffbe69d1f 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline.ts @@ -33,10 +33,11 @@ import { isEqual } from 'vs/base/common/resources'; import { IdleValue } from 'vs/base/common/async'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; -import * as marked from 'vs/base/common/marked/marked'; +import { marked } from 'vs/base/common/marked/marked'; import { renderMarkdownAsPlaintext } from 'vs/base/browser/markdownRenderer'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { executingStateIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; +import { URI } from 'vs/base/common/uri'; export interface IOutlineMarkerInfo { readonly count: number; @@ -50,8 +51,9 @@ export class OutlineEntry { private _markerInfo: IOutlineMarkerInfo | undefined; get icon(): ThemeIcon { - return this.isExecuting ? ThemeIcon.modify(executingStateIcon, 'spin') : - this.cell.cellKind === CellKind.Markup ? Codicon.markdown : Codicon.code; + return this.isExecuting && this.isPaused ? executingStateIcon : + this.isExecuting ? ThemeIcon.modify(executingStateIcon, 'spin') : + this.cell.cellKind === CellKind.Markup ? Codicon.markdown : Codicon.code; } constructor( @@ -59,7 +61,8 @@ export class OutlineEntry { readonly level: number, readonly cell: ICellViewModel, readonly label: string, - readonly isExecuting: boolean + readonly isExecuting: boolean, + readonly isPaused: boolean ) { } addChild(entry: OutlineEntry) { @@ -222,7 +225,7 @@ class NotebookOutlineAccessibility implements IListAccessibilityProvider { - getKeyboardNavigationLabel(element: OutlineEntry): { toString(): string | undefined; } | { toString(): string | undefined; }[] | undefined { + getKeyboardNavigationLabel(element: OutlineEntry): { toString(): string | undefined } | { toString(): string | undefined }[] | undefined { return element.label; } } @@ -287,6 +290,7 @@ export class NotebookCellOutline extends Disposable implements IOutline = this._onDidChange.event; + private _uri: URI | undefined; private _entries: OutlineEntry[] = []; private _activeEntry?: OutlineEntry; private readonly _entriesDisposables = this._register(new DisposableStore()); @@ -337,7 +341,11 @@ export class NotebookCellOutline extends Disposable implements IOutline this._recomputeState())); + this._register(_notebookExecutionStateService.onDidChangeCellExecution(e => { + if (!!this._editor.textModel && e.affectsNotebook(this._editor.textModel?.uri)) { + this._recomputeState(); + } + })); this._recomputeState(); installSelectionListener(); @@ -381,6 +389,7 @@ export class NotebookCellOutline extends Disposable implements IOutline { await this._editorService.openEditor({ resource: entry.cell.uri, diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts b/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts index dd935639034..29d4e867f65 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts @@ -7,7 +7,7 @@ import { Disposable, DisposableStore, dispose, IDisposable } from 'vs/base/commo import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { CATEGORIES } from 'vs/workbench/common/actions'; -import { getNotebookEditorFromEditorPane, ICellViewModel, INotebookEditor, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { getNotebookEditorFromEditorPane, ICellViewModel, ICommonCellViewModelLayoutChangeInfo, INotebookEditor, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { registerNotebookContribution } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; @@ -65,7 +65,7 @@ export class TroubleshootController extends Disposable implements INotebookEdito e.splices.reverse().forEach(splice => { const [start, deleted, newCells] = splice; const deletedCells = this._cellStateListeners.splice(start, deleted, ...newCells.map(cell => { - return cell.onDidChangeLayout(e => { + return cell.onDidChangeLayout((e: ICommonCellViewModelLayoutChangeInfo) => { this._log(cell, e); }); })); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/undoRedo/notebookUndoRedo.ts b/src/vs/workbench/contrib/notebook/browser/contrib/undoRedo/notebookUndoRedo.ts index a640ff298df..22678c6af01 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/undoRedo/notebookUndoRedo.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/undoRedo/notebookUndoRedo.ts @@ -11,6 +11,7 @@ import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { CellEditState, getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { RedoCommand, UndoCommand } from 'vs/editor/browser/editorExtensions'; +import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; class NotebookUndoRedoContribution extends Disposable { @@ -20,7 +21,7 @@ class NotebookUndoRedoContribution extends Disposable { const PRIORITY = 105; this._register(UndoCommand.addImplementation(PRIORITY, 'notebook-undo-redo', () => { const editor = getNotebookEditorFromEditorPane(this._editorService.activeEditorPane); - const viewModel = editor?._getViewModel(); + const viewModel = editor?._getViewModel() as NotebookViewModel | undefined; if (editor && editor.hasModel() && viewModel) { return viewModel.undo().then(cellResources => { if (cellResources?.length) { @@ -41,7 +42,7 @@ class NotebookUndoRedoContribution extends Disposable { this._register(RedoCommand.addImplementation(PRIORITY, 'notebook-undo-redo', () => { const editor = getNotebookEditorFromEditorPane(this._editorService.activeEditorPane); - const viewModel = editor?._getViewModel(); + const viewModel = editor?._getViewModel() as NotebookViewModel | undefined; if (editor && editor.hasModel() && viewModel) { return viewModel.redo().then(cellResources => { diff --git a/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts index f06cabc40c9..8e6f97a2216 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/apiActions.ts @@ -13,8 +13,8 @@ import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookS CommandsRegistry.registerCommand('_resolveNotebookContentProvider', (accessor, args): { viewType: string; displayName: string; - options: { transientOutputs: boolean; transientCellMetadata: TransientCellMetadata; transientDocumentMetadata: TransientDocumentMetadata; }; - filenamePattern: (string | glob.IRelativePattern | { include: string | glob.IRelativePattern, exclude: string | glob.IRelativePattern; })[]; + options: { transientOutputs: boolean; transientCellMetadata: TransientCellMetadata; transientDocumentMetadata: TransientDocumentMetadata }; + filenamePattern: (string | glob.IRelativePattern | { include: string | glob.IRelativePattern; exclude: string | glob.IRelativePattern })[]; }[] => { const notebookService = accessor.get(INotebookService); const contentProviders = notebookService.getContributedNotebookTypes(); @@ -36,7 +36,7 @@ CommandsRegistry.registerCommand('_resolveNotebookContentProvider', (accessor, a } return null; - }).filter(pattern => pattern !== null) as (string | glob.IRelativePattern | { include: string | glob.IRelativePattern, exclude: string | glob.IRelativePattern; })[]; + }).filter(pattern => pattern !== null) as (string | glob.IRelativePattern | { include: string | glob.IRelativePattern; exclude: string | glob.IRelativePattern })[]; return { viewType: provider.id, diff --git a/src/vs/workbench/contrib/notebook/browser/controller/cellOperations.ts b/src/vs/workbench/contrib/notebook/browser/controller/cellOperations.ts index 657cfe54213..66f576aa3f4 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/cellOperations.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/cellOperations.ts @@ -8,11 +8,11 @@ import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference, IReadonlyTextBuffer } from 'vs/editor/common/model'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ResourceNotebookCellEdit } from 'vs/workbench/contrib/bulkEdit/browser/bulkCellEdits'; import { INotebookActionContext, INotebookCellActionContext } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { CellEditState, CellFocusMode, expandCellRangesWithHiddenCells, IActiveNotebookEditor, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { cloneNotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { CellEditType, CellKind, ICellEditOperation, ICellReplaceEdit, IOutputDto, ISelectionState, NotebookCellMetadata, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { cellRangeContains, cellRangesToIndexes, ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; @@ -336,7 +336,7 @@ export async function copyCellRange(context: INotebookCellActionContext, directi } } -export async function joinNotebookCells(editor: IActiveNotebookEditor, range: ICellRange, direction: 'above' | 'below', constraint?: CellKind): Promise<{ edits: ResourceEdit[], cell: ICellViewModel, endFocus: ICellRange, endSelections: ICellRange[]; } | null> { +export async function joinNotebookCells(editor: IActiveNotebookEditor, range: ICellRange, direction: 'above' | 'below', constraint?: CellKind): Promise<{ edits: ResourceEdit[]; cell: ICellViewModel; endFocus: ICellRange; endSelections: ICellRange[] } | null> { if (editor.isReadOnly) { return null; } @@ -425,7 +425,7 @@ export async function joinNotebookCells(editor: IActiveNotebookEditor, range: IC export async function joinCellsWithSurrounds(bulkEditService: IBulkEditService, context: INotebookCellActionContext, direction: 'above' | 'below'): Promise { const editor = context.notebookEditor; const textModel = editor.textModel; - const viewModel = editor._getViewModel(); + const viewModel = editor._getViewModel() as NotebookViewModel; let ret: { edits: ResourceEdit[]; cell: ICellViewModel; @@ -583,7 +583,7 @@ export function insertCell( initialText: string = '', ui: boolean = false ) { - const viewModel = editor._getViewModel(); + const viewModel = editor._getViewModel() as NotebookViewModel; const activeKernel = editor.activeKernel; if (viewModel.options.isReadOnly) { return null; diff --git a/src/vs/workbench/contrib/notebook/browser/controller/coreActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/coreActions.ts index d313ef8ac38..9f37653aad0 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/coreActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/coreActions.ts @@ -9,7 +9,8 @@ import { Action2, IAction2Options, MenuId, MenuRegistry } from 'vs/platform/acti import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { getNotebookEditorFromEditorPane, IActiveNotebookEditor, ICellViewModel, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_KERNEL_COUNT, cellRangeToViewCells } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { getNotebookEditorFromEditorPane, IActiveNotebookEditor, ICellViewModel, cellRangeToViewCells } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_KERNEL_COUNT } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { ICellRange, isICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorCommandsContext } from 'vs/workbench/common/editor'; @@ -20,7 +21,6 @@ import { flatten } from 'vs/base/common/arrays'; import { TypeConstraint } from 'vs/base/common/types'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { MarshalledId } from 'vs/base/common/marshalling'; -import { BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; // Kernel Command export const SELECT_KERNEL_ID = '_notebook.selectKernel'; @@ -48,7 +48,6 @@ export const enum CellOverflowToolbarGroups { } export interface INotebookActionContext { - readonly cellTemplate?: BaseCellRenderTemplate; readonly cell?: ICellViewModel; readonly notebookEditor: IActiveNotebookEditor; readonly ui?: boolean; diff --git a/src/vs/workbench/contrib/notebook/browser/controller/editActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/editActions.ts index ed2a9ee28ba..dec1acd7471 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/editActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/editActions.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { localize } from 'vs/nls'; import { MenuId, MenuItemAction, registerAction2 } from 'vs/platform/actions/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -20,7 +20,8 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis import { IQuickInputService, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; import { changeCellToKind, runDeleteAction } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { CellToolbarOrder, CELL_TITLE_CELL_GROUP_ID, CELL_TITLE_OUTPUT_GROUP_ID, executeNotebookCondition, INotebookActionContext, INotebookCellActionContext, NotebookAction, NotebookCellAction, NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { CellEditState, CHANGE_CELL_LANGUAGE, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_HAS_OUTPUTS, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON, QUIT_EDIT_CELL_COMMAND_ID } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_HAS_OUTPUTS, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { CellEditState, CHANGE_CELL_LANGUAGE, QUIT_EDIT_CELL_COMMAND_ID } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import * as icons from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { CellEditType, CellKind, ICellEditOperation, NotebookCellExecutionState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; @@ -213,7 +214,7 @@ registerAction2(class ClearCellOutputsAction extends NotebookCellAction { editor.textModel.applyEdits([{ editType: CellEditType.Output, index, outputs: [] }], true, undefined, () => undefined, undefined); - const runState = notebookExecutionStateService.getCellExecutionState(context.cell.uri)?.state; + const runState = notebookExecutionStateService.getCellExecution(context.cell.uri)?.state; if (runState !== NotebookCellExecutionState.Executing) { context.notebookEditor.textModel.applyEdits([{ editType: CellEditType.PartialInternalMetadata, index, internalMetadata: { @@ -272,7 +273,7 @@ registerAction2(class ClearAllCellOutputsAction extends NotebookAction { })), true, undefined, () => undefined, undefined); const clearExecutionMetadataEdits = editor.textModel.cells.map((cell, index) => { - const runState = notebookExecutionStateService.getCellExecutionState(cell.uri)?.state; + const runState = notebookExecutionStateService.getCellExecution(cell.uri)?.state; if (runState !== NotebookCellExecutionState.Executing) { return { editType: CellEditType.PartialInternalMetadata, index, internalMetadata: { diff --git a/src/vs/workbench/contrib/notebook/browser/controller/executeActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/executeActions.ts index 731a4e4e16f..535a271ba22 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/executeActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/executeActions.ts @@ -6,7 +6,7 @@ import { Iterable } from 'vs/base/common/iterator'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { localize } from 'vs/nls'; import { MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -15,7 +15,8 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService'; import { EditorsOrder } from 'vs/workbench/common/editor'; import { insertCell } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { cellExecutionArgs, CellToolbarOrder, CELL_TITLE_CELL_GROUP_ID, executeNotebookCondition, getContextFromActiveEditor, getContextFromUri, INotebookActionContext, INotebookCellActionContext, INotebookCellToolbarActionContext, INotebookCommandContext, NotebookAction, NotebookCellAction, NotebookMultiCellAction, NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT, parseMultiCellExecutionArgs } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { CellEditState, CellFocusMode, EXECUTE_CELL_COMMAND_ID, NOTEBOOK_CELL_EXECUTING, NOTEBOOK_CELL_EXECUTION_STATE, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_TYPE, NOTEBOOK_HAS_RUNNING_CELL, NOTEBOOK_INTERRUPTIBLE_KERNEL, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_KERNEL_COUNT, NOTEBOOK_MISSING_KERNEL_EXTENSION } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_CELL_EXECUTING, NOTEBOOK_CELL_EXECUTION_STATE, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_TYPE, NOTEBOOK_HAS_RUNNING_CELL, NOTEBOOK_INTERRUPTIBLE_KERNEL, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_KERNEL_COUNT, NOTEBOOK_MISSING_KERNEL_EXTENSION } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { CellEditState, CellFocusMode, EXECUTE_CELL_COMMAND_ID } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import * as icons from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { CellKind, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/fold/folding.ts b/src/vs/workbench/contrib/notebook/browser/controller/foldingController.ts similarity index 90% rename from src/vs/workbench/contrib/notebook/browser/contrib/fold/folding.ts rename to src/vs/workbench/contrib/notebook/browser/controller/foldingController.ts index 2b0cb206c90..a9989ca21d1 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/fold/folding.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/foldingController.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { INotebookEditor, INotebookEditorMouseEvent, INotebookEditorContribution, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR, getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellFoldingState, FoldingModel } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; -import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { INotebookEditor, INotebookEditorMouseEvent, INotebookEditorContribution, getNotebookEditorFromEditorPane, CellFoldingState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { FoldingModel } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { registerNotebookContribution } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; import { registerAction2, Action2 } from 'vs/platform/actions/common/actions'; @@ -18,8 +18,9 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { NOTEBOOK_ACTIONS_CATEGORY } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { localize } from 'vs/nls'; -import { FoldingRegion } from 'vs/editor/contrib/folding/foldingRanges'; +import { FoldingRegion } from 'vs/editor/contrib/folding/browser/foldingRanges'; 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'; @@ -102,7 +103,7 @@ export class FoldingController extends Disposable implements INotebookEditorCont return; } - const vm = this._notebookEditor._getViewModel(); + const vm = this._notebookEditor._getViewModel() as NotebookViewModel; vm.updateFoldingRanges(this._foldingModel.regions); const hiddenRanges = vm.getHiddenRanges(); @@ -118,7 +119,7 @@ export class FoldingController extends Disposable implements INotebookEditorCont return; } - const viewModel = this._notebookEditor._getViewModel(); + const viewModel = this._notebookEditor._getViewModel() as NotebookViewModel; const target = e.event.target as HTMLElement; if (target.classList.contains('codicon-notebook-collapsed') || target.classList.contains('codicon-notebook-expanded')) { @@ -203,7 +204,7 @@ registerAction2(class extends Action2 { }); } - async run(accessor: ServicesAccessor, args?: { index: number, levels: number, direction: 'up' | 'down' }): Promise { + async run(accessor: ServicesAccessor, args?: { index: number; levels: number; direction: 'up' | 'down' }): Promise { const editorService = accessor.get(IEditorService); const editor = getNotebookEditorFromEditorPane(editorService.activeEditorPane); @@ -273,7 +274,7 @@ registerAction2(class extends Action2 { }); } - async run(accessor: ServicesAccessor, args?: { index: number, levels: number, direction: 'up' | 'down' }): Promise { + async run(accessor: ServicesAccessor, args?: { index: number; levels: number; direction: 'up' | 'down' }): Promise { const editorService = accessor.get(IEditorService); const editor = getNotebookEditorFromEditorPane(editorService.activeEditorPane); diff --git a/src/vs/workbench/contrib/notebook/browser/controller/insertCellActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/insertCellActions.ts index 78ab8fc2ab3..79d40142457 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/insertCellActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/insertCellActions.ts @@ -5,7 +5,7 @@ import { Codicon } from 'vs/base/common/codicons'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { localize } from 'vs/nls'; import { IAction2Options, MenuId, MenuRegistry, registerAction2 } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -14,8 +14,8 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { insertCell } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { INotebookActionContext, NotebookAction } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_EDITOR_EDITABLE } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_EDITOR_EDITABLE } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; +import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { CellKind, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; const INSERT_CODE_CELL_ABOVE_COMMAND_ID = 'notebook.cell.insertCodeCellAbove'; diff --git a/src/vs/workbench/contrib/notebook/browser/controller/layoutActions.ts b/src/vs/workbench/contrib/notebook/browser/controller/layoutActions.ts index 9e16c29d0e4..27ce6ca5434 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/layoutActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/layoutActions.ts @@ -12,7 +12,7 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { NOTEBOOK_ACTIONS_CATEGORY } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; diff --git a/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts b/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts index 0aeee5b053d..4f58d8bd162 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts @@ -8,12 +8,12 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { DiffElementViewModelBase, getFormatedMetadataJSON, getFormatedOutputJSON, OUTPUT_EDITOR_HEIGHT_MAGIC, PropertyFoldingState, SideBySideDiffElementViewModel, SingleSideDiffElementViewModel } from 'vs/workbench/contrib/notebook/browser/diff/diffElementViewModel'; +import { DiffElementViewModelBase, getFormattedMetadataJSON, getFormattedOutputJSON, OUTPUT_EDITOR_HEIGHT_MAGIC, PropertyFoldingState, SideBySideDiffElementViewModel, SingleSideDiffElementViewModel } from 'vs/workbench/contrib/notebook/browser/diff/diffElementViewModel'; import { CellDiffSideBySideRenderTemplate, CellDiffSingleSideRenderTemplate, DiffSide, DIFF_CELL_MARGIN, INotebookTextDiffEditor, NOTEBOOK_DIFF_CELL_INPUT, NOTEBOOK_DIFF_CELL_PROPERTY, NOTEBOOK_DIFF_CELL_PROPERTY_EXPANDED } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser'; import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { CellEditType, CellUri, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; @@ -27,9 +27,9 @@ import { CodiconActionViewItem } from 'vs/workbench/contrib/notebook/browser/vie import { collapsedIcon, expandedIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { OutputContainer } from 'vs/workbench/contrib/notebook/browser/diff/diffElementOutputs'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; -import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { AccessibilityHelpController } from 'vs/workbench/contrib/codeEditor/browser/accessibility/accessibility'; import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; @@ -578,7 +578,7 @@ abstract class AbstractElementRenderer extends Disposable { return; } - const modifiedMetadataSource = getFormatedMetadataJSON(this.notebookEditor.textModel!, this.cell.modified?.metadata || {}, this.cell.modified?.language); + const modifiedMetadataSource = getFormattedMetadataJSON(this.notebookEditor.textModel!, this.cell.modified?.metadata || {}, this.cell.modified?.language); modifiedMetadataModel.object.textEditorModel.setValue(modifiedMetadataSource); })); @@ -597,7 +597,7 @@ abstract class AbstractElementRenderer extends Disposable { this._metadataEditorDisposeStore.add(this._metadataEditor); const mode = this.languageService.createById('jsonc'); - const originalMetadataSource = getFormatedMetadataJSON(this.notebookEditor.textModel!, + const originalMetadataSource = getFormattedMetadataJSON(this.notebookEditor.textModel!, this.cell.type === 'insert' ? this.cell.modified!.metadata || {} : this.cell.original!.metadata || {}); @@ -627,8 +627,8 @@ abstract class AbstractElementRenderer extends Disposable { this._outputEditorDisposeStore.clear(); if ((this.cell.type === 'modified' || this.cell.type === 'unchanged') && !this.notebookEditor.textModel!.transientOptions.transientOutputs) { - const originalOutputsSource = getFormatedOutputJSON(this.cell.original?.outputs || []); - const modifiedOutputsSource = getFormatedOutputJSON(this.cell.modified?.outputs || []); + const originalOutputsSource = getFormattedOutputJSON(this.cell.original?.outputs || []); + const modifiedOutputsSource = getFormattedOutputJSON(this.cell.modified?.outputs || []); if (originalOutputsSource !== modifiedOutputsSource) { const mode = this.languageService.createById('json'); const originalModel = this.modelService.createModel(originalOutputsSource, mode, undefined, true); @@ -671,7 +671,7 @@ abstract class AbstractElementRenderer extends Disposable { })); this._outputEditorDisposeStore.add(this.cell.modified!.textModel.onDidChangeOutputs(() => { - const modifiedOutputsSource = getFormatedOutputJSON(this.cell.modified?.outputs || []); + const modifiedOutputsSource = getFormattedOutputJSON(this.cell.modified?.outputs || []); modifiedModel.setValue(modifiedOutputsSource); this._outputHeader.refresh(); })); @@ -691,7 +691,7 @@ abstract class AbstractElementRenderer extends Disposable { this._outputEditorDisposeStore.add(this._outputEditor); const mode = this.languageService.createById('json'); - const originaloutputSource = getFormatedOutputJSON( + const originaloutputSource = getFormattedOutputJSON( this.notebookEditor.textModel!.transientOptions.transientOutputs ? [] : this.cell.type === 'insert' diff --git a/src/vs/workbench/contrib/notebook/browser/diff/diffElementViewModel.ts b/src/vs/workbench/contrib/notebook/browser/diff/diffElementViewModel.ts index 4b5a49e1ea1..2c65e2d5ffd 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/diffElementViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/diffElementViewModel.ts @@ -6,7 +6,7 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { CellDiffViewModelLayoutChangeEvent, DiffSide, DIFF_CELL_MARGIN, IDiffElementLayoutInfo } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser'; -import { CellLayoutState, IGenericCellViewModel, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellLayoutState, IGenericCellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { hash } from 'vs/base/common/hash'; @@ -16,6 +16,7 @@ import { DiffNestedCellViewModel } from 'vs/workbench/contrib/notebook/browser/d import { URI } from 'vs/base/common/uri'; import { NotebookDiffEditorEventDispatcher, NotebookDiffViewEventType } from 'vs/workbench/contrib/notebook/browser/diff/eventDispatcher'; import * as editorCommon from 'vs/editor/common/editorCommon'; +import { NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; export enum PropertyFoldingState { Expanded, @@ -35,7 +36,7 @@ export abstract class DiffElementViewModelBase extends Disposable { public outputFoldingState: PropertyFoldingState; protected _layoutInfoEmitter = this._register(new Emitter()); onDidLayoutChange = this._layoutInfoEmitter.event; - protected _stateChangeEmitter = this._register(new Emitter<{ renderOutput: boolean; }>()); + protected _stateChangeEmitter = this._register(new Emitter<{ renderOutput: boolean }>()); onDidStateChange = this._stateChangeEmitter.event; protected _layoutInfo!: IDiffElementLayoutInfo; @@ -114,8 +115,8 @@ export abstract class DiffElementViewModelBase extends Disposable { readonly type: 'unchanged' | 'insert' | 'delete' | 'modified', readonly editorEventDispatcher: NotebookDiffEditorEventDispatcher, readonly initData: { - metadataStatusHeight: number, - outputStatusHeight: number + metadataStatusHeight: number; + outputStatusHeight: number; } ) { super(); @@ -273,8 +274,8 @@ export abstract class DiffElementViewModelBase extends Disposable { this.editorEventDispatcher.emit([{ type: NotebookDiffViewEventType.CellLayoutChanged, source: this._layoutInfo }]); } - abstract checkIfOutputsModified(): false | { reason: string | undefined; }; - abstract checkMetadataIfModified(): false | { reason: string | undefined; }; + abstract checkIfOutputsModified(): false | { reason: string | undefined }; + abstract checkMetadataIfModified(): false | { reason: string | undefined }; abstract isOutputEmpty(): boolean; abstract getRichOutputTotalHeight(): number; abstract getCellByUri(cellUri: URI): IGenericCellViewModel; @@ -337,8 +338,8 @@ export class SideBySideDiffElementViewModel extends DiffElementViewModelBase { type: 'unchanged' | 'modified', editorEventDispatcher: NotebookDiffEditorEventDispatcher, initData: { - metadataStatusHeight: number, - outputStatusHeight: number + metadataStatusHeight: number; + outputStatusHeight: number; } ) { super( @@ -390,7 +391,7 @@ export class SideBySideDiffElementViewModel extends DiffElementViewModelBase { } checkMetadataIfModified() { - const modified = hash(getFormatedMetadataJSON(this.mainDocumentTextModel, this.original?.metadata || {}, this.original?.language)) !== hash(getFormatedMetadataJSON(this.mainDocumentTextModel, this.modified?.metadata ?? {}, this.modified?.language)); + const modified = hash(getFormattedMetadataJSON(this.mainDocumentTextModel, this.original?.metadata || {}, this.original?.language)) !== hash(getFormattedMetadataJSON(this.mainDocumentTextModel, this.modified?.metadata ?? {}, this.modified?.language)); if (modified) { return { reason: undefined }; } else { @@ -488,8 +489,8 @@ export class SingleSideDiffElementViewModel extends DiffElementViewModelBase { type: 'insert' | 'delete', editorEventDispatcher: NotebookDiffEditorEventDispatcher, initData: { - metadataStatusHeight: number, - outputStatusHeight: number + metadataStatusHeight: number; + outputStatusHeight: number; } ) { super(mainDocumentTextModel, original, modified, type, editorEventDispatcher, initData); @@ -599,7 +600,7 @@ function outputsEqual(original: ICellOutput[], modified: ICellOutput[]) { return OutputComparison.Unchanged; } -export function getFormatedMetadataJSON(documentTextModel: NotebookTextModel, metadata: NotebookCellMetadata, language?: string) { +export function getFormattedMetadataJSON(documentTextModel: NotebookTextModel, metadata: NotebookCellMetadata, language?: string) { let filteredMetadata: { [key: string]: any } = {}; if (documentTextModel) { @@ -642,7 +643,7 @@ export function getStreamOutputData(outputs: IOutputItemDto[]) { } } -export function getFormatedOutputJSON(outputs: IOutputDto[]) { +export function getFormattedOutputJSON(outputs: IOutputDto[]) { if (outputs.length === 1) { const streamOutputData = getStreamOutputData(outputs[0].outputs); if (streamOutputData) { diff --git a/src/vs/workbench/contrib/notebook/browser/diff/diffNestedCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/diff/diffNestedCellViewModel.ts index 771b9a3c060..3e85f092688 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/diffNestedCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/diffNestedCellViewModel.ts @@ -6,9 +6,10 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { generateUuid } from 'vs/base/common/uuid'; -import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; +import { PrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; import { IDiffNestedCellViewModel } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser'; -import { CellViewModelStateChangeEvent, ICellOutputViewModel, IGenericCellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellOutputViewModel, IGenericCellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { CellOutputViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; diff --git a/src/vs/workbench/contrib/notebook/browser/diff/eventDispatcher.ts b/src/vs/workbench/contrib/notebook/browser/diff/eventDispatcher.ts index d685d34cf06..d3a2096911a 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/eventDispatcher.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/eventDispatcher.ts @@ -6,7 +6,7 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { IDiffElementLayoutInfo } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser'; -import { NotebookLayoutChangeEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NotebookLayoutChangeEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; export enum NotebookDiffViewEventType { LayoutChanged = 1, diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffActions.ts b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffActions.ts index b50df9574a8..16da206f49f 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffActions.ts @@ -9,7 +9,7 @@ import { Action2, ICommandActionTitle, MenuId, registerAction2 } from 'vs/platfo import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { ActiveEditorContext } from 'vs/workbench/common/editor'; +import { ActiveEditorContext } from 'vs/workbench/common/contextkeys'; import { columnToEditorGroup } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { DiffElementViewModelBase } from 'vs/workbench/contrib/notebook/browser/diff/diffElementViewModel'; import { NOTEBOOK_DIFF_CELL_INPUT, NOTEBOOK_DIFF_CELL_PROPERTY, NOTEBOOK_DIFF_CELL_PROPERTY_EXPANDED } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser'; @@ -77,7 +77,7 @@ registerAction2(class extends Action2 { } ); } - run(accessor: ServicesAccessor, context?: { cell: DiffElementViewModelBase; }) { + run(accessor: ServicesAccessor, context?: { cell: DiffElementViewModelBase }) { if (!context) { return; } @@ -132,7 +132,7 @@ registerAction2(class extends Action2 { } ); } - run(accessor: ServicesAccessor, context?: { cell: DiffElementViewModelBase; }) { + run(accessor: ServicesAccessor, context?: { cell: DiffElementViewModelBase }) { if (!context) { return; } @@ -157,7 +157,7 @@ registerAction2(class extends Action2 { } ); } - run(accessor: ServicesAccessor, context?: { cell: DiffElementViewModelBase; }) { + run(accessor: ServicesAccessor, context?: { cell: DiffElementViewModelBase }) { if (!context) { return; } @@ -191,7 +191,7 @@ registerAction2(class extends Action2 { } ); } - run(accessor: ServicesAccessor, context?: { cell: DiffElementViewModelBase; }) { + run(accessor: ServicesAccessor, context?: { cell: DiffElementViewModelBase }) { if (!context) { return; } @@ -214,7 +214,7 @@ class ToggleRenderAction extends Action2 { constructor(id: string, title: string | ICommandActionTitle, precondition: ContextKeyExpression | undefined, toggled: ContextKeyExpression | undefined, order: number, private readonly toggleOutputs?: boolean, private readonly toggleMetadata?: boolean) { super({ id: id, - title: title, + title, precondition: precondition, menu: [{ id: MenuId.EditorTitle, diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser.ts b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser.ts index 02ad448cb64..252a5438ecc 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CellLayoutState, ICellOutputViewModel, ICommonCellInfo, IGenericCellViewModel, IInsetRenderOutput, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellLayoutState, ICellOutputViewModel, ICommonCellInfo, IGenericCellViewModel, IInsetRenderOutput } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { DiffElementViewModelBase } from 'vs/workbench/contrib/notebook/browser/diff/diffElementViewModel'; import { Event } from 'vs/base/common/event'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; @@ -16,6 +16,7 @@ import { OutputRenderer } from 'vs/workbench/contrib/notebook/browser/view/outpu import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/common/notebookOptions'; +import { NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; export enum DiffSide { Original = 0, @@ -29,8 +30,8 @@ export interface IDiffCellInfo extends ICommonCellInfo { export interface INotebookTextDiffEditor { notebookOptions: NotebookOptions; readonly textModel?: NotebookTextModel; - onMouseUp: Event<{ readonly event: MouseEvent; readonly target: DiffElementViewModelBase; }>; - onDidDynamicOutputRendered: Event<{ cell: IGenericCellViewModel, output: ICellOutputViewModel }>; + onMouseUp: Event<{ readonly event: MouseEvent; readonly target: DiffElementViewModelBase }>; + onDidDynamicOutputRendered: Event<{ cell: IGenericCellViewModel; output: ICellOutputViewModel }>; getOverflowContainerDomNode(): HTMLElement; getLayoutInfo(): NotebookLayoutInfo; layoutNotebookCell(cell: DiffElementViewModelBase, height: number): void; diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts b/src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts index 1da86dbe6af..569bfdc9477 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts @@ -23,12 +23,12 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IEditorOptions as ICodeEditorOptions } from 'vs/editor/common/config/editorOptions'; import { BareFontInfo, FontInfo } from 'vs/editor/common/config/fontInfo'; import { PixelRatio } from 'vs/base/browser/browser'; -import { CellEditState, ICellOutputViewModel, IDisplayOutputLayoutUpdateRequest, IGenericCellViewModel, IInsetRenderOutput, INotebookEditorCreationOptions, INotebookEditorOptions, NotebookLayoutInfo, NOTEBOOK_DIFF_EDITOR_ID } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, ICellOutputViewModel, IDisplayOutputLayoutUpdateRequest, IGenericCellViewModel, IInsetRenderOutput, INotebookEditorCreationOptions, INotebookEditorOptions } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { DiffSide, DIFF_CELL_MARGIN, IDiffCellInfo, INotebookTextDiffEditor } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; -import { CellUri, INotebookDiffEditorModel, INotebookDiffResult } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellUri, INotebookDiffEditorModel, INotebookDiffResult, NOTEBOOK_DIFF_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { URI } from 'vs/base/common/uri'; import { IDiffChange, IDiffResult } from 'vs/base/common/diff/diff'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; @@ -42,6 +42,7 @@ import { NotebookDiffEditorEventDispatcher, NotebookDiffLayoutChangedEvent } fro import { FontMeasurements } from 'vs/editor/browser/config/fontMeasurements'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/common/notebookOptions'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; const $ = DOM.$; @@ -59,7 +60,7 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD private _webviewTransparentCover: HTMLElement | null = null; private _fontInfo: FontInfo | undefined; - private readonly _onMouseUp = this._register(new Emitter<{ readonly event: MouseEvent; readonly target: DiffElementViewModelBase; }>()); + private readonly _onMouseUp = this._register(new Emitter<{ readonly event: MouseEvent; readonly target: DiffElementViewModelBase }>()); public readonly onMouseUp = this._onMouseUp.event; private _eventDispatcher: NotebookDiffEditorEventDispatcher | undefined; protected _scopeContextKeyService!: IContextKeyService; @@ -74,7 +75,7 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD private _revealFirst: boolean; private readonly _insetModifyQueueByOutputId = new SequencerByKey(); - protected _onDidDynamicOutputRendered = this._register(new Emitter<{ cell: IGenericCellViewModel, output: ICellOutputViewModel; }>()); + protected _onDidDynamicOutputRendered = this._register(new Emitter<{ cell: IGenericCellViewModel; output: ICellOutputViewModel }>()); onDidDynamicOutputRendered = this._onDidDynamicOutputRendered.event; private _notebookOptions: NotebookOptions; @@ -146,10 +147,10 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD setMarkupCellEditState(cellId: string, editState: CellEditState): void { // throw new Error('Method not implemented.'); } - didStartDragMarkupCell(cellId: string, event: { dragOffsetY: number; }): void { + didStartDragMarkupCell(cellId: string, event: { dragOffsetY: number }): void { // throw new Error('Method not implemented.'); } - didDragMarkupCell(cellId: string, event: { dragOffsetY: number; }): void { + didDragMarkupCell(cellId: string, event: { dragOffsetY: number }): void { // throw new Error('Method not implemented.'); } didEndDragMarkupCell(cellId: string): void { @@ -568,8 +569,8 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD } static computeModifiedLCS(instantiationService: IInstantiationService, change: IDiffChange, originalModel: NotebookTextModel, modifiedModel: NotebookTextModel, eventDispatcher: NotebookDiffEditorEventDispatcher, initData: { - metadataStatusHeight: number, - outputStatusHeight: number + metadataStatusHeight: number; + outputStatusHeight: number; }) { const result: DiffElementViewModelBase[] = []; // modified cells diff --git a/src/vs/workbench/contrib/notebook/browser/docs/notebook.layout.md b/src/vs/workbench/contrib/notebook/browser/docs/notebook.layout.md index 21d3e1c6627..d03ffb2a2c2 100644 --- a/src/vs/workbench/contrib/notebook/browser/docs/notebook.layout.md +++ b/src/vs/workbench/contrib/notebook/browser/docs/notebook.layout.md @@ -20,7 +20,7 @@ The notebook editor is a virtualized list view rendered in two contexts (mainfra The notebook model resolution consists of two main parts * Resolving the raw data (bytes) of the resource from file service. This part is backed by the `WorkingCopyService` and it will resolve the data and broadcast updates when the resource is updated on file system. -* Requesting the contributed notebook serializer to serialize/deserize the raw bytes for the resource. We will find the best matched notebook serializer (by user's editor type configuration and serializer's selector defintion) and convert the raw bytes from/to `NotebookTextModel`. +* Requesting the contributed notebook serializer to serialize/deserize the raw bytes for the resource. We will find the best matched notebook serializer (by user's editor type configuration and serializer's selector definition) and convert the raw bytes from/to `NotebookTextModel`. `NotebookTextModel` is the only source of truth for the notebook document once the resource is opened in the workspace. The source text of each individual cell in the notebook is backed by a piece tree text buffer. When the notebook is opened in the editor group, we will request the `TextModelResolverService` for the monaco `TextModel` reference for each cell. The `TextModel` will use the piece tree text buffer from the cell as the backing store so whenever the `TextModel` gets updated, the cells in `NotebookTextModel` are always up to date.`` diff --git a/src/vs/workbench/contrib/notebook/browser/extensionPoint.ts b/src/vs/workbench/contrib/notebook/browser/extensionPoint.ts index 3e827183b54..b48922916a0 100644 --- a/src/vs/workbench/contrib/notebook/browser/extensionPoint.ts +++ b/src/vs/workbench/contrib/notebook/browser/extensionPoint.ts @@ -18,7 +18,7 @@ namespace NotebookEditorContribution { export interface INotebookEditorContribution { readonly [NotebookEditorContribution.type]: string; readonly [NotebookEditorContribution.displayName]: string; - readonly [NotebookEditorContribution.selector]?: readonly { filenamePattern?: string; excludeFileNamePattern?: string; }[]; + readonly [NotebookEditorContribution.selector]?: readonly { filenamePattern?: string; excludeFileNamePattern?: string }[]; readonly [NotebookEditorContribution.priority]?: string; } diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebook.css b/src/vs/workbench/contrib/notebook/browser/media/notebook.css index 7d344798029..bb1a7ad2dca 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebook.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebook.css @@ -402,6 +402,18 @@ width: 16px; } +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-expand-part-button { + position: relative; + left: 0px; + padding: 2px; + border-radius: 5px; + vertical-align: middle; + margin-left: 4px; + height: 16px; + width: 16px; + z-index: var(--z-index-notebook-cell-expand-part-button); +} + .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .output-collapse-container .expandOutputIcon:before { color: grey; font-size: 12px; @@ -409,13 +421,20 @@ vertical-align: bottom; } +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-expand-part-button:before { + color: grey; + font-size: 12px; + line-height: 16px; + vertical-align: bottom; +} + .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .input-collapsed .notebook-folding-indicator { display: none; } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .notebook-folding-indicator.mouseover .codicon.codicon-notebook-expanded { opacity: 0; - transition: opacity 0.s; + transition: opacity 0.1 s; } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .markdown-cell-hover .notebook-folding-indicator.mouseover .codicon.codicon-notebook-expanded { @@ -461,6 +480,10 @@ z-index: var(--z-index-notebook-cell-toolbar); } +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-toolbar-dropdown-active .cell-title-toolbar { + z-index: var(--z-index-notebook-cell-toolbar-dropdown-active); +} + .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-title-toolbar .action-item.menu-entry { width: 24px; height: 24px; @@ -851,6 +874,18 @@ padding: 4px 4px 4px 4px; } +.monaco-workbench .notebookOverlay>.cell-list-container .notebook-folded-hint { + position: absolute; + user-select: none; +} + +.monaco-workbench .notebookOverlay > .cell-list-container .notebook-folded-hint-label { + font-size: var(--notebook-cell-output-font-size); + font-family: var(--monaco-monospace-font); + font-style: italic; + opacity: 0.7; +} + /** Theming */ .monaco-action-bar .action-item.verticalSeparator { diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index f62e5be147b..70cc931dfd0 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Schemas } from 'vs/base/common/network'; -import { IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { IDisposable, Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { parse } from 'vs/base/common/marshalling'; import { isEqual } from 'vs/base/common/resources'; import { assertType } from 'vs/base/common/types'; @@ -12,7 +12,7 @@ import { URI } from 'vs/base/common/uri'; import { toFormattedString } from 'vs/base/common/jsonFormatter'; import { ITextModel, ITextBufferFactory, DefaultEndOfLine, ITextBuffer } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageSelection, ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageSelection, ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import * as nls from 'vs/nls'; import { Extensions, IConfigurationPropertySchema, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; @@ -44,7 +44,7 @@ import { NotebookEditorWidgetService } from 'vs/workbench/contrib/notebook/brows import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import { Event } from 'vs/base/common/event'; -import { getFormatedMetadataJSON, getStreamOutputData } from 'vs/workbench/contrib/notebook/browser/diff/diffElementViewModel'; +import { getFormattedMetadataJSON, getStreamOutputData } from 'vs/workbench/contrib/notebook/browser/diff/diffElementViewModel'; import { NotebookModelResolverServiceImpl } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl'; import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { NotebookKernelService } from 'vs/workbench/contrib/notebook/browser/notebookKernelServiceImpl'; @@ -66,11 +66,11 @@ import 'vs/workbench/contrib/notebook/browser/controller/executeActions'; import 'vs/workbench/contrib/notebook/browser/controller/layoutActions'; import 'vs/workbench/contrib/notebook/browser/controller/editActions'; import 'vs/workbench/contrib/notebook/browser/controller/apiActions'; +import 'vs/workbench/contrib/notebook/browser/controller/foldingController'; // Editor Contribution import 'vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard'; import 'vs/workbench/contrib/notebook/browser/contrib/find/findController'; -import 'vs/workbench/contrib/notebook/browser/contrib/fold/folding'; import 'vs/workbench/contrib/notebook/browser/contrib/format/formatting'; import 'vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted'; import 'vs/workbench/contrib/notebook/browser/contrib/layout/layoutActions'; @@ -89,6 +89,7 @@ import 'vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout'; import 'vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer'; import 'vs/workbench/contrib/notebook/browser/contrib/breakpoints/notebookBreakpoints'; import 'vs/workbench/contrib/notebook/browser/contrib/execute/executionEditorProgress'; +import 'vs/workbench/contrib/notebook/browser/contrib/execute/execution'; // Diff Editor Contribution import 'vs/workbench/contrib/notebook/browser/diff/notebookDiffActions'; @@ -147,7 +148,7 @@ class NotebookDiffEditorSerializer implements IEditorSerializer { } deserialize(instantiationService: IInstantiationService, raw: string) { - type Data = { resource: URI, originalResource: URI, name: string, originalName: string, viewType: string, textDiffName: string | undefined, group: number; }; + type Data = { resource: URI; originalResource: URI; name: string; originalName: string; viewType: string; textDiffName: string | undefined; group: number }; const data = parse(raw); if (!data) { return undefined; @@ -166,7 +167,7 @@ class NotebookDiffEditorSerializer implements IEditorSerializer { } } -type SerializedNotebookEditorData = { resource: URI, viewType: string, options?: NotebookEditorInputOptions }; +type SerializedNotebookEditorData = { resource: URI; viewType: string; options?: NotebookEditorInputOptions }; class NotebookEditorSerializer implements IEditorSerializer { canSerialize(): boolean { return true; @@ -335,7 +336,7 @@ class CellInfoContentProvider { } dispose(): void { - this._disposables.forEach(d => d.dispose()); + dispose(this._disposables); } async provideMetadataTextContent(resource: URI): Promise { @@ -356,7 +357,7 @@ class CellInfoContentProvider { for (const cell of ref.object.notebook.cells) { if (cell.handle === data.handle) { - const metadataSource = getFormatedMetadataJSON(ref.object.notebook, cell.metadata, cell.language); + const metadataSource = getFormattedMetadataJSON(ref.object.notebook, cell.metadata, cell.language); result = this._modelService.createModel( metadataSource, mode, @@ -376,7 +377,7 @@ class CellInfoContentProvider { return result; } - private parseStreamOutput(op?: ICellOutput): { content: string, mode: ILanguageSelection } | undefined { + private parseStreamOutput(op?: ICellOutput): { content: string; mode: ILanguageSelection } | undefined { if (!op) { return; } @@ -397,7 +398,7 @@ class CellInfoContentProvider { handle: number; outputId?: string | undefined; }, cell: NotebookCellTextModel) { - let result: { content: string, mode: ILanguageSelection } | undefined = undefined; + let result: { content: string; mode: ILanguageSelection } | undefined = undefined; const mode = this._languageService.createById('json'); const op = cell.outputs.find(op => op.outputId === data.outputId); @@ -635,7 +636,7 @@ registerSingleton(INotebookRendererMessagingService, NotebookRendererMessagingSe registerSingleton(INotebookKeymapService, NotebookKeymapService, true); const schemas: IJSONSchemaMap = {}; -function isConfigurationPropertySchema(x: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema; }): x is IConfigurationPropertySchema { +function isConfigurationPropertySchema(x: IConfigurationPropertySchema | { [path: string]: IConfigurationPropertySchema }): x is IConfigurationPropertySchema { return (typeof x.type !== 'undefined' || typeof x.anyOf !== 'undefined'); } for (const editorOption of editorOptionsRegistry) { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index 40239ceea31..0dfbfe59548 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -8,70 +8,25 @@ import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IEditorContributionDescription } from 'vs/editor/browser/editorExtensions'; +import * as editorCommon from 'vs/editor/common/editorCommon'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { IPosition } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { FindMatch, IModelDeltaDecoration, IReadonlyTextBuffer, ITextModel } from 'vs/editor/common/model'; +import { FindMatch, IModelDeltaDecoration, IReadonlyTextBuffer, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { MenuId } from 'vs/platform/actions/common/actions'; -import { ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ITextEditorOptions, ITextResourceEditorInput } from 'vs/platform/editor/common/editor'; -import { IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; +import { IConstructorSignature } from 'vs/platform/instantiation/common/instantiation'; import { IEditorPane } from 'vs/workbench/common/editor'; -import { OutputRenderer } from 'vs/workbench/contrib/notebook/browser/view/output/outputRenderer'; -import { INotebookWebviewMessage } from 'vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView'; -import { CellViewModel, IModelDecorationsChangeAccessor, INotebookEditorViewState, INotebookViewCellsUpdateEvent, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { CellViewModelStateChangeEvent, NotebookCellStateChangedEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { CellKind, ICellOutput, INotebookCellStatusBarItem, INotebookRendererInfo, INotebookSearchOptions, IOrderedMimeType, NotebookCellInternalMetadata, NotebookCellMetadata, NotebookDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, ICellOutput, INotebookCellStatusBarItem, INotebookRendererInfo, INotebookSearchOptions, IOrderedMimeType, IOutputItemDto, NotebookCellInternalMetadata, NotebookCellMetadata, NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { isCompositeNotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; import { INotebookKernel } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/common/notebookOptions'; import { cellRangesToIndexes, ICellRange, reduceCellRanges } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { IWebview } from 'vs/workbench/contrib/webview/browser/webview'; -export const NOTEBOOK_EDITOR_ID = 'workbench.editor.notebook'; -export const NOTEBOOK_DIFF_EDITOR_ID = 'workbench.editor.notebookTextDiffEditor'; - -//#region Context Keys -export const HAS_OPENED_NOTEBOOK = new RawContextKey('userHasOpenedNotebook', false); -export const KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED = new RawContextKey('notebookFindWidgetFocused', false); - -// Is Notebook -export const NOTEBOOK_IS_ACTIVE_EDITOR = ContextKeyExpr.equals('activeEditor', NOTEBOOK_EDITOR_ID); - -// Editor keys -export const NOTEBOOK_EDITOR_FOCUSED = new RawContextKey('notebookEditorFocused', false); -export const NOTEBOOK_CELL_LIST_FOCUSED = new RawContextKey('notebookCellListFocused', false); -export const NOTEBOOK_OUTPUT_FOCUSED = new RawContextKey('notebookOutputFocused', false); -export const NOTEBOOK_EDITOR_EDITABLE = new RawContextKey('notebookEditable', true); -export const NOTEBOOK_HAS_RUNNING_CELL = new RawContextKey('notebookHasRunningCell', false); -export const NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON = new RawContextKey('notebookUseConsolidatedOutputButton', false); -export const NOTEBOOK_BREAKPOINT_MARGIN_ACTIVE = new RawContextKey('notebookBreakpointMargin', false); -export const NOTEBOOK_CELL_TOOLBAR_LOCATION = new RawContextKey<'left' | 'right' | 'hidden'>('notebookCellToolbarLocation', 'left'); - -// Cell keys -export const NOTEBOOK_VIEW_TYPE = new RawContextKey('notebookType', undefined); -export const NOTEBOOK_CELL_TYPE = new RawContextKey<'code' | 'markup'>('notebookCellType', undefined); -export const NOTEBOOK_CELL_EDITABLE = new RawContextKey('notebookCellEditable', false); -export const NOTEBOOK_CELL_FOCUSED = new RawContextKey('notebookCellFocused', false); -export const NOTEBOOK_CELL_EDITOR_FOCUSED = new RawContextKey('notebookCellEditorFocused', false); -export const NOTEBOOK_CELL_MARKDOWN_EDIT_MODE = new RawContextKey('notebookCellMarkdownEditMode', false); -export const NOTEBOOK_CELL_LINE_NUMBERS = new RawContextKey<'on' | 'off' | 'inherit'>('notebookCellLineNumbers', 'inherit'); -export type NotebookCellExecutionStateContext = 'idle' | 'pending' | 'executing' | 'succeeded' | 'failed'; -export const NOTEBOOK_CELL_EXECUTION_STATE = new RawContextKey('notebookCellExecutionState', undefined); -export const NOTEBOOK_CELL_EXECUTING = new RawContextKey('notebookCellExecuting', false); // This only exists to simplify a context key expression, see #129625 -export const NOTEBOOK_CELL_HAS_OUTPUTS = new RawContextKey('notebookCellHasOutputs', false); -export const NOTEBOOK_CELL_INPUT_COLLAPSED = new RawContextKey('notebookCellInputIsCollapsed', false); -export const NOTEBOOK_CELL_OUTPUT_COLLAPSED = new RawContextKey('notebookCellOutputIsCollapsed', false); -// Kernels -export const NOTEBOOK_KERNEL_COUNT = new RawContextKey('notebookKernelCount', 0); -export const NOTEBOOK_KERNEL_SELECTED = new RawContextKey('notebookKernelSelected', false); -export const NOTEBOOK_INTERRUPTIBLE_KERNEL = new RawContextKey('notebookInterruptibleKernel', false); -export const NOTEBOOK_MISSING_KERNEL_EXTENSION = new RawContextKey('notebookMissingKernelExtension', false); -export const NOTEBOOK_HAS_OUTPUTS = new RawContextKey('notebookHasOutputs', false); - -//#endregion - //#region Shared commands export const EXPAND_CELL_INPUT_COMMAND_ID = 'notebook.cell.expandCellInput'; export const EXECUTE_CELL_COMMAND_ID = 'notebook.cell.execute'; @@ -125,6 +80,27 @@ export interface IRenderOutputViaExtension { export type IInsetRenderOutput = IRenderPlainHtmlOutput | IRenderOutputViaExtension; export type IRenderOutput = IRenderMainframeOutput | IInsetRenderOutput; +export interface IOutputTransformContribution { + getType(): RenderOutputType; + getMimetypes(): string[]; + /** + * Dispose this contribution. + */ + dispose(): void; + + /** + * Returns contents to place in the webview inset, or the {@link IRenderNoOutput}. + * This call is allowed to have side effects, such as placing output + * directly into the container element. + */ + render(output: ICellOutputViewModel, item: IOutputItemDto, container: HTMLElement, notebookUri: URI): IRenderOutput; +} + +export interface IOutputRenderer { + render(viewModel: ICellOutputViewModel, container: HTMLElement, preferredMimeType: string | undefined, notebookUri: URI): IRenderOutput; + getContribution(preferredMimeType: string): IOutputTransformContribution | undefined; +} + export interface ICellOutputViewModel extends IDisposable { cellViewModel: IGenericCellViewModel; /** @@ -185,18 +161,6 @@ export interface IFocusNotebookCellOptions { //#endregion -export interface NotebookLayoutInfo { - width: number; - height: number; - fontInfo: FontInfo; -} - -export interface NotebookLayoutChangeEvent { - width?: boolean; - height?: boolean; - fontInfo?: boolean; -} - export enum CellLayoutState { Uninitialized, Estimated, @@ -237,6 +201,11 @@ export interface MarkdownCellLayoutInfo { readonly bottomToolbarOffset: number; readonly totalHeight: number; readonly layoutState: CellLayoutState; + readonly foldHintHeight: number; +} + +export enum CellLayoutContext { + Fold } export interface MarkdownCellLayoutChangeEvent { @@ -245,16 +214,22 @@ export interface MarkdownCellLayoutChangeEvent { editorHeight?: number; previewHeight?: number; totalHeight?: number; + context?: CellLayoutContext; } +export interface ICommonCellViewModelLayoutChangeInfo { + totalHeight?: boolean | number; + outerWidth?: number; + context?: CellLayoutContext; +} export interface ICellViewModel extends IGenericCellViewModel { readonly model: NotebookCellTextModel; readonly id: string; readonly textBuffer: IReadonlyTextBuffer; - readonly layoutInfo: { totalHeight: number; bottomToolbarOffset: number; editorWidth: number; }; - readonly onDidChangeLayout: Event<{ totalHeight?: boolean | number; outerWidth?: number; }>; + readonly layoutInfo: { totalHeight: number; bottomToolbarOffset: number; editorWidth: number }; + readonly onDidChangeLayout: Event; readonly onDidChangeCellStatusBarItems: Event; - readonly onCellDecorationsChanged: Event<{ added: INotebookCellDecorationOptions[], removed: INotebookCellDecorationOptions[] }>; + readonly onCellDecorationsChanged: Event<{ added: INotebookCellDecorationOptions[]; removed: INotebookCellDecorationOptions[] }>; readonly onDidChangeState: Event; readonly editStateSource: string; readonly editorAttached: boolean; @@ -292,7 +267,7 @@ export interface IEditableCellViewModel extends ICellViewModel { export interface INotebookEditorMouseEvent { readonly event: MouseEvent; - readonly target: CellViewModel; + readonly target: ICellViewModel; } export interface INotebookEditorContribution { @@ -334,7 +309,7 @@ export interface INotebookEditorOptions extends ITextEditorOptions { readonly viewState?: INotebookEditorViewState; } -export type INotebookEditorContributionCtor = IConstructorSignature1; +export type INotebookEditorContributionCtor = IConstructorSignature; export interface INotebookEditorContributionDescription { id: string; @@ -357,40 +332,67 @@ export interface INotebookEditorCreationOptions { readonly options?: NotebookOptions; } -export enum NotebookViewEventType { - LayoutChanged = 1, - MetadataChanged = 2, - CellStateChanged = 3 +export interface INotebookWebviewMessage { + message: unknown; } -export class NotebookLayoutChangedEvent { - public readonly type = NotebookViewEventType.LayoutChanged; +//#region Notebook View Model +export interface INotebookEditorViewState { + editingCells: { [key: number]: boolean }; + collapsedInputCells: { [key: number]: boolean }; + collapsedOutputCells: { [key: number]: boolean }; + editorViewStates: { [key: number]: editorCommon.ICodeEditorViewState | null }; + hiddenFoldingRanges?: ICellRange[]; + cellTotalHeights?: { [key: number]: number }; + scrollPosition?: { left: number; top: number }; + focus?: number; + editorFocused?: boolean; + contributionsState?: { [id: string]: unknown }; +} - constructor(readonly source: NotebookLayoutChangeEvent, readonly value: NotebookLayoutInfo) { +export interface ICellModelDecorations { + ownerId: number; + decorations: string[]; +} - } +export interface ICellModelDeltaDecorations { + ownerId: number; + decorations: IModelDeltaDecoration[]; +} + +export interface IModelDecorationsChangeAccessor { + deltaDecorations(oldDecorations: ICellModelDecorations[], newDecorations: ICellModelDeltaDecorations[]): ICellModelDecorations[]; } -export class NotebookMetadataChangedEvent { - public readonly type = NotebookViewEventType.MetadataChanged; +export type NotebookViewCellsSplice = [ + number /* start */, + number /* delete count */, + ICellViewModel[] +]; - constructor(readonly source: NotebookDocumentMetadata) { - - } +export interface INotebookViewCellsUpdateEvent { + synchronous: boolean; + splices: NotebookViewCellsSplice[]; } -export class NotebookCellStateChangedEvent { - public readonly type = NotebookViewEventType.CellStateChanged; - - constructor(readonly source: CellViewModelStateChangeEvent, readonly cell: ICellViewModel) { - - } +export interface INotebookViewModel { + notebookDocument: NotebookTextModel; + viewCells: ICellViewModel[]; + layoutInfo: NotebookLayoutInfo | null; + onDidChangeViewCells: Event; + onDidChangeSelection: Event; + getNearestVisibleCellIndexUpwards(index: number): number; + getTrackedRange(id: string): ICellRange | null; + setTrackedRange(id: string | null, newRange: ICellRange | null, newStickiness: TrackedRangeStickiness): string | null; + getSelections(): ICellRange[]; + getCellIndex(cell: ICellViewModel): number; + deltaCellStatusBarItems(oldItems: string[], newItems: INotebookDeltaCellStatusBarItems[]): string[]; + getFoldedLength(index: number): number; + replaceOne(cell: ICellViewModel, range: Range, text: string): Promise; + replaceAll(matches: CellFindMatch[], texts: string[]): Promise; } - - -export type NotebookViewEvent = NotebookLayoutChangedEvent | NotebookMetadataChangedEvent | NotebookCellStateChangedEvent; - +//#endregion export interface INotebookEditor { //#region Eventing @@ -430,7 +432,7 @@ export interface INotebookEditor { cursorNavigationMode: boolean; - _getViewModel(): NotebookViewModel | undefined; + _getViewModel(): INotebookViewModel | undefined; hasModel(): this is IActiveNotebookEditor; dispose(): void; getDomNode(): HTMLElement; @@ -468,7 +470,7 @@ export interface INotebookEditor { /** * Fetch the output renderers for notebook outputs. */ - getOutputRenderer(): OutputRenderer; + getOutputRenderer(): IOutputRenderer; /** * Focus the container of a cell (the monaco editor inside is not focused). @@ -633,6 +635,7 @@ export interface INotebookEditor { getCellByHandle(handle: number): ICellViewModel | undefined; getCellIndex(cell: ICellViewModel): number | undefined; getNextVisibleCellIndex(index: number): number | undefined; + getPreviousVisibleCellIndex(index: number): number | undefined; find(query: string, options: INotebookSearchOptions, token: CancellationToken): Promise; highlightFind(cell: ICellViewModel, matchIndex: number): Promise; unHighlightFind(matchIndex: number): Promise; @@ -642,7 +645,7 @@ export interface INotebookEditor { } export interface IActiveNotebookEditor extends INotebookEditor { - _getViewModel(): NotebookViewModel; + _getViewModel(): INotebookViewModel; textModel: NotebookTextModel; getFocus(): ICellRange; cellAt(index: number): ICellViewModel; @@ -675,7 +678,7 @@ export interface INotebookEditorDelegate extends INotebookEditor { } export interface IActiveNotebookEditorDelegate extends INotebookEditorDelegate { - _getViewModel(): NotebookViewModel; + _getViewModel(): INotebookViewModel; textModel: NotebookTextModel; getFocus(): ICellRange; cellAt(index: number): ICellViewModel; @@ -688,29 +691,18 @@ export interface OutputFindMatch { } export interface CellFindMatch { - cell: CellViewModel; + cell: ICellViewModel; matches: (FindMatch | OutputFindMatch)[]; modelMatchCount: number; } export interface CellFindMatchWithIndex { - cell: CellViewModel; + cell: ICellViewModel; index: number; matches: (FindMatch | OutputFindMatch)[]; modelMatchCount: number; } -export enum CellRevealType { - Line, - Range -} - -export enum CellRevealPosition { - Top, - Center, - Bottom -} - export enum CellEditState { /** * Default state. @@ -737,48 +729,6 @@ export enum CursorAtBoundary { Both } -export interface CellViewModelStateChangeEvent { - readonly metadataChanged?: boolean; - readonly internalMetadataChanged?: boolean; - readonly selectionChanged?: boolean; - readonly focusModeChanged?: boolean; - readonly editStateChanged?: boolean; - readonly languageChanged?: boolean; - readonly foldingStateChanged?: boolean; - readonly contentChanged?: boolean; - readonly outputIsHoveredChanged?: boolean; - readonly outputIsFocusedChanged?: boolean; - readonly cellIsHoveredChanged?: boolean; - readonly cellLineNumberChanged?: boolean; - readonly inputCollapsedChanged?: boolean; - readonly outputCollapsedChanged?: boolean; -} - -export function getVisibleCells(cells: CellViewModel[], hiddenRanges: ICellRange[]) { - if (!hiddenRanges.length) { - return cells; - } - - let start = 0; - let hiddenRangeIndex = 0; - const result: CellViewModel[] = []; - - while (start < cells.length && hiddenRangeIndex < hiddenRanges.length) { - if (start < hiddenRanges[hiddenRangeIndex].start) { - result.push(...cells.slice(start, hiddenRanges[hiddenRangeIndex].start)); - } - - start = hiddenRanges[hiddenRangeIndex].end + 1; - hiddenRangeIndex++; - } - - if (start < cells.length) { - result.push(...cells.slice(start)); - } - - return result; -} - export function getNotebookEditorFromEditorPane(editorPane?: IEditorPane): INotebookEditor | undefined { if (!editorPane) { return; @@ -791,7 +741,7 @@ export function getNotebookEditorFromEditorPane(editorPane?: IEditorPane): INote const input = editorPane.input; if (input && isCompositeNotebookEditorInput(input)) { - return (editorPane.getControl() as { notebookEditor: INotebookEditor | undefined; }).notebookEditor; + return (editorPane.getControl() as { notebookEditor: INotebookEditor | undefined }).notebookEditor; } return undefined; @@ -828,29 +778,6 @@ export function expandCellRangesWithHiddenCells(editor: INotebookEditor, ranges: return reduceCellRanges(modelRanges); } -/** - * Return a set of ranges for the cells matching the given predicate - */ -export function getRanges(cells: ICellViewModel[], included: (cell: ICellViewModel) => boolean): ICellRange[] { - const ranges: ICellRange[] = []; - let currentRange: ICellRange | undefined; - - cells.forEach((cell, idx) => { - if (included(cell)) { - if (!currentRange) { - currentRange = { start: idx, end: idx + 1 }; - ranges.push(currentRange); - } else { - currentRange.end = idx + 1; - } - } else { - currentRange = undefined; - } - }); - - return ranges; -} - export function cellRangeToViewCells(editor: IActiveNotebookEditor, ranges: ICellRange[]) { const cells: ICellViewModel[] = []; reduceCellRanges(ranges).forEach(range => { @@ -860,14 +787,15 @@ export function cellRangeToViewCells(editor: IActiveNotebookEditor, ranges: ICel return cells; } -export function formatCellDuration(duration: number): string { - const minutes = Math.floor(duration / 1000 / 60); - const seconds = Math.floor(duration / 1000) % 60; - const tenths = String(duration - minutes * 60 * 1000 - seconds * 1000).charAt(0); - - if (minutes > 0) { - return `${minutes}m ${seconds}.${tenths}s`; - } else { - return `${seconds}.${tenths}s`; - } +//#region Cell Folding +export const enum CellFoldingState { + None, + Expanded, + Collapsed } + +export interface EditorFoldingStateDelegate { + getCellIndex(cell: ICellViewModel): number; + getFoldingState(index: number): CellFoldingState; +} +//#endregion diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts index e79eed2d571..c3de862f0b9 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts @@ -9,24 +9,24 @@ import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import 'vs/css!./media/notebook'; import { localize } from 'vs/nls'; -import { extname } from 'vs/base/common/resources'; +import { extname, isEqual } from 'vs/base/common/resources'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { EditorResolution } from 'vs/platform/editor/common/editor'; +import { EditorResolution, IEditorOptions } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; -import { EditorInputCapabilities, IEditorMemento, IEditorOpenContext } from 'vs/workbench/common/editor'; +import { EditorInputCapabilities, EditorPaneSelectionChangeReason, EditorPaneSelectionCompareResult, IEditorMemento, IEditorOpenContext, IEditorPaneSelection, IEditorPaneSelectionChangeEvent, IEditorPaneWithSelection } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; -import { INotebookEditorViewState } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { IEditorDropService } from 'vs/workbench/services/editor/browser/editorDropService'; import { IEditorGroup, IEditorGroupsService, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { INotebookEditorOptions, NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookEditorOptions, INotebookEditorViewState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { IBorrowValue, INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/notebookEditorService'; import { clearMarks, getAndClearMarks, mark } from 'vs/workbench/contrib/notebook/common/notebookPerformance'; import { IFileService } from 'vs/platform/files/common/files'; @@ -36,10 +36,11 @@ import { SELECT_KERNEL_ID } from 'vs/workbench/contrib/notebook/browser/controll import { NotebooKernelActionViewItem } from 'vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; +import { URI } from 'vs/base/common/uri'; const NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'NotebookEditorViewState'; -export class NotebookEditor extends EditorPane { +export class NotebookEditor extends EditorPane implements IEditorPaneWithSelection { static readonly ID: string = NOTEBOOK_EDITOR_ID; private readonly _editorMemento: IEditorMemento; @@ -60,6 +61,9 @@ export class NotebookEditor extends EditorPane { private readonly _onDidChangeModel = this._register(new Emitter()); readonly onDidChangeModel: Event = this._onDidChangeModel.event; + private readonly _onDidChangeSelection = this._register(new Emitter()); + readonly onDidChangeSelection = this._onDidChangeSelection.event; + constructor( @ITelemetryService telemetryService: ITelemetryService, @IThemeService themeService: IThemeService, @@ -183,8 +187,9 @@ export class NotebookEditor extends EditorPane { this._widget.value.onWillHide(); } - this._widget = this.instantiationService.invokeFunction(this._notebookWidgetService.retrieveWidget, group, input); + this._widget = >this.instantiationService.invokeFunction(this._notebookWidgetService.retrieveWidget, group, input); 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); @@ -215,7 +220,7 @@ export class NotebookEditor extends EditorPane { return; } - + this._widgetDisposableStore.add(model.notebook.onDidChangeContent(() => this._onDidChangeSelection.fire({ reason: EditorPaneSelectionChangeReason.EDIT }))); const viewState = options?.viewState ?? this._loadNotebookEditorViewState(input); @@ -233,14 +238,14 @@ export class NotebookEditor extends EditorPane { mark(input.resource, 'editorLoaded'); type WorkbenchNotebookOpenClassification = { - scheme: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - ext: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - viewType: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - extensionActivated: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - inputLoaded: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - webviewCommLoaded: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - customMarkdownLoaded: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - editorLoaded: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + scheme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + ext: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + viewType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + extensionActivated: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + inputLoaded: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + webviewCommLoaded: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + customMarkdownLoaded: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + editorLoaded: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type WorkbenchNotebookOpenEvent = { @@ -316,6 +321,17 @@ export class NotebookEditor extends EditorPane { return this._loadNotebookEditorViewState(input); } + getSelection(): IEditorPaneSelection | undefined { + if (this._widget.value) { + const cellUri = this._widget.value.getActiveCell()?.uri; + if (cellUri) { + return new NotebookEditorSelection(cellUri); + } + } + + return undefined; + } + private _saveEditorViewState(input: EditorInput | undefined): void { if (this.group && this._widget.value && input instanceof NotebookEditorInput) { @@ -355,7 +371,7 @@ export class NotebookEditor extends EditorPane { return; } - if (this._input.resource.toString() !== this._widget.value.textModel?.uri.toString() && this._widget.value?.hasModel()) { + if (this._input.resource.toString() !== this.textModel?.uri.toString() && this._widget.value?.hasModel()) { // input and widget mismatch // this happens when // 1. open document A, pin the document @@ -384,3 +400,34 @@ export class NotebookEditor extends EditorPane { // }; // } } + +class NotebookEditorSelection implements IEditorPaneSelection { + + constructor( + private readonly cellUri: URI + ) { } + + compare(other: IEditorPaneSelection): EditorPaneSelectionCompareResult { + if (!(other instanceof NotebookEditorSelection)) { + return EditorPaneSelectionCompareResult.DIFFERENT; + } + + if (isEqual(this.cellUri, other.cellUri)) { + return EditorPaneSelectionCompareResult.IDENTICAL; + } + + return EditorPaneSelectionCompareResult.DIFFERENT; + } + + restore(options: IEditorOptions): INotebookEditorOptions { + const notebookOptions: INotebookEditorOptions = { + cellOptions: { + resource: this.cellUri + } + }; + + Object.assign(notebookOptions, options); + + return notebookOptions; + } +} diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorExtensions.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorExtensions.ts index fff65d1b5b1..25211785f0e 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorExtensions.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorExtensions.ts @@ -15,7 +15,7 @@ class EditorContributionRegistry { this.editorContributions = []; } - public registerEditorContribution(id: string, ctor: { new(editor: INotebookEditor, ...services: Services): INotebookEditorContribution; }): void { + public registerEditorContribution(id: string, ctor: { new(editor: INotebookEditor, ...services: Services): INotebookEditorContribution }): void { this.editorContributions.push({ id, ctor: ctor as INotebookEditorContributionCtor }); } @@ -24,7 +24,7 @@ class EditorContributionRegistry { } } -export function registerNotebookContribution(id: string, ctor: { new(editor: INotebookEditor, ...services: Services): INotebookEditorContribution; }): void { +export function registerNotebookContribution(id: string, ctor: { new(editor: INotebookEditor, ...services: Services): INotebookEditorContribution }): void { EditorContributionRegistry.INSTANCE.registerEditorContribution(id, ctor); } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorService.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorService.ts index 6110fd1d441..77353f6a6a9 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorService.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorService.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; @@ -20,7 +19,7 @@ export interface IBorrowValue { export interface INotebookEditorService { _serviceBrand: undefined; - retrieveWidget(accessor: ServicesAccessor, group: IEditorGroup, input: NotebookEditorInput, creationOptions?: INotebookEditorCreationOptions): IBorrowValue; + retrieveWidget(accessor: ServicesAccessor, group: IEditorGroup, input: NotebookEditorInput, creationOptions?: INotebookEditorCreationOptions): IBorrowValue; onDidAddNotebookEditor: Event; onDidRemoveNotebookEditor: Event; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorServiceImpl.ts index 23d2d20fe4f..da77b9fc7e9 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorServiceImpl.ts @@ -30,7 +30,7 @@ export class NotebookEditorWidgetService implements INotebookEditorService { readonly onDidAddNotebookEditor = this._onNotebookEditorAdd.event; readonly onDidRemoveNotebookEditor = this._onNotebookEditorsRemove.event; - private readonly _borrowableEditors = new Map>(); + private readonly _borrowableEditors = new Map>(); constructor( @IEditorGroupsService editorGroupService: IEditorGroupsService, @@ -156,7 +156,7 @@ export class NotebookEditorWidgetService implements INotebookEditorService { return this._createBorrowValue(value.token!, value); } - private _createBorrowValue(myToken: number, widget: { widget: NotebookEditorWidget, token: number | undefined; }): IBorrowValue { + private _createBorrowValue(myToken: number, widget: { widget: NotebookEditorWidget; token: number | undefined }): IBorrowValue { return { get value() { return widget.token === myToken ? widget.widget : undefined; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 3ee42848ddb..a75f6359fa0 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -9,11 +9,13 @@ import { IMouseWheelEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent import * as aria from 'vs/base/browser/ui/aria/aria'; import { IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; import { IAction } from 'vs/base/common/actions'; -import { runWhenIdle, SequencerByKey } from 'vs/base/common/async'; +import { DeferredPromise, runWhenIdle, SequencerByKey } from 'vs/base/common/async'; +import { CancellationToken } from 'vs/base/common/cancellation'; import { Color, RGBA } from 'vs/base/common/color'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { combinedDisposable, Disposable, DisposableStore, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { setTimeout0 } from 'vs/base/common/platform'; import { extname, isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; @@ -24,7 +26,7 @@ import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { BareFontInfo, FontInfo } from 'vs/editor/common/config/fontInfo'; import { Range } from 'vs/editor/common/core/range'; import { IEditor } from 'vs/editor/common/editorCommon'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import * as nls from 'vs/nls'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; @@ -35,27 +37,29 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; 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 { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { PANEL_BORDER, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { debugIconStartForeground } from 'vs/workbench/contrib/debug/browser/debugColors'; -import { CellEditState, CellFindMatchWithIndex, CellFocusMode, IActiveNotebookEditorDelegate, ICellOutputViewModel, ICellViewModel, ICommonCellInfo, IDisplayOutputLayoutUpdateRequest, IFocusNotebookCellOptions, IGenericCellViewModel, IInsetRenderOutput, INotebookCellOutputLayoutInfo, INotebookDeltaDecoration, INotebookEditorContribution, INotebookEditorContributionDescription, INotebookEditorCreationOptions, INotebookEditorDelegate, INotebookEditorMouseEvent, INotebookEditorOptions, NotebookCellStateChangedEvent, NotebookLayoutChangedEvent, NotebookLayoutInfo, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, CellFindMatchWithIndex, CellFocusMode, CellLayoutContext, IActiveNotebookEditorDelegate, ICellOutputViewModel, ICellViewModel, ICommonCellInfo, IDisplayOutputLayoutUpdateRequest, IFocusNotebookCellOptions, IGenericCellViewModel, IInsetRenderOutput, IModelDecorationsChangeAccessor, INotebookCellOutputLayoutInfo, INotebookDeltaDecoration, INotebookEditor, INotebookEditorContribution, INotebookEditorContributionDescription, INotebookEditorCreationOptions, INotebookEditorDelegate, INotebookEditorMouseEvent, INotebookEditorOptions, INotebookEditorViewState, INotebookViewCellsUpdateEvent, INotebookWebviewMessage, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookEditorExtensionsRegistry } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/notebookEditorService'; import { notebookDebug } from 'vs/workbench/contrib/notebook/browser/notebookLogger'; +import { NotebookCellStateChangedEvent, NotebookLayoutChangedEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { CellContextKeyManager } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellContextKeys'; import { CellDragAndDropController } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd'; import { NotebookCellList, NOTEBOOK_WEBVIEW_BOUNDARY } from 'vs/workbench/contrib/notebook/browser/view/notebookCellList'; import { INotebookCellList } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { OutputRenderer } from 'vs/workbench/contrib/notebook/browser/view/output/outputRenderer'; -import { BackLayerWebView, INotebookWebviewMessage } from 'vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView'; +import { BackLayerWebView } from 'vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView'; import { CodeCellRenderer, MarkupCellRenderer, NotebookCellListDelegate } from 'vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer'; import { IAckOutputHeight, IMarkupCellInitialization } from 'vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { NotebookEventDispatcher } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; -import { CellViewModel, IModelDecorationsChangeAccessor, INotebookEditorViewState, INotebookViewCellsUpdateEvent, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { NotebookDecorationCSSRules, NotebookRefCountedStyleSheet } from 'vs/workbench/contrib/notebook/browser/viewParts/notebookEditorDecorations'; import { NotebookEditorToolbar } from 'vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar'; @@ -63,19 +67,17 @@ import { NotebookEditorContextKeys } from 'vs/workbench/contrib/notebook/browser import { ListTopCellToolbar } from 'vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { BUILTIN_RENDERER_ID, CellKind, INotebookSearchOptions, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; -import { editorGutterModifiedBackground } from 'vs/workbench/contrib/scm/browser/dirtydiffDecorator'; -import { IWebview } from 'vs/workbench/contrib/webview/browser/webview'; -import { mark } from 'vs/workbench/contrib/notebook/common/notebookPerformance'; +import { NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { INotebookExecutionService } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { NotebookOptions, OutputInnerContainerTopPadding } from 'vs/workbench/contrib/notebook/common/notebookOptions'; +import { mark } from 'vs/workbench/contrib/notebook/common/notebookPerformance'; +import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { INotebookRendererMessagingService } from 'vs/workbench/contrib/notebook/common/notebookRendererMessagingService'; -import { CancellationToken } from 'vs/base/common/cancellation'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; -import { IEditorProgressService, IProgressRunner } from 'vs/platform/progress/common/progress'; -import { setTimeout0 } from 'vs/base/common/platform'; +import { editorGutterModifiedBackground } from 'vs/workbench/contrib/scm/browser/dirtydiffDecorator'; +import { IWebview } from 'vs/workbench/contrib/webview/browser/webview'; const $ = DOM.$; @@ -267,7 +269,7 @@ class NotebookEditorWidgetFocusTracker extends Disposable { } } -export class NotebookEditorWidget extends Disposable implements INotebookEditorDelegate { +export class NotebookEditorWidget extends Disposable implements INotebookEditorDelegate, INotebookEditor { //#region Eventing private readonly _onDidChangeCellState = this._register(new Emitter()); readonly onDidChangeCellState = this._onDidChangeCellState.event; @@ -325,7 +327,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD private _localCellStateListeners: DisposableStore[] = []; private _fontInfo: FontInfo | undefined; private _dimension: DOM.Dimension | null = null; - private _shadowElementViewInfo: { height: number, width: number, top: number; left: number; } | null = null; + private _shadowElementViewInfo: { height: number; width: number; top: number; left: number } | null = null; private readonly _editorFocus: IContextKey; private readonly _outputFocus: IContextKey; @@ -867,6 +869,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD styleSheets.push(`.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row div.cell.markdown { padding-left: ${cellRunGutter}px; }`); styleSheets.push(`.monaco-workbench .notebookOverlay > .cell-list-container .notebook-folding-indicator { left: ${(markdownCellGutter - 20) / 2 + markdownCellLeftMargin}px; }`); + styleSheets.push(`.notebookOverlay > .cell-list-container .notebook-folded-hint { left: ${markdownCellGutter + markdownCellLeftMargin + 8}px; }`); styleSheets.push(`.notebookOverlay .monaco-list .monaco-list-row :not(.webview-backed-markdown-cell) .cell-focus-indicator-top { height: ${cellTopMargin}px; }`); styleSheets.push(`.notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-side { bottom: ${bottomToolbarGap}px; }`); styleSheets.push(`.notebookOverlay .monaco-list .monaco-list-row.code-cell-row .cell-focus-indicator-left { width: ${codeCellLeftMargin + cellRunGutter}px; }`); @@ -1143,9 +1146,9 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this._webview?.updateOptions(this.notebookOptions.computeWebviewOptions()); } type WorkbenchNotebookOpenClassification = { - scheme: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - ext: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - viewType: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + scheme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + ext: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + viewType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type WorkbenchNotebookOpenEvent = { @@ -1518,7 +1521,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD store.add(cell.onDidChangeLayout(e => { if (e.totalHeight !== undefined || e.outerWidth) { - this.layoutNotebookCell(cell, cell.layoutInfo.totalHeight); + this.layoutNotebookCell(cell, cell.layoutInfo.totalHeight, e.context); } })); @@ -1628,7 +1631,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD // no cached view state so we are rendering the first viewport // after above async call, we already get init height for markdown cells, we can update their offset let offset = 0; - const offsetUpdateRequests: { id: string, top: number; }[] = []; + const offsetUpdateRequests: { id: string; top: number }[] = []; const scrollBottom = Math.max(this._dimension?.height ?? 0, 1080); for (const cell of viewModel.viewCells) { if (cell.cellKind === CellKind.Markup) { @@ -1658,6 +1661,10 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } restoreListViewState(viewState: INotebookEditorViewState | undefined): void { + if (!this.viewModel) { + return; + } + if (viewState?.scrollPosition !== undefined) { this._list.scrollTop = viewState!.scrollPosition.top; this._list.scrollLeft = viewState!.scrollPosition.left; @@ -1667,8 +1674,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } const focusIdx = typeof viewState?.focus === 'number' ? viewState.focus : 0; - if (focusIdx < this._list.length) { - const element = this._list.element(focusIdx); + if (focusIdx < this.viewModel.length) { + const element = this.viewModel.cellAt(focusIdx); if (element) { this.viewModel?.updateSelectionsState({ kind: SelectionStateType.Handle, @@ -1677,7 +1684,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD }); } } else if (this._list.length > 0) { - this.viewModel?.updateSelectionsState({ + this.viewModel.updateSelectionsState({ kind: SelectionStateType.Index, focus: { start: 0, end: 1 }, selections: [{ start: 0, end: 1 }] @@ -1685,7 +1692,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } if (viewState?.editorFocused) { - const cell = this.viewModel?.cellAt(focusIdx); + const cell = this.viewModel.cellAt(focusIdx); if (cell) { cell.focusMode = CellFocusMode.Editor; } @@ -1705,7 +1712,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD if (this._list) { state.scrollPosition = { left: this._list.scrollLeft, top: this._list.scrollTop }; - const cellHeights: { [key: number]: number; } = {}; + const cellHeights: { [key: number]: number } = {}; for (let i = 0; i < this.viewModel!.length; i++) { const elm = this.viewModel!.cellAt(i) as CellViewModel; if (elm.cellKind === CellKind.Code) { @@ -1731,7 +1738,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } // Save contribution view states - const contributionsState: { [key: string]: unknown; } = {}; + const contributionsState: { [key: string]: unknown } = {}; for (const [id, contribution] of this._contributions) { if (typeof contribution.saveViewState === 'function') { contributionsState[id] = contribution.saveViewState(); @@ -2149,7 +2156,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD //#region Cell operations/layout API private _pendingLayouts: WeakMap | null = new WeakMap(); - async layoutNotebookCell(cell: ICellViewModel, height: number): Promise { + async layoutNotebookCell(cell: ICellViewModel, height: number, context?: CellLayoutContext): Promise { this._debug('layout cell', cell.handle, height); const viewIndex = this._list.getViewIndex(cell); if (viewIndex === undefined) { @@ -2169,8 +2176,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this._pendingLayouts?.get(cell)!.dispose(); } - let r: () => void; - const layoutDisposable = DOM.scheduleAtNextAnimationFrame(() => { + let deferred = new DeferredPromise(); + const doLayout = () => { if (this._isDisposed) { return; } @@ -2182,15 +2189,21 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this._pendingLayouts?.delete(cell); relayout(cell, height); - r(); - }); + deferred.complete(undefined); + }; - this._pendingLayouts?.set(cell, toDisposable(() => { - layoutDisposable.dispose(); - r(); - })); + if (context === CellLayoutContext.Fold) { + doLayout(); + } else { + const layoutDisposable = DOM.scheduleAtNextAnimationFrame(doLayout); - return new Promise(resolve => { r = resolve; }); + this._pendingLayouts?.set(cell, toDisposable(() => { + layoutDisposable.dispose(); + deferred.complete(undefined); + })); + } + + return deferred.p; } getActiveCell() { @@ -2270,7 +2283,13 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD cell.updateEditState(CellEditState.Editing, 'focusNotebookCell'); cell.focusMode = CellFocusMode.Editor; if (!options?.skipReveal) { - this.revealInCenterIfOutsideViewport(cell); + const selectionsStartPosition = cell.getSelectionsStartPosition(); + if (selectionsStartPosition?.length) { + const firstSelectionPosition = selectionsStartPosition[0]; + this.revealRangeInCenterIfOutsideViewportAsync(cell, Range.fromPositions(firstSelectionPosition, firstSelectionPosition)); + } else { + this.revealInCenterIfOutsideViewport(cell); + } } } else if (focusItem === 'output') { this.focusElement(cell); @@ -2729,6 +2748,9 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD return this.viewModel?.getNextVisibleCellIndex(index); } + getPreviousVisibleCellIndex(index: number): number | undefined { + return this.viewModel?.getPreviousVisibleCellIndex(index); + } private _updateScrollHeight() { if (this._isDisposed || !this._webview?.isResolved()) { @@ -2779,7 +2801,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this._webview.removeInsets(removedItems); - const markdownUpdateItems: { id: string, top: number; }[] = []; + const markdownUpdateItems: { id: string; top: number }[] = []; for (const cellId of this._webview.markupPreviewMapping.keys()) { const cell = this.viewModel?.viewCells.find(cell => cell.id === cellId); if (cell) { @@ -2854,23 +2876,27 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } } - private _didStartDragMarkupCell(cellId: string, event: { dragOffsetY: number; }): void { + private _didStartDragMarkupCell(cellId: string, event: { dragOffsetY: number }): void { const cell = this._getCellById(cellId); if (cell instanceof MarkupCellViewModel) { - this._dndController?.startExplicitDrag(cell, event.dragOffsetY); + const webviewOffset = this._list.webviewElement ? -parseInt(this._list.webviewElement.domNode.style.top, 10) : 0; + this._dndController?.startExplicitDrag(cell, event.dragOffsetY - webviewOffset); } } - private _didDragMarkupCell(cellId: string, event: { dragOffsetY: number; }): void { + private _didDragMarkupCell(cellId: string, event: { dragOffsetY: number }): void { const cell = this._getCellById(cellId); if (cell instanceof MarkupCellViewModel) { - this._dndController?.explicitDrag(cell, event.dragOffsetY); + const webviewOffset = this._list.webviewElement ? -parseInt(this._list.webviewElement.domNode.style.top, 10) : 0; + this._dndController?.explicitDrag(cell, event.dragOffsetY - webviewOffset); } } - private _didDropMarkupCell(cellId: string, event: { dragOffsetY: number, ctrlKey: boolean, altKey: boolean; }): void { + private _didDropMarkupCell(cellId: string, event: { dragOffsetY: number; ctrlKey: boolean; altKey: boolean }): void { const cell = this._getCellById(cellId); if (cell instanceof MarkupCellViewModel) { + const webviewOffset = this._list.webviewElement ? -parseInt(this._list.webviewElement.domNode.style.top, 10) : 0; + event.dragOffsetY -= webviewOffset; this._dndController?.explicitDrop(cell, event); } } @@ -2924,7 +2950,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD super.dispose(); } - toJSON(): { notebookUri: URI | undefined; } { + toJSON(): { notebookUri: URI | undefined } { return { notebookUri: this.viewModel?.uri, }; @@ -2942,7 +2968,9 @@ registerZIndex(ZIndex.Base, 28, 'notebook-cell-bottom-toolbar-container'); registerZIndex(ZIndex.Base, 29, 'notebook-run-button-container'); registerZIndex(ZIndex.Base, 29, 'notebook-input-collapse-condicon'); registerZIndex(ZIndex.Base, 30, 'notebook-cell-output-toolbar'); -registerZIndex(ZIndex.Sash, 1, 'notebook-cell-toolbar'); +registerZIndex(ZIndex.Sash, 1, 'notebook-cell-expand-part-button'); +registerZIndex(ZIndex.Sash, 2, 'notebook-cell-toolbar'); +registerZIndex(ZIndex.Sash, 3, 'notebook-cell-toolbar-dropdown-active'); export const notebookCellBorder = registerColor('notebook.cellBorderColor', { dark: transparent(listInactiveSelectionBackground, 1), @@ -3245,10 +3273,9 @@ registerThemingParticipant((theme, collector) => { 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 { - background-color: ${toolbarHoverBackgroundColor}; - } - .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 .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}; } `); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts index 5bbdd523067..68b00019de6 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl.ts @@ -47,7 +47,7 @@ export class NotebookExecutionService implements INotebookExecutionService { const cellHandles: number[] = []; for (const cell of cellsArr) { - const cellExe = this._notebookExecutionStateService.getCellExecutionState(cell.uri); + const cellExe = this._notebookExecutionStateService.getCellExecution(cell.uri); if (cell.cellKind !== CellKind.Code || !!cellExe) { continue; } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookExecutionStateServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookExecutionStateServiceImpl.ts index 81786cc95db..bf3c36a044e 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookExecutionStateServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookExecutionStateServiceImpl.ts @@ -4,120 +4,144 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; import { isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; -import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CellEditType, CellUri, ICellEditOperation, NotebookCellExecutionState, NotebookCellInternalMetadata, NotebookTextModelWillAddRemoveEvent } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CellExecutionUpdateType, INotebookExecutionService } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; -import { ICellExecuteUpdate, ICellExecutionComplete, ICellExecutionEntry, ICellExecutionStateChangedEvent, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { ICellExecuteUpdate, ICellExecutionComplete, ICellExecutionStateChangedEvent, ICellExecutionStateUpdate, INotebookCellExecution, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; export class NotebookExecutionStateService extends Disposable implements INotebookExecutionStateService { declare _serviceBrand: undefined; - private readonly _executions = new ResourceMap(); + private readonly _executions = new ResourceMap>(); + private readonly _notebookListeners = new ResourceMap(); + private readonly _cellListeners = new ResourceMap(); - private readonly _onDidChangeCellExecution = new Emitter(); + private readonly _onDidChangeCellExecution = this._register(new Emitter()); onDidChangeCellExecution = this._onDidChangeCellExecution.event; constructor( @INotebookKernelService private readonly _notebookKernelService: INotebookKernelService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILogService private readonly _logService: ILogService, + @INotebookService private readonly _notebookService: INotebookService, ) { super(); - - this._register(this._notebookKernelService.onDidChangeSelectedNotebooks(e => { - if (e.newKernel) { - const notebookExecution = this._executions.get(e.notebook); - if (notebookExecution) { - notebookExecution.cancelAll(); - this.checkNotebookExecutionEmpty(e.notebook); - } - } - })); } - getCellExecutionState(cellUri: URI): ICellExecutionEntry | undefined { + forceCancelNotebookExecutions(notebookUri: URI): void { + const notebookExecutions = this._executions.get(notebookUri); + if (!notebookExecutions) { + return; + } + + for (const exe of notebookExecutions.values()) { + this._onCellExecutionDidComplete(notebookUri, exe.cellHandle, exe); + } + } + + getCellExecution(cellUri: URI): INotebookCellExecution | undefined { const parsed = CellUri.parse(cellUri); if (!parsed) { throw new Error(`Not a cell URI: ${cellUri}`); } - const exe = this._executions.get(parsed.notebook); - if (exe) { - return exe.getCellExecution(parsed.handle); + const exeMap = this._executions.get(parsed.notebook); + if (exeMap) { + return exeMap.get(parsed.handle); } return undefined; } - getCellExecutionStatesForNotebook(notebook: URI): ICellExecutionEntry[] { - const exe = this._executions.get(notebook); - return (exe?.getCellExecutions() ?? []); + getCellExecutionStatesForNotebook(notebook: URI): INotebookCellExecution[] { + const exeMap = this._executions.get(notebook); + return exeMap ? Array.from(exeMap.values()) : []; } - createNotebookCellExecution(notebook: URI, cellHandle: number): void { - let notebookExecution = this._executions.get(notebook); - if (!notebookExecution) { - notebookExecution = this._instantiationService.createInstance(NotebookExecution, notebook); - this._executions.set(notebook, notebookExecution); - } - - const exe = notebookExecution.addExecution(cellHandle); - this._onDidChangeCellExecution.fire(new NotebookExecutionEvent(notebook, cellHandle, exe)); + private _onCellExecutionDidChange(notebookUri: URI, cellHandle: number, exe: CellExecution): void { + this._onDidChangeCellExecution.fire(new NotebookExecutionEvent(notebookUri, cellHandle, exe)); } - updateNotebookCellExecution(notebook: URI, cellHandle: number, updates: ICellExecuteUpdate[]): void { - const notebookExecution = this._executions.get(notebook); - if (!notebookExecution) { - this._logService.error(`notebook execution not found for ${notebook}`); + private _onCellExecutionDidComplete(notebookUri: URI, cellHandle: number, exe: CellExecution): void { + const notebookExecutions = this._executions.get(notebookUri); + if (!notebookExecutions) { + this._logService.debug(`NotebookExecutionStateService#_onCellExecutionDidComplete - unknown notebook ${notebookUri.toString()}`); return; } - const exe = notebookExecution.updateExecution(cellHandle, updates); - if (exe) { - this._onDidChangeCellExecution.fire(new NotebookExecutionEvent(notebook, cellHandle, exe)); + exe.dispose(); + const cellUri = CellUri.generate(notebookUri, cellHandle); + this._cellListeners.get(cellUri)?.dispose(); + this._cellListeners.delete(cellUri); + notebookExecutions.delete(cellHandle); + if (notebookExecutions.size === 0) { + this._executions.delete(notebookUri); + this._notebookListeners.get(notebookUri)?.dispose(); + this._notebookListeners.delete(notebookUri); } + + this._onDidChangeCellExecution.fire(new NotebookExecutionEvent(notebookUri, cellHandle)); } - completeNotebookCellExecution(notebook: URI, cellHandle: number, complete: ICellExecutionComplete): void { - const notebookExecution = this._executions.get(notebook); - if (!notebookExecution) { - this._logService.error(`notebook execution not found for ${notebook}`); - return; + createCellExecution(controllerId: string, notebookUri: URI, cellHandle: number): INotebookCellExecution { + const notebook = this._notebookService.getNotebookTextModel(notebookUri); + if (!notebook) { + throw new Error(`Notebook not found: ${notebookUri.toString()}`); } - const exe = notebookExecution.completeExecution(cellHandle, complete); - if (exe) { - this.checkNotebookExecutionEmpty(notebook); - this._onDidChangeCellExecution.fire(new NotebookExecutionEvent(notebook, cellHandle)); + const kernel = this._notebookKernelService.getMatchingKernel(notebook); + if (!kernel.selected || kernel.selected.id !== controllerId) { + throw new Error(`Kernel is not selected: ${kernel.selected?.id} !== ${controllerId}`); } + + let notebookExecutionMap = this._executions.get(notebookUri); + if (!notebookExecutionMap) { + const listeners = this._instantiationService.createInstance(NotebookExecutionListeners, notebookUri); + this._notebookListeners.set(notebookUri, listeners); + + notebookExecutionMap = new Map(); + this._executions.set(notebookUri, notebookExecutionMap); + } + + let exe = notebookExecutionMap.get(cellHandle); + if (!exe) { + exe = this._createNotebookCellExecution(notebook, cellHandle); + notebookExecutionMap.set(cellHandle, exe); + this._onDidChangeCellExecution.fire(new NotebookExecutionEvent(notebookUri, cellHandle, exe)); + } + + return exe; } - private checkNotebookExecutionEmpty(notebook: URI): void { - const notebookExecution = this._executions.get(notebook); - if (!notebookExecution) { - return; - } + private _createNotebookCellExecution(notebook: NotebookTextModel, cellHandle: number): CellExecution { + const notebookUri = notebook.uri; + const exe: CellExecution = this._instantiationService.createInstance(CellExecution, cellHandle, notebook); + const disposable = combinedDisposable( + exe.onDidUpdate(() => this._onCellExecutionDidChange(notebookUri, cellHandle, exe)), + exe.onDidComplete(() => this._onCellExecutionDidComplete(notebookUri, cellHandle, exe))); + this._cellListeners.set(CellUri.generate(notebookUri, cellHandle), disposable); - if (notebookExecution.isEmpty()) { - this._logService.debug(`NotebookExecution#dispose ${notebook.toString()}`); - notebookExecution.dispose(); - this._executions.delete(notebook); - } + return exe; } override dispose(): void { super.dispose(); - this._executions.forEach(e => e.dispose()); + this._executions.forEach(executionMap => { + executionMap.forEach(execution => execution.dispose()); + executionMap.clear(); + }); this._executions.clear(); + + this._cellListeners.forEach(disposable => disposable.dispose()); + this._notebookListeners.forEach(disposable => disposable.dispose()); } } @@ -128,22 +152,24 @@ class NotebookExecutionEvent implements ICellExecutionStateChangedEvent { readonly changed?: CellExecution ) { } - affectsCell(cell: NotebookCellTextModel): boolean { - const parsedUri = CellUri.parse(cell.uri); + affectsCell(cell: URI): boolean { + const parsedUri = CellUri.parse(cell); return !!parsedUri && isEqual(this.notebook, parsedUri.notebook) && this.cellHandle === parsedUri.handle; } + + affectsNotebook(notebook: URI): boolean { + return isEqual(this.notebook, notebook); + } } -class NotebookExecution extends Disposable { +class NotebookExecutionListeners extends Disposable { private readonly _notebookModel: NotebookTextModel; - private readonly _cellExecutions = new Map(); - constructor( notebook: URI, @INotebookService private readonly _notebookService: INotebookService, - @IInstantiationService private readonly _instantiationService: IInstantiationService, @INotebookExecutionService private readonly _notebookExecutionService: INotebookExecutionService, + @INotebookExecutionStateService private readonly _notebookExecutionStateService: INotebookExecutionStateService, @ILogService private readonly _logService: ILogService, ) { super(); @@ -159,66 +185,10 @@ class NotebookExecution extends Disposable { this._register(this._notebookModel.onWillDispose(() => this.onWillDisposeDocument())); } - getCellExecution(cellHandle: number): CellExecution | undefined { - return this._cellExecutions.get(cellHandle); - } - - getCellExecutions(): CellExecution[] { - return Array.from(this._cellExecutions.values()); - } - - private getCellLog(cellHandle: number): string { - return `${this._notebookModel.uri.toString()}, ${cellHandle}`; - } - - isEmpty(): boolean { - return this._cellExecutions.size === 0; - } - - cancelAll(): void { - this._logService.debug(`NotebookExecution#cancelAll`); - this._notebookExecutionService.cancelNotebookCellHandles(this._notebookModel, this._cellExecutions.keys()); - } - - addExecution(cellHandle: number): CellExecution { - this._logService.debug(`NotebookExecution#addExecution ${this.getCellLog(cellHandle)}`); - const execution = this._instantiationService.createInstance(CellExecution, cellHandle, this._notebookModel); - this._cellExecutions.set(cellHandle, execution); - return execution; - } - - updateExecution(cellHandle: number, updates: ICellExecuteUpdate[]): CellExecution | undefined { - this.logUpdates(cellHandle, updates); - const execution = this._cellExecutions.get(cellHandle); - if (!execution) { - this._logService.error(`no execution for cell ${cellHandle}`); - return; - } - - execution.update(updates); - return execution; - } - - private logUpdates(cellHandle: number, updates: ICellExecuteUpdate[]): void { - const updateTypes = updates.map(u => CellExecutionUpdateType[u.editType]).join(', '); - this._logService.debug(`NotebookExecution#updateExecution ${this.getCellLog(cellHandle)}, [${updateTypes}]`); - } - - completeExecution(cellHandle: number, complete: ICellExecutionComplete): CellExecution | undefined { - this._logService.debug(`NotebookExecution#completeExecution ${this.getCellLog(cellHandle)}`); - - const execution = this._cellExecutions.get(cellHandle); - if (!execution) { - this._logService.error(`no execution for cell ${cellHandle}`); - return; - } - - try { - execution.complete(complete); - return execution; - } finally { - this._cellExecutions.delete(cellHandle); - } + private cancelAll(): void { + this._logService.debug(`NotebookExecutionListeners#cancelAll`); + const exes = this._notebookExecutionStateService.getCellExecutionStatesForNotebook(this._notebookModel.uri); + this._notebookExecutionService.cancelNotebookCellHandles(this._notebookModel, exes.map(exe => exe.cellHandle)); } private onWillDisposeDocument(): void { @@ -227,7 +197,8 @@ class NotebookExecution extends Disposable { } private onWillAddRemoveCells(e: NotebookTextModelWillAddRemoveEvent): void { - const handles = new Set(this._cellExecutions.keys()); + const notebookExes = this._notebookExecutionStateService.getCellExecutionStatesForNotebook(this._notebookModel.uri); + const handles = new Set(notebookExes.map(exe => exe.cellHandle)); const myDeletedHandles = new Set(); e.rawEvent.changes.forEach(([start, deleteCount]) => { if (deleteCount) { @@ -253,7 +224,7 @@ function updateToEdit(update: ICellExecuteUpdate, cellHandle: number): ICellEdit if (update.editType === CellExecutionUpdateType.Output) { return { editType: CellEditType.Output, - handle: update.cellHandle, + handle: cellHandle, append: update.append, outputs: update.outputs, }; @@ -265,7 +236,7 @@ function updateToEdit(update: ICellExecuteUpdate, cellHandle: number): ICellEdit outputId: update.outputId }; } else if (update.editType === CellExecutionUpdateType.ExecutionState) { - const newInternalMetadata: Partial = { }; + const newInternalMetadata: Partial = {}; if (typeof update.executionOrder !== 'undefined') { newInternalMetadata.executionOrder = update.executionOrder; } @@ -282,7 +253,13 @@ function updateToEdit(update: ICellExecuteUpdate, cellHandle: number): ICellEdit throw new Error('Unknown cell update type'); } -class CellExecution implements ICellExecutionEntry { +class CellExecution extends Disposable implements INotebookCellExecution { + private readonly _onDidUpdate = this._register(new Emitter()); + readonly onDidUpdate = this._onDidUpdate.event; + + private readonly _onDidComplete = this._register(new Emitter()); + readonly onDidComplete = this._onDidComplete.event; + private _state: NotebookCellExecutionState = NotebookCellExecutionState.Pending; get state() { return this._state; @@ -297,11 +274,18 @@ class CellExecution implements ICellExecutionEntry { return this._didPause; } + private _isPaused = false; + get isPaused() { + return this._isPaused; + } + constructor( readonly cellHandle: number, private readonly _notebookModel: NotebookTextModel, @ILogService private readonly _logService: ILogService, ) { + super(); + this._logService.debug(`CellExecution#ctor ${this.getCellLog()}`); const startExecuteEdit: ICellEditOperation = { editType: CellEditType.PartialInternalMetadata, handle: this.cellHandle, @@ -315,7 +299,17 @@ class CellExecution implements ICellExecutionEntry { this._applyExecutionEdits([startExecuteEdit]); } + private getCellLog(): string { + return `${this._notebookModel.uri.toString()}, ${this.cellHandle}`; + } + + private logUpdates(updates: ICellExecuteUpdate[]): void { + const updateTypes = updates.map(u => CellExecutionUpdateType[u.editType]).join(', '); + this._logService.debug(`CellExecution#updateExecution ${this.getCellLog()}, [${updateTypes}]`); + } + update(updates: ICellExecuteUpdate[]): void { + this.logUpdates(updates); if (updates.some(u => u.editType === CellExecutionUpdateType.ExecutionState)) { this._state = NotebookCellExecutionState.Executing; } @@ -324,27 +318,40 @@ class CellExecution implements ICellExecutionEntry { this._didPause = true; } - const edits = updates.map(update => updateToEdit(update, this.cellHandle)); - this._applyExecutionEdits(edits); + const lastIsPausedUpdate = [...updates].reverse().find(u => u.editType === CellExecutionUpdateType.ExecutionState && typeof u.isPaused === 'boolean'); + if (lastIsPausedUpdate) { + this._isPaused = (lastIsPausedUpdate as ICellExecutionStateUpdate).isPaused!; + } + + const cellModel = this._notebookModel.cells.find(c => c.handle === this.cellHandle); + if (!cellModel) { + this._logService.debug(`CellExecution#update, updating cell not in notebook: ${this._notebookModel.uri.toString()}, ${this.cellHandle}`); + } else { + const edits = updates.map(update => updateToEdit(update, this.cellHandle)); + this._applyExecutionEdits(edits); + } + + this._onDidUpdate.fire(); } complete(completionData: ICellExecutionComplete): void { const cellModel = this._notebookModel.cells.find(c => c.handle === this.cellHandle); if (!cellModel) { - this._logService.debug(`CellExecution#complete, updating cell not in notebook: ${this._notebookModel.uri.toString()}, ${this.cellHandle}`); - return; + this._logService.debug(`CellExecution#complete, completing cell not in notebook: ${this._notebookModel.uri.toString()}, ${this.cellHandle}`); + } else { + const edit: ICellEditOperation = { + editType: CellEditType.PartialInternalMetadata, + handle: this.cellHandle, + internalMetadata: { + lastRunSuccess: completionData.lastRunSuccess, + runStartTime: this._didPause ? null : cellModel.internalMetadata.runStartTime, + runEndTime: this._didPause ? null : completionData.runEndTime, + } + }; + this._applyExecutionEdits([edit]); } - const edit: ICellEditOperation = { - editType: CellEditType.PartialInternalMetadata, - handle: this.cellHandle, - internalMetadata: { - lastRunSuccess: completionData.lastRunSuccess, - runStartTime: this._didPause ? null : cellModel.internalMetadata.runStartTime, - runEndTime: this._didPause ? null : completionData.runEndTime, - } - }; - this._applyExecutionEdits([edit]); + this._onDidComplete.fire(); } private _applyExecutionEdits(edits: ICellEditOperation[]): void { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookKernelServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookKernelServiceImpl.ts index c87b6bb596a..250e502801f 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookKernelServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookKernelServiceImpl.ts @@ -167,7 +167,7 @@ export class NotebookKernelService extends Disposable implements INotebookKernel getMatchingKernel(notebook: INotebookTextModelLike): INotebookKernelMatchResult { // all applicable kernels - const kernels: { kernel: INotebookKernel, instanceAffinity: number, typeAffinity: number, score: number }[] = []; + const kernels: { kernel: INotebookKernel; instanceAffinity: number; typeAffinity: number; score: number }[] = []; for (const info of this._kernels.values()) { const score = NotebookKernelService._score(info.kernel, notebook); if (score) { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts index a780d57ebae..2917d5dc70e 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts @@ -23,14 +23,13 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; -import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.protocol'; import { Memento } from 'vs/workbench/common/memento'; import { INotebookEditorContribution, notebookRendererExtensionPoint, notebooksExtensionPoint } from 'vs/workbench/contrib/notebook/browser/extensionPoint'; import { INotebookEditorOptions } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookDiffEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookDiffEditorInput'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, BUILTIN_RENDERER_ID, CellUri, NotebookSetting, INotebookContributionData, INotebookExclusiveDocumentFilter, INotebookRendererInfo, INotebookTextModel, IOrderedMimeType, IOutputDto, MimeTypeDisplayOrder, mimeTypeIsAlwaysSecure, mimeTypeSupportedByCore, NotebookData, NotebookEditorPriority, NotebookRendererMatch, NOTEBOOK_DISPLAY_ORDER, RENDERER_EQUIVALENT_EXTENSIONS, RENDERER_NOT_AVAILABLE, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, BUILTIN_RENDERER_ID, CellUri, NotebookSetting, INotebookContributionData, INotebookExclusiveDocumentFilter, INotebookRendererInfo, INotebookTextModel, IOrderedMimeType, IOutputDto, MimeTypeDisplayOrder, mimeTypeIsAlwaysSecure, mimeTypeSupportedByCore, NotebookData, NotebookEditorPriority, NotebookRendererMatch, NOTEBOOK_DISPLAY_ORDER, RENDERER_EQUIVALENT_EXTENSIONS, RENDERER_NOT_AVAILABLE, TransientOptions, NotebookExtensionDescription } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput'; import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; import { updateEditorTopPadding } from 'vs/workbench/contrib/notebook/common/notebookOptions'; @@ -327,7 +326,7 @@ export class NotebookOutputRendererInfoStore { const preferred = notebookProviderInfo && this.preferredMimetype.getValue()[notebookProviderInfo.id]?.[mimeType]; const notebookExtId = notebookProviderInfo?.extension?.value; const notebookId = notebookProviderInfo?.id; - const renderers: { ordered: IOrderedMimeType, score: number }[] = Array.from(this.contributedRenderers.values()) + const renderers: { ordered: IOrderedMimeType; score: number }[] = Array.from(this.contributedRenderers.values()) .map(renderer => { const ownScore = kernelProvides === undefined ? renderer.matchesWithoutKernel(mimeType) @@ -719,7 +718,7 @@ export class NotebookService extends Disposable implements INotebookService { this._lastClipboardIsCopy = isCopy; } - getToCopy(): { items: NotebookCellTextModel[], isCopy: boolean; } | undefined { + getToCopy(): { items: NotebookCellTextModel[]; isCopy: boolean } | undefined { if (this._cutItems) { return { items: this._cutItems, isCopy: this._lastClipboardIsCopy }; } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookViewEvents.ts b/src/vs/workbench/contrib/notebook/browser/notebookViewEvents.ts new file mode 100644 index 00000000000..c8dd67db793 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/notebookViewEvents.ts @@ -0,0 +1,70 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { FontInfo } from 'vs/editor/common/config/fontInfo'; +import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; +import { NotebookDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; + +export interface NotebookLayoutInfo { + width: number; + height: number; + fontInfo: FontInfo; +} + +export interface CellViewModelStateChangeEvent { + readonly metadataChanged?: boolean; + readonly internalMetadataChanged?: boolean; + readonly selectionChanged?: boolean; + readonly focusModeChanged?: boolean; + readonly editStateChanged?: boolean; + readonly languageChanged?: boolean; + readonly foldingStateChanged?: boolean; + readonly contentChanged?: boolean; + readonly outputIsHoveredChanged?: boolean; + readonly outputIsFocusedChanged?: boolean; + readonly cellIsHoveredChanged?: boolean; + readonly cellLineNumberChanged?: boolean; + readonly inputCollapsedChanged?: boolean; + readonly outputCollapsedChanged?: boolean; +} + +export interface NotebookLayoutChangeEvent { + width?: boolean; + height?: boolean; + fontInfo?: boolean; +} + +export enum NotebookViewEventType { + LayoutChanged = 1, + MetadataChanged = 2, + CellStateChanged = 3 +} + +export class NotebookLayoutChangedEvent { + public readonly type = NotebookViewEventType.LayoutChanged; + + constructor(readonly source: NotebookLayoutChangeEvent, readonly value: NotebookLayoutInfo) { + + } +} + + +export class NotebookMetadataChangedEvent { + public readonly type = NotebookViewEventType.MetadataChanged; + + constructor(readonly source: NotebookDocumentMetadata) { + + } +} + +export class NotebookCellStateChangedEvent { + public readonly type = NotebookViewEventType.CellStateChanged; + + constructor(readonly source: CellViewModelStateChangeEvent, readonly cell: NotebookCellTextModel) { + + } +} + +export type NotebookViewEvent = NotebookLayoutChangedEvent | NotebookMetadataChangedEvent | NotebookCellStateChangedEvent; diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookWorkerServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookWorkerServiceImpl.ts index e9e4422f1a1..026490e8404 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookWorkerServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookWorkerServiceImpl.ts @@ -64,8 +64,8 @@ export interface IWorkerClient { } export class NotebookEditorModelManager extends Disposable { - private _syncedModels: { [modelUrl: string]: IDisposable; } = Object.create(null); - private _syncedModelsLastUsedTime: { [modelUrl: string]: number; } = Object.create(null); + private _syncedModels: { [modelUrl: string]: IDisposable } = Object.create(null); + private _syncedModelsLastUsedTime: { [modelUrl: string]: number } = Object.create(null); constructor( private readonly _proxy: NotebookEditorSimpleWorker, 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 f12c9936984..1db19ff74ae 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellContextKeys.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellContextKeys.ts @@ -5,11 +5,13 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { CellEditState, CellFocusMode, CellViewModelStateChangeEvent, ICellViewModel, INotebookEditorDelegate, 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_TYPE } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, CellFocusMode, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +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_TYPE } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; 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 { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; export class CellContextKeyManager extends Disposable { @@ -53,7 +55,7 @@ export class CellContextKeyManager extends Disposable { }); this._register(this._notebookExecutionStateService.onDidChangeCellExecution(e => { - if (e.affectsCell(this.element.model)) { + if (e.affectsCell(this.element.uri)) { this.updateForExecutionState(); } })); @@ -127,7 +129,7 @@ export class CellContextKeyManager extends Disposable { const internalMetadata = this.element.internalMetadata; this.cellEditable.set(!this.notebookEditor.isReadOnly); - const exeState = this._notebookExecutionStateService.getCellExecutionState(this.element.uri); + const exeState = this._notebookExecutionStateService.getCellExecution(this.element.uri); if (this.element instanceof MarkupCellViewModel) { this.cellRunState.reset(); this.cellExecuting.reset(); 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 d69b228395a..2563807acf3 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts @@ -204,7 +204,7 @@ export class CellDragAndDropController extends Disposable { } } - private _dropImpl(draggedCell: ICellViewModel, dropDirection: 'above' | 'below', ctx: { ctrlKey: boolean, altKey: boolean; }, draggedOverCell: ICellViewModel) { + private _dropImpl(draggedCell: ICellViewModel, dropDirection: 'above' | 'below', ctx: { ctrlKey: boolean; altKey: boolean }, draggedOverCell: ICellViewModel) { const cellTop = this.list.getAbsoluteTopOfElement(draggedOverCell); const cellHeight = this.list.elementHeight(draggedOverCell); const insertionIndicatorAbsolutePos = dropDirection === 'above' ? cellTop : cellTop + cellHeight; @@ -393,7 +393,7 @@ export class CellDragAndDropController extends Disposable { this.setInsertIndicatorVisibility(false); } - public explicitDrop(cell: ICellViewModel, ctx: { dragOffsetY: number, ctrlKey: boolean, altKey: boolean; }) { + public explicitDrop(cell: ICellViewModel, ctx: { dragOffsetY: number; ctrlKey: boolean; altKey: boolean }) { this.currentDraggedCell = undefined; this.setInsertIndicatorVisibility(false); 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 48436cd345f..09cc47e96e8 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions.ts @@ -15,13 +15,14 @@ import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'v import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ActiveEditorContext } from 'vs/workbench/common/editor'; +import { ActiveEditorContext } from 'vs/workbench/common/contextkeys'; import { INotebookCellToolbarActionContext, INotebookCommandContext, NotebookMultiCellAction, NOTEBOOK_ACTIONS_CATEGORY } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { CellViewModelStateChangeEvent, ICellViewModel, INotebookEditorDelegate, NOTEBOOK_CELL_LINE_NUMBERS, NOTEBOOK_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEditor'; +import { ICellViewModel, INotebookEditorDelegate } 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/cellParts/cellPart'; -import { NotebookCellInternalMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +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 { private static fixedEditorOptions: IEditorOptions = { @@ -116,7 +117,7 @@ export class CellEditorOptions extends CellPart { const editorOptions = deepClone(this.configurationService.getValue('editor', { overrideIdentifier: this.language })); const layoutConfig = this.notebookOptions.getLayoutConfiguration(); const editorOptionsOverrideRaw = layoutConfig.editorOptionsCustomizations ?? {}; - const editorOptionsOverride: { [key: string]: any; } = {}; + const editorOptionsOverride: { [key: string]: any } = {}; for (const key in editorOptionsOverrideRaw) { if (key.indexOf('editor.') === 0) { editorOptionsOverride[key.substring(7)] = editorOptionsOverrideRaw[key]; @@ -225,7 +226,7 @@ registerAction2(class ToggleActiveLineNumberAction extends NotebookMultiCellActi super({ id: 'notebook.cell.toggleLineNumbers', title: localize('notebook.cell.toggleLineNumbers.title', "Show Cell Line Numbers"), - precondition: ActiveEditorContext.isEqualTo(NotebookEditor.ID), + precondition: ActiveEditorContext.isEqualTo(NOTEBOOK_EDITOR_ID), menu: [{ id: MenuId.NotebookCellTitle, group: 'View', 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 3a630d414ac..ffccb6b0f49 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { CellViewModelStateChangeEvent, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +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/cellParts/cellPart'; import { BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { NotebookCellInternalMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; 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 ee4e94a8ac4..b215f56d91d 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator.ts @@ -5,9 +5,11 @@ import * as DOM from 'vs/base/browser/dom'; import { FastDomNode } from 'vs/base/browser/fastDomNode'; -import { CellViewModelStateChangeEvent, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +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/cellParts/cellPart'; 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 { @@ -50,7 +52,7 @@ export class CellFocusIndicator extends CellPart { updateInternalLayoutNow(element: ICellViewModel): void { if (element.cellKind === CellKind.Markup) { // markdown cell - const indicatorPostion = this.notebookEditor.notebookOptions.computeIndicatorPosition(element.layoutInfo.totalHeight, this.notebookEditor.textModel?.viewType); + const indicatorPostion = this.notebookEditor.notebookOptions.computeIndicatorPosition(element.layoutInfo.totalHeight, (element as MarkupCellViewModel).layoutInfo.foldHintHeight, this.notebookEditor.textModel?.viewType); this.bottom.domNode.style.transform = `translateY(${indicatorPostion.bottomIndicatorTop}px)`; this.left.setHeight(indicatorPostion.verticalIndicatorHeight); this.right.setHeight(indicatorPostion.verticalIndicatorHeight); 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 e57ee5fa021..2c1275c7bb2 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 { ThemeIcon } from 'vs/platform/theme/common/themeService'; import { ViewContainerLocation } from 'vs/workbench/common/views'; import { IExtensionsViewPaneContainer, VIEWLET_ID as EXTENSION_VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { INotebookCellActionContext } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { CellViewModelStateChangeEvent, ICellOutputViewModel, ICellViewModel, IInsetRenderOutput, INotebookEditorDelegate, IRenderOutput, JUPYTER_EXTENSION_ID, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellOutputViewModel, ICellViewModel, IInsetRenderOutput, INotebookEditorDelegate, IRenderOutput, JUPYTER_EXTENSION_ID, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { mimetypeIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { CodeCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { getResizesObserver } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets'; @@ -36,6 +36,7 @@ import { OutputInnerContainerTopPadding } from 'vs/workbench/contrib/notebook/co import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellPart'; +import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; interface IMimeTypeRenderer extends IQuickPickItem { index: number; @@ -568,7 +569,7 @@ export class CellOutputContainer extends CellPart { private notebookEditor: INotebookEditorDelegate, private viewCell: CodeCellViewModel, private readonly templateData: CodeCellRenderTemplate, - private options: { limit: number; }, + private options: { limit: number }, @IOpenerService private readonly openerService: IOpenerService, @IInstantiationService private readonly instantiationService: IInstantiationService, ) { diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellPart.ts index 563e978ba66..a8740668eee 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellPart.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import { CellViewModelStateChangeEvent, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { ICellExecutionStateChangedEvent } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; 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 c43e9993fa6..3c51f3d1fb5 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; -import { CellViewModelStateChangeEvent, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +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/cellParts/cellPart'; import { NotebookCellExecutionState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellExecutionStateChangedEvent, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; @@ -48,7 +49,7 @@ export class CellProgressBar extends CellPart { } if (e.inputCollapsedChanged) { - const exeState = this._notebookExecutionStateService.getCellExecutionState(element.uri); + const exeState = this._notebookExecutionStateService.getCellExecution(element.uri); if (element.isInputCollapsed) { this._progressBar.hide(); if (exeState?.state === NotebookCellExecutionState.Executing) { @@ -64,9 +65,9 @@ export class CellProgressBar extends CellPart { } private _updateForExecutionState(element: ICellViewModel, e?: ICellExecutionStateChangedEvent): void { - const exeState = e?.changed ?? this._notebookExecutionStateService.getCellExecutionState(element.uri); + const exeState = e?.changed ?? this._notebookExecutionStateService.getCellExecution(element.uri); const progressBar = element.isInputCollapsed ? this._collapsedProgressBar : this._progressBar; - if (exeState?.state === NotebookCellExecutionState.Executing && !exeState.didPause) { + if (exeState?.state === NotebookCellExecutionState.Executing && !exeState.isPaused) { showProgressBar(progressBar); } else { progressBar.hide(); 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 341995eff79..5af29330dd4 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts @@ -20,7 +20,8 @@ import { INotificationService } from 'vs/platform/notification/common/notificati 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 { CellViewModelStateChangeEvent, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +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/cellParts/cellPart'; import { ClickTargetType, IClickTarget } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets'; import { BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; @@ -92,7 +93,6 @@ export class CellEditorStatusBar extends CellPart { this.updateContext({ ui: true, cell: element, - cellTemplate: templateData, notebookEditor: this._notebookEditor, $mid: MarshalledId.NotebookCellActionContext }); 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 723304eb68b..13dd8dc5e13 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts @@ -19,7 +19,8 @@ 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 { DeleteCellAction } from 'vs/workbench/contrib/notebook/browser/controller/editActions'; -import { CellViewModelStateChangeEvent, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { CodiconActionViewItem } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellActionView'; import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellPart'; import { BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; @@ -141,7 +142,6 @@ export class CellTitleToolbarPart extends CellPart { this.updateContext({ ui: true, cell: element, - cellTemplate: templateData, notebookEditor: this._notebookEditor, $mid: MarshalledId.NotebookCellActionContext }); @@ -216,7 +216,7 @@ export class CellTitleToolbarPart extends CellPart { } } -function getCellToolbarActions(menu: IMenu): { primary: IAction[], secondary: IAction[]; disposable: IDisposable; } { +function getCellToolbarActions(menu: IMenu): { primary: IAction[]; secondary: IAction[]; disposable: IDisposable } { const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary }; 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 79a5d94e667..211ec648e88 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets.ts @@ -5,7 +5,7 @@ import * as DOM from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IDimension } from 'vs/editor/common/editorCommon'; +import { IDimension } from 'vs/editor/common/core/dimension'; export interface IClickTarget { type: ClickTargetType; 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 27db283f17b..16868da9133 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts @@ -10,10 +10,10 @@ import { Codicon, CSSIcon } from 'vs/base/common/codicons'; import { Event } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { IDimension } from 'vs/editor/common/editorCommon'; +import { IDimension } from 'vs/editor/common/core/dimension'; import { IReadonlyTextBuffer } from 'vs/editor/common/model'; import { tokenizeToStringSync } from 'vs/editor/common/languages/textToHtmlTokenizer'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -67,7 +67,7 @@ export class CodeCell extends Disposable { this.registerMouseListener(); this._register(notebookExecutionStateService.onDidChangeCellExecution(e => { - if (e.affectsCell(this.viewCell.model)) { + if (e.affectsCell(this.viewCell.uri)) { this.cellParts.forEach(cellPart => { cellPart.updateForExecutionState(this.viewCell, e); }); @@ -257,10 +257,11 @@ export class CodeCell extends Disposable { return; } - const primarySelection = this.templateData.editor.getSelection(); + const selections = this.templateData.editor.getSelections(); - if (primarySelection) { - this.notebookEditor.revealLineInViewAsync(this.viewCell, primarySelection.positionLineNumber); + if (selections?.length) { + const lastSelection = selections[selections.length - 1]; + this.notebookEditor.revealLineInViewAsync(this.viewCell, lastSelection.positionLineNumber); } })); 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 3f6c84a1473..dd40996cb37 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts @@ -18,9 +18,11 @@ 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 { INotebookCellActionContext } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; -import { CellViewModelStateChangeEvent, ICellViewModel, INotebookEditorDelegate, NOTEBOOK_CELL_EXECUTION_STATE, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +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/cellParts/cellPart'; import { BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +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 { toolbar!: ToolBar; @@ -53,7 +55,6 @@ export class RunToolbar extends CellPart { this.toolbar.context = { ui: true, cell: element, - cellTemplate: templateData, notebookEditor: this.notebookEditor, $mid: MarshalledId.NotebookCellActionContext }; @@ -71,7 +72,7 @@ export class RunToolbar extends CellPart { // no op } - getCellToolbarActions(menu: IMenu): { primary: IAction[], secondary: IAction[]; } { + getCellToolbarActions(menu: IMenu): { primary: IAction[]; secondary: IAction[] } { const primary: IAction[] = []; const secondary: IAction[] = []; const result = { primary, secondary }; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint.ts new file mode 100644 index 00000000000..72baae539fc --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint.ts @@ -0,0 +1,82 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as DOM from 'vs/base/browser/dom'; +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, ICellViewModel, INotebookEditor } 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/cellParts/cellPart'; +import { BaseCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; + +export class FoldedCellHint extends CellPart { + + constructor( + private readonly _notebookEditor: INotebookEditor, + private readonly _container: HTMLElement, + ) { + super(); + } + + renderCell(element: MarkupCellViewModel, templateData: BaseCellRenderTemplate): void { + this.update(element); + } + + private update(element: MarkupCellViewModel) { + if (!this._notebookEditor.hasModel()) { + return; + } + + if (element.isInputCollapsed || element.getEditState() === CellEditState.Editing) { + DOM.hide(this._container); + } else if (element.foldingState === CellFoldingState.Collapsed) { + const idx = this._notebookEditor._getViewModel().getCellIndex(element); + const length = this._notebookEditor._getViewModel().getFoldedLength(idx); + DOM.reset(this._container, this.getHiddenCellsLabel(length), this.getHiddenCellHintButton(element)); + DOM.show(this._container); + + const foldHintTop = element.layoutInfo.previewHeight; + this._container.style.top = `${foldHintTop}px`; + } else if (element.foldingState === CellFoldingState.Expanded) { + DOM.hide(this._container); + } + } + + private getHiddenCellsLabel(num: number): HTMLElement { + const label = num === 1 ? + localize('hiddenCellsLabel', "1 cell hidden") : + localize('hiddenCellsLabelPlural', "{0} cells hidden", num); + + return DOM.$('span.notebook-folded-hint-label', undefined, label); + } + + private getHiddenCellHintButton(element: MarkupCellViewModel): HTMLElement { + const expandIcon = DOM.$('span.cell-expand-part-button'); + expandIcon.classList.add(...CSSIcon.asClassNameArray(Codicon.more)); + this._register(DOM.addDisposableListener(expandIcon, DOM.EventType.CLICK, () => { + const controller = this._notebookEditor.getContribution(FoldingController.id); + const idx = this._notebookEditor.getCellIndex(element); + if (typeof idx === 'number') { + controller.setFoldingStateDown(idx, CellFoldingState.Expanded, 1); + } + })); + + return expandIcon; + } + + prepareLayout(): void { + // nothing to read + } + + updateInternalLayoutNow(element: MarkupCellViewModel) { + this.update(element); + } + + updateState(element: ICellViewModel, e: CellViewModelStateChangeEvent): void { + // nothing to update + } +} diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/markdownCell.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/markdownCell.ts index 5ca00dcfdf2..5d9c389820b 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/markdownCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/markdownCell.ts @@ -4,30 +4,28 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; +import { renderIcon } from 'vs/base/browser/ui/iconLabel/iconLabels'; import { disposableTimeout, raceCancellation } from 'vs/base/common/async'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { CellEditState, CellFocusMode, ICellViewModel, IActiveNotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellFoldingState } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; -import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { INotebookCellStatusBarService } from 'vs/workbench/contrib/notebook/common/notebookCellStatusBarService'; -import { collapsedIcon, expandedIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; -import { renderIcon } from 'vs/base/browser/ui/iconLabel/iconLabels'; -import { IReadonlyTextBuffer } from 'vs/editor/common/model'; import { tokenizeToStringSync } from 'vs/editor/common/languages/textToHtmlTokenizer'; -import { MarkdownCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { CellEditorOptions } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions'; +import { IReadonlyTextBuffer } from 'vs/editor/common/model'; +import { ILanguageService } from 'vs/editor/common/languages/language'; 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 { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { CellEditState, CellFocusMode, CellFoldingState, IActiveNotebookEditorDelegate, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { collapsedIcon, expandedIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; +import { CellEditorOptions } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions'; import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellPart'; - +import { MarkdownCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; +import { INotebookCellStatusBarService } from 'vs/workbench/contrib/notebook/common/notebookCellStatusBarService'; export class StatefulMarkdownCell extends Disposable { @@ -75,7 +73,7 @@ export class StatefulMarkdownCell extends Disposable { this.updateForHover(); this.updateForFocusModeChange(); this.foldingState = viewCell.foldingState; - this.setFoldingIndicator(); + this.layoutFoldingIndicator(); this.updateFoldingIconShowClass(); // the markdown preview's height might already be updated after the renderer calls `element.getHeight()` @@ -138,7 +136,7 @@ export class StatefulMarkdownCell extends Disposable { if (foldingState !== this.foldingState) { this.foldingState = foldingState; - this.setFoldingIndicator(); + this.layoutFoldingIndicator(); } } @@ -363,7 +361,7 @@ export class StatefulMarkdownCell extends Disposable { DOM.hide(this.editorPart); DOM.hide(this.templateData.cellInputCollapsedContainer); this.markdownAccessibilityContainer.ariaHidden = 'false'; - this.templateData.container.classList.toggle('collapsed', false); + this.templateData.container.classList.toggle('input-collapsed', false); this.templateData.container.classList.toggle('markdown-cell-edit-mode', false); this.renderedEditors.delete(this.viewCell); @@ -415,6 +413,7 @@ export class StatefulMarkdownCell extends Disposable { relayoutCell(): void { this.notebookEditor.layoutNotebookCell(this.viewCell, this.viewCell.layoutInfo.totalHeight); + this.layoutFoldingIndicator(); } updateEditorOptions(newValue: IEditorOptions): void { @@ -424,7 +423,7 @@ export class StatefulMarkdownCell extends Disposable { } } - setFoldingIndicator() { + private layoutFoldingIndicator() { switch (this.foldingState) { case CellFoldingState.None: this.templateData.foldingIndicator.innerText = ''; @@ -466,10 +465,11 @@ export class StatefulMarkdownCell extends Disposable { return; } - const primarySelection = editor.getSelection(); + const selections = editor.getSelections(); - if (primarySelection) { - this.notebookEditor.revealRangeInViewAsync(this.viewCell, primarySelection); + if (selections?.length) { + const lastSelection = selections[selections.length - 1]; + this.notebookEditor.revealRangeInViewAsync(this.viewCell, lastSelection); } })); diff --git a/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts b/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts index 85e2bf04105..f243383ea9f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts @@ -13,16 +13,17 @@ import { isMacintosh } from 'vs/base/common/platform'; import { ScrollEvent } from 'vs/base/common/scrollable'; import { Range } from 'vs/editor/common/core/range'; import { TrackedRangeStickiness } from 'vs/editor/common/model'; -import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; +import { PrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IListService, IWorkbenchListOptions, WorkbenchList } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { CellRevealPosition, CellRevealType, CursorAtBoundary, getVisibleCells, ICellViewModel, CellEditState, CellFocusMode, NOTEBOOK_CELL_LIST_FOCUSED, ICellOutputViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { CursorAtBoundary, ICellViewModel, CellEditState, CellFocusMode, ICellOutputViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { diff, NOTEBOOK_EDITOR_CURSOR_BOUNDARY, CellKind, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange, cellRangesToIndexes, reduceCellRanges, cellRangesEqual } from 'vs/workbench/contrib/notebook/common/notebookRange'; +import { NOTEBOOK_CELL_LIST_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { clamp } from 'vs/base/common/numbers'; import { ISplice } from 'vs/base/common/sequence'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; @@ -30,6 +31,42 @@ import { BaseCellRenderTemplate, INotebookCellList } from 'vs/workbench/contrib/ import { FastDomNode } from 'vs/base/browser/fastDomNode'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; +const enum CellRevealType { + Line, + Range +} + +const enum CellRevealPosition { + Top, + Center, + Bottom +} + +function getVisibleCells(cells: CellViewModel[], hiddenRanges: ICellRange[]) { + if (!hiddenRanges.length) { + return cells; + } + + let start = 0; + let hiddenRangeIndex = 0; + const result: CellViewModel[] = []; + + while (start < cells.length && hiddenRangeIndex < hiddenRanges.length) { + if (start < hiddenRanges[hiddenRangeIndex].start) { + result.push(...cells.slice(start, hiddenRanges[hiddenRangeIndex].start)); + } + + start = hiddenRanges[hiddenRangeIndex].end + 1; + hiddenRangeIndex++; + } + + if (start < cells.length) { + result.push(...cells.slice(start)); + } + + return result; +} + export interface IFocusNextPreviousDelegate { onFocusNext(applyFocusNext: () => void): void; onFocusPrevious(applyFocusPrevious: () => void): void; @@ -223,7 +260,7 @@ export class NotebookCellList extends WorkbenchList implements ID const bottomModelIndex = this._viewModel!.getCellIndex(bottomElement); if (bottomModelIndex - topModelIndex === bottomViewIndex - topViewIndex) { - this.visibleRanges = [{ start: topModelIndex, end: bottomModelIndex }]; + this.visibleRanges = [{ start: topModelIndex, end: bottomModelIndex + 1 }]; } else { this.visibleRanges = this._getVisibleRangesFromIndex(topViewIndex, topModelIndex, bottomViewIndex, bottomModelIndex); } @@ -531,9 +568,9 @@ export class NotebookCellList extends WorkbenchList implements ID // no hidden area after it if (stack.length) { if (stack[stack.length - 1] === modelIndex - 1) { - ranges.push({ start: stack[stack.length - 1], end: modelIndex }); + ranges.push({ start: stack[stack.length - 1], end: modelIndex + 1 }); } else { - ranges.push({ start: stack[stack.length - 1], end: stack[stack.length - 1] }); + ranges.push({ start: stack[stack.length - 1], end: stack[stack.length - 1] + 1 }); } } @@ -544,9 +581,9 @@ export class NotebookCellList extends WorkbenchList implements ID // there are hidden ranges after it if (stack.length) { if (stack[stack.length - 1] === modelIndex - 1) { - ranges.push({ start: stack[stack.length - 1], end: modelIndex }); + ranges.push({ start: stack[stack.length - 1], end: modelIndex + 1 }); } else { - ranges.push({ start: stack[stack.length - 1], end: stack[stack.length - 1] }); + ranges.push({ start: stack[stack.length - 1], end: stack[stack.length - 1] + 1 }); } } @@ -557,7 +594,7 @@ export class NotebookCellList extends WorkbenchList implements ID } if (stack.length) { - ranges.push({ start: stack[stack.length - 1], end: stack[stack.length - 1] }); + ranges.push({ start: stack[stack.length - 1], end: stack[stack.length - 1] + 1 }); } return reduceCellRanges(ranges); @@ -662,6 +699,11 @@ export class NotebookCellList extends WorkbenchList implements ID if (!indexes.length) { if (this._viewModel) { + if (this.length) { + // Don't allow clearing focus, #121129 + return; + } + this._viewModel.updateSelectionsState({ kind: SelectionStateType.Handle, primary: null, diff --git a/src/vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon.ts b/src/vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon.ts index 170b09b9d6b..71b4b9820c7 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon.ts @@ -10,20 +10,19 @@ import { IListOptions, IListStyles } from 'vs/base/browser/ui/list/listWidget'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ScrollEvent } from 'vs/base/common/scrollable'; -import { URI } from 'vs/base/common/uri'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Range } from 'vs/editor/common/core/range'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ICellOutputViewModel, ICellViewModel, IGenericCellViewModel, INotebookCellOutputLayoutInfo, INotebookEditorCreationOptions, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellOutputViewModel, ICellViewModel, IGenericCellViewModel, INotebookCellOutputLayoutInfo, INotebookEditorCreationOptions } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellExecutionPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution'; import { CellFocusIndicator } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator'; import { CellProgressBar } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar'; import { CellEditorStatusBar } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart'; import { BetweenCellToolbar, CellTitleToolbarPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars'; import { RunToolbar } from 'vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar'; -import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; -import { IOutputItemDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { FoldedCellHint } from 'vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint'; +import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; export interface INotebookCellList { @@ -116,6 +115,7 @@ export interface BaseCellRenderTemplate { export interface MarkdownCellRenderTemplate extends BaseCellRenderTemplate { editorContainer: HTMLElement; foldingIndicator: HTMLElement; + foldedCellHint: FoldedCellHint; currentEditor?: ICodeEditor; } @@ -134,22 +134,6 @@ export function isCodeCellRenderTemplate(templateData: BaseCellRenderTemplate): return !!(templateData as CodeCellRenderTemplate).runToolbar; } -export interface IOutputTransformContribution { - getType(): RenderOutputType; - getMimetypes(): string[]; - /** - * Dispose this contribution. - */ - dispose(): void; - - /** - * Returns contents to place in the webview inset, or the {@link IRenderNoOutput}. - * This call is allowed to have side effects, such as placing output - * directly into the container element. - */ - render(output: ICellOutputViewModel, item: IOutputItemDto, container: HTMLElement, notebookUri: URI): IRenderOutput; -} - /** * Notebook Editor Delegate for output rendering */ diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/outputRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/output/outputRenderer.ts index 67627bf240c..2f46a503668 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/outputRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/outputRenderer.ts @@ -10,11 +10,11 @@ import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ICellOutputViewModel, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { INotebookDelegateForOutput, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { ICellOutputViewModel, IOutputRenderer, IOutputTransformContribution, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { INotebookDelegateForOutput } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { OutputRendererRegistry } from 'vs/workbench/contrib/notebook/browser/view/output/rendererRegistry'; -export class OutputRenderer { +export class OutputRenderer implements IOutputRenderer { private readonly _richMimeTypeRenderers = new Map(); diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/rendererRegistry.ts b/src/vs/workbench/contrib/notebook/browser/view/output/rendererRegistry.ts index c8a4cd2508f..d9ae69b1877 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/rendererRegistry.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/rendererRegistry.ts @@ -3,10 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { BrandedService, IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; -import { INotebookDelegateForOutput, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { BrandedService, IConstructorSignature } from 'vs/platform/instantiation/common/instantiation'; +import { IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { INotebookDelegateForOutput } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; -export type IOutputTransformCtor = IConstructorSignature1; +export type IOutputTransformCtor = IConstructorSignature; export interface IOutputTransformDescription { ctor: IOutputTransformCtor; diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform.ts b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform.ts index 73e7e871db0..11f4f1c44ce 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform.ts @@ -4,52 +4,22 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; import { URI } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ILogService } from 'vs/platform/log/common/log'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { handleANSIOutput } from 'vs/workbench/contrib/debug/browser/debugANSIHandling'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; -import { ICellOutputViewModel, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { INotebookDelegateForOutput, IOutputTransformContribution as IOutputRendererContribution } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { ICellOutputViewModel, IOutputTransformContribution, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { INotebookDelegateForOutput } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { OutputRendererRegistry } from 'vs/workbench/contrib/notebook/browser/view/output/rendererRegistry'; import { truncatedArrayOfString } from 'vs/workbench/contrib/notebook/browser/view/output/transforms/textHelper'; import { IOutputItemDto, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -class JavaScriptRendererContrib extends Disposable implements IOutputRendererContribution { - getType() { - return RenderOutputType.Html; - } - - getMimetypes() { - return ['application/javascript']; - } - - constructor( - public notebookEditor: INotebookDelegateForOutput, - ) { - super(); - } - - render(output: ICellOutputViewModel, item: IOutputItemDto, container: HTMLElement, notebookUri: URI): IRenderOutput { - - const str = getStringValue(item); - const scriptVal = ``; - - return { - type: RenderOutputType.Html, - source: output, - htmlContent: scriptVal - }; - } -} - -class StreamRendererContrib extends Disposable implements IOutputRendererContribution { +class StreamRendererContrib extends Disposable implements IOutputTransformContribution { getType() { return RenderOutputType.Mainframe; } @@ -98,62 +68,7 @@ class StderrRendererContrib extends StreamRendererContrib { } } -class JSErrorRendererContrib implements IOutputRendererContribution { - - constructor( - public notebookEditor: INotebookDelegateForOutput, - @IThemeService private readonly _themeService: IThemeService, - @IInstantiationService private readonly _instantiationService: IInstantiationService, - @ILogService private readonly _logService: ILogService, - ) { } - - dispose(): void { - // nothing - } - - getType() { - return RenderOutputType.Mainframe; - } - - getMimetypes() { - return ['application/vnd.code.notebook.error']; - } - - render(_output: ICellOutputViewModel, item: IOutputItemDto, container: HTMLElement, _notebookUri: URI): IRenderOutput { - const linkDetector = this._instantiationService.createInstance(LinkDetector); - - type ErrorLike = Partial; - - - let err: ErrorLike; - try { - err = JSON.parse(getStringValue(item)); - } catch (e) { - this._logService.warn('INVALID output item (failed to parse)', e); - return { type: RenderOutputType.Mainframe }; - } - - if (err.stack) { - const stack = document.createElement('pre'); - stack.classList.add('traceback'); - stack.appendChild(handleANSIOutput(err.stack, linkDetector, this._themeService, undefined)); - container.appendChild(stack); - } else { - const header = document.createElement('div'); - const headerMessage = err.name && err.message ? `${err.name}: ${err.message}` : err.name || err.message; - if (headerMessage) { - header.innerText = headerMessage; - container.appendChild(header); - } - } - - container.classList.add('error'); - - return { type: RenderOutputType.Mainframe }; - } -} - -class PlainTextRendererContrib extends Disposable implements IOutputRendererContribution { +class PlainTextRendererContrib extends Disposable implements IOutputTransformContribution { getType() { return RenderOutputType.Mainframe; } @@ -186,69 +101,7 @@ class PlainTextRendererContrib extends Disposable implements IOutputRendererCont } } -class HTMLRendererContrib extends Disposable implements IOutputRendererContribution { - getType() { - return RenderOutputType.Html; - } - - getMimetypes() { - return ['text/html', 'image/svg+xml']; - } - - constructor( - public notebookEditor: INotebookDelegateForOutput, - ) { - super(); - } - - render(output: ICellOutputViewModel, item: IOutputItemDto, container: HTMLElement, notebookUri: URI): IRenderOutput { - const str = getStringValue(item); - return { - type: RenderOutputType.Html, - source: output, - htmlContent: str - }; - } -} - -class ImgRendererContrib extends Disposable implements IOutputRendererContribution { - getType() { - return RenderOutputType.Mainframe; - } - - getMimetypes() { - return ['image/png', 'image/jpeg', 'image/gif']; - } - - constructor( - public notebookEditor: INotebookDelegateForOutput, - ) { - super(); - } - - render(output: ICellOutputViewModel, item: IOutputItemDto, container: HTMLElement, notebookUri: URI): IRenderOutput { - const disposable = new DisposableStore(); - - const blob = new Blob([item.data.buffer], { type: item.mime }); - const src = URL.createObjectURL(blob); - disposable.add(toDisposable(() => URL.revokeObjectURL(src))); - - const image = document.createElement('img'); - image.src = src; - const display = document.createElement('div'); - display.classList.add('display'); - display.appendChild(image); - container.appendChild(display); - - return { type: RenderOutputType.Mainframe, disposable }; - } -} - -OutputRendererRegistry.registerOutputTransform(JavaScriptRendererContrib); -OutputRendererRegistry.registerOutputTransform(HTMLRendererContrib); -OutputRendererRegistry.registerOutputTransform(ImgRendererContrib); OutputRendererRegistry.registerOutputTransform(PlainTextRendererContrib); -OutputRendererRegistry.registerOutputTransform(JSErrorRendererContrib); OutputRendererRegistry.registerOutputTransform(StreamRendererContrib); OutputRendererRegistry.registerOutputTransform(StderrRendererContrib); diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/textHelper.ts b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/textHelper.ts index 20611c73370..add36da8ea3 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/textHelper.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/textHelper.ts @@ -90,15 +90,15 @@ export function truncatedArrayOfString(notebookUri: URI, cellViewModel: IGeneric container.appendChild(generateViewMoreElement(notebookUri, cellViewModel, outputId, disposables, openerService)); - const pre = DOM.$('pre'); - container.appendChild(pre); - pre.appendChild(handleANSIOutput(buffer.getValueInRange(new Range(1, 1, linesLimit - 5, buffer.getLineLastNonWhitespaceColumn(linesLimit - 5)), EndOfLinePreference.TextDefined), linkDetector, themeService, undefined)); + const div = DOM.$('div'); + container.appendChild(div); + div.appendChild(handleANSIOutput(buffer.getValueInRange(new Range(1, 1, linesLimit - 5, buffer.getLineLastNonWhitespaceColumn(linesLimit - 5)), EndOfLinePreference.TextDefined), linkDetector, themeService, undefined)); // view more ... DOM.append(container, DOM.$('span' + Codicon.toolBarMore.cssSelector)); const lineCount = buffer.getLineCount(); - const pre2 = DOM.$('div'); - container.appendChild(pre2); - pre2.appendChild(handleANSIOutput(buffer.getValueInRange(new Range(lineCount - 5, 1, lineCount, buffer.getLineLastNonWhitespaceColumn(lineCount)), EndOfLinePreference.TextDefined), linkDetector, themeService, undefined)); + const div2 = DOM.$('div'); + container.appendChild(div2); + div2.appendChild(handleANSIOutput(buffer.getValueInRange(new Range(lineCount - 5, 1, lineCount, buffer.getLineLastNonWhitespaceColumn(lineCount)), EndOfLinePreference.TextDefined), linkDetector, themeService, undefined)); } 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 45730943dcf..340ea034325 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -16,9 +16,9 @@ import { dirname, joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import * as UUID from 'vs/base/common/uuid'; import { TokenizationRegistry } from 'vs/editor/common/languages'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { generateTokensCSSForColorMap } from 'vs/editor/common/languages/supports/tokenization'; import { tokenizeToString } from 'vs/editor/common/languages/textToHtmlTokenizer'; -import { ILanguageService } from 'vs/editor/common/services/language'; import * as nls from 'vs/nls'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; @@ -28,11 +28,10 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IFileService } from 'vs/platform/files/common/files'; import { IOpenerService, matchesScheme, matchesSomeScheme } from 'vs/platform/opener/common/opener'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; -import { asWebviewUri, webviewGenericCspSource } from 'vs/workbench/api/common/shared/webview'; -import { CellEditState, ICellOutputViewModel, ICellViewModel, ICommonCellInfo, IDisplayOutputLayoutUpdateRequest, IDisplayOutputViewModel, IFocusNotebookCellOptions, IGenericCellViewModel, IInsetRenderOutput, INotebookEditorCreationOptions, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { asWebviewUri, webviewGenericCspSource } from 'vs/workbench/common/webview'; +import { CellEditState, ICellOutputViewModel, ICellViewModel, ICommonCellInfo, IDisplayOutputLayoutUpdateRequest, IDisplayOutputViewModel, IFocusNotebookCellOptions, IGenericCellViewModel, IInsetRenderOutput, INotebookEditorCreationOptions, INotebookWebviewMessage, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { preloadsScriptStr, RendererMetadata } from 'vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads'; import { transformWebviewThemeVars } from 'vs/workbench/contrib/notebook/browser/view/renderers/webviewThemeMapping'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; @@ -51,10 +50,6 @@ export interface ICachedInset { cachedCreation: ICreationRequestMessage; } -export interface INotebookWebviewMessage { - message: unknown; -} - export interface IResolvedBackLayerWebview { webview: IWebviewElement; } @@ -73,9 +68,9 @@ export interface INotebookDelegateForWebview { scheduleOutputHeightAck(cellInfo: ICommonCellInfo, outputId: string, height: number): void; updateMarkupCellHeight(cellId: string, height: number, isInit: boolean): void; setMarkupCellEditState(cellId: string, editState: CellEditState): void; - didStartDragMarkupCell(cellId: string, event: { dragOffsetY: number; }): void; - didDragMarkupCell(cellId: string, event: { dragOffsetY: number; }): void; - didDropMarkupCell(cellId: string, event: { dragOffsetY: number, ctrlKey: boolean, altKey: boolean; }): void; + didStartDragMarkupCell(cellId: string, event: { dragOffsetY: number }): void; + didDragMarkupCell(cellId: string, event: { dragOffsetY: number }): void; + didDropMarkupCell(cellId: string, event: { dragOffsetY: number; ctrlKey: boolean; altKey: boolean }): void; didEndDragMarkupCell(cellId: string): void; setScrollTop(scrollTop: number): void; triggerScroll(event: IMouseWheelEvent): void; @@ -127,7 +122,6 @@ export class BackLayerWebView extends Disposable { @IContextMenuService private readonly contextMenuService: IContextMenuService, @IMenuService private readonly menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, - @ITelemetryService private readonly telemetryService: ITelemetryService, @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService, @IConfigurationService private readonly configurationService: IConfigurationService, @ILanguageService private readonly languageService: ILanguageService, @@ -419,7 +413,7 @@ export class BackLayerWebView extends Disposable { }); } - private resolveOutputId(id: string): { cellInfo: T, output: ICellOutputViewModel } | undefined { + private resolveOutputId(id: string): { cellInfo: T; output: ICellOutputViewModel } | undefined { const output = this.reversedInsetMapping.get(id); if (!output) { return; @@ -602,6 +596,7 @@ var requirejs = (function() { const latestCell = this.notebookEditor.getCellByInfo(resolvedResult.cellInfo); if (latestCell) { latestCell.outputIsFocused = true; + this.notebookEditor.focusNotebookCell(latestCell, 'container', { skipReveal: true }); } } break; @@ -658,7 +653,7 @@ var requirejs = (function() { case 'clicked-link': { let linkToOpen: URI | string | undefined; - if (matchesSomeScheme(data.href, Schemas.http, Schemas.https, Schemas.mailto, Schemas.command, Schemas.vscodeNotebookCell, Schemas.vscodeNotebook, Schemas.file)) { + if (matchesSomeScheme(data.href, Schemas.http, Schemas.https, Schemas.mailto, Schemas.command, Schemas.vscodeNotebookCell, Schemas.vscodeNotebook)) { linkToOpen = data.href; } else if (!/^[\w\-]+:/.test(data.href)) { if (this.documentUri.scheme === Schemas.untitled) { @@ -816,26 +811,6 @@ var requirejs = (function() { } break; } - case 'telemetryFoundRenderedMarkdownMath': - { - this.telemetryService.publicLog2<{}, {}>('notebook/markdown/renderedLatex', {}); - break; - } - case 'telemetryFoundUnrenderedMarkdownMath': - { - type Classification = { - latexDirective: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; - }; - - type TelemetryEvent = { - latexDirective: string; - }; - - this.telemetryService.publicLog2('notebook/markdown/foundUnrenderedLatex', { - latexDirective: data.latexDirective - }); - break; - } } })); } @@ -952,7 +927,7 @@ var requirejs = (function() { }); } - updateScrollTops(outputRequests: IDisplayOutputLayoutUpdateRequest[], markupPreviews: { id: string, top: number }[]) { + updateScrollTops(outputRequests: IDisplayOutputLayoutUpdateRequest[], markupPreviews: { id: string; top: number }[]) { if (this._disposed) { return; } @@ -1291,7 +1266,7 @@ var requirejs = (function() { }, 50); } - async find(query: string, options: { wholeWord?: boolean; caseSensitive?: boolean; includeMarkup: boolean; includeOutput: boolean; }): Promise { + async find(query: string, options: { wholeWord?: boolean; caseSensitive?: boolean; includeMarkup: boolean; includeOutput: boolean }): Promise { if (query === '') { return []; } 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 f7a70492805..c3461d60c59 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -17,7 +17,7 @@ import { EditorOption, IEditorOptions } from 'vs/editor/common/config/editorOpti import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { Range } from 'vs/editor/common/core/range'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import * as modes from 'vs/editor/common/languages'; +import * as languages from 'vs/editor/common/languages'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; import { tokenizeLineToHTML } from 'vs/editor/common/languages/textToHtmlTokenizer'; import { ITextModel } from 'vs/editor/common/model'; @@ -42,11 +42,12 @@ import { CellEditorStatusBar } from 'vs/workbench/contrib/notebook/browser/view/ import { BetweenCellToolbar, CellTitleToolbarPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars'; import { CodeCell } from 'vs/workbench/contrib/notebook/browser/view/cellParts/codeCell'; import { RunToolbar } from 'vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar'; +import { FoldedCellHint } from 'vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint'; import { StatefulMarkdownCell } from 'vs/workbench/contrib/notebook/browser/view/cellParts/markdownCell'; import { BaseCellRenderTemplate, CodeCellRenderTemplate, MarkdownCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; -import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; const $ = DOM.$; @@ -179,6 +180,7 @@ export class MarkupCellRenderer extends AbstractCellRenderer implements IListRen const betweenCellToolbar = templateDisposables.add(scopedInstaService.createInstance(BetweenCellToolbar, this.notebookEditor, titleToolbarContainer, bottomCellContainer)); const focusIndicatorBottom = new FastDomNode(DOM.append(container, $('.cell-focus-indicator.cell-focus-indicator-bottom'))); const statusBar = templateDisposables.add(this.instantiationService.createInstance(CellEditorStatusBar, this.notebookEditor, container, editorPart)); + const foldedCellHint = templateDisposables.add(scopedInstaService.createInstance(FoldedCellHint, this.notebookEditor, DOM.append(container, $('.notebook-folded-hint')))); const templateData: MarkdownCellRenderTemplate = { rootContainer, @@ -196,6 +198,7 @@ export class MarkupCellRenderer extends AbstractCellRenderer implements IListRen betweenCellToolbar, titleToolbar, statusBar, + foldedCellHint, toJSON: () => { return {}; } }; @@ -224,7 +227,8 @@ export class MarkupCellRenderer extends AbstractCellRenderer implements IListRen templateData.betweenCellToolbar, templateData.titleToolbar, templateData.statusBar, - templateData.focusIndicator + templateData.focusIndicator, + templateData.foldedCellHint ], this.renderedEditors)); } @@ -256,8 +260,8 @@ class EditorTextRenderer { const fontWeightVar = '--notebook-editor-font-weight'; const style = `` - + `color: ${colorMap[modes.ColorId.DefaultForeground]};` - + `background-color: ${colorMap[modes.ColorId.DefaultBackground]};` + + `color: ${colorMap[languages.ColorId.DefaultForeground]};` + + `background-color: ${colorMap[languages.ColorId.DefaultBackground]};` + `font-family: var(${fontFamilyVar});` + `font-weight: var(${fontWeightVar});` + `font-size: var(${fontSizeVar});` @@ -304,7 +308,7 @@ class EditorTextRenderer { } private getDefaultColorMap(): string[] { - const colorMap = modes.TokenizationRegistry.getColorMap(); + const colorMap = languages.TokenizationRegistry.getColorMap(); const result: string[] = ['#000000']; if (colorMap) { for (let i = 1, len = colorMap.length; i < len; i++) { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts index 84e0286eef3..7b6b0faf039 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts @@ -58,7 +58,7 @@ export interface IWheelMessage extends BaseToWebviewMessage { export interface IScrollAckMessage extends BaseToWebviewMessage { readonly type: 'scroll-ack'; - readonly data: { top: number; }; + readonly data: { top: number }; readonly version: number; } @@ -150,15 +150,6 @@ export interface IRenderedMarkupMessage extends BaseToWebviewMessage { }>; } -export interface ITelemetryFoundRenderedMarkdownMath extends BaseToWebviewMessage { - readonly type: 'telemetryFoundRenderedMarkdownMath'; -} - -export interface ITelemetryFoundUnrenderedMarkdownMath extends BaseToWebviewMessage { - readonly type: 'telemetryFoundUnrenderedMarkdownMath'; - readonly latexDirective: string; -} - export interface IClearMessage { readonly type: 'clear'; } @@ -167,22 +158,22 @@ export interface IOutputRequestMetadata { /** * Additional attributes of a cell metadata. */ - readonly custom?: { readonly [key: string]: unknown; }; + readonly custom?: { readonly [key: string]: unknown }; } export interface IOutputRequestDto { /** * { mime_type: value } */ - readonly data: { readonly [key: string]: unknown; }; + readonly data: { readonly [key: string]: unknown }; readonly metadata?: IOutputRequestMetadata; readonly outputId: string; } export type ICreationContent = - | { readonly type: RenderOutputType.Html; readonly htmlContent: string; } - | { readonly type: RenderOutputType.Extension; readonly outputId: string; readonly valueBytes: Uint8Array; readonly metadata: unknown; readonly mimeType: string; }; + | { readonly type: RenderOutputType.Html; readonly htmlContent: string } + | { readonly type: RenderOutputType.Extension; readonly outputId: string; readonly valueBytes: Uint8Array; readonly metadata: unknown; readonly mimeType: string }; export interface ICreationRequestMessage { readonly type: 'html'; @@ -367,7 +358,7 @@ export interface ITokenizedStylesChangedMessage { export interface IFindMessage { readonly type: 'find'; readonly query: string; - readonly options: { wholeWord?: boolean; caseSensitive?: boolean; includeMarkup: boolean; includeOutput: boolean; } + readonly options: { wholeWord?: boolean; caseSensitive?: boolean; includeMarkup: boolean; includeOutput: boolean }; } @@ -427,8 +418,6 @@ export type FromWebviewMessage = WebviewInitialized | ICellDragEndMessage | IInitializedMarkupMessage | IRenderedMarkupMessage | - ITelemetryFoundRenderedMarkdownMath | - ITelemetryFoundUnrenderedMarkdownMath | IDidFindMessage | IDidFindHighlightMessage; diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index dafa2d22e1c..58d19551791 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -14,14 +14,14 @@ import type * as webviewMessages from 'vs/workbench/contrib/notebook/browser/vie declare module globalThis { const acquireVsCodeApi: () => ({ - getState(): { [key: string]: unknown; }; - setState(data: { [key: string]: unknown; }): void; + getState(): { [key: string]: unknown }; + setState(data: { [key: string]: unknown }): void; postMessage: (msg: unknown) => void; }); } declare class ResizeObserver { - constructor(onChange: (entries: { target: HTMLElement, contentRect?: ClientRect; }[]) => void); + constructor(onChange: (entries: { target: HTMLElement; contentRect?: ClientRect }[]) => void); observe(element: Element): void; disconnect(): void; } @@ -41,7 +41,7 @@ declare namespace CSS { } -type Listener = { fn: (evt: T) => void; thisArg: unknown; }; +type Listener = { fn: (evt: T) => void; thisArg: unknown }; interface EmitterLike { fire(data: T): void; @@ -82,6 +82,16 @@ async function webviewPreloads(ctx: PreloadContext) { return; } + for (const node of event.composedPath()) { + if (node instanceof HTMLElement && node.classList.contains('output')) { + // output + postNotebookMessage('outputFocus', { + id: node.id, + }); + break; + } + } + for (const node of event.composedPath()) { if (node instanceof HTMLAnchorElement && node.href) { if (node.href.startsWith('blob:')) { @@ -277,7 +287,7 @@ async function webviewPreloads(ctx: PreloadContext) { private readonly _observer: ResizeObserver; - private readonly _observedElements = new WeakMap(); + private readonly _observedElements = new WeakMap(); constructor() { this._observer = new ResizeObserver(entries => { @@ -324,7 +334,7 @@ async function webviewPreloads(ctx: PreloadContext) { function scrollWillGoToParent(event: WheelEvent) { for (let node = event.target as Node | null; node; node = node.parentNode) { - if (!(node instanceof Element) || node.id === 'container' || node.classList.contains('cell_container') || node.classList.contains('output_container')) { + if (!(node instanceof Element) || node.id === 'container' || node.classList.contains('cell_container') || node.classList.contains('markup') || node.classList.contains('output_container')) { return false; } @@ -340,7 +350,7 @@ async function webviewPreloads(ctx: PreloadContext) { return false; } - const handleWheel = (event: WheelEvent & { wheelDeltaX?: number, wheelDeltaY?: number, wheelDelta?: number }) => { + const handleWheel = (event: WheelEvent & { wheelDeltaX?: number; wheelDeltaY?: number; wheelDelta?: number }) => { if (event.defaultPrevented || scrollWillGoToParent(event)) { return; } @@ -394,17 +404,6 @@ async function webviewPreloads(ctx: PreloadContext) { }); } - function isAncestor(testChild: Node | null, testAncestor: Node | null): boolean { - while (testChild) { - if (testChild === testAncestor) { - return true; - } - testChild = testChild.parentNode; - } - - return false; - } - function _internalHighlightRange(range: Range, tagName = 'mark', attributes = {}) { // derived from https://github.com/Treora/dom-highlight-range/blob/master/highlight-range.js @@ -540,18 +539,18 @@ async function webviewPreloads(ctx: PreloadContext) { } interface ICommonRange { - collapsed: boolean, - commonAncestorContainer: Node, - endContainer: Node, - endOffset: number, - startContainer: Node, - startOffset: number + collapsed: boolean; + commonAncestorContainer: Node; + endContainer: Node; + endOffset: number; + startContainer: Node; + startOffset: number; } interface IHighlightResult { range: ICommonRange; - dispose: () => void, + dispose: () => void; update: (color: string | undefined, className: string | undefined) => void; } @@ -628,64 +627,6 @@ async function webviewPreloads(ctx: PreloadContext) { } } - class OutputFocusTracker { - private _outputId: string; - private _hasFocus: boolean = false; - private _loosingFocus: boolean = false; - private _element: HTMLElement | Window; - constructor(element: HTMLElement | Window, outputId: string) { - this._element = element; - this._outputId = outputId; - this._hasFocus = isAncestor(document.activeElement, element); - this._loosingFocus = false; - - element.addEventListener('focus', this._onFocus.bind(this), true); - element.addEventListener('blur', this._onBlur.bind(this), true); - } - - private _onFocus() { - this._loosingFocus = false; - if (!this._hasFocus) { - this._hasFocus = true; - postNotebookMessage('outputFocus', { - id: this._outputId, - }); - } - } - - private _onBlur() { - if (this._hasFocus) { - this._loosingFocus = true; - window.setTimeout(() => { - if (this._loosingFocus) { - this._loosingFocus = false; - this._hasFocus = false; - postNotebookMessage('outputBlur', { - id: this._outputId, - }); - } - }, 0); - } - } - - dispose() { - if (this._element) { - this._element.removeEventListener('focus', this._onFocus, true); - this._element.removeEventListener('blur', this._onBlur, true); - } - } - } - - const outputFocusTrackers = new Map(); - - function addOutputFocusTracker(element: HTMLElement, outputId: string): void { - if (outputFocusTrackers.has(outputId)) { - outputFocusTrackers.get(outputId)?.dispose(); - } - - outputFocusTrackers.set(outputId, new OutputFocusTracker(element, outputId)); - } - function createEmitter(listenerChange: (listeners: Set>) => void = () => undefined): EmitterLike { const listeners = new Set>(); return { @@ -785,13 +726,13 @@ async function webviewPreloads(ctx: PreloadContext) { window.addEventListener('wheel', handleWheel); interface IFindMatch { - type: 'preview' | 'output', - id: string, - cellId: string, - container: Node, - originalRange: Range, - isShadow: boolean, - highlightResult?: IHighlightResult + type: 'preview' | 'output'; + id: string; + cellId: string; + container: Node; + originalRange: Range; + isShadow: boolean; + highlightResult?: IHighlightResult; } interface IHighlighter { @@ -920,7 +861,7 @@ async function webviewPreloads(ctx: PreloadContext) { } } - const find = (query: string, options: { wholeWord?: boolean; caseSensitive?: boolean; includeMarkup: boolean; includeOutput: boolean; }) => { + const find = (query: string, options: { wholeWord?: boolean; caseSensitive?: boolean; includeMarkup: boolean; includeOutput: boolean }) => { let find = true; let matches: IFindMatch[] = []; @@ -1060,7 +1001,7 @@ async function webviewPreloads(ctx: PreloadContext) { }; window.addEventListener('message', async rawEvent => { - const event = rawEvent as ({ data: webviewMessages.ToWebviewMessage; }); + const event = rawEvent as ({ data: webviewMessages.ToWebviewMessage }); switch (event.data.type) { case 'initializeMarkup': @@ -1123,11 +1064,6 @@ async function webviewPreloads(ctx: PreloadContext) { renderers.clearAll(); viewModel.clearAll(); document.getElementById('container')!.innerText = ''; - - outputFocusTrackers.forEach(ft => { - ft.dispose(); - }); - outputFocusTrackers.clear(); break; case 'clearOutput': { @@ -1457,9 +1393,6 @@ async function webviewPreloads(ctx: PreloadContext) { } }(); - let hasPostedRenderedMathTelemetry = false; - const unsupportedKatexTermsRegex = /(\\(?:abovewithdelims|array|Arrowvert|arrowvert|atopwithdelims|bbox|bracevert|buildrel|cancelto|cases|class|cssId|ddddot|dddot|DeclareMathOperator|definecolor|displaylines|enclose|eqalign|eqalignno|eqref|hfil|hfill|idotsint|iiiint|label|leftarrowtail|leftroot|leqalignno|lower|mathtip|matrix|mbox|mit|mmlToken|moveleft|moveright|mspace|newenvironment|Newextarrow|notag|oldstyle|overparen|overwithdelims|pmatrix|raise|ref|renewenvironment|require|root|Rule|scr|shoveleft|shoveright|sideset|skew|Space|strut|style|texttip|Tiny|toggle|underparen|unicode|uproot)\b)/gi; - const viewModel = new class ViewModel { private readonly _markupCells = new Map(); @@ -1748,27 +1681,6 @@ async function webviewPreloads(ctx: PreloadContext) { await renderers.render(this, this.element); - if (this.mime === 'text/markdown' || this.mime === 'text/latex') { - const root = this.element.shadowRoot; - if (root) { - if (!hasPostedRenderedMathTelemetry) { - const hasRenderedMath = root.querySelector('.katex'); - if (hasRenderedMath) { - hasPostedRenderedMathTelemetry = true; - postNotebookMessage('telemetryFoundRenderedMarkdownMath', {}); - } - } - - const innerText = root.querySelector('#preview')?.innerText; - const matches = innerText?.match(unsupportedKatexTermsRegex); - if (matches) { - postNotebookMessage('telemetryFoundUnrenderedMarkdownMath', { - latexDirective: matches[0], - }); - } - } - } - const root = (this.element.shadowRoot ?? this.element); const html = []; for (const child of root.children) { @@ -1785,7 +1697,7 @@ async function webviewPreloads(ctx: PreloadContext) { } } - const codeBlocks: Array<{ value: string, lang: string, id: string }> = []; + const codeBlocks: Array<{ value: string; lang: string; id: string }> = []; let i = 0; for (const el of root.querySelectorAll('.vscode-code-block')) { const lang = el.getAttribute('data-vscode-code-block-lang'); @@ -2001,7 +1913,7 @@ async function webviewPreloads(ctx: PreloadContext) { public readonly element: HTMLElement; - private _content?: { content: webviewMessages.ICreationContent, preloadsAndErrors: unknown[] }; + private _content?: { content: webviewMessages.ICreationContent; preloadsAndErrors: unknown[] }; private hasResizeObserver = false; constructor( @@ -2017,7 +1929,6 @@ async function webviewPreloads(ctx: PreloadContext) { this.element.style.padding = '0px'; addMouseoverListeners(this.element, outputId); - addOutputFocusTracker(this.element, outputId); } @@ -2072,7 +1983,7 @@ async function webviewPreloads(ctx: PreloadContext) { const markupCellDragManager = new class MarkupCellDragManager { - private currentDrag: { cellId: string, clientY: number } | undefined; + private currentDrag: { cellId: string; clientY: number } | undefined; // Transparent overlay that prevents elements from inside the webview from eating // drag events. diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts index 0cbafc68992..a5f73d4c626 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, IDisposable, IReference } from 'vs/base/common/lifecycle'; +import { Disposable, dispose, IDisposable, IReference } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -18,7 +18,8 @@ import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/se import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { IWordWrapTransientState, readTransientState, writeTransientState } from 'vs/workbench/contrib/codeEditor/browser/toggleWordWrap'; -import { CellEditState, CellFocusMode, CellViewModelStateChangeEvent, CursorAtBoundary, IEditableCellViewModel, INotebookCellDecorationOptions } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, CellFocusMode, CursorAtBoundary, IEditableCellViewModel, INotebookCellDecorationOptions } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { CellKind, INotebookCellStatusBarItem, INotebookSearchOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -119,8 +120,8 @@ export abstract class BaseCellViewModel extends Disposable { private _editorTransientState: IWordWrapTransientState | null = null; private _resolvedCellDecorations = new Map(); - private readonly _cellDecorationsChanged = this._register(new Emitter<{ added: INotebookCellDecorationOptions[], removed: INotebookCellDecorationOptions[] }>()); - onCellDecorationsChanged: Event<{ added: INotebookCellDecorationOptions[], removed: INotebookCellDecorationOptions[] }> = this._cellDecorationsChanged.event; + private readonly _cellDecorationsChanged = this._register(new Emitter<{ added: INotebookCellDecorationOptions[]; removed: INotebookCellDecorationOptions[] }>()); + onCellDecorationsChanged: Event<{ added: INotebookCellDecorationOptions[]; removed: INotebookCellDecorationOptions[] }> = this._cellDecorationsChanged.event; private _resolvedDecorations = new Map e.dispose()); + dispose(this._editorListeners); this._editorListeners = []; this._onDidChangeEditorAttachState.fire(); @@ -597,7 +598,7 @@ export abstract class BaseCellViewModel extends Disposable { override dispose() { super.dispose(); - this._editorListeners.forEach(e => e.dispose()); + dispose(this._editorListeners); this._undoRedoService.removeElements(this.uri); if (this._textModelRef) { diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts index e61115a9115..e981ade1b2b 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts @@ -9,10 +9,10 @@ import * as UUID from 'vs/base/common/uuid'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; +import { PrefixSumComputer } from 'vs/editor/common/model/prefixSumComputer'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { CellEditState, CellFindMatch, CodeCellLayoutChangeEvent, CodeCellLayoutInfo, CellLayoutState, ICellOutputViewModel, ICellViewModel, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, CellFindMatch, CodeCellLayoutChangeEvent, CodeCellLayoutInfo, CellLayoutState, ICellOutputViewModel, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellOutputViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/cellOutputViewModel'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; @@ -21,6 +21,7 @@ import { INotebookKeymapService } from 'vs/workbench/contrib/notebook/common/not import { NotebookOptionsChangeEvent } from 'vs/workbench/contrib/notebook/common/notebookOptions'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { BaseCellViewModel } from './baseCellViewModel'; +import { NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; export class CodeCellViewModel extends BaseCellViewModel implements ICellViewModel { readonly cellKind = CellKind.Code; diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher.ts index b8a1cfebf01..798931f6a84 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; -import { NotebookLayoutChangedEvent, NotebookMetadataChangedEvent, NotebookCellStateChangedEvent, NotebookViewEvent, NotebookViewEventType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { Disposable } from 'vs/base/common/lifecycle'; +import { NotebookCellStateChangedEvent, NotebookLayoutChangedEvent, NotebookMetadataChangedEvent, NotebookViewEvent, NotebookViewEventType } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; export class NotebookEventDispatcher extends Disposable { private readonly _onDidChangeLayout = this._register(new Emitter()); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/foldingModel.ts similarity index 94% rename from src/vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel.ts rename to src/vs/workbench/contrib/notebook/browser/viewModel/foldingModel.ts index 3c2a0f21243..4f8950963cf 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/foldingModel.ts @@ -6,9 +6,9 @@ import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { TrackedRangeStickiness } from 'vs/editor/common/model'; -import { FoldingRegion, FoldingRegions } from 'vs/editor/contrib/folding/foldingRanges'; -import { IFoldingRangeData, sanitizeRanges } from 'vs/editor/contrib/folding/syntaxRangeProvider'; -import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { FoldingRegion, FoldingRegions } from 'vs/editor/contrib/folding/browser/foldingRanges'; +import { IFoldingRangeData, sanitizeRanges } from 'vs/editor/contrib/folding/browser/syntaxRangeProvider'; +import { INotebookViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { cellRangesToIndexes, ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; @@ -17,7 +17,7 @@ type RegionFilterWithLevel = (r: FoldingRegion, level: number) => boolean; export class FoldingModel implements IDisposable { - private _viewModel: NotebookViewModel | null = null; + private _viewModel: INotebookViewModel | null = null; private readonly _viewModelStore = new DisposableStore(); private _regions: FoldingRegions; get regions() { @@ -43,7 +43,7 @@ export class FoldingModel implements IDisposable { this._viewModel = null; } - attachViewModel(model: NotebookViewModel) { + attachViewModel(model: INotebookViewModel) { this._viewModel = model; this._viewModelStore.add(this._viewModel.onDidChangeViewCells(() => { @@ -154,7 +154,7 @@ export class FoldingModel implements IDisposable { const viewModel = this._viewModel; const cells = viewModel.viewCells; - const stack: { index: number, level: number, endIndex: number }[] = []; + const stack: { index: number; level: number; endIndex: number }[] = []; for (let i = 0; i < cells.length; i++) { const cell = cells[i]; @@ -310,17 +310,6 @@ export class FoldingModel implements IDisposable { } } -export enum CellFoldingState { - None, - Expanded, - Collapsed -} - -export interface EditorFoldingStateDelegate { - getCellIndex(cell: CellViewModel): number; - getFoldingState(index: number): CellFoldingState; -} - export function updateFoldingStateAtIndex(foldingModel: FoldingModel, index: number, collapsed: boolean) { const range = foldingModel.regions.findRange(index + 1); foldingModel.setCollapsed(range, collapsed); diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts index 50b9c59248a..45cc99536f3 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel.ts @@ -7,8 +7,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import * as UUID from 'vs/base/common/uuid'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { EditorFoldingStateDelegate } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; -import { CellEditState, CellFindMatch, CellLayoutState, ICellOutputViewModel, ICellViewModel, MarkdownCellLayoutChangeEvent, MarkdownCellLayoutInfo, NotebookCellStateChangedEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, CellFindMatch, CellFoldingState, CellLayoutContext, CellLayoutState, EditorFoldingStateDelegate, ICellOutputViewModel, ICellViewModel, MarkdownCellLayoutChangeEvent, MarkdownCellLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { CellKind, INotebookSearchOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -18,6 +17,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { NotebookOptionsChangeEvent } from 'vs/workbench/contrib/notebook/common/notebookOptions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { NotebookCellStateChangedEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewModel { @@ -40,25 +40,14 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM private _previewHeight = 0; set renderedMarkdownHeight(newHeight: number) { - if (this.getEditState() === CellEditState.Preview) { - this._previewHeight = newHeight; - const { bottomToolbarGap } = this.viewContext.notebookOptions.computeBottomToolbarDimensions(this.viewType); - - this._updateTotalHeight(this._previewHeight + bottomToolbarGap); - } + this._previewHeight = newHeight; + this._updateTotalHeight(this._computeTotalHeight()); } private _editorHeight = 0; set editorHeight(newHeight: number) { this._editorHeight = newHeight; - const layoutConfiguration = this.viewContext.notebookOptions.getLayoutConfiguration(); - const { bottomToolbarGap } = this.viewContext.notebookOptions.computeBottomToolbarDimensions(this.viewType); - - this._updateTotalHeight(this._editorHeight - + layoutConfiguration.markdownCellTopMargin // MARKDOWN_CELL_TOP_MARGIN - + layoutConfiguration.markdownCellBottomMargin // MARKDOWN_CELL_BOTTOM_MARGIN - + bottomToolbarGap // BOTTOM_CELL_TOOLBAR_GAP - + this.viewContext.notebookOptions.computeStatusBarHeight()); + this._updateTotalHeight(this._computeTotalHeight()); } get editorHeight() { @@ -125,32 +114,47 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM : 0, bottomToolbarOffset: bottomToolbarGap, totalHeight: 100, - layoutState: CellLayoutState.Uninitialized + layoutState: CellLayoutState.Uninitialized, + foldHintHeight: 0 }; this._register(this.onDidChangeState(e => { - this.viewContext.eventDispatcher.emit([new NotebookCellStateChangedEvent(e, this)]); + this.viewContext.eventDispatcher.emit([new NotebookCellStateChangedEvent(e, this.model)]); + + if (e.foldingStateChanged) { + this._updateTotalHeight(this._computeTotalHeight(), CellLayoutContext.Fold); + } })); } + private _computeTotalHeight(): number { + const layoutConfiguration = this.viewContext.notebookOptions.getLayoutConfiguration(); + const { bottomToolbarGap } = this.viewContext.notebookOptions.computeBottomToolbarDimensions(this.viewType); + const foldHintHeight = this._computeFoldHintHeight(); + + if (this.getEditState() === CellEditState.Editing) { + return this._editorHeight + + layoutConfiguration.markdownCellTopMargin + + layoutConfiguration.markdownCellBottomMargin + + bottomToolbarGap + + this.viewContext.notebookOptions.computeStatusBarHeight(); + } else { + // @rebornix + // On file open, the previewHeight + bottomToolbarGap for a cell out of viewport can be 0 + // When it's 0, the list view will never try to render it anymore even if we scroll the cell into view. + // Thus we make sure it's greater than 0 + return Math.max(1, this._previewHeight + bottomToolbarGap + foldHintHeight); + } + } + + private _computeFoldHintHeight(): number { + return (this.getEditState() === CellEditState.Editing || this.foldingState !== CellFoldingState.Collapsed) ? + 0 : this.viewContext.notebookOptions.getLayoutConfiguration().markdownFoldHintHeight; + } + updateOptions(e: NotebookOptionsChangeEvent) { if (e.cellStatusBarVisibility || e.insertToolbarPosition || e.cellToolbarLocation) { - const layoutConfiguration = this.viewContext.notebookOptions.getLayoutConfiguration(); - const { bottomToolbarGap } = this.viewContext.notebookOptions.computeBottomToolbarDimensions(this.viewType); - - if (this.getEditState() === CellEditState.Editing) { - this._updateTotalHeight(this._editorHeight - + layoutConfiguration.markdownCellTopMargin - + layoutConfiguration.markdownCellBottomMargin - + bottomToolbarGap - + this.viewContext.notebookOptions.computeStatusBarHeight()); - } else { - // @rebornix - // On file open, the previewHeight + bottomToolbarGap for a cell out of viewport can be 0 - // When it's 0, the list view will never try to render it anymore even if we scroll the cell into view. - // Thus we make sure it's greater than 0 - this._updateTotalHeight(Math.max(1, this._previewHeight + bottomToolbarGap)); - } + this._updateTotalHeight(this._computeTotalHeight()); } } @@ -166,18 +170,19 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM // throw new Error('Method not implemented.'); } - triggerfoldingStateChange() { + triggerFoldingStateChange() { this._onDidChangeState.fire({ foldingStateChanged: true }); } - private _updateTotalHeight(newHeight: number) { + private _updateTotalHeight(newHeight: number, context?: CellLayoutContext) { if (newHeight !== this.layoutInfo.totalHeight) { - this.layoutChange({ totalHeight: newHeight }); + this.layoutChange({ totalHeight: newHeight, context }); } } layoutChange(state: MarkdownCellLayoutChangeEvent) { // recompute + const foldHintHeight = this._computeFoldHintHeight(); if (!this.isInputCollapsed) { const editorWidth = state.outerWidth !== undefined ? this.viewContext.notebookOptions.computeMarkdownCellEditorWidth(state.outerWidth) @@ -194,7 +199,8 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM editorHeight: this._editorHeight, bottomToolbarOffset: this.viewContext.notebookOptions.computeBottomToolbarOffset(totalHeight, this.viewType), totalHeight, - layoutState: CellLayoutState.Measured + layoutState: CellLayoutState.Measured, + foldHintHeight }; } else { const editorWidth = state.outerWidth !== undefined @@ -211,7 +217,8 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM previewHeight: this._previewHeight, bottomToolbarOffset: this.viewContext.notebookOptions.computeBottomToolbarOffset(totalHeight, this.viewType), totalHeight, - layoutState: CellLayoutState.Measured + layoutState: CellLayoutState.Measured, + foldHintHeight: 0 }; } @@ -229,7 +236,8 @@ export class MarkupCellViewModel extends BaseCellViewModel implements ICellViewM bottomToolbarOffset: this._layoutInfo.bottomToolbarOffset, totalHeight: totalHeight, editorHeight: this._editorHeight, - layoutState: CellLayoutState.FromCache + layoutState: CellLayoutState.FromCache, + foldHintHeight: this._layoutInfo.foldHintHeight }; this.layoutChange({}); } diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts similarity index 94% rename from src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts rename to src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts index 1367017c438..f67734cd02e 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl.ts @@ -19,11 +19,10 @@ import { IntervalNode, IntervalTree } from 'vs/editor/common/model/intervalTree' import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { WorkspaceTextEdit } from 'vs/editor/common/languages'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { FoldingRegions } from 'vs/editor/contrib/folding/foldingRanges'; +import { FoldingRegions } from 'vs/editor/contrib/folding/browser/foldingRanges'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { CellFoldingState, EditorFoldingStateDelegate } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; -import { CellEditState, CellFindMatch, CellFindMatchWithIndex, ICellViewModel, INotebookDeltaCellStatusBarItems, INotebookDeltaDecoration, NotebookLayoutInfo, NotebookMetadataChangedEvent, OutputFindMatch } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellEditState, CellFindMatch, CellFindMatchWithIndex, CellFoldingState, EditorFoldingStateDelegate, ICellViewModel, INotebookDeltaCellStatusBarItems, INotebookDeltaDecoration, OutputFindMatch, ICellModelDecorations, ICellModelDeltaDecorations, IModelDecorationsChangeAccessor, INotebookEditorViewState, INotebookViewCellsUpdateEvent } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookCellSelectionCollection } from 'vs/workbench/contrib/notebook/browser/viewModel/cellSelectionCollection'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; @@ -32,49 +31,10 @@ import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/mode import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CellKind, ICell, INotebookSearchOptions, ISelectionState, NotebookCellsChangeType, NotebookCellTextModelSplice, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { cellIndexesToRanges, cellRangesToIndexes, ICellRange, reduceCellRanges } from 'vs/workbench/contrib/notebook/common/notebookRange'; - -export interface INotebookEditorViewState { - editingCells: { [key: number]: boolean; }; - collapsedInputCells: { [key: number]: boolean; }; - collapsedOutputCells: { [key: number]: boolean; }; - editorViewStates: { [key: number]: editorCommon.ICodeEditorViewState | null; }; - hiddenFoldingRanges?: ICellRange[]; - cellTotalHeights?: { [key: number]: number; }; - scrollPosition?: { left: number; top: number; }; - focus?: number; - editorFocused?: boolean; - contributionsState?: { [id: string]: unknown; }; -} - -export interface ICellModelDecorations { - ownerId: number; - decorations: string[]; -} - -export interface ICellModelDeltaDecorations { - ownerId: number; - decorations: IModelDeltaDecoration[]; -} - -export interface IModelDecorationsChangeAccessor { - deltaDecorations(oldDecorations: ICellModelDecorations[], newDecorations: ICellModelDeltaDecorations[]): ICellModelDecorations[]; -} +import { NotebookLayoutInfo, NotebookMetadataChangedEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; const invalidFunc = () => { throw new Error(`Invalid change accessor`); }; - -export type NotebookViewCellsSplice = [ - number /* start */, - number /* delete count */, - CellViewModel[] -]; - -export interface INotebookViewCellsUpdateEvent { - synchronous: boolean; - splices: NotebookViewCellsSplice[]; -} - - class DecorationsTree { private readonly _decorationsTree: IntervalTree; @@ -210,7 +170,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD } private _decorationsTree = new DecorationsTree(); - private _decorations: { [decorationId: string]: IntervalNode; } = Object.create(null); + private _decorations: { [decorationId: string]: IntervalNode } = Object.create(null); private _lastDecorationId: number = 0; private readonly _instanceId: string; public readonly id: string; @@ -455,6 +415,18 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return this._foldingRanges.isCollapsed(range) ? CellFoldingState.Collapsed : CellFoldingState.Expanded; } + getFoldedLength(index: number): number { + if (!this._foldingRanges) { + return 0; + } + + const range = this._foldingRanges.findRange(index + 1); + const startIndex = this._foldingRanges.getStartLineNumber(range) - 1; + const endIndex = this._foldingRanges.getEndLineNumber(range) - 1; + + return endIndex - startIndex; + } + updateFoldingRanges(ranges: FoldingRegions) { this._foldingRanges = ranges; let updateHiddenAreas = false; @@ -496,7 +468,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD this._viewCells.forEach(cell => { if (cell.cellKind === CellKind.Markup) { - cell.triggerfoldingStateChange(); + cell.triggerFoldingStateChange(); } }); } @@ -590,6 +562,24 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return index + 1; } + getPreviousVisibleCellIndex(index: number) { + for (let i = this._hiddenRanges.length - 1; i >= 0; i--) { + const cellRange = this._hiddenRanges[i]; + const foldStart = cellRange.start - 1; + const foldEnd = cellRange.end; + + if (foldEnd < index) { + return index; + } + + if (foldStart <= index) { + return foldStart; + } + } + + return index; + } + hasCell(cell: ICellViewModel) { return this._handleToViewCellMapping.has(cell.handle); } @@ -776,9 +766,9 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD } getEditorViewState(): INotebookEditorViewState { - const editingCells: { [key: number]: boolean; } = {}; - const collapsedInputCells: { [key: number]: boolean; } = {}; - const collapsedOutputCells: { [key: number]: boolean; } = {}; + const editingCells: { [key: number]: boolean } = {}; + const collapsedInputCells: { [key: number]: boolean } = {}; + const collapsedOutputCells: { [key: number]: boolean } = {}; this._viewCells.forEach((cell, i) => { if (cell.getEditState() === CellEditState.Editing) { @@ -793,7 +783,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD collapsedOutputCells[i] = true; } }); - const editorViewStates: { [key: number]: editorCommon.ICodeEditorViewState; } = {}; + const editorViewStates: { [key: number]: editorCommon.ICodeEditorViewState } = {}; this._viewCells.map(cell => ({ handle: cell.model.handle, state: cell.saveEditorViewState() })).forEach((viewState, i) => { if (viewState.state) { editorViewStates[i] = viewState.state; @@ -854,7 +844,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD private _deltaModelDecorationsImpl(oldDecorations: ICellModelDecorations[], newDecorations: ICellModelDeltaDecorations[]): ICellModelDecorations[] { - const mapping = new Map(); + const mapping = new Map(); oldDecorations.forEach(oldDecoration => { const ownerId = oldDecoration.ownerId; diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorDecorations.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorDecorations.ts index eb50c355dbc..fbdba52e8a8 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorDecorations.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorDecorations.ts @@ -16,7 +16,7 @@ export class NotebookRefCountedStyleSheet { private readonly _styleSheet: HTMLStyleElement; private _refCount: number; - constructor(readonly widget: { removeEditorStyleSheets: (key: string) => void; }, key: string, styleSheet: HTMLStyleElement) { + constructor(readonly widget: { removeEditorStyleSheets: (key: string) => void }, key: string, styleSheet: HTMLStyleElement) { this._key = key; this._styleSheet = styleSheet; this._refCount = 0; diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts index 5a2c0e06b12..a7c0e4d2cc3 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts @@ -20,10 +20,10 @@ 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 { INotebookEditorDelegate, NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_EDITOR_ID, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebooKernelActionViewItem } from 'vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem'; import { ActionViewWithLabel } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellActionView'; -import { NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchAssignmentService } from 'vs/workbench/services/assignment/common/assignmentService'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/common/notebookOptions'; @@ -50,7 +50,7 @@ const ACTION_PADDING = 8; interface IActionLayoutStrategy { actionProvider: IActionViewItemProvider; - calculateActions(leftToolbarContainerMaxWidth: number): { primaryActions: IAction[], secondaryActions: IAction[] }; + calculateActions(leftToolbarContainerMaxWidth: number): { primaryActions: IAction[]; secondaryActions: IAction[] }; } class FixedLabelStrategy implements IActionLayoutStrategy { diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts index 446c3f23ccf..30b22745a45 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorWidgetContextKeys.ts @@ -5,7 +5,8 @@ import { DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ICellViewModel, INotebookEditorDelegate, KERNEL_EXTENSIONS, NOTEBOOK_CELL_TOOLBAR_LOCATION, NOTEBOOK_HAS_OUTPUTS, NOTEBOOK_HAS_RUNNING_CELL, NOTEBOOK_INTERRUPTIBLE_KERNEL, NOTEBOOK_KERNEL_COUNT, NOTEBOOK_KERNEL_SELECTED, NOTEBOOK_MISSING_KERNEL_EXTENSION, NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON, NOTEBOOK_VIEW_TYPE } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellViewModel, INotebookEditorDelegate, KERNEL_EXTENSIONS } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NOTEBOOK_CELL_TOOLBAR_LOCATION, NOTEBOOK_HAS_OUTPUTS, NOTEBOOK_HAS_RUNNING_CELL, NOTEBOOK_INTERRUPTIBLE_KERNEL, NOTEBOOK_KERNEL_COUNT, NOTEBOOK_KERNEL_SELECTED, NOTEBOOK_MISSING_KERNEL_EXTENSION, NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON, NOTEBOOK_VIEW_TYPE } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts index de591ff05a7..dc9a494193e 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookKernelActionViewItem.ts @@ -8,9 +8,10 @@ import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { Action, IAction } from 'vs/base/common/actions'; import { localize } from 'vs/nls'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEditor'; import { selectKernelIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; import { INotebookKernelMatchResult, INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; +import { Event } from 'vs/base/common/event'; +import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; export class NotebooKernelActionViewItem extends ActionViewItem { @@ -19,7 +20,7 @@ export class NotebooKernelActionViewItem extends ActionViewItem { constructor( actualAction: IAction, - private readonly _editor: NotebookEditor | INotebookEditor, + private readonly _editor: { onDidChangeModel: Event; textModel: NotebookTextModel | undefined } | INotebookEditor, @INotebookKernelService private readonly _notebookKernelService: INotebookKernelService, ) { super( diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar.ts index 33ac46a5319..92d6c18e45f 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookTopCellToolbar.ts @@ -83,7 +83,7 @@ export class ListTopCellToolbar extends Disposable { } } - private getCellToolbarActions(menu: IMenu, alwaysFillSecondaryActions: boolean): { primary: IAction[], secondary: IAction[]; } { + private getCellToolbarActions(menu: IMenu, alwaysFillSecondaryActions: boolean): { primary: IAction[]; secondary: IAction[] } { type NewType = IAction; const primary: NewType[] = []; diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts index bc1715e388c..1ff7632b371 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts @@ -14,7 +14,7 @@ import { PieceTreeTextBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/ import { PieceTreeTextBufferBuilder } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder'; import { TextModel } from 'vs/editor/common/model/textModel'; import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { NotebookCellOutputTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellOutputTextModel'; import { CellInternalMetadataChangedEvent, CellKind, ICell, ICellOutput, IOutputDto, IOutputItemDto, NotebookCellCollapseState, NotebookCellInternalMetadata, NotebookCellMetadata, NotebookCellOutputsSplice, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -240,7 +240,7 @@ export class NotebookCellTextModel extends Disposable implements ICell { } private _getPersisentMetadata() { - const filteredMetadata: { [key: string]: any; } = {}; + const filteredMetadata: { [key: string]: any } = {}; const transientCellMetadata = this.transientOptions.transientCellMetadata; const keys = new Set([...Object.keys(this.metadata)]); diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts index 427dfc21045..ed57d528699 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts @@ -17,7 +17,7 @@ import { NotebookCellOutputTextModel } from 'vs/workbench/contrib/notebook/commo import { IModelService } from 'vs/editor/common/services/model'; import { Schemas } from 'vs/base/common/network'; import { isEqual } from 'vs/base/common/resources'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModel } from 'vs/editor/common/model'; import { TextModel } from 'vs/editor/common/model/textModel'; import { isDefined } from 'vs/base/common/types'; @@ -388,10 +388,6 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel return this.cells.findIndex(c => !!c.outputs.find(o => o.outputId === outputId)); } - checkCellExistence(handle: number) { - return this._cellListeners.has(handle); - } - reset(cells: ICellDto2[], metadata: NotebookDocumentMetadata, transientOptions: TransientOptions): void { this.transientOptions = transientOptions; this._cellhandlePool = 0; diff --git a/src/vs/workbench/contrib/notebook/common/notebookCellStatusBarService.ts b/src/vs/workbench/contrib/notebook/common/notebookCellStatusBarService.ts index 7cec507be08..133fa494d7b 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCellStatusBarService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCellStatusBarService.ts @@ -16,7 +16,7 @@ export interface INotebookCellStatusBarService { readonly _serviceBrand: undefined; readonly onDidChangeProviders: Event; - readonly onDidChangeItems: Event + readonly onDidChangeItems: Event; registerCellStatusBarItemProvider(provider: INotebookCellStatusBarItemProvider): IDisposable; diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index 06c90fc2d4a..ac74f5e129e 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -15,6 +15,7 @@ import { basename } from 'vs/base/common/path'; import { isWindows } from 'vs/base/common/platform'; import { ISplice } from 'vs/base/common/sequence'; import { URI, UriComponents } from 'vs/base/common/uri'; +import { ILineChange } from 'vs/editor/common/diff/diffComputer'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Command } from 'vs/editor/common/languages'; import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility'; @@ -28,6 +29,10 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { IWorkingCopyBackupMeta } from 'vs/workbench/services/workingCopy/common/workingCopy'; +export const NOTEBOOK_EDITOR_ID = 'workbench.editor.notebook'; +export const NOTEBOOK_DIFF_EDITOR_ID = 'workbench.editor.notebookTextDiffEditor'; + + export enum CellKind { Markup = 1, Code = 2 @@ -70,7 +75,7 @@ export const RENDERER_EQUIVALENT_EXTENSIONS: ReadonlyMap | NotebookDocumentChangeMetadataEvent | NotebookCellContentChangeEvent | NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookOutputChangedEvent | NotebookOutputItemChangedEvent | NotebookCellsChangeLanguageEvent | NotebookCellsChangeMimeEvent | NotebookCellsChangeMetadataEvent | NotebookCellsChangeInternalMetadataEvent | NotebookDocumentUnknownChangeEvent) & { transient: boolean; }; +export type NotebookRawContentEvent = (NotebookCellsInitializeEvent | NotebookDocumentChangeMetadataEvent | NotebookCellContentChangeEvent | NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookOutputChangedEvent | NotebookOutputItemChangedEvent | NotebookCellsChangeLanguageEvent | NotebookCellsChangeMimeEvent | NotebookCellsChangeMetadataEvent | NotebookCellsChangeInternalMetadataEvent | NotebookDocumentUnknownChangeEvent) & { transient: boolean }; export enum SelectionStateType { Handle = 0, @@ -491,7 +496,7 @@ export interface NotebookData { export interface INotebookContributionData { - extension?: ExtensionIdentifier, + extension?: ExtensionIdentifier; providerDisplayName: string; displayName: string; filenamePattern: (string | glob.IRelativePattern | INotebookExclusiveDocumentFilter)[]; @@ -512,7 +517,7 @@ export namespace CellUri { }); } - export function parse(cell: URI): { notebook: URI, handle: number; } | undefined { + export function parse(cell: URI): { notebook: URI; handle: number } | undefined { if (cell.scheme !== scheme) { return undefined; } @@ -537,7 +542,7 @@ export namespace CellUri { }); } - export function parseCellOutputUri(uri: URI): { notebook: URI, handle: number; outputId?: string } | undefined { + export function parseCellOutputUri(uri: URI): { notebook: URI; handle: number; outputId?: string } | undefined { if (uri.scheme !== Schemas.vscodeNotebookCellOutput) { return; } @@ -592,17 +597,10 @@ type MimeTypeInfo = { }; const _mimeTypeInfo = new Map([ - ['application/javascript', { supportedByCore: true }], - ['image/png', { alwaysSecure: true, supportedByCore: true }], - ['image/jpeg', { alwaysSecure: true, supportedByCore: true }], ['image/git', { alwaysSecure: true, supportedByCore: true }], - ['image/svg+xml', { supportedByCore: true }], ['application/json', { alwaysSecure: true, supportedByCore: true }], - [Mimes.latex, { alwaysSecure: true, supportedByCore: true }], [Mimes.text, { alwaysSecure: true, supportedByCore: true }], - ['text/html', { supportedByCore: true }], ['text/x-javascript', { alwaysSecure: true, supportedByCore: true }], // secure because rendered as text, not executed - ['application/vnd.code.notebook.error', { alwaysSecure: true, supportedByCore: true }], ['application/vnd.code.notebook.stdout', { alwaysSecure: true, supportedByCore: true, mergeable: true }], ['application/vnd.code.notebook.stderr', { alwaysSecure: true, supportedByCore: true, mergeable: true }], ]); @@ -844,7 +842,7 @@ export interface INotebookDocumentFilter { //TODO@rebornix test -export function isDocumentExcludePattern(filenamePattern: string | glob.IRelativePattern | INotebookExclusiveDocumentFilter): filenamePattern is { include: string | glob.IRelativePattern; exclude: string | glob.IRelativePattern; } { +export function isDocumentExcludePattern(filenamePattern: string | glob.IRelativePattern | INotebookExclusiveDocumentFilter): filenamePattern is { include: string | glob.IRelativePattern; exclude: string | glob.IRelativePattern } { const arg = filenamePattern as INotebookExclusiveDocumentFilter; if ((typeof arg.include === 'string' || glob.isRelativePattern(arg.include)) @@ -903,8 +901,8 @@ export class CellSequence implements ISequence { } export interface INotebookDiffResult { - cellsDiff: IDiffResult, - linesDiff?: { originalCellhandle: number, modifiedCellhandle: number, lineChanges: editorCommon.ILineChange[]; }[]; + cellsDiff: IDiffResult; + linesDiff?: { originalCellhandle: number; modifiedCellhandle: number; lineChanges: ILineChange[] }[]; } export interface INotebookCellStatusBarItem { @@ -977,3 +975,8 @@ export class NotebookWorkingCopyTypeIdentifier { return undefined; } } + +export interface NotebookExtensionDescription { + readonly id: ExtensionIdentifier; + readonly location: UriComponents | undefined; +} diff --git a/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts b/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts new file mode 100644 index 00000000000..abaf0918820 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/common/notebookContextKeys.ts @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; + + +//#region Context Keys +export const HAS_OPENED_NOTEBOOK = new RawContextKey('userHasOpenedNotebook', false); +export const KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED = new RawContextKey('notebookFindWidgetFocused', false); + +// Is Notebook +export const NOTEBOOK_IS_ACTIVE_EDITOR = ContextKeyExpr.equals('activeEditor', NOTEBOOK_EDITOR_ID); + +// Editor keys +export const NOTEBOOK_EDITOR_FOCUSED = new RawContextKey('notebookEditorFocused', false); +export const NOTEBOOK_CELL_LIST_FOCUSED = new RawContextKey('notebookCellListFocused', false); +export const NOTEBOOK_OUTPUT_FOCUSED = new RawContextKey('notebookOutputFocused', false); +export const NOTEBOOK_EDITOR_EDITABLE = new RawContextKey('notebookEditable', true); +export const NOTEBOOK_HAS_RUNNING_CELL = new RawContextKey('notebookHasRunningCell', false); +export const NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON = new RawContextKey('notebookUseConsolidatedOutputButton', false); +export const NOTEBOOK_BREAKPOINT_MARGIN_ACTIVE = new RawContextKey('notebookBreakpointMargin', false); +export const NOTEBOOK_CELL_TOOLBAR_LOCATION = new RawContextKey<'left' | 'right' | 'hidden'>('notebookCellToolbarLocation', 'left'); + +// Cell keys +export const NOTEBOOK_VIEW_TYPE = new RawContextKey('notebookType', undefined); +export const NOTEBOOK_CELL_TYPE = new RawContextKey<'code' | 'markup'>('notebookCellType', undefined); +export const NOTEBOOK_CELL_EDITABLE = new RawContextKey('notebookCellEditable', false); +export const NOTEBOOK_CELL_FOCUSED = new RawContextKey('notebookCellFocused', false); +export const NOTEBOOK_CELL_EDITOR_FOCUSED = new RawContextKey('notebookCellEditorFocused', false); +export const NOTEBOOK_CELL_MARKDOWN_EDIT_MODE = new RawContextKey('notebookCellMarkdownEditMode', false); +export const NOTEBOOK_CELL_LINE_NUMBERS = new RawContextKey<'on' | 'off' | 'inherit'>('notebookCellLineNumbers', 'inherit'); +export type NotebookCellExecutionStateContext = 'idle' | 'pending' | 'executing' | 'succeeded' | 'failed'; +export const NOTEBOOK_CELL_EXECUTION_STATE = new RawContextKey('notebookCellExecutionState', undefined); +export const NOTEBOOK_CELL_EXECUTING = new RawContextKey('notebookCellExecuting', false); // This only exists to simplify a context key expression, see #129625 +export const NOTEBOOK_CELL_HAS_OUTPUTS = new RawContextKey('notebookCellHasOutputs', false); +export const NOTEBOOK_CELL_INPUT_COLLAPSED = new RawContextKey('notebookCellInputIsCollapsed', false); +export const NOTEBOOK_CELL_OUTPUT_COLLAPSED = new RawContextKey('notebookCellOutputIsCollapsed', false); +// Kernels +export const NOTEBOOK_KERNEL_COUNT = new RawContextKey('notebookKernelCount', 0); +export const NOTEBOOK_KERNEL_SELECTED = new RawContextKey('notebookKernelSelected', false); +export const NOTEBOOK_INTERRUPTIBLE_KERNEL = new RawContextKey('notebookInterruptibleKernel', false); +export const NOTEBOOK_MISSING_KERNEL_EXTENSION = new RawContextKey('notebookMissingKernelExtension', false); +export const NOTEBOOK_HAS_OUTPUTS = new RawContextKey('notebookHasOutputs', false); + +//#endregion diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts index 2205ff78222..4deca41b48c 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorInput.ts @@ -23,7 +23,6 @@ import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { onUnexpectedError } from 'vs/base/common/errors'; import { VSBuffer } from 'vs/base/common/buffer'; import { IWorkingCopyIdentifier } from 'vs/workbench/services/workingCopy/common/workingCopy'; -import { IWorkingCopyBackupService } from 'vs/workbench/services/workingCopy/common/workingCopyBackup'; export interface NotebookEditorInputOptions { startDirty?: boolean; @@ -54,7 +53,6 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { @INotebookEditorModelResolverService private readonly _notebookModelResolverService: INotebookEditorModelResolverService, @IFileDialogService private readonly _fileDialogService: IFileDialogService, @IInstantiationService private readonly _instantiationService: IInstantiationService, - @IWorkingCopyBackupService private readonly workingCopyBackupService: IWorkingCopyBackupService, @ILabelService labelService: ILabelService, @IFileService fileService: IFileService ) { @@ -197,7 +195,7 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { return undefined; } - private _move(_group: GroupIdentifier, newResource: URI): { editor: EditorInput; } { + private _move(_group: GroupIdentifier, newResource: URI): { editor: EditorInput } { const editorInput = NotebookEditorInput.create(this._instantiationService, newResource, this.viewType); return { editor: editorInput }; } @@ -259,7 +257,6 @@ export class NotebookEditorInput extends AbstractResourceEditorInput { ], true, undefined, () => undefined, undefined, false); if (this.options._workingCopy) { - await this.workingCopyBackupService.discardBackup(this.options._workingCopy); this.options._backupId = undefined; this.options._workingCopy = undefined; this.options.startDirty = undefined; diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts index 5d2c015c462..9aa9fd0836f 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts @@ -302,7 +302,6 @@ export class ComplexNotebookEditorModel extends EditorModel implements INotebook } if (backup) { - this._workingCopyBackupService.discardBackup(this._workingCopyIdentifier); this.setDirty(true); } else { this.setDirty(false); diff --git a/src/vs/workbench/contrib/notebook/common/notebookExecutionService.ts b/src/vs/workbench/contrib/notebook/common/notebookExecutionService.ts index 50b2623c17c..f95ed7b6e30 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookExecutionService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookExecutionService.ts @@ -15,16 +15,15 @@ export enum CellExecutionUpdateType { export interface ICellExecuteOutputEdit { editType: CellExecutionUpdateType.Output; - cellHandle: number; append?: boolean; - outputs: IOutputDto[] + outputs: IOutputDto[]; } export interface ICellExecuteOutputItemEdit { editType: CellExecutionUpdateType.OutputItems; append?: boolean; outputId: string; - items: IOutputItemDto[] + items: IOutputItemDto[]; } export const INotebookExecutionService = createDecorator('INotebookExecutionService'); diff --git a/src/vs/workbench/contrib/notebook/common/notebookExecutionStateService.ts b/src/vs/workbench/contrib/notebook/common/notebookExecutionStateService.ts index 4b480ef8503..b3146bfcab3 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookExecutionStateService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookExecutionStateService.ts @@ -6,7 +6,6 @@ import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookCellExecutionState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CellExecutionUpdateType, ICellExecuteOutputEdit, ICellExecuteOutputItemEdit } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; @@ -17,6 +16,7 @@ export interface ICellExecutionStateUpdate { executionOrder?: number; runStartTime?: number; didPause?: boolean; + isPaused?: boolean; } export interface ICellExecutionComplete { @@ -29,13 +29,15 @@ export interface ICellExecutionEntry { cellHandle: number; state: NotebookCellExecutionState; didPause: boolean; + isPaused: boolean; } export interface ICellExecutionStateChangedEvent { notebook: URI; cellHandle: number; - changed?: ICellExecutionEntry; // undefined -> execution was completed - affectsCell(cell: NotebookCellTextModel): boolean; + changed?: INotebookCellExecution; // undefined -> execution was completed + affectsCell(cell: URI): boolean; + affectsNotebook(notebook: URI): boolean; } export const INotebookExecutionStateService = createDecorator('INotebookExecutionStateService'); @@ -45,11 +47,19 @@ export interface INotebookExecutionStateService { onDidChangeCellExecution: Event; - getCellExecutionStatesForNotebook(notebook: URI): ICellExecutionEntry[]; - - getCellExecutionState(cellUri: URI): ICellExecutionEntry | undefined; - - createNotebookCellExecution(notebook: URI, cellHandle: number): void; - updateNotebookCellExecution(notebook: URI, cellHandle: number, updates: ICellExecuteUpdate[]): void; - completeNotebookCellExecution(notebook: URI, cellHandle: number, complete: ICellExecutionComplete): void; + forceCancelNotebookExecutions(notebookUri: URI): void; + getCellExecutionStatesForNotebook(notebook: URI): INotebookCellExecution[]; + getCellExecution(cellUri: URI): INotebookCellExecution | undefined; + createCellExecution(controllerId: string, notebook: URI, cellHandle: number): INotebookCellExecution; +} + +export interface INotebookCellExecution { + readonly notebook: URI; + readonly cellHandle: number; + readonly state: NotebookCellExecutionState; + readonly didPause: boolean; + readonly isPaused: boolean; + + update(updates: ICellExecuteUpdate[]): void; + complete(complete: ICellExecutionComplete): void; } diff --git a/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts b/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts index 85c1ab380fc..2ca0bbd0ac9 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookKernelService.ts @@ -54,7 +54,7 @@ export interface INotebookKernel { cancelNotebookCellExecution(uri: URI, cellHandles: number[]): Promise; } -export interface INotebookTextModelLike { uri: URI; viewType: string; } +export interface INotebookTextModelLike { uri: URI; viewType: string } export const INotebookKernelService = createDecorator('INotebookKernelService'); @@ -64,7 +64,7 @@ export interface INotebookKernelService { readonly onDidAddKernel: Event; readonly onDidRemoveKernel: Event; readonly onDidChangeSelectedNotebooks: Event; - readonly onDidChangeNotebookAffinity: Event + readonly onDidChangeNotebookAffinity: Event; registerKernel(kernel: INotebookKernel): IDisposable; diff --git a/src/vs/workbench/contrib/notebook/common/notebookOptions.ts b/src/vs/workbench/contrib/notebook/common/notebookOptions.ts index be9e9b87a59..0de3b93ed33 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookOptions.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookOptions.ts @@ -40,6 +40,7 @@ export interface NotebookLayoutConfiguration { markdownCellTopMargin: number; markdownCellBottomMargin: number; markdownPreviewPadding: number; + markdownFoldHintHeight: number; // bottomToolbarGap: number; // bottomToolbarHeight: number; editorToolbarHeight: number; @@ -49,7 +50,7 @@ export interface NotebookLayoutConfiguration { collapsedIndicatorHeight: number; showCellStatusBar: ShowCellStatusBarType; cellStatusBarHeight: number; - cellToolbarLocation: string | { [key: string]: string; }; + cellToolbarLocation: string | { [key: string]: string }; cellToolbarInteraction: string; compactView: boolean; focusIndicator: 'border' | 'gutter'; @@ -116,7 +117,7 @@ export class NotebookOptions extends Disposable { constructor( private readonly configurationService: IConfigurationService, private readonly notebookExecutionStateService: INotebookExecutionStateService, - private readonly overrides?: { cellToolbarInteraction: string, globalToolbar: boolean, defaultCellCollapseConfig?: NotebookCellDefaultCollapseConfig } + private readonly overrides?: { cellToolbarInteraction: string; globalToolbar: boolean; defaultCellCollapseConfig?: NotebookCellDefaultCollapseConfig } ) { super(); const showCellStatusBar = this.configurationService.getValue(NotebookSetting.showCellStatusBar); @@ -124,7 +125,7 @@ export class NotebookOptions extends Disposable { const consolidatedOutputButton = this.configurationService.getValue(NotebookSetting.consolidatedOutputButton) ?? true; const consolidatedRunButton = this.configurationService.getValue(NotebookSetting.consolidatedRunButton) ?? false; const dragAndDropEnabled = this.configurationService.getValue(NotebookSetting.dragAndDropEnabled) ?? true; - const cellToolbarLocation = this.configurationService.getValue(NotebookSetting.cellToolbarLocation) ?? { 'default': 'right' }; + const cellToolbarLocation = this.configurationService.getValue(NotebookSetting.cellToolbarLocation) ?? { 'default': 'right' }; const cellToolbarInteraction = overrides?.cellToolbarInteraction ?? this.configurationService.getValue(NotebookSetting.cellToolbarVisibility); const compactView = this.configurationService.getValue(NotebookSetting.compactView) ?? true; const focusIndicator = this._computeFocusIndicatorOption(); @@ -168,7 +169,8 @@ export class NotebookOptions extends Disposable { markupFontSize, editorOptionsCustomizations, focusIndicatorGap: 3, - interactiveWindowCollapseCodeCells + interactiveWindowCollapseCodeCells, + markdownFoldHintHeight: 22 }; this._register(this.configurationService.onDidChangeConfiguration(e => { @@ -228,7 +230,7 @@ export class NotebookOptions extends Disposable { } if (cellToolbarLocation) { - configuration.cellToolbarLocation = this.configurationService.getValue(NotebookSetting.cellToolbarLocation) ?? { 'default': 'right' }; + configuration.cellToolbarLocation = this.configurationService.getValue(NotebookSetting.cellToolbarLocation) ?? { 'default': 'right' }; } if (cellToolbarInteraction && !this.overrides?.cellToolbarInteraction) { @@ -382,7 +384,7 @@ export class NotebookOptions extends Disposable { return this._layoutConfiguration.cellStatusBarHeight; } - private _computeBottomToolbarDimensions(compactView: boolean, insertToolbarPosition: 'betweenCells' | 'notebookToolbar' | 'both' | 'hidden', insertToolbarAlignment: 'left' | 'center', cellToolbar: 'right' | 'left' | 'hidden'): { bottomToolbarGap: number, bottomToolbarHeight: number; } { + private _computeBottomToolbarDimensions(compactView: boolean, insertToolbarPosition: 'betweenCells' | 'notebookToolbar' | 'both' | 'hidden', insertToolbarAlignment: 'left' | 'center', cellToolbar: 'right' | 'left' | 'hidden'): { bottomToolbarGap: number; bottomToolbarHeight: number } { if (insertToolbarAlignment === 'left' || cellToolbar !== 'hidden') { return { bottomToolbarGap: 18, @@ -406,7 +408,7 @@ export class NotebookOptions extends Disposable { } } - computeBottomToolbarDimensions(viewType?: string): { bottomToolbarGap: number, bottomToolbarHeight: number; } { + computeBottomToolbarDimensions(viewType?: string): { bottomToolbarGap: number; bottomToolbarHeight: number } { const configuration = this._layoutConfiguration; const cellToolbarPosition = this.computeCellToolbarLocation(viewType); const { bottomToolbarGap, bottomToolbarHeight } = this._computeBottomToolbarDimensions(configuration.compactView, configuration.insertToolbarPosition, configuration.insertToolbarAlignment, cellToolbarPosition); @@ -479,7 +481,7 @@ export class NotebookOptions extends Disposable { } private statusBarIsVisible(internalMetadata: NotebookCellInternalMetadata, cellUri: URI): boolean { - const exe = this.notebookExecutionStateService.getCellExecutionState(cellUri); + const exe = this.notebookExecutionStateService.getCellExecution(cellUri); if (this._layoutConfiguration.showCellStatusBar === 'visible') { return true; } else if (this._layoutConfiguration.showCellStatusBar === 'visibleAfterExecute') { @@ -519,12 +521,12 @@ export class NotebookOptions extends Disposable { }; } - computeIndicatorPosition(totalHeight: number, viewType?: string) { + computeIndicatorPosition(totalHeight: number, foldHintHeight: number, viewType?: string) { const { bottomToolbarGap } = this.computeBottomToolbarDimensions(viewType); return { - bottomIndicatorTop: totalHeight - bottomToolbarGap - this._layoutConfiguration.cellBottomMargin, - verticalIndicatorHeight: totalHeight - bottomToolbarGap + bottomIndicatorTop: totalHeight - bottomToolbarGap - this._layoutConfiguration.cellBottomMargin - foldHintHeight, + verticalIndicatorHeight: totalHeight - bottomToolbarGap - foldHintHeight }; } } diff --git a/src/vs/workbench/contrib/notebook/common/notebookProvider.ts b/src/vs/workbench/contrib/notebook/common/notebookProvider.ts index f3ef53e63da..1b3847139a1 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookProvider.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookProvider.ts @@ -13,10 +13,10 @@ import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; type NotebookSelector = string | glob.IRelativePattern | INotebookExclusiveDocumentFilter; export interface NotebookEditorDescriptor { - readonly extension?: ExtensionIdentifier, + readonly extension?: ExtensionIdentifier; readonly id: string; readonly displayName: string; - readonly selectors: readonly { filenamePattern?: string; excludeFileNamePattern?: string; }[]; + readonly selectors: readonly { filenamePattern?: string; excludeFileNamePattern?: string }[]; readonly priority: RegisteredEditorPriority; readonly providerDisplayName: string; readonly exclusive: boolean; diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 32132d06438..305f67e5cbb 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -6,9 +6,8 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; -import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.protocol'; import { Event } from 'vs/base/common/event'; -import { INotebookRendererInfo, NotebookData, TransientOptions, IOrderedMimeType, IOutputDto, INotebookContributionData } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookRendererInfo, NotebookData, TransientOptions, IOrderedMimeType, IOutputDto, INotebookContributionData, NotebookExtensionDescription } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CancellationToken } from 'vs/base/common/cancellation'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; @@ -22,7 +21,7 @@ export const INotebookService = createDecorator('notebookServi export interface INotebookContentProvider { options: TransientOptions; - open(uri: URI, backupId: string | VSBuffer | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken): Promise<{ data: NotebookData, transientOptions: TransientOptions; }>; + open(uri: URI, backupId: string | VSBuffer | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken): Promise<{ data: NotebookData; transientOptions: TransientOptions }>; save(uri: URI, token: CancellationToken): Promise; saveAs(uri: URI, target: URI, token: CancellationToken): Promise; backup(uri: URI, token: CancellationToken): Promise; @@ -30,7 +29,7 @@ export interface INotebookContentProvider { export interface INotebookSerializer { options: TransientOptions; - dataToNotebook(data: VSBuffer): Promise + dataToNotebook(data: VSBuffer): Promise; notebookToData(data: NotebookData): Promise; } @@ -91,6 +90,6 @@ export interface INotebookService { getNotebookProviderResourceRoots(): URI[]; setToCopy(items: NotebookCellTextModel[], isCopy: boolean): void; - getToCopy(): { items: NotebookCellTextModel[], isCopy: boolean; } | undefined; + getToCopy(): { items: NotebookCellTextModel[]; isCopy: boolean } | undefined; clearEditorCache(): void; } diff --git a/src/vs/workbench/contrib/notebook/common/services/notebookSimpleWorker.ts b/src/vs/workbench/contrib/notebook/common/services/notebookSimpleWorker.ts index 8cdd04fd116..ace5f4f4c15 100644 --- a/src/vs/workbench/contrib/notebook/common/services/notebookSimpleWorker.ts +++ b/src/vs/workbench/contrib/notebook/common/services/notebookSimpleWorker.ts @@ -178,7 +178,7 @@ export class CellSequence implements ISequence { export class NotebookEditorSimpleWorker implements IRequestHandler, IDisposable { _requestHandlerBrand: any; - private _models: { [uri: string]: MirrorNotebookDocument; }; + private _models: { [uri: string]: MirrorNotebookDocument }; constructor() { this._models = Object.create(null); @@ -218,7 +218,7 @@ export class NotebookEditorSimpleWorker implements IRequestHandler, IDisposable const diff = new LcsDiff(new CellSequence(original), new CellSequence(modified)); const diffResult = diff.ComputeDiff(false); - /* let cellLineChanges: { originalCellhandle: number, modifiedCellhandle: number, lineChanges: editorCommon.ILineChange[] }[] = []; + /* let cellLineChanges: { originalCellhandle: number, modifiedCellhandle: number, lineChanges: ILineChange[] }[] = []; diffResult.changes.forEach(change => { if (change.modifiedLength === 0) { diff --git a/src/vs/workbench/contrib/notebook/common/services/notebookWorkerService.ts b/src/vs/workbench/contrib/notebook/common/services/notebookWorkerService.ts index f85fd6f5cc9..ec7081a2852 100644 --- a/src/vs/workbench/contrib/notebook/common/services/notebookWorkerService.ts +++ b/src/vs/workbench/contrib/notebook/common/services/notebookWorkerService.ts @@ -4,19 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { ILineChange } from 'vs/editor/common/editorCommon'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { INotebookDiffResult } from 'vs/workbench/contrib/notebook/common/notebookCommon'; export const ID_NOTEBOOK_EDITOR_WORKER_SERVICE = 'notebookEditorWorkerService'; export const INotebookEditorWorkerService = createDecorator(ID_NOTEBOOK_EDITOR_WORKER_SERVICE); -export interface IDiffComputationResult { - quitEarly: boolean; - identical: boolean; - changes: ILineChange[]; -} - export interface INotebookEditorWorkerService { readonly _serviceBrand: undefined; diff --git a/src/vs/workbench/contrib/notebook/test/browser/cellOperations.test.ts b/src/vs/workbench/contrib/notebook/test/browser/cellOperations.test.ts index 4a33e544ebc..5a469da5487 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/cellOperations.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/cellOperations.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; +import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; import { changeCellToKind, computeCellLinesContents, copyCellRange, joinNotebookCells, moveCellRange, moveCellToIdx, runDeleteAction } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { CellEditType, CellKind, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/cellOutput.test.ts b/src/vs/workbench/contrib/notebook/test/browser/cellOutput.test.ts index 74cf4cb743d..1a1f5ea331c 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/cellOutput.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/cellOutput.test.ts @@ -12,11 +12,11 @@ import { IMenuService } from 'vs/platform/actions/common/actions'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { ICellOutputViewModel, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CodeCellRenderTemplate, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; +import { ICellOutputViewModel, IOutputTransformContribution, IRenderOutput, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellOutputContainer } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput'; +import { CodeCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { OutputRendererRegistry } from 'vs/workbench/contrib/notebook/browser/view/output/rendererRegistry'; import { getStringValue } from 'vs/workbench/contrib/notebook/browser/view/output/transforms/richTransform'; -import { CellOutputContainer } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { BUILTIN_RENDERER_ID, CellEditType, CellKind, IOutputDto, IOutputItemDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts new file mode 100644 index 00000000000..1f2dca27750 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { formatCellDuration } from 'vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController'; + +suite('notebookBrowser', () => { + test('formatCellDuration', function () { + assert.strictEqual(formatCellDuration(0), '0.0s'); + assert.strictEqual(formatCellDuration(10), '0.1s'); + assert.strictEqual(formatCellDuration(200), '0.2s'); + assert.strictEqual(formatCellDuration(3300), '3.3s'); + assert.strictEqual(formatCellDuration(180000), '3m 0.0s'); + assert.strictEqual(formatCellDuration(189412), '3m 9.4s'); + }); +}); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/test/find.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/find.test.ts similarity index 95% rename from src/vs/workbench/contrib/notebook/browser/contrib/find/test/find.test.ts rename to src/vs/workbench/contrib/notebook/test/browser/contrib/find.test.ts index 0bd41673038..b9822f87393 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/test/find.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/find.test.ts @@ -6,15 +6,15 @@ import * as assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; import { ITextBuffer, ValidAnnotatedEditOperation } from 'vs/editor/common/model'; -import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/core/wordHelper'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { IConfigurationService, IConfigurationValue } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { NotebookFindFilters } from 'vs/workbench/contrib/notebook/browser/contrib/find/findFilters'; import { FindModel } from 'vs/workbench/contrib/notebook/browser/contrib/find/findModel'; -import { IActiveNotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { ICellModelDecorations, ICellModelDeltaDecorations, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { IActiveNotebookEditor, ICellModelDecorations, ICellModelDeltaDecorations } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { CellEditType, CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { TestCell, withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; @@ -177,8 +177,6 @@ suite('Notebook Find', () => { }], true, undefined, () => undefined, undefined, true); await found2; assert.strictEqual(model.findMatches.length, 3); - assert.strictEqual(model.currentMatch, 3); - model.find(false); assert.strictEqual(model.currentMatch, 0); model.find(true); assert.strictEqual(model.currentMatch, 3); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/layout/test/layoutActions.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/layoutActions.test.ts similarity index 100% rename from src/vs/workbench/contrib/notebook/browser/contrib/layout/test/layoutActions.test.ts rename to src/vs/workbench/contrib/notebook/test/browser/contrib/layoutActions.test.ts diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/clipboard/test/notebookClipboard.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookClipboard.test.ts similarity index 94% rename from src/vs/workbench/contrib/notebook/browser/contrib/clipboard/test/notebookClipboard.test.ts rename to src/vs/workbench/contrib/notebook/test/browser/contrib/notebookClipboard.test.ts index 60ae1f17bae..43d96a3990d 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/clipboard/test/notebookClipboard.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookClipboard.test.ts @@ -6,13 +6,13 @@ import * as assert from 'assert'; import { mock } from 'vs/base/test/common/mock'; import { NotebookClipboardContribution, runCopyCells, runCutCells } from 'vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard'; -import { CellKind, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, NOTEBOOK_EDITOR_ID, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IActiveNotebookEditor, INotebookEditor, NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { IActiveNotebookEditor, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { IVisibleEditorPane } from 'vs/workbench/common/editor'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; -import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; +import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; suite('Notebook Clipboard', () => { @@ -204,7 +204,7 @@ suite('Notebook Clipboard', () => { }); }); - test.skip('cut cell from ui still works if the target cell is not part of a selection', async () => { // TODO@rebornix https://github.com/microsoft/vscode/issues/140397 + test('cut cell from ui still works if the target cell is not part of a selection', async () => { await withTestNotebook( [ ['# header 1', 'markdown', CellKind.Markup, [], {}], @@ -245,7 +245,7 @@ suite('Notebook Clipboard', () => { }); }); - test.skip('cut focus cell still works if the focus is not part of any selection', async () => { // TODO@rebornix https://github.com/microsoft/vscode/issues/140397 + test('cut focus cell still works if the focus is not part of any selection', async () => { await withTestNotebook( [ ['# header 1', 'markdown', CellKind.Markup, [], {}], @@ -269,7 +269,7 @@ suite('Notebook Clipboard', () => { }); }); - test.skip('cut focus cell still works if the focus is not part of any selection 2', async () => { // TODO@rebornix https://github.com/microsoft/vscode/issues/140397 + test('cut focus cell still works if the focus is not part of any selection 2', async () => { await withTestNotebook( [ ['# header 1', 'markdown', CellKind.Markup, [], {}], diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/outline/test/notebookOutline.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts similarity index 100% rename from src/vs/workbench/contrib/notebook/browser/contrib/outline/test/notebookOutline.test.ts rename to src/vs/workbench/contrib/notebook/test/browser/contrib/notebookOutline.test.ts diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/undoRedo/test/notebookUndoRedo.test.ts b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookUndoRedo.test.ts similarity index 98% rename from src/vs/workbench/contrib/notebook/browser/contrib/undoRedo/test/notebookUndoRedo.test.ts rename to src/vs/workbench/contrib/notebook/test/browser/contrib/notebookUndoRedo.test.ts index 2026f65714b..00397f1f1e3 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/undoRedo/test/notebookUndoRedo.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/contrib/notebookUndoRedo.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { CellEditType, CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { TestCell, withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts index f64c232d26e..dca607f6986 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts @@ -4,8 +4,33 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { formatCellDuration, getRanges, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; + +/** + * Return a set of ranges for the cells matching the given predicate + */ +function getRanges(cells: ICellViewModel[], included: (cell: ICellViewModel) => boolean): ICellRange[] { + const ranges: ICellRange[] = []; + let currentRange: ICellRange | undefined; + + cells.forEach((cell, idx) => { + if (included(cell)) { + if (!currentRange) { + currentRange = { start: idx, end: idx + 1 }; + ranges.push(currentRange); + } else { + currentRange.end = idx + 1; + } + } else { + currentRange = undefined; + } + }); + + return ranges; +} + suite('notebookBrowser', () => { suite('getRanges', function () { @@ -48,13 +73,4 @@ suite('notebookBrowser', () => { assert.deepStrictEqual(getRanges(cells as ICellViewModel[], predicate), [{ start: 0, end: 2 }, { start: 3, end: 4 }, { start: 6, end: 7 }]); }); }); - - test('formatCellDuration', function () { - assert.strictEqual(formatCellDuration(0), '0.0s'); - assert.strictEqual(formatCellDuration(10), '0.1s'); - assert.strictEqual(formatCellDuration(200), '0.2s'); - assert.strictEqual(formatCellDuration(3300), '3.3s'); - assert.strictEqual(formatCellDuration(180000), '3m 0.0s'); - assert.strictEqual(formatCellDuration(189412), '3m 9.4s'); - }); }); diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookCellList.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookCellList.test.ts index 8cb9c0908bf..f3e849fe8a6 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookCellList.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookCellList.test.ts @@ -317,4 +317,43 @@ suite('NotebookCellList', () => { assert.deepStrictEqual(cellList.scrollTop, 60); }); }); + + test('visibleRanges should be exclusive of end', async function () { + await withTestNotebook( + [ + ], + async (editor, viewModel) => { + const cellList = createNotebookCellList(instantiationService); + cellList.attachViewModel(viewModel); + + // render height 210, it can render 3 full cells and 1 partial cell + cellList.layout(100, 100); + + assert.deepStrictEqual(cellList.visibleRanges, []); + }); + }); + + test('visibleRanges should be exclusive of end 2', async function () { + await withTestNotebook( + [ + ['# header a', 'markdown', CellKind.Markup, [], {}], + ], + async (editor, viewModel) => { + viewModel.restoreEditorViewState({ + editingCells: [false], + editorViewStates: [null], + cellTotalHeights: [50], + collapsedInputCells: {}, + collapsedOutputCells: {}, + }); + + const cellList = createNotebookCellList(instantiationService); + cellList.attachViewModel(viewModel); + + // render height 210, it can render 3 full cells and 1 partial cell + cellList.layout(100, 100); + + assert.deepStrictEqual(cellList.visibleRanges, [{ start: 0, end: 1 }]); + }); + }); }); diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts index 05875d1a2fd..7f762509d5b 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookCommon.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; import { URI } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { CellKind, CellUri, diff, MimeTypeDisplayOrder, NotebookWorkingCopyTypeIdentifier } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { cellIndexesToRanges, cellRangesToIndexes, reduceCellRanges } from 'vs/workbench/contrib/notebook/common/notebookRange'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookEditor.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookEditor.test.ts index d4bba199a35..4fda839cb60 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookEditor.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookEditor.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { mock } from 'vs/base/test/common/mock'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; +import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; import { expandCellRangesWithHiddenCells, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { ListViewInfoAccessor } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts index 017bc67d0b8..47637282a4e 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts @@ -16,7 +16,7 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { insertCellAtIndex } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { NotebookExecutionService } from 'vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl'; import { NotebookKernelService } from 'vs/workbench/contrib/notebook/browser/notebookKernelServiceImpl'; -import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CellKind, IOutputDto, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookKernel, INotebookKernelService, ISelectedNotebooksChangeEvent } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts index 92907c0d181..887a4a05443 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { timeout } from 'vs/base/common/async'; +import { DeferredPromise } from 'vs/base/common/async'; import { Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; @@ -16,10 +16,11 @@ import { insertCellAtIndex } from 'vs/workbench/contrib/notebook/browser/control import { NotebookExecutionService } from 'vs/workbench/contrib/notebook/browser/notebookExecutionServiceImpl'; import { NotebookExecutionStateService } from 'vs/workbench/contrib/notebook/browser/notebookExecutionStateServiceImpl'; import { NotebookKernelService } from 'vs/workbench/contrib/notebook/browser/notebookKernelServiceImpl'; -import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { CellEditType, CellKind, IOutputDto, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellEditType, CellKind, CellUri, IOutputDto, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookExecutionService } from 'vs/workbench/contrib/notebook/common/notebookExecutionService'; +import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { INotebookKernel, INotebookKernelService } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { setupInstantiationService, withTestNotebook as _withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; @@ -29,6 +30,7 @@ suite('NotebookExecutionStateService', () => { let instantiationService: TestInstantiationService; let kernelService: INotebookKernelService; let disposables: DisposableStore; + let testNotebookModel: NotebookTextModel | undefined; setup(function () { @@ -40,11 +42,15 @@ suite('NotebookExecutionStateService', () => { override onDidAddNotebookDocument = Event.None; override onWillRemoveNotebookDocument = Event.None; override getNotebookTextModels() { return []; } + override getNotebookTextModel(uri: URI): NotebookTextModel | undefined { + return testNotebookModel; + } }); kernelService = instantiationService.createInstance(NotebookKernelService); instantiationService.set(INotebookKernelService, kernelService); instantiationService.set(INotebookExecutionService, instantiationService.createInstance(NotebookExecutionService)); + instantiationService.set(INotebookExecutionStateService, instantiationService.createInstance(NotebookExecutionStateService)); }); teardown(() => { @@ -55,13 +61,9 @@ suite('NotebookExecutionStateService', () => { return _withTestNotebook(cells, (editor, viewModel) => callback(viewModel, viewModel.notebookDocument)); } - test('cancel execution when cell is deleted', async function () { + test('cancel execution when cell is deleted', async function () { // TODO@roblou Should be a test for NotebookExecutionListeners, which can be a standalone contribution return withTestNotebook([], async viewModel => { - instantiationService.stub(INotebookService, new class extends mock() { - override getNotebookTextModel(uri: URI): NotebookTextModel | undefined { - return viewModel.notebookDocument; - } - }); + testNotebookModel = viewModel.notebookDocument; let didCancel = false; const kernel = new class extends TestNotebookKernel { @@ -76,19 +78,96 @@ suite('NotebookExecutionStateService', () => { } }; kernelService.registerKernel(kernel); + kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); - const executionStateService: NotebookExecutionStateService = instantiationService.createInstance(NotebookExecutionStateService); + const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); - executionStateService.createNotebookCellExecution(viewModel.uri, cell.handle); + executionStateService.createCellExecution(kernel.id, viewModel.uri, cell.handle); assert.strictEqual(didCancel, false); viewModel.notebookDocument.applyEdits([{ editType: CellEditType.Replace, index: 0, count: 1, cells: [] }], true, undefined, () => undefined, undefined, false); - await timeout(0); assert.strictEqual(didCancel, true); }); }); + + test('fires onDidChangeCellExecution when cell is completed while deleted', async function () { + return withTestNotebook([], async viewModel => { + testNotebookModel = viewModel.notebookDocument; + + const kernel = new TestNotebookKernel(); + kernelService.registerKernel(kernel); + kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); + + const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); + const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + const exe = executionStateService.createCellExecution(kernel.id, viewModel.uri, cell.handle); + + let didFire = false; + disposables.add(executionStateService.onDidChangeCellExecution(e => { + didFire = !e.changed; + })); + + viewModel.notebookDocument.applyEdits([{ + editType: CellEditType.Replace, index: 0, count: 1, cells: [] + }], true, undefined, () => undefined, undefined, false); + exe.complete({}); + assert.strictEqual(didFire, true); + }); + }); + + // #142466 + test('getCellExecution and onDidChangeCellExecution', async function () { + return withTestNotebook([], async viewModel => { + testNotebookModel = viewModel.notebookDocument; + + const kernel = new TestNotebookKernel(); + kernelService.registerKernel(kernel); + kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); + + const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); + const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + + const deferred = new DeferredPromise(); + disposables.add(executionStateService.onDidChangeCellExecution(e => { + const cellUri = CellUri.generate(e.notebook, e.cellHandle); + const exe = executionStateService.getCellExecution(cellUri); + assert.ok(exe); + assert.strictEqual(e.notebook.toString(), exe.notebook.toString()); + assert.strictEqual(e.cellHandle, exe.cellHandle); + + assert.strictEqual(exe.notebook.toString(), e.changed?.notebook.toString()); + assert.strictEqual(exe.cellHandle, e.changed?.cellHandle); + + deferred.complete(); + })); + + executionStateService.createCellExecution(kernel.id, viewModel.uri, cell.handle); + + return deferred.p; + }); + }); + + test('force-cancel works', async function () { + return withTestNotebook([], async viewModel => { + testNotebookModel = viewModel.notebookDocument; + + const kernel = new TestNotebookKernel(); + kernelService.registerKernel(kernel); + kernelService.selectKernelForNotebook(kernel, viewModel.notebookDocument); + + const executionStateService: INotebookExecutionStateService = instantiationService.get(INotebookExecutionStateService); + const cell = insertCellAtIndex(viewModel, 0, 'var c = 3', 'javascript', CellKind.Code, {}, [], true, true); + executionStateService.createCellExecution(kernel.id, viewModel.uri, cell.handle); + const exe = executionStateService.getCellExecution(cell.uri); + assert.ok(exe); + + executionStateService.forceCancelNotebookExecutions(viewModel.uri); + const exe2 = executionStateService.getCellExecution(cell.uri); + assert.strictEqual(exe2, undefined); + }); + }); }); class TestNotebookKernel implements INotebookKernel { @@ -103,14 +182,13 @@ class TestNotebookKernel implements INotebookKernel { preloadUris: URI[] = []; preloadProvides: string[] = []; supportedLanguages: string[] = []; - executeNotebookCellsRequest(): Promise { - throw new Error('Method not implemented.'); - } - cancelNotebookCellExecution(): Promise { - throw new Error('Method not implemented.'); - } + async executeNotebookCellsRequest(): Promise { } + async cancelNotebookCellExecution(): Promise { } - constructor(opts?: { languages: string[] }) { + constructor(opts?: { languages?: string[]; id?: string }) { this.supportedLanguages = opts?.languages ?? [PLAINTEXT_LANGUAGE_ID]; + if (opts?.id) { + this.id = opts?.id; + } } } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/fold/test/notebookFolding.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookFolding.test.ts similarity index 99% rename from src/vs/workbench/contrib/notebook/browser/contrib/fold/test/notebookFolding.test.ts rename to src/vs/workbench/contrib/notebook/test/browser/notebookFolding.test.ts index e75d9569a72..220dfdb08b3 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/fold/test/notebookFolding.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookFolding.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { setupInstantiationService, withTestNotebook } from 'vs/workbench/contrib/notebook/test/browser/testNotebookEditor'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; +import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts index 801588e6ce7..b1ebabc1db2 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts @@ -178,7 +178,7 @@ class TestNotebookKernel implements INotebookKernel { throw new Error('Method not implemented.'); } - constructor(opts?: { languages?: string[], label?: string, viewType?: string }) { + constructor(opts?: { languages?: string[]; label?: string; viewType?: string }) { this.supportedLanguages = opts?.languages ?? [PLAINTEXT_LANGUAGE_ID]; this.label = opts?.label ?? this.label; this.viewType = opts?.viewType ?? this.viewType; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookSelection.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookSelection.test.ts index 0903b251e24..c7700fe4fb9 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookSelection.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookSelection.test.ts @@ -5,9 +5,9 @@ import * as assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; +import { FoldingModel, updateFoldingStateAtIndex } from 'vs/workbench/contrib/notebook/browser/viewModel/foldingModel'; import { runDeleteAction } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { NotebookCellSelectionCollection } from 'vs/workbench/contrib/notebook/browser/viewModel/cellSelectionCollection'; import { CellEditType, CellKind, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts index 3554599ea2c..42a2b1c6d2b 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { VSBuffer } from 'vs/base/common/buffer'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { Mimes } from 'vs/base/common/mime'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { CellEditType, CellKind, ICellEditOperation, NotebookTextModelChangedEvent, NotebookTextModelWillAddRemoveEvent, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts index ad9247536ae..ebc4e1f9cc6 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookViewModel.test.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { TrackedRangeStickiness } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; @@ -19,7 +19,7 @@ import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { insertCellAtIndex, runDeleteAction } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; import { NotebookEventDispatcher } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher'; -import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CellKind, diff } from 'vs/workbench/contrib/notebook/common/notebookCommon'; diff --git a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts index 5c65d0f5f29..19f9d376545 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/testNotebookEditor.ts @@ -15,13 +15,12 @@ import { mock } from 'vs/base/test/common/mock'; import { EditorFontLigatures } from 'vs/editor/common/config/editorOptions'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { IModelService } from 'vs/editor/common/services/model'; import { ModelService } from 'vs/editor/common/services/modelService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; -import { BrowserClipboardService } from 'vs/platform/clipboard/browser/clipboardService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { NullCommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -45,17 +44,17 @@ import { ListViewInfoAccessor } from 'vs/workbench/contrib/notebook/browser/note import { NotebookCellList } from 'vs/workbench/contrib/notebook/browser/view/notebookCellList'; import { OutputRenderer } from 'vs/workbench/contrib/notebook/browser/view/output/outputRenderer'; import { NotebookEventDispatcher } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher'; -import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; import { ViewContext } from 'vs/workbench/contrib/notebook/browser/viewModel/viewContext'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { CellKind, CellUri, INotebookDiffEditorModel, INotebookEditorModel, INotebookSearchOptions, IOutputDto, IResolvedNotebookEditorModel, NotebookCellMetadata, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { ICellExecuteUpdate, ICellExecutionComplete, ICellExecutionEntry, ICellExecutionStateChangedEvent, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +import { ICellExecuteUpdate, ICellExecutionComplete, ICellExecutionStateChangedEvent, INotebookCellExecution, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/common/notebookOptions'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; import { TestWorkspaceTrustRequestService } from 'vs/workbench/services/workspaces/test/common/testWorkspaceTrustService'; -import { TestLayoutService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestClipboardService, TestLayoutService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; export class TestCell extends NotebookCellTextModel { @@ -172,7 +171,7 @@ export function setupInstantiationService(disposables = new DisposableStore()) { instantiationService.stub(IListService, instantiationService.createInstance(ListService)); instantiationService.stub(ILayoutService, new TestLayoutService()); instantiationService.stub(ILogService, new NullLogService()); - instantiationService.stub(IClipboardService, instantiationService.createInstance(BrowserClipboardService)); + instantiationService.stub(IClipboardService, TestClipboardService); instantiationService.stub(IStorageService, new TestStorageService()); instantiationService.stub(IWorkspaceTrustRequestService, new TestWorkspaceTrustRequestService(true)); instantiationService.stub(INotebookExecutionStateService, new TestNotebookExecutionStateService()); @@ -180,7 +179,7 @@ export function setupInstantiationService(disposables = new DisposableStore()) { return instantiationService; } -function _createTestNotebookEditor(instantiationService: TestInstantiationService, cells: [source: string, lang: string, kind: CellKind, output?: IOutputDto[], metadata?: NotebookCellMetadata][]): { editor: IActiveNotebookEditorDelegate, viewModel: NotebookViewModel; } { +function _createTestNotebookEditor(instantiationService: TestInstantiationService, cells: [source: string, lang: string, kind: CellKind, output?: IOutputDto[], metadata?: NotebookCellMetadata][]): { editor: IActiveNotebookEditorDelegate; viewModel: NotebookViewModel } { const viewType = 'notebook'; const notebook = instantiationService.createInstance(NotebookTextModel, viewType, URI.parse('test'), cells.map(cell => { @@ -302,7 +301,7 @@ function _createTestNotebookEditor(instantiationService: TestInstantiationServic return { editor: notebookEditor, viewModel }; } -export function createTestNotebookEditor(instantiationService: TestInstantiationService, cells: [source: string, lang: string, kind: CellKind, output?: IOutputDto[], metadata?: NotebookCellMetadata][]): { editor: INotebookEditorDelegate, viewModel: NotebookViewModel; } { +export function createTestNotebookEditor(instantiationService: TestInstantiationService, cells: [source: string, lang: string, kind: CellKind, output?: IOutputDto[], metadata?: NotebookCellMetadata][]): { editor: INotebookEditorDelegate; viewModel: NotebookViewModel } { return _createTestNotebookEditor(instantiationService, cells); } @@ -416,15 +415,19 @@ class TestNotebookExecutionStateService implements INotebookExecutionStateServic onDidChangeCellExecution = new Emitter().event; - getCellExecutionStatesForNotebook(notebook: URI): ICellExecutionEntry[] { + forceCancelNotebookExecutions(notebookUri: URI): void { + } + + getCellExecutionStatesForNotebook(notebook: URI): INotebookCellExecution[] { return []; } - getCellExecutionState(cellUri: URI): ICellExecutionEntry | undefined { + getCellExecution(cellUri: URI): INotebookCellExecution | undefined { return undefined; } - createNotebookCellExecution(notebook: URI, cellHandle: number): void { + createCellExecution(controllerId: string, notebook: URI, cellHandle: number): INotebookCellExecution { + return undefined!; } updateNotebookCellExecution(notebook: URI, cellHandle: number, updates: ICellExecuteUpdate[]): void { diff --git a/src/vs/workbench/contrib/offline/browser/offline.contribution.ts b/src/vs/workbench/contrib/offline/browser/offline.contribution.ts index 3ac81f9b059..cf8a706ef33 100644 --- a/src/vs/workbench/contrib/offline/browser/offline.contribution.ts +++ b/src/vs/workbench/contrib/offline/browser/offline.contribution.ts @@ -55,9 +55,9 @@ export class OfflineStatusBarController implements IWorkbenchContribution { this.statusbarService.addEntry({ name: 'Offline Indicator', text: '$(debug-disconnect) Offline', - ariaLabel: 'Network status is offline.', - tooltip: localize('offline', "Network status appears to be offline, certain features might be unavailable.") - }, 'offline', StatusbarAlignment.RIGHT, -10000) + ariaLabel: 'Network is offline.', + tooltip: localize('offline', "Network appears to be offline, certain features might be unavailable.") + }, 'offline', StatusbarAlignment.LEFT, 10000) ); } else { this.disposable!.dispose(); diff --git a/src/vs/workbench/contrib/outline/browser/outlinePane.ts b/src/vs/workbench/contrib/outline/browser/outlinePane.ts index cf09efc07c7..8a345e3f73b 100644 --- a/src/vs/workbench/contrib/outline/browser/outlinePane.ts +++ b/src/vs/workbench/contrib/outline/browser/outlinePane.ts @@ -35,7 +35,6 @@ import { EditorResourceAccessor, IEditorPane } from 'vs/workbench/common/editor' import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { ITreeSorter } from 'vs/base/browser/ui/tree/tree'; -import { URI } from 'vs/base/common/uri'; import { AbstractTreeViewState, IAbstractTreeViewState } from 'vs/base/browser/ui/tree/abstractTree'; const _ctxFollowsCursor = new RawContextKey('outlineFollowsCursor', false); @@ -181,11 +180,11 @@ export class OutlinePane extends ViewPane { this._message.innerText = message; } - private _captureViewState(resource: URI | undefined): boolean { - if (resource && this._tree) { - const oldOutline = this._tree?.getInput(); - if (oldOutline) { - this._treeStates.set(`${oldOutline.outlineKind}/${resource}`, this._tree!.getViewState()); + private _captureViewState(): boolean { + if (this._tree) { + const oldOutline = this._tree.getInput(); + if (oldOutline && oldOutline.uri) { + this._treeStates.set(`${oldOutline.outlineKind}/${oldOutline.uri}`, this._tree.getViewState()); return true; } } @@ -209,7 +208,7 @@ export class OutlinePane extends ViewPane { // persist state const resource = EditorResourceAccessor.getOriginalUri(pane?.input); - const didCapture = this._captureViewState(resource); + const didCapture = this._captureViewState(); this._editorControlDisposables.clear(); @@ -270,7 +269,7 @@ export class OutlinePane extends ViewPane { if (newOutline.isEmpty) { // no more elements this._showMessage(localize('no-symbols', "No symbols found in document '{0}'", basename(resource))); - this._captureViewState(resource); + this._captureViewState(); tree.setInput(undefined); } else if (!tree.getInput()) { @@ -326,7 +325,7 @@ export class OutlinePane extends ViewPane { this._editorControlDisposables.add(newOutline.onDidChange(revealActiveElement)); // feature: update view when user state changes - this._editorControlDisposables.add(this._outlineViewState.onDidChange((e: { followCursor?: boolean, sortBy?: boolean, filterOnType?: boolean }) => { + this._editorControlDisposables.add(this._outlineViewState.onDidChange((e: { followCursor?: boolean; sortBy?: boolean; filterOnType?: boolean }) => { this._outlineViewState.persist(this._storageService); if (e.filterOnType) { tree.updateOptions({ filterOnType: this._outlineViewState.filterOnType }); diff --git a/src/vs/workbench/contrib/outline/browser/outlineViewState.ts b/src/vs/workbench/contrib/outline/browser/outlineViewState.ts index 89f95e57170..1d970d90567 100644 --- a/src/vs/workbench/contrib/outline/browser/outlineViewState.ts +++ b/src/vs/workbench/contrib/outline/browser/outlineViewState.ts @@ -19,7 +19,7 @@ export class OutlineViewState { private _filterOnType = true; private _sortBy = OutlineSortOrder.ByPosition; - private readonly _onDidChange = new Emitter<{ followCursor?: boolean, sortBy?: boolean, filterOnType?: boolean }>(); + private readonly _onDidChange = new Emitter<{ followCursor?: boolean; sortBy?: boolean; filterOnType?: boolean }>(); readonly onDidChange = this._onDidChange.event; dispose(): void { diff --git a/src/vs/workbench/contrib/output/browser/output.contribution.ts b/src/vs/workbench/contrib/output/browser/output.contribution.ts index 2bd5d535953..b6dbbb8caf7 100644 --- a/src/vs/workbench/contrib/output/browser/output.contribution.ts +++ b/src/vs/workbench/contrib/output/browser/output.contribution.ts @@ -232,7 +232,7 @@ registerAction2(class extends Action2 { async run(accessor: ServicesAccessor): Promise { const outputService = accessor.get(IOutputService); const quickInputService = accessor.get(IQuickInputService); - const entries: { id: string, label: string }[] = outputService.getChannelDescriptors().filter(c => c.file && c.log) + const entries: { id: string; label: string }[] = outputService.getChannelDescriptors().filter(c => c.file && c.log) .map(({ id, label }) => ({ id, label })); const entry = await quickInputService.pick(entries, { placeHolder: nls.localize('selectlog', "Select Log") }); diff --git a/src/vs/workbench/contrib/output/browser/outputLinkProvider.ts b/src/vs/workbench/contrib/output/browser/outputLinkProvider.ts index 148647cd5b8..eb346086655 100644 --- a/src/vs/workbench/contrib/output/browser/outputLinkProvider.ts +++ b/src/vs/workbench/contrib/output/browser/outputLinkProvider.ts @@ -6,13 +6,14 @@ import { URI } from 'vs/base/common/uri'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IModelService } from 'vs/editor/common/services/model'; -import { LinkProviderRegistry, ILink } from 'vs/editor/common/languages'; +import { ILink } from 'vs/editor/common/languages'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { OUTPUT_MODE_ID, LOG_MODE_ID } from 'vs/workbench/contrib/output/common/output'; import { MonacoWebWorker, createWebWorker } from 'vs/editor/browser/services/webWorker'; import { ICreateData, OutputLinkComputer } from 'vs/workbench/contrib/output/common/outputLinkComputer'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class OutputLinkProvider { @@ -25,7 +26,8 @@ export class OutputLinkProvider { constructor( @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IModelService private readonly modelService: IModelService, - @ILanguageConfigurationService private readonly languageConfigurationService: ILanguageConfigurationService + @ILanguageConfigurationService private readonly languageConfigurationService: ILanguageConfigurationService, + @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, ) { this.disposeWorkerScheduler = new RunOnceScheduler(() => this.disposeWorker(), OutputLinkProvider.DISPOSE_WORKER_TIME); @@ -43,7 +45,7 @@ export class OutputLinkProvider { const folders = this.contextService.getWorkspace().folders; if (folders.length > 0) { if (!this.linkProviderRegistration) { - this.linkProviderRegistration = LinkProviderRegistry.register([{ language: OUTPUT_MODE_ID, scheme: '*' }, { language: LOG_MODE_ID, scheme: '*' }], { + this.linkProviderRegistration = this.languageFeaturesService.linkProvider.register([{ language: OUTPUT_MODE_ID, scheme: '*' }, { language: LOG_MODE_ID, scheme: '*' }], { provideLinks: async model => { const links = await this.provideLinks(model.uri); diff --git a/src/vs/workbench/contrib/output/browser/outputServices.ts b/src/vs/workbench/contrib/output/browser/outputServices.ts index 2afdaf1baab..afd393c9a34 100644 --- a/src/vs/workbench/contrib/output/browser/outputServices.ts +++ b/src/vs/workbench/contrib/output/browser/outputServices.ts @@ -157,9 +157,10 @@ export class OutputService extends Disposable implements IOutputService, ITextMo if (this.activeChannel === channel) { const channels = this.getChannelDescriptors(); const channel = channels.length ? this.getChannel(channels[0].id) : undefined; - this.setActiveChannel(channel); - if (this.activeChannel) { - this._onActiveOutputChannel.fire(this.activeChannel.id); + if (channel) { + this.showChannel(channel.id); + } else { + this.setActiveChannel(undefined); } } Registry.as(Extensions.OutputChannels).removeChannel(id); diff --git a/src/vs/workbench/contrib/output/browser/outputView.ts b/src/vs/workbench/contrib/output/browser/outputView.ts index c3681a46e95..e10ce89cdd8 100644 --- a/src/vs/workbench/contrib/output/browser/outputView.ts +++ b/src/vs/workbench/contrib/output/browser/outputView.ts @@ -20,7 +20,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason } from 'vs/editor/common/cursorEvents'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPane'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; diff --git a/src/vs/workbench/contrib/output/common/outputChannelModel.ts b/src/vs/workbench/contrib/output/common/outputChannelModel.ts index 73422d5851b..cf4772e2dff 100644 --- a/src/vs/workbench/contrib/output/common/outputChannelModel.ts +++ b/src/vs/workbench/contrib/output/common/outputChannelModel.ts @@ -5,17 +5,17 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import * as resources from 'vs/base/common/resources'; -import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; import { Emitter, Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { Promises, ThrottledDelayer } from 'vs/base/common/async'; import { IFileService } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { Disposable, toDisposable, IDisposable, dispose, MutableDisposable } from 'vs/base/common/lifecycle'; import { isNumber } from 'vs/base/common/types'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { VSBuffer } from 'vs/base/common/buffer'; @@ -258,7 +258,7 @@ export class FileOutputChannelModel extends Disposable implements IOutputChannel this.doUpdateModel(model, edits, contentToReplace); } - private async getReplaceEdits(model: ITextModel, contentToReplace: string): Promise { + private async getReplaceEdits(model: ITextModel, contentToReplace: string): Promise { if (!contentToReplace) { return [EditOperation.delete(model.getFullModelRange())]; } @@ -271,7 +271,7 @@ export class FileOutputChannelModel extends Disposable implements IOutputChannel return []; } - private doUpdateModel(model: ITextModel, edits: IIdentifiedSingleEditOperation[], content: VSBuffer): void { + private doUpdateModel(model: ITextModel, edits: ISingleEditOperation[], content: VSBuffer): void { if (edits.length) { model.applyEdits(edits); } diff --git a/src/vs/workbench/contrib/performance/browser/performance.web.contribution.ts b/src/vs/workbench/contrib/performance/browser/performance.web.contribution.ts index c603cb67efa..d54886aee2e 100644 --- a/src/vs/workbench/contrib/performance/browser/performance.web.contribution.ts +++ b/src/vs/workbench/contrib/performance/browser/performance.web.contribution.ts @@ -12,10 +12,10 @@ class ResourcePerformanceMarks { constructor(@ITelemetryService telemetryService: ITelemetryService) { - type Entry = { name: string; duration: number; }; + type Entry = { name: string; duration: number }; type EntryClassifify = { - name: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; }; - duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true; }; + name: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; }; for (const item of performance.getEntriesByType('resource')) { telemetryService.publicLog2('startup.resource.perf', { diff --git a/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts b/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts index 334a58bed50..5999b650d62 100644 --- a/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts +++ b/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts @@ -9,7 +9,7 @@ import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResource import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { ITextModel } from 'vs/editor/common/model'; import { ILifecycleService, LifecyclePhase, StartupKindToString } from 'vs/workbench/services/lifecycle/common/lifecycle'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IModelService } from 'vs/editor/common/services/model'; import { ITimerService } from 'vs/workbench/services/timer/browser/timerService'; diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index 87ed13ecff2..e047966c95b 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -22,7 +22,7 @@ import { KeybindingsEditorModel, KEYBINDING_ENTRY_TEMPLATE_ID } from 'vs/workben import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService, IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; import { DefineKeybindingWidget, KeybindingsSearchWidget } from 'vs/workbench/contrib/preferences/browser/keybindingWidgets'; -import { CONTEXT_KEYBINDING_FOCUS, CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_ADD, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND_TITLE } from 'vs/workbench/contrib/preferences/common/preferences'; +import { CONTEXT_KEYBINDING_FOCUS, CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_ADD, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND_TITLE, CONTEXT_WHEN_FOCUS } from 'vs/workbench/contrib/preferences/common/preferences'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; import { IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; @@ -51,8 +51,8 @@ import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; type KeybindingEditorActionClassification = { - action: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - command: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + command: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; const $ = DOM.$; @@ -543,7 +543,6 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP this.searchWidget.inputBox.addToHistory(); this.getMemento(StorageScope.GLOBAL, StorageTarget.USER)['searchHistory'] = this.searchWidget.inputBox.getHistory(); this.saveState(); - this.reportFilteringUsed(this.searchWidget.getValue()); }); } @@ -775,34 +774,8 @@ export class KeybindingsEditor extends EditorPane implements IKeybindingsEditorP }; } - private reportFilteringUsed(filter: string): void { - if (filter) { - const data = { - filter, - emptyFilters: this.getLatestEmptyFiltersForTelemetry() - }; - this.latestEmptyFilters = []; - /* __GDPR__ - "keybindings.filter" : { - "filter": { "classification": "CustomerContent", "purpose": "FeatureInsight" }, - "emptyFilters" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('keybindings.filter', data); - } - } - - /** - * Put a rough limit on the size of the telemetry data, since otherwise it could be an unbounded large amount - * of data. 8192 is the max size of a property value. This is rough since that probably includes ""s, etc. - */ - private getLatestEmptyFiltersForTelemetry(): string[] { - let cumulativeSize = 0; - return this.latestEmptyFilters.filter(filterText => (cumulativeSize += filterText.length) <= 8192); - } - private reportKeybindingAction(action: string, command: string): void { - this.telemetryService.publicLog2<{ action: string, command: string }, KeybindingEditorActionClassification>('keybindingsEditor.action', { command, action }); + this.telemetryService.publicLog2<{ action: string; command: string }, KeybindingEditorActionClassification>('keybindingsEditor.action', { command, action }); } private onKeybindingEditingError(error: any): void { @@ -1014,7 +987,7 @@ interface IWhenColumnTemplateData { readonly element: HTMLElement; readonly whenContainer: HTMLElement; readonly whenLabel: HighlightedLabel; - readonly whenInput: InputBox + readonly whenInput: InputBox; readonly renderDisposables: DisposableStore; readonly onDidAccept: Event; readonly onDidReject: Event; @@ -1026,12 +999,15 @@ class WhenColumnRenderer implements ITableRenderer; constructor( private readonly keybindingsEditor: KeybindingsEditor, @IContextViewService private readonly contextViewService: IContextViewService, - @IThemeService private readonly themeService: IThemeService + @IThemeService private readonly themeService: IThemeService, + @IContextKeyService contextKeyService: IContextKeyService, ) { + this.whenFocusContextKey = CONTEXT_WHEN_FOCUS.bindTo(contextKeyService); } renderTemplate(container: HTMLElement): IWhenColumnTemplateData { @@ -1087,7 +1063,11 @@ class WhenColumnRenderer implements ITableRenderer { + this.whenFocusContextKey.set(true); + }))); disposables.add((DOM.addDisposableListener(whenInput.inputElement, DOM.EventType.BLUR, () => { + this.whenFocusContextKey.set(false); hideInputBox(); _onDidReject.fire(); }))); diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts index b47fcfcec0a..814f9e1282a 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts @@ -16,7 +16,7 @@ import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { registerEditorContribution, ServicesAccessor, registerEditorCommand, EditorCommand } from 'vs/editor/browser/editorExtensions'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { SmartSnippetInserter } from 'vs/workbench/contrib/preferences/common/smartSnippetInserter'; import { DefineKeybindingOverlayWidget } from 'vs/workbench/contrib/preferences/browser/keybindingWidgets'; import { FloatingClickWidget } from 'vs/workbench/browser/codeeditor'; @@ -24,7 +24,7 @@ import { parseTree, Node } from 'vs/base/common/json'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { WindowsNativeResolvedKeybinding } from 'vs/workbench/services/keybinding/common/windowsKeyboardMapper'; import { themeColorFromId, ThemeColor } from 'vs/platform/theme/common/themeService'; -import { overviewRulerInfo, overviewRulerError } from 'vs/editor/common/view/editorColorRegistry'; +import { overviewRulerInfo, overviewRulerError } from 'vs/editor/common/core/editorColorRegistry'; import { IModelDeltaDecoration, ITextModel, TrackedRangeStickiness, OverviewRulerLane } from 'vs/editor/common/model'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeybindingParser } from 'vs/base/common/keybindingParser'; diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index 7b326c6d0fd..e96f4133db3 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -93,14 +93,6 @@ opacity: 1; } -.monaco-workbench.vs .settings-editor > .settings-header > .settings-header-controls { - border-color: #cccccc; -} - -.monaco-workbench.vs-dark .settings-editor > .settings-header > .settings-header-controls { - border-color: #3c3c3c; -} - .settings-editor > .settings-header .settings-tabs-widget > .monaco-action-bar .action-item .action-label { margin-right: 0px; } @@ -167,16 +159,16 @@ display: none !important; } -.settings-editor.mid-width > .settings-body > .settings-tree-container .settings-editor-tree > .monaco-scrollable-element > .shadow.top { +.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 { +.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 { +.settings-editor > .settings-body .settings-tree-container .settings-editor-tree > .monaco-scrollable-element > .shadow.top { z-index: 11; } @@ -273,7 +265,7 @@ margin-left: 0px; } -.settings-editor > .settings-body > .settings-tree-container .monaco-list-row { +.settings-editor > .settings-body .settings-tree-container .monaco-list-row { line-height: 1.4em !important; /* so validation messages don't get clipped */ @@ -297,28 +289,28 @@ max-width: min(100%, 1000px); /* Cut off title if too long for window */ } -.settings-editor > .settings-body > .settings-tree-container .settings-group-title-label, -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents { +.settings-editor > .settings-body .settings-tree-container .settings-group-title-label, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents { outline-offset: -1px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents { position: relative; padding: 12px 14px 18px; white-space: normal; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title { overflow: hidden; text-overflow: ellipsis; display: inline-block; /* size to contents for hover to show context button */ } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-modified-indicator { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-modified-indicator { display: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents.is-configured .setting-item-modified-indicator { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents.is-configured .setting-item-modified-indicator { display: block; content: ' '; position: absolute; @@ -330,95 +322,85 @@ bottom: 18px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-item-contents.is-configured .setting-item-modified-indicator, -.settings-editor > .settings-body > .settings-tree-container .setting-item-list .setting-item-contents.is-configured .setting-item-modified-indicator { +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-item-contents.is-configured .setting-item-modified-indicator, +.settings-editor > .settings-body .settings-tree-container .setting-item-list .setting-item-contents.is-configured .setting-item-modified-indicator { bottom: 23px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides { - font-style: italic; - margin-right: 4px; -} - -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-ignored, -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-default-overridden { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title > .misc-label { font-style: italic; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-default-overridden { - margin-right: 4px; -} - -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-ignored .codicon, -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-default-overridden .codicon { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-ignored .codicon, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-default-overridden .codicon { vertical-align: text-top; padding-left: 1px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides a.modified-scope { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides a.modified-scope { text-decoration: underline; cursor: pointer; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-label { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-label { margin-right: 7px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-cat-label-container { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-cat-label-container { float: left; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-label, -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-category { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-label, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-category { font-weight: 600; user-select: text; -webkit-user-select: text; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-category { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-category { opacity: 0.9; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-deprecation-message { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-deprecation-message { margin-top: 3px; user-select: text; -webkit-user-select: text; display: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents.is-deprecated .setting-item-deprecation-message { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents.is-deprecated .setting-item-deprecation-message { display: flex; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents.is-deprecated .setting-item-deprecation-message .codicon { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents.is-deprecated .setting-item-deprecation-message .codicon { margin-right: 4px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-description { margin-top: -1px; user-select: text; -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-untrusted > .setting-item-contents .setting-item-trust-description { display: flex; font-weight: 600; margin: 6px 0 12px 0; } -.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-untrusted > .setting-item-contents .setting-item-trust-description > span { padding-right: 5px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-untrusted > .setting-item-contents .setting-item-trust-description > span.codicon.codicon-workspace-untrusted { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-untrusted > .setting-item-contents .setting-item-trust-description > span.codicon.codicon-workspace-untrusted { color: var(--workspace-trust-state-untrusted-color) !important; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-validation-message { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-validation-message { display: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-contents.invalid-input .setting-item-validation-message { +.settings-editor > .settings-body .settings-tree-container .setting-item .setting-item-contents.invalid-input .setting-item-validation-message { display: block; position: absolute; padding: 5px; @@ -426,81 +408,71 @@ margin-top: -1px; z-index: 1; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-item-contents.invalid-input .setting-item-validation-message { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-item-contents.invalid-input .setting-item-validation-message { position: static; margin-top: 1rem; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-text .setting-item-validation-message { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-text .setting-item-validation-message { width: 500px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-number .setting-item-validation-message { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-number .setting-item-validation-message { width: 200px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-number input[type=number]::-webkit-inner-spin-button { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-number input[type=number]::-webkit-inner-spin-button { /* Hide arrow button that shows in type=number fields */ -webkit-appearance: none !important; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-number input[type=number] { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-number input[type=number] { /* Hide arrow button that shows in type=number fields */ -moz-appearance: textfield !important; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-markdown * { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown * { 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 { +.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 { +.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 { text-decoration: underline; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-markdown code { +.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); } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-markdown .monaco-tokenized-source { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown .monaco-tokenized-source { font-family: var(--monaco-monospace-font); white-space: pre; } -.settings-editor > .settings-body > .settings-list-container .setting-item-contents .setting-item-markdown hr { - border-bottom-width: 0px; - margin: 10px 20px; - opacity: 0.4; -} - -.settings-editor > .settings-body > .settings-list-container .setting-item-contents .setting-item-enumDescription { - display: none; -} - -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-enumDescription { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-enumDescription { display: block; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-item-contents, -.settings-editor > .settings-body > .settings-tree-container .setting-item-list .setting-item-contents { +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-item-contents, +.settings-editor > .settings-body .settings-tree-container .setting-item-list .setting-item-contents { padding-bottom: 26px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-item-value-description { +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-item-value-description { display: flex; cursor: pointer; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox { +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-value-checkbox { height: 18px; width: 18px; border: 1px solid transparent; @@ -510,63 +482,63 @@ padding: 0px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-value-checkbox.codicon:not(.checked)::before { +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-value-checkbox.codicon:not(.checked)::before { opacity: 0; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-value { margin-top: 9px; display: flex; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-number .setting-item-value > .setting-item-control { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-number .setting-item-value > .setting-item-control { min-width: 200px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-text .setting-item-control { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-text .setting-item-control { width: 500px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-enum .setting-item-value > .setting-item-control, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-text .setting-item-value > .setting-item-control { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-enum .setting-item-value > .setting-item-control, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-text .setting-item-value > .setting-item-control { min-width: initial; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-enum .setting-item-value > .setting-item-control > select { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-enum .setting-item-value > .setting-item-control > select { width: 320px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button, -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button:hover, -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button:active { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button:hover, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button:active { text-align: left; text-decoration: underline; padding-left: 0px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .monaco-select-box { +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .monaco-select-box { width: initial; font: inherit; height: 26px; padding: 2px 8px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-new-extensions { +.settings-editor > .settings-body .settings-tree-container .setting-item-new-extensions { display: flex; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-new-extensions .settings-new-extensions-button { +.settings-editor > .settings-body .settings-tree-container .setting-item-new-extensions .settings-new-extensions-button { margin: auto; margin-bottom: 15px; width: initial; padding: 4px 10px; } -.settings-editor > .settings-body > .settings-tree-container .group-title { +.settings-editor > .settings-body .settings-tree-container .group-title { cursor: default; } -.settings-editor > .settings-body > .settings-tree-container .settings-group-title-label { +.settings-editor > .settings-body .settings-tree-container .settings-group-title-label { display: inline-block; margin: 0px; font-weight: 600; @@ -579,13 +551,13 @@ overflow: hidden; text-overflow: ellipsis; } -.settings-editor > .settings-body > .settings-tree-container .settings-group-title-label.settings-group-level-1 { +.settings-editor > .settings-body .settings-tree-container .settings-group-title-label.settings-group-level-1 { font-size: 26px; } -.settings-editor > .settings-body > .settings-tree-container .settings-group-title-label.settings-group-level-2 { +.settings-editor > .settings-body .settings-tree-container .settings-group-title-label.settings-group-level-2 { font-size: 22px; } -.settings-editor > .settings-body > .settings-tree-container .settings-group-title-label.settings-group-level-3 { +.settings-editor > .settings-body .settings-tree-container .settings-group-title-label.settings-group-level-3 { font-size: 18px; } @@ -593,14 +565,14 @@ display: block; } -.settings-editor > .settings-body > .settings-tree-container .setting-list-widget .setting-list-object-list-row.select-container { +.settings-editor > .settings-body .settings-tree-container .setting-list-widget .setting-list-object-list-row.select-container { width: 320px; } -.settings-editor > .settings-body > .settings-tree-container .setting-list-widget .setting-list-object-list-row.select-container > select { +.settings-editor > .settings-body .settings-tree-container .setting-list-widget .setting-list-object-list-row.select-container > select { width: inherit; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .codicon, +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .codicon, .settings-editor > .settings-body .settings-toc-container .monaco-list-row.focused .codicon, .settings-editor > .settings-body .settings-tree-container .monaco-list-row.focused .setting-item-contents .setting-toolbar-container > .monaco-toolbar .codicon { color: inherit !important; diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css index 05668d26ca8..723b041b21f 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css @@ -3,127 +3,127 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-item-value > .setting-item-control { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-item-value > .setting-item-control { width: 100%; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-value, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-value, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key { margin-right: 3px; margin-left: 2px; } /* Deal with overflow */ -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-value, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-sibling, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-value, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-sibling, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { white-space: pre; overflow: hidden; text-overflow: ellipsis; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key { margin-left: 4px; min-width: 40%; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-list-object-input-key-checkbox { +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-list-object-input-key-checkbox { margin-left: 4px; height: 24px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-list-object-input-key-checkbox .setting-value-checkbox { +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-list-object-input-key-checkbox .setting-value-checkbox { margin-top: 3px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-list-object-value { +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-list-object-value { cursor: pointer; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key { margin-left: 0; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-value, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-value, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { width: 100%; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row:hover .setting-list-object-value, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row:focus .setting-list-object-value, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row.selected .setting-list-object-value { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row:hover .setting-list-object-value, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row:focus .setting-list-object-value, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row.selected .setting-list-object-value { margin-right: 44px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-value, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-sibling, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-value, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-sibling, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { display: inline-block; line-height: 24px; min-height: 24px; } /* Use monospace to display glob patterns in exclude widget */ -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-exclude-widget .setting-list-value, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-exclude-widget .setting-list-sibling { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-exclude-widget .setting-list-value, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-exclude-widget .setting-list-sibling { font-family: var(--monaco-monospace-font); } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-sibling { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-sibling { opacity: 0.7; margin-left: 0.5em; font-size: 0.9em; white-space: pre; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row .monaco-action-bar { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row .monaco-action-bar { display: none; position: absolute; right: 0px; top: 0px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row { +.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.draggable { +.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 * { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.drag-hover * { pointer-events: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row-header { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row-header { position: relative; max-height: 24px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row-header { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row-header { font-weight: bold; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row-header { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row-header { display: flex; padding-right: 4px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row-header, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-row:nth-child(odd):not(:hover):not(:focus):not(.selected), -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-edit-row.setting-list-object-row:nth-child(odd):hover { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-row-header, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-row:nth-child(odd):not(:hover):not(:focus):not(.selected), +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-edit-row.setting-list-object-row:nth-child(odd):hover { background-color: rgba(130, 130, 130, 0.04); } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row:focus { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row:focus { outline: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row:hover .monaco-action-bar, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row.selected .monaco-action-bar { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row:hover .monaco-action-bar, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.selected .monaco-action-bar { display: block; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row .monaco-action-bar .action-label { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row .monaco-action-bar .action-label { width: 16px; height: 20px; padding: 2px; @@ -134,69 +134,69 @@ justify-content: center; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row .monaco-action-bar .setting-listAction-edit { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row .monaco-action-bar .setting-listAction-edit { margin-right: 4px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .monaco-text-button { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .monaco-text-button { width: initial; padding: 2px 14px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-item-control.setting-list-hide-add-button .setting-list-new-row { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-item-control.setting-list-hide-add-button .setting-list-new-row { display: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .monaco-text-button.setting-list-addButton { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .monaco-text-button.setting-list-addButton { display: inline-block; margin-top: 4px; margin-right: 4px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-edit-row { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-edit-row { display: flex } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-valueInput, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-siblingInput, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-valueInput, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-siblingInput, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input { height: 24px; max-width: 320px; margin-right: 4px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-valueInput.no-sibling, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-valueInput.no-sibling, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input { max-width: unset; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-valueInput.no-sibling { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-valueInput.no-sibling { /* Add more width to help with string arrays */ width: 100%; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value-container .setting-list-object-input { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value-container .setting-list-object-input { margin-right: 0; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-ok-button { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-ok-button { margin: 0 4px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-widget, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-exclude-widget, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-widget, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-exclude-widget, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget { margin-bottom: 1px; padding: 1px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value-container, -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input select { +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value-container, +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input select { width: 100%; height: 24px; } -.settings-editor > .settings-body > .settings-tree-container .setting-list-widget .setting-list-object-list-row.select-container { +.settings-editor > .settings-body .settings-tree-container .setting-list-widget .setting-list-object-list-row.select-container { width: 320px; } -.settings-editor > .settings-body > .settings-tree-container .setting-list-widget .setting-list-object-list-row.select-container > select { +.settings-editor > .settings-body .settings-tree-container .setting-list-widget .setting-list-object-list-row.select-container > select { width: inherit; } diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index b4b6723e1a7..42365a36d4f 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -10,7 +10,7 @@ import { isObject } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/preferences'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { Context as SuggestContext } from 'vs/editor/contrib/suggest/suggest'; +import { Context as SuggestContext } from 'vs/editor/contrib/suggest/browser/suggest'; import * as nls from 'vs/nls'; import { Action2, MenuId, MenuRegistry, registerAction2 } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; @@ -23,19 +23,18 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { PICK_WORKSPACE_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands'; -import { RemoteNameContext, WorkbenchStateContext } from 'vs/workbench/browser/contextkeys'; import { EditorPaneDescriptor, IEditorPaneRegistry } from 'vs/workbench/browser/editor'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { EditorExtensions, IEditorFactoryRegistry, IEditorSerializer } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey, RemoteNameContext, WorkbenchStateContext } from 'vs/workbench/common/contextkeys'; import { ExplorerFolderContext, ExplorerRootContext } from 'vs/workbench/contrib/files/common/files'; import { KeybindingsEditor } from 'vs/workbench/contrib/preferences/browser/keybindingsEditor'; import { ConfigureLanguageBasedSettingsAction } from 'vs/workbench/contrib/preferences/browser/preferencesActions'; import { SettingsEditorContribution } from 'vs/workbench/contrib/preferences/browser/preferencesEditor'; import { preferencesOpenSettingsIcon } from 'vs/workbench/contrib/preferences/browser/preferencesIcons'; import { SettingsEditor2, SettingsFocusContext } from 'vs/workbench/contrib/preferences/browser/settingsEditor2'; -import { CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, CONTEXT_KEYBINDING_FOCUS, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_JSON_EDITOR, CONTEXT_SETTINGS_ROW_FOCUS, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, KEYBINDINGS_EDITOR_COMMAND_ADD, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND_TITLE, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN, KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_SEARCH, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_EXTENSION_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS, MODIFIED_SETTING_TAG, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/preferences/common/preferences'; +import { CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, CONTEXT_KEYBINDING_FOCUS, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_JSON_EDITOR, CONTEXT_SETTINGS_ROW_FOCUS, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, CONTEXT_WHEN_FOCUS, KEYBINDINGS_EDITOR_COMMAND_ADD, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND_TITLE, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN, KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_SEARCH, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_EXTENSION_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS, MODIFIED_SETTING_TAG, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/preferences/common/preferences'; import { PreferencesContribution } from 'vs/workbench/contrib/preferences/common/preferencesContribution'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -560,7 +559,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon }, category, f1: true, - title: nls.localize('settings.focusSearch', "Focus Settings Search") + title: { value: nls.localize('settings.focusSearch', "Focus Settings Search"), original: 'Focus Settings Search' } }); } @@ -579,7 +578,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon }, category, f1: true, - title: nls.localize('settings.clearResults', "Clear Settings Search Results") + title: { value: nls.localize('settings.clearResults', "Clear Settings Search Results"), original: 'Clear Settings Search Results' } }); } @@ -666,7 +665,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon when: CONTEXT_SETTINGS_ROW_FOCUS }], category, - title: nls.localize('settings.focusSettingsTOC', "Focus Settings Table of Contents") + title: { value: nls.localize('settings.focusSettingsTOC', "Focus Settings Table of Contents"), original: 'Focus Settings Table of Contents' } }); } @@ -717,7 +716,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon }, f1: true, category, - title: nls.localize('settings.showContextMenu', "Show Setting Context Menu") + title: { value: nls.localize('settings.showContextMenu', "Show Setting Context Menu"), original: 'Show Setting Context Menu' } }); } @@ -741,7 +740,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon }, f1: true, category, - title: nls.localize('settings.focusLevelUp', "Move Focus Up One Level") + title: { value: nls.localize('settings.focusLevelUp', "Move Focus Up One Level"), original: 'Move Focus Up One Level' } }); } @@ -1055,7 +1054,7 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon KeybindingsRegistry.registerCommandAndKeybindingRule({ id: KEYBINDINGS_EDITOR_COMMAND_COPY, weight: KeybindingWeight.WorkbenchContrib, - when: ContextKeyExpr.and(CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDING_FOCUS), + when: ContextKeyExpr.and(CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDING_FOCUS, CONTEXT_WHEN_FOCUS.negate()), primary: KeyMod.CtrlCmd | KeyCode.KeyC, handler: async (accessor, args: any) => { const editorPane = accessor.get(IEditorService).activeEditorPane; diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesActions.ts b/src/vs/workbench/contrib/preferences/browser/preferencesActions.ts index ced183068f8..8037852103f 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesActions.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesActions.ts @@ -7,7 +7,7 @@ import { Action } from 'vs/base/common/actions'; import { URI } from 'vs/base/common/uri'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import * as nls from 'vs/nls'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts index eea6954dc1c..606a9255884 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts @@ -13,15 +13,15 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorPositionChangedEvent } from 'vs/editor/common/cursorEvents'; import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { IModelDeltaDecoration, ITextModel, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import * as modes from 'vs/editor/common/languages'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/types'; +import * as languages from 'vs/editor/common/languages'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/browser/types'; import * as nls from 'vs/nls'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationScope, Extensions as ConfigurationExtensions, IConfigurationPropertySchema, IConfigurationRegistry, overrideIdentifiersFromKey, OVERRIDE_PROPERTY_REGEX } from 'vs/platform/configuration/common/configurationRegistry'; @@ -39,6 +39,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IPreferencesEditorModel, IPreferencesService, ISetting, ISettingsEditorModel, ISettingsGroup } from 'vs/workbench/services/preferences/common/preferences'; import { DefaultSettingsEditorModel, SettingsEditorModel, WorkspaceConfigurationEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export interface IPreferencesRenderer extends IDisposable { render(): void; @@ -169,8 +170,8 @@ class EditSettingRenderer extends Disposable { associatedPreferencesModel!: IPreferencesEditorModel; private toggleEditPreferencesForMouseMoveDelayer: Delayer; - private readonly _onUpdateSetting: Emitter<{ key: string, value: any, source: IIndexedSetting }> = new Emitter<{ key: string, value: any, source: IIndexedSetting }>(); - readonly onUpdateSetting: Event<{ key: string, value: any, source: IIndexedSetting }> = this._onUpdateSetting.event; + private readonly _onUpdateSetting: Emitter<{ key: string; value: any; source: IIndexedSetting }> = new Emitter<{ key: string; value: any; source: IIndexedSetting }>(); + readonly onUpdateSetting: Event<{ key: string; value: any; source: IIndexedSetting }> = this._onUpdateSetting.event; constructor(private editor: ICodeEditor, private primarySettingsModel: ISettingsEditorModel, private settingHighlighter: SettingHighlighter, @@ -371,7 +372,7 @@ class EditSettingRenderer extends Disposable { return true; } - private toAbsoluteCoords(position: Position): { x: number, y: number } { + private toAbsoluteCoords(position: Position): { x: number; y: number } { const positionCoords = this.editor.getScrolledVisiblePosition(position); const editorCoords = getDomNodePagePosition(this.editor.getDomNode()!); const x = editorCoords.left + positionCoords!.left; @@ -461,11 +462,11 @@ class SettingHighlighter extends Disposable { } } -class UnsupportedSettingsRenderer extends Disposable implements modes.CodeActionProvider { +class UnsupportedSettingsRenderer extends Disposable implements languages.CodeActionProvider { private renderingDelayer: Delayer = new Delayer(200); - private readonly codeActions = new ResourceMap<[Range, modes.CodeAction[]][]>(uri => this.uriIdentityService.extUri.getComparisonKey(uri)); + private readonly codeActions = new ResourceMap<[Range, languages.CodeAction[]][]>(uri => this.uriIdentityService.extUri.getComparisonKey(uri)); constructor( private readonly editor: ICodeEditor, @@ -475,11 +476,12 @@ class UnsupportedSettingsRenderer extends Disposable implements modes.CodeAction @IConfigurationService private readonly configurationService: IConfigurationService, @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, ) { super(); this._register(this.editor.getModel()!.onDidChangeContent(() => this.delayedRender())); this._register(Event.filter(this.configurationService.onDidChangeConfiguration, e => e.source === ConfigurationTarget.DEFAULT)(() => this.delayedRender())); - this._register(modes.CodeActionProviderRegistry.register({ pattern: settingsEditorModel.uri.path }, this)); + this._register(languageFeaturesService.codeActionProvider.register({ pattern: settingsEditorModel.uri.path }, this)); } private delayedRender(): void { @@ -496,8 +498,8 @@ class UnsupportedSettingsRenderer extends Disposable implements modes.CodeAction } } - async provideCodeActions(model: ITextModel, range: Range | Selection, context: modes.CodeActionContext, token: CancellationToken): Promise { - const actions: modes.CodeAction[] = []; + async provideCodeActions(model: ITextModel, range: Range | Selection, context: languages.CodeActionContext, token: CancellationToken): Promise { + const actions: languages.CodeAction[] = []; const codeActionsByRange = this.codeActions.get(model.uri); if (codeActionsByRange) { for (const [codeActionsRange, codeActions] of codeActionsByRange) { @@ -634,7 +636,7 @@ class UnsupportedSettingsRenderer extends Disposable implements modes.CodeAction }; } - private generateUntrustedSettingCodeActions(diagnostics: IMarkerData[]): modes.CodeAction[] { + private generateUntrustedSettingCodeActions(diagnostics: IMarkerData[]): languages.CodeAction[] { return [{ title: nls.localize('manage workspace trust', "Manage Workspace Trust"), command: { @@ -646,7 +648,7 @@ class UnsupportedSettingsRenderer extends Disposable implements modes.CodeAction }]; } - private addCodeActions(range: IRange, codeActions: modes.CodeAction[]): void { + private addCodeActions(range: IRange, codeActions: languages.CodeAction[]): void { let actions = this.codeActions.get(this.settingsEditorModel.uri); if (!actions) { actions = []; diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts index f037b2a1ba8..9ec6a0b1083 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts @@ -93,14 +93,14 @@ export class FolderSettingsActionViewItem extends BaseActionViewItem { }, this.labelElement, this.detailsElement, this.dropDownElement); this._register(DOM.addDisposableListener(this.anchorElement, DOM.EventType.MOUSE_DOWN, e => DOM.EventHelper.stop(e))); this._register(DOM.addDisposableListener(this.anchorElement, DOM.EventType.CLICK, e => this.onClick(e))); - this._register(DOM.addDisposableListener(this.anchorElement, DOM.EventType.KEY_UP, e => this.onKeyUp(e))); + this._register(DOM.addDisposableListener(this.container, DOM.EventType.KEY_UP, e => this.onKeyUp(e))); DOM.append(this.container, this.anchorElement); this.update(); } - private onKeyUp(event: any): void { + private onKeyUp(event: KeyboardEvent): void { const keyboardEvent = new StandardKeyboardEvent(event); switch (keyboardEvent.keyCode) { case KeyCode.Enter: diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index 190cf7ea792..c63d25184c0 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -18,7 +18,7 @@ import { getErrorMessage, isCancellationError } from 'vs/base/common/errors'; import { Emitter } from 'vs/base/common/event'; import { Iterable } from 'vs/base/common/iterator'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { isArray, withNullAsUndefined, withUndefinedAsNull } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; @@ -42,9 +42,9 @@ import { SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/contrib/pref import { commonlyUsedData, tocData } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; import { AbstractSettingRenderer, HeightChangeParams, ISettingLinkClickEvent, ISettingOverrideClickEvent, resolveConfiguredUntrustedSettings, createTocTreeForExtensionSettings, resolveSettingsTree, SettingsTree, SettingTreeRenderers } from 'vs/workbench/contrib/preferences/browser/settingsTree'; import { ISettingsEditorViewState, parseQuery, SearchResultIdx, SearchResultModel, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; -import { settingsTextInputBorder } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; import { createTOCIterator, TOCTree, TOCTreeModel } from 'vs/workbench/contrib/preferences/browser/tocTree'; import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_ROW_FOCUS, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, EXTENSION_SETTING_TAG, FEATURE_SETTING_TAG, ID_SETTING_TAG, IPreferencesSearchService, ISearchProvider, MODIFIED_SETTING_TAG, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, WORKSPACE_TRUST_SETTING_TAG } from 'vs/workbench/contrib/preferences/common/preferences'; +import { settingsHeaderBorder, settingsTextInputBorder } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry'; import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IOpenSettingsOptions, IPreferencesService, ISearchResult, ISettingsEditorModel, ISettingsEditorOptions, SettingMatchType, SettingValueType, validateSettingsEditorOptions } from 'vs/workbench/services/preferences/common/preferences'; import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; @@ -161,7 +161,7 @@ export class SettingsEditor2 extends EditorPane { private settingFastUpdateDelayer: Delayer; private settingSlowUpdateDelayer: Delayer; - private pendingSettingUpdate: { key: string, value: any; } | null = null; + private pendingSettingUpdate: { key: string; value: any } | null = null; private readonly viewState: ISettingsEditorViewState; private _searchResultModel: SearchResultModel | null = null; @@ -550,6 +550,11 @@ export class SettingsEditor2 extends EditorPane { })); const headerControlsContainer = DOM.append(this.headerContainer, $('.settings-header-controls')); + this._register(attachStylerCallback(this.themeService, { settingsHeaderBorder }, colors => { + const border = colors.settingsHeaderBorder ? colors.settingsHeaderBorder.toString() : ''; + headerControlsContainer.style.borderColor = border; + })); + const targetWidgetContainer = DOM.append(headerControlsContainer, $('.settings-target-container')); this.settingsTargetsWidget = this._register(this.instantiationService.createInstance(SettingsTargetsWidget, targetWidgetContainer, { enableRemoteSettings: true })); this.settingsTargetsWidget.settingsTarget = ConfigurationTarget.USER_LOCAL; @@ -912,7 +917,7 @@ export class SettingsEditor2 extends EditorPane { return this.configurationService.updateValue(key, value, overrides, configurationTarget) .then(() => { const query = this.searchWidget.getValue(); - if (query.includes('@modified')) { + if (query.includes(`@${MODIFIED_SETTING_TAG}`)) { // The user might have reset a setting. this.refreshTOCTree(); } @@ -931,7 +936,7 @@ export class SettingsEditor2 extends EditorPane { }); } - private reportModifiedSetting(props: { key: string, query: string, searchResults: ISearchResult[] | null, rawResults: ISearchResult[] | null, showConfiguredOnly: boolean, isReset: boolean, settingsTarget: SettingsTarget; }): void { + private reportModifiedSetting(props: { key: string; query: string; searchResults: ISearchResult[] | null; rawResults: ISearchResult[] | null; showConfiguredOnly: boolean; isReset: boolean; settingsTarget: SettingsTarget }): void { this.pendingSettingUpdate = null; let groupId: string | undefined = undefined; @@ -1001,7 +1006,7 @@ export class SettingsEditor2 extends EditorPane { } if (!key) { - this.scheduledRefreshes.forEach(r => r.dispose()); + dispose(this.scheduledRefreshes.values()); this.scheduledRefreshes.clear(); } @@ -1291,7 +1296,7 @@ export class SettingsEditor2 extends EditorPane { }; // Count unique results - const counts: { nlpResult?: number, filterResult?: number; } = {}; + const counts: { nlpResult?: number; filterResult?: number } = {}; const filterResult = results[SearchResultIdx.Local]; if (filterResult) { counts['filterResult'] = filterResult.filterMatches.length; @@ -1402,6 +1407,7 @@ export class SettingsEditor2 extends EditorPane { if (!this.searchResultModel) { if (this.countElement.style.display !== 'none') { this.searchResultLabel = null; + this.updateInputAriaLabel(); this.countElement.style.display = 'none'; this.layout(this.dimension); } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 3267a176ecb..e5d204fe3e7 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -42,7 +42,7 @@ import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticip 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'; -import { ExcludeSettingWidget, ISettingListChangeEvent, IListDataItem, ListSettingWidget, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground, ObjectSettingDropdownWidget, IObjectDataItem, IObjectEnumOption, ObjectValue, IObjectValueSuggester, IObjectKeySuggester, focusedRowBackground, focusedRowBorder, settingsHeaderForeground, rowHoverBackground, ObjectSettingCheckboxWidget } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; +import { ExcludeSettingWidget, ISettingListChangeEvent, IListDataItem, ListSettingWidget, ObjectSettingDropdownWidget, IObjectDataItem, IObjectEnumOption, ObjectValue, IObjectValueSuggester, IObjectKeySuggester, ObjectSettingCheckboxWidget } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; import { SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/preferences/common/preferences'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ISetting, ISettingsGroup, SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; @@ -59,8 +59,9 @@ import { ILogService } from 'vs/platform/log/common/log'; import { settingsMoreActionIcon } from 'vs/workbench/contrib/preferences/browser/preferencesIcons'; import { IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { SettingsTarget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +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'; const $ = DOM.$; @@ -382,7 +383,7 @@ function getShowAddButtonList(dataElement: SettingsTreeSettingElement, listDispl } } -export function resolveSettingsTree(tocData: ITOCEntry, coreSettingsGroups: ISettingsGroup[], logService: ILogService): { tree: ITOCEntry, leftoverSettings: Set } { +export function resolveSettingsTree(tocData: ITOCEntry, coreSettingsGroups: ISettingsGroup[], logService: ILogService): { tree: ITOCEntry; leftoverSettings: Set } { const allSettings = getFlatSettings(coreSettingsGroups); return { tree: _resolveSettingsTree(tocData, allSettings, logService), @@ -420,7 +421,7 @@ export async function createTocTreeForExtensionSettings(extensionService: IExten const extensionId = group.extensionInfo!.id; const extension = await extensionService.getExtension(extensionId); - const extensionName = extension!.displayName ?? extension!.name; + const extensionName = extension?.displayName ?? extension?.name ?? extensionId; // Each group represents a single category of settings. // If the extension author forgets to specify an id for the group, @@ -586,10 +587,7 @@ interface ISettingItemTemplate extends IDisposableTemplate { descriptionElement: HTMLElement; controlElement: HTMLElement; deprecationWarningElement: HTMLElement; - otherOverridesElement: HTMLElement; - syncIgnoredElement: HTMLElement; - defaultOverrideIndicator: HTMLElement; - defaultOverrideLabel: SimpleIconLabel; + miscLabel: SettingsTreeMiscLabel; toolbar: ToolBar; elementDisposables: DisposableStore; } @@ -625,7 +623,7 @@ interface ISettingExcludeItemTemplate extends ISettingItemTemplate { } interface ISettingObjectItemTemplate extends ISettingItemTemplate | undefined> { - objectDropdownWidget?: ObjectSettingDropdownWidget, + objectDropdownWidget?: ObjectSettingDropdownWidget; objectCheckboxWidget?: ObjectSettingCheckboxWidget; validationErrorMessageElement: HTMLElement; } @@ -759,10 +757,8 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre this.ignoredSettings = getIgnoredSettings(getDefaultIgnoredSettings(), this._configService); this._register(this._configService.onDidChangeConfiguration(e => { - if (e.affectedKeys.includes('settingsSync.ignoredSettings')) { - this.ignoredSettings = getIgnoredSettings(getDefaultIgnoredSettings(), this._configService); - this._onDidChangeIgnoredSettings.fire(); - } + this.ignoredSettings = getIgnoredSettings(getDefaultIgnoredSettings(), this._configService); + this._onDidChangeIgnoredSettings.fire(); })); } @@ -770,21 +766,6 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre abstract renderElement(element: ITreeNode, index: number, templateData: any): void; - protected createSyncIgnoredElement(container: HTMLElement): HTMLElement { - const syncIgnoredElement = DOM.append(container, $('span.setting-item-ignored')); - const syncIgnoredLabel = new SimpleIconLabel(syncIgnoredElement); - syncIgnoredLabel.text = `($(sync-ignored) ${localize('extensionSyncIgnoredLabel', 'Sync: Ignored')})`; - syncIgnoredLabel.title = localize('syncIgnoredTitle', "Settings sync does not sync this setting"); - - return syncIgnoredElement; - } - - protected createDefaultOverrideIndicator(container: HTMLElement): { element: HTMLElement, label: SimpleIconLabel } { - const defaultOverrideIndicator = DOM.append(container, $('span.setting-item-default-overridden')); - const defaultOverrideLabel = new SimpleIconLabel(defaultOverrideIndicator); - return { element: defaultOverrideIndicator, label: defaultOverrideLabel }; - } - protected renderCommonTemplate(tree: any, _container: HTMLElement, typeClass: string): ISettingItemTemplate { _container.classList.add('setting-item'); _container.classList.add('setting-item-' + typeClass); @@ -795,9 +776,8 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre const labelCategoryContainer = DOM.append(titleElement, $('.setting-item-cat-label-container')); const categoryElement = DOM.append(labelCategoryContainer, $('span.setting-item-category')); const labelElement = DOM.append(labelCategoryContainer, $('span.setting-item-label')); - const otherOverridesElement = DOM.append(titleElement, $('span.setting-item-overrides')); - const { element: defaultOverrideIndicator, label: defaultOverrideLabel } = this.createDefaultOverrideIndicator(titleElement); - const syncIgnoredElement = this.createSyncIgnoredElement(titleElement); + + const miscLabel = new SettingsTreeMiscLabel(titleElement); const descriptionElement = DOM.append(container, $('.setting-item-description')); const modifiedIndicatorElement = DOM.append(container, $('.setting-item-modified-indicator')); @@ -823,10 +803,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre descriptionElement, controlElement, deprecationWarningElement, - otherOverridesElement, - syncIgnoredElement, - defaultOverrideIndicator, - defaultOverrideLabel, + miscLabel, toolbar }; @@ -903,37 +880,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre template.descriptionElement.innerText = element.description; } - template.otherOverridesElement.innerText = ''; - template.otherOverridesElement.style.display = 'none'; - if (element.overriddenScopeList.length) { - template.otherOverridesElement.style.display = 'inline'; - - const otherOverridesLabel = element.isConfigured ? - localize('alsoConfiguredIn', "Also modified in") : - localize('configuredIn', "Modified in"); - - DOM.append(template.otherOverridesElement, $('span', undefined, `(${otherOverridesLabel}: `)); - - for (let i = 0; i < element.overriddenScopeList.length; i++) { - const view = DOM.append(template.otherOverridesElement, $('a.modified-scope', undefined, element.overriddenScopeList[i])); - - if (i !== element.overriddenScopeList.length - 1) { - DOM.append(template.otherOverridesElement, $('span', undefined, ', ')); - } else { - DOM.append(template.otherOverridesElement, $('span', undefined, ')')); - } - - template.elementDisposables.add( - DOM.addStandardDisposableListener(view, DOM.EventType.CLICK, (e: IMouseEvent) => { - this._onDidClickOverrideElement.fire({ - targetKey: element.setting.key, - scope: element.overriddenScopeList[i] - }); - e.preventDefault(); - e.stopPropagation(); - })); - } - } + template.miscLabel.updateOtherOverrides(element, template.elementDisposables, this._onDidClickOverrideElement); const onChange = (value: any) => this._onDidChangeSetting.fire({ key: element.setting.key, value, type: template.context!.valueType }); const deprecationText = element.setting.deprecationMessage || ''; @@ -950,28 +897,10 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre this.renderValue(element, template, onChange); - const defaultValueSource = element.setting.defaultValueSource; - const updateSyncIgnoredElement = () => { - template.syncIgnoredElement.style.display = this.ignoredSettings.includes(element.setting.key) ? 'inline' : 'none'; - }; - const updateTitleElements = () => { - updateSyncIgnoredElement(); - template.defaultOverrideIndicator.style.display = 'none'; - if (defaultValueSource) { - template.defaultOverrideIndicator.style.display = 'inline'; - if (typeof defaultValueSource !== 'string' && defaultValueSource.id !== element.setting.extensionInfo?.id) { - const extensionSource = defaultValueSource.displayName ?? defaultValueSource.id; - template.defaultOverrideIndicator.title = localize('defaultOverriddenDetails', "Default value overridden by {0}", extensionSource); - template.defaultOverrideLabel.text = localize('defaultOverrideLabelText', "($(wrench) Overridden by: {0})", extensionSource); - } else if (typeof defaultValueSource === 'string') { - template.defaultOverrideIndicator.title = localize('defaultOverriddenDetails', "Default value overridden by {0}", defaultValueSource); - template.defaultOverrideLabel.text = localize('defaultOverrideLabelText', "($(wrench) Overridden by: {0})", defaultValueSource); - } - } - }; - updateTitleElements(); + template.miscLabel.updateSyncIgnored(element, this.ignoredSettings); + template.miscLabel.updateDefaultOverrideIndicator(element); template.elementDisposables.add(this.onDidChangeIgnoredSettings(() => { - updateSyncIgnoredElement(); + template.miscLabel.updateSyncIgnored(element, this.ignoredSettings); })); this.updateSettingTabbable(element, template); @@ -1828,9 +1757,7 @@ export class SettingBoolRenderer extends AbstractSettingRenderer implements ITre const titleElement = DOM.append(container, $('.setting-item-title')); const categoryElement = DOM.append(titleElement, $('span.setting-item-category')); const labelElement = DOM.append(titleElement, $('span.setting-item-label')); - const otherOverridesElement = DOM.append(titleElement, $('span.setting-item-overrides')); - const { element: defaultOverrideIndicator, label: defaultOverrideLabel } = this.createDefaultOverrideIndicator(titleElement); - const syncIgnoredElement = this.createSyncIgnoredElement(titleElement); + const miscLabel = new SettingsTreeMiscLabel(titleElement); const descriptionAndValueElement = DOM.append(container, $('.setting-item-value-description')); const controlElement = DOM.append(descriptionAndValueElement, $('.setting-item-bool-control')); @@ -1879,10 +1806,7 @@ export class SettingBoolRenderer extends AbstractSettingRenderer implements ITre checkbox, descriptionElement, deprecationWarningElement, - otherOverridesElement, - syncIgnoredElement, - defaultOverrideIndicator, - defaultOverrideLabel, + miscLabel, toolbar }; @@ -2130,7 +2054,8 @@ function cleanRenderedMarkdown(element: Node): void { } function fixSettingLinks(text: string, linkify = true): string { - return text.replace(/`#([^#]*)#`|'#([^#]*)#'/g, (match, settingKey) => { + return text.replace(/`#([^#]*)#`|'#([^#]*)#'/g, (match, backticksGroup, quotesGroup) => { + const settingKey: string = backticksGroup ?? quotesGroup; const targetDisplayFormat = settingKeyToDisplayFormat(settingKey); const targetName = `${targetDisplayFormat.category}: ${targetDisplayFormat.label}`; return linkify ? @@ -2145,6 +2070,121 @@ function escapeInvisibleChars(enumValue: string): string { .replace(/\r/g, '\\r'); } +/** + * Controls logic and rendering of the label next to each setting header. + * For example, the "Modified by" and "Overridden by" labels go here. + */ +class SettingsTreeMiscLabel { + private labelElement: HTMLElement; + private otherOverridesElement: HTMLElement; + private syncIgnoredElement: HTMLElement; + private defaultOverrideIndicatorElement: HTMLElement; + private defaultOverrideIndicatorLabel: SimpleIconLabel; + + constructor(container: HTMLElement) { + this.labelElement = DOM.append(container, $('.misc-label')); + this.labelElement.style.display = 'inline'; + + this.otherOverridesElement = this.createOtherOverridesElement(); + this.syncIgnoredElement = this.createSyncIgnoredElement(); + const { element, label } = this.createDefaultOverrideIndicator(); + this.defaultOverrideIndicatorElement = element; + this.defaultOverrideIndicatorLabel = label; + } + + private createOtherOverridesElement(): HTMLElement { + const otherOverridesElement = $('span.setting-item-overrides'); + return otherOverridesElement; + } + + private createSyncIgnoredElement(): HTMLElement { + const syncIgnoredElement = $('span.setting-item-ignored'); + const syncIgnoredLabel = new SimpleIconLabel(syncIgnoredElement); + syncIgnoredLabel.text = `$(sync-ignored) ${localize('extensionSyncIgnoredLabel', 'Sync: Ignored')}`; + syncIgnoredLabel.title = localize('syncIgnoredTitle', "Settings sync does not sync this setting"); + return syncIgnoredElement; + } + + private createDefaultOverrideIndicator(): { element: HTMLElement; label: SimpleIconLabel } { + const defaultOverrideIndicator = $('span.setting-item-default-overridden'); + const defaultOverrideLabel = new SimpleIconLabel(defaultOverrideIndicator); + return { element: defaultOverrideIndicator, label: defaultOverrideLabel }; + } + + private render() { + const elementsToShow = [this.otherOverridesElement, this.syncIgnoredElement, this.defaultOverrideIndicatorElement].filter(element => { + return element.style.display !== 'none'; + }); + + this.labelElement.innerText = ''; + this.labelElement.style.display = 'none'; + if (elementsToShow.length) { + this.labelElement.style.display = 'inline'; + DOM.append(this.labelElement, $('span', undefined, '(')); + for (let i = 0; i < elementsToShow.length - 1; i++) { + DOM.append(this.labelElement, elementsToShow[i]); + DOM.append(this.labelElement, $('span.comma', undefined, ', ')); + } + DOM.append(this.labelElement, elementsToShow[elementsToShow.length - 1]); + DOM.append(this.labelElement, $('span', undefined, ')')); + } + } + + updateSyncIgnored(element: SettingsTreeSettingElement, ignoredSettings: string[]) { + this.syncIgnoredElement.style.display = ignoredSettings.includes(element.setting.key) ? 'inline' : 'none'; + this.render(); + } + + updateOtherOverrides(element: SettingsTreeSettingElement, elementDisposables: DisposableStore, onDidClickOverrideElement: Emitter) { + this.otherOverridesElement.innerText = ''; + this.otherOverridesElement.style.display = 'none'; + if (element.overriddenScopeList.length) { + this.otherOverridesElement.style.display = 'inline'; + const otherOverridesLabel = element.isConfigured ? + localize('alsoConfiguredIn', "Also modified in") : + localize('configuredIn', "Modified in"); + + DOM.append(this.otherOverridesElement, $('span', undefined, `${otherOverridesLabel}: `)); + + for (let i = 0; i < element.overriddenScopeList.length; i++) { + const view = DOM.append(this.otherOverridesElement, $('a.modified-scope', undefined, element.overriddenScopeList[i])); + + if (i !== element.overriddenScopeList.length - 1) { + DOM.append(this.otherOverridesElement, $('span', undefined, ', ')); + } + + elementDisposables.add( + DOM.addStandardDisposableListener(view, DOM.EventType.CLICK, (e: IMouseEvent) => { + onDidClickOverrideElement.fire({ + targetKey: element.setting.key, + scope: element.overriddenScopeList[i] + }); + e.preventDefault(); + e.stopPropagation(); + })); + } + } + this.render(); + } + + updateDefaultOverrideIndicator(element: SettingsTreeSettingElement) { + this.defaultOverrideIndicatorElement.style.display = 'none'; + if (element.setting.defaultValueSource) { + this.defaultOverrideIndicatorElement.style.display = 'inline'; + const defaultValueSource = element.setting.defaultValueSource; + if (typeof defaultValueSource !== 'string' && defaultValueSource.id !== element.setting.extensionInfo?.id) { + const extensionSource = defaultValueSource.displayName ?? defaultValueSource.id; + this.defaultOverrideIndicatorLabel.title = localize('defaultOverriddenDetails', "Default value overridden by {0}", extensionSource); + this.defaultOverrideIndicatorLabel.text = localize('defaultOverrideLabelText', "$(wrench) Overridden by: {0}", extensionSource); + } else if (typeof defaultValueSource === 'string') { + this.defaultOverrideIndicatorLabel.title = localize('defaultOverriddenDetails', "Default value overridden by {0}", defaultValueSource); + this.defaultOverrideIndicatorLabel.text = localize('defaultOverrideLabelText', "$(wrench) Overridden by: {0}", defaultValueSource); + } + } + this.render(); + } +} + export class SettingsTreeFilter implements ITreeFilter { constructor( private viewState: ISettingsEditorViewState, @@ -2297,18 +2337,29 @@ export class NonCollapsibleObjectTreeModel extends ObjectTreeModel { } class SettingsTreeAccessibilityProvider implements IListAccessibilityProvider { + constructor(private readonly configurationService: IConfigurationService) { + } + getAriaLabel(element: SettingsTreeElement) { if (element instanceof SettingsTreeSettingElement) { - const modifiedText = element.isConfigured ? localize('settings.Modified', 'Modified.') : ''; + const ariaLabelSections: string[] = []; + ariaLabelSections.push(`${element.displayCategory} ${element.displayLabel}.`); - const otherOverridesStart = element.isConfigured ? - localize('alsoConfiguredIn', "Also modified in") : - localize('configuredIn', "Modified in"); - const otherOverridesList = element.overriddenScopeList.join(', '); - const otherOverridesLabel = element.overriddenScopeList.length ? `${otherOverridesStart} ${otherOverridesList}. ` : ''; + if (element.isConfigured) { + const modifiedText = localize('settings.Modified', 'Modified.'); + ariaLabelSections.push(modifiedText); + } + + const miscLabelAriaLabel = this.getMiscLabelAriaLabel(element); + if (miscLabelAriaLabel.length) { + ariaLabelSections.push(`${miscLabelAriaLabel}.`); + } const descriptionWithoutSettingLinks = fixSettingLinks(element.description, false); - return `${element.displayCategory} ${element.displayLabel}. ${descriptionWithoutSettingLinks}. ${modifiedText} ${otherOverridesLabel}`; + if (descriptionWithoutSettingLinks.length) { + ariaLabelSections.push(descriptionWithoutSettingLinks); + } + return ariaLabelSections.join(' '); } else if (element instanceof SettingsTreeGroupElement) { return element.label; } else { @@ -2319,6 +2370,39 @@ class SettingsTreeAccessibilityProvider implements IListAccessibilityProvider { @@ -2345,7 +2429,7 @@ export class SettingsTree extends WorkbenchObjectTree { return e.id; } }, - accessibilityProvider: new SettingsTreeAccessibilityProvider(), + accessibilityProvider: new SettingsTreeAccessibilityProvider(configurationService), styleController: id => new DefaultStyleController(DOM.createStyleSheet(container), id), filter: instantiationService.createInstance(SettingsTreeFilter, viewState), smoothScrolling: configurationService.getValue('workbench.list.smoothScrolling'), @@ -2365,64 +2449,64 @@ export class SettingsTree extends WorkbenchObjectTree { // 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-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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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} }`); + 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}; }`); + 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-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} }`); + 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/settingsTreeModels.ts b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts index 27b1cbbc00b..f4d426c0b36 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts @@ -503,7 +503,7 @@ function sanitizeId(id: string): string { return id.replace(/[\.\/]/, '_'); } -export function settingKeyToDisplayFormat(key: string, groupId = ''): { category: string, label: string; } { +export function settingKeyToDisplayFormat(key: string, groupId = ''): { category: string; label: string } { const lastDotIdx = key.lastIndexOf('.'); let category = ''; if (lastDotIdx >= 0) { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index c894c09dfb4..4b31b923266 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -23,93 +23,49 @@ 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 { editorWidgetBorder, focusBorder, foreground, inputBackground, inputBorder, inputForeground, listActiveSelectionBackground, listActiveSelectionForeground, listDropBackground, listFocusBackground, listHoverBackground, listHoverForeground, listInactiveSelectionBackground, listInactiveSelectionForeground, registerColor, selectBackground, selectBorder, selectForeground, simpleCheckboxBackground, simpleCheckboxBorder, simpleCheckboxForeground, textLinkActiveForeground, textLinkForeground, textPreformatForeground, transparent } from 'vs/platform/theme/common/colorRegistry'; +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 { 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'; const $ = DOM.$; -export const settingsHeaderForeground = registerColor('settings.headerForeground', { light: '#444444', dark: '#e7e7e7', hc: '#ffffff' }, localize('headerForeground', "The foreground color for a section header or active title.")); -export const modifiedItemIndicator = registerColor('settings.modifiedItemIndicator', { - light: new Color(new RGBA(102, 175, 224)), - dark: new Color(new RGBA(12, 125, 157)), - hc: new Color(new RGBA(0, 73, 122)) -}, localize('modifiedItemForeground', "The color of the modified setting indicator.")); - -// Enum control colors -export const settingsSelectBackground = registerColor(`settings.dropdownBackground`, { dark: selectBackground, light: selectBackground, hc: selectBackground }, localize('settingsDropdownBackground', "Settings editor dropdown background.")); -export const settingsSelectForeground = registerColor('settings.dropdownForeground', { dark: selectForeground, light: selectForeground, hc: selectForeground }, localize('settingsDropdownForeground', "Settings editor dropdown foreground.")); -export const settingsSelectBorder = registerColor('settings.dropdownBorder', { dark: selectBorder, light: selectBorder, hc: selectBorder }, localize('settingsDropdownBorder', "Settings editor dropdown border.")); -export const settingsSelectListBorder = registerColor('settings.dropdownListBorder', { dark: editorWidgetBorder, light: editorWidgetBorder, hc: editorWidgetBorder }, localize('settingsDropdownListBorder', "Settings editor dropdown list border. This surrounds the options and separates the options from the description.")); - -// Bool control colors -export const settingsCheckboxBackground = registerColor('settings.checkboxBackground', { dark: simpleCheckboxBackground, light: simpleCheckboxBackground, hc: simpleCheckboxBackground }, localize('settingsCheckboxBackground', "Settings editor checkbox background.")); -export const settingsCheckboxForeground = registerColor('settings.checkboxForeground', { dark: simpleCheckboxForeground, light: simpleCheckboxForeground, hc: simpleCheckboxForeground }, localize('settingsCheckboxForeground', "Settings editor checkbox foreground.")); -export const settingsCheckboxBorder = registerColor('settings.checkboxBorder', { dark: simpleCheckboxBorder, light: simpleCheckboxBorder, hc: simpleCheckboxBorder }, localize('settingsCheckboxBorder', "Settings editor checkbox border.")); - -// Text control colors -export const settingsTextInputBackground = registerColor('settings.textInputBackground', { dark: inputBackground, light: inputBackground, hc: inputBackground }, localize('textInputBoxBackground', "Settings editor text input box background.")); -export const settingsTextInputForeground = registerColor('settings.textInputForeground', { dark: inputForeground, light: inputForeground, hc: inputForeground }, localize('textInputBoxForeground', "Settings editor text input box foreground.")); -export const settingsTextInputBorder = registerColor('settings.textInputBorder', { dark: inputBorder, light: inputBorder, hc: inputBorder }, localize('textInputBoxBorder', "Settings editor text input box border.")); - -// Number control colors -export const settingsNumberInputBackground = registerColor('settings.numberInputBackground', { dark: inputBackground, light: inputBackground, hc: inputBackground }, localize('numberInputBoxBackground', "Settings editor number input box background.")); -export const settingsNumberInputForeground = registerColor('settings.numberInputForeground', { dark: inputForeground, light: inputForeground, hc: inputForeground }, localize('numberInputBoxForeground', "Settings editor number input box foreground.")); -export const settingsNumberInputBorder = registerColor('settings.numberInputBorder', { dark: inputBorder, light: inputBorder, hc: inputBorder }, localize('numberInputBoxBorder', "Settings editor number input box border.")); - -export const focusedRowBackground = registerColor('settings.focusedRowBackground', { - dark: Color.fromHex('#808080').transparent(0.14), - light: transparent(listFocusBackground, .4), - hc: null -}, localize('focusedRowBackground', "The background color of a settings row when focused.")); - -export const rowHoverBackground = registerColor('settings.rowHoverBackground', { - dark: transparent(focusedRowBackground, .5), - light: transparent(focusedRowBackground, .7), - hc: null -}, localize('settings.rowHoverBackground', "The background color of a settings row when hovered.")); - -export const focusedRowBorder = registerColor('settings.focusedRowBorder', { - dark: Color.white.transparent(0.12), - light: Color.black.transparent(0.12), - hc: focusBorder -}, localize('settings.focusedRowBorder', "The color of the row's top and bottom border when the row is focused.")); 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; }`); + 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; }`); + 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; }`); + 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-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(`.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}; }`); + 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(`.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}; }`); 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}; }`); } @@ -127,50 +83,50 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) = // 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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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}; }`); + 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(`.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} }`); + 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); if (modifiedItemIndicatorColor) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents > .setting-item-modified-indicator { border-color: ${modifiedItemIndicatorColor}; }`); + collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents > .setting-item-modified-indicator { border-color: ${modifiedItemIndicatorColor}; }`); } }); @@ -324,9 +280,9 @@ export abstract class AbstractListSettingWidget extend protected abstract isItemNew(item: TDataItem): boolean; protected abstract addTooltipsToRow(rowElement: RowElementGroup, item: TDataItem): void; protected abstract getLocalizedStrings(): { - deleteActionTooltip: string - editActionTooltip: string - addButtonLabel: string + deleteActionTooltip: string; + editActionTooltip: string; + addButtonLabel: string; }; protected renderHeader(): HTMLElement | undefined { @@ -528,8 +484,8 @@ interface IListSetValueOptions { } export interface IListDataItem { - value: ObjectKey, - sibling?: string + value: ObjectKey; + sibling?: string; } interface ListSettingWidgetDragDetails { @@ -897,7 +853,7 @@ interface IObjectStringData { export interface IObjectEnumOption { value: string; - description?: string + description?: string; } interface IObjectEnumData { diff --git a/src/vs/workbench/contrib/preferences/browser/tocTree.ts b/src/vs/workbench/contrib/preferences/browser/tocTree.ts index edb880108f3..1451c190687 100644 --- a/src/vs/workbench/contrib/preferences/browser/tocTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/tocTree.ts @@ -20,7 +20,7 @@ import { attachStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { SettingsTreeFilter } from 'vs/workbench/contrib/preferences/browser/settingsTree'; import { ISettingsEditorViewState, SearchResultModel, SettingsTreeElement, SettingsTreeGroupElement, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; -import { settingsHeaderForeground } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; +import { settingsHeaderForeground } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; const $ = DOM.$; diff --git a/src/vs/workbench/contrib/preferences/common/preferences.ts b/src/vs/workbench/contrib/preferences/common/preferences.ts index f3c605cf91c..6318c87aa7e 100644 --- a/src/vs/workbench/contrib/preferences/common/preferences.ts +++ b/src/vs/workbench/contrib/preferences/common/preferences.ts @@ -18,7 +18,7 @@ export interface IWorkbenchSettingsConfiguration { useNaturalLanguageSearchPost: boolean; enableNaturalLanguageSearch: boolean; enableNaturalLanguageSearchFeedback: boolean; - } + }; }; } @@ -51,6 +51,7 @@ export const CONTEXT_SETTINGS_ROW_FOCUS = new RawContextKey('settingRow export const CONTEXT_KEYBINDINGS_EDITOR = new RawContextKey('inKeybindings', false); export const CONTEXT_KEYBINDINGS_SEARCH_FOCUS = new RawContextKey('inKeybindingsSearch', false); export const CONTEXT_KEYBINDING_FOCUS = new RawContextKey('keybindingFocus', false); +export const CONTEXT_WHEN_FOCUS = new RawContextKey('whenFocus', false); export const KEYBINDINGS_EDITOR_COMMAND_SEARCH = 'keybindings.editor.searchKeybindings'; export const KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS = 'keybindings.editor.clearSearchResults'; diff --git a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts index 0bfd8de7611..0a210e04734 100644 --- a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts +++ b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts @@ -8,7 +8,7 @@ import { isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import * as nls from 'vs/nls'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; diff --git a/src/vs/workbench/contrib/preferences/common/settingsEditorColorRegistry.ts b/src/vs/workbench/contrib/preferences/common/settingsEditorColorRegistry.ts new file mode 100644 index 00000000000..dfc52a392fa --- /dev/null +++ b/src/vs/workbench/contrib/preferences/common/settingsEditorColorRegistry.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 { Color, RGBA } from 'vs/base/common/color'; +import { localize } from 'vs/nls'; +import { editorWidgetBorder, focusBorder, inputBackground, inputBorder, inputForeground, listHoverBackground, registerColor, selectBackground, selectBorder, selectForeground, simpleCheckboxBackground, simpleCheckboxBorder, simpleCheckboxForeground, transparent } from 'vs/platform/theme/common/colorRegistry'; +import { PANEL_BORDER } from 'vs/workbench/common/theme'; + +// General setting colors +export const settingsHeaderForeground = registerColor('settings.headerForeground', { light: '#444444', dark: '#e7e7e7', hc: '#ffffff' }, localize('headerForeground', "The foreground color for a section header or active title.")); +export const modifiedItemIndicator = registerColor('settings.modifiedItemIndicator', { + light: new Color(new RGBA(102, 175, 224)), + dark: new Color(new RGBA(12, 125, 157)), + hc: new Color(new RGBA(0, 73, 122)) +}, localize('modifiedItemForeground', "The color of the modified setting indicator.")); +export const settingsHeaderBorder = registerColor('settings.headerBorder', { dark: PANEL_BORDER, light: PANEL_BORDER, hc: PANEL_BORDER }, localize('settingsHeaderBorder', "The color of the header container border.")); + +// Enum control colors +export const settingsSelectBackground = registerColor(`settings.dropdownBackground`, { dark: selectBackground, light: selectBackground, hc: selectBackground }, localize('settingsDropdownBackground', "Settings editor dropdown background.")); +export const settingsSelectForeground = registerColor('settings.dropdownForeground', { dark: selectForeground, light: selectForeground, hc: selectForeground }, localize('settingsDropdownForeground', "Settings editor dropdown foreground.")); +export const settingsSelectBorder = registerColor('settings.dropdownBorder', { dark: selectBorder, light: selectBorder, hc: selectBorder }, localize('settingsDropdownBorder', "Settings editor dropdown border.")); +export const settingsSelectListBorder = registerColor('settings.dropdownListBorder', { dark: editorWidgetBorder, light: editorWidgetBorder, hc: editorWidgetBorder }, localize('settingsDropdownListBorder', "Settings editor dropdown list border. This surrounds the options and separates the options from the description.")); + +// Bool control colors +export const settingsCheckboxBackground = registerColor('settings.checkboxBackground', { dark: simpleCheckboxBackground, light: simpleCheckboxBackground, hc: simpleCheckboxBackground }, localize('settingsCheckboxBackground', "Settings editor checkbox background.")); +export const settingsCheckboxForeground = registerColor('settings.checkboxForeground', { dark: simpleCheckboxForeground, light: simpleCheckboxForeground, hc: simpleCheckboxForeground }, localize('settingsCheckboxForeground', "Settings editor checkbox foreground.")); +export const settingsCheckboxBorder = registerColor('settings.checkboxBorder', { dark: simpleCheckboxBorder, light: simpleCheckboxBorder, hc: simpleCheckboxBorder }, localize('settingsCheckboxBorder', "Settings editor checkbox border.")); + +// Text control colors +export const settingsTextInputBackground = registerColor('settings.textInputBackground', { dark: inputBackground, light: inputBackground, hc: inputBackground }, localize('textInputBoxBackground', "Settings editor text input box background.")); +export const settingsTextInputForeground = registerColor('settings.textInputForeground', { dark: inputForeground, light: inputForeground, hc: inputForeground }, localize('textInputBoxForeground', "Settings editor text input box foreground.")); +export const settingsTextInputBorder = registerColor('settings.textInputBorder', { dark: inputBorder, light: inputBorder, hc: inputBorder }, localize('textInputBoxBorder', "Settings editor text input box border.")); + +// Number control colors +export const settingsNumberInputBackground = registerColor('settings.numberInputBackground', { dark: inputBackground, light: inputBackground, hc: inputBackground }, localize('numberInputBoxBackground', "Settings editor number input box background.")); +export const settingsNumberInputForeground = registerColor('settings.numberInputForeground', { dark: inputForeground, light: inputForeground, hc: inputForeground }, localize('numberInputBoxForeground', "Settings editor number input box foreground.")); +export const settingsNumberInputBorder = registerColor('settings.numberInputBorder', { dark: inputBorder, light: inputBorder, hc: inputBorder }, localize('numberInputBoxBorder', "Settings editor number input box border.")); + +export const focusedRowBackground = registerColor('settings.focusedRowBackground', { + dark: transparent(listHoverBackground, .6), + light: transparent(listHoverBackground, .6), + hc: null +}, localize('focusedRowBackground', "The background color of a settings row when focused.")); + +export const rowHoverBackground = registerColor('settings.rowHoverBackground', { + dark: transparent(listHoverBackground, .3), + light: transparent(listHoverBackground, .3), + hc: null +}, localize('settings.rowHoverBackground', "The background color of a settings row when hovered.")); + +export const focusedRowBorder = registerColor('settings.focusedRowBorder', { + dark: Color.white.transparent(0.12), + light: Color.black.transparent(0.12), + hc: focusBorder +}, localize('settings.focusedRowBorder', "The color of the row's top and bottom border when the row is focused.")); diff --git a/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts b/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts index d2b7c7e59ec..6d2258b96f1 100644 --- a/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts +++ b/src/vs/workbench/contrib/quickaccess/browser/commandsQuickAccess.ts @@ -11,7 +11,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { CancellationToken } from 'vs/base/common/cancellation'; import { timeout } from 'vs/base/common/async'; import { DisposableStore, toDisposable, dispose } from 'vs/base/common/lifecycle'; -import { AbstractEditorCommandsQuickAccessProvider } from 'vs/editor/contrib/quickAccess/commandsQuickAccess'; +import { AbstractEditorCommandsQuickAccessProvider } from 'vs/editor/contrib/quickAccess/browser/commandsQuickAccess'; import { IEditor } from 'vs/editor/common/editorCommon'; import { Language } from 'vs/base/common/platform'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts b/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts index a1884ae7136..68d4d3cd727 100644 --- a/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts +++ b/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts @@ -22,7 +22,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IProductService } from 'vs/platform/product/common/productService'; interface IConfiguration extends IWindowsConfiguration { - update?: { mode?: string; }; + update?: { mode?: string }; debug?: { console?: { wordWrap?: boolean } }; editor?: { accessibilitySupport?: 'on' | 'off' | 'auto' }; security?: { workspace?: { trust?: { enabled?: boolean } } }; diff --git a/src/vs/workbench/contrib/remote/browser/remote.contribution.ts b/src/vs/workbench/contrib/remote/browser/remote.contribution.ts new file mode 100644 index 00000000000..6982a033c25 --- /dev/null +++ b/src/vs/workbench/contrib/remote/browser/remote.contribution.ts @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { ShowCandidateContribution } from 'vs/workbench/contrib/remote/browser/showCandidate'; +import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; +import { TunnelFactoryContribution } from 'vs/workbench/contrib/remote/browser/tunnelFactory'; +import { RemoteAgentConnectionStatusListener, RemoteMarkers } from 'vs/workbench/contrib/remote/browser/remote'; +import { RemoteStatusIndicator } from 'vs/workbench/contrib/remote/browser/remoteIndicator'; +import { AutomaticPortForwarding, ForwardedPortsView, PortRestore } from 'vs/workbench/contrib/remote/browser/remoteExplorer'; + +const workbenchContributionsRegistry = Registry.as(WorkbenchExtensions.Workbench); +workbenchContributionsRegistry.registerWorkbenchContribution(ShowCandidateContribution, LifecyclePhase.Ready); +workbenchContributionsRegistry.registerWorkbenchContribution(TunnelFactoryContribution, LifecyclePhase.Ready); +workbenchContributionsRegistry.registerWorkbenchContribution(RemoteAgentConnectionStatusListener, LifecyclePhase.Eventually); +workbenchContributionsRegistry.registerWorkbenchContribution(RemoteStatusIndicator, LifecyclePhase.Starting); +workbenchContributionsRegistry.registerWorkbenchContribution(ForwardedPortsView, LifecyclePhase.Eventually); +workbenchContributionsRegistry.registerWorkbenchContribution(PortRestore, LifecyclePhase.Eventually); +workbenchContributionsRegistry.registerWorkbenchContribution(AutomaticPortForwarding, LifecyclePhase.Eventually); +workbenchContributionsRegistry.registerWorkbenchContribution(RemoteMarkers, LifecyclePhase.Eventually); diff --git a/src/vs/workbench/contrib/remote/browser/remote.ts b/src/vs/workbench/contrib/remote/browser/remote.ts index f0711a50251..430fa601d97 100644 --- a/src/vs/workbench/contrib/remote/browser/remote.ts +++ b/src/vs/workbench/contrib/remote/browser/remote.ts @@ -17,7 +17,7 @@ import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService' import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IExtensionService, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { FilterViewPaneContainer } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { AutomaticPortForwarding, ForwardedPortsView, PortRestore, VIEWLET_ID } from 'vs/workbench/contrib/remote/browser/remoteExplorer'; +import { VIEWLET_ID } from 'vs/workbench/contrib/remote/browser/remoteExplorer'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IViewDescriptor, IViewsRegistry, Extensions, ViewContainerLocation, IViewContainersRegistry, IViewDescriptorService } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -27,14 +27,13 @@ import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { registerAction2 } from 'vs/platform/actions/common/actions'; import { IProgress, IProgressStep, IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; -import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { ReconnectionWaitEvent, PersistentConnectionEventType } from 'vs/platform/remote/common/remoteAgentConnection'; import Severity from 'vs/base/common/severity'; import { ReloadWindowAction } from 'vs/workbench/browser/actions/windowActions'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { SwitchRemoteViewItem, SwitchRemoteAction } from 'vs/workbench/contrib/remote/browser/explorerViewItems'; import { Action } from 'vs/base/common/actions'; import { isStringArray } from 'vs/base/common/types'; @@ -48,14 +47,12 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Event } from 'vs/base/common/event'; import { ExtensionsRegistry, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { RemoteStatusIndicator } from 'vs/workbench/contrib/remote/browser/remoteIndicator'; import * as icons from 'vs/workbench/contrib/remote/browser/remoteIcons'; import { ILogService } from 'vs/platform/log/common/log'; 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 { extensionDescription: IExtensionDescription; getStarted?: string; @@ -149,7 +146,7 @@ class HelpDataSource implements IAsyncDataSource { } } interface IHelpItem { - icon: ThemeIcon, + icon: ThemeIcon; iconClasses: string[]; label: string; handleClick(): Promise; @@ -582,7 +579,7 @@ Registry.as(Extensions.ViewContainersRegistry).register order: 4 }, ViewContainerLocation.Sidebar); -class RemoteMarkers implements IWorkbenchContribution { +export class RemoteMarkers implements IWorkbenchContribution { constructor( @IRemoteAgentService remoteAgentService: IRemoteAgentService, @@ -701,7 +698,7 @@ class ReconnectionTimer implements IDisposable { */ const DISCONNECT_PROMPT_TIME = 40 * 1000; // 40 seconds -class RemoteAgentConnectionStatusListener extends Disposable implements IWorkbenchContribution { +export class RemoteAgentConnectionStatusListener extends Disposable implements IWorkbenchContribution { private _reloadWindowShown: boolean = false; @@ -726,7 +723,7 @@ class RemoteAgentConnectionStatusListener extends Disposable implements IWorkben let reconnectWaitEvent: ReconnectionWaitEvent | null = null; let disposableListener: IDisposable | null = null; - function showProgress(location: ProgressLocation.Dialog | ProgressLocation.Notification | null, buttons: { label: string, callback: () => void }[], initialReport: string | null = null): VisibleProgress { + function showProgress(location: ProgressLocation.Dialog | ProgressLocation.Notification | null, buttons: { label: string; callback: () => void }[], initialReport: string | null = null): VisibleProgress { if (visibleProgress) { visibleProgress.dispose(); visibleProgress = null; @@ -778,10 +775,10 @@ class RemoteAgentConnectionStatusListener extends Disposable implements IWorkben callback: () => { type ReconnectReloadClassification = { - remoteName: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - reconnectionToken: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - millisSinceLastIncomingData: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - attempt: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + remoteName: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + reconnectionToken: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + millisSinceLastIncomingData: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + attempt: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type ReconnectReloadEvent = { remoteName: string | undefined; @@ -822,8 +819,8 @@ class RemoteAgentConnectionStatusListener extends Disposable implements IWorkben reconnectionAttempts = 0; type RemoteConnectionLostClassification = { - remoteName: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - reconnectionToken: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + remoteName: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + reconnectionToken: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type RemoteConnectionLostEvent = { remoteName: string | undefined; @@ -856,10 +853,10 @@ class RemoteAgentConnectionStatusListener extends Disposable implements IWorkben reconnectionAttempts = e.attempt; type RemoteReconnectionRunningClassification = { - remoteName: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - reconnectionToken: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - millisSinceLastIncomingData: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - attempt: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + remoteName: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + reconnectionToken: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + millisSinceLastIncomingData: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + attempt: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type RemoteReconnectionRunningEvent = { remoteName: string | undefined; @@ -895,11 +892,11 @@ class RemoteAgentConnectionStatusListener extends Disposable implements IWorkben reconnectionAttempts = e.attempt; type RemoteReconnectionPermanentFailureClassification = { - remoteName: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - reconnectionToken: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - millisSinceLastIncomingData: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - attempt: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - handled: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + remoteName: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + reconnectionToken: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + millisSinceLastIncomingData: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + attempt: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + handled: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type RemoteReconnectionPermanentFailureEvent = { remoteName: string | undefined; @@ -938,10 +935,10 @@ class RemoteAgentConnectionStatusListener extends Disposable implements IWorkben reconnectionAttempts = e.attempt; type RemoteConnectionGainClassification = { - remoteName: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - reconnectionToken: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - millisSinceLastIncomingData: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - attempt: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + remoteName: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + reconnectionToken: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + millisSinceLastIncomingData: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + attempt: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type RemoteConnectionGainEvent = { remoteName: string | undefined; @@ -963,11 +960,3 @@ class RemoteAgentConnectionStatusListener extends Disposable implements IWorkben } } } - -const workbenchContributionsRegistry = Registry.as(WorkbenchExtensions.Workbench); -workbenchContributionsRegistry.registerWorkbenchContribution(RemoteAgentConnectionStatusListener, LifecyclePhase.Eventually); -workbenchContributionsRegistry.registerWorkbenchContribution(RemoteStatusIndicator, LifecyclePhase.Starting); -workbenchContributionsRegistry.registerWorkbenchContribution(ForwardedPortsView, LifecyclePhase.Eventually); -workbenchContributionsRegistry.registerWorkbenchContribution(PortRestore, LifecyclePhase.Eventually); -workbenchContributionsRegistry.registerWorkbenchContribution(AutomaticPortForwarding, LifecyclePhase.Eventually); -workbenchContributionsRegistry.registerWorkbenchContribution(RemoteMarkers, LifecyclePhase.Eventually); diff --git a/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts b/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts index 1021166c131..935ba605c07 100644 --- a/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts +++ b/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts @@ -21,7 +21,7 @@ import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal import { IDebugService } from 'vs/workbench/contrib/debug/common/debug'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { isWeb, OperatingSystem } from 'vs/base/common/platform'; -import { isPortPrivileged, ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; +import { isPortPrivileged, ITunnelService, RemoteTunnel } from 'vs/platform/tunnel/common/tunnel'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; @@ -613,7 +613,7 @@ class ProcAutomaticPortForwarding extends Disposable { return allTunnels; } - private async handleCandidateUpdate(removed: Map) { + private async handleCandidateUpdate(removed: Map) { const removedPorts: number[] = []; for (const removedPort of removed) { const key = removedPort[0]; diff --git a/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts b/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts index 7570ab29201..954266d0fa3 100644 --- a/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts +++ b/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts @@ -17,7 +17,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { Schemas } from 'vs/base/common/network'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { PersistentConnectionEventType } from 'vs/platform/remote/common/remoteAgentConnection'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IHostService } from 'vs/workbench/services/host/browser/host'; @@ -25,7 +25,8 @@ import { isWeb } from 'vs/base/common/platform'; import { once } from 'vs/base/common/functional'; import { truncate } from 'vs/base/common/strings'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { getRemoteName, getVirtualWorkspaceLocation } from 'vs/platform/remote/common/remoteHosts'; +import { getRemoteName } from 'vs/platform/remote/common/remoteHosts'; +import { getVirtualWorkspaceLocation } from 'vs/platform/workspace/common/virtualWorkspace'; import { getCodiconAriaLabel } from 'vs/base/common/codicons'; import { ILogService } from 'vs/platform/log/common/log'; import { ReloadWindowAction } from 'vs/workbench/browser/actions/windowActions'; @@ -33,11 +34,10 @@ import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common import { IExtensionsViewPaneContainer, LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID, VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; -import { RemoteNameContext, VirtualWorkspaceContext } from 'vs/workbench/browser/contextkeys'; +import { RemoteNameContext, VirtualWorkspaceContext } from 'vs/workbench/common/contextkeys'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ViewContainerLocation } from 'vs/workbench/common/views'; - type ActionGroup = [string, Array]; export class RemoteStatusIndicator extends Disposable implements IWorkbenchContribution { @@ -66,7 +66,7 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr constructor( @IStatusbarService private readonly statusbarService: IStatusbarService, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService, @ILabelService private readonly labelService: ILabelService, @IContextKeyService private contextKeyService: IContextKeyService, @IMenuService private menuService: IMenuService, @@ -273,15 +273,15 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr private updateRemoteStatusIndicator(): void { - // Remote Indicator: show if provided via options + // Remote Indicator: show if provided via options, e.g. by the web embedder API const remoteIndicator = this.environmentService.options?.windowIndicator; if (remoteIndicator) { this.renderRemoteStatusIndicator(truncate(remoteIndicator.label, RemoteStatusIndicator.REMOTE_STATUS_LABEL_MAX_LENGTH), remoteIndicator.tooltip, remoteIndicator.command); return; } - // Remote Authority: show connection state - if (this.remoteAuthority) { + // Show for remote windows on the desktop, but not when in code server web + if (this.remoteAuthority && !isWeb) { const hostLabel = this.labelService.getHostLabel(Schemas.vscodeRemote, this.remoteAuthority) || this.remoteAuthority; switch (this.connectionState) { case 'initializing': @@ -305,7 +305,9 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr } } return; - } else if (this.virtualWorkspaceLocation) { + } + // show when in a virtual workspace + if (this.virtualWorkspaceLocation) { // Workspace with label: indicate editing source const workspaceLabel = this.labelService.getHostLabel(this.virtualWorkspaceLocation.scheme, this.virtualWorkspaceLocation.authority); if (workspaceLabel) { @@ -316,7 +318,7 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr } else { tooltip.appendText(nls.localize({ key: 'workspace.tooltip', comment: ['{0} is a remote workspace name, e.g. GitHub'] }, "Editing on {0}", workspaceLabel)); } - if (!isWeb) { + if (!isWeb || this.remoteAuthority) { tooltip.appendMarkdown('\n\n'); tooltip.appendMarkdown(nls.localize( { key: 'workspace.tooltip2', comment: ['[features are not available]({1}) is a link. Only translate `features are not available`. Do not change brackets and parentheses or {0}'] }, diff --git a/src/vs/workbench/contrib/remote/common/showCandidate.ts b/src/vs/workbench/contrib/remote/browser/showCandidate.ts similarity index 87% rename from src/vs/workbench/contrib/remote/common/showCandidate.ts rename to src/vs/workbench/contrib/remote/browser/showCandidate.ts index df661a11971..9736fc5fd10 100644 --- a/src/vs/workbench/contrib/remote/common/showCandidate.ts +++ b/src/vs/workbench/contrib/remote/browser/showCandidate.ts @@ -5,13 +5,13 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { CandidatePort, IRemoteExplorerService } from 'vs/workbench/services/remote/common/remoteExplorerService'; export class ShowCandidateContribution extends Disposable implements IWorkbenchContribution { constructor( @IRemoteExplorerService remoteExplorerService: IRemoteExplorerService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService environmentService: IBrowserWorkbenchEnvironmentService, ) { super(); const showPortCandidate = environmentService.options?.tunnelProvider?.showPortCandidate; diff --git a/src/vs/workbench/contrib/remote/common/tunnelFactory.ts b/src/vs/workbench/contrib/remote/browser/tunnelFactory.ts similarity index 94% rename from src/vs/workbench/contrib/remote/common/tunnelFactory.ts rename to src/vs/workbench/contrib/remote/browser/tunnelFactory.ts index d07daa8f4af..4ea8ea00f02 100644 --- a/src/vs/workbench/contrib/remote/common/tunnelFactory.ts +++ b/src/vs/workbench/contrib/remote/browser/tunnelFactory.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { ITunnelService, TunnelOptions, RemoteTunnel, TunnelCreationOptions, ITunnel, TunnelProtocol, TunnelPrivacyId } from 'vs/platform/remote/common/tunnel'; +import { ITunnelService, TunnelOptions, RemoteTunnel, TunnelCreationOptions, ITunnel, TunnelProtocol, TunnelPrivacyId } from 'vs/platform/tunnel/common/tunnel'; import { Disposable } from 'vs/base/common/lifecycle'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { URI } from 'vs/base/common/uri'; import { IRemoteExplorerService } from 'vs/workbench/services/remote/common/remoteExplorerService'; @@ -17,7 +17,7 @@ export class TunnelFactoryContribution extends Disposable implements IWorkbenchC constructor( @ITunnelService tunnelService: ITunnelService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService environmentService: IBrowserWorkbenchEnvironmentService, @IOpenerService private openerService: IOpenerService, @IRemoteExplorerService remoteExplorerService: IRemoteExplorerService, @ILogService logService: ILogService diff --git a/src/vs/workbench/contrib/remote/browser/tunnelView.ts b/src/vs/workbench/contrib/remote/browser/tunnelView.ts index 3d9236aa451..4ea1dc4cbb6 100644 --- a/src/vs/workbench/contrib/remote/browser/tunnelView.ts +++ b/src/vs/workbench/contrib/remote/browser/tunnelView.ts @@ -34,7 +34,8 @@ import { IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platfor import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPane'; import { URI } from 'vs/base/common/uri'; -import { isAllInterfaces, isLocalhost, isPortPrivileged, ITunnelService, RemoteTunnel, TunnelPrivacy, TunnelPrivacyId, TunnelProtocol } from 'vs/platform/remote/common/tunnel'; +import { isAllInterfaces, isLocalhost, isPortPrivileged, ITunnelService, RemoteTunnel, TunnelPrivacyId, TunnelProtocol } from 'vs/platform/tunnel/common/tunnel'; +import { TunnelPrivacy } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -568,7 +569,7 @@ class TunnelItem implements ITunnelItem { public tunnelType: TunnelType, public remoteHost: string, public remotePort: number, - public source: { source: TunnelSource, description: string }, + public source: { source: TunnelSource; description: string }, public hasRunningProcess: boolean, public protocol: TunnelProtocol, public localUri?: URI, @@ -1039,7 +1040,7 @@ namespace LabelTunnelAction { } export function handler(): ICommandHandler { - return async (accessor, arg): Promise<{ port: number, label: string } | undefined> => { + return async (accessor, arg): Promise<{ port: number; label: string } | undefined> => { const context = isITunnelItem(arg) ? arg : accessor.get(IContextKeyService).getContextKeyValue(TunnelViewSelectionKeyName); if (context) { return new Promise(resolve => { @@ -1079,7 +1080,7 @@ export namespace ForwardPortAction { export const TREEITEM_LABEL = nls.localize('remote.tunnel.forwardItem', "Forward Port"); const forwardPrompt = nls.localize('remote.tunnel.forwardPrompt', "Port number or address (eg. 3000 or 10.10.10.10:2000)."); - function validateInput(remoteExplorerService: IRemoteExplorerService, value: string, canElevate: boolean): { content: string, severity: Severity } | null { + function validateInput(remoteExplorerService: IRemoteExplorerService, value: string, canElevate: boolean): { content: string; severity: Severity } | null { const parsed = parseAddress(value); if (!parsed) { return { content: invalidPortString, severity: Severity.Error }; @@ -1107,7 +1108,7 @@ export namespace ForwardPortAction { remoteExplorerService.setEditable(undefined, TunnelEditId.New, { onFinish: async (value, success) => { remoteExplorerService.setEditable(undefined, TunnelEditId.New, null); - let parsed: { host: string, port: number } | undefined; + let parsed: { host: string; port: number } | undefined; if (success && (parsed = parseAddress(value))) { remoteExplorerService.forward({ remote: { host: parsed.host, port: parsed.port }, @@ -1133,7 +1134,7 @@ export namespace ForwardPortAction { prompt: forwardPrompt, validateInput: (value) => Promise.resolve(validateInput(remoteExplorerService, value, tunnelService.canElevate)) }); - let parsed: { host: string, port: number } | undefined; + let parsed: { host: string; port: number } | undefined; if (value && (parsed = parseAddress(value))) { remoteExplorerService.forward({ remote: { host: parsed.host, port: parsed.port }, @@ -1145,7 +1146,7 @@ export namespace ForwardPortAction { } interface QuickPickTunnel extends IQuickPickItem { - tunnel?: ITunnelItem + tunnel?: ITunnelItem; } function makeTunnelPicks(tunnels: Tunnel[], remoteExplorerService: IRemoteExplorerService, tunnelService: ITunnelService): QuickPickInput[] { @@ -1359,7 +1360,7 @@ namespace ChangeLocalPortAction { export const ID = 'remote.tunnel.changeLocalPort'; export const LABEL = nls.localize('remote.tunnel.changeLocalPort', "Change Local Address Port"); - function validateInput(value: string, canElevate: boolean): { content: string, severity: Severity } | null { + function validateInput(value: string, canElevate: boolean): { content: string; severity: Severity } | null { if (!value.match(/^[0-9]+$/)) { return { content: invalidPortString, severity: Severity.Error }; } else if (Number(value) >= maxPortNumber) { diff --git a/src/vs/workbench/contrib/remote/browser/urlFinder.ts b/src/vs/workbench/contrib/remote/browser/urlFinder.ts index 0d85ddb8b1e..8eaaf1a7156 100644 --- a/src/vs/workbench/contrib/remote/browser/urlFinder.ts +++ b/src/vs/workbench/contrib/remote/browser/urlFinder.ts @@ -26,7 +26,7 @@ export class UrlFinder extends Disposable { private static readonly excludeTerminals = ['Dev Containers']; - private _onDidMatchLocalUrl: Emitter<{ host: string, port: number }> = new Emitter(); + private _onDidMatchLocalUrl: Emitter<{ host: string; port: number }> = new Emitter(); public readonly onDidMatchLocalUrl = this._onDidMatchLocalUrl.event; private listeners: Map = new Map(); @@ -68,7 +68,7 @@ export class UrlFinder extends Disposable { } } - private replPositions: Map = new Map(); + private replPositions: Map = new Map(); private processNewReplElements(session: IDebugSession) { const oldReplPosition = this.replPositions.get(session.getId()); const replElements = session.getReplElements(); diff --git a/src/vs/workbench/contrib/remote/common/remote.contribution.ts b/src/vs/workbench/contrib/remote/common/remote.contribution.ts index 83c158dd41b..1761921245e 100644 --- a/src/vs/workbench/contrib/remote/common/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/common/remote.contribution.ts @@ -16,8 +16,6 @@ import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/s import { localize } from 'vs/nls'; import { joinPath } from 'vs/base/common/resources'; import { Disposable } from 'vs/base/common/lifecycle'; -import { TunnelFactoryContribution } from 'vs/workbench/contrib/remote/common/tunnelFactory'; -import { ShowCandidateContribution } from 'vs/workbench/contrib/remote/common/showCandidate'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { IFileService } from 'vs/platform/files/common/files'; @@ -162,8 +160,6 @@ workbenchContributionsRegistry.registerWorkbenchContribution(LabelContribution, workbenchContributionsRegistry.registerWorkbenchContribution(RemoteChannelsContribution, LifecyclePhase.Starting); workbenchContributionsRegistry.registerWorkbenchContribution(RemoteInvalidWorkspaceDetector, LifecyclePhase.Starting); workbenchContributionsRegistry.registerWorkbenchContribution(RemoteLogOutputChannels, LifecyclePhase.Restored); -workbenchContributionsRegistry.registerWorkbenchContribution(TunnelFactoryContribution, LifecyclePhase.Ready); -workbenchContributionsRegistry.registerWorkbenchContribution(ShowCandidateContribution, LifecyclePhase.Ready); const enableDiagnostics = true; diff --git a/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts b/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts index 6c88e74721e..2f2a01b9420 100644 --- a/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts @@ -53,7 +53,7 @@ class RemoteAgentDiagnosticListener implements IWorkbenchContribution { @IRemoteAgentService remoteAgentService: IRemoteAgentService, @ILabelService labelService: ILabelService ) { - ipcRenderer.on('vscode:getDiagnosticInfo', (event: unknown, request: { replyChannel: string, args: IDiagnosticInfoOptions }): void => { + ipcRenderer.on('vscode:getDiagnosticInfo', (event: unknown, request: { replyChannel: string; args: IDiagnosticInfoOptions }): void => { const connection = remoteAgentService.getConnection(); if (connection) { const hostName = labelService.getHostLabel(Schemas.vscodeRemote, connection.remoteAuthority); @@ -137,7 +137,7 @@ class RemoteEmptyWorkbenchPresentation extends Disposable implements IWorkbenchC return shouldShowExplorer(); } - const { remoteAuthority, filesToDiff, filesToOpenOrCreate, filesToWait } = environmentService.configuration; + const { remoteAuthority, filesToDiff, filesToOpenOrCreate, filesToWait } = environmentService; if (remoteAuthority && contextService.getWorkbenchState() === WorkbenchState.EMPTY && !filesToDiff?.length && !filesToOpenOrCreate?.length && !filesToWait) { remoteAuthorityResolverService.resolveAuthority(remoteAuthority).then(() => { if (shouldShowExplorer()) { diff --git a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts index 642ea42611a..b37bc3a192d 100644 --- a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts @@ -24,7 +24,7 @@ import { registerColor, transparent } from 'vs/platform/theme/common/colorRegist import { Color, RGBA } from 'vs/base/common/color'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { registerEditorAction, registerEditorContribution, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions'; -import { PeekViewWidget, getOuterEditor, peekViewBorder, peekViewTitleBackground, peekViewTitleForeground, peekViewTitleInfoForeground } from 'vs/editor/contrib/peekView/peekView'; +import { PeekViewWidget, getOuterEditor, peekViewBorder, peekViewTitleBackground, peekViewTitleForeground, peekViewTitleInfoForeground } from 'vs/editor/contrib/peekView/browser/peekView'; import { IContextKeyService, IContextKey, ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; @@ -39,7 +39,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { basename, isEqualOrParent } from 'vs/base/common/resources'; import { MenuId, IMenuService, IMenu, MenuItemAction, MenuRegistry } from 'vs/platform/actions/common/actions'; import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; -import { IChange, IEditorModel, ScrollType, IEditorContribution, IDiffEditorModel } from 'vs/editor/common/editorCommon'; +import { IEditorModel, ScrollType, IEditorContribution, IDiffEditorModel } from 'vs/editor/common/editorCommon'; import { OverviewRulerLane, ITextModel, IModelDecorationOptions, MinimapPosition } from 'vs/editor/common/model'; import { sortedDiff } from 'vs/base/common/arrays'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -49,8 +49,9 @@ import { EncodingMode, ITextFileEditorModel, IResolvedTextFileEditorModel, IText import { gotoNextLocation, gotoPreviousLocation } from 'vs/platform/theme/common/iconRegistry'; import { Codicon } from 'vs/base/common/codicons'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { TextCompareEditorActiveContext } from 'vs/workbench/common/editor'; +import { TextCompareEditorActiveContext } from 'vs/workbench/common/contextkeys'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; +import { IChange } from 'vs/editor/common/diff/diffComputer'; class DiffActionRunner extends ActionRunner { @@ -889,7 +890,7 @@ export const overviewRulerDeletedForeground = registerColor('editorOverviewRuler class DirtyDiffDecorator extends Disposable { - static createDecoration(className: string, options: { gutter: boolean, overview: { active: boolean, color: string }, minimap: { active: boolean, color: string }, isWholeLine: boolean }): ModelDecorationOptions { + static createDecoration(className: string, options: { gutter: boolean; overview: { active: boolean; color: string }; minimap: { active: boolean; color: string }; isWholeLine: boolean }): ModelDecorationOptions { const decorationOptions: IModelDecorationOptions = { description: 'dirty-diff-decoration', isWholeLine: options.isWholeLine, @@ -1077,8 +1078,8 @@ export class DirtyDiffModel extends Disposable { private readonly originalModelDisposables = this._register(new DisposableStore()); private _disposed = false; - private readonly _onDidChange = new Emitter<{ changes: IChange[], diff: ISplice[] }>(); - readonly onDidChange: Event<{ changes: IChange[], diff: ISplice[] }> = this._onDidChange.event; + private readonly _onDidChange = new Emitter<{ changes: IChange[]; diff: ISplice[] }>(); + readonly onDidChange: Event<{ changes: IChange[]; diff: ISplice[] }> = this._onDidChange.event; private _changes: IChange[] = []; get changes(): IChange[] { return this._changes; } diff --git a/src/vs/workbench/contrib/scm/browser/media/scm.css b/src/vs/workbench/contrib/scm/browser/media/scm.css index be9ec9e5944..a3db991bf05 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scm.css +++ b/src/vs/workbench/contrib/scm/browser/media/scm.css @@ -198,19 +198,45 @@ } .scm-view .button-container { - padding-left: 11px; - height: 100%; display: flex; + height: 100%; + padding-left: 11px; align-items: center; } +.scm-view .button-container > .monaco-description-button { + flex-direction: row; + flex-wrap: wrap; + height: 30px; + padding: 0 4px; + overflow: hidden; +} + +.scm-view .button-container > .monaco-description-button > .monaco-button-label { + flex-grow: 1; + width: 0; + overflow: hidden; +} + +.scm-view .button-container > .monaco-description-button > .monaco-button-description { + flex-basis: 100%; +} + +.scm-view .button-container > .monaco-description-button > .monaco-button-label, +.scm-view .button-container > .monaco-description-button > .monaco-button-description { + font-style: inherit; + padding: 4px 0; +} + .scm-view .button-container .codicon.codicon-cloud-upload, .scm-view .button-container .codicon.codicon-sync { + line-height: 22px; margin: 0 0.4em 0 0; } .scm-view .button-container .codicon.codicon-arrow-up, .scm-view .button-container .codicon.codicon-arrow-down { + line-height: 22px; font-size: small !important; margin: 0 0.2em 0 0; } diff --git a/src/vs/workbench/contrib/scm/browser/menus.ts b/src/vs/workbench/contrib/scm/browser/menus.ts index 0fcef83e992..d3665c383cc 100644 --- a/src/vs/workbench/contrib/scm/browser/menus.ts +++ b/src/vs/workbench/contrib/scm/browser/menus.ts @@ -234,7 +234,7 @@ export class SCMMenus implements ISCMMenus, IDisposable { readonly titleMenu: SCMTitleMenu; private readonly disposables = new DisposableStore(); - private readonly menus = new Map void }>(); + private readonly menus = new Map void }>(); constructor( @ISCMService scmService: ISCMService, diff --git a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts index d04f5d17164..3e7bfbeb8ae 100644 --- a/src/vs/workbench/contrib/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/browser/scm.contribution.ts @@ -28,7 +28,7 @@ import { SCMViewPane } from 'vs/workbench/contrib/scm/browser/scmViewPane'; import { SCMViewService } from 'vs/workbench/contrib/scm/browser/scmViewService'; import { SCMRepositoriesViewPane } from 'vs/workbench/contrib/scm/browser/scmRepositoriesViewPane'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { Context as SuggestContext } from 'vs/editor/contrib/suggest/suggest'; +import { Context as SuggestContext } from 'vs/editor/contrib/suggest/browser/suggest'; import { MANAGE_TRUST_COMMAND_ID, WorkspaceTrustContext } from 'vs/workbench/contrib/workspace/common/workspace'; ModesRegistry.registerLanguage({ diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index d76e87df9da..df4814bb25f 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -10,7 +10,7 @@ import { IDisposable, Disposable, DisposableStore, combinedDisposable, dispose, import { ViewPane, IViewPaneOptions, ViewAction } from 'vs/workbench/browser/parts/views/viewPane'; import { append, $, Dimension, asCSSUrl, trackFocus, clearNode } from 'vs/base/browser/dom'; import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { ISCMResourceGroup, ISCMResource, InputValidationType, ISCMRepository, ISCMInput, IInputValidation, ISCMViewService, ISCMViewVisibleRepositoryChangeEvent, ISCMService, SCMInputChangeReason, VIEW_PANE_ID, ISCMActionButton } from 'vs/workbench/contrib/scm/common/scm'; +import { ISCMResourceGroup, ISCMResource, InputValidationType, ISCMRepository, ISCMInput, IInputValidation, ISCMViewService, ISCMViewVisibleRepositoryChangeEvent, ISCMService, SCMInputChangeReason, VIEW_PANE_ID, ISCMActionButton, ISCMActionButtonDescriptor } from 'vs/workbench/contrib/scm/common/scm'; import { ResourceLabels, IResourceLabel, IFileLabelOptions } from 'vs/workbench/browser/labels'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -47,27 +47,27 @@ import { EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/ed import { SIDE_BAR_BACKGROUND, SIDE_BAR_BORDER, PANEL_BACKGROUND, PANEL_INPUT_BORDER } from 'vs/workbench/common/theme'; import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget'; import { ITextModel } from 'vs/editor/common/model'; -import { IEditorConstructionOptions } from 'vs/editor/browser/editorBrowser'; +import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration'; import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; import { IModelService } from 'vs/editor/common/services/model'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; -import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; +import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; import * as platform from 'vs/base/common/platform'; import { compare, format } from 'vs/base/common/strings'; import { inputPlaceholderForeground, inputValidationInfoBorder, inputValidationWarningBorder, inputValidationErrorBorder, inputValidationInfoBackground, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningForeground, inputValidationErrorBackground, inputValidationErrorForeground, inputBackground, inputForeground, inputBorder, focusBorder, registerColor, contrastBorder, editorSelectionBackground, selectionBackground, textLinkActiveForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; -import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { Schemas } from 'vs/base/common/network'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { ModesHoverController } from 'vs/editor/contrib/hover/hover'; -import { ColorDetector } from 'vs/editor/contrib/colorPicker/colorDetector'; -import { LinkDetector } from 'vs/editor/contrib/links/links'; +import { ModesHoverController } from 'vs/editor/contrib/hover/browser/hover'; +import { ColorDetector } from 'vs/editor/contrib/colorPicker/browser/colorDetector'; +import { LinkDetector } from 'vs/editor/contrib/links/browser/links'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ILabelService } from 'vs/platform/label/common/label'; import { KeyCode } from 'vs/base/common/keyCodes'; import { DEFAULT_FONT_FAMILY } from 'vs/workbench/browser/style'; @@ -81,9 +81,8 @@ import { Selection } from 'vs/editor/common/core/selection'; import { API_OPEN_DIFF_EDITOR_COMMAND_ID, API_OPEN_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; -import { Button } from 'vs/base/browser/ui/button/button'; -import { Command } from 'vs/editor/common/languages'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; +import { Button, ButtonWithDescription } from 'vs/base/browser/ui/button/button'; import { INotificationService } from 'vs/platform/notification/common/notification'; type TreeElement = ISCMRepository | ISCMInput | ISCMActionButton | ISCMResourceGroup | IResourceNode | ISCMResource; @@ -95,7 +94,7 @@ interface ISCMLayout { } interface ActionButtonTemplate { - readonly actionButton: ScmActionButton; + readonly actionButton: SCMActionButton; disposable: IDisposable; readonly templateDisposable: IDisposable; } @@ -120,7 +119,7 @@ class ActionButtonRenderer implements ICompressibleTreeRenderer[]; return folders.map(e => e.name).join('/'); } @@ -832,7 +831,7 @@ export class SCMAccessibilityProvider implements IListAccessibilityProvider { constructor(private sortKey: ViewModelSortKey, title: string) { super({ id: `workbench.scm.action.setSortKey.${sortKey}`, - title: title, + title, viewId: VIEW_PANE_ID, f1: false, toggled: ContextKeys.ViewModelSortKey.isEqualTo(sortKey), @@ -1604,7 +1603,7 @@ class SCMInputWidget extends Disposable { private placeholderTextContainer: HTMLElement; private inputEditor: CodeEditorWidget; - private model: { readonly input: ISCMInput; readonly textModel: ITextModel; } | undefined; + private model: { readonly input: ISCMInput; readonly textModel: ITextModel } | undefined; private repositoryContextKey: IContextKey; private repositoryDisposables = new DisposableStore(); @@ -2479,8 +2478,8 @@ registerThemingParticipant((theme, collector) => { } }); -export class ScmActionButton implements IDisposable { - private button: Button | undefined; +export class SCMActionButton implements IDisposable { + private button: Button | ButtonWithDescription | undefined; private readonly disposables = new MutableDisposable(); constructor( @@ -2495,19 +2494,26 @@ export class ScmActionButton implements IDisposable { this.disposables?.dispose(); } - - setButton(button: Command | undefined): void { + setButton(button: ISCMActionButtonDescriptor | undefined): void { // Clear old button this.clear(); if (!button) { return; } - this.button = new Button(this.container, { title: button.tooltip, supportIcons: true }); - this.button.label = button.title; + if (button.description) { + // ButtonWithDescription + this.button = new ButtonWithDescription(this.container, { supportIcons: true, title: button.command.tooltip }); + (this.button as ButtonWithDescription).description = button.description; + } else { + // Button + this.button = new Button(this.container, { supportIcons: true }); + } + + this.button.label = button.command.title; this.button.onDidClick(async () => { try { - await this.commandService.executeCommand(button!.id, ...(button!.arguments || [])); + await this.commandService.executeCommand(button.command.id, ...(button.command.arguments || [])); } catch (ex) { this.notificationService.error(ex); } diff --git a/src/vs/workbench/contrib/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts index 9ecf3c32001..1056cbab75a 100644 --- a/src/vs/workbench/contrib/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -65,7 +65,7 @@ export interface ISCMProvider extends IDisposable { readonly onDidChangeCommitTemplate: Event; readonly onDidChangeStatusBarCommands?: Event; readonly acceptInputCommand?: Command; - readonly actionButton?: Command; + readonly actionButton?: ISCMActionButtonDescriptor; readonly statusBarCommands?: Command[]; readonly onDidChange: Event; @@ -97,10 +97,15 @@ export interface ISCMInputChangeEvent { readonly reason?: SCMInputChangeReason; } +export interface ISCMActionButtonDescriptor { + command: Command; + description?: string; +} + export interface ISCMActionButton { readonly type: 'actionButton'; readonly repository: ISCMRepository; - readonly button?: Command; + readonly button?: ISCMActionButtonDescriptor; } export interface ISCMInput { diff --git a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts index 289975ac72c..4fe36be379c 100644 --- a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts +++ b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/anythingQuickAccess'; import { IQuickInputButton, IKeyMods, quickPickItemScorerAccessor, QuickPickItemScorerAccessor, IQuickPick, IQuickPickItemWithResource, QuickInputHideReason } from 'vs/platform/quickinput/common/quickInput'; import { IPickerQuickAccessItem, PickerQuickAccessProvider, TriggerAction, FastAndSlowPicks, Picks, PicksWithActive } from 'vs/platform/quickinput/browser/pickerQuickAccess'; import { prepareQuery, IPreparedQuery, compareItemsByFuzzyScore, scoreItemFuzzy, FuzzyScorerCache } from 'vs/base/common/fuzzyScorer'; -import { IFileQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { IFileQueryBuilderOptions, QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { getOutOfWorkspaceEditorResources, extractRangeFromFilter, IWorkbenchSearchConfiguration } from 'vs/workbench/contrib/search/common/search'; import { ISearchService, ISearchComplete } from 'vs/workbench/services/search/common/search'; @@ -23,7 +23,7 @@ import { DisposableStore, IDisposable, toDisposable, MutableDisposable, Disposab import { ILabelService } from 'vs/platform/label/common/label'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { localize } from 'vs/nls'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -57,7 +57,7 @@ interface IAnythingQuickPickItem extends IPickerQuickAccessItem, IQuickPickItemW interface IEditorSymbolAnythingQuickPickItem extends IAnythingQuickPickItem { resource: URI; - range: { decoration: IRange, selection: IRange } + range: { decoration: IRange; selection: IRange }; } function isEditorSymbolQuickPickItem(pick?: IAnythingQuickPickItem): pick is IEditorSymbolAnythingQuickPickItem { @@ -83,9 +83,9 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider | undefined = undefined; editorViewState: { - editor: EditorInput, - group: IEditorGroup, - state: ICodeEditorViewState | IDiffEditorViewState | undefined + editor: EditorInput; + group: IEditorGroup; + state: ICodeEditorViewState | IDiffEditorViewState | undefined; } | undefined = undefined; scorerCache: FuzzyScorerCache = Object.create(null); @@ -644,7 +644,7 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider { + private async openAnything(resourceOrEditor: URI | EditorInput | IResourceEditorInput, options: { keyMods?: IKeyMods; preserveFocus?: boolean; range?: IRange; forceOpenSideBySide?: boolean; forcePinned?: boolean }): Promise { // Craft some editor options based on quick access usage const editorOptions: ITextEditorOptions = { diff --git a/src/vs/workbench/contrib/search/browser/replaceService.ts b/src/vs/workbench/contrib/search/browser/replaceService.ts index 2e4170f9add..b1fc4bd1e18 100644 --- a/src/vs/workbench/contrib/search/browser/replaceService.ts +++ b/src/vs/workbench/contrib/search/browser/replaceService.ts @@ -10,19 +10,19 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IReplaceService } from 'vs/workbench/contrib/search/common/replace'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { Match, FileMatch, FileMatchOrMatch, ISearchWorkbenchService } from 'vs/workbench/contrib/search/common/searchModel'; import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { ScrollType } from 'vs/editor/common/editorCommon'; -import { ITextModel, IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IBulkEditService, ResourceTextEdit } from 'vs/editor/browser/services/bulkEditService'; import { Range } from 'vs/editor/common/core/range'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { EditOperation, ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { ILabelService } from 'vs/platform/label/common/label'; import { dirname } from 'vs/base/common/resources'; import { Promises } from 'vs/base/common/async'; @@ -162,7 +162,7 @@ export class ReplaceService implements IReplaceService { private applyEditsToPreview(fileMatch: FileMatch, replaceModel: ITextModel): void { const resourceEdits = this.createEdits(fileMatch, replaceModel.uri); - const modelEdits: IIdentifiedSingleEditOperation[] = []; + const modelEdits: ISingleEditOperation[] = []; for (const resourceEdit of resourceEdits) { modelEdits.push(EditOperation.replaceMove( Range.lift(resourceEdit.textEdit.range), diff --git a/src/vs/workbench/contrib/search/browser/search.contribution.ts b/src/vs/workbench/contrib/search/browser/search.contribution.ts index 05a276ebc53..45ffb47bcf6 100644 --- a/src/vs/workbench/contrib/search/browser/search.contribution.ts +++ b/src/vs/workbench/contrib/search/browser/search.contribution.ts @@ -10,8 +10,8 @@ import * as platform from 'vs/base/common/platform'; import { dirname } from 'vs/base/common/resources'; import { assertIsDefined, assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; -import { ToggleCaseSensitiveKeybinding, TogglePreserveCaseKeybinding, ToggleRegexKeybinding, ToggleWholeWordKeybinding } from 'vs/editor/contrib/find/findModel'; -import { AbstractGotoLineQuickAccessProvider } from 'vs/editor/contrib/quickAccess/gotoLineQuickAccess'; +import { ToggleCaseSensitiveKeybinding, TogglePreserveCaseKeybinding, ToggleRegexKeybinding, ToggleWholeWordKeybinding } from 'vs/editor/contrib/find/browser/findModel'; +import { AbstractGotoLineQuickAccessProvider } from 'vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess'; import * as nls from 'vs/nls'; import { Action2, ICommandAction, MenuId, MenuRegistry, registerAction2, SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { CommandsRegistry, ICommandHandler, ICommandService } from 'vs/platform/commands/common/commands'; @@ -45,7 +45,7 @@ import { SearchView } from 'vs/workbench/contrib/search/browser/searchView'; import { registerContributions as searchWidgetContributions } from 'vs/workbench/contrib/search/browser/searchWidget'; import { SymbolsQuickAccessProvider } from 'vs/workbench/contrib/search/browser/symbolsQuickAccess'; import * as Constants from 'vs/workbench/contrib/search/common/constants'; -import { resolveResourcesForSearchIncludes } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { resolveResourcesForSearchIncludes } from 'vs/workbench/services/search/common/queryBuilder'; import { getWorkspaceSymbols, IWorkspaceSymbol, SearchStateKey, SearchUIState } from 'vs/workbench/contrib/search/common/search'; import { ISearchHistoryService, SearchHistoryService } from 'vs/workbench/contrib/search/common/searchHistoryService'; import { FileMatch, FileMatchOrMatch, FolderMatch, ISearchWorkbenchService, Match, RenderableMatch, SearchWorkbenchService } from 'vs/workbench/contrib/search/common/searchModel'; diff --git a/src/vs/workbench/contrib/search/browser/searchActions.ts b/src/vs/workbench/contrib/search/browser/searchActions.ts index 37764e46455..becdd37f551 100644 --- a/src/vs/workbench/contrib/search/browser/searchActions.ts +++ b/src/vs/workbench/contrib/search/browser/searchActions.ts @@ -667,7 +667,7 @@ function matchToString(match: Match, indent = 0): string { } const lineDelimiter = isWindows ? '\r\n' : '\n'; -function fileMatchToString(fileMatch: FileMatch, labelService: ILabelService): { text: string, count: number } { +function fileMatchToString(fileMatch: FileMatch, labelService: ILabelService): { text: string; count: number } { const matchTextRows = fileMatch.matches() .sort(searchMatchComparer) .map(match => matchToString(match, 2)); @@ -678,7 +678,7 @@ function fileMatchToString(fileMatch: FileMatch, labelService: ILabelService): { }; } -function folderMatchToString(folderMatch: FolderMatchWithResource | FolderMatch, labelService: ILabelService): { text: string, count: number } { +function folderMatchToString(folderMatch: FolderMatchWithResource | FolderMatch, labelService: ILabelService): { text: string; count: number } { const fileResults: string[] = []; let numMatches = 0; diff --git a/src/vs/workbench/contrib/search/browser/searchResultsView.ts b/src/vs/workbench/contrib/search/browser/searchResultsView.ts index 3929d13b89e..eebc83d22a0 100644 --- a/src/vs/workbench/contrib/search/browser/searchResultsView.ts +++ b/src/vs/workbench/contrib/search/browser/searchResultsView.ts @@ -8,11 +8,10 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; -import { ITreeNode, ITreeRenderer, ITreeDragAndDrop, ITreeDragOverReaction } from 'vs/base/browser/ui/tree/tree'; +import { ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { IAction } from 'vs/base/common/actions'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import * as paths from 'vs/base/common/path'; -import * as resources from 'vs/base/common/resources'; import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { FileKind } from 'vs/platform/files/common/files'; @@ -26,9 +25,7 @@ import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; import { RemoveAction, ReplaceAction, ReplaceAllAction, ReplaceAllInFolderAction } from 'vs/workbench/contrib/search/browser/searchActions'; import { SearchView } from 'vs/workbench/contrib/search/browser/searchView'; import { FileMatch, Match, RenderableMatch, SearchModel, FolderMatch } from 'vs/workbench/contrib/search/common/searchModel'; -import { IDragAndDropData } from 'vs/base/browser/dnd'; -import { fillEditorsDragData } from 'vs/workbench/browser/dnd'; -import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; +import { isEqual } from 'vs/base/common/resources'; interface IFolderMatchTemplate { label: IResourceLabel; @@ -115,7 +112,7 @@ export class FolderMatchRenderer extends Disposable implements ITreeRenderer { - constructor( - @IInstantiationService private instantiationService: IInstantiationService - ) { } - - onDragOver(data: IDragAndDropData, targetElement: RenderableMatch, targetIndex: number, originalEvent: DragEvent): boolean | ITreeDragOverReaction { - return false; - } - - getDragURI(element: RenderableMatch): string | null { - if (element instanceof FileMatch) { - return element.remove.toString(); - } - - return null; - } - - getDragLabel?(elements: RenderableMatch[]): string | undefined { - if (elements.length > 1) { - return String(elements.length); - } - - const element = elements[0]; - return element instanceof FileMatch ? - resources.basename(element.resource) : - undefined; - } - - onDragStart(data: IDragAndDropData, originalEvent: DragEvent): void { - const elements = (data as ElementsDragAndDropData).elements; - const resources = elements - .filter((e): e is FileMatch => e instanceof FileMatch) - .map((fm: FileMatch) => fm.resource); - - if (resources.length) { - // Apply some datatransfer types to allow for dragging the element outside of the application - this.instantiationService.invokeFunction(accessor => fillEditorsDragData(accessor, resources, originalEvent)); - } - } - - drop(data: IDragAndDropData, targetElement: RenderableMatch, targetIndex: number, originalEvent: DragEvent): void { - } -} diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index e1109a52a60..f52f56f3c1a 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -29,8 +29,8 @@ import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/embeddedCodeE import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { Selection } from 'vs/editor/common/core/selection'; import { IEditor } from 'vs/editor/common/editorCommon'; -import { CommonFindController } from 'vs/editor/contrib/find/findController'; -import { MultiCursorSelectionController } from 'vs/editor/contrib/multicursor/multicursor'; +import { CommonFindController } from 'vs/editor/contrib/find/browser/findController'; +import { MultiCursorSelectionController } from 'vs/editor/contrib/multicursor/browser/multicursor'; import * as nls from 'vs/nls'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; @@ -46,7 +46,7 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { getSelectionKeyboardEvent, WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; import { INotificationService, } from 'vs/platform/notification/common/notification'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { IOpenerService, withSelectionFragment } from 'vs/platform/opener/common/opener'; import { IProgress, IProgressService, IProgressStep } from 'vs/platform/progress/common/progress'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -63,10 +63,10 @@ import { ExcludePatternInputWidget, IncludePatternInputWidget } from 'vs/workben import { appendKeyBindingLabel, IFindInFilesArgs } from 'vs/workbench/contrib/search/browser/searchActions'; import { searchDetailsIcon } from 'vs/workbench/contrib/search/browser/searchIcons'; import { renderSearchMessage } from 'vs/workbench/contrib/search/browser/searchMessage'; -import { FileMatchRenderer, FolderMatchRenderer, MatchRenderer, SearchAccessibilityProvider, SearchDelegate, SearchDND } from 'vs/workbench/contrib/search/browser/searchResultsView'; +import { FileMatchRenderer, FolderMatchRenderer, MatchRenderer, SearchAccessibilityProvider, SearchDelegate } from 'vs/workbench/contrib/search/browser/searchResultsView'; import { ISearchWidgetOptions, SearchWidget } from 'vs/workbench/contrib/search/browser/searchWidget'; import * as Constants from 'vs/workbench/contrib/search/common/constants'; -import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; import { IReplaceService } from 'vs/workbench/contrib/search/common/replace'; import { getOutOfWorkspaceEditorResources, SearchStateKey, SearchUIState } from 'vs/workbench/contrib/search/common/search'; import { ISearchHistoryService, ISearchHistoryValues } from 'vs/workbench/contrib/search/common/searchHistoryService'; @@ -77,6 +77,7 @@ import { IPreferencesService, ISettingsEditorOptions } from 'vs/workbench/servic import { IPatternInfo, ISearchComplete, ISearchConfiguration, ISearchConfigurationProperties, ITextQuery, SearchCompletionExitCode, SearchSortOrder, TextSearchCompleteMessageType } from 'vs/workbench/services/search/common/search'; import { TextSearchCompleteMessage } from 'vs/workbench/services/search/common/searchExtTypes'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { ResourceListDnDHandler } from 'vs/workbench/browser/dnd'; const $ = dom.$; @@ -724,7 +725,15 @@ export class SearchView extends ViewPane { { identityProvider, accessibilityProvider: this.treeAccessibilityProvider, - dnd: this.instantiationService.createInstance(SearchDND), + dnd: this.instantiationService.createInstance(ResourceListDnDHandler, element => { + if (element instanceof FileMatch) { + return element.resource; + } + if (element instanceof Match) { + return withSelectionFragment(element.parent().resource, element.range()); + } + return null; + }), multipleSelectionSupport: false, selectionNavigation: true, overrideStyles: { @@ -1292,7 +1301,7 @@ export class SearchView extends ViewPane { this.searchWidget.focus(false); } - triggerQueryChange(_options?: { preserveFocus?: boolean, triggeredOnType?: boolean, delay?: number; }) { + triggerQueryChange(_options?: { preserveFocus?: boolean; triggeredOnType?: boolean; delay?: number }) { const options = { preserveFocus: true, triggeredOnType: false, delay: 0, ..._options }; if (options.triggeredOnType && !this.searchConfig.searchOnType) { return; } diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index 3eb5f683e56..9746dab23b4 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -15,7 +15,7 @@ import { Action } from 'vs/base/common/actions'; import { Delayer } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { CONTEXT_FIND_WIDGET_NOT_VISIBLE } from 'vs/editor/contrib/find/findModel'; +import { CONTEXT_FIND_WIDGET_NOT_VISIBLE } from 'vs/editor/contrib/find/browser/findModel'; import * as nls from 'vs/nls'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -118,8 +118,8 @@ export class SearchWidget extends Widget { private ignoreGlobalFindBufferOnNextFocus = false; private previousGlobalFindBufferValue: string | null = null; - private _onSearchSubmit = this._register(new Emitter<{ triggeredOnType: boolean, delay: number }>()); - readonly onSearchSubmit: Event<{ triggeredOnType: boolean, delay: number }> = this._onSearchSubmit.event; + private _onSearchSubmit = this._register(new Emitter<{ triggeredOnType: boolean; delay: number }>()); + readonly onSearchSubmit: Event<{ triggeredOnType: boolean; delay: number }> = this._onSearchSubmit.event; private _onSearchCancel = this._register(new Emitter<{ focus: boolean }>()); readonly onSearchCancel: Event<{ focus: boolean }> = this._onSearchCancel.event; diff --git a/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts b/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts index f93f0cca39d..bdcfb57f9e8 100644 --- a/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts +++ b/src/vs/workbench/contrib/search/browser/symbolsQuickAccess.ts @@ -19,7 +19,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IWorkbenchEditorConfiguration } from 'vs/workbench/common/editor'; import { IKeyMods, IQuickPickItemWithResource } from 'vs/platform/quickinput/common/quickInput'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { getSelectionSearchString } from 'vs/editor/contrib/find/findController'; +import { getSelectionSearchString } from 'vs/editor/contrib/find/browser/findController'; import { withNullAsUndefined } from 'vs/base/common/types'; import { prepareQuery, IPreparedQuery, scoreFuzzy2, pieceToQuery } from 'vs/base/common/fuzzyScorer'; import { IMatch } from 'vs/base/common/filters'; @@ -87,7 +87,7 @@ export class SymbolsQuickAccessProvider extends PickerQuickAccessProvider> { + async getSymbolPicks(filter: string, options: { skipLocal?: boolean; skipSorting?: boolean; delay?: number } | undefined, token: CancellationToken): Promise> { return this.delayer.trigger(async () => { if (token.isCancellationRequested) { return []; @@ -97,7 +97,7 @@ export class SymbolsQuickAccessProvider extends PickerQuickAccessProvider> { + private async doGetSymbolPicks(query: IPreparedQuery, options: { skipLocal?: boolean; skipSorting?: boolean } | undefined, token: CancellationToken): Promise> { // Split between symbol and container query let symbolQuery: IPreparedQuery; @@ -224,7 +224,7 @@ export class SymbolsQuickAccessProvider extends PickerQuickAccessProvider { + private async openSymbol(provider: IWorkspaceSymbolProvider, symbol: IWorkspaceSymbol, token: CancellationToken, options: { keyMods: IKeyMods; forceOpenSideBySide?: boolean; preserveFocus?: boolean; forcePinned?: boolean }): Promise { // Resolve actual symbol to open for providers that can resolve let symbolToOpen = symbol; diff --git a/src/vs/workbench/contrib/search/common/search.ts b/src/vs/workbench/contrib/search/common/search.ts index 4804b9ef49f..49d1e61bf03 100644 --- a/src/vs/workbench/contrib/search/common/search.ts +++ b/src/vs/workbench/contrib/search/common/search.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { onUnexpectedError } from 'vs/base/common/errors'; +import { onUnexpectedExternalError } from 'vs/base/common/errors'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ISearchConfiguration, ISearchConfigurationProperties } from 'vs/workbench/services/search/common/search'; import { SymbolKind, Location, ProviderResult, SymbolTag } from 'vs/editor/common/languages'; @@ -79,7 +79,7 @@ export async function getWorkspaceSymbols(query: string, token: CancellationToke all.push(new WorkspaceSymbolItem(symbol, provider)); } } catch (err) { - onUnexpectedError(err); + onUnexpectedExternalError(err); } }); @@ -124,8 +124,8 @@ export interface IWorkbenchSearchConfigurationProperties extends ISearchConfigur includeSymbols: boolean; includeHistory: boolean; history: { - filterSortOrder: 'default' | 'recency' - } + filterSortOrder: 'default' | 'recency'; + }; }; } diff --git a/src/vs/workbench/contrib/search/common/searchModel.ts b/src/vs/workbench/contrib/search/common/searchModel.ts index 33602186910..ce4758787e9 100644 --- a/src/vs/workbench/contrib/search/common/searchModel.ts +++ b/src/vs/workbench/contrib/search/common/searchModel.ts @@ -80,7 +80,7 @@ export class Match { } @memoize - preview(): { before: string; inside: string; after: string; } { + preview(): { before: string; inside: string; after: string } { let before = this._oneLinePreviewText.substring(0, this._rangeInPreviewText.startColumn - 1), inside = this.getMatchString(), after = this._oneLinePreviewText.substring(this._rangeInPreviewText.endColumn - 1); @@ -195,8 +195,8 @@ export class FileMatch extends Disposable implements IFileMatch { return (selected ? FileMatch._CURRENT_FIND_MATCH : FileMatch._FIND_MATCH); } - private _onChange = this._register(new Emitter<{ didRemove?: boolean; forceUpdateModel?: boolean; }>()); - readonly onChange: Event<{ didRemove?: boolean; forceUpdateModel?: boolean; }> = this._onChange.event; + private _onChange = this._register(new Emitter<{ didRemove?: boolean; forceUpdateModel?: boolean }>()); + readonly onChange: Event<{ didRemove?: boolean; forceUpdateModel?: boolean }> = this._onChange.event; private _onDispose = this._register(new Emitter()); readonly onDispose: Event = this._onDispose.event; @@ -714,7 +714,6 @@ export class SearchResult extends Disposable { constructor( private _searchModel: SearchModel, @IReplaceService private readonly replaceService: IReplaceService, - @ITelemetryService private readonly telemetryService: ITelemetryService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IModelService private readonly modelService: IModelService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, @@ -850,18 +849,8 @@ export class SearchResult extends Disposable { replaceAll(progress: IProgress): Promise { this.replacingAll = true; - const start = Date.now(); const promise = this.replaceService.replace(this.matches(), progress); - promise.finally(() => { - /* __GDPR__ - "replaceAll.started" : { - "duration" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true } - } - */ - this.telemetryService.publicLog('replaceAll.started', { duration: Date.now() - start }); - }); - return promise.then(() => { this.replacingAll = false; this.clear(); @@ -944,7 +933,7 @@ export class SearchResult extends Disposable { }); } - private groupFilesByFolder(fileMatches: IFileMatch[]): { byFolder: ResourceMap, other: IFileMatch[]; } { + private groupFilesByFolder(fileMatches: IFileMatch[]): { byFolder: ResourceMap; other: IFileMatch[] } { const rawPerFolder = new ResourceMap(); const otherFileMatches: IFileMatch[] = []; this._folderMatches.forEach(fm => rawPerFolder.set(fm.resource, [])); diff --git a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts b/src/vs/workbench/contrib/search/test/electron-browser/textsearch.perf.integrationTest.ts similarity index 96% rename from src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts rename to src/vs/workbench/contrib/search/test/electron-browser/textsearch.perf.integrationTest.ts index 3518187ad56..d1a74339e79 100644 --- a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +++ b/src/vs/workbench/contrib/search/test/electron-browser/textsearch.perf.integrationTest.ts @@ -33,7 +33,7 @@ import { UndoRedoService } from 'vs/platform/undoRedo/common/undoRedoService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import 'vs/workbench/contrib/search/browser/search.contribution'; // load contributions -import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; import { SearchModel } from 'vs/workbench/contrib/search/common/searchModel'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -41,6 +41,8 @@ import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbe import { TestEditorGroupsService, TestEditorService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestContextService, TestTextResourcePropertiesService } from 'vs/workbench/test/common/workbenchTestServices'; import { TestEnvironmentService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; +import { LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; // declare var __dirname: string; @@ -87,7 +89,9 @@ suite.skip('TextSearch performance (integration)', () => { logService, undoRedoService, new LanguageService(), - new TestLanguageConfigurationService() + new TestLanguageConfigurationService(), + new LanguageFeatureDebounceService(logService), + new LanguageFeaturesService() ), ], [ diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts index 3e8224c0835..4d0742dc00a 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts @@ -8,7 +8,7 @@ import { extname, isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { Range } from 'vs/editor/common/core/range'; -import { ToggleCaseSensitiveKeybinding, ToggleRegexKeybinding, ToggleWholeWordKeybinding } from 'vs/editor/contrib/find/findModel'; +import { ToggleCaseSensitiveKeybinding, ToggleRegexKeybinding, ToggleWholeWordKeybinding } from 'vs/editor/contrib/find/browser/findModel'; import { localize } from 'vs/nls'; import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; @@ -21,7 +21,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { EditorPaneDescriptor, IEditorPaneRegistry } from 'vs/workbench/browser/editor'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { ActiveEditorContext, IEditorSerializer, IEditorFactoryRegistry, EditorExtensions, DEFAULT_EDITOR_ASSOCIATION } from 'vs/workbench/common/editor'; +import { IEditorSerializer, IEditorFactoryRegistry, EditorExtensions, DEFAULT_EDITOR_ASSOCIATION } from 'vs/workbench/common/editor'; +import { ActiveEditorContext } from 'vs/workbench/common/contextkeys'; import { IViewsService } from 'vs/workbench/common/views'; import { getSearchView } from 'vs/workbench/contrib/search/browser/searchActions'; import { searchNewEditorIcon, searchRefreshIcon } from 'vs/workbench/contrib/search/browser/searchIcons'; @@ -100,7 +101,7 @@ workbenchContributionsRegistry.registerWorkbenchContribution(SearchEditorContrib //#endregion //#region Input Serializer -type SerializedSearchEditor = { modelUri: string | undefined, dirty: boolean, config: SearchConfiguration, name: string, matchRanges: Range[], backingUri: string }; +type SerializedSearchEditor = { modelUri: string | undefined; dirty: boolean; config: SearchConfiguration; name: string; matchRanges: Range[]; backingUri: string }; class SearchEditorInputSerializer implements IEditorSerializer { @@ -169,18 +170,18 @@ CommandsRegistry.registerCommand( const category = { value: localize('search', "Search Editor"), original: 'Search Editor' }; export type LegacySearchEditorArgs = Partial<{ - query: string, - includes: string, - excludes: string, - contextLines: number, - wholeWord: boolean, - caseSensitive: boolean, - regexp: boolean, - useIgnores: boolean, - showIncludesExcludes: boolean, - triggerSearch: boolean, - focusResults: boolean, - location: 'reuse' | 'new' + query: string; + includes: string; + excludes: string; + contextLines: number; + wholeWord: boolean; + caseSensitive: boolean; + regexp: boolean; + useIgnores: boolean; + showIncludesExcludes: boolean; + triggerSearch: boolean; + focusResults: boolean; + location: 'reuse' | 'new'; }>; const translateLegacyConfig = (legacyConfig: LegacySearchEditorArgs & OpenSearchEditorArgs = {}): OpenSearchEditorArgs => { @@ -199,7 +200,7 @@ const translateLegacyConfig = (legacyConfig: LegacySearchEditorArgs & OpenSearch return config; }; -export type OpenSearchEditorArgs = Partial; +export type OpenSearchEditorArgs = Partial; const openArgDescription = { description: 'Open a new search editor. Arguments passed can include variables like ${relativeFileDirname}.', args: [{ diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts index 2915e9dbe37..67292a26cec 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts @@ -21,7 +21,7 @@ import { ICodeEditorViewState, IEditor } from 'vs/editor/common/editorCommon'; import { IEditorOptions as ICodeEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IModelService } from 'vs/editor/common/services/model'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; -import { ReferencesController } from 'vs/editor/contrib/gotoSymbol/peek/referencesController'; +import { ReferencesController } from 'vs/editor/contrib/gotoSymbol/browser/peek/referencesController'; import { localize } from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -43,7 +43,7 @@ import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { ExcludePatternInputWidget, IncludePatternInputWidget } from 'vs/workbench/contrib/search/browser/patternInputWidget'; import { SearchWidget } from 'vs/workbench/contrib/search/browser/searchWidget'; import { InputBoxFocusedKey } from 'vs/workbench/contrib/search/common/constants'; -import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; import { getOutOfWorkspaceEditorResources } from 'vs/workbench/contrib/search/common/search'; import { SearchModel, SearchResult } from 'vs/workbench/contrib/search/common/searchModel'; import { InSearchEditor, SearchEditorFindMatchClass, SearchEditorID, SearchEditorInputTypeId } from 'vs/workbench/contrib/searchEditor/browser/constants'; @@ -60,7 +60,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { renderSearchMessage } from 'vs/workbench/contrib/search/browser/searchMessage'; import { EditorExtensionsRegistry, IEditorContributionDescription } from 'vs/editor/browser/editorExtensions'; -import { UnusualLineTerminatorsDetector } from 'vs/editor/contrib/unusualLineTerminators/unusualLineTerminators'; +import { UnusualLineTerminatorsDetector } from 'vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators'; const RESULT_LINE_REGEX = /^(\s+)(\d+)(: | )(\s*)(.*)$/; const FILE_LINE_REGEX = /^(\S.*):$/; diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts index 0bc40effb4b..28e8b4fd1e5 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts @@ -125,6 +125,13 @@ export const openNewSearchEditor = } const selection = activeModel?.getSelection(); selected = (selection && activeModel?.getModel()?.getValueInRange(selection)) ?? ''; + + if (selection?.isEmpty() && configurationService.getValue('search').seedWithNearestWord) { + const wordAtPosition = activeModel.getModel()?.getWordAtPosition(selection.getStartPosition()); + if (wordAtPosition) { + selected = wordAtPosition.word; + } + } } else { if (editorService.activeEditor instanceof SearchEditorInput) { const active = editorService.activeEditorPane as SearchEditor; diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts index 16720d79af0..00c9ce82e50 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts @@ -34,16 +34,16 @@ import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { IDisposable } from 'vs/base/common/lifecycle'; export type SearchConfiguration = { - query: string, - filesToInclude: string, - filesToExclude: string, - contextLines: number, - matchWholeWord: boolean, - isCaseSensitive: boolean, - isRegexp: boolean, - useExcludeSettingsAndIgnoreFiles: boolean, - showIncludesExcludes: boolean, - onlyOpenEditors: boolean, + query: string; + filesToInclude: string; + filesToExclude: string; + contextLines: number; + matchWholeWord: boolean; + isCaseSensitive: boolean; + isRegexp: boolean; + useExcludeSettingsAndIgnoreFiles: boolean; + showIncludesExcludes: boolean; + onlyOpenEditors: boolean; }; export const SEARCH_EDITOR_EXT = '.code-search'; @@ -304,9 +304,9 @@ export class SearchEditorInput extends EditorInput { export const getOrMakeSearchEditorInput = ( accessor: ServicesAccessor, existingData: ( - | { from: 'model', config?: Partial, modelUri: URI, backupOf?: URI } - | { from: 'rawData', resultsContents: string | undefined, config: Partial } - | { from: 'existingFile', fileUri: URI }) + | { from: 'model'; config?: Partial; modelUri: URI; backupOf?: URI } + | { from: 'rawData'; resultsContents: string | undefined; config: Partial } + | { from: 'existingFile'; fileUri: URI }) ): SearchEditorInput => { const storageService = accessor.get(IStorageService); diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts index 162ea29bfbe..2100486f38d 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts @@ -6,7 +6,7 @@ import { URI } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { parseSavedSearchEditor, parseSerializedSearchEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization'; import { IWorkingCopyBackupService } from 'vs/workbench/services/workingCopy/common/workingCopyBackup'; @@ -17,7 +17,7 @@ import { SearchEditorWorkingCopyTypeId } from 'vs/workbench/contrib/searchEditor import { Emitter } from 'vs/base/common/event'; import { ResourceMap } from 'vs/base/common/map'; -export type SearchEditorData = { resultsModel: ITextModel, configurationModel: SearchConfigurationModel }; +export type SearchEditorData = { resultsModel: ITextModel; configurationModel: SearchConfigurationModel }; export class SearchConfigurationModel { private _onConfigDidUpdate = new Emitter(); diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization.ts index 18c326d6af1..ddaccc8641b 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorSerialization.ts @@ -23,13 +23,13 @@ const translateRangeLines = (range: Range) => new Range(range.startLineNumber + n, range.startColumn, range.endLineNumber + n, range.endColumn); -const matchToSearchResultFormat = (match: Match, longestLineNumber: number): { line: string, ranges: Range[], lineNumber: string }[] => { +const matchToSearchResultFormat = (match: Match, longestLineNumber: number): { line: string; ranges: Range[]; lineNumber: string }[] => { const getLinePrefix = (i: number) => `${match.range().startLineNumber + i}`; const fullMatchLines = match.fullPreviewLines(); - const results: { line: string, ranges: Range[], lineNumber: string }[] = []; + const results: { line: string; ranges: Range[]; lineNumber: string }[] = []; fullMatchLines .forEach((sourceLine, i) => { @@ -39,9 +39,9 @@ const matchToSearchResultFormat = (match: Match, longestLineNumber: number): { l const prefixOffset = prefix.length; // split instead of replace to avoid creating a new string object - const line = prefix + sourceLine.split(/\r?\n?$/, 1)[0]; + const line = prefix + (sourceLine.split(/\r?\n?$/, 1)[0] || ''); - const rangeOnThisLine = ({ start, end }: { start?: number; end?: number; }) => new Range(1, (start ?? 1) + prefixOffset, 1, (end ?? sourceLine.length + 1) + prefixOffset); + const rangeOnThisLine = ({ start, end }: { start?: number; end?: number }) => new Range(1, (start ?? 1) + prefixOffset, 1, (end ?? sourceLine.length + 1) + prefixOffset); const matchRange = match.rangeInPreview(); const matchIsSingleLine = matchRange.startLineNumber === matchRange.endLineNumber; @@ -58,7 +58,7 @@ const matchToSearchResultFormat = (match: Match, longestLineNumber: number): { l return results; }; -type SearchResultSerialization = { text: string[], matchRanges: Range[] }; +type SearchResultSerialization = { text: string[]; matchRanges: Range[] }; function fileMatchToSearchResultFormat(fileMatch: FileMatch, labelFormatter: (x: URI) => string): SearchResultSerialization { const sortedMatches = fileMatch.matches().sort(searchMatchComparer); @@ -70,7 +70,7 @@ function fileMatchToSearchResultFormat(fileMatch: FileMatch, labelFormatter: (x: const targetLineNumberToOffset: Record = {}; - const context: { line: string, lineNumber: number }[] = []; + const context: { line: string; lineNumber: number }[] = []; fileMatch.context.forEach((line, lineNumber) => context.push({ line, lineNumber })); context.sort((a, b) => a.lineNumber - b.lineNumber); @@ -213,7 +213,7 @@ export const extractSearchQueryFromLines = (lines: string[]): SearchConfiguratio }; export const serializeSearchResultForEditor = - (searchResult: SearchResult, rawIncludePattern: string, rawExcludePattern: string, contextLines: number, labelFormatter: (x: URI) => string, sortOrder: SearchSortOrder, limitHit?: boolean): { matchRanges: Range[], text: string, config: Partial } => { + (searchResult: SearchResult, rawIncludePattern: string, rawExcludePattern: string, contextLines: number, labelFormatter: (x: URI) => string, sortOrder: SearchSortOrder, limitHit?: boolean): { matchRanges: Range[]; text: string; config: Partial } => { if (!searchResult.query) { throw Error('Internal Error: Expected query, got null'); } const config = contentPatternToSearchConfiguration(searchResult.query, rawIncludePattern, rawExcludePattern, contextLines); diff --git a/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts b/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts index 22b7a6642c0..bbee0e94ef5 100644 --- a/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts +++ b/src/vs/workbench/contrib/snippets/browser/configureSnippets.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { extname } from 'vs/base/common/path'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IOpenerService } from 'vs/platform/opener/common/opener'; diff --git a/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts b/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts index 15825eae9da..782cb1493fd 100644 --- a/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts +++ b/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts @@ -5,17 +5,16 @@ import * as nls from 'vs/nls'; import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; -import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { Codicon } from 'vs/base/common/codicons'; -import { Event } from 'vs/base/common/event'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { pickSnippet } from 'vs/workbench/contrib/snippets/browser/snippetPicker'; class Args { @@ -87,7 +86,7 @@ class InsertSnippetAction extends EditorAction { } const clipboardService = accessor.get(IClipboardService); - const quickInputService = accessor.get(IQuickInputService); + const instaService = accessor.get(IInstantiationService); const snippet = await new Promise((resolve, reject) => { @@ -132,7 +131,7 @@ class InsertSnippetAction extends EditorAction { } else { // let user pick a snippet - resolve(this._pickSnippet(snippetService, quickInputService, languageId)); + resolve(instaService.invokeFunction(pickSnippet, languageId)); } }); @@ -145,81 +144,6 @@ class InsertSnippetAction extends EditorAction { } SnippetController2.get(editor)?.insert(snippet.codeSnippet, { clipboardText }); } - - private async _pickSnippet(snippetService: ISnippetsService, quickInputService: IQuickInputService, languageId: string): Promise { - - interface ISnippetPick extends IQuickPickItem { - snippet: Snippet; - } - - const snippets = (await snippetService.getSnippets(languageId, { includeDisabledSnippets: true, includeNoPrefixSnippets: true })).sort(Snippet.compare); - - const makeSnippetPicks = () => { - const result: QuickPickInput[] = []; - let prevSnippet: Snippet | undefined; - for (const snippet of snippets) { - const pick: ISnippetPick = { - label: snippet.prefix || snippet.name, - detail: snippet.description, - snippet - }; - if (!prevSnippet || prevSnippet.snippetSource !== snippet.snippetSource || prevSnippet.source !== snippet.source) { - let label = ''; - switch (snippet.snippetSource) { - case SnippetSource.User: - label = nls.localize('sep.userSnippet', "User Snippets"); - break; - case SnippetSource.Extension: - label = snippet.source; - break; - case SnippetSource.Workspace: - label = nls.localize('sep.workspaceSnippet', "Workspace Snippets"); - break; - } - result.push({ type: 'separator', label }); - } - - if (snippet.snippetSource === SnippetSource.Extension) { - const isEnabled = snippetService.isEnabled(snippet); - if (isEnabled) { - pick.buttons = [{ - iconClass: Codicon.eyeClosed.classNames, - tooltip: nls.localize('disableSnippet', 'Hide from IntelliSense') - }]; - } else { - pick.description = nls.localize('isDisabled', "(hidden from IntelliSense)"); - pick.buttons = [{ - iconClass: Codicon.eye.classNames, - tooltip: nls.localize('enable.snippet', 'Show in IntelliSense') - }]; - } - } - - result.push(pick); - prevSnippet = snippet; - } - return result; - }; - - const picker = quickInputService.createQuickPick(); - picker.placeholder = nls.localize('pick.placeholder', "Select a snippet"); - picker.matchOnDetail = true; - picker.ignoreFocusOut = false; - picker.keepScrollPosition = true; - picker.onDidTriggerItemButton(ctx => { - const isEnabled = snippetService.isEnabled(ctx.item.snippet); - snippetService.updateEnablement(ctx.item.snippet, !isEnabled); - picker.items = makeSnippetPicks(); - }); - picker.items = makeSnippetPicks(); - picker.show(); - - // wait for an item to be picked or the picker to become hidden - await Promise.race([Event.toPromise(picker.onDidAccept), Event.toPromise(picker.onDidHide)]); - const result = picker.selectedItems[0]?.snippet; - picker.dispose(); - return result; - } } registerEditorAction(InsertSnippetAction); diff --git a/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts b/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts index 8ce24e320dd..aa6e96d9afe 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippetCompletionProvider.ts @@ -9,15 +9,15 @@ import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; import { CompletionItem, CompletionItemKind, CompletionItemProvider, CompletionList, CompletionItemInsertTextRule, CompletionContext, CompletionTriggerKind, CompletionItemLabel } from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; import { localize } from 'vs/nls'; import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution'; import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; import { isPatternInWord } from 'vs/base/common/filters'; import { StopWatch } from 'vs/base/common/stopwatch'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; -import { getWordAtText } from 'vs/editor/common/model/wordHelper'; +import { getWordAtText } from 'vs/editor/common/core/wordHelper'; export class SnippetCompletion implements CompletionItem { @@ -25,14 +25,14 @@ export class SnippetCompletion implements CompletionItem { detail: string; insertText: string; documentation?: MarkdownString; - range: IRange | { insert: IRange, replace: IRange }; + range: IRange | { insert: IRange; replace: IRange }; sortText: string; kind: CompletionItemKind; insertTextRules: CompletionItemInsertTextRule; constructor( readonly snippet: Snippet, - range: IRange | { insert: IRange, replace: IRange } + range: IRange | { insert: IRange; replace: IRange } ) { this.label = { label: snippet.prefix, description: snippet.name }; this.detail = localize('detail.snippet', "{0} ({1})", snippet.description || snippet.name, snippet.source); @@ -81,30 +81,36 @@ export class SnippetCompletionProvider implements CompletionItemProvider { const triggerCharacterLow = context.triggerCharacter?.toLowerCase() ?? ''; - for (const snippet of snippets) { + snippet: for (const snippet of snippets) { + + if (context.triggerKind === CompletionTriggerKind.TriggerCharacter && !snippet.prefixLow.startsWith(triggerCharacterLow)) { + // strict -> when having trigger characters they must prefix-match + continue snippet; + } const word = getWordAtText(1, languageConfig.getWordDefinition(), snippet.prefixLow, 0); if (wordUntil && word && !isPatternInWord(wordUntil, 0, wordUntil.length, snippet.prefixLow, 0, snippet.prefixLow.length)) { // when at a word the snippet prefix must match - continue; + continue snippet; } - for (let pos = Math.max(0, columnOffset - snippet.prefixLow.length); pos < lineContentLow.length; pos++) { - - if (context.triggerKind === CompletionTriggerKind.TriggerCharacter && !snippet.prefixLow.startsWith(triggerCharacterLow)) { - // strict -> when having trigger characters they must prefix-match - continue; - } + column: for (let pos = Math.max(0, columnOffset - snippet.prefixLow.length); pos < lineContentLow.length; pos++) { if (!isPatternInWord(lineContentLow, pos, columnOffset, snippet.prefixLow, 0, snippet.prefixLow.length)) { - continue; + continue column; } const prefixRestLen = snippet.prefixLow.length - (columnOffset - pos); const endsWithPrefixRest = compareSubstring(lineContentLow, snippet.prefixLow, columnOffset, columnOffset + prefixRestLen, columnOffset - pos); const startPosition = position.with(undefined, pos + 1); + + if (wordUntil && position.equals(startPosition)) { + // at word-end but no overlap + continue snippet; + } + let endColumn = endsWithPrefixRest === 0 ? position.column + prefixRestLen : position.column; // First check if there is anything to the right of the cursor @@ -178,7 +184,7 @@ export class SnippetCompletionProvider implements CompletionItemProvider { // snippets, else fall back to the outer language model.tokenizeIfCheap(position.lineNumber); let languageId = model.getLanguageIdAtPosition(position.lineNumber, position.column); - if (!this._languageService.getLanguageName(languageId)){ + if (!this._languageService.getLanguageName(languageId)) { languageId = model.getLanguageId(); } return languageId; diff --git a/src/vs/workbench/contrib/snippets/browser/snippetPicker.ts b/src/vs/workbench/contrib/snippets/browser/snippetPicker.ts new file mode 100644 index 00000000000..9c83465a206 --- /dev/null +++ b/src/vs/workbench/contrib/snippets/browser/snippetPicker.ts @@ -0,0 +1,97 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution'; +import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; +import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; +import { Codicon } from 'vs/base/common/codicons'; +import { Event } from 'vs/base/common/event'; +import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; + +export async function pickSnippet(accessor: ServicesAccessor, languageIdOrSnippets: string | Snippet[]): Promise { + + const snippetService = accessor.get(ISnippetsService); + const quickInputService = accessor.get(IQuickInputService); + + interface ISnippetPick extends IQuickPickItem { + snippet: Snippet; + } + + let snippets: Snippet[]; + if (Array.isArray(languageIdOrSnippets)) { + snippets = languageIdOrSnippets; + } else { + snippets = (await snippetService.getSnippets(languageIdOrSnippets, { includeDisabledSnippets: true, includeNoPrefixSnippets: true })); + } + + snippets.sort(Snippet.compare); + + const makeSnippetPicks = () => { + const result: QuickPickInput[] = []; + let prevSnippet: Snippet | undefined; + for (const snippet of snippets) { + const pick: ISnippetPick = { + label: snippet.prefix || snippet.name, + detail: snippet.description, + snippet + }; + if (!prevSnippet || prevSnippet.snippetSource !== snippet.snippetSource || prevSnippet.source !== snippet.source) { + let label = ''; + switch (snippet.snippetSource) { + case SnippetSource.User: + label = nls.localize('sep.userSnippet', "User Snippets"); + break; + case SnippetSource.Extension: + label = snippet.source; + break; + case SnippetSource.Workspace: + label = nls.localize('sep.workspaceSnippet', "Workspace Snippets"); + break; + } + result.push({ type: 'separator', label }); + } + + if (snippet.snippetSource === SnippetSource.Extension) { + const isEnabled = snippetService.isEnabled(snippet); + if (isEnabled) { + pick.buttons = [{ + iconClass: Codicon.eyeClosed.classNames, + tooltip: nls.localize('disableSnippet', 'Hide from IntelliSense') + }]; + } else { + pick.description = nls.localize('isDisabled', "(hidden from IntelliSense)"); + pick.buttons = [{ + iconClass: Codicon.eye.classNames, + tooltip: nls.localize('enable.snippet', 'Show in IntelliSense') + }]; + } + } + + result.push(pick); + prevSnippet = snippet; + } + return result; + }; + + const picker = quickInputService.createQuickPick(); + picker.placeholder = nls.localize('pick.placeholder', "Select a snippet"); + picker.matchOnDetail = true; + picker.ignoreFocusOut = false; + picker.keepScrollPosition = true; + picker.onDidTriggerItemButton(ctx => { + const isEnabled = snippetService.isEnabled(ctx.item.snippet); + snippetService.updateEnablement(ctx.item.snippet, !isEnabled); + picker.items = makeSnippetPicks(); + }); + picker.items = makeSnippetPicks(); + picker.show(); + + // wait for an item to be picked or the picker to become hidden + await Promise.race([Event.toPromise(picker.onDidAccept), Event.toPromise(picker.onDidHide)]); + const result = picker.selectedItems[0]?.snippet; + picker.dispose(); + return result; +} diff --git a/src/vs/workbench/contrib/snippets/browser/snippetsFile.ts b/src/vs/workbench/contrib/snippets/browser/snippetsFile.ts index 21f5685aeae..74472c88afb 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippetsFile.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippetsFile.ts @@ -7,8 +7,8 @@ import { parse as jsonParse, getNodeType } from 'vs/base/common/json'; import { forEach } from 'vs/base/common/collections'; import { localize } from 'vs/nls'; import { extname, basename } from 'vs/base/common/path'; -import { SnippetParser, Variable, Placeholder, Text } from 'vs/editor/contrib/snippet/snippetParser'; -import { KnownSnippetVariableNames } from 'vs/editor/contrib/snippet/snippetVariables'; +import { SnippetParser, Variable, Placeholder, Text } from 'vs/editor/contrib/snippet/browser/snippetParser'; +import { KnownSnippetVariableNames } from 'vs/editor/contrib/snippet/browser/snippetVariables'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { IFileService } from 'vs/platform/files/common/files'; @@ -24,12 +24,14 @@ class SnippetBodyInsights { readonly codeSnippet: string; readonly isBogous: boolean; readonly needsClipboard: boolean; + readonly usesSelection: boolean; constructor(body: string) { // init with defaults this.isBogous = false; this.needsClipboard = false; + this.usesSelection = false; this.codeSnippet = body; // check snippet... @@ -58,8 +60,14 @@ class SnippetBodyInsights { this.isBogous = true; } - if (marker.name === 'CLIPBOARD') { - this.needsClipboard = true; + switch (marker.name) { + case 'CLIPBOARD': + this.needsClipboard = true; + break; + case 'SELECTION': + case 'TM_SELECTED_TEXT': + this.usesSelection = true; + break; } } else { @@ -107,6 +115,10 @@ export class Snippet { return this._bodyInsights.value.needsClipboard; } + get usesSelection(): boolean { + return this._bodyInsights.value.usesSelection; + } + static compare(a: Snippet, b: Snippet): number { if (a.snippetSource < b.snippetSource) { return -1; diff --git a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts index 6aabc3c3ddf..26e453f1b1e 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts @@ -9,8 +9,8 @@ import * as resources from 'vs/base/common/resources'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { Position } from 'vs/editor/common/core/position'; -import { ILanguageService } from 'vs/editor/common/services/language'; -import { setSnippetSuggestSupport } from 'vs/editor/contrib/suggest/suggest'; +import { ILanguageService } from 'vs/editor/common/languages/language'; +import { setSnippetSuggestSupport } from 'vs/editor/contrib/suggest/browser/suggest'; import { localize } from 'vs/nls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { FileChangeType, IFileService } from 'vs/platform/files/common/files'; @@ -29,7 +29,7 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag import { isStringArray } from 'vs/base/common/types'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; +import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; namespace snippetExt { @@ -185,6 +185,7 @@ class SnippetsService implements ISnippetsService { @IExtensionResourceLoaderService private readonly _extensionResourceLoaderService: IExtensionResourceLoaderService, @ILifecycleService lifecycleService: ILifecycleService, @IInstantiationService instantiationService: IInstantiationService, + @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService, ) { this._pendingWork.push(Promise.resolve(lifecycleService.when(LifecyclePhase.Restored).then(() => { this._initExtensionSnippets(); @@ -192,7 +193,7 @@ class SnippetsService implements ISnippetsService { this._initWorkspaceSnippets(); }))); - setSnippetSuggestSupport(new SnippetCompletionProvider(this._languageService, this, new TestLanguageConfigurationService())); + setSnippetSuggestSupport(new SnippetCompletionProvider(this._languageService, this, languageConfigurationService)); this._enablement = instantiationService.createInstance(SnippetEnablement); } diff --git a/src/vs/workbench/contrib/snippets/browser/surroundWithSnippet.ts b/src/vs/workbench/contrib/snippets/browser/surroundWithSnippet.ts new file mode 100644 index 00000000000..96c1ecfc5a7 --- /dev/null +++ b/src/vs/workbench/contrib/snippets/browser/surroundWithSnippet.ts @@ -0,0 +1,60 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { EditorAction2 } from 'vs/editor/browser/editorExtensions'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { localize } from 'vs/nls'; +import { registerAction2 } from 'vs/platform/actions/common/actions'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { pickSnippet } from 'vs/workbench/contrib/snippets/browser/snippetPicker'; +import { ISnippetsService } from 'vs/workbench/contrib/snippets/browser/snippets.contribution'; + + +registerAction2(class SurroundWithAction extends EditorAction2 { + + constructor() { + super({ + id: 'editor.action.surroundWithSnippet', + title: { value: localize('label', 'Surround With Snippet...'), original: 'Surround With Snippet...' }, + precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasNonEmptySelection), + f1: true + }); + } + + async runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, ...args: any[]) { + + const snippetService = accessor.get(ISnippetsService); + const clipboardService = accessor.get(IClipboardService); + const instaService = accessor.get(IInstantiationService); + + if (!editor.hasModel()) { + return; + } + + const { lineNumber, column } = editor.getPosition(); + editor.getModel().tokenizeIfCheap(lineNumber); + const languageId = editor.getModel().getLanguageIdAtPosition(lineNumber, column); + + const allSnippets = await snippetService.getSnippets(languageId, { includeNoPrefixSnippets: true, includeDisabledSnippets: true }); + const surroundSnippets = allSnippets.filter(snippet => snippet.usesSelection); + const snippet = await instaService.invokeFunction(pickSnippet, surroundSnippets); + + if (!snippet) { + return; + } + + + let clipboardText: string | undefined; + if (snippet.needsClipboard) { + clipboardText = await clipboardService.readText(); + } + + SnippetController2.get(editor)?.insert(snippet.codeSnippet, { clipboardText }); + } +}); diff --git a/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts b/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts index 180ced69a13..04f325ab208 100644 --- a/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts +++ b/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts @@ -12,15 +12,16 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; import { registerEditorContribution, EditorCommand, registerEditorCommand } from 'vs/editor/browser/editorExtensions'; -import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { showSimpleSuggestions } from 'vs/editor/contrib/suggest/suggest'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { showSimpleSuggestions } from 'vs/editor/contrib/suggest/browser/suggest'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Snippet } from './snippetsFile'; import { SnippetCompletion } from './snippetCompletionProvider'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { EditorState, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState'; +import { EditorState, CodeEditorStateFlag } from 'vs/editor/contrib/editorState/browser/editorState'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; export class TabCompletionController implements IEditorContribution { @@ -39,6 +40,7 @@ export class TabCompletionController implements IEditorContribution { constructor( private readonly _editor: ICodeEditor, + @IInstantiationService private readonly _instantiationService: IInstantiationService, @ISnippetsService private readonly _snippetService: ISnippetsService, @IClipboardService private readonly _clipboardService: IClipboardService, @IContextKeyService contextKeyService: IContextKeyService, @@ -148,7 +150,7 @@ export class TabCompletionController implements IEditorContribution { } else if (this._activeSnippets.length > 1) { // two or more -> show IntelliSense box const position = this._editor.getPosition(); - showSimpleSuggestions(this._editor, this._activeSnippets.map(snippet => { + this._instantiationService.invokeFunction(showSimpleSuggestions, this._editor, this._activeSnippets.map(snippet => { const range = Range.fromPositions(position.delta(0, -snippet.prefix.length), position); return new SnippetCompletion(snippet, range); })); diff --git a/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts b/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts index c0542b6b2b5..a318d231a18 100644 --- a/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts +++ b/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { SnippetFile, Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/browser/snippetsFile'; import { URI } from 'vs/base/common/uri'; -import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; suite('Snippets', function () { diff --git a/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts b/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts index 2381ba1d26e..85db8e7872a 100644 --- a/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts +++ b/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts @@ -663,9 +663,8 @@ suite('SnippetsService', function () { { triggerKind: CompletionTriggerKind.Invoke } )!; - assert.strictEqual(result.suggestions.length, 2); - assert.strictEqual((result.suggestions[0]).label.label, '^y'); - assert.strictEqual((result.suggestions[1]).label.label, 'hell_or_tell'); + assert.strictEqual(result.suggestions.length, 1); + assert.strictEqual((result.suggestions[0]).label.label, 'hell_or_tell'); model.dispose(); }); @@ -709,4 +708,22 @@ suite('SnippetsService', function () { assert.strictEqual((result.suggestions[0]).label.label, 'foobarrrrrr'); model.dispose(); }); + + test('Strange and useless autosuggestion #region/#endregion PHP #140039', async function () { + snippetService = new SimpleSnippetService([ + new Snippet(['fooLang'], 'reg', '#region', '', 'value', '', SnippetSource.User), + ]); + + + const provider = new SnippetCompletionProvider(languageService, snippetService, new TestLanguageConfigurationService()); + let model = createTextModel('function abc(w)', 'fooLang'); + let result = await provider.provideCompletionItems( + model, + new Position(1, 15), + { triggerKind: CompletionTriggerKind.Invoke } + )!; + + assert.strictEqual(result.suggestions.length, 0); + model.dispose(); + }); }); diff --git a/src/vs/workbench/contrib/splash/browser/splash.contribution.ts b/src/vs/workbench/contrib/splash/browser/splash.contribution.ts index 1e3e4245449..a037c8fa2a2 100644 --- a/src/vs/workbench/contrib/splash/browser/splash.contribution.ts +++ b/src/vs/workbench/contrib/splash/browser/splash.contribution.ts @@ -7,9 +7,9 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { ISplashStorageService } from 'vs/workbench/contrib/splash/browser/splash'; -import { IPartsSplash } from 'vs/platform/windows/common/windows'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { PartsSplash } from 'vs/workbench/contrib/splash/browser/partsSplash'; +import { IPartsSplash } from 'vs/platform/theme/common/themeService'; registerSingleton(ISplashStorageService, class SplashStorageService implements ISplashStorageService { _serviceBrand: undefined; diff --git a/src/vs/workbench/contrib/splash/browser/splash.ts b/src/vs/workbench/contrib/splash/browser/splash.ts index 9c87eb8e607..79f677fa070 100644 --- a/src/vs/workbench/contrib/splash/browser/splash.ts +++ b/src/vs/workbench/contrib/splash/browser/splash.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IPartsSplash } from 'vs/platform/windows/common/windows'; +import { IPartsSplash } from 'vs/platform/theme/common/themeService'; export const ISplashStorageService = createDecorator('ISplashStorageService'); diff --git a/src/vs/workbench/contrib/splash/electron-sandbox/splash.contribution.ts b/src/vs/workbench/contrib/splash/electron-sandbox/splash.contribution.ts index 703a60e8a6c..64bfeb23c2e 100644 --- a/src/vs/workbench/contrib/splash/electron-sandbox/splash.contribution.ts +++ b/src/vs/workbench/contrib/splash/electron-sandbox/splash.contribution.ts @@ -7,10 +7,10 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { ISplashStorageService } from 'vs/workbench/contrib/splash/browser/splash'; -import { IPartsSplash } from 'vs/platform/windows/common/windows'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { PartsSplash } from 'vs/workbench/contrib/splash/browser/partsSplash'; +import { IPartsSplash } from 'vs/platform/theme/common/themeService'; class SplashStorageService implements ISplashStorageService { _serviceBrand: undefined; diff --git a/src/vs/workbench/contrib/surveys/browser/ces.contribution.ts b/src/vs/workbench/contrib/surveys/browser/ces.contribution.ts index 125da89cf20..6c2dab81268 100644 --- a/src/vs/workbench/contrib/surveys/browser/ces.contribution.ts +++ b/src/vs/workbench/contrib/surveys/browser/ces.contribution.ts @@ -57,6 +57,12 @@ class CESContribution extends Disposable implements IWorkbenchContribution { } private async promptUser() { + const isCandidate = await this.tasExperimentService?.getTreatment('CESSurvey'); + if (!isCandidate) { + this.skipSurvey(); + return; + } + const sendTelemetry = (userReaction: 'accept' | 'remindLater' | 'neverShowAgain' | 'cancelled') => { /* __GDPR__ "cesSurvey:popup" : { @@ -113,12 +119,6 @@ class CESContribution extends Disposable implements IWorkbenchContribution { } private async schedulePrompt(): Promise { - const isCandidate = await this.tasExperimentService?.getTreatment('CESSurvey'); - if (!isCandidate) { - this.skipSurvey(); - return; - } - let waitTimeToShowSurvey = 0; const remindLaterDate = this.storageService.get(REMIND_LATER_DATE_KEY, StorageScope.GLOBAL, ''); if (remindLaterDate) { diff --git a/src/vs/workbench/contrib/surveys/browser/languageSurveys.contribution.ts b/src/vs/workbench/contrib/surveys/browser/languageSurveys.contribution.ts index bbcc6e62d26..75d75f97b34 100644 --- a/src/vs/workbench/contrib/surveys/browser/languageSurveys.contribution.ts +++ b/src/vs/workbench/contrib/surveys/browser/languageSurveys.contribution.ts @@ -5,7 +5,7 @@ import { localize } from 'vs/nls'; import { language } from 'vs/base/common/platform'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/vs/workbench/contrib/tags/common/javaWorkspaceTags.ts b/src/vs/workbench/contrib/tags/common/javaWorkspaceTags.ts index cebb545f548..28bc098ac81 100644 --- a/src/vs/workbench/contrib/tags/common/javaWorkspaceTags.ts +++ b/src/vs/workbench/contrib/tags/common/javaWorkspaceTags.ts @@ -11,7 +11,7 @@ export const MavenDependencyRegex = /([\s\S]*?)<\/dependency>/g; export const MavenGroupIdRegex = /([\s\S]*?)<\/groupId>/; export const MavenArtifactIdRegex = /([\s\S]*?)<\/artifactId>/; -export const JavaLibrariesToLookFor: { groupId: string, artifactId: string, tag: string }[] = [ +export const JavaLibrariesToLookFor: { groupId: string; artifactId: string; tag: string }[] = [ // azure { 'groupId': 'com.microsoft.azure', 'artifactId': 'azure', 'tag': 'azure' }, { 'groupId': 'com.microsoft.azure', 'artifactId': 'azure-mgmt-.*', 'tag': 'azure' }, diff --git a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTags.ts b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTags.ts index 594ca8f0671..395145ee8b4 100644 --- a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTags.ts +++ b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTags.ts @@ -67,7 +67,7 @@ export class WorkspaceTags implements IWorkbenchContribution { value = 'Unknown'; } - this.telemetryService.publicLog2<{ edition: string }, { edition: { classification: 'SystemMetaData', purpose: 'BusinessInsight' } }>('windowsEdition', { edition: value }); + this.telemetryService.publicLog2<{ edition: string }, { edition: { classification: 'SystemMetaData'; purpose: 'BusinessInsight' } }>('windowsEdition', { edition: value }); } private async getWorkspaceInformation(): Promise { @@ -126,14 +126,7 @@ export class WorkspaceTags implements IWorkbenchContribution { private reportRemotes(workspaceUris: URI[]): void { Promise.all(workspaceUris.map(workspaceUri => { return this.workspaceTagsService.getHashedRemotesFromUri(workspaceUri, true); - })).then(hashedRemotes => { - /* __GDPR__ - "workspace.hashedRemotes" : { - "remotes" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workspace.hashedRemotes', { remotes: hashedRemotes }); - }, onUnexpectedError); + })).then(() => { }, onUnexpectedError); } /* __GDPR__FRAGMENT__ @@ -229,10 +222,6 @@ export class WorkspaceTags implements IWorkbenchContribution { if (['DIRECT', 'PROXY', 'HTTPS', 'SOCKS', 'EMPTY'].indexOf(type) === -1) { type = 'UNKNOWN'; } - type ResolveProxyStatsClassification = { - type: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - }; - this.telemetryService.publicLog2<{ type: String }, ResolveProxyStatsClassification>('resolveProxy.stats', { type }); }).then(undefined, onUnexpectedError); } } diff --git a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts index ecc77eb8a0f..b7891c758d4 100644 --- a/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts +++ b/src/vs/workbench/contrib/tags/electron-sandbox/workspaceTagsService.ts @@ -372,7 +372,7 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.npm.playwright-core" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.playwright-chromium" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.playwright-firefox" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.playwright-webkit" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.playwright-webkit" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.cypress" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.nightwatch" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.protractor" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, @@ -572,7 +572,7 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { tags['workspace.id'] = await this.getTelemetryWorkspaceId(workspace, state); - const { filesToOpenOrCreate, filesToDiff } = this.environmentService.configuration; + const { filesToOpenOrCreate, filesToDiff } = this.environmentService; tags['workbench.filesToOpenOrCreate'] = filesToOpenOrCreate && filesToOpenOrCreate.length || 0; tags['workbench.filesToDiff'] = filesToDiff && filesToDiff.length || 0; @@ -813,7 +813,7 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { } private findFolder(): URI | undefined { - const { filesToOpenOrCreate, filesToDiff } = this.environmentService.configuration; + const { filesToOpenOrCreate, filesToDiff } = this.environmentService; if (filesToOpenOrCreate && filesToOpenOrCreate.length) { return this.parentURI(filesToOpenOrCreate[0].fileUri); } else if (filesToDiff && filesToDiff.length) { diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 581d17f807f..fc29d22b1b0 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -79,7 +79,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { once } from 'vs/base/common/functional'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust'; -import { VirtualWorkspaceContext } from 'vs/workbench/browser/contextkeys'; +import { VirtualWorkspaceContext } from 'vs/workbench/common/contextkeys'; import { Schemas } from 'vs/base/common/network'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; @@ -92,7 +92,7 @@ export namespace ConfigureTaskAction { export const TEXT = nls.localize('ConfigureTaskRunnerAction.label', "Configure Task"); } -type TaskQuickPickEntryType = (IQuickPickItem & { task: Task; }) | (IQuickPickItem & { folder: IWorkspaceFolder; }) | (IQuickPickItem & { settingType: string; }); +type TaskQuickPickEntryType = (IQuickPickItem & { task: Task }) | (IQuickPickItem & { folder: IWorkspaceFolder }) | (IQuickPickItem & { settingType: string }); class ProblemReporter implements TaskConfig.IProblemReporter { @@ -133,10 +133,6 @@ export interface WorkspaceFolderConfigurationResult { hasErrors: boolean; } -interface TaskCustomizationTelemetryEvent { - properties: string[]; -} - interface CommandUpgrade { command?: string; args?: string[]; @@ -187,13 +183,6 @@ class TaskMap { } } -interface ProblemMatcherDisableMetrics { - type: string; -} -type ProblemMatcherDisableMetricsClassification = { - type: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; -}; - export abstract class AbstractTaskService extends Disposable implements ITaskService { // private static autoDetectTelemetryName: string = 'taskServer.autoDetect'; @@ -201,7 +190,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer private static readonly RecentlyUsedTasks_KeyV2 = 'workbench.tasks.recentlyUsedTasks2'; private static readonly IgnoreTask010DonotShowAgain_key = 'workbench.tasks.ignoreTask010Shown'; - private static CustomizationTelemetryEventName: string = 'taskService.customize'; public _serviceBrand: undefined; public static OutputChannelId: string = 'tasks'; public static OutputChannelLabel: string = nls.localize('tasks', "Tasks"); @@ -284,7 +272,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer this._taskSystem = undefined; } this.updateSetup(folderSetup); - this.updateWorkspaceTasks(TaskRunSource.FolderOpen); + return this.updateWorkspaceTasks(TaskRunSource.FolderOpen); })); this._register(this.configurationService.onDidChangeConfiguration(() => { if (!this._taskSystem && !this._workspaceTasksPromise) { @@ -295,7 +283,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } this.setTaskLRUCacheLimit(); - this.updateWorkspaceTasks(TaskRunSource.ConfigurationChange); + return this.updateWorkspaceTasks(TaskRunSource.ConfigurationChange); })); this._taskRunningState = TASK_RUNNING_STATE.bindTo(contextKeyService); this._onDidStateChange = this._register(new Emitter()); @@ -664,7 +652,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer const requestedFolder = TaskMap.getKey(folder); const matchedTasks = await this._findWorkspaceTasks((task, workspaceFolder) => { const taskFolder = TaskMap.getKey(workspaceFolder); - if (taskFolder !== requestedFolder || taskFolder !== USER_TASKS_GROUP_KEY) { + if (taskFolder !== requestedFolder && taskFolder !== USER_TASKS_GROUP_KEY) { return false; } return task.matches(key, compareId); @@ -861,8 +849,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return this._recentlyUsedTasks; } - private getFolderFromTaskKey(key: string): { folder: string | undefined, isWorkspaceFile: boolean | undefined } { - const keyValue: { folder: string | undefined, id: string | undefined } = JSON.parse(key); + private getFolderFromTaskKey(key: string): { folder: string | undefined; isWorkspaceFile: boolean | undefined } { + const keyValue: { folder: string | undefined; id: string | undefined } = JSON.parse(key); return { folder: keyValue.folder, isWorkspaceFile: keyValue.id?.endsWith(TaskSourceKind.WorkspaceFile) }; @@ -1138,7 +1126,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } private async updateNeverProblemMatcherSetting(type: string): Promise { - this.telemetryService.publicLog2('problemMatcherDisabled', { type }); const current = this.configurationService.getValue(PROBLEM_MATCHER_NEVER_CONFIG); if (current === true) { return; @@ -1445,15 +1432,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return Promise.resolve(undefined); } return promise.then(() => { - let event: TaskCustomizationTelemetryEvent = { - properties: properties ? Object.getOwnPropertyNames(properties) : [] - }; - /* __GDPR__ - "taskService.customize" : { - "properties" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog(AbstractTaskService.CustomizationTelemetryEventName, event); if (openConfig) { this.openEditorAtTask(this.getResourceForTask(task), toCustomize); } @@ -1607,43 +1585,79 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer let resolverData: Map | undefined; + async function quickResolve(that: AbstractTaskService, identifier: string | TaskIdentifier) { + const foundTasks = await that._findWorkspaceTasks((task: Task | ConfiguringTask): boolean => { + if (Types.isString(identifier)) { + return ((task._label === identifier) || (task.configurationProperties.identifier === identifier)); + } else { + const keyedIdentifier = task.getDefinition(true); + const searchIdentifier = TaskDefinition.createTaskIdentifier(identifier, console); + return (searchIdentifier && keyedIdentifier) ? (searchIdentifier._key === keyedIdentifier._key) : false; + } + }); + if (foundTasks.length === 0) { + return undefined; + } + const task = foundTasks[0]; + if (ConfiguringTask.is(task)) { + return that.tryResolveTask(task); + } + return task; + } + + async function getResolverData(that: AbstractTaskService) { + if (resolverData === undefined) { + resolverData = new Map(); + (grouped || await that.getGroupedTasks()).forEach((tasks, folder) => { + let data = resolverData!.get(folder); + if (!data) { + data = { label: new Map(), identifier: new Map(), taskIdentifier: new Map() }; + resolverData!.set(folder, data); + } + for (let task of tasks) { + data.label.set(task._label, task); + if (task.configurationProperties.identifier) { + data.identifier.set(task.configurationProperties.identifier, task); + } + let keyedIdentifier = task.getDefinition(true); + if (keyedIdentifier !== undefined) { + data.taskIdentifier.set(keyedIdentifier._key, task); + } + } + }); + } + return resolverData; + } + + async function fullResolve(that: AbstractTaskService, uri: URI | string, identifier: string | TaskIdentifier) { + const allResolverData = await getResolverData(that); + let data = allResolverData.get(typeof uri === 'string' ? uri : uri.toString()); + if (!data) { + return undefined; + } + if (Types.isString(identifier)) { + return data.label.get(identifier) || data.identifier.get(identifier); + } else { + let key = TaskDefinition.createTaskIdentifier(identifier, console); + return key !== undefined ? data.taskIdentifier.get(key._key) : undefined; + } + } + return { resolve: async (uri: URI | string, identifier: string | TaskIdentifier | undefined) => { - if (resolverData === undefined) { - resolverData = new Map(); - (grouped || await this.getGroupedTasks()).forEach((tasks, folder) => { - let data = resolverData!.get(folder); - if (!data) { - data = { label: new Map(), identifier: new Map(), taskIdentifier: new Map() }; - resolverData!.set(folder, data); - } - for (let task of tasks) { - data.label.set(task._label, task); - if (task.configurationProperties.identifier) { - data.identifier.set(task.configurationProperties.identifier, task); - } - let keyedIdentifier = task.getDefinition(true); - if (keyedIdentifier !== undefined) { - data.taskIdentifier.set(keyedIdentifier._key, task); - } - } - }); - } - let data = resolverData.get(typeof uri === 'string' ? uri : uri.toString()); - if (!data || !identifier) { + if (!identifier) { return undefined; } - if (Types.isString(identifier)) { - return data.label.get(identifier) || data.identifier.get(identifier); + if ((resolverData === undefined) && (grouped === undefined)) { + return (await quickResolve(this, identifier)) ?? fullResolve(this, uri, identifier); } else { - let key = TaskDefinition.createTaskIdentifier(identifier, console); - return key !== undefined ? data.taskIdentifier.get(key._key) : undefined; + return fullResolve(this, uri, identifier); } } }; } - private executeTask(task: Task, resolver: ITaskResolver, runSource: TaskRunSource): Promise { + private async saveBeforeRun(): Promise { enum SaveBeforeRunConfigOptions { Always = 'always', Never = 'never', @@ -1652,20 +1666,9 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer const saveBeforeRunTaskConfig: SaveBeforeRunConfigOptions = this.configurationService.getValue('task.saveBeforeRun'); - const execTask = async (task: Task, resolver: ITaskResolver): Promise => { - return ProblemMatcherRegistry.onReady().then(() => { - let executeResult = this.getTaskSystem().run(task, resolver); - return this.handleExecuteResult(executeResult, runSource); - }); - }; - - const saveAllEditorsAndExecTask = async (task: Task, resolver: ITaskResolver): Promise => { - return this.editorService.saveAll({ reason: SaveReason.AUTO }).then(() => { - return execTask(task, resolver); - }); - }; - - const promptAsk = async (task: Task, resolver: ITaskResolver): Promise => { + if (saveBeforeRunTaskConfig === SaveBeforeRunConfigOptions.Never) { + return false; + } else if (saveBeforeRunTaskConfig === SaveBeforeRunConfigOptions.Prompt) { const dialogOptions = await this.dialogService.show( Severity.Info, nls.localize('TaskSystem.saveBeforeRun.prompt.title', 'Save all editors?'), @@ -1676,30 +1679,30 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } ); - if (dialogOptions.choice === 0) { - return saveAllEditorsAndExecTask(task, resolver); - } else { - return execTask(task, resolver); + if (dialogOptions.choice !== 0) { + return false; } - }; - - if (saveBeforeRunTaskConfig === SaveBeforeRunConfigOptions.Never) { - return execTask(task, resolver); - } else if (saveBeforeRunTaskConfig === SaveBeforeRunConfigOptions.Prompt) { - return promptAsk(task, resolver); - } else { - return saveAllEditorsAndExecTask(task, resolver); } + await this.editorService.saveAll({ reason: SaveReason.AUTO }); + return true; + } + + private async executeTask(task: Task, resolver: ITaskResolver, runSource: TaskRunSource): Promise { + let taskToRun: Task = task; + if (await this.saveBeforeRun()) { + await this.configurationService.reloadConfiguration(); + await this.updateWorkspaceTasks(); + const taskFolder = task.getWorkspaceFolder(); + const taskIdentifier = task.configurationProperties.identifier; + // Since we save before running tasks, the task may have changed as part of the save. + taskToRun = ((taskFolder && taskIdentifier) ? await this.getTask(taskFolder, taskIdentifier) : task) ?? task; + } + await ProblemMatcherRegistry.onReady(); + let executeResult = this.getTaskSystem().run(taskToRun, resolver); + return this.handleExecuteResult(executeResult, runSource); } private async handleExecuteResult(executeResult: ITaskExecuteResult, runSource?: TaskRunSource): Promise { - if (executeResult.task.taskLoadMessages && executeResult.task.taskLoadMessages.length > 0) { - executeResult.task.taskLoadMessages.forEach(loadMessage => { - this._outputChannel.append(loadMessage + '\n'); - }); - this.showOutput(); - } - if (runSource === TaskRunSource.User) { await this.setRecentlyUsedTask(executeResult.task); } @@ -1770,7 +1773,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer this.modelService, this.configurationResolverService, this.telemetryService, this.contextService, this.environmentService, AbstractTaskService.OutputChannelId, this.fileService, this.terminalProfileResolverService, - this.pathService, this.viewDescriptorService, this.logService, this.configurationService, + this.pathService, this.viewDescriptorService, this.logService, this.configurationService, this.notificationService, this, (workspaceFolder: IWorkspaceFolder | undefined) => { if (workspaceFolder) { @@ -2048,12 +2051,12 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer if (this._workspaceTasksPromise) { return this._workspaceTasksPromise; } - this.updateWorkspaceTasks(runSource); - return this._workspaceTasksPromise!; + return this.updateWorkspaceTasks(runSource); } - private updateWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): void { + private updateWorkspaceTasks(runSource: TaskRunSource = TaskRunSource.User): Promise> { this._workspaceTasksPromise = this.computeWorkspaceTasks(runSource); + return this._workspaceTasksPromise; } private async getAFolder(): Promise { @@ -2119,7 +2122,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer problemReporter.fatal(nls.localize('TaskSystem.configurationErrors', 'Error: the provided task configuration has validation errors and can\'t not be used. Please correct the errors first.')); return { workspaceFolder, set: undefined, configurations: undefined, hasErrors }; } - let customizedTasks: { byIdentifier: IStringDictionary; } | undefined; + let customizedTasks: { byIdentifier: IStringDictionary } | undefined; if (parseResult.configured && parseResult.configured.length > 0) { customizedTasks = { byIdentifier: Object.create(null) @@ -2136,7 +2139,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer }); } - private testParseExternalConfig(config: TaskConfig.ExternalTaskRunnerConfiguration | undefined, location: string): { config: TaskConfig.ExternalTaskRunnerConfiguration | undefined, hasParseErrors: boolean } { + private testParseExternalConfig(config: TaskConfig.ExternalTaskRunnerConfiguration | undefined, location: string): { config: TaskConfig.ExternalTaskRunnerConfiguration | undefined; hasParseErrors: boolean } { if (!config) { return { config: undefined, hasParseErrors: false }; } @@ -2164,7 +2167,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } const workspaceFileConfig = this.getConfiguration(workspaceFolder, TaskSourceKind.WorkspaceFile); const configuration = this.testParseExternalConfig(workspaceFileConfig.config, nls.localize('TasksSystem.locationWorkspaceConfig', 'workspace file')); - let customizedTasks: { byIdentifier: IStringDictionary; } = { + let customizedTasks: { byIdentifier: IStringDictionary } = { byIdentifier: Object.create(null) }; @@ -2184,7 +2187,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } const userTasksConfig = this.getConfiguration(workspaceFolder, TaskSourceKind.User); const configuration = this.testParseExternalConfig(userTasksConfig.config, nls.localize('TasksSystem.locationUserConfig', 'user settings')); - let customizedTasks: { byIdentifier: IStringDictionary; } = { + let customizedTasks: { byIdentifier: IStringDictionary } = { byIdentifier: Object.create(null) }; @@ -2250,7 +2253,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer let workspaceFolder: IWorkspaceFolder = this.contextService.getWorkspace().folders[0]; workspaceFolders.push(workspaceFolder); executionEngine = this.computeExecutionEngine(workspaceFolder); - const telemetryData: { [key: string]: any; } = { + const telemetryData: { [key: string]: any } = { executionEngineVersion: executionEngine }; /* __GDPR__ @@ -2651,7 +2654,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } } - private tasksAndGroupedTasks(filter?: TaskFilter): { tasks: Promise, grouped: Promise } { + private tasksAndGroupedTasks(filter?: TaskFilter): { tasks: Promise; grouped: Promise } { if (!this.versionAndEngineCompatible(filter)) { return { tasks: Promise.resolve([]), grouped: Promise.resolve(new TaskMap()) }; } @@ -2700,7 +2703,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer this.showIgnoredFoldersMessage().then(() => { if (this.configurationService.getValue(USE_SLOW_PICKER)) { - let taskResult: { tasks: Promise, grouped: Promise } | undefined = undefined; + let taskResult: { tasks: Promise; grouped: Promise } | undefined = undefined; if (!tasks) { taskResult = this.tasksAndGroupedTasks(); } @@ -2742,7 +2745,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer }); } - private splitPerGroupType(tasks: Task[]): { none: Task[], defaults: Task[] } { + private splitPerGroupType(tasks: Task[]): { none: Task[]; defaults: Task[] } { let none: Task[] = []; let defaults: Task[] = []; for (let task of tasks) { @@ -2779,13 +2782,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer if (buildTasks.length === 1) { const buildTask = buildTasks[0]; if (ConfiguringTask.is(buildTask)) { - this.tryResolveTask(buildTask).then(resolvedTask => { + return this.tryResolveTask(buildTask).then(resolvedTask => { runSingleBuildTask(resolvedTask, undefined, this); }); } else { runSingleBuildTask(buildTask, undefined, this); + return; } - return; } return this.getTasksForGroup(TaskGroup.Build).then((tasks) => { @@ -3013,7 +3016,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer switch (taskSource) { case TaskSourceKind.User: tasksExistInFile = this.configHasTasks(configValue.userValue); target = ConfigurationTarget.USER; break; case TaskSourceKind.WorkspaceFile: tasksExistInFile = this.configHasTasks(configValue.workspaceValue); target = ConfigurationTarget.WORKSPACE; break; - default: tasksExistInFile = this.configHasTasks(configValue.value); target = ConfigurationTarget.WORKSPACE_FOLDER; + default: tasksExistInFile = this.configHasTasks(configValue.workspaceFolderValue); target = ConfigurationTarget.WORKSPACE_FOLDER; } let content; if (!tasksExistInFile) { @@ -3027,18 +3030,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer content = content.replace(/(\n)(\t+)/g, (_, s1, s2) => s1 + ' '.repeat(s2.length * editorConfig.editor.tabSize)); } configFileCreated = true; - type TaskServiceTemplateClassification = { - templateId?: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - autoDetect: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - }; - type TaskServiceEvent = { - templateId?: string; - autoDetect: boolean; - }; - this.telemetryService.publicLog2('taskService.template', { - templateId: pickTemplateResult.id, - autoDetect: pickTemplateResult.autoDetect - }); } if (!fileExists && content) { @@ -3145,18 +3136,20 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer let entries = Promise.all(stats).then((stats) => { return taskPromise.then((taskMap) => { let entries: QuickPickInput[] = []; - let needsCreateOrOpen: boolean = true; + let configuredCount = 0; let tasks = taskMap.all(); if (tasks.length > 0) { tasks = tasks.sort((a, b) => a._label.localeCompare(b._label)); for (let task of tasks) { entries.push({ label: task._label, task, description: this.getTaskDescription(task), detail: this.showDetail() ? task.configurationProperties.detail : undefined }); if (!ContributedTask.is(task)) { - needsCreateOrOpen = false; + configuredCount++; } } } - if (needsCreateOrOpen) { + const needsCreateOrOpen = (configuredCount === 0); + // If the only configured tasks are user tasks, then we should also show the option to create from a template. + if (needsCreateOrOpen || (taskMap.get(USER_TASKS_GROUP_KEY).length === configuredCount)) { let label = stats[0] !== undefined ? openLabel : createLabel; if (entries.length) { entries.push({ type: 'separator' }); @@ -3359,7 +3352,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return undefined; } - private upgradeTask(task: Task, suppressTaskName: boolean, globalConfig: { windows?: CommandUpgrade, osx?: CommandUpgrade, linux?: CommandUpgrade }): TaskConfig.CustomTask | TaskConfig.ConfiguringTask | undefined { + private upgradeTask(task: Task, suppressTaskName: boolean, globalConfig: { windows?: CommandUpgrade; osx?: CommandUpgrade; linux?: CommandUpgrade }): TaskConfig.CustomTask | TaskConfig.ConfiguringTask | undefined { if (!CustomTask.is(task)) { return; } diff --git a/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts b/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts index c50630bda75..270dafb67c2 100644 --- a/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts +++ b/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts @@ -86,7 +86,7 @@ export class RunAutomaticTasks extends Disposable implements IWorkbenchContribut return undefined; } - private static findAutoTasks(taskService: ITaskService, workspaceTaskResult: Map): { tasks: Array>, taskNames: Array, locations: Map } { + private static findAutoTasks(taskService: ITaskService, workspaceTaskResult: Map): { tasks: Array>; taskNames: Array; locations: Map } { const tasks = new Array>(); const taskNames = new Array(); const locations = new Map(); diff --git a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts index d787f7b0359..4b5b0871acb 100644 --- a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts @@ -32,7 +32,7 @@ import schemaVersion2, { updateProblemMatchers, updateTaskDefinitions } from '.. import { AbstractTaskService, ConfigureTaskAction } from 'vs/workbench/contrib/tasks/browser/abstractTaskService'; import { tasksSchemaId } from 'vs/workbench/services/configuration/common/configuration'; import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; -import { WorkbenchStateContext } from 'vs/workbench/browser/contextkeys'; +import { WorkbenchStateContext } from 'vs/workbench/common/contextkeys'; import { IQuickAccessRegistry, Extensions as QuickAccessExtensions } from 'vs/platform/quickinput/common/quickAccess'; import { TasksQuickAccessProvider } from 'vs/workbench/contrib/tasks/browser/tasksQuickAccess'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts b/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts index 517811539b9..c78e28e9d0c 100644 --- a/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts +++ b/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts @@ -111,7 +111,7 @@ export class TaskQuickPick extends Disposable { return tasks; } - private dedupeConfiguredAndRecent(recentTasks: (Task | ConfiguringTask)[], configuredTasks: (Task | ConfiguringTask)[]): { configuredTasks: (Task | ConfiguringTask)[], recentTasks: (Task | ConfiguringTask)[] } { + private dedupeConfiguredAndRecent(recentTasks: (Task | ConfiguringTask)[], configuredTasks: (Task | ConfiguringTask)[]): { configuredTasks: (Task | ConfiguringTask)[]; recentTasks: (Task | ConfiguringTask)[] } { let dedupedConfiguredTasks: (Task | ConfiguringTask)[] = []; const foundRecentTasks: boolean[] = Array(recentTasks.length).fill(false); for (let j = 0; j < configuredTasks.length; j++) { @@ -142,7 +142,7 @@ export class TaskQuickPick extends Disposable { return { configuredTasks: dedupedConfiguredTasks, recentTasks: prunedRecentTasks }; } - public async getTopLevelEntries(defaultEntry?: TaskQuickPickEntry): Promise<{ entries: QuickPickInput[], isSingleConfigured?: Task | ConfiguringTask }> { + public async getTopLevelEntries(defaultEntry?: TaskQuickPickEntry): Promise<{ entries: QuickPickInput[]; isSingleConfigured?: Task | ConfiguringTask }> { if (this.topLevelEntries !== undefined) { return { entries: this.topLevelEntries }; } diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 50ceec6859c..c0547a2ae39 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -51,6 +51,7 @@ import { TerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/brows import { TaskTerminalStatus } from 'vs/workbench/contrib/tasks/browser/taskTerminalStatus'; import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; +import { INotificationService } from 'vs/platform/notification/common/notification'; interface TerminalData { terminal: ITerminalInstance; @@ -135,7 +136,7 @@ export class VerifiedTask { return verified; } - public getVerifiedTask(): { task: Task, resolver: ITaskResolver, trigger: string, resolvedVariables: ResolvedVariables, systemInfo: TaskSystemInfo, workspaceFolder: IWorkspaceFolder, shellLaunchConfig: IShellLaunchConfig } { + public getVerifiedTask(): { task: Task; resolver: ITaskResolver; trigger: string; resolvedVariables: ResolvedVariables; systemInfo: TaskSystemInfo; workspaceFolder: IWorkspaceFolder; shellLaunchConfig: IShellLaunchConfig } { if (this.verify()) { return { task: this.task, resolver: this.resolver, trigger: this.trigger, resolvedVariables: this.resolvedVariables!, systemInfo: this.systemInfo!, workspaceFolder: this.workspaceFolder!, shellLaunchConfig: this.shellLaunchConfig! }; } else { @@ -222,6 +223,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { private viewDescriptorService: IViewDescriptorService, private logService: ILogService, private configurationService: IConfigurationService, + private notificationService: INotificationService, taskService: ITaskService, taskSystemInfoResolver: TaskSystemInfoResolver, ) { @@ -307,6 +309,21 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { } } + private showTaskLoadErrors(task: Task) { + if (task.taskLoadMessages && task.taskLoadMessages.length > 0) { + task.taskLoadMessages.forEach(loadMessage => { + this.log(loadMessage + '\n'); + }); + const openOutput = 'Show Output'; + this.notificationService.prompt(Severity.Warning, + nls.localize('TerminalTaskSystem.taskLoadReporting', "There are issues with task \"{0}\". See the output for more details.", + task._label), [{ + label: openOutput, + run: () => this.showOutput() + }]); + } + } + public isTaskVisible(task: Task): boolean { let terminalData = this.activeTasks[task.getMapKey()]; if (!terminalData) { @@ -481,6 +498,8 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { return {}; } + this.showTaskLoadErrors(task); + alreadyResolved = alreadyResolved ?? new Map(); let promises: Promise[] = []; if (task.configurationProperties.dependsOn) { @@ -840,7 +859,8 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { }); }); promise = new Promise((resolve, reject) => { - const onExit = terminal!.onExit((exitCode) => { + const onExit = terminal!.onExit((terminalLaunchResult) => { + const exitCode = typeof terminalLaunchResult === 'number' ? terminalLaunchResult : terminalLaunchResult?.code; onData.dispose(); onExit.dispose(); let key = task.getMapKey(); @@ -849,7 +869,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { } this.removeFromActiveTasks(task); this.fireTaskEvent(TaskEvent.create(TaskEventKind.Changed)); - if (exitCode !== undefined) { + if (terminalLaunchResult !== undefined) { // Only keep a reference to the terminal if it is not being disposed. switch (task.command.presentation!.panel) { case PanelKind.Dedicated: @@ -878,7 +898,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { processStartedSignaled = true; } - this.fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, exitCode)); + this.fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, exitCode ?? undefined)); for (let i = 0; i < eventCounter; i++) { this.fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task)); @@ -886,7 +906,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { eventCounter = 0; this.fireTaskEvent(TaskEvent.create(TaskEventKind.End, task)); toDispose.dispose(); - resolve({ exitCode }); + resolve({ exitCode: exitCode ?? undefined }); }); }); } else { @@ -919,12 +939,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { startStopProblemMatcher.processLine(line); }); promise = new Promise((resolve, reject) => { - const onExit = terminal!.onExit((exitCode) => { + const onExit = terminal!.onExit((terminalLaunchResult) => { + const exitCode = typeof terminalLaunchResult === 'number' ? terminalLaunchResult : terminalLaunchResult?.code; onExit.dispose(); let key = task.getMapKey(); this.removeFromActiveTasks(task); this.fireTaskEvent(TaskEvent.create(TaskEventKind.Changed)); - if (exitCode !== undefined) { + if (terminalLaunchResult !== undefined) { // Only keep a reference to the terminal if it is not being disposed. switch (task.command.presentation!.panel) { case PanelKind.Dedicated: @@ -961,13 +982,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { processStartedSignaled = true; } - this.fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, exitCode)); + this.fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, exitCode ?? undefined)); if (this.busyTasks[mapKey]) { delete this.busyTasks[mapKey]; } this.fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task)); this.fireTaskEvent(TaskEvent.create(TaskEventKind.End, task)); - resolve({ exitCode }); + resolve({ exitCode: exitCode ?? undefined }); }); }); } @@ -1035,7 +1056,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { let isShellCommand = task.command.runtime === RuntimeType.Shell; let needsFolderQualification = this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE; let terminalName = this.createTerminalName(task); - const description = nls.localize('TerminalTaskSystem.terminalDescription', 'Task'); + const type = 'Task'; let originalCommand = task.command.name; if (isShellCommand) { let os: Platform.OperatingSystem; @@ -1052,7 +1073,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { }); shellLaunchConfig = { name: terminalName, - description, + type, executable: defaultProfile.path, args: defaultProfile.args, icon: defaultProfile.icon, @@ -1147,7 +1168,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { // When we have a process task there is no need to quote arguments. So we go ahead and take the string value. shellLaunchConfig = { name: terminalName, - description, + type, executable: executable, args: args.map(a => Types.isString(a) ? a : a.value), waitOnExit @@ -1270,7 +1291,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { isFeatureTerminal: true }; } else { - let resolvedResult: { command: CommandString, args: CommandString[] } = await this.resolveCommandAndArgs(resolver, task.command); + let resolvedResult: { command: CommandString; args: CommandString[] } = await this.resolveCommandAndArgs(resolver, task.command); command = resolvedResult.command; args = resolvedResult.args; commandExecutable = CommandString.value(command); @@ -1353,7 +1374,8 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { } private buildShellCommandLine(platform: Platform.Platform, shellExecutable: string, shellOptions: ShellConfiguration | undefined, command: CommandString, originalCommand: CommandString | undefined, args: CommandString[]): string { - let shellQuoteOptions = this.getQuotingOptions(shellExecutable, shellOptions, platform); + let basename = path.parse(shellExecutable).name.toLowerCase(); + let shellQuoteOptions = this.getQuotingOptions(basename, shellOptions, platform); function needsQuotes(value: string): boolean { if (value.length >= 2) { @@ -1440,9 +1462,9 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { let commandLine = result.join(' '); // There are special rules quoted command line in cmd.exe if (platform === Platform.Platform.Windows) { - if (shellExecutable === 'cmd' && commandQuoted && argQuoted) { + if (basename === 'cmd' && commandQuoted && argQuoted) { commandLine = '"' + commandLine + '"'; - } else if ((shellExecutable === 'powershell' || shellExecutable === 'pwsh') && commandQuoted) { + } else if ((basename === 'powershell' || basename === 'pwsh') && commandQuoted) { commandLine = '& ' + commandLine; } } @@ -1565,7 +1587,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { } while (matches); } - private async resolveCommandAndArgs(resolver: VariableResolver, commandConfig: CommandConfiguration): Promise<{ command: CommandString, args: CommandString[] }> { + private async resolveCommandAndArgs(resolver: VariableResolver, commandConfig: CommandConfiguration): Promise<{ command: CommandString; args: CommandString[] }> { // First we need to use the command args: let args: CommandString[] = commandConfig.args ? commandConfig.args.slice() : []; args = await this.resolveVariables(resolver, args); diff --git a/src/vs/workbench/contrib/tasks/common/problemCollectors.ts b/src/vs/workbench/contrib/tasks/common/problemCollectors.ts index 6d43b2e5ae7..081843db236 100644 --- a/src/vs/workbench/contrib/tasks/common/problemCollectors.ts +++ b/src/vs/workbench/contrib/tasks/common/problemCollectors.ts @@ -355,7 +355,7 @@ export class StartStopProblemCollector extends AbstractProblemCollector implemen constructor(problemMatchers: ProblemMatcher[], markerService: IMarkerService, modelService: IModelService, _strategy: ProblemHandlingStrategy = ProblemHandlingStrategy.Clean, fileService?: IFileService) { super(problemMatchers, markerService, modelService, fileService); - let ownerSet: { [key: string]: boolean; } = Object.create(null); + let ownerSet: { [key: string]: boolean } = Object.create(null); problemMatchers.forEach(description => ownerSet[description.owner] = true); this.owners = Object.keys(ownerSet); this.owners.forEach((owner) => { diff --git a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts index a4f8b9f7bf4..7ab00229e89 100644 --- a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts @@ -223,7 +223,7 @@ export interface LegacyCommandProperties { isShellCommand?: boolean | ShellConfiguration; } -export type CommandString = string | string[] | { value: string | string[], quoting: 'escape' | 'strong' | 'weak' }; +export type CommandString = string | string[] | { value: string | string[]; quoting: 'escape' | 'strong' | 'weak' }; export namespace CommandString { export function value(value: CommandString): string { @@ -529,6 +529,11 @@ enum ProblemMatcherKind { Array } +type TaskConfigurationValueWithErrors = { + value?: T; + errors?: string[]; +}; + const EMPTY_ARRAY: any[] = []; Object.freeze(EMPTY_ARRAY); @@ -806,7 +811,7 @@ namespace CommandOptions { if (target.env === undefined) { target.env = source.env; } else if (source.env !== undefined) { - let env: { [key: string]: string; } = Object.create(null); + let env: { [key: string]: string } = Object.create(null); if (target.env !== undefined) { Object.keys(target.env).forEach(key => env[key] = target.env![key]); } @@ -1144,8 +1149,8 @@ namespace ProblemMatcherConverter { return result; } - export function fromWithOsConfig(this: void, external: ConfigurationProperties & { [key: string]: any; }, context: ParseContext): ProblemMatcher[] | undefined { - let result: ProblemMatcher[] | undefined = undefined; + export function fromWithOsConfig(this: void, external: ConfigurationProperties & { [key: string]: any }, context: ParseContext): TaskConfigurationValueWithErrors { + let result: TaskConfigurationValueWithErrors = {}; if (external.windows && external.windows.problemMatcher && context.platform === Platform.Windows) { result = from(external.windows.problemMatcher, context); } else if (external.osx && external.osx.problemMatcher && context.platform === Platform.Mac) { @@ -1158,33 +1163,36 @@ namespace ProblemMatcherConverter { return result; } - export function from(this: void, config: ProblemMatcherConfig.ProblemMatcherType | undefined, context: ParseContext): ProblemMatcher[] { + export function from(this: void, config: ProblemMatcherConfig.ProblemMatcherType | undefined, context: ParseContext): TaskConfigurationValueWithErrors { let result: ProblemMatcher[] = []; if (config === undefined) { - return result; + return { value: result }; + } + const errors: string[] = []; + function addResult(matcher: TaskConfigurationValueWithErrors) { + if (matcher.value) { + result.push(matcher.value); + } + if (matcher.errors) { + errors.push(...matcher.errors); + } } let kind = getProblemMatcherKind(config); if (kind === ProblemMatcherKind.Unknown) { - context.problemReporter.warn(nls.localize( + const error = nls.localize( 'ConfigurationParser.unknownMatcherKind', 'Warning: the defined problem matcher is unknown. Supported types are string | ProblemMatcher | Array.\n{0}\n', - JSON.stringify(config, null, 4))); - return result; + JSON.stringify(config, null, 4)); + context.problemReporter.warn(error); } else if (kind === ProblemMatcherKind.String || kind === ProblemMatcherKind.ProblemMatcher) { - let matcher = resolveProblemMatcher(config as ProblemMatcherConfig.ProblemMatcher, context); - if (matcher) { - result.push(matcher); - } + addResult(resolveProblemMatcher(config as ProblemMatcherConfig.ProblemMatcher, context)); } else if (kind === ProblemMatcherKind.Array) { let problemMatchers = <(string | ProblemMatcherConfig.ProblemMatcher)[]>config; problemMatchers.forEach(problemMatcher => { - let matcher = resolveProblemMatcher(problemMatcher, context); - if (matcher) { - result.push(matcher); - } + addResult(resolveProblemMatcher(problemMatcher, context)); }); } - return result; + return { value: result, errors }; } function getProblemMatcherKind(this: void, value: ProblemMatcherConfig.ProblemMatcherType): ProblemMatcherKind { @@ -1199,28 +1207,27 @@ namespace ProblemMatcherConverter { } } - function resolveProblemMatcher(this: void, value: string | ProblemMatcherConfig.ProblemMatcher, context: ParseContext): ProblemMatcher | undefined { + function resolveProblemMatcher(this: void, value: string | ProblemMatcherConfig.ProblemMatcher, context: ParseContext): TaskConfigurationValueWithErrors { if (Types.isString(value)) { let variableName = value; if (variableName.length > 1 && variableName[0] === '$') { variableName = variableName.substring(1); let global = ProblemMatcherRegistry.get(variableName); if (global) { - return Objects.deepClone(global); + return { value: Objects.deepClone(global) }; } let localProblemMatcher: ProblemMatcher & Partial = context.namedProblemMatchers[variableName]; if (localProblemMatcher) { localProblemMatcher = Objects.deepClone(localProblemMatcher); // remove the name delete localProblemMatcher.name; - return localProblemMatcher; + return { value: localProblemMatcher }; } } - context.taskLoadIssues.push(nls.localize('ConfigurationParser.invalidVariableReference', 'Error: Invalid problemMatcher reference: {0}\n', value)); - return undefined; + return { errors: [nls.localize('ConfigurationParser.invalidVariableReference', 'Error: Invalid problemMatcher reference: {0}\n', value)] }; } else { let json = value; - return new ProblemMatcherParser(context.problemReporter).parse(json); + return { value: new ProblemMatcherParser(context.problemReporter).parse(json) }; } } } @@ -1303,11 +1310,12 @@ namespace ConfigurationProperties { { property: 'options' } ]; - export function from(this: void, external: ConfigurationProperties & { [key: string]: any; }, context: ParseContext, includeCommandOptions: boolean, source: TaskConfigSource, properties?: IJSONSchemaMap): Tasks.ConfigurationProperties | undefined { + export function from(this: void, external: ConfigurationProperties & { [key: string]: any }, context: ParseContext, + includeCommandOptions: boolean, source: TaskConfigSource, properties?: IJSONSchemaMap): TaskConfigurationValueWithErrors { if (!external) { - return undefined; + return {}; } - let result: Tasks.ConfigurationProperties & { [key: string]: any; } = {}; + let result: Tasks.ConfigurationProperties & { [key: string]: any } = {}; if (properties) { for (const propertyName of Object.keys(properties)) { @@ -1355,13 +1363,13 @@ namespace ConfigurationProperties { result.options = CommandOptions.from(external.options, context); } const configProblemMatcher = ProblemMatcherConverter.fromWithOsConfig(external, context); - if (configProblemMatcher !== undefined) { - result.problemMatchers = configProblemMatcher; + if (configProblemMatcher.value !== undefined) { + result.problemMatchers = configProblemMatcher.value; } if (external.detail) { result.detail = external.detail; } - return isEmpty(result) ? undefined : result; + return isEmpty(result) ? {} : { value: result, errors: configProblemMatcher.errors }; } export function isEmpty(this: void, value: Tasks.ConfigurationProperties): boolean { @@ -1461,8 +1469,9 @@ namespace ConfiguringTask { {} ); let configuration = ConfigurationProperties.from(external, context, true, source, typeDeclaration.properties); - if (configuration) { - result.configurationProperties = Object.assign(result.configurationProperties, configuration); + result.addTaskLoadMessages(configuration.errors); + if (configuration.value) { + result.configurationProperties = Object.assign(result.configurationProperties, configuration.value); if (result.configurationProperties.name) { result._label = result.configurationProperties.name; } else { @@ -1538,8 +1547,9 @@ namespace CustomTask { } ); let configuration = ConfigurationProperties.from(external, context, false, source); - if (configuration) { - result.configurationProperties = Object.assign(result.configurationProperties, configuration); + result.addTaskLoadMessages(configuration.errors); + if (configuration.value) { + result.configurationProperties = Object.assign(result.configurationProperties, configuration.value); } let supportLegacy: boolean = true; //context.schemaVersion === Tasks.JsonSchemaVersion.V2_0_0; if (supportLegacy) { @@ -1667,8 +1677,8 @@ namespace TaskParser { if (!externals) { return result; } - let defaultBuildTask: { task: Tasks.Task | undefined; rank: number; } = { task: undefined, rank: -1 }; - let defaultTestTask: { task: Tasks.Task | undefined; rank: number; } = { task: undefined, rank: -1 }; + let defaultBuildTask: { task: Tasks.Task | undefined; rank: number } = { task: undefined, rank: -1 }; + let defaultTestTask: { task: Tasks.Task | undefined; rank: number } = { task: undefined, rank: -1 }; let schema2_0_0: boolean = context.schemaVersion === Tasks.JsonSchemaVersion.V2_0_0; const baseLoadIssues = Objects.deepClone(context.taskLoadIssues); for (let index = 0; index < externals.length; index++) { @@ -1825,7 +1835,7 @@ namespace Globals { result.promptOnClose = !!config.promptOnClose; } if (config.problemMatcher) { - result.problemMatcher = ProblemMatcherConverter.from(config.problemMatcher, context); + result.problemMatcher = ProblemMatcherConverter.from(config.problemMatcher, context).value; } return result; } @@ -2069,7 +2079,7 @@ class ConfigurationParser { } if ((!result.custom || result.custom.length === 0) && (globals.command && globals.command.name)) { - let matchers: ProblemMatcher[] = ProblemMatcherConverter.from(fileConfig.problemMatcher, context); + const matchers: ProblemMatcher[] = ProblemMatcherConverter.from(fileConfig.problemMatcher, context).value ?? []; let isBackground = fileConfig.isBackground ? !!fileConfig.isBackground : fileConfig.isWatching ? !!fileConfig.isWatching : undefined; let name = Tasks.CommandString.value(globals.command.name); let task: Tasks.CustomTask = new Tasks.CustomTask( diff --git a/src/vs/workbench/contrib/tasks/common/taskService.ts b/src/vs/workbench/contrib/tasks/common/taskService.ts index 808c12110ae..68a2394a880 100644 --- a/src/vs/workbench/contrib/tasks/common/taskService.ts +++ b/src/vs/workbench/contrib/tasks/common/taskService.ts @@ -33,7 +33,7 @@ export interface ProblemMatcherRunOptions { } export interface CustomizationProperties { - group?: string | { kind?: string; isDefault?: boolean; }; + group?: string | { kind?: string; isDefault?: boolean }; problemMatcher?: string | string[]; isBackground?: boolean; } diff --git a/src/vs/workbench/contrib/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts index 44120aa2f58..cb475cae0ee 100644 --- a/src/vs/workbench/contrib/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -112,7 +112,7 @@ export interface CommandOptions { * The environment of the executed program or shell. If omitted * the parent process' environment is used. */ - env?: { [key: string]: string; }; + env?: { [key: string]: string }; } export namespace CommandOptions { @@ -1153,7 +1153,7 @@ export namespace KeyedTaskIdentifier { } export namespace TaskDefinition { - export function createTaskIdentifier(external: TaskIdentifier, reporter: { error(message: string): void; }): KeyedTaskIdentifier | undefined { + export function createTaskIdentifier(external: TaskIdentifier, reporter: { error(message: string): void }): KeyedTaskIdentifier | undefined { let definition = TaskDefinitionRegistry.get(external.type); if (definition === undefined) { // We have no task definition so we can't sanitize the literal. Take it as is diff --git a/src/vs/workbench/contrib/tasks/test/common/configuration.test.ts b/src/vs/workbench/contrib/tasks/test/common/configuration.test.ts index 003ddc19be1..c1ef36f8b17 100644 --- a/src/vs/workbench/contrib/tasks/test/common/configuration.test.ts +++ b/src/vs/workbench/contrib/tasks/test/common/configuration.test.ts @@ -441,8 +441,8 @@ function assertConfiguration(result: ParseResult, expected: Tasks.Task[]): void // We can't compare Ids since the parser uses UUID which are random // So create a new map using the name. - let actualTasks: { [key: string]: Tasks.Task; } = Object.create(null); - let actualId2Name: { [key: string]: string; } = Object.create(null); + let actualTasks: { [key: string]: Tasks.Task } = Object.create(null); + let actualId2Name: { [key: string]: string } = Object.create(null); let actualTaskGroups = new TaskGroupMap(); actual.forEach(task => { assert.ok(!actualTasks[task.configurationProperties.name!]); @@ -454,7 +454,7 @@ function assertConfiguration(result: ParseResult, expected: Tasks.Task[]): void actualTaskGroups.add(taskId, task); } }); - let expectedTasks: { [key: string]: Tasks.Task; } = Object.create(null); + let expectedTasks: { [key: string]: Tasks.Task } = Object.create(null); let expectedTaskGroup = new TaskGroupMap(); expected.forEach(task => { assert.ok(!expectedTasks[task.configurationProperties.name!]); diff --git a/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts b/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts index 8615fce5375..adf6f60619f 100644 --- a/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts +++ b/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts @@ -35,11 +35,11 @@ type TelemetryData = { }; type FileTelemetryDataFragment = { - mimeType: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - ext: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - path: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - reason?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - allowlistedjson?: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + mimeType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + ext: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + path: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + reason?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + allowlistedjson?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; export class TelemetryContribution extends Disposable implements IWorkbenchContribution { @@ -61,34 +61,34 @@ export class TelemetryContribution extends Disposable implements IWorkbenchContr ) { super(); - const { filesToOpenOrCreate, filesToDiff } = environmentService.configuration; + const { filesToOpenOrCreate, filesToDiff } = environmentService; const activeViewlet = paneCompositeService.getActivePaneComposite(ViewContainerLocation.Sidebar); type WindowSizeFragment = { - innerHeight: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - innerWidth: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - outerHeight: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - outerWidth: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + innerHeight: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + innerWidth: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + outerHeight: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + outerWidth: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; type WorkspaceLoadClassification = { - userAgent: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - emptyWorkbench: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + userAgent: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + emptyWorkbench: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; windowSize: WindowSizeFragment; - 'workbench.filesToOpenOrCreate': { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - 'workbench.filesToDiff': { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - customKeybindingsCount: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - theme: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - language: { classification: 'SystemMetaData', purpose: 'BusinessInsight' }; - pinnedViewlets: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - restoredViewlet?: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - restoredEditors: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - startupKind: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + 'workbench.filesToOpenOrCreate': { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + 'workbench.filesToDiff': { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + customKeybindingsCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + theme: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + language: { classification: 'SystemMetaData'; purpose: 'BusinessInsight' }; + pinnedViewlets: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + restoredViewlet?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + restoredEditors: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + startupKind: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; type WorkspaceLoadEvent = { userAgent: string; - windowSize: { innerHeight: number, innerWidth: number, outerHeight: number, outerWidth: number }; + windowSize: { innerHeight: number; innerWidth: number; outerHeight: number; outerWidth: number }; emptyWorkbench: boolean; 'workbench.filesToOpenOrCreate': number; 'workbench.filesToDiff': number; @@ -134,7 +134,7 @@ export class TelemetryContribution extends Disposable implements IWorkbenchContr const settingsType = this.getTypeIfSettings(e.model.resource); if (settingsType) { type SettingsReadClassification = { - settingsType: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + settingsType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; this.telemetryService.publicLog2<{ settingsType: string }, SettingsReadClassification>('settingsRead', { settingsType }); // Do not log read to user settings.json and .vscode folder as a fileGet event as it ruins our JSON usage data @@ -149,7 +149,7 @@ export class TelemetryContribution extends Disposable implements IWorkbenchContr const settingsType = this.getTypeIfSettings(e.model.resource); if (settingsType) { type SettingsWrittenClassification = { - settingsType: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + settingsType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; this.telemetryService.publicLog2<{ settingsType: string }, SettingsWrittenClassification>('settingsWritten', { settingsType }); // Do not log write to user settings.json and .vscode folder as a filePUT event as it ruins our JSON usage data } else { diff --git a/src/vs/workbench/contrib/terminal/browser/capabilities/commandDetectionCapability.ts b/src/vs/workbench/contrib/terminal/browser/capabilities/commandDetectionCapability.ts new file mode 100644 index 00000000000..62f7750a116 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/capabilities/commandDetectionCapability.ts @@ -0,0 +1,172 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter } from 'vs/base/common/event'; +import { ILogService } from 'vs/platform/log/common/log'; +import { ICommandDetectionCapability, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { ITerminalCommand } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IBuffer, IMarker, Terminal } from 'xterm'; + +interface ICurrentPartialCommand { + previousCommandMarker?: IMarker; + + promptStartMarker?: IMarker; + + commandStartMarker?: IMarker; + commandStartX?: number; + + commandExecutedMarker?: IMarker; + commandExecutedX?: number; + + commandFinishedMarker?: IMarker; + + command?: string; +} + +export class CommandDetectionCapability implements ICommandDetectionCapability { + readonly type = TerminalCapability.CommandDetection; + + protected _commands: ITerminalCommand[] = []; + private _exitCode: number | undefined; + private _cwd: string | undefined; + private _currentCommand: ICurrentPartialCommand = {}; + private _isWindowsPty: boolean = false; + + get commands(): readonly ITerminalCommand[] { return this._commands; } + + private readonly _onCommandFinished = new Emitter(); + readonly onCommandFinished = this._onCommandFinished.event; + + constructor( + private readonly _terminal: Terminal, + @ILogService private readonly _logService: ILogService + ) { + } + + setCwd(value: string) { + this._cwd = value; + } + + setIsWindowsPty(value: boolean) { + this._isWindowsPty = value; + } + + getCwdForLine(line: number): string | undefined { + // TODO: It would be more reliable to take the closest cwd above the line if it isn't found for the line + // TODO: Use a reverse for loop to find the line to avoid creating another array + const reversed = [...this._commands].reverse(); + return reversed.find(c => c.marker!.line <= line - 1)?.cwd; + } + + handlePromptStart(): void { + this._currentCommand.promptStartMarker = this._terminal.registerMarker(0); + this._logService.debug('CommandDetectionCapability#handlePromptStart', this._terminal.buffer.active.cursorX, this._currentCommand.promptStartMarker?.line); + } + + handleCommandStart(): void { + this._currentCommand.commandStartX = this._terminal.buffer.active.cursorX; + this._currentCommand.commandStartMarker = this._terminal.registerMarker(0); + this._logService.debug('CommandDetectionCapability#handleCommandStart', this._currentCommand.commandStartX, this._currentCommand.commandStartMarker?.line); + } + + handleCommandExecuted(): void { + this._currentCommand.commandExecutedMarker = this._terminal.registerMarker(0); + this._currentCommand.commandExecutedX = this._terminal.buffer.active.cursorX; + this._logService.debug('CommandDetectionCapability#handleCommandExecuted', this._currentCommand.commandExecutedX, this._currentCommand.commandExecutedMarker?.line); + // TODO: Make sure this only runs on Windows backends (not frontends) + if (!this._isWindowsPty && this._currentCommand.commandStartMarker && this._currentCommand.commandExecutedMarker && this._currentCommand.commandStartX) { + this._currentCommand.command = this._terminal.buffer.active.getLine(this._currentCommand.commandStartMarker.line)?.translateToString(true, this._currentCommand.commandStartX); + let y = this._currentCommand.commandStartMarker.line + 1; + const commandExecutedLine = this._currentCommand.commandExecutedMarker.line; + for (; y < commandExecutedLine; y++) { + const line = this._terminal.buffer.active.getLine(y); + if (line) { + this._currentCommand.command += line.translateToString(true); + } + } + if (y === commandExecutedLine) { + this._currentCommand.command += this._terminal.buffer.active.getLine(commandExecutedLine)?.translateToString(true, undefined, this._currentCommand.commandExecutedX) || ''; + } + return; + } + + // TODO: Leverage key events on Windows between CommandStart and Executed to ensure we have the correct line + + // TODO: Only do this on Windows backends + // Check if the command line is the same as the previous command line or if the + // start Y differs from the executed Y. This is to catch the conpty case where the + // "rendering" of the shell integration sequences doesn't occur on the correct cell + // due to https://github.com/microsoft/terminal/issues/11220 + if (this._currentCommand.previousCommandMarker?.line === this._currentCommand.commandStartMarker?.line || + this._currentCommand.commandStartMarker?.line === this._currentCommand.commandExecutedMarker?.line) { + this._currentCommand.commandStartMarker = this._terminal?.registerMarker(0); + this._currentCommand.commandStartX = 0; + } + + // TODO: This does not yet work when the prompt line is wrapped + this._currentCommand.command = this._terminal!.buffer.active.getLine(this._currentCommand.commandExecutedMarker!.line)?.translateToString(true, this._currentCommand.commandStartX || 0); + + // TODO: Only do this on Windows backends + // Something went wrong, try predict the prompt based on the shell. + if (this._currentCommand.commandStartX === 0) { + // TODO: Only do this on pwsh + const promptPredictions = [ + `PS ${this._cwd}> `, + `PS>`, + ]; + for (const promptPrediction of promptPredictions) { + if (this._currentCommand.command?.startsWith(promptPrediction)) { + // TODO: Consider cell vs string positioning; test CJK + this._currentCommand.commandStartX = promptPrediction.length; + this._currentCommand.command = this._currentCommand.command.substring(this._currentCommand.commandStartX); + break; + } + } + } + } + + handleCommandFinished(exitCode: number): void { + this._currentCommand.commandFinishedMarker = this._terminal.registerMarker(0); + const command = this._currentCommand.command; + this._logService.debug('CommandDetectionCapability#handleCommandFinished', this._terminal.buffer.active.cursorX, this._currentCommand.commandFinishedMarker?.line, this._currentCommand.command, this._currentCommand); + this._exitCode = exitCode; + if (this._currentCommand.commandStartMarker === undefined || !this._terminal.buffer.active) { + return; + } + if (command && !command.startsWith('\\') && command !== '') { + const buffer = this._terminal.buffer.active; + const clonedPartialCommand = { ...this._currentCommand }; + const newCommand = { + command, + timestamp: Date.now(), + cwd: this._cwd, + exitCode: this._exitCode, + getOutput: () => getOutputForCommand(clonedPartialCommand, buffer), + marker: this._currentCommand.commandStartMarker + }; + this._commands.push(newCommand); + this._onCommandFinished.fire(newCommand); + } + this._currentCommand.previousCommandMarker?.dispose(); + this._currentCommand.previousCommandMarker = this._currentCommand.commandStartMarker; + this._currentCommand = {}; + } + + setCommandLine(commandLine: string) { + this._logService.debug('CommandDetectionCapability#setCommandLine', commandLine); + this._currentCommand.command = commandLine; + } +} + +function getOutputForCommand(command: ICurrentPartialCommand, buffer: IBuffer): string | undefined { + const startLine = command.commandExecutedMarker!.line; + const endLine = command.commandFinishedMarker!.line; + + let output = ''; + for (let i = startLine; i < endLine; i++) { + output += buffer.getLine(i)?.translateToString() + '\n'; + } + return output === '' ? undefined : output; +} diff --git a/src/vs/workbench/contrib/terminal/browser/capabilities/partialCommandDetectionCapability.ts b/src/vs/workbench/contrib/terminal/browser/capabilities/partialCommandDetectionCapability.ts new file mode 100644 index 00000000000..e349ac103c5 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/capabilities/partialCommandDetectionCapability.ts @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter } from 'vs/base/common/event'; +import { IPartialCommandDetectionCapability, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { IMarker, Terminal } from 'xterm'; + +const enum Constants { + /** + * The minimum size of the prompt in which to assume the line is a command. + */ + MinimumPromptLength = 2 +} + +/** + * This capability guesses where commands are based on where the cursor was when enter was pressed. + * It's very hit or miss but it's often correct and better than nothing. + */ +export class PartialCommandDetectionCapability implements IPartialCommandDetectionCapability { + readonly type = TerminalCapability.PartialCommandDetection; + + private readonly _commands: IMarker[] = []; + + get commands(): readonly IMarker[] { return this._commands; } + + private readonly _onCommandFinished = new Emitter(); + readonly onCommandFinished = this._onCommandFinished.event; + + constructor( + private readonly _terminal: Terminal, + ) { + this._terminal.onKey(e => this._onKey(e.key)); + } + + private _onKey(key: string): void { + if (key === '\x0d') { + this._onEnter(); + } + } + + private _onEnter(): void { + if (!this._terminal) { + return; + } + if (this._terminal.buffer.active.cursorX >= Constants.MinimumPromptLength) { + const marker = this._terminal.registerMarker(0); + if (marker) { + this._commands.push(marker); + this._onCommandFinished.fire(marker); + } + } + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/links.ts b/src/vs/workbench/contrib/terminal/browser/links/links.ts new file mode 100644 index 00000000000..012b95f3214 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/links/links.ts @@ -0,0 +1,118 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IBufferLine, IBufferRange, Terminal } from 'xterm'; +import { URI } from 'vs/base/common/uri'; +import { IHoverAction } from 'vs/workbench/services/hover/browser/hover'; + +/** + * A link detector can search for and return links within the xterm.js buffer. A single link + * detector can return multiple links of differing types. + */ +export interface ITerminalLinkDetector { + /** + * The xterm.js instance this detector belongs to. + */ + readonly xterm: Terminal; + + /** + * Detects links within the _wrapped_ line range provided and returns them as an array. + * + * @param lines The individual buffer lines that make up the wrapped line. + * @param startLine The start of the wrapped line. This _will not_ be validated that it is + * indeed the start of a wrapped line. + * @param endLine The end of the wrapped line. This _will not_ be validated that it is indeed + * the end of a wrapped line. + */ + detect(lines: IBufferLine[], startLine: number, endLine: number): ITerminalSimpleLink[] | Promise; +} + +export interface ITerminalSimpleLink { + /** + * The text of the link. + */ + text: string; + + /** + * The buffer range of the link. + */ + readonly bufferRange: IBufferRange; + + /** + * The type of link, which determines how it is handled when activated. + */ + readonly type: TerminalLinkType; + + /** + * The URI of the link if it has been resolved. + */ + uri?: URI; + + /** + * A hover label to override the default for the type. + */ + label?: string; + + /** + * An optional set of actions to show in the hover's status bar. + */ + actions?: IHoverAction[]; + + /** + * An optional method to call when the link is activated. This should be used when there is are + * no registered opener for this link type. + */ + activate?(text: string): void; +} + +export type TerminalLinkType = TerminalBuiltinLinkType | ITerminalExternalLinkType; + +export const enum TerminalBuiltinLinkType { + /** + * The link is validated to be a file on the file system and will open an editor. + */ + LocalFile, + + /** + * The link is validated to be a folder on the file system and is outside the workspace. It will + * reveal the folder within the explorer. + */ + LocalFolderOutsideWorkspace, + + /** + * The link is validated to be a folder on the file system and is within the workspace and will + * reveal the folder within the explorer. + */ + LocalFolderInWorkspace, + + /** + * A low confidence link which will search for the file in the workspace. If there is a single + * match, it will open the file; otherwise, it will present the matches in a quick pick. + */ + Search, + + /** + * A link whose text is a valid URI. + */ + Url +} + +export interface ITerminalExternalLinkType { + id: string; +} + +export interface ITerminalLinkOpener { + open(link: ITerminalSimpleLink): Promise; +} + +export type ResolvedLink = IResolvedValidLink | null; + +export interface IResolvedValidLink { + uri: URI; + link: string; + isDirectory: boolean; +} + +export type OmitFirstArg = F extends (x: any, ...args: infer P) => infer R ? (...args: P) => R : never; diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider.ts deleted file mode 100644 index 3adccc7f5c2..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider.ts +++ /dev/null @@ -1,19 +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 type { ILinkProvider, ILink } from 'xterm'; -import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; - -export abstract class TerminalBaseLinkProvider implements ILinkProvider { - private _activeLinks: TerminalLink[] | undefined; - - async provideLinks(bufferLineNumber: number, callback: (links: ILink[] | undefined) => void): Promise { - this._activeLinks?.forEach(l => l.dispose); - this._activeLinks = await this._provideLinks(bufferLineNumber); - callback(this._activeLinks); - } - - protected abstract _provideLinks(bufferLineNumber: number): Promise | TerminalLink[]; -} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkDetector.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkDetector.ts new file mode 100644 index 00000000000..9a633e8956a --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkDetector.ts @@ -0,0 +1,59 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ITerminalLinkDetector, ITerminalSimpleLink, OmitFirstArg } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { convertLinkRangeToBuffer, getXtermLineContent } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; +import { ITerminalExternalLinkProvider } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { IBufferLine, Terminal } from 'xterm'; + +const enum Constants { + /** + * The max line length to try extract word links from. + */ + MaxLineLength = 2000 +} + +export class TerminalExternalLinkDetector implements ITerminalLinkDetector { + constructor( + readonly id: string, + readonly xterm: Terminal, + private readonly _provideLinks: OmitFirstArg + ) { + } + + async detect(lines: IBufferLine[], startLine: number, endLine: number): Promise { + // Get the text representation of the wrapped line + const text = getXtermLineContent(this.xterm.buffer.active, startLine, endLine, this.xterm.cols); + if (text === '' || text.length > Constants.MaxLineLength) { + return []; + } + + const externalLinks = await this._provideLinks(text); + if (!externalLinks) { + return []; + } + + const result = externalLinks.map(link => { + const bufferRange = convertLinkRangeToBuffer(lines, this.xterm.cols, { + startColumn: link.startIndex + 1, + startLineNumber: 1, + endColumn: link.startIndex + link.length + 1, + endLineNumber: 1 + }, startLine); + const matchingText = text.substring(link.startIndex, link.startIndex + link.length) || ''; + + const l: ITerminalSimpleLink = { + text: matchingText, + label: link.label, + bufferRange, + type: { id: this.id }, + activate: link.activate + }; + return l; + }); + + return result; + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkProviderAdapter.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkProviderAdapter.ts deleted file mode 100644 index 64da59bea6b..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalExternalLinkProviderAdapter.ts +++ /dev/null @@ -1,71 +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 type { Terminal, IViewportRange, IBufferLine } from 'xterm'; -import { getXtermLineContent, convertLinkRangeToBuffer } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; -import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { TerminalBaseLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider'; -import { ITerminalExternalLinkProvider, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { XtermLinkMatcherHandler } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; - -/** - * An adapter to convert a simple external link provider into an internal link provider that - * manages link lifecycle, hovers, etc. and gets registered in xterm.js. - */ -export class TerminalExternalLinkProviderAdapter extends TerminalBaseLinkProvider { - - constructor( - private readonly _xterm: Terminal, - private readonly _instance: ITerminalInstance, - private readonly _externalLinkProvider: ITerminalExternalLinkProvider, - private readonly _wrapLinkHandler: (handler: (event: MouseEvent | undefined, link: string) => void) => XtermLinkMatcherHandler, - private readonly _tooltipCallback: (link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) => void, - @IInstantiationService private readonly _instantiationService: IInstantiationService - ) { - super(); - } - - protected async _provideLinks(y: number): Promise { - let startLine = y - 1; - let endLine = startLine; - - const lines: IBufferLine[] = [ - this._xterm.buffer.active.getLine(startLine)! - ]; - - while (startLine >= 0 && this._xterm.buffer.active.getLine(startLine)?.isWrapped) { - lines.unshift(this._xterm.buffer.active.getLine(startLine - 1)!); - startLine--; - } - - while (endLine < this._xterm.buffer.active.length && this._xterm.buffer.active.getLine(endLine + 1)?.isWrapped) { - lines.push(this._xterm.buffer.active.getLine(endLine + 1)!); - endLine++; - } - - const lineContent = getXtermLineContent(this._xterm.buffer.active, startLine, endLine, this._xterm.cols); - if (lineContent.trim().length === 0) { - return []; - } - - const externalLinks = await this._externalLinkProvider.provideLinks(this._instance, lineContent); - if (!externalLinks) { - return []; - } - - return externalLinks.map(link => { - const bufferRange = convertLinkRangeToBuffer(lines, this._xterm.cols, { - startColumn: link.startIndex + 1, - startLineNumber: 1, - endColumn: link.startIndex + link.length + 1, - endLineNumber: 1 - }, startLine); - const matchingText = lineContent.substr(link.startIndex, link.length) || ''; - const activateLink = this._wrapLinkHandler((_, text) => link.activate(text)); - return this._instantiationService.createInstance(TerminalLink, this._xterm, bufferRange, matchingText, this._xterm.buffer.active.viewportY, activateLink, this._tooltipCallback, true, link.label); - }); - } -} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts index e1421365a86..8e9bcde15ab 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts @@ -12,6 +12,8 @@ import { isMacintosh } from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { Emitter, Event } from 'vs/base/common/event'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TerminalLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { IHoverAction } from 'vs/workbench/services/hover/browser/hover'; export const OPEN_FILE_LABEL = localize('openFile', 'Open file in editor'); export const FOLDER_IN_WORKSPACE_LABEL = localize('focusFolder', 'Focus folder in explorer'); @@ -19,6 +21,7 @@ export const FOLDER_NOT_IN_WORKSPACE_LABEL = localize('openFolder', 'Open folder export class TerminalLink extends DisposableStore implements ILink { decorations: ILinkDecorations; + asyncActivate: Promise | undefined; private _tooltipScheduler: RunOnceScheduler | undefined; private _hoverListeners: DisposableStore | undefined; @@ -26,15 +29,19 @@ export class TerminalLink extends DisposableStore implements ILink { private readonly _onInvalidated = new Emitter(); get onInvalidated(): Event { return this._onInvalidated.event; } + get type(): TerminalLinkType { return this._type; } + constructor( private readonly _xterm: Terminal, readonly range: IBufferRange, readonly text: string, + readonly actions: IHoverAction[] | undefined, private readonly _viewportY: number, - private readonly _activateCallback: (event: MouseEvent | undefined, uri: string) => void, + private readonly _activateCallback: (event: MouseEvent | undefined, uri: string) => Promise, private readonly _tooltipCallback: (link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) => void, private readonly _isHighConfidenceLink: boolean, readonly label: string | undefined, + private readonly _type: TerminalLinkType, @IConfigurationService private readonly _configurationService: IConfigurationService ) { super(); @@ -53,7 +60,9 @@ export class TerminalLink extends DisposableStore implements ILink { } activate(event: MouseEvent | undefined, text: string): void { - this._activateCallback(event, text); + // Trigger the xterm.js callback synchronously but track the promise resolution so we can + // use it in tests + this.asyncActivate = this._activateCallback(event, text); } hover(event: MouseEvent, text: string): void { diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkDetectorAdapter.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkDetectorAdapter.ts new file mode 100644 index 00000000000..868bf9600e8 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkDetectorAdapter.ts @@ -0,0 +1,118 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { localize } from 'vs/nls'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ITerminalLinkDetector, ITerminalSimpleLink, TerminalBuiltinLinkType, TerminalLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; +import { XtermLinkMatcherHandler } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; +import { IBufferLine, ILink, ILinkProvider, IViewportRange } from 'xterm'; + +export interface IActivateLinkEvent { + link: ITerminalSimpleLink; + event?: MouseEvent; +} + +export interface IShowHoverEvent { + link: TerminalLink; + viewportRange: IViewportRange; + modifierDownCallback?: () => void; + modifierUpCallback?: () => void; +} + +/** + * Wrap a link detector object so it can be used in xterm.js + */ +export class TerminalLinkDetectorAdapter extends Disposable implements ILinkProvider { + private _activeLinks: TerminalLink[] | undefined; + + private readonly _onDidActivateLink = this._register(new Emitter()); + readonly onDidActivateLink = this._onDidActivateLink.event; + private readonly _onDidShowHover = this._register(new Emitter()); + readonly onDidShowHover = this._onDidShowHover.event; + + constructor( + private readonly _detector: ITerminalLinkDetector, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + ) { + super(); + } + + async provideLinks(bufferLineNumber: number, callback: (links: ILink[] | undefined) => void) { + this._activeLinks?.forEach(l => l.dispose()); + this._activeLinks = await this._provideLinks(bufferLineNumber); + callback(this._activeLinks); + } + + private async _provideLinks(bufferLineNumber: number): Promise { + // Dispose of all old links if new links are provided, links are only cached for the current line + const links: TerminalLink[] = []; + + let startLine = bufferLineNumber - 1; + let endLine = startLine; + + const lines: IBufferLine[] = [ + this._detector.xterm.buffer.active.getLine(startLine)! + ]; + + while (startLine >= 0 && this._detector.xterm.buffer.active.getLine(startLine)?.isWrapped) { + lines.unshift(this._detector.xterm.buffer.active.getLine(startLine - 1)!); + startLine--; + } + + while (endLine < this._detector.xterm.buffer.active.length && this._detector.xterm.buffer.active.getLine(endLine + 1)?.isWrapped) { + lines.push(this._detector.xterm.buffer.active.getLine(endLine + 1)!); + endLine++; + } + + const detectedLinks = await this._detector.detect(lines, startLine, endLine); + for (const link of detectedLinks) { + links.push(this._createTerminalLink(link, async (event) => { + this._onDidActivateLink.fire({ link, event }); + })); + } + + return links; + } + + private _createTerminalLink(l: ITerminalSimpleLink, activateCallback: XtermLinkMatcherHandler): TerminalLink { + // Remove trailing colon if there is one so the link is more useful + if (l.text.length > 0 && l.text.charAt(l.text.length - 1) === ':') { + l.text = l.text.slice(0, -1); + l.bufferRange.end.x--; + } + return this._instantiationService.createInstance(TerminalLink, + this._detector.xterm, + l.bufferRange, + l.text, + l.actions, + this._detector.xterm.buffer.active.viewportY, + activateCallback, + (link, viewportRange, modifierDownCallback, modifierUpCallback) => this._onDidShowHover.fire({ + link, + viewportRange, + modifierDownCallback, + modifierUpCallback + }), + l.type !== TerminalBuiltinLinkType.Search, // Only search is low confidence + l.label || this._getLabel(l.type), + l.type + ); + } + + private _getLabel(type: TerminalLinkType): string { + switch (type) { + case TerminalBuiltinLinkType.Search: return localize('searchWorkspace', 'Search workspace'); + case TerminalBuiltinLinkType.LocalFile: return localize('openFile', 'Open file in editor'); + case TerminalBuiltinLinkType.LocalFolderInWorkspace: return localize('focusFolder', 'Focus folder in explorer'); + case TerminalBuiltinLinkType.LocalFolderOutsideWorkspace: return localize('openFolder', 'Open folder in new window'); + case TerminalBuiltinLinkType.Url: + default: + return localize('followLink', 'Follow link'); + } + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts index 88db2388b4c..68cf645c03e 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts @@ -3,33 +3,36 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; -import { URI } from 'vs/base/common/uri'; -import { DisposableStore, IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ITerminalProcessManager, ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; -import { ITextEditorSelection } from 'vs/platform/editor/common/editor'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IFileService } from 'vs/platform/files/common/files'; -import type { Terminal, IViewportRange, ILinkProvider, ILink } from 'xterm'; +import { EventType } from 'vs/base/browser/dom'; +import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; +import { DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { posix, win32 } from 'vs/base/common/path'; -import { ITerminalExternalLinkProvider, ITerminalInstance, TerminalLinkQuickPickEvent } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { OperatingSystem, isMacintosh, OS } from 'vs/base/common/platform'; -import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; -import { TerminalProtocolLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider'; -import { TerminalValidatedLocalLinkProvider, lineAndColumnClause, unixLocalLinkClause, winLocalLinkClause, winDrivePrefix, winLineAndColumnMatchIndex, unixLineAndColumnMatchIndex, lineAndColumnClauseGroupCount } from 'vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider'; -import { TerminalWordLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider'; +import { isMacintosh, OperatingSystem, OS } from 'vs/base/common/platform'; +import { URI } from 'vs/base/common/uri'; +import * as nls from 'vs/nls'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; -import { TerminalHover, ILinkHoverTargetOptions } from 'vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget'; +import { ILogService } from 'vs/platform/log/common/log'; +import { ITunnelService } from 'vs/platform/tunnel/common/tunnel'; +import { ITerminalLinkDetector, ITerminalLinkOpener, ITerminalSimpleLink, OmitFirstArg, ResolvedLink, TerminalBuiltinLinkType, TerminalLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { TerminalExternalLinkDetector } from 'vs/workbench/contrib/terminal/browser/links/terminalExternalLinkDetector'; import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; -import { TerminalExternalLinkProviderAdapter } from 'vs/workbench/contrib/terminal/browser/links/terminalExternalLinkProviderAdapter'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; -import { XtermTerminal } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal'; -import { TerminalCapabilityStoreMultiplexer } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; +import { TerminalLinkDetectorAdapter } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkDetectorAdapter'; +import { TerminalLocalFileLinkOpener, TerminalLocalFolderInWorkspaceLinkOpener, TerminalLocalFolderOutsideWorkspaceLinkOpener, TerminalSearchLinkOpener, TerminalUrlLinkOpener } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkOpeners'; +import { lineAndColumnClause, TerminalLocalLinkDetector, unixLocalLinkClause, winDrivePrefix, winLocalLinkClause } from 'vs/workbench/contrib/terminal/browser/links/terminalLocalLinkDetector'; +import { TerminalShellIntegrationLinkDetector } from 'vs/workbench/contrib/terminal/browser/links/terminalShellIntegrationLinkDetector'; +import { TerminalUriLinkDetector } from 'vs/workbench/contrib/terminal/browser/links/terminalUriLinkDetector'; +import { TerminalWordLinkDetector } from 'vs/workbench/contrib/terminal/browser/links/terminalWordLinkDetector'; +import { ITerminalExternalLinkProvider, TerminalLinkQuickPickEvent } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ILinkHoverTargetOptions, TerminalHover } from 'vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget'; +import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; +import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; +import { ITerminalCapabilityStore, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { ITerminalConfiguration, ITerminalProcessManager, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IHoverAction } from 'vs/workbench/services/hover/browser/hover'; +import type { ILink, ILinkProvider, IViewportRange, Terminal } from 'xterm'; export type XtermLinkMatcherHandler = (event: MouseEvent | undefined, link: string) => Promise; export type XtermLinkMatcherValidationCallback = (uri: string, callback: (isValid: boolean) => void) => void; @@ -46,64 +49,127 @@ interface IPath { export class TerminalLinkManager extends DisposableStore { private _widgetManager: TerminalWidgetManager | undefined; private _processCwd: string | undefined; - private _standardLinkProviders: Map = new Map(); - private _linkProvidersDisposables: IDisposable[] = []; - private readonly _xterm: Terminal; + private readonly _standardLinkProviders: Map = new Map(); + private readonly _linkProvidersDisposables: IDisposable[] = []; + private readonly _externalLinkProviders: IDisposable[] = []; + private readonly _openers: Map = new Map(); + + // Link cache could be shared across all terminals, but that could lead to weird results when + // both local and remote terminals are present + private readonly _resolvedLinkCache = new LinkCache(); + constructor( - private _xtermTerminal: XtermTerminal, + private readonly _xterm: Terminal, private readonly _processManager: ITerminalProcessManager, - private readonly _capabilities: TerminalCapabilityStoreMultiplexer, - @IOpenerService private readonly _openerService: IOpenerService, - @IEditorService private readonly _editorService: IEditorService, + capabilities: ITerminalCapabilityStore, @IConfigurationService private readonly _configurationService: IConfigurationService, @IFileService private readonly _fileService: IFileService, @IInstantiationService private readonly _instantiationService: IInstantiationService, + @ILogService private readonly _logService: ILogService, @ITunnelService private readonly _tunnelService: ITunnelService ) { super(); - this._xterm = _xtermTerminal.raw; - // Protocol links - const wrappedActivateCallback = this._wrapLinkHandler((_, link) => this._handleProtocolLink(link)); - const protocolProvider = this._instantiationService.createInstance(TerminalProtocolLinkProvider, - this._xterm, - wrappedActivateCallback, - this._wrapLinkHandler.bind(this), - this._tooltipCallback.bind(this), - async (link, cb) => cb(await this._resolvePath(link))); - this._standardLinkProviders.set(TerminalProtocolLinkProvider.id, protocolProvider); - // Validated local links + // Setup link detectors in their order of priority + this._setupLinkDetector(TerminalUriLinkDetector.id, this._instantiationService.createInstance(TerminalUriLinkDetector, this._xterm, this._resolvePath.bind(this))); if (this._configurationService.getValue(TERMINAL_CONFIG_SECTION).enableFileLinks) { - const wrappedTextLinkActivateCallback = this._wrapLinkHandler((_, link) => this._handleLocalLink(link)); - const validatedProvider = this._instantiationService.createInstance(TerminalValidatedLocalLinkProvider, - this._xterm, - this._processManager.os || OS, - wrappedTextLinkActivateCallback, - this._wrapLinkHandler.bind(this), - this._tooltipCallback.bind(this), - async (linkCandidates, cb) => { - for (const link of linkCandidates) { - const result = await this._resolvePath(link); - if (result) { - return cb(result); - } - } - return cb(undefined); - }); - this._standardLinkProviders.set(TerminalValidatedLocalLinkProvider.id, validatedProvider); + this._setupLinkDetector(TerminalLocalLinkDetector.id, this._instantiationService.createInstance(TerminalLocalLinkDetector, this._xterm, this._processManager.os || OS, this._resolvePath.bind(this))); } + this._setupLinkDetector(TerminalShellIntegrationLinkDetector.id, this._instantiationService.createInstance(TerminalShellIntegrationLinkDetector, this._xterm)); + this._setupLinkDetector(TerminalWordLinkDetector.id, this._instantiationService.createInstance(TerminalWordLinkDetector, this._xterm)); - // Word links - const wordProvider = this._instantiationService.createInstance(TerminalWordLinkProvider, this._xtermTerminal, this._capabilities, this._wrapLinkHandler.bind(this), this._tooltipCallback.bind(this)); - this._standardLinkProviders.set(TerminalWordLinkProvider.id, wordProvider); + capabilities.get(TerminalCapability.CwdDetection)?.onDidChangeCwd(cwd => { + this.processCwd = cwd; + }); + + // Setup link openers + const localFileOpener = this._instantiationService.createInstance(TerminalLocalFileLinkOpener, this._processManager.os || OS); + const localFolderInWorkspaceOpener = this._instantiationService.createInstance(TerminalLocalFolderInWorkspaceLinkOpener); + this._openers.set(TerminalBuiltinLinkType.LocalFile, localFileOpener); + this._openers.set(TerminalBuiltinLinkType.LocalFolderInWorkspace, localFolderInWorkspaceOpener); + this._openers.set(TerminalBuiltinLinkType.LocalFolderOutsideWorkspace, this._instantiationService.createInstance(TerminalLocalFolderOutsideWorkspaceLinkOpener)); + this._openers.set(TerminalBuiltinLinkType.Search, this._instantiationService.createInstance(TerminalSearchLinkOpener, capabilities, localFileOpener, localFolderInWorkspaceOpener, this._processManager.os || OS)); + this._openers.set(TerminalBuiltinLinkType.Url, this._instantiationService.createInstance(TerminalUrlLinkOpener, !!this._processManager.remoteAuthority)); this._registerStandardLinkProviders(); } - async getLinks(y: number): Promise { - let unfilteredWordLinks = (await new Promise(r => this._standardLinkProviders.get(TerminalWordLinkProvider.id)?.provideLinks(y, r))); - const webLinks = (await new Promise(r => this._standardLinkProviders.get(TerminalProtocolLinkProvider.id)?.provideLinks(y, r))); - const fileLinks = (await new Promise(r => this._standardLinkProviders.get(TerminalValidatedLocalLinkProvider.id)?.provideLinks(y, r))); + private _setupLinkDetector(id: string, detector: ITerminalLinkDetector, isExternal: boolean = false): ILinkProvider { + const detectorAdapter = this._instantiationService.createInstance(TerminalLinkDetectorAdapter, detector); + detectorAdapter.onDidActivateLink(e => { + // Prevent default electron link handling so Alt+Click mode works normally + e.event?.preventDefault(); + // Require correct modifier on click unless event is coming from linkQuickPick selection + if (e.event && !(e.event instanceof TerminalLinkQuickPickEvent) && !this._isLinkActivationModifierDown(e.event)) { + return; + } + // Just call the handler if there is no before listener + if (e.link.activate) { + // Custom activate call (external links only) + e.link.activate(e.link.text); + } else { + this._openLink(e.link); + } + }); + detectorAdapter.onDidShowHover(e => this._tooltipCallback(e.link, e.viewportRange, e.modifierDownCallback, e.modifierUpCallback)); + if (!isExternal) { + this._standardLinkProviders.set(id, detectorAdapter); + } + return detectorAdapter; + } + + private async _openLink(link: ITerminalSimpleLink): Promise { + this._logService.debug('Opening link', link); + const opener = this._openers.get(link.type); + if (!opener) { + throw new Error(`No matching opener for link type "${link.type}"`); + } + await opener.open(link); + } + + async openRecentLink(type: 'localFile' | 'url'): Promise { + let links; + let i = this._xterm.buffer.active.length; + while ((!links || links.length === 0) && i >= this._xterm.buffer.active.viewportY) { + links = await this._getLinksForType(i, type); + i--; + } + + if (!links || links.length < 1) { + return undefined; + } + const event = new TerminalLinkQuickPickEvent(EventType.CLICK); + links[0].activate(event, links[0].text); + return links[0]; + } + + async getLinks(): Promise { + const wordResults: ILink[] = []; + const webResults: ILink[] = []; + const fileResults: ILink[] = []; + + for (let i = this._xterm.buffer.active.length - 1; i >= this._xterm.buffer.active.viewportY; i--) { + const links = await this._getLinksForLine(i); + if (links) { + const { wordLinks, webLinks, fileLinks } = links; + if (wordLinks && wordLinks.length) { + wordResults.push(...wordLinks.reverse()); + } + if (webLinks && webLinks.length) { + webResults.push(...webLinks.reverse()); + } + if (fileLinks && fileLinks.length) { + fileResults.push(...fileLinks.reverse()); + } + } + } + return { webLinks: webResults, fileLinks: fileResults, wordLinks: wordResults }; + } + + private async _getLinksForLine(y: number): Promise { + let unfilteredWordLinks = await this._getLinksForType(y, 'word'); + const webLinks = await this._getLinksForType(y, 'url'); + const fileLinks = await this._getLinksForType(y, 'localFile'); const words = new Set(); let wordLinks; if (unfilteredWordLinks) { @@ -117,6 +183,20 @@ export class TerminalLinkManager extends DisposableStore { } return { wordLinks, webLinks, fileLinks }; } + + protected async _getLinksForType(y: number, type: 'word' | 'url' | 'localFile'): Promise { + switch (type) { + case 'word': + return (await new Promise(r => this._standardLinkProviders.get(TerminalWordLinkDetector.id)?.provideLinks(y, r))); + case 'url': + return (await new Promise(r => this._standardLinkProviders.get(TerminalUriLinkDetector.id)?.provideLinks(y, r))); + case 'localFile': { + const links = (await new Promise(r => this._standardLinkProviders.get(TerminalLocalLinkDetector.id)?.provideLinks(y, r))); + return links?.filter(link => (link as TerminalLink).type === TerminalBuiltinLinkType.LocalFile); + } + } + } + private _tooltipCallback(link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) { if (!this._widgetManager) { return; @@ -139,17 +219,18 @@ export class TerminalLinkManager extends DisposableStore { terminalDimensions, modifierDownCallback, modifierUpCallback - }, this._getLinkHoverString(link.text, link.label), (text) => link.activate(undefined, text), link); + }, this._getLinkHoverString(link.text, link.label), link.actions, (text) => link.activate(undefined, text), link); } private _showHover( targetOptions: ILinkHoverTargetOptions, text: IMarkdownString, + actions: IHoverAction[] | undefined, linkHandler: (url: string) => void, link?: TerminalLink ) { if (this._widgetManager) { - const widget = this._instantiationService.createInstance(TerminalHover, targetOptions, text, linkHandler); + const widget = this._instantiationService.createInstance(TerminalHover, targetOptions, text, actions, linkHandler); const attached = this._widgetManager.attachWidget(widget); if (attached) { link?.onInvalidated(() => attached.dispose()); @@ -167,7 +248,7 @@ export class TerminalLinkManager extends DisposableStore { private _clearLinkProviders(): void { dispose(this._linkProvidersDisposables); - this._linkProvidersDisposables = []; + this._linkProvidersDisposables.length = 0; } private _registerStandardLinkProviders(): void { @@ -176,31 +257,17 @@ export class TerminalLinkManager extends DisposableStore { } } - registerExternalLinkProvider(instance: ITerminalInstance, linkProvider: ITerminalExternalLinkProvider): IDisposable { - // Clear and re-register the standard link providers so they are a lower priority that the new one + registerExternalLinkProvider(provideLinks: OmitFirstArg): IDisposable { + // Clear and re-register the standard link providers so they are a lower priority than the new one this._clearLinkProviders(); - const wrappedLinkProvider = this._instantiationService.createInstance(TerminalExternalLinkProviderAdapter, this._xterm, instance, linkProvider, this._wrapLinkHandler.bind(this), this._tooltipCallback.bind(this)); + const detectorId = `extension-${this._externalLinkProviders.length}`; + const wrappedLinkProvider = this._setupLinkDetector(detectorId, new TerminalExternalLinkDetector(detectorId, this._xterm, provideLinks), true); const newLinkProvider = this._xterm.registerLinkProvider(wrappedLinkProvider); - this._linkProvidersDisposables.push(newLinkProvider); + this._externalLinkProviders.push(newLinkProvider); this._registerStandardLinkProviders(); return newLinkProvider; } - protected _wrapLinkHandler(handler: (event: MouseEvent | undefined, link: string) => void): XtermLinkMatcherHandler { - return async (event: MouseEvent | undefined, link: string) => { - // Prevent default electron link handling so Alt+Click mode works normally - event?.preventDefault(); - - // Require correct modifier on click unless event is coming from linkQuickPick selection - if (event && !(event instanceof TerminalLinkQuickPickEvent) && !this._isLinkActivationModifierDown(event)) { - return; - } - - // Just call the handler if there is no before listener - handler(event, link); - }; - } - protected get _localLinkRegex(): RegExp { if (!this._processManager) { throw new Error('Process manager is required'); @@ -210,45 +277,6 @@ export class TerminalLinkManager extends DisposableStore { return new RegExp(`${baseLocalLinkClause}(${lineAndColumnClause})`); } - private async _handleLocalLink(link: string): Promise { - // TODO: This gets resolved again but doesn't need to as it's already validated - const resolvedLink = await this._resolvePath(link); - if (!resolvedLink) { - return; - } - const lineColumnInfo: LineColumnInfo = this.extractLineColumnInfo(link); - const selection: ITextEditorSelection = { - startLineNumber: lineColumnInfo.lineNumber, - startColumn: lineColumnInfo.columnNumber - }; - await this._editorService.openEditor({ - resource: resolvedLink.uri, - options: { pinned: true, selection, revealIfOpened: true } - }); - } - - private _handleHypertextLink(url: string): void { - this._openerService.open(url, { - allowTunneling: !!(this._processManager && this._processManager.remoteAuthority), - allowContributedOpeners: true, - }); - } - - private async _handleProtocolLink(link: string): Promise { - // Check if it's a file:/// link, hand off to local link handler so to open an editor and - // respect line/col attachment - const uri = URI.parse(link); - if (uri.scheme === Schemas.file) { - // Just using fsPath here is unsafe: https://github.com/microsoft/vscode/issues/109076 - const fsPath = uri.fsPath; - this._handleLocalLink(((this._osPath.sep === posix.sep) && this._processManager.os === OperatingSystem.Windows) ? fsPath.replace(/\\/g, posix.sep) : fsPath); - return; - } - - // Open as a web link if it's not a file - this._handleHypertextLink(link); - } - protected _isLinkActivationModifierDown(event: MouseEvent): boolean { const editorConf = this._configurationService.getValue<{ multiCursorModifier: 'ctrlCmd' | 'alt' }>('editor'); if (editorConf.multiCursorModifier === 'ctrlCmd') { @@ -351,19 +379,41 @@ export class TerminalLinkManager extends DisposableStore { return link; } - private async _resolvePath(link: string): Promise<{ uri: URI, link: string, isDirectory: boolean } | undefined> { + private async _resolvePath(link: string, uri?: URI): Promise { if (!this._processManager) { throw new Error('Process manager is required'); } + // Check resolved link cache first + const cached = this._resolvedLinkCache.get(uri || link); + if (cached !== undefined) { + return cached; + } + + if (uri) { + try { + const stat = await this._fileService.resolve(uri); + const result = { uri, link, isDirectory: stat.isDirectory }; + this._resolvedLinkCache.set(uri, result); + return result; + } + catch (e) { + // Does not exist + this._resolvedLinkCache.set(uri, null); + return null; + } + } + const preprocessedLink = this._preprocessPath(link); if (!preprocessedLink) { - return undefined; + this._resolvedLinkCache.set(link, null); + return null; } const linkUrl = this.extractLinkUrl(preprocessedLink); if (!linkUrl) { - return undefined; + this._resolvedLinkCache.set(link, null); + return null; } try { @@ -380,52 +430,22 @@ export class TerminalLinkManager extends DisposableStore { try { const stat = await this._fileService.resolve(uri); - return { uri, link, isDirectory: stat.isDirectory }; + const result = { uri, link, isDirectory: stat.isDirectory }; + this._resolvedLinkCache.set(link, result); + return result; } catch (e) { // Does not exist - return undefined; + this._resolvedLinkCache.set(link, null); + return null; } } catch { // Errors in parsing the path - return undefined; + this._resolvedLinkCache.set(link, null); + return null; } } - /** - * Returns line and column number of URl if that is present. - * - * @param link Url link which may contain line and column number. - */ - extractLineColumnInfo(link: string): LineColumnInfo { - const matches: string[] | null = this._localLinkRegex.exec(link); - const lineColumnInfo: LineColumnInfo = { - lineNumber: 1, - columnNumber: 1 - }; - - if (!matches || !this._processManager) { - return lineColumnInfo; - } - - const lineAndColumnMatchIndex = this._processManager.os === OperatingSystem.Windows ? winLineAndColumnMatchIndex : unixLineAndColumnMatchIndex; - for (let i = 0; i < lineAndColumnClause.length; i++) { - const lineMatchIndex = lineAndColumnMatchIndex + (lineAndColumnClauseGroupCount * i); - const rowNumber = matches[lineMatchIndex]; - if (rowNumber) { - lineColumnInfo['lineNumber'] = parseInt(rowNumber, 10); - // Check if column number exists - const columnNumber = matches[lineMatchIndex + 2]; - if (columnNumber) { - lineColumnInfo['columnNumber'] = parseInt(columnNumber, 10); - } - break; - } - } - - return lineColumnInfo; - } - /** * Returns url from link as link may contain line and column information. * @@ -440,7 +460,7 @@ export class TerminalLinkManager extends DisposableStore { } } -export interface LineColumnInfo { +export interface ILineColumnInfo { lineNumber: number; columnNumber: number; } @@ -450,3 +470,36 @@ export interface IDetectedLinks { webLinks?: ILink[]; fileLinks?: ILink[]; } + +const enum LinkCacheConstants { + /** + * How long to cache links for in milliseconds, the TTL resets whenever a new value is set in + * the cache. + */ + TTL = 10000 +} + +class LinkCache { + private readonly _cache = new Map(); + private _cacheTilTimeout = 0; + + set(link: string | URI, value: ResolvedLink) { + // Reset cached link TTL on any set + if (this._cacheTilTimeout) { + window.clearTimeout(this._cacheTilTimeout); + } + this._cacheTilTimeout = window.setTimeout(() => this._cache.clear(), LinkCacheConstants.TTL); + this._cache.set(this._getKey(link), value); + } + + get(link: string | URI): ResolvedLink | undefined { + return this._cache.get(this._getKey(link)); + } + + private _getKey(link: string | URI): string { + if (URI.isUri(link)) { + return link.toString(); + } + return link; + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkOpeners.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkOpeners.ts new file mode 100644 index 00000000000..2b49adcf9fd --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkOpeners.ts @@ -0,0 +1,248 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Schemas } from 'vs/base/common/network'; +import { IPath, posix, win32 } from 'vs/base/common/path'; +import { OperatingSystem } from 'vs/base/common/platform'; +import { URI } from 'vs/base/common/uri'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { ITextEditorSelection } from 'vs/platform/editor/common/editor'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { ITerminalLinkOpener, ITerminalSimpleLink } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { ILineColumnInfo } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; +import { getLocalLinkRegex, lineAndColumnClause, lineAndColumnClauseGroupCount, unixLineAndColumnMatchIndex, winLineAndColumnMatchIndex } from 'vs/workbench/contrib/terminal/browser/links/terminalLocalLinkDetector'; +import { ITerminalCapabilityStore, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; +import { QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; +import { ISearchService } from 'vs/workbench/services/search/common/search'; + +export class TerminalLocalFileLinkOpener implements ITerminalLinkOpener { + constructor( + private readonly _os: OperatingSystem, + @IEditorService private readonly _editorService: IEditorService, + ) { + } + + async open(link: ITerminalSimpleLink): Promise { + if (!link.uri) { + throw new Error('Tried to open file link without a resolved URI'); + } + const lineColumnInfo: ILineColumnInfo = this.extractLineColumnInfo(link.text); + const selection: ITextEditorSelection = { + startLineNumber: lineColumnInfo.lineNumber, + startColumn: lineColumnInfo.columnNumber + }; + await this._editorService.openEditor({ + resource: link.uri, + options: { pinned: true, selection, revealIfOpened: true } + }); + } + + /** + * Returns line and column number of URl if that is present, otherwise line 1 column 1. + * + * @param link Url link which may contain line and column number. + */ + extractLineColumnInfo(link: string): ILineColumnInfo { + const matches: string[] | null = getLocalLinkRegex(this._os).exec(link); + const lineColumnInfo: ILineColumnInfo = { + lineNumber: 1, + columnNumber: 1 + }; + + if (!matches) { + return lineColumnInfo; + } + + const lineAndColumnMatchIndex = this._os === OperatingSystem.Windows ? winLineAndColumnMatchIndex : unixLineAndColumnMatchIndex; + for (let i = 0; i < lineAndColumnClause.length; i++) { + const lineMatchIndex = lineAndColumnMatchIndex + (lineAndColumnClauseGroupCount * i); + const rowNumber = matches[lineMatchIndex]; + if (rowNumber) { + lineColumnInfo['lineNumber'] = parseInt(rowNumber, 10); + // Check if column number exists + const columnNumber = matches[lineMatchIndex + 2]; + if (columnNumber) { + lineColumnInfo['columnNumber'] = parseInt(columnNumber, 10); + } + break; + } + } + + return lineColumnInfo; + } +} + +export class TerminalLocalFolderInWorkspaceLinkOpener implements ITerminalLinkOpener { + constructor(@ICommandService private readonly _commandService: ICommandService) { + } + + async open(link: ITerminalSimpleLink): Promise { + if (!link.uri) { + throw new Error('Tried to open folder in workspace link without a resolved URI'); + } + await this._commandService.executeCommand('revealInExplorer', link.uri); + } +} + +export class TerminalLocalFolderOutsideWorkspaceLinkOpener implements ITerminalLinkOpener { + constructor(@IHostService private readonly _hostService: IHostService) { + } + + async open(link: ITerminalSimpleLink): Promise { + if (!link.uri) { + throw new Error('Tried to open folder in workspace link without a resolved URI'); + } + this._hostService.openWindow([{ folderUri: link.uri }], { forceNewWindow: true }); + } +} + +export class TerminalSearchLinkOpener implements ITerminalLinkOpener { + private readonly _fileQueryBuilder = this._instantiationService.createInstance(QueryBuilder); + + constructor( + private readonly _capabilities: ITerminalCapabilityStore, + private readonly _localFileOpener: TerminalLocalFileLinkOpener, + private readonly _localFolderInWorkspaceOpener: TerminalLocalFolderInWorkspaceLinkOpener, + private readonly _os: OperatingSystem, + @IFileService private readonly _fileService: IFileService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IQuickInputService private readonly _quickInputService: IQuickInputService, + @ISearchService private readonly _searchService: ISearchService, + @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, + @IWorkbenchEnvironmentService private readonly _workbenchEnvironmentService: IWorkbenchEnvironmentService, + ) { + } + + async open(link: ITerminalSimpleLink): Promise { + const pathSeparator = osPathModule(this._os).sep; + // Remove file:/// and any leading ./ or ../ since quick access doesn't understand that format + let text = link.text.replace(/^file:\/\/\/?/, ''); + text = osPathModule(this._os).normalize(text).replace(/^(\.+[\\/])+/, ''); + + // Remove `:in` from the end which is how Ruby outputs stack traces + text = text.replace(/:in$/, ''); + // If any of the names of the folders in the workspace matches + // a prefix of the link, remove that prefix and continue + this._workspaceContextService.getWorkspace().folders.forEach((folder) => { + if (text.substring(0, folder.name.length + 1) === folder.name + pathSeparator) { + text = text.substring(folder.name.length + 1); + return; + } + }); + let matchLink = text; + if (this._capabilities.has(TerminalCapability.CommandDetection)) { + matchLink = this._updateLinkWithRelativeCwd(link.bufferRange.start.y, text, pathSeparator) || text; + } + const sanitizedLink = matchLink.replace(/:\d+(:\d+)?$/, ''); + try { + const result = await this._getExactMatch(sanitizedLink); + if (result) { + const { uri, isDirectory } = result; + const linkToOpen = { + text: matchLink, + uri, + bufferRange: link.bufferRange, + type: link.type + }; + if (uri) { + return isDirectory ? this._localFolderInWorkspaceOpener.open(linkToOpen) : this._localFileOpener.open(linkToOpen); + } + } + } catch { + // Fallback to searching quick access + return this._quickInputService.quickAccess.show(text); + } + // Fallback to searching quick access + return this._quickInputService.quickAccess.show(text); + } + + /* + * For shells with the CwdDetection capability, the cwd relative to the line + * of the particular link is used to narrow down the result for an exact file match, if possible. + */ + private _updateLinkWithRelativeCwd(y: number, text: string, pathSeparator: string): string | undefined { + const cwd = this._capabilities.get(TerminalCapability.CommandDetection)?.getCwdForLine(y); + if (!cwd) { + return undefined; + } + if (!text.includes(pathSeparator)) { + text = cwd + pathSeparator + text; + } else { + let commonDirs = 0; + let i = 0; + const cwdPath = cwd.split(pathSeparator).reverse(); + const linkPath = text.split(pathSeparator); + while (i < cwdPath.length) { + if (cwdPath[i] === linkPath[i]) { + commonDirs++; + } + i++; + } + text = cwd + pathSeparator + linkPath.slice(commonDirs).join(pathSeparator); + } + return text; + } + + private async _getExactMatch(sanitizedLink: string): Promise { + let resourceMatch: IResourceMatch | undefined; + if (osPathModule(this._os).isAbsolute(sanitizedLink)) { + const scheme = this._workbenchEnvironmentService.remoteAuthority ? Schemas.vscodeRemote : Schemas.file; + const uri = URI.from({ scheme, path: sanitizedLink }); + try { + const fileStat = await this._fileService.resolve(uri); + resourceMatch = { uri, isDirectory: fileStat.isDirectory }; + } catch { + // File or dir doesn't exist, continue on + } + } + if (!resourceMatch) { + const results = await this._searchService.fileSearch( + this._fileQueryBuilder.file(this._workspaceContextService.getWorkspace().folders, { + // Remove optional :row:col from the link as openEditor supports it + filePattern: sanitizedLink, + maxResults: 2 + }) + ); + if (results.results.length === 1) { + resourceMatch = { uri: results.results[0].resource }; + } + } + return resourceMatch; + } +} + +interface IResourceMatch { + uri: URI | undefined; + isDirectory?: boolean; +} + +export class TerminalUrlLinkOpener implements ITerminalLinkOpener { + constructor( + private readonly _isRemote: boolean, + @IOpenerService private readonly _openerService: IOpenerService, + ) { + } + + async open(link: ITerminalSimpleLink): Promise { + if (!link.uri) { + throw new Error('Tried to open a url without a resolved URI'); + } + this._openerService.open(link.uri || URI.parse(link.text), { + allowTunneling: this._isRemote, + allowContributedOpeners: true, + }); + } +} + +function osPathModule(os: OperatingSystem): IPath { + return os === OperatingSystem.Windows ? win32 : posix; +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick.ts index 3d0f1be7754..1a2b18727b5 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick.ts @@ -20,20 +20,20 @@ export class TerminalLinkQuickpick { const filePicks = links.fileLinks ? await this._generatePicks(links.fileLinks) : undefined; const webPicks = links.webLinks ? await this._generatePicks(links.webLinks) : undefined; const options = { - placeHolder: localize('terminal.integrated.openWebLink', "Select the link to open"), + placeHolder: localize('terminal.integrated.openDetectedLink', "Select the link to open"), canPickMany: false }; const picks: LinkQuickPickItem[] = []; if (webPicks) { - picks.push({ type: 'separator', label: localize('terminal.integrated.webLinks', "Web") }); + picks.push({ type: 'separator', label: localize('terminal.integrated.urlLinks', "Url") }); picks.push(...webPicks); } if (filePicks) { - picks.push({ type: 'separator', label: localize('terminal.integrated.fileLinks', "File") }); + picks.push({ type: 'separator', label: localize('terminal.integrated.localFileLinks', "Local File") }); picks.push(...filePicks); } if (wordPicks) { - picks.push({ type: 'separator', label: localize('terminal.integrated.wordLinks', "Word") }); + picks.push({ type: 'separator', label: localize('terminal.integrated.searchLinks', "Workspace Search") }); picks.push(...wordPicks); } @@ -64,7 +64,7 @@ export class TerminalLinkQuickpick { } export interface ITerminalLinkQuickPickItem extends IQuickPickItem { - link: ILink + link: ILink; } type LinkQuickPickItem = ITerminalLinkQuickPickItem | IQuickPickSeparator; diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLocalLinkDetector.ts similarity index 50% rename from src/vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider.ts rename to src/vs/workbench/contrib/terminal/browser/links/terminalLocalLinkDetector.ts index 80c855c5b91..0630dd69c5e 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLocalLinkDetector.ts @@ -3,19 +3,32 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import type { Terminal, IViewportRange, IBufferLine } from 'xterm'; -import { getXtermLineContent, convertLinkRangeToBuffer } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; import { OperatingSystem } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; -import { TerminalLink, OPEN_FILE_LABEL, FOLDER_IN_WORKSPACE_LABEL, FOLDER_NOT_IN_WORKSPACE_LABEL } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { XtermLinkMatcherHandler } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; -import { TerminalBaseLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider'; -import { withUndefinedAsNull } from 'vs/base/common/types'; +import { ITerminalLinkDetector, ITerminalSimpleLink, ResolvedLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { convertLinkRangeToBuffer, getXtermLineContent } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; +import { IBufferLine, Terminal } from 'xterm'; + +const enum Constants { + /** + * The max line length to try extract word links from. + */ + MaxLineLength = 2000, + + /** + * The maximum number of links in a line to resolve against the file system. This limit is put + * in place to avoid sending excessive data when remote connections are in place. + */ + MaxResolvedLinksInLine = 10, + + /** + * The maximum length of a link to resolve against the file system. This limit is put in place + * to avoid sending excessive data when remote connections are in place. + */ + MaxResolvedLinkLength = 1024, +} const pathPrefix = '(\\.\\.?|\\~)'; const pathSeparatorClause = '\\/'; @@ -50,62 +63,32 @@ export const unixLineAndColumnMatchIndex = 11; // Each line and column clause have 6 groups (ie no. of expressions in round brackets) export const lineAndColumnClauseGroupCount = 6; -const MAX_LENGTH = 2000; -const cachedValidatedLinks = new Map(); +export class TerminalLocalLinkDetector implements ITerminalLinkDetector { + static id = 'local'; -export class TerminalValidatedLocalLinkProvider extends TerminalBaseLinkProvider { - private _cacheTilTimeout = 0; - protected _enableCaching = true; - static id: string = 'TerminalValidatedLocalLinkProvider'; constructor( - private readonly _xterm: Terminal, - private readonly _processOperatingSystem: OperatingSystem, - private readonly _activateFileCallback: (event: MouseEvent | undefined, link: string) => void, - private readonly _wrapLinkHandler: (handler: (event: MouseEvent | undefined, link: string) => void) => XtermLinkMatcherHandler, - private readonly _tooltipCallback: (link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) => void, - private readonly _validationCallback: (link: string[], callback: (result: { uri: URI, link: string, isDirectory: boolean } | undefined) => void) => void, - @IInstantiationService private readonly _instantiationService: IInstantiationService, - @ICommandService private readonly _commandService: ICommandService, - @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, - @IHostService private readonly _hostService: IHostService, - @IUriIdentityService private readonly _uriIdentityService: IUriIdentityService + readonly xterm: Terminal, + private readonly _os: OperatingSystem, + private readonly _resolvePath: (link: string) => Promise, + @IUriIdentityService private readonly _uriIdentityService: IUriIdentityService, + @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService ) { - super(); } - protected async _provideLinks(y: number): Promise { - const result: TerminalLink[] = []; - let startLine = y - 1; - let endLine = startLine; - if (this._enableCaching) { - if (this._cacheTilTimeout) { - window.clearTimeout(this._cacheTilTimeout); - } - this._cacheTilTimeout = window.setTimeout(() => cachedValidatedLinks.clear(), 10000); - } - const lines: IBufferLine[] = [ - this._xterm.buffer.active.getLine(startLine)! - ]; + async detect(lines: IBufferLine[], startLine: number, endLine: number): Promise { + const links: ITerminalSimpleLink[] = []; - while (startLine >= 0 && this._xterm.buffer.active.getLine(startLine)?.isWrapped) { - lines.unshift(this._xterm.buffer.active.getLine(startLine - 1)!); - startLine--; - } - - while (endLine < this._xterm.buffer.active.length && this._xterm.buffer.active.getLine(endLine + 1)?.isWrapped) { - lines.push(this._xterm.buffer.active.getLine(endLine + 1)!); - endLine++; - } - - const text = getXtermLineContent(this._xterm.buffer.active, startLine, endLine, this._xterm.cols); - if (text.length > MAX_LENGTH) { + // Get the text representation of the wrapped line + const text = getXtermLineContent(this.xterm.buffer.active, startLine, endLine, this.xterm.cols); + if (text === '' || text.length > Constants.MaxLineLength) { return []; } // clone regex to do a global search on text - const rex = new RegExp(this._localLinkRegex, 'g'); + const rex = new RegExp(getLocalLinkRegex(this._os), 'g'); let match; let stringIndex = -1; + let resolvedLinkCount = 0; while ((match = rex.exec(text)) !== null) { // const link = match[typeof matcher.matchIndex !== 'number' ? 0 : matcher.matchIndex]; let link = match[0]; @@ -140,69 +123,52 @@ export class TerminalValidatedLocalLinkProvider extends TerminalBaseLinkProvider } // Convert the link text's string index into a wrapped buffer range - const bufferRange = convertLinkRangeToBuffer(lines, this._xterm.cols, { + const bufferRange = convertLinkRangeToBuffer(lines, this.xterm.cols, { startColumn: stringIndex + 1, startLineNumber: 1, endColumn: stringIndex + link.length + 1, endLineNumber: 1 }, startLine); - let linkStat = cachedValidatedLinks.get(link); - // The link is cached as doesn't exist - if (linkStat === null) { + // Don't try resolve any links of excessive length + if (link.length > Constants.MaxResolvedLinkLength) { continue; } - // The link isn't cached - if (linkStat === undefined) { - linkStat = await new Promise<{ uri: URI, link: string, isDirectory: boolean } | undefined>(r => { - const linkCandidates = [link]; - if (link.match(/^(\.\.[\/\\])+/)) { - linkCandidates.push(link.replace(/^(\.\.[\/\\])+/, '')); - } - this._validationCallback(linkCandidates, (result) => r(result)); - }); - if (this._enableCaching) { - cachedValidatedLinks.set(link, withUndefinedAsNull(linkStat)); - } + const linkCandidates = [link]; + if (link.match(/^(\.\.[\/\\])+/)) { + linkCandidates.push(link.replace(/^(\.\.[\/\\])+/, '')); } + const linkStat = await this._validateLinkCandidates(linkCandidates); // Create the link if validated if (linkStat) { - const label = linkStat.isDirectory - ? (this._isDirectoryInsideWorkspace(linkStat.uri) ? FOLDER_IN_WORKSPACE_LABEL : FOLDER_NOT_IN_WORKSPACE_LABEL) - : OPEN_FILE_LABEL; - const activateCallback = this._wrapLinkHandler((event: MouseEvent | undefined, text: string) => { - if (linkStat!.isDirectory) { - this._handleLocalFolderLink(linkStat!.uri); + let type: TerminalBuiltinLinkType; + if (linkStat.isDirectory) { + if (this._isDirectoryInsideWorkspace(linkStat.uri)) { + type = TerminalBuiltinLinkType.LocalFolderInWorkspace; } else { - this._activateFileCallback(event, text); + type = TerminalBuiltinLinkType.LocalFolderOutsideWorkspace; } + } else { + type = TerminalBuiltinLinkType.LocalFile; + } + links.push({ + text: linkStat.link, + uri: linkStat.uri, + bufferRange, + type }); - const validatedLink = this._instantiationService.createInstance(TerminalLink, this._xterm, bufferRange, linkStat.link, this._xterm.buffer.active.viewportY, activateCallback, this._tooltipCallback, true, label); - result.push(validatedLink); + + // Stop early if too many links exist in the line + if (++resolvedLinkCount >= Constants.MaxResolvedLinksInLine) { + break; + } } } - return result; - } - - protected get _localLinkRegex(): RegExp { - const baseLocalLinkClause = this._processOperatingSystem === OperatingSystem.Windows ? winLocalLinkClause : unixLocalLinkClause; - // Append line and column number regex - return new RegExp(`${baseLocalLinkClause}(${lineAndColumnClause})`); - } - - private async _handleLocalFolderLink(uri: URI): Promise { - // If the folder is within one of the window's workspaces, focus it in the explorer - if (this._isDirectoryInsideWorkspace(uri)) { - await this._commandService.executeCommand('revealInExplorer', uri); - return; - } - - // Open a new window for the folder - this._hostService.openWindow([{ folderUri: uri }], { forceNewWindow: true }); + return links; } private _isDirectoryInsideWorkspace(uri: URI) { @@ -214,4 +180,20 @@ export class TerminalValidatedLocalLinkProvider extends TerminalBaseLinkProvider } return false; } + + private async _validateLinkCandidates(linkCandidates: string[]): Promise { + for (const link of linkCandidates) { + const result = await this._resolvePath(link); + if (result) { + return result; + } + } + return undefined; + } +} + +export function getLocalLinkRegex(os: OperatingSystem): RegExp { + const baseLocalLinkClause = os === OperatingSystem.Windows ? winLocalLinkClause : unixLocalLinkClause; + // Append line and column number regex + return new RegExp(`${baseLocalLinkClause}(${lineAndColumnClause})`); } diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider.ts deleted file mode 100644 index 4ad7b54eb29..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider.ts +++ /dev/null @@ -1,162 +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 type { Terminal, IViewportRange, IBufferLine } from 'xterm'; -import { ILinkComputerTarget, LinkComputer } from 'vs/editor/common/languages/linkComputer'; -import { getXtermLineContent, convertLinkRangeToBuffer } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; -import { TerminalLink, OPEN_FILE_LABEL, FOLDER_IN_WORKSPACE_LABEL, FOLDER_NOT_IN_WORKSPACE_LABEL } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { URI } from 'vs/base/common/uri'; -import { TerminalBaseLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider'; -import { XtermLinkMatcherHandler } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { Schemas } from 'vs/base/common/network'; - -export class TerminalProtocolLinkProvider extends TerminalBaseLinkProvider { - private _linkComputerTarget: ILinkComputerTarget | undefined; - static id: string = 'TerminalProtocolLinkProvider'; - constructor( - private readonly _xterm: Terminal, - private readonly _activateCallback: (event: MouseEvent | undefined, uri: string) => void, - private readonly _wrapLinkHandler: (handler: (event: MouseEvent | undefined, link: string) => void) => XtermLinkMatcherHandler, - private readonly _tooltipCallback: (link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) => void, - private readonly _validationCallback: (link: string, callback: (result: { uri: URI, isDirectory: boolean } | undefined) => void) => void, - @IInstantiationService private readonly _instantiationService: IInstantiationService, - @ICommandService private readonly _commandService: ICommandService, - @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, - @IHostService private readonly _hostService: IHostService, - @IUriIdentityService private readonly _uriIdentityService: IUriIdentityService - ) { - super(); - } - - protected async _provideLinks(y: number): Promise { - let startLine = y - 1; - let endLine = startLine; - - const lines: IBufferLine[] = [ - this._xterm.buffer.active.getLine(startLine)! - ]; - - while (startLine >= 0 && this._xterm.buffer.active.getLine(startLine)?.isWrapped) { - lines.unshift(this._xterm.buffer.active.getLine(startLine - 1)!); - startLine--; - } - - while (endLine < this._xterm.buffer.active.length && this._xterm.buffer.active.getLine(endLine + 1)?.isWrapped) { - lines.push(this._xterm.buffer.active.getLine(endLine + 1)!); - endLine++; - } - - this._linkComputerTarget = new TerminalLinkAdapter(this._xterm, startLine, endLine); - const links = LinkComputer.computeLinks(this._linkComputerTarget); - - const result: TerminalLink[] = []; - for (const link of links) { - const bufferRange = convertLinkRangeToBuffer(lines, this._xterm.cols, link.range, startLine); - - // Check if the link is within the mouse position - const uri = link.url - ? (typeof link.url === 'string' ? URI.parse(link.url) : link.url) - : undefined; - - if (!uri) { - continue; - } - - const linkText = link.url?.toString() || ''; - - // Handle http links - if (uri.scheme !== Schemas.file) { - result.push(this._instantiationService.createInstance(TerminalLink, - this._xterm, - bufferRange, - linkText, - this._xterm.buffer.active.viewportY, - this._activateCallback, - this._tooltipCallback, - true, - undefined - )); - continue; - } - - // Handle files and folders - const validatedLink = await new Promise(r => { - this._validationCallback(linkText, (result) => { - if (result) { - const label = result.isDirectory - ? (this._isDirectoryInsideWorkspace(result.uri) ? FOLDER_IN_WORKSPACE_LABEL : FOLDER_NOT_IN_WORKSPACE_LABEL) - : OPEN_FILE_LABEL; - const activateCallback = this._wrapLinkHandler((event: MouseEvent | undefined, text: string) => { - if (result.isDirectory) { - this._handleLocalFolderLink(result.uri); - } else { - this._activateCallback(event, linkText); - } - }); - r(this._instantiationService.createInstance( - TerminalLink, - this._xterm, - bufferRange, - linkText, - this._xterm.buffer.active.viewportY, - activateCallback, - this._tooltipCallback, - true, - label - )); - } else { - r(undefined); - } - }); - }); - if (validatedLink) { - result.push(validatedLink); - } - } - return result; - } - - private async _handleLocalFolderLink(uri: URI): Promise { - // If the folder is within one of the window's workspaces, focus it in the explorer - if (this._isDirectoryInsideWorkspace(uri)) { - await this._commandService.executeCommand('revealInExplorer', uri); - return; - } - - // Open a new window for the folder - this._hostService.openWindow([{ folderUri: uri }], { forceNewWindow: true }); - } - - private _isDirectoryInsideWorkspace(uri: URI) { - const folders = this._workspaceContextService.getWorkspace().folders; - for (let i = 0; i < folders.length; i++) { - if (this._uriIdentityService.extUri.isEqualOrParent(uri, folders[i].uri)) { - return true; - } - } - return false; - } -} - -class TerminalLinkAdapter implements ILinkComputerTarget { - constructor( - private _xterm: Terminal, - private _lineStart: number, - private _lineEnd: number - ) { } - - getLineCount(): number { - return 1; - } - - getLineContent(): string { - return getXtermLineContent(this._xterm.buffer.active, this._lineStart, this._lineEnd, this._xterm.cols); - } -} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalShellIntegrationLinkDetector.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalShellIntegrationLinkDetector.ts new file mode 100644 index 00000000000..f5b43f0f2ac --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalShellIntegrationLinkDetector.ts @@ -0,0 +1,67 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Schemas } from 'vs/base/common/network'; +import { URI } from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TerminalSettingId } from 'vs/platform/terminal/common/terminal'; +import { ITerminalSimpleLink, ITerminalLinkDetector, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { terminalStrings } from 'vs/workbench/contrib/terminal/common/terminalStrings'; +import { IBufferCell, IBufferLine, Terminal } from 'xterm'; + +// This is intentionally not localized currently as it must match the text in the shell script +const linkText = 'Shell integration activated!'; +const linkCodes = new Uint8Array(linkText.split('').map(e => e.charCodeAt(0))); + +export class TerminalShellIntegrationLinkDetector implements ITerminalLinkDetector { + static id = 'shellintegration'; + + constructor( + readonly xterm: Terminal, + @IConfigurationService private readonly _configurationService: IConfigurationService + ) { + } + + detect(lines: IBufferLine[], startLine: number, endLine: number): ITerminalSimpleLink[] { + if (this._matches(lines)) { + return [{ + text: linkText, + type: TerminalBuiltinLinkType.Url, + label: localize('learn', 'Learn about shell integration'), + uri: URI.from({ + scheme: Schemas.https, + path: 'aka.ms/vscode-shell-integration' + }), + bufferRange: { + start: { x: 1, y: startLine + 1 }, + end: { x: linkText.length % this.xterm.cols, y: startLine + Math.floor(linkText.length / this.xterm.cols) + 1 } + }, + actions: [{ + label: terminalStrings.doNotShowAgain, + commandId: '', + run: () => this._hideMessage() + }] + }]; + } + + return []; + } + + private _matches(lines: IBufferLine[]): boolean { + let cell: IBufferCell | undefined; + for (let i = 0; i < linkCodes.length; i++) { + cell = lines[Math.floor(i / this.xterm.cols)].getCell(i % this.xterm.cols, cell); + if (cell?.getCode() !== linkCodes[i]) { + return false; + } + } + return true; + } + + private async _hideMessage() { + await this._configurationService.updateValue(TerminalSettingId.ShowShellIntegrationWelcome, false); + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalUriLinkDetector.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalUriLinkDetector.ts new file mode 100644 index 00000000000..948b257d8ab --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalUriLinkDetector.ts @@ -0,0 +1,138 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Schemas } from 'vs/base/common/network'; +import { URI } from 'vs/base/common/uri'; +import { ILinkComputerTarget, LinkComputer } from 'vs/editor/common/languages/linkComputer'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { ITerminalLinkDetector, ITerminalSimpleLink, ResolvedLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { convertLinkRangeToBuffer, getXtermLineContent } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; +import { IBufferLine, Terminal } from 'xterm'; + +const enum Constants { + /** + * The maximum number of links in a line to resolve against the file system. This limit is put + * in place to avoid sending excessive data when remote connections are in place. + */ + MaxResolvedLinksInLine = 10, + + /** + * The maximum length of a link to resolve against the file system. This limit is put in place + * to avoid sending excessive data when remote connections are in place. + */ + MaxResolvedLinkLength = 1024, +} + +export class TerminalUriLinkDetector implements ITerminalLinkDetector { + static id = 'uri'; + + constructor( + readonly xterm: Terminal, + private readonly _resolvePath: (link: string, uri?: URI) => Promise, + @IUriIdentityService private readonly _uriIdentityService: IUriIdentityService, + @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService + ) { + } + + async detect(lines: IBufferLine[], startLine: number, endLine: number): Promise { + const links: ITerminalSimpleLink[] = []; + + const linkComputerTarget = new TerminalLinkAdapter(this.xterm, startLine, endLine); + const computedLinks = LinkComputer.computeLinks(linkComputerTarget); + + let resolvedLinkCount = 0; + for (const computedLink of computedLinks) { + const bufferRange = convertLinkRangeToBuffer(lines, this.xterm.cols, computedLink.range, startLine); + + // Check if the link is within the mouse position + const uri = computedLink.url + ? (typeof computedLink.url === 'string' ? URI.parse(computedLink.url) : computedLink.url) + : undefined; + + if (!uri) { + continue; + } + + const text = computedLink.url?.toString() || ''; + + // Handle non-file scheme links + if (uri.scheme !== Schemas.file) { + links.push({ + text, + uri, + bufferRange, + type: TerminalBuiltinLinkType.Url + }); + continue; + } + + // Don't try resolve any links of excessive length + if (text.length > Constants.MaxResolvedLinkLength) { + continue; + } + + // Filter out URI with unrecognized authorities + if (uri.authority.length !== 2 && uri.authority.endsWith(':')) { + continue; + } + + const linkStat = await this._resolvePath(text, uri); + + // Create the link if validated + if (linkStat) { + let type: TerminalBuiltinLinkType; + if (linkStat.isDirectory) { + if (this._isDirectoryInsideWorkspace(linkStat.uri)) { + type = TerminalBuiltinLinkType.LocalFolderInWorkspace; + } else { + type = TerminalBuiltinLinkType.LocalFolderOutsideWorkspace; + } + } else { + type = TerminalBuiltinLinkType.LocalFile; + } + links.push({ + text: linkStat.link, + uri: linkStat.uri, + bufferRange, + type + }); + + // Stop early if too many links exist in the line + if (++resolvedLinkCount >= Constants.MaxResolvedLinksInLine) { + break; + } + } + } + + return links; + } + + private _isDirectoryInsideWorkspace(uri: URI) { + const folders = this._workspaceContextService.getWorkspace().folders; + for (let i = 0; i < folders.length; i++) { + if (this._uriIdentityService.extUri.isEqualOrParent(uri, folders[i].uri)) { + return true; + } + } + return false; + } +} + +class TerminalLinkAdapter implements ILinkComputerTarget { + constructor( + private _xterm: Terminal, + private _lineStart: number, + private _lineEnd: number + ) { } + + getLineCount(): number { + return 1; + } + + getLineContent(): string { + return getXtermLineContent(this._xterm.buffer.active, this._lineStart, this._lineEnd, this._xterm.cols); + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkDetector.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkDetector.ts new file mode 100644 index 00000000000..6bfa63c5038 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkDetector.ts @@ -0,0 +1,96 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ITerminalSimpleLink, ITerminalLinkDetector, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { convertLinkRangeToBuffer, getXtermLineContent } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; +import { ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IBufferLine, Terminal } from 'xterm'; + +const enum Constants { + /** + * The max line length to try extract word links from. + */ + MaxLineLength = 2000 +} + +interface Word { + startIndex: number; + endIndex: number; + text: string; +} + +export class TerminalWordLinkDetector implements ITerminalLinkDetector { + static id = 'word'; + + constructor( + readonly xterm: Terminal, + @IConfigurationService private readonly _configurationService: IConfigurationService, + ) { + } + + detect(lines: IBufferLine[], startLine: number, endLine: number): ITerminalSimpleLink[] { + const links: ITerminalSimpleLink[] = []; + const wordSeparators = this._configurationService.getValue(TERMINAL_CONFIG_SECTION).wordSeparators; + + // Get the text representation of the wrapped line + const text = getXtermLineContent(this.xterm.buffer.active, startLine, endLine, this.xterm.cols); + if (text === '' || text.length > Constants.MaxLineLength) { + return []; + } + + // Parse out all words from the wrapped line + const words: Word[] = this._parseWords(text, wordSeparators); + + // Map the words to ITerminalLink objects + for (const word of words) { + if (word.text === '') { + continue; + } + if (word.text.length > 0 && word.text.charAt(word.text.length - 1) === ':') { + word.text = word.text.slice(0, -1); + word.endIndex--; + } + const bufferRange = convertLinkRangeToBuffer( + lines, + this.xterm.cols, + { + startColumn: word.startIndex + 1, + startLineNumber: 1, + endColumn: word.endIndex + 1, + endLineNumber: 1 + }, + startLine + ); + links.push({ + text: word.text, + bufferRange, + type: TerminalBuiltinLinkType.Search + }); + } + + return links; + } + + private _parseWords(text: string, separators: string): Word[] { + const words: Word[] = []; + + const wordSeparators: string[] = separators.split(''); + const characters = text.split(''); + + let startIndex = 0; + for (let i = 0; i < text.length; i++) { + if (wordSeparators.includes(characters[i])) { + words.push({ startIndex, endIndex: i, text: text.substring(startIndex, i) }); + startIndex = i + 1; + } + } + if (startIndex < text.length) { + words.push({ startIndex, endIndex: text.length, text: text.substring(startIndex) }); + } + + return words; + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider.ts deleted file mode 100644 index 0e267188590..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider.ts +++ /dev/null @@ -1,245 +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 type { IViewportRange, IBufferLine, IBufferRange } from 'xterm'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; -import { TerminalLink } from 'vs/workbench/contrib/terminal/browser/links/terminalLink'; -import { localize } from 'vs/nls'; -import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ISearchService } from 'vs/workbench/services/search/common/search'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { XtermLinkMatcherHandler } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; -import { TerminalBaseLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider'; -import { normalize, isAbsolute } from 'vs/base/common/path'; -import { convertLinkRangeToBuffer, getXtermLineContent } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; -import { isWindows } from 'vs/base/common/platform'; -import { IFileService } from 'vs/platform/files/common/files'; -import { URI } from 'vs/base/common/uri'; -import { Schemas } from 'vs/base/common/network'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { XtermTerminal } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal'; -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; -import { ITerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; - -const MAX_LENGTH = 2000; - -export class TerminalWordLinkProvider extends TerminalBaseLinkProvider { - private readonly _fileQueryBuilder = this._instantiationService.createInstance(QueryBuilder); - static id: string = 'TerminalWordLinkProvider'; - - constructor( - private _xterm: XtermTerminal, - private _capabilities: ITerminalCapabilityStore, - private readonly _wrapLinkHandler: (handler: (event: MouseEvent | undefined, link: string) => void) => XtermLinkMatcherHandler, - private readonly _tooltipCallback: (link: TerminalLink, viewportRange: IViewportRange, modifierDownCallback?: () => void, modifierUpCallback?: () => void) => void, - @IInstantiationService private readonly _instantiationService: IInstantiationService, - @IConfigurationService private readonly _configurationService: IConfigurationService, - @IQuickInputService private readonly _quickInputService: IQuickInputService, - @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, - @ISearchService private readonly _searchService: ISearchService, - @IEditorService private readonly _editorService: IEditorService, - @IFileService private readonly _fileService: IFileService, - @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService, - ) { - super(); - } - - protected _provideLinks(y: number): TerminalLink[] { - // Dispose of all old links if new links are provides, links are only cached for the current line - const links: TerminalLink[] = []; - const wordSeparators = this._configurationService.getValue(TERMINAL_CONFIG_SECTION).wordSeparators; - const activateCallback = this._wrapLinkHandler((_, link) => this._activate(link, y)); - - let startLine = y - 1; - let endLine = startLine; - - const lines: IBufferLine[] = [ - this._xterm.raw.buffer.active.getLine(startLine)! - ]; - - while (startLine >= 0 && this._xterm.raw.buffer.active.getLine(startLine)?.isWrapped) { - lines.unshift(this._xterm.raw.buffer.active.getLine(startLine - 1)!); - startLine--; - } - - while (endLine < this._xterm.raw.buffer.active.length && this._xterm.raw.buffer.active.getLine(endLine + 1)?.isWrapped) { - lines.push(this._xterm.raw.buffer.active.getLine(endLine + 1)!); - endLine++; - } - - const text = getXtermLineContent(this._xterm.raw.buffer.active, startLine, endLine, this._xterm.raw.cols); - if (text === '' || text.length > MAX_LENGTH) { - return []; - } - - const words: Word[] = this._parseWords(text, wordSeparators); - - for (const word of words) { - if (word.text === '') { - continue; - } - const bufferRange = convertLinkRangeToBuffer - ( - lines, - this._xterm.raw.cols, - { - startColumn: word.startIndex + 1, - startLineNumber: 1, - endColumn: word.endIndex + 1, - endLineNumber: 1 - }, - startLine - ); - links.push(this._createTerminalLink(word.text, activateCallback, bufferRange)); - } - return links; - } - - private _parseWords(text: string, separators: string): Word[] { - const words: Word[] = []; - - const wordSeparators: string[] = separators.split(''); - const characters = text.split(''); - - let startIndex = 0; - for (let i = 0; i < text.length; i++) { - if (wordSeparators.includes(characters[i])) { - words.push({ startIndex, endIndex: i, text: text.substring(startIndex, i) }); - startIndex = i + 1; - } - } - if (startIndex < text.length) { - words.push({ startIndex, endIndex: text.length, text: text.substring(startIndex) }); - } - - return words; - } - - private _createTerminalLink(text: string, activateCallback: XtermLinkMatcherHandler, bufferRange: IBufferRange): TerminalLink { - // Remove trailing colon if there is one so the link is more useful - if (text.length > 0 && text.charAt(text.length - 1) === ':') { - text = text.slice(0, -1); - bufferRange.end.x--; - } - return this._instantiationService.createInstance(TerminalLink, - this._xterm.raw, - bufferRange, - text, - this._xterm.raw.buffer.active.viewportY, - activateCallback, - this._tooltipCallback, - false, - localize('searchWorkspace', 'Search workspace') - ); - } - - private async _activate(link: string, y: number) { - const pathSeparator = (isWindows ? '\\' : '/'); - // Remove file:/// and any leading ./ or ../ since quick access doesn't understand that format - link = link.replace(/^file:\/\/\/?/, ''); - link = normalize(link).replace(/^(\.+[\\/])+/, ''); - - // Remove `:in` from the end which is how Ruby outputs stack traces - link = link.replace(/:in$/, ''); - // If any of the names of the folders in the workspace matches - // a prefix of the link, remove that prefix and continue - this._workspaceContextService.getWorkspace().folders.forEach((folder) => { - if (link.substr(0, folder.name.length + 1) === folder.name + pathSeparator) { - link = link.substring(folder.name.length + 1); - return; - } - }); - let matchLink = link; - if (this._capabilities.has(TerminalCapability.CwdDetection)) { - matchLink = this._updateLinkWithRelativeCwd(y, link, pathSeparator); - } - const sanitizedLink = matchLink.replace(/:\d+(:\d+)?$/, ''); - try { - const exactMatch = await this._getExactMatch(sanitizedLink, matchLink); - if (exactMatch) { - // If there was exactly one match, open it - const match = matchLink.match(/:(\d+)?(:(\d+))?$/); - const startLineNumber = match?.[1]; - const startColumn = match?.[3]; - await this._editorService.openEditor({ - resource: exactMatch, - options: { - pinned: true, - revealIfOpened: true, - selection: startLineNumber ? { - startLineNumber: parseInt(startLineNumber), - startColumn: startColumn ? parseInt(startColumn) : 0 - } : undefined - } - }); - return; - } - } catch { - // Fallback to searching quick access - return this._quickInputService.quickAccess.show(link); - } - // Fallback to searching quick access - return this._quickInputService.quickAccess.show(link); - } - - /* - * For shells with the CwdDetection capability, the cwd relative to the line - * of the particular link is used to narrow down the result for an exact file match, if possible. - */ - private _updateLinkWithRelativeCwd(y: number, link: string, pathSeparator: string): string { - const cwd = this._xterm.commandTracker.getCwdForLine(y); - if (cwd && !link.includes(pathSeparator)) { - link = cwd + pathSeparator + link; - } else { - let commonDirs = 0; - let i = 0; - const cwdPath = cwd.split(pathSeparator).reverse(); - const linkPath = link.split(pathSeparator); - while (i < cwdPath.length) { - if (cwdPath[i] === linkPath[i]) { - commonDirs++; - } - i++; - } - link = cwd + pathSeparator + linkPath.slice(commonDirs).join(pathSeparator); - } - return link; - } - - private async _getExactMatch(sanitizedLink: string, link: string): Promise { - let exactResource: URI | undefined; - if (isAbsolute(sanitizedLink)) { - const scheme = this._environmentService.remoteAuthority ? Schemas.vscodeRemote : Schemas.file; - const resource = URI.from({ scheme, path: sanitizedLink }); - const fileStat = await this._fileService.resolve(resource); - if (fileStat.isFile) { - exactResource = resource; - } - } - if (!exactResource) { - const results = await this._searchService.fileSearch( - this._fileQueryBuilder.file(this._workspaceContextService.getWorkspace().folders, { - // Remove optional :row:col from the link as openEditor supports it - filePattern: sanitizedLink, - maxResults: 2 - }) - ); - if (results.results.length === 1) { - exactResource = results.results[0].resource; - } - } - return exactResource; - } -} - -interface Word { - startIndex: number; - endIndex: number; - text: string; -} diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh index ed7b278d643..63168fba96b 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh @@ -1,53 +1,84 @@ + +if [ -z "$VSCODE_SHELL_LOGIN" ]; then + . ~/.bashrc +else + # Imitate -l because --init-file doesn't support it: + # run the first of these files that exists + if [ -f ~/.bash_profile ]; then + . ~/.bash_profile + elif [ -f ~/.bash_login ]; then + . ~/.bash_login + elif [ -f ~/.profile ]; then + . ~/.profile + fi + VSCODE_SHELL_LOGIN="" +fi + IN_COMMAND_EXECUTION="1" prompt_start() { - printf "\033]133;A\007" + printf "\033]133;A\007" } prompt_end() { - printf "\033]133;B\007" + printf "\033]133;B\007" } update_cwd() { - printf "\033]1337;CurrentDir=%s\007" "$PWD" + printf "\033]1337;CurrentDir=%s\007" "$PWD" } command_output_start() { - printf "\033]133;C\007" + printf "\033]133;C\007" } command_complete() { - printf "\033]133;D;%s\007" "$STATUS" - update_cwd + printf "\033]133;D;%s\007" "$STATUS" + update_cwd } update_prompt() { - PRIOR_PROMPT="$PS1" - IN_COMMAND_EXECUTION="" - PS1="$(prompt_start)$PREFIX$PS1$(prompt_end)" + PRIOR_PROMPT="$PS1" + IN_COMMAND_EXECUTION="" + PS1="$(prompt_start)$PREFIX$PS1$(prompt_end)" } precmd() { - local STATUS="$?" - if [ -z "${IN_COMMAND_EXECUTION-}" ]; then - # if not in command execution - command_output_start - fi + local STATUS="$?" + command_complete "$STATUS" - command_complete "$STATUS" - - # in command execution - if [ -n "$IN_COMMAND_EXECUTION" ]; then - # non null - update_prompt - fi + # in command execution + if [ -n "$IN_COMMAND_EXECUTION" ]; then + # non null + update_prompt + fi } preexec() { - PS1="$PRIOR_PROMPT" - IN_COMMAND_EXECUTION="1" - command_output_start + PS1="$PRIOR_PROMPT" + if [ -z "${IN_COMMAND_EXECUTION-}" ]; then + IN_COMMAND_EXECUTION="1" + command_output_start + fi } update_prompt -PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}'precmd' +export ORIGINAL_PROMPT_COMMAND=$PROMPT_COMMAND + +prompt_cmd() { + precmd +} +original_prompt_cmd() { + ${ORIGINAL_PROMPT_COMMAND} + prompt_cmd +} +if [ -n "$ORIGINAL_PROMPT_COMMAND" ]; then + export PROMPT_COMMAND=original_prompt_cmd +else + export PROMPT_COMMAND=prompt_cmd +fi + trap 'preexec' DEBUG -update_cwd +if [ -z "$VSCODE_SHELL_HIDE_WELCOME" ]; then + echo -e "\033[1;32mShell integration activated!\033[0m" +else + VSCODE_SHELL_HIDE_WELCOME="" +fi diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh index 6715779fa13..856a0f5e966 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh @@ -1,52 +1,58 @@ IN_COMMAND_EXECUTION="1" prompt_start() { - printf "\033]133;A\007" + printf "\033]133;A\007" } prompt_end() { - printf "\033]133;B\007" + printf "\033]133;B\007" } update_cwd() { - printf "\033]1337;CurrentDir=%s\007" "$PWD" + printf "\033]1337;CurrentDir=%s\007" "$PWD" } command_output_start() { - printf "\033]133;C\007" + printf "\033]133;C\007" } command_complete() { - printf "\033]133;D;%s\007" "$STATUS" - update_cwd + printf "\033]133;D;%s\007" "$STATUS" + update_cwd } update_prompt() { - PRIOR_PROMPT="$PS1" - IN_COMMAND_EXECUTION="" - PS1="$(prompt_start)$PREFIX$PS1$(prompt_end)" + PRIOR_PROMPT="$PS1" + IN_COMMAND_EXECUTION="" + PS1="$(prompt_start)$PREFIX$PS1$(prompt_end)" } precmd() { - local STATUS="$?" - if [ -z "${IN_COMMAND_EXECUTION-}" ]; then - # not in command execution - command_output_start - fi + local STATUS="$?" + if [ -z "${IN_COMMAND_EXECUTION-}" ]; then + # not in command execution + command_output_start + fi - command_complete "$STATUS" + command_complete "$STATUS" - # in command execution - if [ -n "$IN_COMMAND_EXECUTION" ]; then - # non null - update_prompt - fi + # in command execution + if [ -n "$IN_COMMAND_EXECUTION" ]; then + # non null + update_prompt + fi } preexec() { - PS1="$PRIOR_PROMPT" - IN_COMMAND_EXECUTION="1" - command_output_start + PS1="$PRIOR_PROMPT" + IN_COMMAND_EXECUTION="1" + command_output_start } precmd_functions+=($precmd_functions precmd) preexec_functions+=($preexec_functions preexec) -update_cwd + +# Show the welcome message +if [ -z "${VSCODE_SHELL_HIDE_WELCOME-}" ]; then + echo "\033[1;32mShell integration activated!\033[0m" +else + VSCODE_SHELL_HIDE_WELCOME="" +fi diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 index be4a8cc7f1a..b4988fab2b0 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 @@ -3,25 +3,63 @@ # Licensed under the MIT License. See License.txt in the project root for license information. # --------------------------------------------------------------------------------------------- -$Global:__VSCodeOriginalPrompt = (Get-Command Prompt).ScriptBlock +param( + [Parameter(HelpMessage="Hides the shell integration welcome message")] + [switch] $HideWelcome = $False +) + +$Global:__VSCodeOriginalPrompt = $function:Prompt function Global:__VSCode-Get-LastExitCode { - if ($? -eq $True) { - return "0" - } + if ($? -eq $True) { + return 0 + } # TODO: Should we just return a string instead? - return "-1" + return -1 } function Global:Prompt() { - return "`e]133;D;$(__VSCode-Get-LastExitCode)`u{7}`e]133;A`u{7}`e]1337;CurrentDir=$(Get-Location)`u{7}$(Invoke-Command -ScriptBlock $Global:__VSCodeOriginalPrompt)`e]133;B`u{7}" + # Command finished command line + # OSC 633 ; A ; ST + $Result = "`e]633;A;" + # Sanitize the command line to ensure it can get transferred to the terminal and can be parsed + # correctly. This isn't entirely safe but good for most cases, it's important for the Pt parameter + # to only be composed of _printable_ characters as per the spec. + # TODO: There are probably better serializable strings to use + # TODO: This doesn't work for empty commands of ^C + # TODO: Check ID against last to see if no command ran + $CommandLine = $(Get-History -Count 1).CommandLine ?? "" + $Result += $CommandLine.Replace("`n", "").Replace(";", "") + $Result += "`a" + # Command finished exit code + # OSC 133 ; D ; ST + $Result += "`e]133;D;$(__VSCode-Get-LastExitCode)`a" + # Prompt started + # OSC 133 ; A ST + $Result += "`e]133;A`a" + # Current working directory + # OSC 1337 ; CurrentDir= ST + $Result += if($pwd.Provider.Name -eq 'FileSystem'){"`e]1337;CurrentDir=$($pwd.ProviderPath)`a"} + # Write original prompt + $Result += $Global:__VSCodeOriginalPrompt.Invoke() + # Write command started + $Result += "`e]133;B`a" + return $Result } # TODO: Gracefully fallback when PSReadLine is not loaded +$__VSCodeOriginalPSConsoleHostReadLine = $function:PSConsoleHostReadLine function Global:PSConsoleHostReadLine { - [Microsoft.PowerShell.PSConsoleReadLine]::ReadLine($Host.Runspace, $ExecutionContext) - # Write command executed sequence directly to Console to avoid the new line from Write-Host - [Console]::Write("`e]133;C`u{7}") + $tmp = $__VSCodeOriginalPSConsoleHostReadLine.Invoke() + # Write command executed sequence directly to Console to avoid the new line from Write-Host + [Console]::Write("`e]133;C`a") + $tmp } -Write-Output "`e]133;E`u{7}" +# Set IsWindows property +[Console]::Write("`e]633;P;IsWindows=$($IsWindows)`a") + +# Show the welcome message +if ($HideWelcome -eq $False) { + Write-Host "`e[1mShell integration activated!`e[0m" -ForegroundColor Green +} diff --git a/src/vs/workbench/contrib/terminal/browser/media/terminal.css b/src/vs/workbench/contrib/terminal/browser/media/terminal.css index b0f82cd7de9..cc13450fe6f 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/terminal.css +++ b/src/vs/workbench/contrib/terminal/browser/media/terminal.css @@ -48,13 +48,18 @@ .monaco-workbench .pane-body.integrated-terminal .xterm { /* All terminals have at least 10px left/right edge padding and 2 padding on the bottom (so underscores on last line are visible */ padding: 0 10px 2px; - /* Bottom align the terminal withing the split pane */ + /* Bottom align the terminal within the split pane */ position: absolute; bottom: 0; left: 0; right: 0; } +.terminal-side-view .terminal.xterm { + /* Top align the terminal within the split pane when the panel is vertical */ + top: 0; +} + .monaco-workbench .editor-instance .terminal-wrapper.fixed-dims .xterm, .monaco-workbench .pane-body.integrated-terminal .terminal-wrapper.fixed-dims .xterm { position: static; diff --git a/src/vs/workbench/contrib/terminal/browser/media/widgets.css b/src/vs/workbench/contrib/terminal/browser/media/widgets.css index 3ed2086bebe..58545a1df0a 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/widgets.css +++ b/src/vs/workbench/contrib/terminal/browser/media/widgets.css @@ -5,13 +5,22 @@ .monaco-workbench .terminal-widget-container { position: absolute; - left: 0; - bottom: 0; - right: 0; + left: 10px; + bottom: 2px; + right: 10px; top: 0; overflow: visible; } +.monaco-workbench .editor-instance .terminal-group .monaco-split-view2.horizontal .split-view-view:first-child .terminal-widget-container, +.monaco-workbench .pane-body.integrated-terminal .terminal-group .monaco-split-view2.horizontal .split-view-view:first-child .terminal-widget-container { + left: 20px; +} +.monaco-workbench .editor-instance .terminal-group .monaco-split-view2.horizontal .split-view-view:last-child .terminal-widget-container, +.monaco-workbench .pane-body.integrated-terminal .terminal-group .monaco-split-view2.horizontal .split-view-view:last-child .terminal-widget-container { + right: 20px; +} + .monaco-workbench .terminal-overlay-widget { position: absolute; left: 0; @@ -21,7 +30,7 @@ .monaco-workbench .terminal-hover-target { position: absolute; - z-index: 30; + z-index: 33; } .monaco-workbench .terminal-env-var-info { diff --git a/src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts b/src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts index 24630e43d33..716cb74198e 100644 --- a/src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts +++ b/src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts @@ -50,7 +50,7 @@ export class RemoteTerminalBackendContribution implements IWorkbenchContribution class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBackend { private readonly _ptys: Map = new Map(); - private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number, workspaceId: string, instanceId: number }>()); + private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number; workspaceId: string; instanceId: number }>()); readonly onDidRequestDetach = this._onDidRequestDetach.event; constructor( @@ -103,7 +103,11 @@ class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBack // Listen for config changes const initialConfig = this._configurationService.getValue(TERMINAL_CONFIG_SECTION); for (const match of Object.keys(initialConfig.autoReplies)) { - this._remoteTerminalChannel.installAutoReply(match, initialConfig.autoReplies[match]); + // Ensure the value is truthy + const reply = initialConfig.autoReplies[match]; + if (reply) { + this._remoteTerminalChannel.installAutoReply(match, reply); + } } // TODO: Could simplify update to a single call this._register(this._configurationService.onDidChangeConfiguration(async e => { @@ -111,7 +115,11 @@ class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBack this._remoteTerminalChannel.uninstallAllAutoReplies(); const config = this._configurationService.getValue(TERMINAL_CONFIG_SECTION); for (const match of Object.keys(config.autoReplies)) { - await this._remoteTerminalChannel.installAutoReply(match, config.autoReplies[match]); + // Ensure the value is truthy + const reply = config.autoReplies[match]; + if (reply) { + await this._remoteTerminalChannel.installAutoReply(match, reply); + } } } })); diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 8fd919d0fd0..89f667cac60 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -6,7 +6,7 @@ import { Event } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IShellLaunchConfig, ITerminalDimensions, ITerminalLaunchError, ITerminalProfile, ITerminalTabLayoutInfoById, TerminalIcon, TitleEventSource, TerminalShellType, IExtensionTerminalProfile, TerminalLocation, ProcessPropertyType, IProcessPropertyMap } from 'vs/platform/terminal/common/terminal'; import { INavigationMode, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalConfigHelper, ITerminalFont, ITerminalBackend, ITerminalProcessExtHostProxy, IRegisterContributedProfileArgs, IShellIntegration } from 'vs/workbench/contrib/terminal/common/terminal'; @@ -17,8 +17,8 @@ import { DeserializedTerminalEditorInput } from 'vs/workbench/contrib/terminal/b import { TerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorInput'; import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { IKeyMods } from 'vs/platform/quickinput/common/quickInput'; -import { IMarker } from 'xterm'; import { ITerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; export const ITerminalService = createDecorator('terminalService'); export const ITerminalEditorService = createDecorator('terminalEditorService'); @@ -77,29 +77,17 @@ export const enum Direction { } export interface IQuickPickTerminalObject { - config: IRegisterContributedProfileArgs | ITerminalProfile | { profile: IExtensionTerminalProfile, options: { icon?: string, color?: string } } | undefined, - keyMods: IKeyMods | undefined -} - -export interface TerminalCommand { - command: string; - timestamp: number; - cwd?: string; - exitCode?: number; - marker?: IMarker; - getOutput(): string | undefined; + config: IRegisterContributedProfileArgs | ITerminalProfile | { profile: IExtensionTerminalProfile; options: { icon?: string; color?: string } } | undefined; + keyMods: IKeyMods | undefined; } export interface ICommandTracker { - readonly commands: TerminalCommand[]; - readonly cwds: string[]; scrollToPreviousCommand(): void; scrollToNextCommand(): void; selectToPreviousCommand(): void; selectToNextCommand(): void; selectToPreviousLine(): void; selectToNextLine(): void; - getCwdForLine(line: number): string; clearMarker(): void; } @@ -216,10 +204,10 @@ export interface ITerminalService extends ITerminalInstanceHost { getInstanceHost(target: ITerminalLocationOptions | undefined): ITerminalInstanceHost; getFindHost(instance?: ITerminalInstance): ITerminalFindHost; - resolveLocation(location?: ITerminalLocationOptions): TerminalLocation | undefined + resolveLocation(location?: ITerminalLocationOptions): TerminalLocation | undefined; setNativeDelegate(nativeCalls: ITerminalServiceNativeDelegate): void; - toggleDevTools(open?: boolean): Promise; handleNewRegisteredBackend(backend: ITerminalBackend): void; + toggleEscapeSequenceLogging(): Promise; } export class TerminalLinkQuickPickEvent extends MouseEvent { @@ -275,8 +263,8 @@ export interface ICreateTerminalOptions { } export interface TerminalEditorLocation { - viewColumn: EditorGroupColumn, - preserveFocus?: boolean + viewColumn: EditorGroupColumn; + preserveFocus?: boolean; } /** @@ -343,6 +331,7 @@ export interface ITerminalInstanceHost { readonly onDidFocusInstance: Event; readonly onDidChangeActiveInstance: Event; readonly onDidChangeInstances: Event; + readonly onDidChangeInstanceCapability: Event; setActiveInstance(instance: ITerminalInstance): void; /** @@ -429,7 +418,7 @@ export interface ITerminalInstance { readonly processName: string; readonly sequence?: string; readonly staticTitle?: string; - readonly workspaceFolder?: string; + readonly workspaceFolder?: IWorkspaceFolder; readonly cwd?: string; readonly initialCwd?: string; readonly capabilities: ITerminalCapabilityStore; @@ -534,10 +523,10 @@ export interface ITerminalInstance { /** * Attach a listener that fires when the terminal's pty process exits. The number in the event - * is the processes' exit code, an exit code of null means the process was killed as a result of + * is the processes' exit code, an exit code of undefined means the process was killed as a result of * the ITerminalInstance being disposed. */ - onExit: Event; + onExit: Event; readonly exitCode: number | undefined; @@ -605,7 +594,7 @@ export interface ITerminalInstance { description: string | undefined; - userHome: string | undefined + userHome: string | undefined; /** * Shows the environment information hover if the widget exists. */ @@ -735,7 +724,7 @@ export interface ITerminalInstance { * * @param dimension The dimensions of the container. */ - layout(dimension: { width: number, height: number }): void; + layout(dimension: { width: number; height: number }): void; /** * Sets whether the terminal instance's element is visible in the DOM. @@ -784,6 +773,8 @@ export interface ITerminalInstance { toggleEscapeSequenceLogging(): Promise; + setEscapeSequenceLogging(enable: boolean): void; + getInitialCwd(): Promise; getCwd(): Promise; @@ -823,6 +814,11 @@ export interface ITerminalInstance { * re-run it in the active terminal. */ runRecent(type: 'command' | 'cwd'): Promise; + + /** + * Activates the most recent link of the given type. + */ + openRecentLink(type: 'localFile' | 'url'): Promise; } export interface IXtermTerminal { @@ -874,16 +870,11 @@ export interface IXtermTerminal { * viewport. */ clearBuffer(): void; - - /* - * When process capabilites are updated, update the command tracker - */ - upgradeCommandTracker(): void; } export interface IRequestAddInstanceToGroupEvent { uri: URI; - side: 'before' | 'after' + side: 'before' | 'after'; } export const enum LinuxDistro { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 06456255634..79862cc9eea 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -31,9 +31,9 @@ import { ITerminalProfile, TerminalLocation, TerminalSettingId, TitleEventSource import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { PICK_WORKSPACE_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands'; import { CLOSE_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; import { FindInFilesCommand, IFindInFilesArgs } from 'vs/workbench/contrib/search/browser/searchActions'; -import { Direction, ICreateTerminalOptions, ITerminalGroupService, ITerminalInstance, ITerminalInstanceService, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { Direction, ICreateTerminalOptions, ITerminalEditorService, ITerminalGroupService, ITerminalInstance, ITerminalInstanceService, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalQuickAccessProvider } from 'vs/workbench/contrib/terminal/browser/terminalQuickAccess'; import { IRemoteTerminalAttachTarget, ITerminalConfigHelper, ITerminalProfileService, TerminalCommandId, TERMINAL_ACTION_CATEGORY } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; @@ -311,7 +311,17 @@ export function registerTerminalActions() { }); } async run(accessor: ServicesAccessor): Promise { - await accessor.get(ITerminalService).activeInstance?.runRecent('command'); + const terminalGroupService = accessor.get(ITerminalGroupService); + const terminalEditorService = accessor.get(ITerminalEditorService); + const instance = accessor.get(ITerminalService).activeInstance; + if (instance) { + await instance.runRecent('command'); + if (instance?.target === TerminalLocation.Editor) { + terminalEditorService.revealActiveEditor(); + } else { + terminalGroupService.showPanel(false); + } + } } }); registerAction2(class extends Action2 { @@ -325,7 +335,17 @@ export function registerTerminalActions() { }); } async run(accessor: ServicesAccessor): Promise { - await accessor.get(ITerminalService).activeInstance?.runRecent('cwd'); + const terminalGroupService = accessor.get(ITerminalGroupService); + const terminalEditorService = accessor.get(ITerminalEditorService); + const instance = accessor.get(ITerminalService).activeInstance; + if (instance) { + await instance.runRecent('cwd'); + if (instance?.target === TerminalLocation.Editor) { + terminalEditorService.revealActiveEditor(); + } else { + terminalGroupService.showPanel(false); + } + } } }); registerAction2(class extends Action2 { @@ -1187,8 +1207,7 @@ export function registerTerminalActions() { } async run(accessor: ServicesAccessor) { const terminalService = accessor.get(ITerminalService); - const toggledOn = await terminalService.activeInstance?.toggleEscapeSequenceLogging(); - terminalService.toggleDevTools(toggledOn); + await terminalService.toggleEscapeSequenceLogging(); } }); registerAction2(class extends Action2 { @@ -1553,8 +1572,7 @@ export function registerTerminalActions() { for (const t of instances) { terminalService.setActiveInstance(t); terminalService.doWithActiveInstance(async instance => { - const cwd = await getCwdForSplit(terminalService.configHelper, instance); - await terminalService.createTerminal({ location: { parentTerminal: instance }, cwd }); + await terminalService.createTerminal({ location: { parentTerminal: instance } }); await terminalGroupService.showPanel(true); }); } @@ -1680,8 +1698,7 @@ export function registerTerminalActions() { const terminalService = accessor.get(ITerminalService); const terminalGroupService = accessor.get(ITerminalGroupService); await terminalService.doWithActiveInstance(async t => { - const cwd = await getCwdForSplit(terminalService.configHelper, t); - const instance = await terminalService.createTerminal({ location: { parentTerminal: t }, cwd }); + const instance = await terminalService.createTerminal({ location: { parentTerminal: t } }); if (instance?.target !== TerminalLocation.Editor) { await terminalGroupService.showPanel(true); } @@ -1744,14 +1761,11 @@ export function registerTerminalActions() { const workspaceContextService = accessor.get(IWorkspaceContextService); const commandService = accessor.get(ICommandService); const configurationService = accessor.get(IConfigurationService); + const configurationResolverService = accessor.get(IConfigurationResolverService); const folders = workspaceContextService.getWorkspace().folders; if (eventOrOptions && eventOrOptions instanceof MouseEvent && (eventOrOptions.altKey || eventOrOptions.ctrlKey)) { - const activeInstance = terminalService.activeInstance; - if (activeInstance) { - const cwd = await getCwdForSplit(terminalService.configHelper, activeInstance); - await terminalService.createTerminal({ location: { parentTerminal: activeInstance }, cwd }); - return; - } + await terminalService.createTerminal({ location: { splitActiveTerminal: true } }); + return; } if (terminalService.isProcessSupportRegistered) { @@ -1774,13 +1788,14 @@ export function registerTerminalActions() { eventOrOptions.cwd = workspace.uri; const cwdConfig = configurationService.getValue(TerminalSettingId.Cwd, { resource: workspace.uri }); if (typeof cwdConfig === 'string' && cwdConfig.length > 0) { - if (isAbsolute(cwdConfig) || cwdConfig.startsWith(AbstractVariableResolverService.VARIABLE_LHS)) { + const resolvedCwdConfig = await configurationResolverService.resolveAsync(workspace, cwdConfig); + if (isAbsolute(resolvedCwdConfig) || resolvedCwdConfig.startsWith(AbstractVariableResolverService.VARIABLE_LHS)) { eventOrOptions.cwd = URI.from({ scheme: workspace.uri.scheme, - path: cwdConfig + path: resolvedCwdConfig }); } else { - eventOrOptions.cwd = URI.joinPath(workspace.uri, cwdConfig); + eventOrOptions.cwd = URI.joinPath(workspace.uri, resolvedCwdConfig); } } instance = await terminalService.createTerminal(eventOrOptions); @@ -1924,11 +1939,11 @@ export function registerTerminalActions() { registerAction2(class extends Action2 { constructor() { super({ - id: TerminalCommandId.ShowProtocolLinkQuickpick, - title: { value: localize('workbench.action.terminal.selectDetectedLink', "Select Detected Link"), original: 'Select Detected Link' }, + id: TerminalCommandId.OpenDetectedLink, + title: { value: localize('workbench.action.terminal.openDetectedLink', "Open Detected Link..."), original: 'Open Detected Link...' }, f1: true, category, - precondition: ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), + precondition: TerminalContextKeys.terminalHasBeenCreated, }); } run(accessor: ServicesAccessor) { @@ -1936,6 +1951,36 @@ export function registerTerminalActions() { } }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TerminalCommandId.OpenWebLink, + title: { value: localize('workbench.action.terminal.openLastUrlLink', "Open Last Url Link"), original: 'Open Last Url Link' }, + f1: true, + category, + precondition: TerminalContextKeys.terminalHasBeenCreated, + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).doWithActiveInstance(t => t.openRecentLink('url')); + } + }); + + registerAction2(class extends Action2 { + constructor() { + super({ + id: TerminalCommandId.OpenFileLink, + title: { value: localize('workbench.action.terminal.openLastLocalFileLink', "Open Last Local File Link"), original: 'Open Last Local File Link' }, + f1: true, + category, + precondition: TerminalContextKeys.terminalHasBeenCreated, + }); + } + run(accessor: ServicesAccessor) { + accessor.get(ITerminalService).doWithActiveInstance(t => t.openRecentLink('localFile')); + } + }); + registerAction2(class extends Action2 { constructor() { super({ @@ -2186,7 +2231,7 @@ function focusNext(accessor: ServicesAccessor): void { listService.lastFocusedList?.focusNext(); } -export function validateTerminalName(name: string): { content: string, severity: Severity } | null { +export function validateTerminalName(name: string): { content: string; severity: Severity } | null { if (!name || name.trim().length === 0) { return { content: localize('emptyTerminalNameInfo', "Providing no name will reset it to the default value"), @@ -2268,8 +2313,7 @@ export function refreshTerminalActions(detectedProfiles: ITerminalProfile[]) { if (event && (event.altKey || event.ctrlKey)) { const parentTerminal = terminalService.activeInstance; if (parentTerminal) { - cwd = await getCwdForSplit(terminalService.configHelper, parentTerminal); - await terminalService.createTerminal({ location: { parentTerminal }, config: options?.config, cwd }); + await terminalService.createTerminal({ location: { parentTerminal }, config: options?.config }); return; } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts index dff4154376e..432ea430fa6 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalConfigHelper.ts @@ -13,7 +13,6 @@ import { IBrowserTerminalConfigHelper, LinuxDistro } from 'vs/workbench/contrib/ import { Emitter, Event } from 'vs/base/common/event'; import { basename } from 'vs/base/common/path'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -43,7 +42,6 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper { @IConfigurationService private readonly _configurationService: IConfigurationService, @IExtensionManagementService private readonly _extensionManagementService: IExtensionManagementService, @INotificationService private readonly _notificationService: INotificationService, - @ITelemetryService private readonly _telemetryService: ITelemetryService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @IProductService private readonly _productService: IProductService, ) { @@ -240,13 +238,6 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper { { label: nls.localize('install', 'Install'), run: () => { - /* __GDPR__ - "terminalLaunchRecommendation:popup" : { - "userReaction" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "extensionId": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight" } - } - */ - this._telemetryService.publicLog('terminalLaunchRecommendation:popup', { userReaction: 'install', extId }); this._instantiationService.createInstance(InstallRecommendedExtensionAction, extId).run(); } } @@ -254,14 +245,7 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper { { sticky: true, neverShowAgain: { id: 'terminalConfigHelper/launchRecommendationsIgnore', scope: NeverShowAgainScope.GLOBAL }, - onCancel: () => { - /* __GDPR__ - "terminalLaunchRecommendation:popup" : { - "userReaction" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this._telemetryService.publicLog('terminalLaunchRecommendation:popup', { userReaction: 'cancelled' }); - } + onCancel: () => { } } ); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalContextMenu.ts b/src/vs/workbench/contrib/terminal/browser/terminalContextMenu.ts index 0924eaa7f87..3f4cf09c9f7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalContextMenu.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalContextMenu.ts @@ -12,7 +12,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView export function openContextMenu(event: MouseEvent, parent: HTMLElement, menu: IMenu, contextMenuService: IContextMenuService, extraActions?: Action[]): void { const standardEvent = new StandardMouseEvent(event); - const anchor: { x: number, y: number } = { x: standardEvent.posx, y: standardEvent.posy }; + const anchor: { x: number; y: number } = { x: standardEvent.posx, y: standardEvent.posy }; const actions: IAction[] = []; const actionsDisposable = createAndFillInContextMenuActions(menu, undefined, actions); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalDecorationsProvider.ts b/src/vs/workbench/contrib/terminal/browser/terminalDecorationsProvider.ts index 5a1df8f6e8d..45c07c54840 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalDecorationsProvider.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalDecorationsProvider.ts @@ -12,9 +12,9 @@ import { Schemas } from 'vs/base/common/network'; import { getColorForSeverity } from 'vs/workbench/contrib/terminal/browser/terminalStatusList'; export interface ITerminalDecorationData { - tooltip: string, - statusIcon: string, - color: string + tooltip: string; + statusIcon: string; + color: string; } export class TerminalDecorationsProvider implements IDecorationsProvider { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index 124238bcac6..570f381b4f7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -7,7 +7,7 @@ import * as dom from 'vs/base/browser/dom'; import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IAction } from 'vs/base/common/actions'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; import { IMenu, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditorInput.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditorInput.ts index 02699386114..8f8fcfbc3cf 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditorInput.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditorInput.ts @@ -226,7 +226,7 @@ export class TerminalEditorInput extends EditorInput { } public override getDescription(): string | undefined { - return this._terminalInstance?.description || this._terminalInstance?.shellLaunchConfig.description; + return this._terminalInstance?.description; } public override toUntyped(): IUntypedEditorInput { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts index e49def31ff0..543d6ab489e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditorSerializer.ts @@ -61,9 +61,9 @@ interface TerminalEditorInputObject { } export interface SerializedTerminalEditorInput extends TerminalEditorInputObject { - readonly resource: string + readonly resource: string; } export interface DeserializedTerminalEditorInput extends TerminalEditorInputObject { - readonly resource: URI + readonly resource: URI; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditorService.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditorService.ts index a9887164900..44ad0a48a4d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditorService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditorService.ts @@ -6,7 +6,7 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { EditorActivation } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -39,6 +39,8 @@ export class TerminalEditorService extends Disposable implements ITerminalEditor readonly onDidDisposeInstance = this._onDidDisposeInstance.event; private readonly _onDidFocusInstance = new Emitter(); readonly onDidFocusInstance = this._onDidFocusInstance.event; + private readonly _onDidChangeInstanceCapability = new Emitter(); + readonly onDidChangeInstanceCapability = this._onDidChangeInstanceCapability.event; private readonly _onDidChangeActiveInstance = new Emitter(); readonly onDidChangeActiveInstance = this._onDidChangeActiveInstance.event; private readonly _onDidChangeInstances = new Emitter(); @@ -165,7 +167,7 @@ export class TerminalEditorService extends Disposable implements ITerminalEditor if (resource) { await this._editorService.openEditor({ resource, - description: instance.description || instance.shellLaunchConfig.description, + description: instance.description || instance.shellLaunchConfig.type, options: { pinned: true, @@ -228,7 +230,9 @@ export class TerminalEditorService extends Disposable implements ITerminalEditor this._editorInputs.set(inputKey, input); this._instanceDisposables.set(inputKey, [ instance.onDidFocus(this._onDidFocusInstance.fire, this._onDidFocusInstance), - instance.onDisposed(this._onDidDisposeInstance.fire, this._onDidDisposeInstance) + instance.onDisposed(this._onDidDisposeInstance.fire, this._onDidDisposeInstance), + instance.capabilities.onDidAddCapability(() => this._onDidChangeInstanceCapability.fire(instance)), + instance.capabilities.onDidRemoveCapability(() => this._onDidChangeInstanceCapability.fire(instance)), ]); this.instances.push(instance); this._onDidChangeInstances.fire(); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts index cdc6157291b..c4adb237e87 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts @@ -6,7 +6,7 @@ import { SimpleFindWidget } from 'vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts b/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts index 5a36e28f586..357c121317f 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts @@ -7,12 +7,13 @@ import { TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal' import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { SplitView, Orientation, IView, Sizing } from 'vs/base/browser/ui/splitview/splitview'; -import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; +import { IWorkbenchLayoutService, Parts, Position } from 'vs/workbench/services/layout/browser/layoutService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITerminalInstance, Direction, ITerminalGroup, ITerminalService, ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ViewContainerLocation, IViewDescriptorService } from 'vs/workbench/common/views'; import { IShellLaunchConfig, ITerminalTabLayoutInfoById } from 'vs/platform/terminal/common/terminal'; import { TerminalStatus } from 'vs/workbench/contrib/terminal/browser/terminalStatusList'; +import { getPartByLocation } from 'vs/workbench/browser/parts/views/viewsService'; const SPLIT_PANE_MIN_SIZE = 120; @@ -49,7 +50,7 @@ class SplitPaneContainer extends Disposable { this._addChild(instance, index); } - resizePane(index: number, direction: Direction, amount: number): void { + resizePane(index: number, direction: Direction, amount: number, part: Parts): void { const isHorizontal = (direction === Direction.Left) || (direction === Direction.Right); if ((isHorizontal && this.orientation !== Orientation.HORIZONTAL) || @@ -59,7 +60,8 @@ class SplitPaneContainer extends Disposable { (this.orientation === Orientation.VERTICAL && direction === Direction.Right)) { amount *= -1; } - this._layoutService.resizePart(Parts.PANEL_PART, amount, amount); + + this._layoutService.resizePart(part, amount, amount); return; } @@ -244,6 +246,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { private _terminalInstances: ITerminalInstance[] = []; private _splitPaneContainer: SplitPaneContainer | undefined; private _groupElement: HTMLElement | undefined; + private _panelPosition: Position = Position.BOTTOM; private _terminalLocation: ViewContainerLocation = ViewContainerLocation.Panel; private _instanceDisposables: Map = new Map(); @@ -258,6 +261,8 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { readonly onDidDisposeInstance = this._onDidDisposeInstance.event; private readonly _onDidFocusInstance: Emitter = this._register(new Emitter()); readonly onDidFocusInstance = this._onDidFocusInstance.event; + private readonly _onDidChangeInstanceCapability: Emitter = this._register(new Emitter()); + readonly onDidChangeInstanceCapability = this._onDidChangeInstanceCapability.event; private readonly _onDisposed: Emitter = this._register(new Emitter()); readonly onDisposed = this._onDisposed.event; private readonly _onInstancesChanged: Emitter = this._register(new Emitter()); @@ -272,6 +277,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { shellLaunchConfigOrInstance: IShellLaunchConfig | ITerminalInstance | undefined, @ITerminalService private readonly _terminalService: ITerminalService, @ITerminalInstanceService private readonly _terminalInstanceService: ITerminalInstanceService, + @IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService, @IViewDescriptorService private readonly _viewDescriptorService: IViewDescriptorService, @IInstantiationService private readonly _instantiationService: IInstantiationService ) { @@ -282,7 +288,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { if (this._container) { this.attachToElement(this._container); } - this._onPanelOrientationChanged.fire(this._terminalLocation === ViewContainerLocation.Panel ? Orientation.HORIZONTAL : Orientation.VERTICAL); + this._onPanelOrientationChanged.fire(this._terminalLocation === ViewContainerLocation.Panel && this._panelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL); } addInstance(shellLaunchConfigOrInstance: IShellLaunchConfig | ITerminalInstance, parentTerminalId?: number): void { @@ -352,7 +358,9 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { instance.onDidFocus(instance => { this._setActiveInstance(instance); this._onDidFocusInstance.fire(instance); - }) + }), + instance.capabilities.onDidAddCapability(() => this._onDidChangeInstanceCapability.fire(instance)), + instance.capabilities.onDidRemoveCapability(() => this._onDidChangeInstanceCapability.fire(instance)), ]); } @@ -460,8 +468,9 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { this._container.appendChild(this._groupElement); if (!this._splitPaneContainer) { + this._panelPosition = this._layoutService.getPanelPosition(); this._terminalLocation = this._viewDescriptorService.getViewLocationById(TERMINAL_VIEW_ID)!; - const orientation = this._terminalLocation === ViewContainerLocation.Panel ? Orientation.HORIZONTAL : Orientation.VERTICAL; + const orientation = this._terminalLocation === ViewContainerLocation.Panel && this._panelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; this._splitPaneContainer = this._instantiationService.createInstance(SplitPaneContainer, this._groupElement, orientation); this.terminalInstances.forEach(instance => this._splitPaneContainer!.split(instance, this._activeInstanceIndex + 1)); if (this._initialRelativeSizes) { @@ -523,11 +532,13 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { layout(width: number, height: number): void { if (this._splitPaneContainer) { // Check if the panel position changed and rotate panes if so + const newPanelPosition = this._layoutService.getPanelPosition(); const newTerminalLocation = this._viewDescriptorService.getViewLocationById(TERMINAL_VIEW_ID)!; - const terminalPositionChanged = newTerminalLocation !== this._terminalLocation; + const terminalPositionChanged = newPanelPosition !== this._panelPosition || newTerminalLocation !== this._terminalLocation; if (terminalPositionChanged) { - const newOrientation = newTerminalLocation === ViewContainerLocation.Panel ? Orientation.HORIZONTAL : Orientation.VERTICAL; + const newOrientation = newTerminalLocation === ViewContainerLocation.Panel && newPanelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; this._splitPaneContainer.setOrientation(newOrientation); + this._panelPosition = newPanelPosition; this._terminalLocation = newTerminalLocation; this._onPanelOrientationChanged.fire(this._splitPaneContainer.orientation); } @@ -555,7 +566,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { // TODO: Support letter spacing and line height const amount = isHorizontal ? font.charWidth : font.charHeight; if (amount) { - this._splitPaneContainer.resizePane(this._activeInstanceIndex, direction, amount); + this._splitPaneContainer.resizePane(this._activeInstanceIndex, direction, amount, getPartByLocation(this._terminalLocation)); } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts b/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts index 1f8969a7a6e..2b5f704ff05 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts @@ -8,12 +8,12 @@ import { timeout } from 'vs/base/common/async'; import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IShellLaunchConfig, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; -import { IViewDescriptorService, IViewsService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { IViewDescriptorService, IViewsService } from 'vs/workbench/common/views'; import { ITerminalFindHost, ITerminalGroup, ITerminalGroupService, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalGroup } from 'vs/workbench/contrib/terminal/browser/terminalGroup'; import { getInstanceFromResource } from 'vs/workbench/contrib/terminal/browser/terminalUri'; @@ -51,6 +51,8 @@ export class TerminalGroupService extends Disposable implements ITerminalGroupSe readonly onDidChangeActiveInstance = this._onDidChangeActiveInstance.event; private readonly _onDidChangeInstances = new Emitter(); readonly onDidChangeInstances = this._onDidChangeInstances.event; + private readonly _onDidChangeInstanceCapability = new Emitter(); + readonly onDidChangeInstanceCapability = this._onDidChangeInstanceCapability.event; private readonly _onDidChangePanelOrientation = new Emitter(); readonly onDidChangePanelOrientation = this._onDidChangePanelOrientation.event; @@ -75,13 +77,10 @@ export class TerminalGroupService extends Disposable implements ITerminalGroupSe hidePanel(): void { // Hide the panel if the terminal is in the panel and it has no sibling views - const location = this._viewDescriptorService.getViewLocationById(TERMINAL_VIEW_ID); - if (location === ViewContainerLocation.Panel) { - const panel = this._viewDescriptorService.getViewContainerByViewId(TERMINAL_VIEW_ID); - if (panel && this._viewDescriptorService.getViewContainerModel(panel).activeViewDescriptors.length === 1) { - this._viewsService.closeView(TERMINAL_VIEW_ID); - TerminalContextKeys.tabsMouse.bindTo(this._contextKeyService).set(false); - } + const panel = this._viewDescriptorService.getViewContainerByViewId(TERMINAL_VIEW_ID); + if (panel && this._viewDescriptorService.getViewContainerModel(panel).activeViewDescriptors.length === 1) { + this._viewsService.closeView(TERMINAL_VIEW_ID); + TerminalContextKeys.tabsMouse.bindTo(this._contextKeyService).set(false); } } @@ -146,6 +145,7 @@ export class TerminalGroupService extends Disposable implements ITerminalGroupSe this._onDidChangeActiveInstance.fire(e); } })); + group.addDisposable(group.onDidChangeInstanceCapability(this._onDidChangeInstanceCapability.fire, this._onDidChangeInstanceCapability)); group.addDisposable(group.onInstancesChanged(this._onDidChangeInstances.fire, this._onDidChangeInstances)); group.addDisposable(group.onDisposed(this._onDidDisposeGroup.fire, this._onDidDisposeGroup)); if (group.terminalInstances.length > 0) { @@ -476,8 +476,8 @@ export class TerminalGroupService extends Disposable implements ITerminalGroupSe } interface IInstanceLocation { - group: ITerminalGroup, - groupIndex: number, - instance: ITerminalInstance, - instanceIndex: number + group: ITerminalGroup; + groupIndex: number; + instance: ITerminalInstance; + instanceIndex: number; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index c581148d256..f1ab30eec5e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -23,13 +23,13 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; -import { ITerminalProcessManager, ProcessState, TERMINAL_VIEW_ID, INavigationMode, DEFAULT_COMMANDS_TO_SKIP_SHELL, TERMINAL_CREATION_COMMANDS, ITerminalProfileResolverService, TerminalCommandId, ITerminalBackend } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalProcessManager, ProcessState, TERMINAL_VIEW_ID, INavigationMode, DEFAULT_COMMANDS_TO_SKIP_SHELL, TERMINAL_CREATION_COMMANDS, ITerminalProfileResolverService, TerminalCommandId, ITerminalBackend, ITerminalCommand, ShellIntegrationExitCode } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { IDetectedLinks, TerminalLinkManager } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; -import { ITerminalInstance, ITerminalExternalLinkProvider, IRequestAddInstanceToGroupEvent, TerminalCommand } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ITerminalInstance, ITerminalExternalLinkProvider, IRequestAddInstanceToGroupEvent } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalProcessManager } from 'vs/workbench/contrib/terminal/browser/terminalProcessManager'; -import type { Terminal as XTermTerminal, ITerminalAddon, ILink } from 'xterm'; +import type { Terminal as XTermTerminal, ITerminalAddon } from 'xterm'; import { NavigationModeAddon } from 'vs/workbench/contrib/terminal/browser/xterm/navigationModeAddon'; import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { EnvironmentVariableInfoWidget } from 'vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget'; @@ -38,7 +38,7 @@ import { TypeAheadAddon } from 'vs/workbench/contrib/terminal/browser/terminalTy import { BrowserFeatures } from 'vs/base/browser/canIUse'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; -import { IProcessDataEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, TerminalShellType, TerminalSettingId, TitleEventSource, TerminalIcon, TerminalLocation, ProcessPropertyType, IProcessPropertyMap, WindowsShellType, TerminalCapability } from 'vs/platform/terminal/common/terminal'; +import { IProcessDataEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, TerminalShellType, TerminalSettingId, TitleEventSource, TerminalIcon, TerminalLocation, ProcessPropertyType, IProcessPropertyMap, WindowsShellType } from 'vs/platform/terminal/common/terminal'; import { IProductService } from 'vs/platform/product/common/productService'; import { formatMessageForTerminal } from 'vs/workbench/contrib/terminal/common/terminalStrings'; import { AutoOpenBarrier, Promises } from 'vs/base/common/async'; @@ -51,8 +51,9 @@ import { URI } from 'vs/base/common/uri'; import { DataTransfers } from 'vs/base/browser/dnd'; import { CodeDataTransfers, containsDragType, DragAndDropObserver, IDragAndDropObserverCallbacks } from 'vs/workbench/browser/dnd'; import { getColorClass, getColorStyleElement, getStandardColors } from 'vs/workbench/contrib/terminal/browser/terminalIcon'; +import { IWorkbenchLayoutService, Position } from 'vs/workbench/services/layout/browser/layoutService'; import { Orientation } from 'vs/base/browser/ui/sash/sash'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; import { getTerminalResourcesFromDragEvent, getTerminalUri } from 'vs/workbench/contrib/terminal/browser/terminalUri'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -68,8 +69,15 @@ import { IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/work import { isFirefox } from 'vs/base/browser/browser'; import { TerminalLinkQuickpick } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkQuickpick'; import { fromNow } from 'vs/base/common/date'; -import { ICommandService } from 'vs/platform/commands/common/commands'; import { TerminalCapabilityStoreMultiplexer } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { ITextModel } from 'vs/editor/common/model'; +import { IModelService } from 'vs/editor/common/services/model'; +import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; +import { IDialogService, IConfirmationResult } from 'vs/platform/dialogs/common/dialogs'; +import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { Schemas } from 'vs/base/common/network'; +import { withNullAsUndefined } from 'vs/base/common/types'; const enum Constants { /** @@ -112,20 +120,39 @@ interface IGridDimensions { const scrollbarHeight = 5; +class TerminalOutputProvider implements ITextModelContentProvider { + static scheme = 'TERMINAL_OUTPUT'; + constructor( + @ITextModelService textModelResolverService: ITextModelService, + @IModelService private readonly _modelService: IModelService + ) { + textModelResolverService.registerTextModelContentProvider(TerminalOutputProvider.scheme, this); + } + async provideTextContent(resource: URI): Promise { + const existing = this._modelService.getModel(resource); + if (existing && !existing.isDisposed()) { + return existing; + } + + return this._modelService.createModel(resource.fragment, null, resource, false); + } +} + export class TerminalInstance extends Disposable implements ITerminalInstance { private static _lastKnownCanvasDimensions: ICanvasDimensions | undefined; private static _lastKnownGridDimensions: IGridDimensions | undefined; private static _instanceIdCounter = 1; - xterm?: XtermTerminal; - readonly capabilities = new TerminalCapabilityStoreMultiplexer(); + private readonly _processManager: ITerminalProcessManager; + private readonly _resource: URI; + // Enables disposal of the xterm onKey + // event when the CwdDetection capability + // is added + private _xtermOnKey: IDisposable | undefined; private _xtermReadyPromise: Promise; private _xtermTypeAheadAddon: TypeAheadAddon | undefined; - - private readonly _processManager: ITerminalProcessManager; private _pressAnyKeyToCloseListener: IDisposable | undefined; - private _instanceId: number; private _latestXtermWriteData: number = 0; private _latestXtermParseData: number = 0; @@ -157,38 +184,32 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { private _initialDataEvents: string[] | undefined = []; private _containerReadyBarrier: AutoOpenBarrier; private _attachBarrier: AutoOpenBarrier; - private _icon: TerminalIcon | undefined; - private _messageTitleDisposable: IDisposable | undefined; - private _widgetManager: TerminalWidgetManager = this._instantiationService.createInstance(TerminalWidgetManager); private _linkManager: TerminalLinkManager | undefined; - private _environmentInfo: { widget: EnvironmentVariableInfoWidget, disposable: IDisposable } | undefined; + private _environmentInfo: { widget: EnvironmentVariableInfoWidget; disposable: IDisposable } | undefined; private _navigationModeAddon: INavigationMode & ITerminalAddon | undefined; private _dndObserver: IDisposable | undefined; - - private readonly _resource: URI; - private _terminalLinkQuickpick: TerminalLinkQuickpick | undefined; - private _lastLayoutDimensions: dom.Dimension | undefined; - private _hasHadInput: boolean; - - readonly statusList: ITerminalStatusList; - disableLayout: boolean = false; - private _description?: string; private _processName: string = ''; private _sequence?: string; private _staticTitle?: string; - private _workspaceFolder?: string; + private _workspaceFolder?: IWorkspaceFolder; private _labelComputer?: TerminalLabelComputer; private _userHome?: string; private _hasScrollBar?: boolean; private _target?: TerminalLocation | undefined; + readonly capabilities = new TerminalCapabilityStoreMultiplexer(); + readonly statusList: ITerminalStatusList; + + xterm?: XtermTerminal; + disableLayout: boolean = false; + get target(): TerminalLocation | undefined { return this._target; } set target(value: TerminalLocation | undefined) { if (this.xterm) { @@ -236,7 +257,6 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { get areLinksReady(): boolean { return this._areLinksReady; } get initialDataEvents(): string[] | undefined { return this._initialDataEvents; } get exitCode(): number | undefined { return this._exitCode; } - get hadFocusOnExit(): boolean { return this._hadFocusOnExit; } get isTitleSetByProcess(): boolean { return !!this._messageTitleDisposable; } get shellLaunchConfig(): IShellLaunchConfig { return this._shellLaunchConfig; } @@ -250,20 +270,30 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { get titleSource(): TitleEventSource { return this._titleSource; } get icon(): TerminalIcon | undefined { return this._getIcon(); } get color(): string | undefined { return this._getColor(); } - get processName(): string { return this._processName; } get sequence(): string | undefined { return this._sequence; } get staticTitle(): string | undefined { return this._staticTitle; } - get workspaceFolder(): string | undefined { return this._workspaceFolder; } + get workspaceFolder(): IWorkspaceFolder | undefined { return this._workspaceFolder; } get cwd(): string | undefined { return this._cwd; } get initialCwd(): string | undefined { return this._initialCwd; } - get description(): string | undefined { return this._description || this.shellLaunchConfig.description; } + get description(): string | undefined { + if (this._description) { + return this._description; + } else if (this._shellLaunchConfig.type) { + if (this._shellLaunchConfig.type === 'Task') { + return nls.localize('terminalTypeTask', "Task"); + } else { + return nls.localize('terminalTypeLocal', "Local"); + } + } + return undefined; + } get userHome(): string | undefined { return this._userHome; } + // The onExit event is special in that it fires and is disposed after the terminal instance // itself is disposed - private readonly _onExit = new Emitter(); + private readonly _onExit = new Emitter(); readonly onExit = this._onExit.event; - private readonly _onDisposed = this._register(new Emitter()); readonly onDisposed = this._onDisposed.event; private readonly _onProcessIdReady = this._register(new Emitter()); @@ -317,6 +347,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { @IThemeService private readonly _themeService: IThemeService, @IConfigurationService private readonly _configurationService: IConfigurationService, @ILogService private readonly _logService: ILogService, + @IDialogService private readonly _dialogService: IDialogService, @IStorageService private readonly _storageService: IStorageService, @IAccessibilityService private readonly _accessibilityService: IAccessibilityService, @IProductService private readonly _productService: IProductService, @@ -325,7 +356,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, @IEditorService private readonly _editorService: IEditorService, @IWorkspaceTrustRequestService private readonly _workspaceTrustRequestService: IWorkspaceTrustRequestService, - @ICommandService private readonly _commandService: ICommandService + @IHistoryService private readonly _historyService: IHistoryService ) { super(); @@ -346,11 +377,36 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // the resource is already set when it's been moved from another window this._resource = resource || getTerminalUri(this._workspaceContextService.getWorkspace().id, this.instanceId, this.title); + if (this.shellLaunchConfig.cwd) { + const cwdUri = typeof this._shellLaunchConfig.cwd === 'string' ? URI.from({ + scheme: Schemas.file, + path: this._shellLaunchConfig.cwd + }) : this._shellLaunchConfig.cwd; + if (cwdUri) { + this._workspaceFolder = withNullAsUndefined(this._workspaceContextService.getWorkspaceFolder(cwdUri)); + } + } + if (!this._workspaceFolder) { + const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(); + this._workspaceFolder = activeWorkspaceRootUri ? withNullAsUndefined(this._workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri)) : undefined; + } + this._terminalHasTextContextKey = TerminalContextKeys.textSelected.bindTo(this._contextKeyService); this._terminalA11yTreeFocusContextKey = TerminalContextKeys.a11yTreeFocus.bindTo(this._contextKeyService); this._terminalAltBufferActiveContextKey = TerminalContextKeys.altBufferActive.bindTo(this._contextKeyService); this._logService.trace(`terminalInstance#ctor (instanceId: ${this.instanceId})`, this._shellLaunchConfig); + this._register(this.capabilities.onDidAddCapability(e => { + this._logService.debug('terminalInstance added capability', e); + if (e === TerminalCapability.CwdDetection) { + this.capabilities.get(TerminalCapability.CwdDetection)?.onDidChangeCwd((e) => { + this._cwd = e; + this._xtermOnKey?.dispose(); + this.refreshTabLabels(this.title, TitleEventSource.Config); + }); + } + })); + this._register(this.capabilities.onDidRemoveCapability(e => this._logService.debug('terminalInstance removed capability', e))); // Resolve just the icon ahead of time so that it shows up immediately in the tabs. This is // disabled in remote because this needs to be sync and the OS may differ on the remote @@ -378,6 +434,10 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this._xtermReadyPromise.then(async () => { // Wait for a period to allow a container to be ready await this._containerReadyBarrier.wait(); + if (this._configHelper.config.enableShellIntegration && !this.shellLaunchConfig.executable) { + const os = await this._processManager.getBackendOS(); + this.shellLaunchConfig.executable = (await this._terminalProfileResolverService.getDefaultProfile({ remoteAuthority: this.remoteAuthority, os })).path; + } await this._createProcess(); // Re-establish the title after reconnect @@ -466,8 +526,11 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } private _initDimensions(): void { - // The terminal panel needs to have been created + // The terminal panel needs to have been created to get the real view dimensions if (!this._container) { + // Set the fallback dimensions if not + this._cols = 80; + this._rows = 30; return; } @@ -558,7 +621,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } get persistentProcessId(): number | undefined { return this._processManager.persistentProcessId; } - get shouldPersist(): boolean { return this._processManager.shouldPersist && !this.shellLaunchConfig.disablePersistence; } + get shouldPersist(): boolean { return this._processManager.shouldPersist && !this.shellLaunchConfig.isTransient; } /** * Create xterm.js instance and attach data listeners. @@ -569,7 +632,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { throw new Error('Terminal disposed of during xterm.js creation'); } - const xterm = this._instantiationService.createInstance(XtermTerminal, Terminal, this._configHelper, this._cols, this._rows, this.target || TerminalLocation.Panel); + const xterm = this._instantiationService.createInstance(XtermTerminal, Terminal, this._configHelper, this._cols, this._rows, this.target || TerminalLocation.Panel, this.capabilities); this.xterm = xterm; const lineDataEventAddon = new LineDataEventAddon(); this.xterm.raw.loadAddon(lineDataEventAddon); @@ -597,7 +660,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } }); }, 1000); - xterm.raw.onKey(e => this._onKey(e.key, e.domEvent)); + this._xtermOnKey = xterm.raw.onKey(e => this._onKey(e.key, e.domEvent)); xterm.raw.onSelectionChange(async () => this._onSelectionChange()); xterm.raw.buffer.onBufferChange(() => this._refreshAltBufferContextKey()); @@ -626,7 +689,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { if (this._processManager.os === OperatingSystem.Windows) { xterm.raw.options.windowsMode = processTraits.requiresWindowsMode || false; } - this._linkManager = this._instantiationService.createInstance(TerminalLinkManager, xterm, this._processManager!, this.capabilities); + this._linkManager = this._instantiationService.createInstance(TerminalLinkManager, xterm.raw, this._processManager!, this.capabilities); this._areLinksReady = true; this._onLinksReady.fire(this); }); @@ -678,34 +741,25 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { if (!this.xterm) { throw new Error('no xterm'); } - const wordResults: ILink[] = []; - const webResults: ILink[] = []; - const fileResults: ILink[] = []; + return this._linkManager.getLinks(); + } - for (let i = this.xterm.raw.buffer.active.length - 1; i >= this.xterm.raw.buffer.active.viewportY; i--) { - const links = await this._linkManager.getLinks(i); - if (links) { - const { wordLinks, webLinks, fileLinks } = links; - if (wordLinks && wordLinks.length) { - wordResults!.push(...wordLinks.reverse()); - } - if (webLinks && webLinks.length) { - webResults!.push(...webLinks.reverse()); - } - if (fileLinks && fileLinks.length) { - fileResults!.push(...fileLinks.reverse()); - } - } + async openRecentLink(type: 'localFile' | 'url'): Promise { + if (!this.areLinksReady || !this._linkManager) { + throw new Error('terminal links are not ready, cannot open a link'); } - return { wordLinks: wordResults, webLinks: webResults, fileLinks: fileResults }; + if (!this.xterm) { + throw new Error('no xterm'); + } + this._linkManager.openRecentLink(type); } async runRecent(type: 'command' | 'cwd'): Promise { - const commands = this.xterm?.commandTracker.commands; + const commands = this.capabilities.get(TerminalCapability.CommandDetection)?.commands; if (!commands || !this.xterm) { return; } - type Item = IQuickPickItem & { command?: TerminalCommand }; + type Item = IQuickPickItem & { command?: ITerminalCommand }; const items: Item[] = []; if (type === 'command') { for (const { command, timestamp, cwd, exitCode, getOutput } of commands) { @@ -728,12 +782,18 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } } detail = detail.trim(); - const iconClass = exitCode ? `${ThemeIcon.asClassName(Codicon.x)}` : `${ThemeIcon.asClassName(Codicon.more)}`; + const iconClass = ThemeIcon.asClassName(Codicon.output); const buttons: IQuickInputButton[] = [{ iconClass, tooltip: nls.localize('viewCommandOutput', "View Command Output"), alwaysVisible: true }]; + // Merge consecutive commands + if (items.length > 0 && items[items.length - 1].label === label) { + items[items.length - 1].id = timestamp.toString(); + items[items.length - 1].detail = detail; + continue; + } items.push({ label, description: fromNow(timestamp, true), @@ -744,24 +804,42 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { }); } } else { - const cwds = this.xterm.commandTracker.cwds; + const cwds = this.capabilities.get(TerminalCapability.CwdDetection)?.cwds || []; for (const label of cwds) { items.push({ label }); } } - const result = await this._quickInputService.pick(items.reverse(), { - onDidTriggerItemButton: (async e => { - const output = e.item.command?.getOutput(); - if (output) { - await this._clipboardService.writeText(output); - await this._commandService.executeCommand('workbench.action.files.newUntitledFile'); - await this._commandService.executeCommand('editor.action.clipboardPasteAction'); + const outputProvider = this._instantiationService.createInstance(TerminalOutputProvider); + const quickPick = this._quickInputService.createQuickPick(); + quickPick.items = items.reverse(); + return new Promise(r => { + quickPick.onDidTriggerItemButton(async e => { + const selectedCommand = (e.item as Item).command; + const output = selectedCommand?.getOutput(); + if (output && selectedCommand?.command) { + const textContent = await outputProvider.provideTextContent(URI.from( + { + scheme: TerminalOutputProvider.scheme, + path: `${selectedCommand.command}... ${fromNow(selectedCommand.timestamp, true)}`, + fragment: output, + query: `terminal-output-${selectedCommand.timestamp}-${this.instanceId}` + })); + if (textContent) { + await this._editorService.openEditor({ + resource: textContent.uri + }); + } } - }) + quickPick.hide(); + }); + quickPick.onDidAccept(e => { + const result = quickPick.activeItems[0]; + this.sendText(type === 'cwd' ? `cd ${result.label}` : result.label, true); + quickPick.hide(); + }); + quickPick.show(); + quickPick.onDidHide(() => r()); }); - if (result) { - this.sendText(type === 'cwd' ? `cd ${result.label}` : result.label, true); - } } detachFromElement(): void { @@ -936,7 +1014,6 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this._widgetManager.attachToElement(xterm.raw.element); this._processManager.onProcessReady((e) => { this._linkManager?.setWidgetManager(this._widgetManager); - this._workspaceFolder = path.basename(e.cwd.toString()); }); // const computedStyle = window.getComputedStyle(this._container); @@ -1006,6 +1083,47 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this._terminalAltBufferActiveContextKey.set(!!(this.xterm && this.xterm.raw.buffer.active === this.xterm.raw.buffer.alternate)); } + private async _shouldPasteText(text: string): Promise { + const textForLines = text.split(/\r?\n/); + let confirmation: IConfirmationResult; + + // If the clipboard has only one line, no prompt will be triggered + if (textForLines.length === 1 || !this._configurationService.getValue(TerminalSettingId.EnableMultiLinePasteWarning)) { + return true; + } + + const displayItemsCount = 3; + const maxPreviewLineLength = 30; + + let detail = 'Preview:'; + for (let i = 0; i < Math.min(textForLines.length, displayItemsCount); i++) { + const line = textForLines[i]; + const cleanedLine = line.length > maxPreviewLineLength ? `${line.slice(0, maxPreviewLineLength)}…` : line; + detail += `\n${cleanedLine}`; + } + + if (textForLines.length > displayItemsCount) { + detail += `\n…`; + } + + confirmation = await this._dialogService.confirm({ + type: 'question', + message: nls.localize('confirmMoveTrashMessageFilesAndDirectories', "Are you sure you want to paste {0} lines of text into the terminal?", textForLines.length), + detail, + primaryButton: nls.localize({ key: 'multiLinePasteButton', comment: ['&& denotes a mnemonic'] }, "&&Paste"), + checkbox: { + label: nls.localize('doNotAskAgain', "Do not ask me again") + } + }); + + if (confirmation.confirmed && confirmation.checkboxChecked) { + await this._configurationService.updateValue(TerminalSettingId.EnableMultiLinePasteWarning, false); + } + + return confirmation.confirmed; + } + + override dispose(immediate?: boolean): void { this._logService.trace(`terminalInstance#dispose (instanceId: ${this.instanceId})`); dispose(this._linkManager); @@ -1084,16 +1202,28 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { if (!this.xterm) { return; } + + let currentText: string = await this._clipboardService.readText(); + if (!await this._shouldPasteText(currentText)) { + return; + } + this.focus(); - this.xterm.raw.paste(await this._clipboardService.readText()); + this.xterm.raw.paste(currentText); } async pasteSelection(): Promise { if (!this.xterm) { return; } + + let currentText: string = await this._clipboardService.readText('selection'); + if (!await this._shouldPasteText(currentText)) { + return; + } + this.focus(); - this.xterm.raw.paste(await this._clipboardService.readText('selection')); + this.xterm.raw.paste(currentText); } async sendText(text: string, addNewLine: boolean): Promise { @@ -1210,7 +1340,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { case ProcessPropertyType.InitialCwd: this._initialCwd = value; this._cwd = this._initialCwd; - this.refreshTabLabels(this.title, TitleEventSource.Api); + this.refreshTabLabels(this.title, TitleEventSource.Config); break; case ProcessPropertyType.Title: this.refreshTabLabels(value ? value : '', TitleEventSource.Process); @@ -1260,10 +1390,17 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { if (this._isDisposed) { return; } - - const trusted = await this._trust(); - if (!trusted) { - this._onProcessExit({ message: nls.localize('workspaceNotTrustedCreateTerminal', "Cannot launch a terminal process in an untrusted workspace") }); + const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(Schemas.file); + if (activeWorkspaceRootUri) { + const trusted = await this._trust(); + if (!trusted) { + this._onProcessExit({ message: nls.localize('workspaceNotTrustedCreateTerminal', "Cannot launch a terminal process in an untrusted workspace") }); + } + } else if (this._cwd && this._userHome && this._cwd !== this._userHome) { + // something strange is going on if cwd is not userHome in an empty workspace + this._onProcessExit({ + message: nls.localize('workspaceNotTrustedCreateTerminalCwd', "Cannot launch a terminal process in an untrusted workspace with cwd {0} and userHome {1}", this._cwd, this._userHome) + }); } // Re-evaluate dimensions if the container has been set since the xterm instance was created @@ -1273,15 +1410,13 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } const hadIcon = !!this.shellLaunchConfig.icon; - const shellIntegration = this._updateArgsForShellIntegration(this.shellLaunchConfig); - this.shellLaunchConfig.args = shellIntegration.args; - const enableShellIntegration = shellIntegration.enableShellIntegration; + await this._processManager.createProcess(this._shellLaunchConfig, this._cols || Constants.DefaultCols, this._rows || Constants.DefaultRows, this._accessibilityService.isScreenReaderOptimized()).then(error => { if (error) { - this._onProcessExit(error, enableShellIntegration); + this._onProcessExit(error, error.code === ShellIntegrationExitCode); } }); - if (enableShellIntegration && this.xterm?.shellIntegration) { + if (this.xterm?.shellIntegration) { this.capabilities.add(this.xterm?.shellIntegration.capabilities); } if (!hadIcon && this.shellLaunchConfig.icon || this.shellLaunchConfig.color) { @@ -1289,38 +1424,6 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } } - private _updateArgsForShellIntegration(shellLaunchConfig: IShellLaunchConfig): { args: string | string[] | undefined, enableShellIntegration: boolean } { - const originalArgs = shellLaunchConfig.args; - if (!this._configHelper.config.enableShellIntegration || !shellLaunchConfig.executable) { - return { args: originalArgs, enableShellIntegration: false }; - } - const shell = path.basename(shellLaunchConfig.executable); - let newArgs: string | string[] | undefined; - // TODO: Use backend OS - if (isWindows) { - if (shell === 'pwsh' && !originalArgs) { - newArgs = [ - '-noexit', - '-command', - '. \"${execInstallFolder}\\out\\vs\\workbench\\contrib\\terminal\\browser\\media\\shellIntegration.ps1\"' - ]; - } - } else { - // TODO: Read current args, only enable if they are recognized (ie. [] and ["-l"]), warn otherwise - switch (shell) { - case 'bash': - newArgs = ['--init-file', '${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/ShellIntegration-bash.sh']; - break; - case 'pwsh': - newArgs = ['-noexit', '-command', '. "${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1"']; - break; - case 'zsh': - newArgs = ['-c', '${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/ShellIntegration-zsh.sh; zsh -il']; - break; - } - } - return { args: newArgs || originalArgs, enableShellIntegration: newArgs !== undefined }; - } private _onProcessData(ev: IProcessDataEvent): void { const messageId = ++this._latestXtermWriteData; if (ev.trackCommit) { @@ -1398,7 +1501,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } // First onExit to consumers, this can happen after the terminal has already been disposed. - this._onExit.fire(this._exitCode); + this._onExit.fire(exitCodeOrError); // Dispose of the onExit event if the terminal will not be reused again if (this._isDisposed) { @@ -1485,6 +1588,11 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this._xtermTypeAheadAddon?.reset(); } + async setEscapeSequenceLogging(enable: boolean): Promise { + const xterm = await this._xtermReadyPromise; + xterm.raw.options.logLevel = enable ? 'debug' : 'info'; + } + @debounce(1000) relaunch(): void { this.reuseTerminal(this._shellLaunchConfig, true); @@ -1521,14 +1629,14 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { @debounce(2000) private async _updateProcessCwd(): Promise { + if (this._isDisposed) { + return this.cwd || this._initialCwd || ''; + } // reset cwd if it has changed, so file based url paths can be resolved const cwd = await this.refreshProperty(ProcessPropertyType.Cwd); if (typeof cwd !== 'string') { throw new Error('cwd is not a string'); } - if (cwd && this._linkManager) { - this._linkManager.processCwd = cwd; - } return cwd; } @@ -1964,7 +2072,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { if (!this._linkManager) { throw new Error('TerminalInstance.registerLinkProvider before link manager was ready'); } - return this._linkManager.registerExternalLinkProvider(this, provider); + // Avoid a circular dependency by binding the terminal instances to the external link provider + return this._linkManager.registerExternalLinkProvider(provider.provideLinks.bind(provider, this)); } async rename(title?: string | 'triggerQuickpick') { @@ -2043,6 +2152,7 @@ class TerminalInstanceDragAndDropController extends Disposable implements IDragA constructor( private readonly _container: HTMLElement, + @IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService, @IViewDescriptorService private readonly _viewDescriptorService: IViewDescriptorService, ) { super(); @@ -2153,8 +2263,9 @@ class TerminalInstanceDragAndDropController extends Disposable implements IDragA } private _getViewOrientation(): Orientation { + const panelPosition = this._layoutService.getPanelPosition(); const terminalLocation = this._viewDescriptorService.getViewLocationById(TERMINAL_VIEW_ID); - return terminalLocation === ViewContainerLocation.Panel + return terminalLocation === ViewContainerLocation.Panel && panelPosition === Position.BOTTOM ? Orientation.HORIZONTAL : Orientation.VERTICAL; } @@ -2231,7 +2342,7 @@ export class TerminalLabelComputer extends Disposable { get title(): string | undefined { return this._title; } get description(): string | undefined { return this._description; } - private readonly _onDidChangeLabel = this._register(new Emitter<{ title: string, description: string }>()); + private readonly _onDidChangeLabel = this._register(new Emitter<{ title: string; description: string }>()); readonly onDidChangeLabel = this._onDidChangeLabel.event; constructor( private readonly _configHelper: TerminalConfigHelper, @@ -2257,11 +2368,11 @@ export class TerminalLabelComputer extends Disposable { const templateProperties: ITerminalLabelTemplateProperties = { cwd: this._instance.cwd || this._instance.initialCwd || '', cwdFolder: '', - workspaceFolder: this._instance.workspaceFolder, - local: this._instance.shellLaunchConfig.description === 'Local' ? 'Local' : undefined, + workspaceFolder: this._instance.workspaceFolder ? path.basename(this._instance.workspaceFolder.uri.fsPath) : undefined, + local: this._instance.shellLaunchConfig.type === 'Local' ? this._instance.shellLaunchConfig.type : undefined, process: this._instance.processName, sequence: this._instance.sequence, - task: this._instance.shellLaunchConfig.description === 'Task' ? 'Task' : undefined, + task: this._instance.shellLaunchConfig.type === 'Task' ? this._instance.shellLaunchConfig.type : undefined, fixedDimensions: this._instance.fixedCols ? (this._instance.fixedRows ? `\u2194${this._instance.fixedCols} \u2195${this._instance.fixedRows}` : `\u2194${this._instance.fixedCols}`) : (this._instance.fixedRows ? `\u2195${this._instance.fixedRows}` : ''), @@ -2275,12 +2386,21 @@ export class TerminalLabelComputer extends Disposable { return this._instance.staticTitle.replace(/[\n\r\t]/g, '') || templateProperties.process?.replace(/[\n\r\t]/g, '') || ''; } const detection = this._instance.capabilities.has(TerminalCapability.CwdDetection) || this._instance.capabilities.has(TerminalCapability.NaiveCwdDetection); - const zeroRootWorkspace = this._workspaceContextService.getWorkspace().folders.length === 0 && this.pathsEqual(templateProperties.cwd, this._instance.userHome || this._configHelper.config.cwd); - const singleRootWorkspace = this._workspaceContextService.getWorkspace().folders.length === 1 && this.pathsEqual(templateProperties.cwd, this._configHelper.config.cwd || this._workspaceContextService.getWorkspace().folders[0]?.uri.fsPath); - templateProperties.cwdFolder = (!templateProperties.cwd || !detection || zeroRootWorkspace || singleRootWorkspace) ? '' : path.basename(templateProperties.cwd); + const folders = this._workspaceContextService.getWorkspace().folders; + const multiRootWorkspace = folders.length > 1; + + // Only set cwdFolder if detection is on + if (templateProperties.cwd && detection) { + const cwdUri = URI.from({ scheme: this._instance.workspaceFolder?.uri.scheme || Schemas.file, path: this._instance.cwd }); + // Multi-root workspaces always show cwdFolder to disambiguate them, otherwise only show + // when it differs from the workspace folder in which it was launched from + if (multiRootWorkspace || cwdUri.fsPath !== this._instance.workspaceFolder?.uri.fsPath) { + templateProperties.cwdFolder = path.basename(templateProperties.cwd); + } + } //Remove special characters that could mess with rendering - let label = template(labelTemplate, (templateProperties as unknown) as { [key: string]: string | ISeparator | undefined | null; }).replace(/[\n\r\t]/g, '').trim(); + let label = template(labelTemplate, (templateProperties as unknown) as { [key: string]: string | ISeparator | undefined | null }).replace(/[\n\r\t]/g, '').trim(); return label === '' && labelType === TerminalLabelType.Title ? (this._instance.processName || '') : label; } @@ -2312,7 +2432,7 @@ export function parseExitResult( processState: ProcessState, initialCwd: string | undefined, shellIntegrationAttempted?: boolean -): { code: number | undefined, message: string | undefined } | undefined { +): { code: number | undefined; message: string | undefined } | undefined { // Only return a message if the exit code is non-zero if (exitCodeOrError === undefined || exitCodeOrError === 0) { return { code: exitCodeOrError, message: undefined }; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts index e02e162109c..94bbabfc054 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts @@ -12,7 +12,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionTerminalProfile, ITerminalProfile, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; 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'; @@ -701,11 +701,11 @@ export function setupTerminalMenus(): void { } export function getTerminalActionBarArgs(location: ITerminalLocationOptions, profiles: ITerminalProfile[], defaultProfileName: string, contributedProfiles: readonly IExtensionTerminalProfile[], instantiationService: IInstantiationService, terminalService: ITerminalService, contextKeyService: IContextKeyService, commandService: ICommandService, dropdownMenu: IMenu): { - primaryAction: MenuItemAction, - dropdownAction: IAction, - dropdownMenuActions: IAction[], - className: string, - dropdownIcon?: string + primaryAction: MenuItemAction; + dropdownAction: IAction; + dropdownMenuActions: IAction[]; + className: string; + dropdownIcon?: string; } { let dropdownActions: IAction[] = []; let submenuActions: IAction[] = []; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts index 06a6f3f4d70..0f9d9bc942d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts @@ -24,8 +24,8 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal readonly onInput: Event = this._onInput.event; private readonly _onBinary = this._register(new Emitter()); readonly onBinary: Event = this._onBinary.event; - private readonly _onResize: Emitter<{ cols: number, rows: number }> = this._register(new Emitter<{ cols: number, rows: number }>()); - readonly onResize: Event<{ cols: number, rows: number }> = this._onResize.event; + private readonly _onResize: Emitter<{ cols: number; rows: number }> = this._register(new Emitter<{ cols: number; rows: number }>()); + readonly onResize: Event<{ cols: number; rows: number }> = this._onResize.event; private readonly _onAcknowledgeDataEvent = this._register(new Emitter()); readonly onAcknowledgeDataEvent: Event = this._onAcknowledgeDataEvent.event; private readonly _onShutdown = this._register(new Emitter()); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index 929c2463190..72540a89227 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -21,7 +21,7 @@ import { withNullAsUndefined } from 'vs/base/common/types'; import { EnvironmentVariableInfoChangesActive, EnvironmentVariableInfoStale } from 'vs/workbench/contrib/terminal/browser/environmentVariableInfo'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IEnvironmentVariableInfo, IEnvironmentVariableService, IMergedEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; -import { IProcessDataEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalEnvironment, ITerminalLaunchError, FlowControlConstants, ITerminalDimensions, IProcessReadyEvent, IProcessProperty, ProcessPropertyType, IProcessPropertyMap, TerminalCapability } from 'vs/platform/terminal/common/terminal'; +import { IProcessDataEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalEnvironment, ITerminalLaunchError, FlowControlConstants, ITerminalDimensions, IProcessReadyEvent, IProcessProperty, ProcessPropertyType, IProcessPropertyMap } from 'vs/platform/terminal/common/terminal'; import { TerminalRecorder } from 'vs/platform/terminal/common/terminalRecorder'; import { localize } from 'vs/nls'; import { formatMessageForTerminal } from 'vs/workbench/contrib/terminal/common/terminalStrings'; @@ -30,6 +30,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; import { NaiveCwdDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/naiveCwdDetectionCapability'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; @@ -62,6 +63,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce isDisconnected: boolean = false; environmentVariableInfo: IEnvironmentVariableInfo | undefined; backend: ITerminalBackend | undefined; + shellIntegrationAttempted: boolean = false; readonly capabilities = new TerminalCapabilityStore(); private _isDisposed: boolean = false; @@ -224,9 +226,9 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce this.os = remoteEnv.os; // this is a copy of what the merged environment collection is on the remote side - await this._resolveEnvironment(backend, variableResolver, shellLaunchConfig); + const env = await this._resolveEnvironment(backend, variableResolver, shellLaunchConfig); - const shouldPersist = !shellLaunchConfig.isFeatureTerminal && this._configHelper.config.enablePersistentSessions && !shellLaunchConfig.disablePersistence; + const shouldPersist = !shellLaunchConfig.isFeatureTerminal && this._configHelper.config.enablePersistentSessions && !shellLaunchConfig.isTransient; if (shellLaunchConfig.attachPersistentProcess) { const result = await backend.attachToProcess(shellLaunchConfig.attachPersistentProcess.id); if (result) { @@ -241,13 +243,29 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce os: this.os }); try { + const shellIntegration = terminalEnvironment.injectShellIntegrationArgs(this._logService, this._configurationService, env, this._configHelper.config.enableShellIntegration, shellLaunchConfig, this.os); + this.shellIntegrationAttempted = shellIntegration.enableShellIntegration; + if (this.shellIntegrationAttempted) { + shellLaunchConfig.args = shellIntegration.args; + // resolve the injected arguments + await this._terminalProfileResolverService.resolveShellLaunchConfig(shellLaunchConfig, { + remoteAuthority: this.remoteAuthority, + os: this.os + }); + } + //TODO: fix + if (env?.['VSCODE_SHELL_LOGIN']) { + shellLaunchConfig.env = shellLaunchConfig.env || {} as IProcessEnvironment; + shellLaunchConfig.env['VSCODE_SHELL_LOGIN'] = '1'; + } + newProcess = await backend.createProcess( shellLaunchConfig, '', // TODO: Fix cwd cols, rows, this._configHelper.config.unicodeVersion, - {}, // TODO: Fix env + env, // TODO: true, // TODO: Fix enable shouldPersist ); @@ -415,6 +433,16 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce const env = await this._resolveEnvironment(backend, variableResolver, shellLaunchConfig); + const shellIntegration = terminalEnvironment.injectShellIntegrationArgs(this._logService, this._configurationService, env, this._configHelper.config.enableShellIntegration, shellLaunchConfig, OS); + if (shellIntegration.enableShellIntegration) { + shellLaunchConfig.args = shellIntegration.args; + // resolve the injected arguments + await this._terminalProfileResolverService.resolveShellLaunchConfig(shellLaunchConfig, { + remoteAuthority: undefined, + os: OS + }); + } + this.shellIntegrationAttempted = shellIntegration.enableShellIntegration; const useConpty = this._configHelper.config.windowsEnableConpty && !isScreenReaderModeEnabled; const shouldPersist = this._configHelper.config.enablePersistentSessions && !shellLaunchConfig.isFeatureTerminal; return await backend.createProcess(shellLaunchConfig, initialCwd, cols, rows, this._configHelper.config.unicodeVersion, env, useConpty, shouldPersist); @@ -467,6 +495,18 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce })); } + async getBackendOS(): Promise { + let os = OS; + if (!!this.remoteAuthority) { + const remoteEnv = await this._remoteAgentService.getEnvironment(); + if (!remoteEnv) { + throw new Error(`Failed to get remote environment for remote authority "${this.remoteAuthority}"`); + } + os = remoteEnv.os; + } + return os; + } + setDimensions(cols: number, rows: number): Promise; setDimensions(cols: number, rows: number, sync: false): Promise; setDimensions(cols: number, rows: number, sync: true): void; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProfileQuickpick.ts b/src/vs/workbench/contrib/terminal/browser/terminalProfileQuickpick.ts index 58b112505bd..e715b730b66 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProfileQuickpick.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProfileQuickpick.ts @@ -251,5 +251,5 @@ export interface IProfileQuickPickItem extends IQuickPickItem { } export interface ITerminalQuickPickItem extends IPickerQuickAccessItem { - terminal: ITerminalInstance + terminal: ITerminalInstance; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts b/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts index dfe9ddaa1f4..5885b71b3a3 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts @@ -181,7 +181,7 @@ export abstract class BaseTerminalProfileResolverService implements ITerminalPro return URI.revive(icon); } if (typeof icon === 'object' && icon && 'light' in icon && 'dark' in icon) { - const castedIcon = (icon as { light: unknown, dark: unknown }); + const castedIcon = (icon as { light: unknown; dark: unknown }); if ((URI.isUri(castedIcon.light) || isUriComponents(castedIcon.light)) && (URI.isUri(castedIcon.dark) || isUriComponents(castedIcon.dark))) { return { light: URI.revive(castedIcon.light), dark: URI.revive(castedIcon.dark) }; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 9bef2c44b6d..c5b97998d6c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -11,18 +11,17 @@ import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { isMacintosh, isWeb } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import * as nls from 'vs/nls'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ICreateContributedTerminalProfileOptions, IShellLaunchConfig, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalLocation, TerminalLocationString } from 'vs/platform/terminal/common/terminal'; import { iconForeground } from 'vs/platform/theme/common/colorRegistry'; import { getIconRegistry } from 'vs/platform/theme/common/iconRegistry'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { IThemeService, Themable, ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { VirtualWorkspaceContext } from 'vs/workbench/browser/contextkeys'; +import { VirtualWorkspaceContext } from 'vs/workbench/common/contextkeys'; import { IEditableData, IViewsService } from 'vs/workbench/common/views'; import { ICreateTerminalOptions, IRequestAddInstanceToGroupEvent, ITerminalEditorService, ITerminalExternalLinkProvider, ITerminalFindHost, ITerminalGroup, ITerminalGroupService, ITerminalInstance, ITerminalInstanceHost, ITerminalInstanceService, ITerminalLocationOptions, ITerminalService, ITerminalServiceNativeDelegate, TerminalConnectionState, TerminalEditorLocation } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; @@ -43,6 +42,9 @@ import { TerminalProfileQuickpick } from 'vs/workbench/contrib/terminal/browser/ import { IKeyMods } from 'vs/base/parts/quickinput/common/quickInput'; import { ILogService } from 'vs/platform/log/common/log'; import { TerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorInput'; +import { getCwdForSplit } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { ICommandService } from 'vs/platform/commands/common/commands'; export class TerminalService implements ITerminalService { declare _serviceBrand: undefined; @@ -51,6 +53,8 @@ export class TerminalService implements ITerminalService { private _terminalEditorActive: IContextKey; + private _escapeSequenceLoggingEnabled: boolean = false; + private _isShuttingDown: boolean = false; private _backgroundedTerminalInstances: ITerminalInstance[] = []; private _backgroundedTerminalDisposables: Map = new Map(); @@ -69,7 +73,7 @@ export class TerminalService implements ITerminalService { private _nativeDelegate?: ITerminalServiceNativeDelegate; private _shutdownWindowCount?: number; - private _editable: { instance: ITerminalInstance, data: IEditableData } | undefined; + private _editable: { instance: ITerminalInstance; data: IEditableData } | undefined; get isProcessSupportRegistered(): boolean { return !!this._processSupportContextKey.get(); } get connectionState(): TerminalConnectionState { return this._connectionState; } @@ -113,6 +117,8 @@ export class TerminalService implements ITerminalService { get onDidChangeInstanceDimensions(): Event { return this._onDidChangeInstanceDimensions.event; } private readonly _onDidMaxiumumDimensionsChange = new Emitter(); get onDidMaximumDimensionsChange(): Event { return this._onDidMaxiumumDimensionsChange.event; } + private readonly _onDidChangeInstanceCapability = new Emitter(); + get onDidChangeInstanceCapability(): Event { return this._onDidChangeInstanceCapability.event; } private readonly _onDidChangeInstances = new Emitter(); get onDidChangeInstances(): Event { return this._onDidChangeInstances.event; } private readonly _onDidChangeInstanceTitle = new Emitter(); @@ -145,14 +151,15 @@ export class TerminalService implements ITerminalService { @IRemoteAgentService private _remoteAgentService: IRemoteAgentService, @IViewsService private _viewsService: IViewsService, @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService, - @ITelemetryService private readonly _telemetryService: ITelemetryService, @ITerminalEditorService private readonly _terminalEditorService: ITerminalEditorService, @ITerminalGroupService private readonly _terminalGroupService: ITerminalGroupService, @ITerminalInstanceService private readonly _terminalInstanceService: ITerminalInstanceService, @IEditorGroupsService private readonly _editorGroupsService: IEditorGroupsService, @ITerminalProfileService private readonly _terminalProfileService: ITerminalProfileService, @IExtensionService private readonly _extensionService: IExtensionService, - @INotificationService private readonly _notificationService: INotificationService + @INotificationService private readonly _notificationService: INotificationService, + @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, + @ICommandService private readonly _commandService: ICommandService ) { this._configHelper = this._instantiationService.createInstance(TerminalConfigHelper); // the below avoids having to poll routinely. @@ -164,6 +171,7 @@ export class TerminalService implements ITerminalService { this._forwardInstanceHostEvents(this._terminalEditorService); this._terminalGroupService.onDidChangeActiveGroup(this._onDidChangeActiveGroup.fire, this._onDidChangeActiveGroup); this._terminalInstanceService.onDidCreateInstance(instance => { + instance.setEscapeSequenceLogging(this._escapeSequenceLoggingEnabled); this._initInstanceListeners(instance); this._onDidCreateInstance.fire(instance); }); @@ -221,7 +229,7 @@ export class TerminalService implements ITerminalService { } else if (result.config && 'profileName' in result.config) { if (keyMods?.alt && activeInstance) { // create split, only valid if there's an active instance - instance = await this.createTerminal({ location: { parentTerminal: activeInstance }, config: result.config }); + instance = await this.createTerminal({ location: { parentTerminal: activeInstance }, config: result.config, cwd }); } else { instance = await this.createTerminal({ location: this.defaultLocation, config: result.config, cwd }); } @@ -288,6 +296,7 @@ export class TerminalService implements ITerminalService { this._onDidFocusInstance.fire(instance); this._evaluateActiveInstance(host, instance); }); + host.onDidChangeInstanceCapability(this._onDidChangeInstanceCapability.fire, this.onDidChangeInstanceCapability); this._hostActiveTerminals.set(host, undefined); } @@ -371,16 +380,7 @@ export class TerminalService implements ITerminalService { } const layoutInfo = await backend.getTerminalLayoutInfo(); backend.reduceConnectionGraceTime(); - const reconnectCounter = await this._recreateTerminalGroups(layoutInfo); - /* __GDPR__ - "terminalReconnection" : { - "count" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } - } - */ - const data = { - count: reconnectCounter - }; - this._telemetryService.publicLog('terminalReconnection', data); + await this._recreateTerminalGroups(layoutInfo); // now that terminals have been restored, // attach listeners to update remote when terminals are changed this._attachProcessLayoutListeners(); @@ -442,6 +442,17 @@ export class TerminalService implements ITerminalService { return reconnectCounter; } + async toggleEscapeSequenceLogging(): Promise { + if (this.instances.length === 0) { + return; + } + this._escapeSequenceLoggingEnabled = await this.instances[0].toggleEscapeSequenceLogging(); + for (let i = 1; i < this.instances.length; i++) { + this.instances[i].setEscapeSequenceLogging(this._escapeSequenceLoggingEnabled); + } + await this._toggleDevTools(this._escapeSequenceLoggingEnabled); + } + private _attachProcessLayoutListeners(): void { this.onDidChangeActiveGroup(() => this._saveState()); this.onDidChangeActiveInstance(() => this._saveState()); @@ -550,13 +561,14 @@ export class TerminalService implements ITerminalService { this._nativeDelegate = nativeDelegate; } - async toggleDevTools(open?: boolean): Promise { + private async _toggleDevTools(open?: boolean): Promise { if (open) { this._nativeDelegate?.openDevTools(); } else { this._nativeDelegate?.toggleDevTools(); } } + private _shouldReviveProcesses(reason: ShutdownReason): boolean { if (!this._configHelper.config.enablePersistentSessions) { return false; @@ -919,11 +931,14 @@ export class TerminalService implements ITerminalService { contributedProfile = await this._terminalProfileService.getContributedDefaultProfile(shellLaunchConfig); } + const splitActiveTerminal = typeof options?.location === 'object' && 'splitActiveTerminal' in options.location ? options.location.splitActiveTerminal : typeof options?.location === 'object' ? 'parentTerminal' in options.location : false; + + this._resolveCwd(shellLaunchConfig, splitActiveTerminal, options); + // Launch the contributed profile if (contributedProfile) { const resolvedLocation = this.resolveLocation(options?.location); - const splitActiveTerminal = typeof options?.location === 'object' && 'splitActiveTerminal' in options.location ? options.location.splitActiveTerminal : typeof options?.location === 'object' ? 'parentTerminal' in options.location : false; - let location: TerminalLocation | { viewColumn: number, preserveState?: boolean } | { splitActiveTerminal: boolean } | undefined; + let location: TerminalLocation | { viewColumn: number; preserveState?: boolean } | { splitActiveTerminal: boolean } | undefined; if (splitActiveTerminal) { location = resolvedLocation === TerminalLocation.Editor ? { viewColumn: SIDE_GROUP } : { splitActiveTerminal: true }; } else { @@ -941,10 +956,6 @@ export class TerminalService implements ITerminalService { return instance; } - if (options?.cwd) { - shellLaunchConfig.cwd = options.cwd; - } - if (!shellLaunchConfig.customPtyImplementation && !this.isProcessSupportRegistered) { throw new Error('Could not create terminal when process support is not registered'); } @@ -968,6 +979,24 @@ export class TerminalService implements ITerminalService { return this._createTerminal(shellLaunchConfig, location, options); } + private async _resolveCwd(shellLaunchConfig: IShellLaunchConfig, splitActiveTerminal: boolean, options?: ICreateTerminalOptions): Promise { + let cwd = shellLaunchConfig.cwd; + if (!cwd) { + if (options?.cwd) { + shellLaunchConfig.cwd = options.cwd; + } else if (splitActiveTerminal && options?.location) { + let parent = this.activeInstance; + if (typeof options.location === 'object' && 'parentTerminal' in options.location) { + parent = options.location.parentTerminal; + } + if (!parent) { + throw new Error('Cannot split without an active instance'); + } + shellLaunchConfig.cwd = await getCwdForSplit(this.configHelper, parent, this._workspaceContextService.getWorkspace().folders, this._commandService); + } + } + } + private _splitTerminal(shellLaunchConfig: IShellLaunchConfig, location: TerminalLocation, parent: ITerminalInstance): ITerminalInstance { let instance; // Use the URI from the base instance if it exists, this will correctly split local terminals @@ -1049,10 +1078,10 @@ export class TerminalService implements ITerminalService { if (typeof shellLaunchConfig.cwd !== 'string' && shellLaunchConfig.cwd?.scheme === Schemas.file) { if (VirtualWorkspaceContext.getValue(this._contextKeyService)) { shellLaunchConfig.initialText = formatMessageForTerminal(nls.localize('localTerminalVirtualWorkspace', "⚠ : This shell is open to a {0}local{1} folder, NOT to the virtual folder", '\x1b[3m', '\x1b[23m'), true); - shellLaunchConfig.description = nls.localize('localTerminalDescription', "Local"); + shellLaunchConfig.type = 'Local'; } else if (this._remoteAgentService.getConnection()) { shellLaunchConfig.initialText = formatMessageForTerminal(nls.localize('localTerminalRemote', "⚠ : This shell is running on your {0}local{1} machine, NOT on the connected remote machine", '\x1b[3m', '\x1b[23m'), true); - shellLaunchConfig.description = nls.localize('localTerminalDescription', "Local"); + shellLaunchConfig.type = 'Local'; } } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts index 3b03cbcd714..c0ba0a11000 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabbedView.ts @@ -28,9 +28,15 @@ import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/termin const $ = dom.$; -const FIND_FOCUS_CLASS = 'find-focused'; -const STATUS_ICON_WIDTH = 30; -const SPLIT_ANNOTATION_WIDTH = 30; +const enum CssClass { + ViewIsVertical = 'terminal-side-view', + FindFocus = 'find-focused' +} + +const enum WidthConstants { + StatusIcon = 30, + SplitAnnotation = 30 +} export class TerminalTabbedView extends Disposable { @@ -129,13 +135,18 @@ export class TerminalTabbedView extends Disposable { this._register(this._themeService.onDidColorThemeChange(theme => this._updateTheme(theme))); this._updateTheme(); - this._findWidget.focusTracker.onDidFocus(() => this._terminalContainer.classList.add(FIND_FOCUS_CLASS)); - this._findWidget.focusTracker.onDidBlur(() => this._terminalContainer.classList.remove(FIND_FOCUS_CLASS)); + this._findWidget.focusTracker.onDidFocus(() => this._terminalContainer.classList.add(CssClass.FindFocus)); + this._findWidget.focusTracker.onDidBlur(() => this._terminalContainer.classList.remove(CssClass.FindFocus)); this._attachEventListeners(parentElement, this._terminalContainer); this._terminalGroupService.onDidChangePanelOrientation((orientation) => { this._panelOrientation = orientation; + if (this._panelOrientation === Orientation.VERTICAL) { + this._terminalContainer.classList.add(CssClass.ViewIsVertical); + } else { + this._terminalContainer.classList.remove(CssClass.ViewIsVertical); + } }); this._splitView = new SplitView(parentElement, { orientation: Orientation.HORIZONTAL, proportionalLayout: false }); @@ -171,7 +182,7 @@ export class TerminalTabbedView extends Disposable { this._addTabTree(); this._addSashListener(); this._splitView.resizeView(this._tabTreeIndex, this._getLastListWidth()); - this._rerenderTabs(); + this.rerenderTabs(); } } else { if (this._splitView.length === 2 && !this._terminalTabsMouseContextKey.get()) { @@ -223,8 +234,8 @@ export class TerminalTabbedView extends Disposable { private _getAdditionalWidth(instance: ITerminalInstance): number { // Size to include padding, icon, status icon (if any), split annotation (if any), + a little more const additionalWidth = 40; - const statusIconWidth = instance.statusList.statuses.length > 0 ? STATUS_ICON_WIDTH : 0; - const splitAnnotationWidth = (this._terminalGroupService.getGroupForInstance(instance)?.terminalInstances.length || 0) > 1 ? SPLIT_ANNOTATION_WIDTH : 0; + const statusIconWidth = instance.statusList.statuses.length > 0 ? WidthConstants.StatusIcon : 0; + const splitAnnotationWidth = (this._terminalGroupService.getGroupForInstance(instance)?.terminalInstances.length || 0) > 1 ? WidthConstants.SplitAnnotation : 0; return additionalWidth + splitAnnotationWidth + statusIconWidth; } @@ -244,7 +255,7 @@ export class TerminalTabbedView extends Disposable { width = TerminalTabsListSizes.WideViewMinimumWidth; this._splitView.resizeView(this._tabTreeIndex, width); } - this._rerenderTabs(); + this.rerenderTabs(); const widthKey = this._panelOrientation === Orientation.VERTICAL ? TerminalStorageKeys.TabsListWidthVertical : TerminalStorageKeys.TabsListWidthHorizontal; this._storageService.store(widthKey, width, StorageScope.GLOBAL, StorageTarget.USER); } @@ -279,10 +290,10 @@ export class TerminalTabbedView extends Disposable { onDidChange: () => Disposable.None, priority: LayoutPriority.Low }, Sizing.Distribute, this._tabTreeIndex); - this._rerenderTabs(); + this.rerenderTabs(); } - private _rerenderTabs() { + rerenderTabs() { this._updateHasText(); this._tabList.refresh(); } @@ -292,7 +303,7 @@ export class TerminalTabbedView extends Disposable { this._sashDisposables = [ this._splitView.sashes[0].onDidStart(e => { interval = window.setInterval(() => { - this._rerenderTabs(); + this.rerenderTabs(); }, 100); }), this._splitView.sashes[0].onDidEnd(e => { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts index 1566e49cdb8..7043d9cc5f3 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts @@ -17,7 +17,7 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { MenuItemAction } from 'vs/platform/actions/common/actions'; import { MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { ITerminalBackend, TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal'; -import { TerminalCapability, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; +import { TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; import { Codicon } from 'vs/base/common/codicons'; import { Action } from 'vs/base/common/actions'; import { MarkdownString } from 'vs/base/common/htmlContent'; @@ -46,7 +46,7 @@ import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecy import { IProcessDetails } from 'vs/platform/terminal/common/terminalProcess'; import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; import { getTerminalResourcesFromDragEvent, parseTerminalUri } from 'vs/workbench/contrib/terminal/browser/terminalUri'; -import { getCwdForSplit } from 'vs/workbench/contrib/terminal/browser/terminalActions'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; const $ = DOM.$; @@ -109,6 +109,7 @@ export class TerminalTabList extends WorkbenchList { const instanceDisposables: IDisposable[] = [ this._terminalGroupService.onDidChangeInstances(() => this.refresh()), this._terminalGroupService.onDidChangeGroups(() => this.refresh()), + this._terminalGroupService.onDidChangeInstanceCapability(() => this.refresh()), this._terminalService.onDidChangeInstanceTitle(() => this.refresh()), this._terminalService.onDidChangeInstanceIcon(() => this.refresh()), this._terminalService.onDidChangeInstancePrimaryStatus(() => this.refresh()), @@ -146,8 +147,7 @@ export class TerminalTabList extends WorkbenchList { // unless multi-selection is in progress this.onMouseClick(async e => { if (e.browserEvent.altKey && e.element) { - const cwd = await getCwdForSplit(this._terminalService.configHelper, e.element); - await this._terminalService.createTerminal({ location: { parentTerminal: e.element }, cwd }); + await this._terminalService.createTerminal({ location: { parentTerminal: e.element } }); } else if (this._getFocusMode() === 'singleClick') { if (this.getSelection().length <= 1) { e.element?.focus(true); @@ -308,11 +308,17 @@ class TerminalTabsRenderer implements IListRenderer 0) { + shellIntegrationString += `\n\n---\n\n ${localize('shellIntegration.enabled', "Shell integration is enabled")}`; + for (const capability of shellIntegrationCapabilities) { + shellIntegrationString += `\n- ${this._getCapabilityName(capability)}`; } } @@ -479,8 +485,7 @@ class TerminalTabsRenderer implements IListRenderer { this._runForSelectionOrInstance(instance, async e => { - const cwd = await getCwdForSplit(this._terminalService.configHelper, e); - this._terminalService.createTerminal({ location: { parentTerminal: e }, cwd }); + this._terminalService.createTerminal({ location: { parentTerminal: e } }); }); }), new Action(TerminalCommandId.KillInstance, terminalStrings.kill.short, ThemeIcon.asClassName(Codicon.trashcan), true, async () => { @@ -509,7 +514,7 @@ class TerminalTabsRenderer implements IListRenderer { if (cell.isAttributeDefault()) { return [0]; } @@ -1058,7 +1058,7 @@ const attributesToArgs = (cell: XtermAttributes) => { }; /** - * Gets the escape sequence to restore state/appearence in the cell. + * Gets the escape sequence to restore state/appearance in the cell. */ const attributesToSeq = (cell: XtermAttributes) => `${CSI}${attributesToArgs(cell).join(';')}m`; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index f586bea9032..269044f00fa 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -80,16 +80,16 @@ export class TerminalViewPane extends ViewPane { @ITerminalProfileResolverService private readonly _terminalProfileResolverService: ITerminalProfileResolverService ) { super(options, keybindingService, _contextMenuService, configurationService, _contextKeyService, viewDescriptorService, _instantiationService, openerService, themeService, telemetryService); - this._terminalService.onDidRegisterProcessSupport(() => { + this._register(this._terminalService.onDidRegisterProcessSupport(() => { if (this._actions) { for (const action of this._actions) { action.enabled = true; } } this._onDidChangeViewWelcomeState.fire(); - }); + })); - this._terminalService.onDidChangeInstances(() => { + this._register(this._terminalService.onDidChangeInstances(() => { if (!this._isWelcomeShowing) { return; } @@ -99,11 +99,16 @@ export class TerminalViewPane extends ViewPane { this._createTabsView(); this.layoutBody(this._parentDomElement.offsetHeight, this._parentDomElement.offsetWidth); } - }); + })); this._dropdownMenu = this._register(this._menuService.createMenu(MenuId.TerminalNewDropdownContext, this._contextKeyService)); this._singleTabMenu = this._register(this._menuService.createMenu(MenuId.TerminalInlineTabContext, this._contextKeyService)); this._register(this._terminalProfileService.onDidChangeAvailableProfiles(profiles => this._updateTabActionBar(profiles))); this._viewShowing = TerminalContextKeys.viewShowing.bindTo(this._contextKeyService); + this._register(this.onDidChangeBodyVisibility(e => { + if (e) { + this._terminalTabbedView?.rerenderTabs(); + } + })); } override renderBody(container: HTMLElement): void { diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts b/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts index 36606fccb81..6e7dfe85809 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts @@ -9,7 +9,7 @@ import { Widget } from 'vs/base/browser/ui/widget'; import { ITerminalWidget } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; import * as dom from 'vs/base/browser/dom'; import type { IViewportRange } from 'xterm'; -import { IHoverTarget, IHoverService } from 'vs/workbench/services/hover/browser/hover'; +import { IHoverTarget, IHoverService, IHoverAction } from 'vs/workbench/services/hover/browser/hover'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorHoverHighlight } from 'vs/platform/theme/common/colorRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -19,8 +19,8 @@ const $ = dom.$; export interface ILinkHoverTargetOptions { readonly viewportRange: IViewportRange; - readonly cellDimensions: { width: number, height: number }; - readonly terminalDimensions: { width: number, height: number }; + readonly cellDimensions: { width: number; height: number }; + readonly terminalDimensions: { width: number; height: number }; readonly modifierDownCallback?: () => void; readonly modifierUpCallback?: () => void; } @@ -31,6 +31,7 @@ export class TerminalHover extends Disposable implements ITerminalWidget { constructor( private readonly _targetOptions: ILinkHoverTargetOptions, private readonly _text: IMarkdownString, + private readonly _actions: IHoverAction[] | undefined, private readonly _linkHandler: (url: string) => any, @IHoverService private readonly _hoverService: IHoverService, @IConfigurationService private readonly _configurationService: IConfigurationService @@ -51,6 +52,7 @@ export class TerminalHover extends Disposable implements ITerminalWidget { const hover = this._hoverService.showHover({ target, content: this._text, + actions: this._actions, linkHandler: this._linkHandler, // .xterm-hover lets xterm know that the hover is part of a link additionalClasses: ['xterm-hover'] diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/cognisantCommandTrackerAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/cognisantCommandTrackerAddon.ts deleted file mode 100644 index 523ecfb801c..00000000000 --- a/src/vs/workbench/contrib/terminal/browser/xterm/cognisantCommandTrackerAddon.ts +++ /dev/null @@ -1,176 +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 type { Terminal, IMarker, IBuffer } from 'xterm'; -import { Emitter } from 'vs/base/common/event'; -import { CommandTrackerAddon } from 'vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon'; -import { ILogService } from 'vs/platform/log/common/log'; -import { ShellIntegrationInfo, ShellIntegrationInteraction } from 'vs/workbench/contrib/terminal/browser/xterm/shellIntegrationAddon'; -import { isWindows } from 'vs/base/common/platform'; -import { TerminalCommand } from 'vs/workbench/contrib/terminal/browser/terminal'; - -interface ICurrentPartialCommand { - marker?: IMarker; - previousCommandMarker?: IMarker; - promptStartY?: number; - commandStartY?: number; - commandStartX?: number; - commandExecutedY?: number; - commandExecutedMarker?: IMarker; - commandExecutedX?: number; - commandFinishedY?: number; - command?: string; -} - -export class CognisantCommandTrackerAddon extends CommandTrackerAddon { - private _commands: TerminalCommand[] = []; - private _cwds = new Map(); - private _exitCode: number | undefined; - private _cwd: string | undefined; - private _currentCommand: ICurrentPartialCommand = {}; - private _initialCwd: string | undefined; - - protected _terminal: Terminal | undefined; - - private readonly _onCwdChanged = new Emitter(); - readonly onCwdChanged = this._onCwdChanged.event; - - constructor( - @ILogService private readonly _logService: ILogService - ) { - super(); - } - - activate(terminal: Terminal): void { - this._terminal = terminal; - } - - handleIntegratedShellChange(event: { type: string, value: string }): void { - if (!this._terminal) { - return; - } - switch (event.type) { - case ShellIntegrationInfo.CurrentDir: { - if (!this._initialCwd) { - this._initialCwd = event.value; - } - this._cwd = event.value; - const freq = this._cwds.get(this._cwd) || 0; - this._cwds.set(this._cwd, freq + 1); - this._onCwdChanged.fire(this._cwd); - break; - } - case ShellIntegrationInteraction.PromptStart: - this._currentCommand.promptStartY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY; - break; - case ShellIntegrationInteraction.CommandStart: - this._currentCommand.commandStartX = this._terminal.buffer.active.cursorX; - this._currentCommand.commandStartY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY; - this._currentCommand.marker = this._terminal.registerMarker(0); - break; - case ShellIntegrationInteraction.CommandExecuted: - this._currentCommand.commandExecutedMarker = this._terminal.registerMarker(0); - // TODO: Make sure this only runs on Windows backends (not frontends) - if (!isWindows) { - // TODO: Ensure these exist - // && this._currentCommand.marker && this._currentCommand.commandStartX) { - // TODO: ! is unsafe - this._currentCommand.command = this._terminal.buffer.active.getLine(this._currentCommand.marker!.line)?.translateToString().substring(this._currentCommand.commandStartX!); - let y = this._currentCommand.marker!.line + 1; - for (; y < this._currentCommand.commandExecutedMarker!.line; y++) { - this._currentCommand.command += this._terminal.buffer.active.getLine(y)!.translateToString(true); - } - if (y === this._currentCommand.commandExecutedMarker!.line) { - this._currentCommand.command += this._terminal.buffer.active.getLine(this._currentCommand.commandExecutedMarker!.line)!.translateToString(true, undefined, this._currentCommand.commandExecutedX); - } - break; - } - this._currentCommand.commandExecutedY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY; - - // TODO: Leverage key events on Windows between CommandStart and Executed to ensure we have the correct line - - // TODO: Only do this on Windows backends - // Check if the command line is the same as the previous command line or if the - // start Y differs from the executed Y. This is to catch the conpty case where the - // "rendering" of the shell integration sequences doesn't occur on the correct cell - // due to https://github.com/microsoft/terminal/issues/11220 - if (this._currentCommand.previousCommandMarker?.line === this._currentCommand.marker?.line || - this._currentCommand.commandStartY === this._currentCommand.commandExecutedY) { - this._currentCommand.marker = this._terminal?.registerMarker(0); - this._currentCommand.commandStartX = 0; - } - - // TODO: This does not yet work when the prompt line is wrapped - this._currentCommand.command = this._terminal!.buffer.active.getLine(this._currentCommand.commandExecutedY)?.translateToString(true, this._currentCommand.commandStartX || 0); - - // TODO: Only do this on Windows backends - // Something went wrong, try predict the prompt based on the shell. - if (this._currentCommand.commandStartX === 0) { - // TODO: Only do this on pwsh - const promptPredictions = [ - `PS ${this._cwd}> `, - `PS>`, - ]; - for (const promptPrediction of promptPredictions) { - if (this._currentCommand.command?.startsWith(promptPrediction)) { - // TODO: Consider cell vs string positioning; test CJK - this._currentCommand.commandStartX = promptPrediction.length; - this._currentCommand.command = this._currentCommand.command.substring(this._currentCommand.commandStartX); - break; - } - } - } - break; - case ShellIntegrationInteraction.CommandFinished: { - const command = this._currentCommand.command; - this._logService.debug('Terminal Command Finished', this._currentCommand.command, this._currentCommand); - this._exitCode = Number.parseInt(event.value); - if (!this._currentCommand.marker?.line || !this._terminal.buffer.active) { - break; - } - if (command && !command.startsWith('\\') && command !== '') { - const buffer = this._terminal.buffer.active; - const newCommand = { - command, - timestamp: Date.now(), - cwd: this._cwd, - exitCode: this._exitCode, - getOutput: () => getOutputForCommand(this._currentCommand, buffer), - marker: this._currentCommand.marker - }; - this._commands.push(newCommand); - } - this._currentCommand.previousCommandMarker?.dispose(); - this._currentCommand.previousCommandMarker = this._currentCommand.marker; - this._currentCommand = {}; - break; - } default: - return; - } - } - - get commands(): TerminalCommand[] { - return this._commands; - } - - get cwds(): string[] { - return Array.from(new Map([...this._cwds.entries()].sort((a, b) => a[1] - b[1]))).map(s => s[0]); - } - - getCwdForLine(line: number): string { - const reversed = [...this._commands].reverse(); - return reversed.find(c => c.marker!.line <= line - 1)?.cwd || this._initialCwd!; - } -} - -function getOutputForCommand(command: ICurrentPartialCommand, buffer: IBuffer): string | undefined { - const startLine = command.previousCommandMarker!.line! + 1; - const endLine = command.marker!.line!; - let output = ''; - for (let i = startLine; i < endLine; i++) { - output += buffer.getLine(i)?.translateToString() + '\n'; - } - return output === '' ? undefined : output; -} diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon.ts index 7db03b00653..f99ade0c8cc 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon.ts @@ -3,14 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ICommandTracker, TerminalCommand } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { coalesce } from 'vs/base/common/arrays'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ICommandTracker } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ICommandDetectionCapability, IPartialCommandDetectionCapability, ITerminalCapabilityStore, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; import type { Terminal, IMarker, ITerminalAddon } from 'xterm'; -/** - * The minimum size of the prompt in which to assume the line is a command. - */ -const MINIMUM_PROMPT_LENGTH = 2; - enum Boundary { Top, Bottom @@ -21,19 +19,43 @@ export const enum ScrollPosition { Middle } -export abstract class CommandTrackerAddon implements ICommandTracker, ITerminalAddon { +export class CommandTrackerAddon extends Disposable implements ICommandTracker, ITerminalAddon { private _currentMarker: IMarker | Boundary = Boundary.Bottom; private _selectionStart: IMarker | Boundary | null = null; private _isDisposable: boolean = false; - protected abstract _terminal: Terminal | undefined; + protected _terminal: Terminal | undefined; - abstract get commands(): TerminalCommand[]; - abstract get cwds(): string[]; - abstract activate(terminal: Terminal): void; - abstract handleIntegratedShellChange(event: { type: string, value: string }): void; - abstract getCwdForLine(line: number): string; + private _commandDetection?: ICommandDetectionCapability | IPartialCommandDetectionCapability; - dispose(): void { + activate(terminal: Terminal): void { + this._terminal = terminal; + } + + constructor(store: ITerminalCapabilityStore) { + super(); + this._refreshActiveCapability(store); + this._register(store.onDidAddCapability(() => this._refreshActiveCapability(store))); + this._register(store.onDidRemoveCapability(() => this._refreshActiveCapability(store))); + } + + private _refreshActiveCapability(store: ITerminalCapabilityStore) { + const activeCommandDetection = store.get(TerminalCapability.CommandDetection) || store.get(TerminalCapability.PartialCommandDetection); + if (activeCommandDetection !== this._commandDetection) { + this._commandDetection = activeCommandDetection; + } + } + + private _getCommandMarkers(): readonly IMarker[] { + if (!this._commandDetection) { + return []; + } + let commands: readonly IMarker[]; + if (this._commandDetection.type === TerminalCapability.PartialCommandDetection) { + commands = this._commandDetection.commands; + } else { + commands = coalesce(this._commandDetection.commands.map(e => e.marker)); + } + return commands; } clearMarker(): void { @@ -57,11 +79,11 @@ export abstract class CommandTrackerAddon implements ICommandTracker, ITerminalA if (!retainSelection && currentLineY !== viewportY) { // The user has scrolled, find the line based on the current scroll position. This only // works when not retaining selection - const markersBelowViewport = this._terminal.markers.filter(e => e.line >= viewportY).length; + const markersBelowViewport = this._getCommandMarkers().filter(e => e.line >= viewportY).length; // -1 will scroll to the top - markerIndex = this._terminal.markers.length - markersBelowViewport - 1; + markerIndex = this._getCommandMarkers().length - markersBelowViewport - 1; } else if (this._currentMarker === Boundary.Bottom) { - markerIndex = this._terminal.markers.length - 1; + markerIndex = this._getCommandMarkers().length - 1; } else if (this._currentMarker === Boundary.Top) { markerIndex = -1; } else if (this._isDisposable) { @@ -69,7 +91,7 @@ export abstract class CommandTrackerAddon implements ICommandTracker, ITerminalA this._currentMarker.dispose(); this._isDisposable = false; } else { - markerIndex = this._terminal.markers.indexOf(this._currentMarker) - 1; + markerIndex = this._getCommandMarkers().indexOf(this._currentMarker) - 1; } if (markerIndex < 0) { @@ -78,7 +100,7 @@ export abstract class CommandTrackerAddon implements ICommandTracker, ITerminalA return; } - this._currentMarker = this._terminal.markers[markerIndex]; + this._currentMarker = this._getCommandMarkers()[markerIndex]; this._scrollToMarker(this._currentMarker, scrollPosition); } @@ -96,11 +118,11 @@ export abstract class CommandTrackerAddon implements ICommandTracker, ITerminalA if (!retainSelection && currentLineY !== viewportY) { // The user has scrolled, find the line based on the current scroll position. This only // works when not retaining selection - const markersAboveViewport = this._terminal.markers.filter(e => e.line <= viewportY).length; + const markersAboveViewport = this._getCommandMarkers().filter(e => e.line <= viewportY).length; // markers.length will scroll to the bottom markerIndex = markersAboveViewport; } else if (this._currentMarker === Boundary.Bottom) { - markerIndex = this._terminal.markers.length; + markerIndex = this._getCommandMarkers().length; } else if (this._currentMarker === Boundary.Top) { markerIndex = 0; } else if (this._isDisposable) { @@ -108,16 +130,16 @@ export abstract class CommandTrackerAddon implements ICommandTracker, ITerminalA this._currentMarker.dispose(); this._isDisposable = false; } else { - markerIndex = this._terminal.markers.indexOf(this._currentMarker) + 1; + markerIndex = this._getCommandMarkers().indexOf(this._currentMarker) + 1; } - if (markerIndex >= this._terminal.markers.length) { + if (markerIndex >= this._getCommandMarkers().length) { this._currentMarker = Boundary.Bottom; this._terminal.scrollToBottom(); return; } - this._currentMarker = this._terminal.markers[markerIndex]; + this._currentMarker = this._getCommandMarkers()[markerIndex]; this._scrollToMarker(this._currentMarker, scrollPosition); } @@ -280,12 +302,12 @@ export abstract class CommandTrackerAddon implements ICommandTracker, ITerminalA if (this._currentMarker === Boundary.Top) { return 0; } else if (this._currentMarker === Boundary.Bottom) { - return xterm.markers.length - 1; + return this._getCommandMarkers().length - 1; } let i; - for (i = xterm.markers.length - 1; i >= 0; i--) { - if (xterm.markers[i].line < this._currentMarker.line) { + for (i = this._getCommandMarkers().length - 1; i >= 0; i--) { + if (this._getCommandMarkers()[i].line < this._currentMarker.line) { return i; } } @@ -297,54 +319,16 @@ export abstract class CommandTrackerAddon implements ICommandTracker, ITerminalA if (this._currentMarker === Boundary.Top) { return 0; } else if (this._currentMarker === Boundary.Bottom) { - return xterm.markers.length - 1; + return this._getCommandMarkers().length - 1; } let i; - for (i = 0; i < xterm.markers.length; i++) { - if (xterm.markers[i].line > this._currentMarker.line) { + for (i = 0; i < this._getCommandMarkers().length; i++) { + if (this._getCommandMarkers()[i].line > this._currentMarker.line) { return i; } } - return xterm.markers.length; - } -} - -export class NaiveCommandTrackerAddon extends CommandTrackerAddon { - getCwdForLine(line: number): string { - throw new Error('Method not implemented.'); - } - _terminal: Terminal | undefined; - get commands(): TerminalCommand[] { - return []; - } - get cwds(): string[] { - return []; - } - - activate(terminal: Terminal): void { - this._terminal = terminal; - terminal.onKey(e => this._onKey(e.key)); - } - - private _onKey(key: string): void { - if (key === '\x0d') { - this._onEnter(); - } - - this.clearMarker(); - } - - private _onEnter(): void { - if (!this._terminal) { - return; - } - if (this._terminal.buffer.active.cursorX >= MINIMUM_PROMPT_LENGTH) { - this._terminal.registerMarker(0); - } - } - - handleIntegratedShellChange(event: { type: string; value: string; }): void { + return this._getCommandMarkers().length; } } diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/shellIntegrationAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/shellIntegrationAddon.ts index 85c246bbeb1..2b93234fe5c 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/shellIntegrationAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/shellIntegrationAddon.ts @@ -5,12 +5,13 @@ import { ITerminalAddon, Terminal } from 'xterm'; import { IShellIntegration } from 'vs/workbench/contrib/terminal/common/terminal'; -import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; import { TerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; -import { CommandDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/commandDetectionCapability'; +import { CommandDetectionCapability } from 'vs/workbench/contrib/terminal/browser/capabilities/commandDetectionCapability'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CwdDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/cwdDetectionCapability'; +import { ICommandDetectionCapability, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { PartialCommandDetectionCapability } from 'vs/workbench/contrib/terminal/browser/capabilities/partialCommandDetectionCapability'; /** * Shell integration is a feature that enhances the terminal's understanding of what's happening @@ -34,6 +35,10 @@ const enum ShellIntegrationOscPs { * Sequences pioneered by FinalTerm. */ FinalTerm = 133, + /** + * Sequences pioneered by VS Code. + */ + VSCode = 633, /** * Sequences pioneered by iTerm. */ @@ -41,9 +46,9 @@ const enum ShellIntegrationOscPs { } /** - * The identifier for the textural parameter (`Pt`) for OSC commands used by shell integration. + * The identifier for the textural parameter (`Pt`) for FinalTerm OSC commands. */ -const enum ShellIntegrationOscPt { +const enum FinalTermOscPt { /** * The start of the prompt, this is expected to always appear at the start of a line. */ @@ -60,6 +65,18 @@ const enum ShellIntegrationOscPt { CommandFinished = 'D', } +const enum VSCodeOscPt { + /** + * Explicitly set the command line. This helps workaround problems with conpty not having a + * passthrough mode by providing an option on Windows to send the command that was run. With + * this sequence there's no need for the guessing based on the unreliable cursor positions that + * would otherwise be required. + */ + CommandLine = 'A', + + Property = 'P' +} + export const enum ShellIntegrationInfo { CurrentDir = 'CurrentDir', } @@ -71,68 +88,119 @@ export const enum ShellIntegrationInteraction { CommandFinished = 'COMMAND_FINISHED' } +/** + * The shell integration addon extends xterm by reading shell integration sequences and creating + * capabilities and passing along relevant sequences to the capabilities. This is meant to + * encapsulate all handling/parsing of sequences so the capabilities don't need to. + */ export class ShellIntegrationAddon extends Disposable implements IShellIntegration, ITerminalAddon { private _terminal?: Terminal; readonly capabilities = new TerminalCapabilityStore(); - private readonly _onIntegratedShellChange = new Emitter<{ type: string, value: string }>(); - readonly onIntegratedShellChange = this._onIntegratedShellChange.event; + + constructor( + @IInstantiationService private readonly _instantiationService: IInstantiationService + ) { + super(); + } activate(xterm: Terminal) { this._terminal = xterm; - this._register(xterm.parser.registerOscHandler(ShellIntegrationOscPs.FinalTerm, data => this._handleShellIntegration(data))); - this._register(xterm.parser.registerOscHandler(ShellIntegrationOscPs.ITerm, data => this._updateCwd(data))); + this.capabilities.add(TerminalCapability.PartialCommandDetection, new PartialCommandDetectionCapability(this._terminal)); + this._register(xterm.parser.registerOscHandler(ShellIntegrationOscPs.FinalTerm, data => this._handleFinalTermSequence(data))); + this._register(xterm.parser.registerOscHandler(ShellIntegrationOscPs.ITerm, data => this._handleITermSequence(data))); + this._register(xterm.parser.registerOscHandler(ShellIntegrationOscPs.VSCode, data => this._handleVSCodeSequence(data))); } - private _handleShellIntegration(data: string): boolean { + private _handleFinalTermSequence(data: string): boolean { if (!this._terminal) { return false; } - let type: ShellIntegrationInteraction | undefined; - const [command, exitCode] = data.split(';'); + + // Pass the sequence along to the capability + const [command, arg] = data.split(';'); switch (command) { - case ShellIntegrationOscPt.PromptStart: - type = ShellIntegrationInteraction.PromptStart; - if (!this.capabilities.has(TerminalCapability.CommandDetection)) { - this.capabilities.add(TerminalCapability.CommandDetection, new CommandDetectionCapability()); - } - if (!this.capabilities.has(TerminalCapability.CwdDetection)) { - this.capabilities.add(TerminalCapability.CwdDetection, new CwdDetectionCapability()); - } - case ShellIntegrationOscPt.CommandStart: - type = ShellIntegrationInteraction.CommandStart; - break; - case ShellIntegrationOscPt.CommandExecuted: - type = ShellIntegrationInteraction.CommandExecuted; - break; - case ShellIntegrationOscPt.CommandFinished: - type = ShellIntegrationInteraction.CommandFinished; - break; - default: - return false; + case FinalTermOscPt.PromptStart: + this._createOrGetCommandDetection(this._terminal).handlePromptStart(); + return true; + case FinalTermOscPt.CommandStart: + this._createOrGetCommandDetection(this._terminal).handleCommandStart(); + return true; + case FinalTermOscPt.CommandExecuted: + this._createOrGetCommandDetection(this._terminal).handleCommandExecuted(); + return true; + case FinalTermOscPt.CommandFinished: { + const exitCode = parseInt(arg); + this._createOrGetCommandDetection(this._terminal).handleCommandFinished(exitCode); + return true; + } } - const value = exitCode || type; - if (!value) { - return false; - } - this._onIntegratedShellChange.fire({ type, value }); - return true; + + // Unrecognized sequence + return false; } - private _updateCwd(data: string): boolean { - let value: string | undefined; - const [type, info] = data.split('='); - switch (type) { - case ShellIntegrationInfo.CurrentDir: - this.capabilities.get(TerminalCapability.CwdDetection)?.updateCwd(info); - value = info; - break; - default: - return false; - } - if (!value) { + private _handleVSCodeSequence(data: string): boolean { + if (!this._terminal) { return false; } - this._onIntegratedShellChange.fire({ type, value }); - return true; + + // Pass the sequence along to the capability + const [command, arg] = data.split(';'); + switch (command) { + case VSCodeOscPt.CommandLine: { + const commandLine = (arg + .replace(//g, '\n') + .replace(//g, ';')); + this._createOrGetCommandDetection(this._terminal).setCommandLine(commandLine); + return true; + } + case VSCodeOscPt.Property: { + const [key, value] = arg.split('='); + switch (key) { + case 'IsWindows': { + this._createOrGetCommandDetection(this._terminal).setIsWindowsPty(value === 'True' ? true : false); + } + } + } + } + + // Unrecognized sequence + return false; + } + + private _handleITermSequence(data: string): boolean { + // Pass the sequence along to the capability + const [type, value] = data.split('='); + switch (type) { + case ShellIntegrationInfo.CurrentDir: { + this._createOrGetCwdDetection().updateCwd(value); + const commandDetection = this.capabilities.get(TerminalCapability.CommandDetection); + if (commandDetection) { + commandDetection.setCwd(value); + } + return true; + } + } + + // Unrecognized sequence + return false; + } + + protected _createOrGetCwdDetection(): CwdDetectionCapability { + let cwdDetection = this.capabilities.get(TerminalCapability.CwdDetection); + if (!cwdDetection) { + cwdDetection = new CwdDetectionCapability(); + this.capabilities.add(TerminalCapability.CwdDetection, cwdDetection); + } + return cwdDetection; + } + + protected _createOrGetCommandDetection(terminal: Terminal): ICommandDetectionCapability { + let commandDetection = this.capabilities.get(TerminalCapability.CommandDetection); + if (!commandDetection) { + commandDetection = this._instantiationService.createInstance(CommandDetectionCapability, terminal); + this.capabilities.add(TerminalCapability.CommandDetection, commandDetection); + } + return commandDetection; } } diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts index 09527bac68f..bda599c26d6 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts @@ -12,7 +12,7 @@ import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configur import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { TerminalCapability, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; +import { TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; import { IShellIntegration, ITerminalFont, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { isSafari } from 'vs/base/browser/browser'; import { ICommandTracker, IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal'; @@ -20,7 +20,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { TerminalStorageKeys } from 'vs/workbench/contrib/terminal/common/terminalStorageKeys'; import { INotificationService, IPromptChoice, Severity } from 'vs/platform/notification/common/notification'; -import { CommandTrackerAddon, NaiveCommandTrackerAddon } from 'vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon'; +import { CommandTrackerAddon } from 'vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon'; import { localize } from 'vs/nls'; import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; @@ -28,9 +28,9 @@ import { editorBackground } from 'vs/platform/theme/common/colorRegistry'; import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { TERMINAL_FOREGROUND_COLOR, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR, ansiColorIdentifiers } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { Color } from 'vs/base/common/color'; -import { ShellIntegrationAddon, ShellIntegrationInteraction } from 'vs/workbench/contrib/terminal/browser/xterm/shellIntegrationAddon'; -import { CognisantCommandTrackerAddon } from 'vs/workbench/contrib/terminal/browser/xterm/cognisantCommandTrackerAddon'; +import { ShellIntegrationAddon } from 'vs/workbench/contrib/terminal/browser/xterm/shellIntegrationAddon'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ITerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; // How long in milliseconds should an average frame take to render for a notification to appear // which suggests the fallback DOM-based renderer @@ -81,6 +81,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal { cols: number, rows: number, location: TerminalLocation, + capabilities: ITerminalCapabilityStore, @IConfigurationService private readonly _configurationService: IConfigurationService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILogService private readonly _logService: ILogService, @@ -117,8 +118,8 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal { macOptionClickForcesSelection: config.macOptionClickForcesSelection, rightClickSelectsWord: config.rightClickBehavior === 'selectWord', fastScrollModifier: 'alt', - fastScrollSensitivity: editorOptions.fastScrollSensitivity, - scrollSensitivity: editorOptions.mouseWheelScrollSensitivity, + fastScrollSensitivity: config.fastScrollSensitivity, + scrollSensitivity: config.mouseWheelScrollSensitivity, rendererType: this._getBuiltInXtermRenderer(config.gpuAcceleration, XtermTerminal._suggestedRendererType), wordSeparator: config.wordSeparators })); @@ -145,37 +146,10 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal { // Load addons this._updateUnicodeVersion(); - this._commandTrackerAddon = new NaiveCommandTrackerAddon(); + this._commandTrackerAddon = new CommandTrackerAddon(capabilities); this.raw.loadAddon(this._commandTrackerAddon); - this._shellIntegrationAddon = new ShellIntegrationAddon(); + this._shellIntegrationAddon = this._instantiationService.createInstance(ShellIntegrationAddon); this.raw.loadAddon(this._shellIntegrationAddon); - - // Hook up co-dependent addon events - this._shellIntegrationAddon.capabilities.onDidAddCapability(e => { - if (e === TerminalCapability.CommandDetection) { - this.upgradeCommandTracker(); - } - }); - this._shellIntegrationAddon.onIntegratedShellChange(e => { - if (e.type === ShellIntegrationInteraction.CommandFinished) { - // TODO: This should move into the new command tracker - if (this.raw.buffer.active.cursorX >= 2) { - this.raw.registerMarker(0); - this.commandTracker.clearMarker(); - } - } - this._commandTrackerAddon.handleIntegratedShellChange(e); - }); - - } - - upgradeCommandTracker(): void { - if (this._commandTrackerAddon instanceof CognisantCommandTrackerAddon) { - return; - } - this._commandTrackerAddon.dispose(); - this._commandTrackerAddon = this._instantiationService.createInstance(CognisantCommandTrackerAddon); - this._commandTrackerAddon.activate(this.raw); } attachToElement(container: HTMLElement) { @@ -275,7 +249,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal { return maxLineLength; } - private _getWrappedLineCount(index: number, buffer: IBuffer): { lineCount: number, currentIndex: number, endSpaces: number } { + private _getWrappedLineCount(index: number, buffer: IBuffer): { lineCount: number; currentIndex: number; endSpaces: number } { let line = buffer.getLine(index); if (!line) { throw new Error('Could not get line'); diff --git a/src/vs/workbench/contrib/terminal/common/capabilities/capabilities.d.ts b/src/vs/workbench/contrib/terminal/common/capabilities/capabilities.d.ts deleted file mode 100644 index 83cf5aa8b09..00000000000 --- a/src/vs/workbench/contrib/terminal/common/capabilities/capabilities.d.ts +++ /dev/null @@ -1,53 +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 { Event } from 'vs/base/common/event'; -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; -import { CommandDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/commandDetectionCapability'; -import { CwdDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/cwdDetectionCapability'; -import { NaiveCwdDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/naiveCwdDetectionCapability'; -import { PartialCommandDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/partialCommandDetectionCapability'; - -/** - * An object that keeps track of additional capabilities and their implementations for features that - * are not available for all terminals. - */ -export interface ITerminalCapabilityStore { - /** - * An iterable of all capabilities in the store. - */ - readonly items: IterableIterator; - - /** - * Fired when a capability is added. - */ - readonly onDidAddCapability: Event; - - /** - * Fired when a capability is removed. - */ - readonly onDidRemoveCapability: Event; - - /** - * Gets whether the capability exists in the store. - */ - has(capability: TerminalCapability): boolean; - - /** - * Gets the implementation of a capability if it has been added to the store. - */ - get(capability: T): ITerminalCapabilityImplMap[T] | undefined; -} - -/** - * Maps capability types to their implementation, enabling strongly typed fetching of - * implementations. - */ -export interface ITerminalCapabilityImplMap { - [TerminalCapability.CwdDetection]: InstanceType; - [TerminalCapability.CommandDetection]: InstanceType; - [TerminalCapability.NaiveCwdDetection]: InstanceType; - [TerminalCapability.PartialCommandDetection]: InstanceType; -} diff --git a/src/vs/workbench/contrib/terminal/common/capabilities/capabilities.ts b/src/vs/workbench/contrib/terminal/common/capabilities/capabilities.ts new file mode 100644 index 00000000000..12c9a1f9ef2 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/common/capabilities/capabilities.ts @@ -0,0 +1,104 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Event } from 'vs/base/common/event'; +import { CwdDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/cwdDetectionCapability'; +import { NaiveCwdDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/naiveCwdDetectionCapability'; +import { ITerminalCommand, IXtermMarker } from 'vs/workbench/contrib/terminal/common/terminal'; + +/** + * Primarily driven by the shell integration feature, a terminal capability is the mechanism for + * progressively enhancing various features that may not be supported in all terminals/shells. + */ +export const enum TerminalCapability { + /** + * The terminal can reliably detect the current working directory as soon as the change happens + * within the buffer. + */ + CwdDetection, + /** + * The terminal can reliably detect the current working directory when requested. + */ + NaiveCwdDetection, + /** + * The terminal can reliably identify prompts, commands and command outputs within the buffer. + */ + CommandDetection, + /** + * The terminal can often identify prompts, commands and command outputs within the buffer. It + * may not be so good at remembering the position of commands that ran in the past. This state + * may be enabled when something goes wrong or when using conpty for example. + */ + PartialCommandDetection +} + +/** + * An object that keeps track of additional capabilities and their implementations for features that + * are not available for all terminals. + */ +export interface ITerminalCapabilityStore { + /** + * An iterable of all capabilities in the store. + */ + readonly items: IterableIterator; + + /** + * Fired when a capability is added. + */ + readonly onDidAddCapability: Event; + + /** + * Fired when a capability is removed. + */ + readonly onDidRemoveCapability: Event; + + /** + * Gets whether the capability exists in the store. + */ + has(capability: TerminalCapability): boolean; + + /** + * Gets the implementation of a capability if it has been added to the store. + */ + get(capability: T): ITerminalCapabilityImplMap[T] | undefined; +} + +/** + * Maps capability types to their implementation, enabling strongly typed fetching of + * implementations. + */ +export interface ITerminalCapabilityImplMap { + [TerminalCapability.CwdDetection]: InstanceType; + [TerminalCapability.CommandDetection]: ICommandDetectionCapability; + [TerminalCapability.NaiveCwdDetection]: InstanceType; + [TerminalCapability.PartialCommandDetection]: IPartialCommandDetectionCapability; +} + +export interface ICommandDetectionCapability { + readonly type: TerminalCapability.CommandDetection; + readonly commands: readonly ITerminalCommand[]; + readonly onCommandFinished: Event; + setCwd(value: string): void; + setIsWindowsPty(value: boolean): void; + /** + * Gets the working directory for a line, this will return undefined if it's unknown in which + * case the terminal's initial cwd should be used. + */ + getCwdForLine(line: number): string | undefined; + handlePromptStart(): void; + handleCommandStart(): void; + handleCommandExecuted(): void; + handleCommandFinished(exitCode: number): void; + /** + * Set the command line explicitly. + */ + setCommandLine(commandLine: string): void; +} + +export interface IPartialCommandDetectionCapability { + readonly type: TerminalCapability.PartialCommandDetection; + readonly commands: readonly IXtermMarker[]; + readonly onCommandFinished: Event; +} diff --git a/src/vs/workbench/contrib/terminal/common/capabilities/commandDetectionCapability.ts b/src/vs/workbench/contrib/terminal/common/capabilities/commandDetectionCapability.ts deleted file mode 100644 index 24781f20aa8..00000000000 --- a/src/vs/workbench/contrib/terminal/common/capabilities/commandDetectionCapability.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. - *--------------------------------------------------------------------------------------------*/ - -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; - -export class CommandDetectionCapability { - readonly type = TerminalCapability.CommandDetection; - - // TODO: Encapsulate the functionality the capability brings here -} diff --git a/src/vs/workbench/contrib/terminal/common/capabilities/cwdDetectionCapability.ts b/src/vs/workbench/contrib/terminal/common/capabilities/cwdDetectionCapability.ts index 03b3c807120..1f22eba7bc9 100644 --- a/src/vs/workbench/contrib/terminal/common/capabilities/cwdDetectionCapability.ts +++ b/src/vs/workbench/contrib/terminal/common/capabilities/cwdDetectionCapability.ts @@ -4,23 +4,33 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; export class CwdDetectionCapability { readonly type = TerminalCapability.CwdDetection; private _cwd = ''; + private _cwds = new Map(); + + /** + * Gets the list of cwds seen in this session in order of descending frequency. + */ + get cwds(): string[] { + return Array.from(Array.from(this._cwds.entries()).sort((a, b) => b[1] - a[1])).map(s => s[0]); + } private readonly _onDidChangeCwd = new Emitter(); readonly onDidChangeCwd = this._onDidChangeCwd.event; - async getCwd(): Promise { + getCwd(): string { return this._cwd; } updateCwd(cwd: string): void { - if (this._cwd !== cwd) { + const didChange = this._cwd !== cwd; + this._cwd = cwd; + this._cwds.set(this._cwd, (this._cwds.get(this._cwd) || 0) + 1); + if (didChange) { this._onDidChangeCwd.fire(cwd); } - this._cwd = cwd; } } diff --git a/src/vs/workbench/contrib/terminal/common/capabilities/naiveCwdDetectionCapability.ts b/src/vs/workbench/contrib/terminal/common/capabilities/naiveCwdDetectionCapability.ts index de7705f4bf1..ca40c5ef2d1 100644 --- a/src/vs/workbench/contrib/terminal/common/capabilities/naiveCwdDetectionCapability.ts +++ b/src/vs/workbench/contrib/terminal/common/capabilities/naiveCwdDetectionCapability.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; -import { ITerminalChildProcess, TerminalCapability } from 'vs/platform/terminal/common/terminal'; +import { ITerminalChildProcess } from 'vs/platform/terminal/common/terminal'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; export class NaiveCwdDetectionCapability { constructor(private readonly _process: ITerminalChildProcess) { } diff --git a/src/vs/workbench/contrib/terminal/common/capabilities/partialCommandDetectionCapability.ts b/src/vs/workbench/contrib/terminal/common/capabilities/partialCommandDetectionCapability.ts deleted file mode 100644 index 66b6476c6a9..00000000000 --- a/src/vs/workbench/contrib/terminal/common/capabilities/partialCommandDetectionCapability.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. - *--------------------------------------------------------------------------------------------*/ - -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; - -export class PartialCommandDetectionCapability { - readonly type = TerminalCapability.CwdDetection; - - // TODO: Encapsulate the functionality the capability brings here -} diff --git a/src/vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore.ts b/src/vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore.ts index 14dd644ba17..155efd60f9c 100644 --- a/src/vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore.ts +++ b/src/vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore.ts @@ -5,8 +5,7 @@ import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; -import { ITerminalCapabilityImplMap, ITerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { ITerminalCapabilityImplMap, ITerminalCapabilityStore, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; export class TerminalCapabilityStore extends Disposable implements ITerminalCapabilityStore { private _map: Map = new Map(); diff --git a/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts b/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts index 05767afce2d..834986a1e61 100644 --- a/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts +++ b/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts @@ -13,8 +13,8 @@ import { IEnvironmentVariableCollectionWithPersistence, IEnvironmentVariableServ import { TerminalStorageKeys } from 'vs/workbench/contrib/terminal/common/terminalStorageKeys'; interface ISerializableExtensionEnvironmentVariableCollection { - extensionIdentifier: string, - collection: ISerializableEnvironmentVariableCollection + extensionIdentifier: string; + collection: ISerializableEnvironmentVariableCollection; } /** diff --git a/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts b/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts index 86d40c55095..c0521b853b6 100644 --- a/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts +++ b/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts @@ -35,7 +35,7 @@ export interface IWorkspaceFolderData { export interface ICreateTerminalProcessArguments { configuration: ICompleteTerminalConfiguration; - resolvedVariables: { [name: string]: string; }; + resolvedVariables: { [name: string]: string }; envVariableCollections: ITerminalEnvironmentVariableCollections; shellLaunchConfig: IShellLaunchConfigDto; workspaceId: string; @@ -47,7 +47,7 @@ export interface ICreateTerminalProcessArguments { cols: number; rows: number; unicodeVersion: '6' | '11'; - resolverEnv: { [key: string]: string | null; } | undefined + resolverEnv: { [key: string]: string | null } | undefined; } export interface ICreateTerminalProcessResult { @@ -72,29 +72,29 @@ export class RemoteTerminalChannelClient implements IPtyHostController { get onPtyHostRequestResolveVariables(): Event { return this._channel.listen('$onPtyHostRequestResolveVariablesEvent'); } - get onProcessData(): Event<{ id: number, event: IProcessDataEvent | string }> { - return this._channel.listen<{ id: number, event: IProcessDataEvent | string }>('$onProcessDataEvent'); + get onProcessData(): Event<{ id: number; event: IProcessDataEvent | string }> { + return this._channel.listen<{ id: number; event: IProcessDataEvent | string }>('$onProcessDataEvent'); } - get onProcessExit(): Event<{ id: number, event: number | undefined }> { - return this._channel.listen<{ id: number, event: number | undefined }>('$onProcessExitEvent'); + get onProcessExit(): Event<{ id: number; event: number | undefined }> { + return this._channel.listen<{ id: number; event: number | undefined }>('$onProcessExitEvent'); } - get onProcessReady(): Event<{ id: number, event: { pid: number, cwd: string, requireWindowsMode?: boolean } }> { - return this._channel.listen<{ id: number, event: { pid: number, cwd: string, requiresWindowsMode?: boolean } }>('$onProcessReadyEvent'); + get onProcessReady(): Event<{ id: number; event: { pid: number; cwd: string; requireWindowsMode?: boolean } }> { + return this._channel.listen<{ id: number; event: { pid: number; cwd: string; requiresWindowsMode?: boolean } }>('$onProcessReadyEvent'); } - get onProcessReplay(): Event<{ id: number, event: IPtyHostProcessReplayEvent }> { - return this._channel.listen<{ id: number, event: IPtyHostProcessReplayEvent }>('$onProcessReplayEvent'); + get onProcessReplay(): Event<{ id: number; event: IPtyHostProcessReplayEvent }> { + return this._channel.listen<{ id: number; event: IPtyHostProcessReplayEvent }>('$onProcessReplayEvent'); } get onProcessOrphanQuestion(): Event<{ id: number }> { return this._channel.listen<{ id: number }>('$onProcessOrphanQuestion'); } - get onExecuteCommand(): Event<{ reqId: number, commandId: string, commandArgs: any[] }> { - return this._channel.listen<{ reqId: number, commandId: string, commandArgs: any[] }>('$onExecuteCommand'); + get onExecuteCommand(): Event<{ reqId: number; commandId: string; commandArgs: any[] }> { + return this._channel.listen<{ reqId: number; commandId: string; commandArgs: any[] }>('$onExecuteCommand'); } - get onDidRequestDetach(): Event<{ requestId: number, workspaceId: string, instanceId: number }> { - return this._channel.listen<{ requestId: number, workspaceId: string, instanceId: number }>('$onDidRequestDetach'); + get onDidRequestDetach(): Event<{ requestId: number; workspaceId: string; instanceId: number }> { + return this._channel.listen<{ requestId: number; workspaceId: string; instanceId: number }>('$onDidRequestDetach'); } - get onDidChangeProperty(): Event<{ id: number, property: IProcessProperty }> { - return this._channel.listen<{ id: number, property: IProcessProperty }>('$onDidChangeProperty'); + get onDidChangeProperty(): Event<{ id: number; property: IProcessProperty }> { + return this._channel.listen<{ id: number; property: IProcessProperty }>('$onDidChangeProperty'); } constructor( diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 9468747a6fc..0012a9c3e67 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -58,8 +58,14 @@ export interface ITerminalProfileResolverService { createProfileFromShellAndShellArgs(shell?: unknown, shellArgs?: unknown): Promise; } +/* + * When there were shell integration args injected + * and createProcess returns an error, this exit code will be used. + */ +export const ShellIntegrationExitCode = 633; + export interface IRegisterContributedProfileArgs { - extensionIdentifier: string, id: string, title: string, options: ICreateContributedTerminalProfileOptions; + extensionIdentifier: string; id: string; title: string; options: ICreateContributedTerminalProfileOptions; } export const ITerminalProfileService = createDecorator('terminalProfileService'); @@ -107,7 +113,7 @@ export interface ITerminalBackend { */ onPtyHostRestart: Event; - onDidRequestDetach: Event<{ requestId: number, workspaceId: string, instanceId: number }>; + onDidRequestDetach: Event<{ requestId: number; workspaceId: string; instanceId: number }>; attachToProcess(id: number): Promise; listProcesses(): Promise; @@ -263,7 +269,6 @@ export interface ITerminalConfiguration { wordSeparators: string; enableFileLinks: boolean; unicodeVersion: '6' | '11'; - experimentalLinkProvider: boolean; localEchoLatencyThreshold: number; localEchoExcludePrograms: ReadonlyArray; localEchoEnabled: 'auto' | 'on' | 'off'; @@ -278,7 +283,7 @@ export interface ITerminalConfiguration { title: string; description: string; separator: string; - }, + }; bellDuration: number; defaultLocation: TerminalLocationString; customGlyphs: boolean; @@ -316,16 +321,35 @@ export interface IRemoteTerminalAttachTarget { workspaceId: string; workspaceName: string; isOrphan: boolean; - icon: URI | { light: URI; dark: URI } | { id: string, color?: { id: string } } | undefined; + icon: URI | { light: URI; dark: URI } | { id: string; color?: { id: string } } | undefined; color: string | undefined; fixedDimensions: IFixedTerminalDimensions | undefined; } -// TODO: Replace IShellIntegration with ITerminalCapabilityStore export interface IShellIntegration { capabilities: ITerminalCapabilityStore; - // TODO: Fire more fine-grained and stronger typed events - readonly onIntegratedShellChange: Event<{ type: string, value: string }>; +} + +export interface ITerminalCommand { + command: string; + timestamp: number; + cwd?: string; + exitCode?: number; + marker?: IXtermMarker; + getOutput(): string | undefined; +} + +/** + * A clone of the IMarker from xterm which cannot be imported from common + */ +export interface IXtermMarker { + readonly id: number; + readonly isDisposed: boolean; + readonly line: number; + dispose(): void; + onDispose: { + (listener: () => any): { dispose(): void }; + }; } export interface INavigationMode { @@ -389,6 +413,7 @@ export interface ITerminalProcessManager extends IDisposable { getLatency(): Promise; refreshProperty(type: T): Promise; updateProperty(property: T, value: IProcessPropertyMap[T]): void; + getBackendOS(): Promise; } export const enum ProcessState { @@ -421,7 +446,7 @@ export interface ITerminalProcessExtHostProxy extends IDisposable { onInput: Event; onBinary: Event; - onResize: Event<{ cols: number, rows: number }>; + onResize: Event<{ cols: number; rows: number }>; onAcknowledgeDataEvent: Event; onShutdown: Event; onRequestInitialCwd: Event; @@ -453,9 +478,10 @@ export const enum TerminalCommandId { KillAll = 'workbench.action.terminal.killAll', QuickKill = 'workbench.action.terminal.quickKill', ConfigureTerminalSettings = 'workbench.action.terminal.openSettings', - ShowWordLinkQuickpick = 'workbench.action.terminal.showWordLinkQuickpick', - ShowValidatedLinkQuickpick = 'workbench.action.terminal.showValidatedLinkQuickpick', - ShowProtocolLinkQuickpick = 'workbench.action.terminal.showProtocolLinkQuickpick', + OpenDetectedLink = 'workbench.action.terminal.openDetectedLink', + OpenWordLink = 'workbench.action.terminal.openWordLink', + OpenFileLink = 'workbench.action.terminal.openFileLink', + OpenWebLink = 'workbench.action.terminal.openUrlLink', RunRecentCommand = 'workbench.action.terminal.runRecentCommand', GoToRecentDirectory = 'workbench.action.terminal.goToRecentDirectory', CopySelection = 'workbench.action.terminal.copySelection', diff --git a/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts index 9df17f38d09..e0b0ca34cb2 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts @@ -43,7 +43,7 @@ export const TERMINAL_TAB_ACTIVE_BORDER = registerColor('terminal.tab.activeBord hc: TAB_ACTIVE_BORDER }, nls.localize('terminal.tab.activeBorder', 'Border on the side of the terminal tab in the panel. This defaults to tab.activeBorder.')); -export const ansiColorMap: { [key: string]: { index: number, defaults: ColorDefaults } } = { +export const ansiColorMap: { [key: string]: { index: number; defaults: ColorDefaults } } = { 'terminal.ansiBlack': { index: 0, defaults: { diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts index d828354acd4..c115c731303 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -133,6 +133,11 @@ const terminalConfiguration: IConfigurationNode = { type: 'boolean', default: false }, + [TerminalSettingId.EnableMultiLinePasteWarning]: { + description: localize('terminal.integrated.enableMultiLinePasteWarning', "Show a warning dialog when pasting multiple lines into the terminal."), + type: 'boolean', + default: true + }, [TerminalSettingId.DrawBoldTextInBrightColors]: { description: localize('terminal.integrated.drawBoldTextInBrightColors', "Controls whether bold text in the terminal will always use the \"bright\" ANSI color variant."), type: 'boolean', @@ -436,11 +441,6 @@ const terminalConfiguration: IConfigurationNode = { default: '11', description: localize('terminal.integrated.unicodeVersion', "Controls what version of unicode to use when evaluating the width of characters in the terminal. If you experience emoji or other wide characters not taking up the right amount of space or backspace either deleting too much or too little then you may want to try tweaking this setting.") }, - [TerminalSettingId.ExperimentalLinkProvider]: { - description: localize('terminal.integrated.experimentalLinkProvider', "An experimental setting that aims to improve link detection in the terminal by improving when links are detected and by enabling shared link detection with the editor. Currently this only supports web links."), - type: 'boolean', - default: true - }, [TerminalSettingId.LocalEchoLatencyThreshold]: { description: localize('terminal.integrated.localEchoLatencyThreshold', "Length of network delay, in milliseconds, where local edits will be echoed on the terminal without waiting for server acknowledgement. If '0', local echo will always be on, and if '-1' it will be disabled."), type: 'integer', @@ -505,22 +505,29 @@ const terminalConfiguration: IConfigurationNode = { default: true }, [TerminalSettingId.AutoReplies]: { - description: localize('terminal.integrated.autoReplies', "A set of messages that when encountered in the terminal will be automatically responded to. Provided the message is specific enough, this can help automate away common responses. Note that the message includes escape sequences so the reply might not happen with styled text. Each reply can only happen once every second."), + markdownDescription: localize('terminal.integrated.autoReplies', "A set of messages that when encountered in the terminal will be automatically responded to. Provided the message is specific enough, this can help automate away common responses.\n\nRemarks:\n\n- Use {0} to automatically respond to the terminate batch job prompt on Windows.\n- The message includes escape sequences so the reply might not happen with styled text.\n- Each reply can only happen once every second.\n- Use {1} in the reply to mean the enter key.\n- To unset a default key, set the value to null.\n- Restart VS Code if new don't apply.", '`"Terminate batch job (Y/N)": "\\r"`', '`"\\r"`'), type: 'object', additionalProperties: { - type: 'string', - description: localize('terminal.integrated.autoReplies.reply', "The reply to send to the process.") + oneOf: [{ + type: 'string', + description: localize('terminal.integrated.autoReplies.reply', "The reply to send to the process.") + }, + { type: 'null' }] }, - default: { - 'Terminate batch job (Y/N)': 'Y\r' - } + default: {} }, [TerminalSettingId.EnableShellIntegration]: { restricted: true, - description: localize('terminal.integrated.enableShellIntegration', "For supported shells, use shell integration (zsh & bash on mac/linux, pwsh on windows)"), + markdownDescription: localize('terminal.integrated.enableShellIntegration', "Enable the experimental shell integration feature which will turn on certain features like enhanced command tracking and current working directory detection. Shell integration works by injecting a script that is run when the shell is initialized which lets the terminal gain additional insights into what is happening within the terminal, the script injection may not work if you have custom arguments defined in the terminal profile.\n\nSupported shells:\n\n- Linux/macOS: bash, pwsh, zsh\n - Windows: pwsh"), type: 'boolean', default: false }, + [TerminalSettingId.ShowShellIntegrationWelcome]: { + restricted: true, + markdownDescription: localize('terminal.integrated.showShellIntegrationWelcome', "Whether to show the shell integration activated welcome message in the terminal when the feature is enabled."), + type: 'boolean', + default: true + }, } }; diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index 4fb40838294..ae77b75c573 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -11,6 +11,8 @@ import { sanitizeProcessEnvironment } from 'vs/base/common/processes'; import { ILogService } from 'vs/platform/log/common/log'; import { IShellLaunchConfig, ITerminalEnvironment, TerminalSettingId, TerminalSettingPrefix } from 'vs/platform/terminal/common/terminal'; import { IProcessEnvironment, isWindows, locale, OperatingSystem, OS, platform, Platform } from 'vs/base/common/platform'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { format } from 'vs/base/common/strings'; /** * This module contains utility functions related to the environment, cwd and paths. @@ -399,3 +401,131 @@ export function createTerminalEnvironment( } return env; } +export enum ShellIntegrationExecutable { + WindowsPwsh = 'windows-pwsh', + WindowsPwshLogin = 'windows-pwsh-login', + Pwsh = 'pwsh', + PwshLogin = 'pwsh-login', + Zsh = 'zsh', + ZshLogin = 'zsh-login', + Bash = 'bash' +} + +export const shellIntegrationArgs: Map = new Map(); +shellIntegrationArgs.set(ShellIntegrationExecutable.WindowsPwsh, ['-noexit', ' -command', '. \"${execInstallFolder}\\out\\vs\\workbench\\contrib\\terminal\\browser\\media\\shellIntegration.ps1\"{0}']); +shellIntegrationArgs.set(ShellIntegrationExecutable.WindowsPwshLogin, ['-l', '-noexit', ' -command', '. \"${execInstallFolder}\\out\\vs\\workbench\\contrib\\terminal\\browser\\media\\shellIntegration.ps1\"{0}']); +shellIntegrationArgs.set(ShellIntegrationExecutable.Pwsh, ['-noexit', '-command', '. "${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1"{0}']); +shellIntegrationArgs.set(ShellIntegrationExecutable.PwshLogin, ['-l', '-noexit', '-command', '. "${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1"']); +shellIntegrationArgs.set(ShellIntegrationExecutable.Zsh, ['-c', '"${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh"; zsh -i']); +shellIntegrationArgs.set(ShellIntegrationExecutable.ZshLogin, ['-c', '"${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh"; zsh -il']); +shellIntegrationArgs.set(ShellIntegrationExecutable.Bash, ['--init-file', '${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh']); +const loginArgs = ['-login', '-l']; +const pwshImpliedArgs = ['-nol', '-nologo']; +export function injectShellIntegrationArgs( + logService: ILogService, + configurationService: IConfigurationService, + env: IProcessEnvironment, + enableShellIntegration: boolean, + shellLaunchConfig: IShellLaunchConfig, + os?: OperatingSystem +): { args: string | string[] | undefined; enableShellIntegration: boolean } { + // Shell integration arg injection is disabled when: + // - The global setting is disabled + // - There is no executable (not sure what script to run) + // - The terminal is used by a feature like tasks or debugging + if (!enableShellIntegration || !shellLaunchConfig.executable || shellLaunchConfig.isFeatureTerminal) { + return { args: shellLaunchConfig.args, enableShellIntegration: false }; + } + + const originalArgs = shellLaunchConfig.args; + const shell = path.basename(shellLaunchConfig.executable).toLowerCase(); + let newArgs: string[] | undefined; + + if (os === OperatingSystem.Windows) { + if (shell === 'pwsh.exe') { + if (!originalArgs || arePwshImpliedArgs(originalArgs)) { + newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.WindowsPwsh); + } else if (arePwshLoginArgs(originalArgs)) { + newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.WindowsPwshLogin); + } else { + logService.warn(`Shell integration cannot be enabled when custom args ${originalArgs} are provided for ${shell} on Windows.`); + } + } + if (newArgs) { + const showWelcome = configurationService.getValue(TerminalSettingId.ShowShellIntegrationWelcome); + const additionalArgs = showWelcome ? '' : ' -HideWelcome'; + newArgs = [...newArgs]; // Shallow clone the array to avoid setting the default array + newArgs[newArgs.length - 1] = format(newArgs[newArgs.length - 1], additionalArgs); + } + } else { + switch (shell) { + case 'bash': { + if (!originalArgs || originalArgs.length === 0) { + newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.Bash); + } else if (areZshBashLoginArgs(originalArgs)) { + env['VSCODE_SHELL_LOGIN'] = '1'; + newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.Bash); + } + const showWelcome = configurationService.getValue(TerminalSettingId.ShowShellIntegrationWelcome); + if (!showWelcome) { + env['VSCODE_SHELL_HIDE_WELCOME'] = '1'; + } + break; + } + case 'pwsh': { + if (!originalArgs || arePwshImpliedArgs(originalArgs)) { + newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.Pwsh); + } else if (arePwshLoginArgs(originalArgs)) { + newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.PwshLogin); + } + if (newArgs) { + const showWelcome = configurationService.getValue(TerminalSettingId.ShowShellIntegrationWelcome); + const additionalArgs = showWelcome ? '' : ' -HideWelcome'; + newArgs = [...newArgs]; // Shallow clone the array to avoid setting the default array + newArgs[newArgs.length - 1] = format(newArgs[newArgs.length - 1], additionalArgs); + } + break; + } + case 'zsh': { + if (!originalArgs || originalArgs.length === 0) { + newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.Zsh); + } else if (areZshBashLoginArgs(originalArgs)) { + newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.ZshLogin); + } + const showWelcome = configurationService.getValue(TerminalSettingId.ShowShellIntegrationWelcome); + if (!showWelcome) { + env['VSCODE_SHELL_HIDE_WELCOME'] = '1'; + } + break; + } + } + if (!newArgs) { + logService.warn(`Shell integration cannot be enabled when custom args ${originalArgs} are provided for ${shell}.`); + } + } + return { args: newArgs || originalArgs, enableShellIntegration: newArgs !== undefined }; +} + +function arePwshLoginArgs(originalArgs: string | string[]): boolean { + if (typeof originalArgs === 'string') { + return loginArgs.includes(originalArgs.toLowerCase()); + } else { + return originalArgs.length === 1 && loginArgs.includes(originalArgs[0].toLowerCase()) || + (originalArgs.length === 2 && + (((loginArgs.includes(originalArgs[0].toLowerCase())) || loginArgs.includes(originalArgs[1].toLowerCase()))) + && ((pwshImpliedArgs.includes(originalArgs[0].toLowerCase())) || pwshImpliedArgs.includes(originalArgs[1].toLowerCase()))); + } +} + +function arePwshImpliedArgs(originalArgs: string | string[]): boolean { + if (typeof originalArgs === 'string') { + return pwshImpliedArgs.includes(originalArgs.toLowerCase()); + } else { + return originalArgs.length === 0 || originalArgs?.length === 1 && pwshImpliedArgs.includes(originalArgs[0].toLowerCase()); + } +} + +function areZshBashLoginArgs(originalArgs: string | string[]): boolean { + return originalArgs === 'string' && loginArgs.includes(originalArgs.toLowerCase()) + || typeof originalArgs !== 'string' && originalArgs.length === 1 && loginArgs.includes(originalArgs[0].toLowerCase()); +} diff --git a/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.contribution.ts b/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.contribution.ts index 86183be9c77..d3d2e293eb3 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.contribution.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalExtensionPoints.contribution.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ITerminalContributionService, TerminalContributionService } from './terminalExtensionPoints'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { ITerminalContributionService, TerminalContributionService } from 'vs/workbench/contrib/terminal/common/terminalExtensionPoints'; registerSingleton(ITerminalContributionService, TerminalContributionService, true); diff --git a/src/vs/workbench/contrib/terminal/common/terminalStrings.ts b/src/vs/workbench/contrib/terminal/common/terminalStrings.ts index 47269288663..b1c5f61fb86 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalStrings.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalStrings.ts @@ -18,6 +18,7 @@ export function formatMessageForTerminal(message: string, excludeLeadingNewLine: */ export const terminalStrings = { terminal: localize('terminal', "Terminal"), + doNotShowAgain: localize('doNotShowAgain', 'Do Not Show Again'), focus: { value: localize('workbench.action.terminal.focus', "Focus Terminal"), original: 'Focus Terminal' diff --git a/src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalBackend.ts b/src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalBackend.ts index eadc38d5866..74fb08b2f02 100644 --- a/src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalBackend.ts +++ b/src/vs/workbench/contrib/terminal/electron-sandbox/localTerminalBackend.ts @@ -45,7 +45,7 @@ export class LocalTerminalBackendContribution implements IWorkbenchContribution class LocalTerminalBackend extends BaseTerminalBackend implements ITerminalBackend { private readonly _ptys: Map = new Map(); - private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number, workspaceId: string, instanceId: number }>()); + private readonly _onDidRequestDetach = this._register(new Emitter<{ requestId: number; workspaceId: string; instanceId: number }>()); readonly onDidRequestDetach = this._onDidRequestDetach.event; constructor( @@ -87,7 +87,11 @@ class LocalTerminalBackend extends BaseTerminalBackend implements ITerminalBacke // Listen for config changes const initialConfig = configurationService.getValue(TERMINAL_CONFIG_SECTION); for (const match of Object.keys(initialConfig.autoReplies)) { - this._localPtyService.installAutoReply(match, initialConfig.autoReplies[match]); + // Ensure the reply is value + const reply = initialConfig.autoReplies[match] as string | null; + if (reply) { + this._localPtyService.installAutoReply(match, reply); + } } // TODO: Could simplify update to a single call this._register(configurationService.onDidChangeConfiguration(async e => { @@ -95,7 +99,11 @@ class LocalTerminalBackend extends BaseTerminalBackend implements ITerminalBacke this._localPtyService.uninstallAllAutoReplies(); const config = configurationService.getValue(TERMINAL_CONFIG_SECTION); for (const match of Object.keys(config.autoReplies)) { - await this._localPtyService.installAutoReply(match, config.autoReplies[match]); + // Ensure the reply is value + const reply = config.autoReplies[match] as string | null; + if (reply) { + await this._localPtyService.installAutoReply(match, reply); + } } } })); @@ -123,7 +131,7 @@ class LocalTerminalBackend extends BaseTerminalBackend implements ITerminalBacke await this._localPtyService.updateTitle(id, title, titleSource); } - async updateIcon(id: number, icon: URI | { light: URI; dark: URI } | { id: string, color?: { id: string } }, color?: string): Promise { + async updateIcon(id: number, icon: URI | { light: URI; dark: URI } | { id: string; color?: { id: string } }, color?: string): Promise { await this._localPtyService.updateIcon(id, icon, color); } diff --git a/src/vs/workbench/contrib/terminal/test/browser/capabilities/commandDetectionCapability.test.ts b/src/vs/workbench/contrib/terminal/test/browser/capabilities/commandDetectionCapability.test.ts new file mode 100644 index 00000000000..5b876401ebe --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/capabilities/commandDetectionCapability.test.ts @@ -0,0 +1,126 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { deepStrictEqual, ok } from 'assert'; +import { timeout } from 'vs/base/common/async'; +import { Terminal } from 'xterm'; +import { CommandDetectionCapability } from 'vs/workbench/contrib/terminal/browser/capabilities/commandDetectionCapability'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { ITerminalCommand } from 'vs/workbench/contrib/terminal/common/terminal'; + +async function writeP(terminal: Terminal, data: string): Promise { + return new Promise((resolve, reject) => { + const failTimeout = timeout(2000); + failTimeout.then(() => reject('Writing to xterm is taking longer than 2 seconds')); + terminal.write(data, () => { + failTimeout.cancel(); + resolve(); + }); + }); +} + +type TestTerminalCommandMatch = Pick & { marker: { line: number } }; + +class TestCommandDetectionCapability extends CommandDetectionCapability { + clearCommands() { + this._commands.length = 0; + } +} + +suite('CommandDetectionCapability', () => { + let xterm: Terminal; + let capability: TestCommandDetectionCapability; + let addEvents: ITerminalCommand[]; + + function assertCommands(expectedCommands: TestTerminalCommandMatch[]) { + deepStrictEqual(capability.commands.map(e => e.command), expectedCommands.map(e => e.command)); + deepStrictEqual(capability.commands.map(e => e.cwd), expectedCommands.map(e => e.cwd)); + deepStrictEqual(capability.commands.map(e => e.exitCode), expectedCommands.map(e => e.exitCode)); + deepStrictEqual(capability.commands.map(e => e.marker?.line), expectedCommands.map(e => e.marker?.line)); + // Ensure timestamps are set and were captured recently + for (const command of capability.commands) { + ok(Math.abs(Date.now() - command.timestamp) < 2000); + } + deepStrictEqual(addEvents, capability.commands); + // Clear the commands to avoid re-asserting past commands + addEvents.length = 0; + capability.clearCommands(); + } + + async function printStandardCommand(prompt: string, command: string, output: string, cwd: string | undefined, exitCode: number) { + if (cwd !== undefined) { + capability.setCwd(cwd); + } + capability.handlePromptStart(); + await writeP(xterm, `\r${prompt}`); + capability.handleCommandStart(); + await writeP(xterm, command); + capability.handleCommandExecuted(); + await writeP(xterm, `\r\n${output}\r\n`); + capability.handleCommandFinished(exitCode); + } + + setup(() => { + xterm = new Terminal({ cols: 80 }); + capability = new TestCommandDetectionCapability(xterm, new NullLogService()); + addEvents = []; + capability.onCommandFinished(e => addEvents.push(e)); + assertCommands([]); + }); + + test('should not add commands when no capability methods are triggered', async () => { + await writeP(xterm, 'foo\r\nbar\r\n'); + assertCommands([]); + await writeP(xterm, 'baz\r\n'); + assertCommands([]); + }); + + test('should add commands for expected capability method calls', async () => { + await printStandardCommand('$ ', 'echo foo', 'foo', undefined, 0); + assertCommands([{ + command: 'echo foo', + exitCode: 0, + cwd: undefined, + marker: { line: 0 } + }]); + }); + + test('should trim the command when command executed appears on the following line', async () => { + await printStandardCommand('$ ', 'echo foo\r\n', 'foo', undefined, 0); + assertCommands([{ + command: 'echo foo', + exitCode: 0, + cwd: undefined, + marker: { line: 0 } + }]); + }); + + suite('cwd', () => { + test('should add cwd to commands when it\'s set', async () => { + await printStandardCommand('$ ', 'echo foo', 'foo', '/home', 0); + await printStandardCommand('$ ', 'echo bar', 'bar', '/home/second', 0); + assertCommands([ + { command: 'echo foo', exitCode: 0, cwd: '/home', marker: { line: 0 } }, + { command: 'echo bar', exitCode: 0, cwd: '/home/second', marker: { line: 2 } } + ]); + }); + test('should add old cwd to commands if no cwd sequence is output', async () => { + await printStandardCommand('$ ', 'echo foo', 'foo', '/home', 0); + await printStandardCommand('$ ', 'echo bar', 'bar', undefined, 0); + assertCommands([ + { command: 'echo foo', exitCode: 0, cwd: '/home', marker: { line: 0 } }, + { command: 'echo bar', exitCode: 0, cwd: '/home', marker: { line: 2 } } + ]); + }); + test('should use an undefined cwd if it\'s not set initially', async () => { + await printStandardCommand('$ ', 'echo foo', 'foo', undefined, 0); + await printStandardCommand('$ ', 'echo bar', 'bar', '/home', 0); + assertCommands([ + { command: 'echo foo', exitCode: 0, cwd: undefined, marker: { line: 0 } }, + { command: 'echo bar', exitCode: 0, cwd: '/home', marker: { line: 2 } } + ]); + }); + }); +}); diff --git a/src/vs/workbench/contrib/terminal/test/browser/capabilities/partialCommandDetectionCapability.test.ts b/src/vs/workbench/contrib/terminal/test/browser/capabilities/partialCommandDetectionCapability.test.ts new file mode 100644 index 00000000000..05ae39dd9fe --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/capabilities/partialCommandDetectionCapability.test.ts @@ -0,0 +1,66 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { deepStrictEqual } from 'assert'; +import { timeout } from 'vs/base/common/async'; +import { PartialCommandDetectionCapability } from 'vs/workbench/contrib/terminal/browser/capabilities/partialCommandDetectionCapability'; +import { IMarker, Terminal } from 'xterm'; +import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; + +async function writeP(terminal: Terminal, data: string): Promise { + return new Promise((resolve, reject) => { + const failTimeout = timeout(2000); + failTimeout.then(() => reject('Writing to xterm is taking longer than 2 seconds')); + terminal.write(data, () => { + failTimeout.cancel(); + resolve(); + }); + }); +} + +interface TestTerminal extends Terminal { + _core: IXtermCore; +} + +suite('PartialCommandDetectionCapability', () => { + let xterm: TestTerminal; + let capability: PartialCommandDetectionCapability; + let addEvents: IMarker[]; + + function assertCommands(expectedLines: number[]) { + deepStrictEqual(capability.commands.map(e => e.line), expectedLines); + deepStrictEqual(addEvents.map(e => e.line), expectedLines); + } + + setup(() => { + xterm = new Terminal({ cols: 80 }) as TestTerminal; + capability = new PartialCommandDetectionCapability(xterm); + addEvents = []; + capability.onCommandFinished(e => addEvents.push(e)); + }); + + test('should not add commands when the cursor position is too close to the left side', async () => { + assertCommands([]); + xterm._core._onKey.fire({ key: '\x0d' }); + await writeP(xterm, '\r\n'); + assertCommands([]); + await writeP(xterm, 'a'); + xterm._core._onKey.fire({ key: '\x0d' }); + await writeP(xterm, '\r\n'); + assertCommands([]); + }); + + test('should add commands when the cursor position is not too close to the left side', async () => { + assertCommands([]); + await writeP(xterm, 'ab'); + xterm._core._onKey.fire({ key: '\x0d' }); + await writeP(xterm, '\r\n\r\n'); + assertCommands([0]); + await writeP(xterm, 'cd'); + xterm._core._onKey.fire({ key: '\x0d' }); + await writeP(xterm, '\r\n'); + assertCommands([0, 2]); + }); +}); diff --git a/src/vs/workbench/contrib/terminal/test/common/capabilities/terminalCapabilityStore.test.ts b/src/vs/workbench/contrib/terminal/test/browser/capabilities/terminalCapabilityStore.test.ts similarity index 98% rename from src/vs/workbench/contrib/terminal/test/common/capabilities/terminalCapabilityStore.test.ts rename to src/vs/workbench/contrib/terminal/test/browser/capabilities/terminalCapabilityStore.test.ts index f6ac406206f..5c3d859db1d 100644 --- a/src/vs/workbench/contrib/terminal/test/common/capabilities/terminalCapabilityStore.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/capabilities/terminalCapabilityStore.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { deepStrictEqual } from 'assert'; -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; import { TerminalCapabilityStore, TerminalCapabilityStoreMultiplexer } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; suite('TerminalCapabilityStore', () => { diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/linkTestUtils.ts b/src/vs/workbench/contrib/terminal/test/browser/links/linkTestUtils.ts new file mode 100644 index 00000000000..75d54ac3daf --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/links/linkTestUtils.ts @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { deepStrictEqual } from 'assert'; +import { ITerminalLinkDetector, ITerminalSimpleLink, ResolvedLink, TerminalLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { URI } from 'vs/base/common/uri'; +import { IBufferLine } from 'xterm'; +import { Schemas } from 'vs/base/common/network'; + +export async function assertLinkHelper( + text: string, + expected: (Pick & { range: [number, number][] })[], + detector: ITerminalLinkDetector, + expectedType: TerminalLinkType +) { + detector.xterm.reset(); + + // Write the text and wait for the parser to finish + await new Promise(r => detector.xterm.write(text, r)); + + // Ensure all links are provided + const lines: IBufferLine[] = []; + for (let i = 0; i < detector.xterm.buffer.active.cursorY + 1; i++) { + lines.push(detector.xterm.buffer.active.getLine(i)!); + } + + const actualLinks = (await detector.detect(lines, 0, detector.xterm.buffer.active.cursorY)).map(e => { + return { + text: e.text, + type: expectedType, + bufferRange: e.bufferRange + }; + }); + const expectedLinks = expected.map(e => { + return { + type: expectedType, + text: e.text, + bufferRange: { + start: { x: e.range[0][0], y: e.range[0][1] }, + end: { x: e.range[1][0], y: e.range[1][1] }, + } + }; + }); + deepStrictEqual(actualLinks, expectedLinks); +} + +export async function resolveLinkForTest(link: string, uri?: URI): Promise { + return { + link, + uri: URI.from({ scheme: Schemas.file, path: link }), + isDirectory: false, + }; +} diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkHelpers.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkHelpers.test.ts index 56c271e5825..400cfc3f5fa 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkHelpers.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkHelpers.test.ts @@ -156,7 +156,7 @@ suite('Workbench - Terminal Link Helpers', () => { const TEST_WIDE_CHAR = '文'; const TEST_NULL_CHAR = 'C'; -function createBufferLineArray(lines: { text: string, width: number }[]): IBufferLine[] { +function createBufferLineArray(lines: { text: string; width: number }[]): IBufferLine[] { const result: IBufferLine[] = []; lines.forEach((l, i) => { result.push(new TestBufferLine( diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts new file mode 100644 index 00000000000..18bbf9e4d82 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts @@ -0,0 +1,168 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { deepStrictEqual, strictEqual } from 'assert'; +import { equals } from 'vs/base/common/arrays'; +import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { ILogService, NullLogService } from 'vs/platform/log/common/log'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; +import { IViewDescriptorService } from 'vs/workbench/common/views'; +import { IDetectedLinks, TerminalLinkManager } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; +import { ITerminalCapabilityImplMap, ITerminalCapabilityStore, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { ITerminalConfiguration, ITerminalProcessManager } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TestViewDescriptorService } from 'vs/workbench/contrib/terminal/test/browser/xterm/xtermTerminal.test'; +import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; +import { ILink, Terminal } from 'xterm'; + +const defaultTerminalConfig: Partial = { + fontFamily: 'monospace', + fontWeight: 'normal', + fontWeightBold: 'normal', + gpuAcceleration: 'off', + scrollback: 1000, + fastScrollSensitivity: 2, + mouseWheelScrollSensitivity: 1, + unicodeVersion: '11' +}; + +class TestLinkManager extends TerminalLinkManager { + private _links: IDetectedLinks | undefined; + protected override async _getLinksForType(y: number, type: 'word' | 'url' | 'localFile'): Promise { + switch (type) { + case 'word': + return this._links?.wordLinks?.[y] ? [this._links?.wordLinks?.[y]] : undefined; + case 'url': + return this._links?.webLinks?.[y] ? [this._links?.webLinks?.[y]] : undefined; + case 'localFile': + return this._links?.fileLinks?.[y] ? [this._links?.fileLinks?.[y]] : undefined; + } + } + setLinks(links: IDetectedLinks): void { + this._links = links; + } +} + +suite('TerminalLinkManager', () => { + let instantiationService: TestInstantiationService; + let configurationService: TestConfigurationService; + let themeService: TestThemeService; + let viewDescriptorService: TestViewDescriptorService; + let xterm: Terminal; + let linkManager: TestLinkManager; + + setup(() => { + configurationService = new TestConfigurationService({ + editor: { + fastScrollSensitivity: 2, + mouseWheelScrollSensitivity: 1 + } as Partial, + terminal: { + integrated: defaultTerminalConfig + } + }); + themeService = new TestThemeService(); + viewDescriptorService = new TestViewDescriptorService(); + + instantiationService = new TestInstantiationService(); + instantiationService.stub(IConfigurationService, configurationService); + instantiationService.stub(ILogService, new NullLogService()); + instantiationService.stub(IStorageService, new TestStorageService()); + instantiationService.stub(IThemeService, themeService); + instantiationService.stub(IViewDescriptorService, viewDescriptorService); + + xterm = new Terminal({ cols: 80, rows: 30 }); + linkManager = instantiationService.createInstance(TestLinkManager, xterm, upcastPartial({}), { + get(capability: T): ITerminalCapabilityImplMap[T] | undefined { + return undefined; + } + } as Partial); + }); + + suite('getLinks and open recent link', () => { + test('should return no links', async () => { + const links = await linkManager.getLinks(); + equals(links.webLinks, []); + equals(links.wordLinks, []); + equals(links.fileLinks, []); + const webLink = await linkManager.openRecentLink('url'); + strictEqual(webLink, undefined); + const fileLink = await linkManager.openRecentLink('localFile'); + strictEqual(fileLink, undefined); + }); + test('should return word links in order', async () => { + const link1 = { + range: { + start: { x: 1, y: 1 }, end: { x: 14, y: 1 } + }, + text: '1_我是学生.txt', + activate: () => Promise.resolve('') + }; + const link2 = { + range: { + start: { x: 1, y: 1 }, end: { x: 14, y: 1 } + }, + text: '2_我是学生.txt', + activate: () => Promise.resolve('') + }; + linkManager.setLinks({ wordLinks: [link1, link2] }); + const links = await linkManager.getLinks(); + deepStrictEqual(links.wordLinks?.[0].text, link2.text); + deepStrictEqual(links.wordLinks?.[1].text, link1.text); + const webLink = await linkManager.openRecentLink('url'); + strictEqual(webLink, undefined); + const fileLink = await linkManager.openRecentLink('localFile'); + strictEqual(fileLink, undefined); + }); + test('should return web links in order', async () => { + const link1 = { + range: { start: { x: 5, y: 1 }, end: { x: 40, y: 1 } }, + text: 'https://foo.bar/[this is foo site 1]', + activate: () => Promise.resolve('') + }; + const link2 = { + range: { start: { x: 5, y: 2 }, end: { x: 40, y: 2 } }, + text: 'https://foo.bar/[this is foo site 2]', + activate: () => Promise.resolve('') + }; + linkManager.setLinks({ webLinks: [link1, link2] }); + const links = await linkManager.getLinks(); + deepStrictEqual(links.webLinks?.[0].text, link2.text); + deepStrictEqual(links.webLinks?.[1].text, link1.text); + const webLink = await linkManager.openRecentLink('url'); + strictEqual(webLink, link2); + const fileLink = await linkManager.openRecentLink('localFile'); + strictEqual(fileLink, undefined); + }); + test('should return file links in order', async () => { + const link1 = { + range: { start: { x: 1, y: 1 }, end: { x: 32, y: 1 } }, + text: 'file:///C:/users/test/file_1.txt', + activate: () => Promise.resolve('') + }; + const link2 = { + range: { start: { x: 1, y: 2 }, end: { x: 32, y: 2 } }, + text: 'file:///C:/users/test/file_2.txt', + activate: () => Promise.resolve('') + }; + linkManager.setLinks({ fileLinks: [link1, link2] }); + const links = await linkManager.getLinks(); + deepStrictEqual(links.fileLinks?.[0].text, link2.text); + deepStrictEqual(links.fileLinks?.[1].text, link1.text); + const webLink = await linkManager.openRecentLink('url'); + strictEqual(webLink, undefined); + linkManager.setLinks({ fileLinks: [link2] }); + const fileLink = await linkManager.openRecentLink('localFile'); + strictEqual(fileLink, link2); + }); + }); +}); +function upcastPartial(v: Partial): T { + return v as T; +} diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkOpeners.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkOpeners.test.ts new file mode 100644 index 00000000000..dc1bfd813e4 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkOpeners.test.ts @@ -0,0 +1,199 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { deepStrictEqual } from 'assert'; +import { Schemas } from 'vs/base/common/network'; +import { OperatingSystem } from 'vs/base/common/platform'; +import { URI } from 'vs/base/common/uri'; +import { ITextResourceEditorInput } from 'vs/platform/editor/common/editor'; +import { IFileService, IFileStat, IFileStatWithMetadata, IResolveFileOptions, IResolveMetadataFileOptions } from 'vs/platform/files/common/files'; +import { FileService } from 'vs/platform/files/common/fileService'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { ILogService, NullLogService } from 'vs/platform/log/common/log'; +import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { CommandDetectionCapability } from 'vs/workbench/contrib/terminal/browser/capabilities/commandDetectionCapability'; +import { TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { TerminalLocalFileLinkOpener, TerminalLocalFolderInWorkspaceLinkOpener, TerminalSearchLinkOpener } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkOpeners'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { TerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; +import { ITerminalCommand, IXtermMarker } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; +import { Terminal } from 'xterm'; + +export interface ITerminalLinkActivationResult { + source: 'editor' | 'search'; + link: string; +} + +class TestCommandDetectionCapability extends CommandDetectionCapability { + setCommands(commands: ITerminalCommand[]) { + this._commands = commands; + } +} + +class TestFileService extends FileService { + private _files: URI[] | '*' = '*'; + override async resolve(resource: URI, options: IResolveMetadataFileOptions): Promise; + override async resolve(resource: URI, options?: IResolveFileOptions): Promise; + override async resolve(resource: URI, options?: IResolveFileOptions): Promise { + if (this._files === '*' || this._files.some(e => e.toString() === resource.toString())) { + return { isFile: true, isDirectory: false, isSymbolicLink: false } as IFileStat; + } else { + return { isFile: false, isDirectory: false, isSymbolicLink: false } as IFileStat; + } + } + setFiles(files: URI[] | '*'): void { + this._files = files; + } +} + +suite('Workbench - TerminalLinkOpeners', () => { + let instantiationService: TestInstantiationService; + let fileService: TestFileService; + let activationResult: ITerminalLinkActivationResult | undefined; + let xterm: Terminal; + + setup(() => { + instantiationService = new TestInstantiationService(); + fileService = new TestFileService(new NullLogService()); + instantiationService.set(IFileService, fileService); + instantiationService.set(ILogService, new NullLogService()); + instantiationService.set(IWorkspaceContextService, new TestContextService()); + instantiationService.stub(IWorkbenchEnvironmentService, { + remoteAuthority: undefined + } as Partial); + // Allow intercepting link activations + activationResult = undefined; + instantiationService.stub(IQuickInputService, { + quickAccess: { + show(link: string) { + activationResult = { link, source: 'search' }; + } + } + } as Partial); + instantiationService.stub(IEditorService, { + async openEditor(editor: ITextResourceEditorInput): Promise { + activationResult = { + source: 'editor', + link: editor.resource?.toString() + }; + } + } as Partial); + // /*editorServiceSpy = */instantiationService.spy(IEditorService, 'openEditor'); + xterm = new Terminal(); + }); + + suite('TerminalSearchLinkOpener', () => { + let opener: TerminalSearchLinkOpener; + let capabilities: TerminalCapabilityStore; + let commandDetection: TestCommandDetectionCapability; + let localFileOpener: TerminalLocalFileLinkOpener; + + setup(() => { + capabilities = new TerminalCapabilityStore(); + commandDetection = instantiationService.createInstance(TestCommandDetectionCapability, xterm); + capabilities.add(TerminalCapability.CommandDetection, commandDetection); + }); + + suite('macOS/Linux', () => { + setup(() => { + localFileOpener = instantiationService.createInstance(TerminalLocalFileLinkOpener, OperatingSystem.Linux); + const localFolderOpener = instantiationService.createInstance(TerminalLocalFolderInWorkspaceLinkOpener); + opener = instantiationService.createInstance(TerminalSearchLinkOpener, capabilities, localFileOpener, localFolderOpener, OperatingSystem.Linux); + }); + + test('should apply the cwd to the link only when the file exists and cwdDetection is enabled', async () => { + const cwd = '/Users/home/folder'; + const absoluteFile = '/Users/home/folder/file.txt'; + fileService.setFiles([ + URI.from({ scheme: Schemas.file, path: absoluteFile }) + ]); + + // Set a fake detected command starting as line 0 to establish the cwd + commandDetection.setCommands([{ + command: '', + cwd, + timestamp: 0, + getOutput() { return undefined; }, + marker: { + line: 0 + } as Partial as any + }]); + await opener.open({ + text: 'file.txt', + bufferRange: { start: { x: 1, y: 1 }, end: { x: 8, y: 1 } }, + type: TerminalBuiltinLinkType.Search + }); + deepStrictEqual(activationResult, { + link: 'file:///Users/home/folder/file.txt', + source: 'editor' + }); + + // Clear deteceted commands and ensure the same request results in a search + commandDetection.setCommands([]); + await opener.open({ + text: 'file.txt', + bufferRange: { start: { x: 1, y: 1 }, end: { x: 8, y: 1 } }, + type: TerminalBuiltinLinkType.Search + }); + deepStrictEqual(activationResult, { + link: 'file.txt', + source: 'search' + }); + }); + }); + + suite('Windows', () => { + setup(() => { + localFileOpener = instantiationService.createInstance(TerminalLocalFileLinkOpener, OperatingSystem.Windows); + const localFolderOpener = instantiationService.createInstance(TerminalLocalFolderInWorkspaceLinkOpener); + opener = instantiationService.createInstance(TerminalSearchLinkOpener, capabilities, localFileOpener, localFolderOpener, OperatingSystem.Windows); + }); + + test('should apply the cwd to the link only when the file exists and cwdDetection is enabled', async () => { + const cwd = 'c:\\Users\\home\\folder'; + const absoluteFile = 'c:\\Users\\home\\folder\\file.txt'; + fileService.setFiles([ + URI.from({ scheme: Schemas.file, path: absoluteFile }) + ]); + + // Set a fake detected command starting as line 0 to establish the cwd + commandDetection.setCommands([{ + command: '', + cwd, + timestamp: 0, + getOutput() { return undefined; }, + marker: { + line: 0 + } as Partial as any + }]); + await opener.open({ + text: 'file.txt', + bufferRange: { start: { x: 1, y: 1 }, end: { x: 8, y: 1 } }, + type: TerminalBuiltinLinkType.Search + }); + deepStrictEqual(activationResult, { + link: 'file:///c%3A%5CUsers%5Chome%5Cfolder%5Cfile.txt', + source: 'editor' + }); + + // Clear deteceted commands and ensure the same request results in a search + commandDetection.setCommands([]); + await opener.open({ + text: 'file.txt', + bufferRange: { start: { x: 1, y: 1 }, end: { x: 8, y: 1 } }, + type: TerminalBuiltinLinkType.Search + }); + deepStrictEqual(activationResult, { + link: 'file.txt', + source: 'search' + }); + }); + }); + }); +}); diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalLocalLinkDetector.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLocalLinkDetector.test.ts new file mode 100644 index 00000000000..9332b486f9d --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLocalLinkDetector.test.ts @@ -0,0 +1,172 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { OperatingSystem } from 'vs/base/common/platform'; +import { format } from 'vs/base/common/strings'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { ITerminalSimpleLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { TerminalLocalLinkDetector } from 'vs/workbench/contrib/terminal/browser/links/terminalLocalLinkDetector'; +import { assertLinkHelper, resolveLinkForTest } from 'vs/workbench/contrib/terminal/test/browser/links/linkTestUtils'; +import { Terminal } from 'xterm'; + +const unixLinks = [ + '/foo', + '~/foo', + './foo', + './$foo', + '../foo', + '/foo/bar', + '/foo/bar+more', + 'foo/bar', + 'foo/bar+more', +]; + +const windowsLinks = [ + 'c:\\foo', + '\\\\?\\c:\\foo', + 'c:/foo', + '.\\foo', + './foo', + './$foo', + '..\\foo', + '~\\foo', + '~/foo', + 'c:/foo/bar', + 'c:\\foo\\bar', + 'c:\\foo\\bar+more', + 'c:\\foo/bar\\baz', + 'foo/bar', + 'foo/bar', + 'foo\\bar', + 'foo\\bar+more', +]; + +interface LinkFormatInfo { + urlFormat: string; + line?: string; + column?: string; +} + +const supportedLinkFormats: LinkFormatInfo[] = [ + { urlFormat: '{0}' }, + { urlFormat: '{0} on line {1}', line: '5' }, + { urlFormat: '{0} on line {1}, column {2}', line: '5', column: '3' }, + { urlFormat: '{0}:line {1}', line: '5' }, + { urlFormat: '{0}:line {1}, column {2}', line: '5', column: '3' }, + { urlFormat: '{0}({1})', line: '5' }, + { urlFormat: '{0} ({1})', line: '5' }, + { urlFormat: '{0}({1},{2})', line: '5', column: '3' }, + { urlFormat: '{0} ({1},{2})', line: '5', column: '3' }, + { urlFormat: '{0}({1}, {2})', line: '5', column: '3' }, + { urlFormat: '{0} ({1}, {2})', line: '5', column: '3' }, + { urlFormat: '{0}:{1}', line: '5' }, + { urlFormat: '{0}:{1}:{2}', line: '5', column: '3' }, + { urlFormat: '{0}[{1}]', line: '5' }, + { urlFormat: '{0} [{1}]', line: '5' }, + { urlFormat: '{0}[{1},{2}]', line: '5', column: '3' }, + { urlFormat: '{0} [{1},{2}]', line: '5', column: '3' }, + { urlFormat: '{0}[{1}, {2}]', line: '5', column: '3' }, + { urlFormat: '{0} [{1}, {2}]', line: '5', column: '3' }, + { urlFormat: '{0}",{1}', line: '5' }, + { urlFormat: '{0}\',{1}', line: '5' } +]; + +suite('Workbench - TerminalLocalLinkDetector', () => { + let instantiationService: TestInstantiationService; + let configurationService: TestConfigurationService; + let detector: TerminalLocalLinkDetector; + let xterm: Terminal; + + async function assertLink( + type: TerminalBuiltinLinkType, + text: string, + expected: (Pick & { range: [number, number][] })[] + ) { + await assertLinkHelper(text, expected, detector, type); + } + + setup(() => { + instantiationService = new TestInstantiationService(); + configurationService = new TestConfigurationService(); + instantiationService.stub(IConfigurationService, configurationService); + + xterm = new Terminal({ cols: 80, rows: 30 }); + }); + + suite('platform independent', () => { + setup(() => { + detector = instantiationService.createInstance(TerminalLocalLinkDetector, xterm, OperatingSystem.Linux, resolveLinkForTest); + }); + + test('should support multiple link results', async () => { + await assertLink(TerminalBuiltinLinkType.LocalFile, './foo ./bar', [ + { range: [[1, 1], [5, 1]], text: './foo' }, + { range: [[7, 1], [11, 1]], text: './bar' } + ]); + }); + }); + + suite('macOS/Linux', () => { + setup(() => { + detector = instantiationService.createInstance(TerminalLocalLinkDetector, xterm, OperatingSystem.Linux, resolveLinkForTest); + }); + + for (const baseLink of unixLinks) { + suite(`Link: ${baseLink}`, () => { + for (let i = 0; i < supportedLinkFormats.length; i++) { + const linkFormat = supportedLinkFormats[i]; + test(`Format: ${linkFormat.urlFormat}`, async () => { + const formattedLink = format(linkFormat.urlFormat, baseLink, linkFormat.line, linkFormat.column); + await assertLink(TerminalBuiltinLinkType.LocalFile, formattedLink, [{ text: formattedLink, range: [[1, 1], [formattedLink.length, 1]] }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, ` ${formattedLink} `, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, `(${formattedLink})`, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, `[${formattedLink}]`, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); + }); + } + }); + } + + test('Git diff links', async () => { + await assertLink(TerminalBuiltinLinkType.LocalFile, `diff --git a/foo/bar b/foo/bar`, [ + { text: 'foo/bar', range: [[14, 1], [20, 1]] }, + { text: 'foo/bar', range: [[24, 1], [30, 1]] } + ]); + await assertLink(TerminalBuiltinLinkType.LocalFile, `--- a/foo/bar`, [{ text: 'foo/bar', range: [[7, 1], [13, 1]] }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, `+++ b/foo/bar`, [{ text: 'foo/bar', range: [[7, 1], [13, 1]] }]); + }); + }); + + suite('Windows', () => { + setup(() => { + detector = instantiationService.createInstance(TerminalLocalLinkDetector, xterm, OperatingSystem.Windows, resolveLinkForTest); + }); + + for (const baseLink of windowsLinks) { + suite(`Link "${baseLink}"`, () => { + for (let i = 0; i < supportedLinkFormats.length; i++) { + const linkFormat = supportedLinkFormats[i]; + test(`Format: ${linkFormat.urlFormat}`, async () => { + const formattedLink = format(linkFormat.urlFormat, baseLink, linkFormat.line, linkFormat.column); + await assertLink(TerminalBuiltinLinkType.LocalFile, formattedLink, [{ text: formattedLink, range: [[1, 1], [formattedLink.length, 1]] }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, ` ${formattedLink} `, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, `(${formattedLink})`, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, `[${formattedLink}]`, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); + }); + } + }); + } + + test('Git diff links', async () => { + await assertLink(TerminalBuiltinLinkType.LocalFile, `diff --git a/foo/bar b/foo/bar`, [ + { text: 'foo/bar', range: [[14, 1], [20, 1]] }, + { text: 'foo/bar', range: [[24, 1], [30, 1]] } + ]); + await assertLink(TerminalBuiltinLinkType.LocalFile, `--- a/foo/bar`, [{ text: 'foo/bar', range: [[7, 1], [13, 1]] }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, `+++ b/foo/bar`, [{ text: 'foo/bar', range: [[7, 1], [13, 1]] }]); + }); + }); +}); diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalProtocolLinkProvider.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalProtocolLinkProvider.test.ts deleted file mode 100644 index 2f80b63cd79..00000000000 --- a/src/vs/workbench/contrib/terminal/test/browser/links/terminalProtocolLinkProvider.test.ts +++ /dev/null @@ -1,89 +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 * as assert from 'assert'; -import { TerminalProtocolLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider'; -import { Terminal, ILink } from 'xterm'; -import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { URI } from 'vs/base/common/uri'; - -suite('Workbench - TerminalProtocolLinkProvider', () => { - let instantiationService: TestInstantiationService; - - setup(() => { - instantiationService = new TestInstantiationService(); - instantiationService.stub(IConfigurationService, TestConfigurationService); - }); - - async function assertLink(text: string, expected: { text: string, range: [number, number][] }[]) { - const xterm = new Terminal(); - const provider = instantiationService.createInstance(TerminalProtocolLinkProvider, xterm, () => { }, () => { }, () => { }, (text: string, cb: (result: { uri: URI, isDirectory: boolean } | undefined) => void) => { - cb({ uri: URI.parse(text), isDirectory: false }); - }); - - // Write the text and wait for the parser to finish - await new Promise(r => xterm.write(text, r)); - - // Ensure all links are provided - const links = (await new Promise(r => provider.provideLinks(1, r)))!; - assert.strictEqual(links.length, expected.length); - const actual = links.map(e => ({ - text: e.text, - range: e.range - })); - const expectedVerbose = expected.map(e => ({ - text: e.text, - range: { - start: { x: e.range[0][0], y: e.range[0][1] }, - end: { x: e.range[1][0], y: e.range[1][1] }, - } - })); - assert.deepStrictEqual(actual, expectedVerbose); - } - - // These tests are based on LinkComputer.test.ts - test('LinkComputer cases', async () => { - await assertLink('x = "http://foo.bar";', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('x = (http://foo.bar);', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('x = \'http://foo.bar\';', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('x = http://foo.bar ;', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('x = ;', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('x = {http://foo.bar};', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('(see http://foo.bar)', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('[see http://foo.bar]', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('{see http://foo.bar}', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('http://foo.bar', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); - await assertLink('// Click here to learn more. https://go.microsoft.com/fwlink/?LinkID=513275&clcid=0x409', [{ range: [[30, 1], [7, 2]], text: 'https://go.microsoft.com/fwlink/?LinkID=513275&clcid=0x409' }]); - await assertLink('// Click here to learn more. https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx', [{ range: [[30, 1], [28, 2]], text: 'https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx' }]); - await assertLink('// https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Scripts/selectNodeVersion.js', [{ range: [[4, 1], [9, 2]], text: 'https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Scripts/selectNodeVersion.js' }]); - await assertLink('', [{ range: [[49, 1], [14, 2]], text: 'https://go.microsoft.com/fwlink/?LinkId=166007' }]); - await assertLink('For instructions, see https://go.microsoft.com/fwlink/?LinkId=166007.', [{ range: [[23, 1], [68, 1]], text: 'https://go.microsoft.com/fwlink/?LinkId=166007' }]); - await assertLink('For instructions, see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx.', [{ range: [[23, 1], [21, 2]], text: 'https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx' }]); - await assertLink('x = "https://en.wikipedia.org/wiki/Zürich";', [{ range: [[6, 1], [41, 1]], text: 'https://en.wikipedia.org/wiki/Zürich' }]); - await assertLink('請參閱 http://go.microsoft.com/fwlink/?LinkId=761051。', [{ range: [[8, 1], [53, 1]], text: 'http://go.microsoft.com/fwlink/?LinkId=761051' }]); - await assertLink('(請參閱 http://go.microsoft.com/fwlink/?LinkId=761051)', [{ range: [[10, 1], [55, 1]], text: 'http://go.microsoft.com/fwlink/?LinkId=761051' }]); - await assertLink('x = "file:///foo.bar";', [{ range: [[6, 1], [20, 1]], text: 'file:///foo.bar' }]); - await assertLink('x = "file://c:/foo.bar";', [{ range: [[6, 1], [22, 1]], text: 'file://c:/foo.bar' }]); - await assertLink('x = "file://shares/foo.bar";', [{ range: [[6, 1], [26, 1]], text: 'file://shares/foo.bar' }]); - await assertLink('x = "file://shäres/foo.bar";', [{ range: [[6, 1], [26, 1]], text: 'file://shäres/foo.bar' }]); - await assertLink('Some text, then http://www.bing.com.', [{ range: [[17, 1], [35, 1]], text: 'http://www.bing.com' }]); - await assertLink('let url = `http://***/_api/web/lists/GetByTitle(\'Teambuildingaanvragen\')/items`;', [{ range: [[12, 1], [78, 1]], text: 'http://***/_api/web/lists/GetByTitle(\'Teambuildingaanvragen\')/items' }]); - await assertLink('7. At this point, ServiceMain has been called. There is no functionality presently in ServiceMain, but you can consult the [MSDN documentation](https://msdn.microsoft.com/en-us/library/windows/desktop/ms687414(v=vs.85).aspx) to add functionality as desired!', [{ range: [[66, 2], [64, 3]], text: 'https://msdn.microsoft.com/en-us/library/windows/desktop/ms687414(v=vs.85).aspx' }]); - await assertLink('let x = "http://[::1]:5000/connect/token"', [{ range: [[10, 1], [40, 1]], text: 'http://[::1]:5000/connect/token' }]); - await assertLink('2. Navigate to **https://portal.azure.com**', [{ range: [[18, 1], [41, 1]], text: 'https://portal.azure.com' }]); - await assertLink('POST|https://portal.azure.com|2019-12-05|', [{ range: [[6, 1], [29, 1]], text: 'https://portal.azure.com' }]); - await assertLink('aa https://foo.bar/[this is foo site] aa', [{ range: [[5, 1], [38, 1]], text: 'https://foo.bar/[this is foo site]' }]); - }); - - test('should support multiple link results', async () => { - await assertLink('http://foo.bar http://bar.foo', [ - { range: [[1, 1], [14, 1]], text: 'http://foo.bar' }, - { range: [[16, 1], [29, 1]], text: 'http://bar.foo' } - ]); - }); -}); diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalUriLinkDetector.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalUriLinkDetector.test.ts new file mode 100644 index 00000000000..949fb57e709 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalUriLinkDetector.test.ts @@ -0,0 +1,98 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { ITerminalSimpleLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { TerminalUriLinkDetector } from 'vs/workbench/contrib/terminal/browser/links/terminalUriLinkDetector'; +import { assertLinkHelper, resolveLinkForTest } from 'vs/workbench/contrib/terminal/test/browser/links/linkTestUtils'; +import { Terminal } from 'xterm'; + +suite('Workbench - TerminalUriLinkDetector', () => { + let configurationService: TestConfigurationService; + let detector: TerminalUriLinkDetector; + let xterm: Terminal; + + setup(() => { + const instantiationService = new TestInstantiationService(); + configurationService = new TestConfigurationService(); + + instantiationService.stub(IConfigurationService, configurationService); + + xterm = new Terminal({ cols: 80, rows: 30 }); + detector = instantiationService.createInstance(TerminalUriLinkDetector, xterm, resolveLinkForTest); + }); + + async function assertLink( + type: TerminalBuiltinLinkType, + text: string, + expected: (Pick & { range: [number, number][] })[] + ) { + await assertLinkHelper(text, expected, detector, type); + } + + test('LinkComputer cases', async () => { + await assertLink(TerminalBuiltinLinkType.Url, 'x = "http://foo.bar";', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'x = (http://foo.bar);', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'x = \'http://foo.bar\';', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'x = http://foo.bar ;', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'x = ;', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'x = {http://foo.bar};', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, '(see http://foo.bar)', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, '[see http://foo.bar]', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, '{see http://foo.bar}', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, '', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'http://foo.bar', [{ range: [[6, 1], [19, 1]], text: 'http://foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, '// Click here to learn more. https://go.microsoft.com/fwlink/?LinkID=513275&clcid=0x409', [{ range: [[30, 1], [7, 2]], text: 'https://go.microsoft.com/fwlink/?LinkID=513275&clcid=0x409' }]); + await assertLink(TerminalBuiltinLinkType.Url, '// Click here to learn more. https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx', [{ range: [[30, 1], [28, 2]], text: 'https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx' }]); + await assertLink(TerminalBuiltinLinkType.Url, '// https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Scripts/selectNodeVersion.js', [{ range: [[4, 1], [9, 2]], text: 'https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Scripts/selectNodeVersion.js' }]); + await assertLink(TerminalBuiltinLinkType.Url, '', [{ range: [[49, 1], [14, 2]], text: 'https://go.microsoft.com/fwlink/?LinkId=166007' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'For instructions, see https://go.microsoft.com/fwlink/?LinkId=166007.', [{ range: [[23, 1], [68, 1]], text: 'https://go.microsoft.com/fwlink/?LinkId=166007' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'For instructions, see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx.', [{ range: [[23, 1], [21, 2]], text: 'https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'x = "https://en.wikipedia.org/wiki/Zürich";', [{ range: [[6, 1], [41, 1]], text: 'https://en.wikipedia.org/wiki/Zürich' }]); + await assertLink(TerminalBuiltinLinkType.Url, '請參閱 http://go.microsoft.com/fwlink/?LinkId=761051。', [{ range: [[8, 1], [53, 1]], text: 'http://go.microsoft.com/fwlink/?LinkId=761051' }]); + await assertLink(TerminalBuiltinLinkType.Url, '(請參閱 http://go.microsoft.com/fwlink/?LinkId=761051)', [{ range: [[10, 1], [55, 1]], text: 'http://go.microsoft.com/fwlink/?LinkId=761051' }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, 'x = "file:///foo.bar";', [{ range: [[6, 1], [20, 1]], text: 'file:///foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, 'x = "file://c:/foo.bar";', [{ range: [[6, 1], [22, 1]], text: 'file://c:/foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, 'x = "file://shares/foo.bar";', [{ range: [[6, 1], [26, 1]], text: 'file://shares/foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.LocalFile, 'x = "file://shäres/foo.bar";', [{ range: [[6, 1], [26, 1]], text: 'file://shäres/foo.bar' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'Some text, then http://www.bing.com.', [{ range: [[17, 1], [35, 1]], text: 'http://www.bing.com' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'let url = `http://***/_api/web/lists/GetByTitle(\'Teambuildingaanvragen\')/items`;', [{ range: [[12, 1], [78, 1]], text: 'http://***/_api/web/lists/GetByTitle(\'Teambuildingaanvragen\')/items' }]); + await assertLink(TerminalBuiltinLinkType.Url, '7. At this point, ServiceMain has been called. There is no functionality presently in ServiceMain, but you can consult the [MSDN documentation](https://msdn.microsoft.com/en-us/library/windows/desktop/ms687414(v=vs.85).aspx) to add functionality as desired!', [{ range: [[66, 2], [64, 3]], text: 'https://msdn.microsoft.com/en-us/library/windows/desktop/ms687414(v=vs.85).aspx' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'let x = "http://[::1]:5000/connect/token"', [{ range: [[10, 1], [40, 1]], text: 'http://[::1]:5000/connect/token' }]); + await assertLink(TerminalBuiltinLinkType.Url, '2. Navigate to **https://portal.azure.com**', [{ range: [[18, 1], [41, 1]], text: 'https://portal.azure.com' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'POST|https://portal.azure.com|2019-12-05|', [{ range: [[6, 1], [29, 1]], text: 'https://portal.azure.com' }]); + await assertLink(TerminalBuiltinLinkType.Url, 'aa https://foo.bar/[this is foo site] aa', [{ range: [[5, 1], [38, 1]], text: 'https://foo.bar/[this is foo site]' }]); + }); + + test('should support multiple link results', async () => { + await assertLink(TerminalBuiltinLinkType.Url, 'http://foo.bar http://bar.foo', [ + { range: [[1, 1], [14, 1]], text: 'http://foo.bar' }, + { range: [[16, 1], [29, 1]], text: 'http://bar.foo' } + ]); + }); + test('should not filtrer out https:// link that exceed 1024 characters', async () => { + // 8 + 101 * 10 = 1018 characters + await assertLink(TerminalBuiltinLinkType.Url, `https://${'foobarbaz/'.repeat(101)}`, [{ + range: [[1, 1], [58, 13]], + text: `https://${'foobarbaz/'.repeat(101)}` + }]); + // 8 + 102 * 10 = 1028 characters + await assertLink(TerminalBuiltinLinkType.Url, `https://${'foobarbaz/'.repeat(102)}`, [{ + range: [[1, 1], [68, 13]], + text: `https://${'foobarbaz/'.repeat(102)}` + }]); + }); + test('should filter out file:// links that exceed 1024 characters', async () => { + // 8 + 101 * 10 = 1018 characters + await assertLink(TerminalBuiltinLinkType.LocalFile, `file:///${'foobarbaz/'.repeat(101)}`, [{ + text: `file:///${'foobarbaz/'.repeat(101)}`, + range: [[1, 1], [58, 13]] + }]); + // 8 + 102 * 10 = 1028 characters + await assertLink(TerminalBuiltinLinkType.LocalFile, `file:///${'foobarbaz/'.repeat(102)}`, []); + }); +}); diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalValidatedLocalLinkProvider.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalValidatedLocalLinkProvider.test.ts deleted file mode 100644 index 57e7c0d7a71..00000000000 --- a/src/vs/workbench/contrib/terminal/test/browser/links/terminalValidatedLocalLinkProvider.test.ts +++ /dev/null @@ -1,179 +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 * as assert from 'assert'; -import { TerminalValidatedLocalLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider'; -import { Terminal, ILink } from 'xterm'; -import { OperatingSystem } from 'vs/base/common/platform'; -import { format } from 'vs/base/common/strings'; -import { URI } from 'vs/base/common/uri'; -import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; - -const unixLinks = [ - '/foo', - '~/foo', - './foo', - './$foo', - '../foo', - '/foo/bar', - '/foo/bar+more', - 'foo/bar', - 'foo/bar+more', -]; - -const windowsLinks = [ - 'c:\\foo', - '\\\\?\\c:\\foo', - 'c:/foo', - '.\\foo', - './foo', - './$foo', - '..\\foo', - '~\\foo', - '~/foo', - 'c:/foo/bar', - 'c:\\foo\\bar', - 'c:\\foo\\bar+more', - 'c:\\foo/bar\\baz', - 'foo/bar', - 'foo/bar', - 'foo\\bar', - 'foo\\bar+more', -]; - -class TestTerminalValidatedLocalLinkProvider extends TerminalValidatedLocalLinkProvider { - override _enableCaching: boolean = false; -} - -interface LinkFormatInfo { - urlFormat: string; - line?: string; - column?: string; -} - -const supportedLinkFormats: LinkFormatInfo[] = [ - { urlFormat: '{0}' }, - { urlFormat: '{0} on line {1}', line: '5' }, - { urlFormat: '{0} on line {1}, column {2}', line: '5', column: '3' }, - { urlFormat: '{0}:line {1}', line: '5' }, - { urlFormat: '{0}:line {1}, column {2}', line: '5', column: '3' }, - { urlFormat: '{0}({1})', line: '5' }, - { urlFormat: '{0} ({1})', line: '5' }, - { urlFormat: '{0}({1},{2})', line: '5', column: '3' }, - { urlFormat: '{0} ({1},{2})', line: '5', column: '3' }, - { urlFormat: '{0}({1}, {2})', line: '5', column: '3' }, - { urlFormat: '{0} ({1}, {2})', line: '5', column: '3' }, - { urlFormat: '{0}:{1}', line: '5' }, - { urlFormat: '{0}:{1}:{2}', line: '5', column: '3' }, - { urlFormat: '{0}[{1}]', line: '5' }, - { urlFormat: '{0} [{1}]', line: '5' }, - { urlFormat: '{0}[{1},{2}]', line: '5', column: '3' }, - { urlFormat: '{0} [{1},{2}]', line: '5', column: '3' }, - { urlFormat: '{0}[{1}, {2}]', line: '5', column: '3' }, - { urlFormat: '{0} [{1}, {2}]', line: '5', column: '3' }, - { urlFormat: '{0}",{1}', line: '5' }, - { urlFormat: '{0}\',{1}', line: '5' } -]; - -suite('Workbench - TerminalValidatedLocalLinkProvider', () => { - let instantiationService: TestInstantiationService; - - setup(() => { - instantiationService = new TestInstantiationService(); - instantiationService.stub(IConfigurationService, TestConfigurationService); - }); - - async function assertLink(text: string, os: OperatingSystem, expected: { text: string, range: [number, number][] }[]) { - const xterm = new Terminal(); - const provider = instantiationService.createInstance( - TestTerminalValidatedLocalLinkProvider, - xterm, - os, - () => { }, - () => { }, - () => { }, - (linkCandidates: string, cb: (result: { uri: URI, link: string, isDirectory: boolean } | undefined) => void) => { - cb({ uri: URI.file('/'), link: linkCandidates[0], isDirectory: false }); - } - ); - // Write the text and wait for the parser to finish - await new Promise(r => xterm.write(text, r)); - - // Ensure all links are provided - const links = (await new Promise(r => provider.provideLinks(1, r)))!; - assert.strictEqual(links.length, expected.length); - const actual = links.map(e => ({ - text: e.text, - range: e.range - })); - const expectedVerbose = expected.map(e => ({ - text: e.text, - range: { - start: { x: e.range[0][0], y: e.range[0][1] }, - end: { x: e.range[1][0], y: e.range[1][1] }, - } - })); - assert.deepStrictEqual(actual, expectedVerbose); - } - - suite('Linux/macOS', () => { - unixLinks.forEach(baseLink => { - suite(`Link: ${baseLink}`, () => { - for (let i = 0; i < supportedLinkFormats.length; i++) { - const linkFormat = supportedLinkFormats[i]; - test(`Format: ${linkFormat.urlFormat}`, async () => { - const formattedLink = format(linkFormat.urlFormat, baseLink, linkFormat.line, linkFormat.column); - await assertLink(formattedLink, OperatingSystem.Linux, [{ text: formattedLink, range: [[1, 1], [formattedLink.length, 1]] }]); - await assertLink(` ${formattedLink} `, OperatingSystem.Linux, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); - await assertLink(`(${formattedLink})`, OperatingSystem.Linux, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); - await assertLink(`[${formattedLink}]`, OperatingSystem.Linux, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); - }); - } - }); - }); - test('Git diff links', async () => { - await assertLink(`diff --git a/foo/bar b/foo/bar`, OperatingSystem.Linux, [ - { text: 'foo/bar', range: [[14, 1], [20, 1]] }, - { text: 'foo/bar', range: [[24, 1], [30, 1]] } - ]); - await assertLink(`--- a/foo/bar`, OperatingSystem.Linux, [{ text: 'foo/bar', range: [[7, 1], [13, 1]] }]); - await assertLink(`+++ b/foo/bar`, OperatingSystem.Linux, [{ text: 'foo/bar', range: [[7, 1], [13, 1]] }]); - }); - }); - - suite('Windows', () => { - windowsLinks.forEach(baseLink => { - suite(`Link "${baseLink}"`, () => { - for (let i = 0; i < supportedLinkFormats.length; i++) { - const linkFormat = supportedLinkFormats[i]; - test(`Format: ${linkFormat.urlFormat}`, async () => { - const formattedLink = format(linkFormat.urlFormat, baseLink, linkFormat.line, linkFormat.column); - await assertLink(formattedLink, OperatingSystem.Windows, [{ text: formattedLink, range: [[1, 1], [formattedLink.length, 1]] }]); - await assertLink(` ${formattedLink} `, OperatingSystem.Windows, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); - await assertLink(`(${formattedLink})`, OperatingSystem.Windows, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); - await assertLink(`[${formattedLink}]`, OperatingSystem.Windows, [{ text: formattedLink, range: [[2, 1], [formattedLink.length + 1, 1]] }]); - }); - } - }); - }); - test('Git diff links', async () => { - await assertLink(`diff --git a/foo/bar b/foo/bar`, OperatingSystem.Linux, [ - { text: 'foo/bar', range: [[14, 1], [20, 1]] }, - { text: 'foo/bar', range: [[24, 1], [30, 1]] } - ]); - await assertLink(`--- a/foo/bar`, OperatingSystem.Linux, [{ text: 'foo/bar', range: [[7, 1], [13, 1]] }]); - await assertLink(`+++ b/foo/bar`, OperatingSystem.Linux, [{ text: 'foo/bar', range: [[7, 1], [13, 1]] }]); - }); - }); - - test('should support multiple link results', async () => { - await assertLink('./foo ./bar', OperatingSystem.Linux, [ - { range: [[1, 1], [5, 1]], text: './foo' }, - { range: [[7, 1], [11, 1]], text: './bar' } - ]); - }); -}); diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalWordLinkDetector.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalWordLinkDetector.test.ts new file mode 100644 index 00000000000..63c04b0b285 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalWordLinkDetector.test.ts @@ -0,0 +1,107 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { ITerminalSimpleLink, TerminalBuiltinLinkType } from 'vs/workbench/contrib/terminal/browser/links/links'; +import { TerminalWordLinkDetector } from 'vs/workbench/contrib/terminal/browser/links/terminalWordLinkDetector'; +import { assertLinkHelper } from 'vs/workbench/contrib/terminal/test/browser/links/linkTestUtils'; +import { Terminal } from 'xterm'; + +suite('Workbench - TerminalWordLinkDetector', () => { + let configurationService: TestConfigurationService; + let detector: TerminalWordLinkDetector; + let xterm: Terminal; + + setup(() => { + const instantiationService = new TestInstantiationService(); + configurationService = new TestConfigurationService(); + + instantiationService.stub(IConfigurationService, configurationService); + + xterm = new Terminal({ cols: 80, rows: 30 }); + detector = instantiationService.createInstance(TerminalWordLinkDetector, xterm); + }); + + async function assertLink( + text: string, + expected: (Pick & { range: [number, number][] })[] + ) { + await assertLinkHelper(text, expected, detector, TerminalBuiltinLinkType.Search); + } + + test('should link words as defined by wordSeparators', async () => { + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ()[]' } }); + await assertLink('foo', [{ range: [[1, 1], [3, 1]], text: 'foo' }]); + await assertLink('foo', [{ range: [[1, 1], [3, 1]], text: 'foo' }]); + await assertLink('foo', [{ range: [[1, 1], [3, 1]], text: 'foo' }]); + await assertLink(' foo ', [{ range: [[2, 1], [4, 1]], text: 'foo' }]); + await assertLink('(foo)', [{ range: [[2, 1], [4, 1]], text: 'foo' }]); + await assertLink('[foo]', [{ range: [[2, 1], [4, 1]], text: 'foo' }]); + await assertLink('{foo}', [{ range: [[1, 1], [5, 1]], text: '{foo}' }]); + + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); + await assertLink('foo', [{ range: [[1, 1], [3, 1]], text: 'foo' }]); + await assertLink(' foo ', [{ range: [[2, 1], [4, 1]], text: 'foo' }]); + await assertLink('(foo)', [{ range: [[1, 1], [5, 1]], text: '(foo)' }]); + await assertLink('[foo]', [{ range: [[1, 1], [5, 1]], text: '[foo]' }]); + await assertLink('{foo}', [{ range: [[1, 1], [5, 1]], text: '{foo}' }]); + + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' []' } }); + await assertLink('aabbccdd.txt ', [{ range: [[1, 1], [12, 1]], text: 'aabbccdd.txt' }]); + await assertLink(' aabbccdd.txt ', [{ range: [[2, 1], [13, 1]], text: 'aabbccdd.txt' }]); + await assertLink(' [aabbccdd.txt] ', [{ range: [[3, 1], [14, 1]], text: 'aabbccdd.txt' }]); + }); + + // These are failing - the link's start x is 1 px too far to the right bc it starts + // with a wide character, which the terminalLinkHelper currently doesn't account for + test.skip('should support wide characters', async () => { + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' []' } }); + await assertLink('我是学生.txt ', [{ range: [[1, 1], [12, 1]], text: '我是学生.txt' }]); + await assertLink(' 我是学生.txt ', [{ range: [[2, 1], [13, 1]], text: '我是学生.txt' }]); + await assertLink(' [我是学生.txt] ', [{ range: [[3, 1], [14, 1]], text: '我是学生.txt' }]); + }); + + test('should support multiple link results', async () => { + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); + await assertLink('foo bar', [ + { range: [[1, 1], [3, 1]], text: 'foo' }, + { range: [[5, 1], [7, 1]], text: 'bar' } + ]); + }); + + test('should remove trailing colon in the link results', async () => { + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); + await assertLink('foo:5:6: bar:0:32:', [ + { range: [[1, 1], [7, 1]], text: 'foo:5:6' }, + { range: [[10, 1], [17, 1]], text: 'bar:0:32' } + ]); + }); + + test('should support wrapping', async () => { + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); + await assertLink('fsdjfsdkfjslkdfjskdfjsldkfjsdlkfjslkdjfskldjflskdfjskldjflskdfjsdklfjsdklfjsldkfjsdlkfjsdlkfjsdlkfjsldkfjslkdfjsdlkfjsldkfjsdlkfjskdfjsldkfjsdlkfjslkdfjsdlkfjsldkfjsldkfjsldkfjslkdfjsdlkfjslkdfjsdklfsd', [ + { range: [[1, 1], [41, 3]], text: 'fsdjfsdkfjslkdfjskdfjsldkfjsdlkfjslkdjfskldjflskdfjskldjflskdfjsdklfjsdklfjsldkfjsdlkfjsdlkfjsdlkfjsldkfjslkdfjsdlkfjsldkfjsdlkfjskdfjsldkfjsdlkfjslkdfjsdlkfjsldkfjsldkfjsldkfjslkdfjsdlkfjslkdfjsdklfsd' }, + ]); + }); + test('should support wrapping with multiple links', async () => { + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); + await assertLink('fsdjfsdkfjslkdfjskdfjsldkfj sdlkfjslkdjfskldjflskdfjskldjflskdfj sdklfjsdklfjsldkfjsdlkfjsdlkfjsdlkfjsldkfjslkdfjsdlkfjsldkfjsdlkfjskdfjsldkfjsdlkfjslkdfjsdlkfjsldkfjsldkfjsldkfjslkdfjsdlkfjslkdfjsdklfsd', [ + { range: [[1, 1], [27, 1]], text: 'fsdjfsdkfjslkdfjskdfjsldkfj' }, + { range: [[29, 1], [64, 1]], text: 'sdlkfjslkdjfskldjflskdfjskldjflskdfj' }, + { range: [[66, 1], [43, 3]], text: 'sdklfjsdklfjsldkfjsdlkfjsdlkfjsdlkfjsldkfjslkdfjsdlkfjsldkfjsdlkfjskdfjsldkfjsdlkfjslkdfjsdlkfjsldkfjsldkfjsldkfjslkdfjsdlkfjslkdfjsdklfsd' } + ]); + }); + test('does not return any links for empty text', async () => { + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); + await assertLink('', []); + }); + test('should support file scheme links', async () => { + await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); + await assertLink('file:///C:/users/test/file.txt ', [{ range: [[1, 1], [30, 1]], text: 'file:///C:/users/test/file.txt' }]); + await assertLink('file:///C:/users/test/file.txt:1:10 ', [{ range: [[1, 1], [35, 1]], text: 'file:///C:/users/test/file.txt:1:10' }]); + }); +}); diff --git a/src/vs/workbench/contrib/terminal/test/browser/links/terminalWordLinkProvider.test.ts b/src/vs/workbench/contrib/terminal/test/browser/links/terminalWordLinkProvider.test.ts deleted file mode 100644 index c77c1366a7b..00000000000 --- a/src/vs/workbench/contrib/terminal/test/browser/links/terminalWordLinkProvider.test.ts +++ /dev/null @@ -1,294 +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 * as assert from 'assert'; -import { Terminal, ILink } from 'xterm'; -import { TerminalWordLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalWordLinkProvider'; -import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IEditorOptions, ITextResourceEditorInput } from 'vs/platform/editor/common/editor'; -import { AbstractLogger, DEFAULT_LOG_LEVEL, ILogger, ILogService, LogLevel, LogService, NullLogService } from 'vs/platform/log/common/log'; -import { IStorageService } from 'vs/platform/storage/common/storage'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; -import { IViewDescriptorService } from 'vs/workbench/common/views'; -import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; -import { ITerminalConfigHelper, ITerminalConfiguration } from 'vs/workbench/contrib/terminal/common/terminal'; -import { TestContextService, TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; -import { TerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; -import { XtermTerminal } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal'; -import { TerminalCapability, TerminalLocation } from 'vs/platform/terminal/common/terminal'; -import { CwdDetectionCapability } from 'vs/workbench/contrib/terminal/common/capabilities/cwdDetectionCapability'; -import { CognisantCommandTrackerAddon } from 'vs/workbench/contrib/terminal/browser/xterm/cognisantCommandTrackerAddon'; -import { TestViewDescriptorService } from 'vs/workbench/contrib/terminal/test/browser/xterm/xtermTerminal.test'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { XtermLinkMatcherHandler } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; - -const defaultTerminalConfig: Partial = { - fontFamily: 'monospace', - fontWeight: 'normal', - fontWeightBold: 'normal', - gpuAcceleration: 'off', - scrollback: 1000, - fastScrollSensitivity: 2, - mouseWheelScrollSensitivity: 1, - unicodeVersion: '11', - wordSeparators: ' ()[]{}\',"`─‘’' -}; - -class TestCommandTracker extends CognisantCommandTrackerAddon { - private _currentCwd: string | undefined; - override getCwdForLine(y: number): string { - return this._currentCwd || ''; - } - setCwd(cwd: string): void { - this._currentCwd = cwd; - } -} - -class TestLogger extends AbstractLogger implements ILogger { - - public logs: string[] = []; - - constructor(logLevel: LogLevel = DEFAULT_LOG_LEVEL) { - super(); - this.setLevel(logLevel); - } - - trace(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Trace) { - this.logs.push(message + JSON.stringify(args)); - } - } - - debug(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Debug) { - this.logs.push(message); - } - } - - info(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Info) { - this.logs.push(message); - } - } - - warn(message: string | Error, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Warning) { - this.logs.push(message.toString()); - } - } - - error(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Error) { - this.logs.push(message); - } - } - - critical(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Critical) { - this.logs.push(message); - } - } - - override dispose(): void { } - flush(): void { } -} - -class TestXtermTerminal extends XtermTerminal { - override get commandTracker(): TestCommandTracker { return new TestCommandTracker(new LogService(new TestLogger())); } -} - -suite('Workbench - TerminalWordLinkProvider', () => { - let instantiationService: TestInstantiationService; - let configurationService: TestConfigurationService; - let themeService: TestThemeService; - let viewDescriptorService: TestViewDescriptorService; - let xterm: TestXtermTerminal; - let configHelper: ITerminalConfigHelper; - let capabilities: TerminalCapabilityStore; - let activateResult: ITerminalLinkActivationResult | undefined; - - setup(() => { - instantiationService = new TestInstantiationService(); - configurationService = new TestConfigurationService(); - instantiationService.stub(IConfigurationService, configurationService); - configurationService = new TestConfigurationService({ - editor: { - fastScrollSensitivity: 2, - mouseWheelScrollSensitivity: 1 - } as Partial, - terminal: { - integrated: defaultTerminalConfig - } - }); - themeService = new TestThemeService(); - viewDescriptorService = new TestViewDescriptorService(); - capabilities = new TerminalCapabilityStore(); - instantiationService = new TestInstantiationService(); - instantiationService.stub(IConfigurationService, configurationService); - instantiationService.stub(ILogService, new NullLogService()); - instantiationService.stub(IStorageService, new TestStorageService()); - instantiationService.stub(IThemeService, themeService); - instantiationService.stub(IViewDescriptorService, viewDescriptorService); - instantiationService.stub(IWorkspaceContextService, new TestContextService()); - - // Allow intercepting link activations - activateResult = undefined; - instantiationService.stub(IQuickInputService, { - quickAccess: { - show(link: string) { - activateResult = { link, source: 'quickpick' }; - } - } - } as Partial); - instantiationService.stub(IEditorService, { - async openEditor(editor: ITextResourceEditorInput): Promise { - activateResult = { - source: 'editor', - link: editor.resource?.toString() - }; - } - } as Partial); - - configHelper = instantiationService.createInstance(TerminalConfigHelper); - configHelper = instantiationService.createInstance(TerminalConfigHelper); - xterm = instantiationService.createInstance(TestXtermTerminal, Terminal, configHelper, 80, 30, TerminalLocation.Panel); - }); - - async function assertLink(text: string, expected: { text: string, range: [number, number][], linkActivationResult?: ITerminalLinkActivationResult }[], registerCwdDetectionCapability?: boolean) { - xterm?.dispose(); - xterm = instantiationService.createInstance(TestXtermTerminal, Terminal, configHelper, 80, 30, TerminalLocation.Panel); - if (registerCwdDetectionCapability) { - capabilities = new TerminalCapabilityStore(); - capabilities.add(TerminalCapability.CwdDetection, new CwdDetectionCapability()); - } - // We don't want to cancel the event or anything from the tests so just pass in a wrapped - // link handler that does nothing. - - const testWrappedLinkHandler = (handler: (event: MouseEvent | undefined, link: string) => void): XtermLinkMatcherHandler => { - return async (event: MouseEvent | undefined, link: string) => { - handler(event, link); - }; - }; - const provider: TerminalWordLinkProvider = instantiationService.createInstance(TerminalWordLinkProvider, - xterm, - capabilities, - testWrappedLinkHandler, - () => { } - ); - - // Write the text and wait for the parser to finish - await new Promise(r => xterm.raw.write(text, r)); - - // Ensure all links are provided - const links = (await new Promise(r => provider.provideLinks(1, r)))!; - const actualLinks = await Promise.all(links.map(async e => { - if (registerCwdDetectionCapability) { - // HACK: Xterm.js works on sync links only but we use async links - await e.activate(new MouseEvent('click'), e.text); - } - return { - text: e.text, - range: e.range, - activateText: registerCwdDetectionCapability ? activateResult : undefined - }; - })); - - const expectedVerbose = expected.map(e => ({ - text: e.text, - range: { - start: { x: e.range[0][0], y: e.range[0][1] }, - end: { x: e.range[1][0], y: e.range[1][1] }, - }, - activateText: e.linkActivationResult - })); - assert.deepStrictEqual(actualLinks, expectedVerbose); - assert.strictEqual(links.length, expected.length); - } - - test('should link words as defined by wordSeparators', async () => { - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ()[]' } }); - await assertLink('foo', [{ range: [[1, 1], [3, 1]], text: 'foo' }]); - await assertLink('foo', [{ range: [[1, 1], [3, 1]], text: 'foo' }]); - await assertLink(' foo ', [{ range: [[2, 1], [4, 1]], text: 'foo' }]); - await assertLink('(foo)', [{ range: [[2, 1], [4, 1]], text: 'foo' }]); - await assertLink('[foo]', [{ range: [[2, 1], [4, 1]], text: 'foo' }]); - await assertLink('{foo}', [{ range: [[1, 1], [5, 1]], text: '{foo}' }]); - - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); - await assertLink('foo', [{ range: [[1, 1], [3, 1]], text: 'foo' }]); - await assertLink(' foo ', [{ range: [[2, 1], [4, 1]], text: 'foo' }]); - await assertLink('(foo)', [{ range: [[1, 1], [5, 1]], text: '(foo)' }]); - await assertLink('[foo]', [{ range: [[1, 1], [5, 1]], text: '[foo]' }]); - await assertLink('{foo}', [{ range: [[1, 1], [5, 1]], text: '{foo}' }]); - - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' []' } }); - await assertLink('aabbccdd.txt ', [{ range: [[1, 1], [12, 1]], text: 'aabbccdd.txt' }]); - await assertLink(' aabbccdd.txt ', [{ range: [[2, 1], [13, 1]], text: 'aabbccdd.txt' }]); - await assertLink(' [aabbccdd.txt] ', [{ range: [[3, 1], [14, 1]], text: 'aabbccdd.txt' }]); - }); - - // These are failing - the link's start x is 1 px too far to the right bc it starts - // with a wide character, which the terminalLinkHelper currently doesn't account for - test.skip('should support wide characters', async () => { - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' []' } }); - await assertLink('我是学生.txt ', [{ range: [[1, 1], [12, 1]], text: '我是学生.txt' }]); - await assertLink(' 我是学生.txt ', [{ range: [[2, 1], [13, 1]], text: '我是学生.txt' }]); - await assertLink(' [我是学生.txt] ', [{ range: [[3, 1], [14, 1]], text: '我是学生.txt' }]); - }); - - test('should support multiple link results', async () => { - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); - await assertLink('foo bar', [ - { range: [[1, 1], [3, 1]], text: 'foo' }, - { range: [[5, 1], [7, 1]], text: 'bar' } - ]); - }); - - test('should remove trailing colon in the link results', async () => { - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); - await assertLink('foo:5:6: bar:0:32:', [ - { range: [[1, 1], [7, 1]], text: 'foo:5:6' }, - { range: [[10, 1], [17, 1]], text: 'bar:0:32' } - ]); - }); - - test('should support wrapping', async () => { - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); - await assertLink('fsdjfsdkfjslkdfjskdfjsldkfjsdlkfjslkdjfskldjflskdfjskldjflskdfjsdklfjsdklfjsldkfjsdlkfjsdlkfjsdlkfjsldkfjslkdfjsdlkfjsldkfjsdlkfjskdfjsldkfjsdlkfjslkdfjsdlkfjsldkfjsldkfjsldkfjslkdfjsdlkfjslkdfjsdklfsd', [ - { range: [[1, 1], [41, 3]], text: 'fsdjfsdkfjslkdfjskdfjsldkfjsdlkfjslkdjfskldjflskdfjskldjflskdfjsdklfjsdklfjsldkfjsdlkfjsdlkfjsdlkfjsldkfjslkdfjsdlkfjsldkfjsdlkfjskdfjsldkfjsdlkfjslkdfjsdlkfjsldkfjsldkfjsldkfjslkdfjsdlkfjslkdfjsdklfsd' }, - ]); - }); - test('should support wrapping with multiple links', async () => { - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); - await assertLink('fsdjfsdkfjslkdfjskdfjsldkfj sdlkfjslkdjfskldjflskdfjskldjflskdfj sdklfjsdklfjsldkfjsdlkfjsdlkfjsdlkfjsldkfjslkdfjsdlkfjsldkfjsdlkfjskdfjsldkfjsdlkfjslkdfjsdlkfjsldkfjsldkfjsldkfjslkdfjsdlkfjslkdfjsdklfsd', [ - { range: [[1, 1], [27, 1]], text: 'fsdjfsdkfjslkdfjskdfjsldkfj' }, - { range: [[29, 1], [64, 1]], text: 'sdlkfjslkdjfskldjflskdfjskldjflskdfj' }, - { range: [[66, 1], [43, 3]], text: 'sdklfjsdklfjsldkfjsdlkfjsdlkfjsdlkfjsldkfjslkdfjsdlkfjsldkfjsdlkfjskdfjsldkfjsdlkfjslkdfjsdlkfjsldkfjsldkfjsldkfjslkdfjsdlkfjslkdfjsdklfsd' } - ]); - }); - test('does not return any links for empty text', async () => { - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); - await assertLink('', []); - }); - test('should support file scheme links', async () => { - await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); - await assertLink('file:///C:/users/test/file.txt ', [{ range: [[1, 1], [30, 1]], text: 'file:///C:/users/test/file.txt' }]); - await assertLink('file:///C:/users/test/file.txt:1:10 ', [{ range: [[1, 1], [35, 1]], text: 'file:///C:/users/test/file.txt:1:10' }]); - }); - test.skip('should add cwd to link', async () => { - xterm.commandTracker.setCwd('/Users/home/folder'); - await assertLink('file.txt ', [{ range: [[1, 1], [8, 1]], text: 'file.txt', linkActivationResult: { link: '/Users/home/folder/file.txt', source: 'editor' } }], true); - }); -}); - -interface ITerminalLinkActivationResult { - source: 'editor' | 'quickpick', - link: string -} diff --git a/src/vs/workbench/contrib/terminal/test/browser/terminalCommandTracker.test.ts b/src/vs/workbench/contrib/terminal/test/browser/terminalCommandTracker.test.ts index 7b86322e2e2..bcf23f57aeb 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/terminalCommandTracker.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/terminalCommandTracker.test.ts @@ -5,10 +5,13 @@ import * as assert from 'assert'; import { Terminal } from 'xterm'; -import { CommandTrackerAddon, NaiveCommandTrackerAddon } from 'vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon'; +import { CommandTrackerAddon } from 'vs/workbench/contrib/terminal/browser/xterm/commandTrackerAddon'; import { isWindows } from 'vs/base/common/platform'; import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; import { timeout } from 'vs/base/common/async'; +import { TerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; +import { PartialCommandDetectionCapability } from 'vs/workbench/contrib/terminal/browser/capabilities/partialCommandDetectionCapability'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; interface TestTerminal extends Terminal { _core: IXtermCore; @@ -31,13 +34,14 @@ async function writeP(terminal: TestTerminal, data: string): Promise { suite('Workbench - TerminalCommandTracker', function () { let xterm: TestTerminal; let commandTracker: CommandTrackerAddon; + let store: TerminalCapabilityStore; + + // These tests are flaky on GH actions as sometimes they are particularly slow and timeout + // on the await writeP calls. These have been reduced but the timeout is increased to try + // catch edge cases. + this.timeout(20000); setup(async function () { - // These tests are flaky on GH actions as sometimes they are particularly slow and timeout - // on the await writeP calls. These have been reduced but the timeout is increased to try - // catch edge cases. - this.timeout(20000); - xterm = (new Terminal({ cols: COLS, rows: ROWS @@ -48,7 +52,9 @@ suite('Workbench - TerminalCommandTracker', function () { data += `${i}\n`; } await writeP(xterm, data); - commandTracker = new NaiveCommandTrackerAddon(); + store = new TerminalCapabilityStore(); + commandTracker = new CommandTrackerAddon(store); + store.add(TerminalCapability.PartialCommandDetection, new PartialCommandDetectionCapability(xterm)); xterm.loadAddon(commandTracker); }); diff --git a/src/vs/workbench/contrib/terminal/test/browser/terminalConfigHelper.test.ts b/src/vs/workbench/contrib/terminal/test/browser/terminalConfigHelper.test.ts index f016a48c2d6..0c1fc1a9c29 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/terminalConfigHelper.test.ts @@ -32,7 +32,7 @@ suite('Workbench - TerminalConfigHelper', function () { editor: { fontFamily: 'foo' }, terminal: { integrated: { fontFamily: 'bar' } } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontFamily, 'bar', 'terminal.integrated.fontFamily should be selected over editor.fontFamily'); }); @@ -42,7 +42,7 @@ suite('Workbench - TerminalConfigHelper', function () { editor: { fontFamily: 'foo' }, terminal: { integrated: { fontFamily: null } } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.linuxDistro = LinuxDistro.Fedora; configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontFamily, '\'DejaVu Sans Mono\', monospace', 'Fedora should have its font overridden when terminal.integrated.fontFamily not set'); @@ -53,7 +53,7 @@ suite('Workbench - TerminalConfigHelper', function () { editor: { fontFamily: 'foo' }, terminal: { integrated: { fontFamily: null } } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.linuxDistro = LinuxDistro.Ubuntu; configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontFamily, '\'Ubuntu Mono\', monospace', 'Ubuntu should have its font overridden when terminal.integrated.fontFamily not set'); @@ -64,7 +64,7 @@ suite('Workbench - TerminalConfigHelper', function () { editor: { fontFamily: 'foo' }, terminal: { integrated: { fontFamily: null } } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontFamily, 'foo', 'editor.fontFamily should be the fallback when terminal.integrated.fontFamily not set'); }); @@ -82,7 +82,7 @@ suite('Workbench - TerminalConfigHelper', function () { } } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontSize, 10, 'terminal.integrated.fontSize should be selected over editor.fontSize'); }); @@ -99,12 +99,12 @@ suite('Workbench - TerminalConfigHelper', function () { } } }); - let configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + let configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.linuxDistro = LinuxDistro.Ubuntu; configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontSize, 8, 'The minimum terminal font size (with adjustment) should be used when terminal.integrated.fontSize less than it'); - configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontSize, 6, 'The minimum terminal font size should be used when terminal.integrated.fontSize less than it'); }); @@ -121,7 +121,7 @@ suite('Workbench - TerminalConfigHelper', function () { } } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontSize, 100, 'The maximum terminal font size should be used when terminal.integrated.fontSize more than it'); }); @@ -138,12 +138,12 @@ suite('Workbench - TerminalConfigHelper', function () { } } }); - let configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + let configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.linuxDistro = LinuxDistro.Ubuntu; configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontSize, EDITOR_FONT_DEFAULTS.fontSize + 2, 'The default editor font size (with adjustment) should be used when terminal.integrated.fontSize is not set'); - configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().fontSize, EDITOR_FONT_DEFAULTS.fontSize, 'The default editor font size should be used when terminal.integrated.fontSize is not set'); }); @@ -161,7 +161,7 @@ suite('Workbench - TerminalConfigHelper', function () { } } }); - let configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + let configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().lineHeight, 2, 'terminal.integrated.lineHeight should be selected over editor.lineHeight'); }); @@ -179,7 +179,7 @@ suite('Workbench - TerminalConfigHelper', function () { } } }); - let configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + let configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.getFont().lineHeight, 1, 'editor.lineHeight should be 1 when terminal.integrated.lineHeight not set'); }); @@ -193,7 +193,7 @@ suite('Workbench - TerminalConfigHelper', function () { } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.configFontIsMonospace(), true, 'monospace is monospaced'); }); @@ -206,7 +206,7 @@ suite('Workbench - TerminalConfigHelper', function () { } } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.configFontIsMonospace(), false, 'sans-serif is not monospaced'); }); @@ -219,7 +219,7 @@ suite('Workbench - TerminalConfigHelper', function () { } } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.configFontIsMonospace(), false, 'serif is not monospaced'); }); @@ -236,7 +236,7 @@ suite('Workbench - TerminalConfigHelper', function () { } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.configFontIsMonospace(), true, 'monospace is monospaced'); }); @@ -253,7 +253,7 @@ suite('Workbench - TerminalConfigHelper', function () { } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.configFontIsMonospace(), false, 'sans-serif is not monospaced'); }); @@ -270,7 +270,7 @@ suite('Workbench - TerminalConfigHelper', function () { } }); - const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + const configHelper = new TestTerminalConfigHelper(configurationService, null!, null!, null!, null!); configHelper.panelContainer = fixture; assert.strictEqual(configHelper.configFontIsMonospace(), false, 'serif is not monospaced'); }); diff --git a/src/vs/workbench/contrib/terminal/test/browser/terminalInstance.test.ts b/src/vs/workbench/contrib/terminal/test/browser/terminalInstance.test.ts index 11e10d31475..c8b9d09eef0 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/terminalInstance.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/terminalInstance.test.ts @@ -6,18 +6,20 @@ import { deepStrictEqual, strictEqual } from 'assert'; import { isWindows } from 'vs/base/common/platform'; import { TerminalLabelComputer, parseExitResult } from 'vs/workbench/contrib/terminal/browser/terminalInstance'; -import { IWorkspaceContextService, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, IWorkspaceFolder, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { Workspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { TerminalCapability } from 'vs/platform/terminal/common/terminal'; import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; -import { fixPath, getUri } from 'vs/workbench/contrib/search/test/browser/queryBuilder.test'; +import { fixPath, getUri } from 'vs/workbench/services/search/test/browser/queryBuilder.test'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ProcessState } from 'vs/workbench/contrib/terminal/common/terminal'; import { basename } from 'vs/base/common/path'; +import { URI } from 'vs/base/common/uri'; import { TerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; +import { TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { Schemas } from 'vs/base/common/network'; function createInstance(partial?: Partial): Pick { const capabilities = new TerminalCapabilityStore(); @@ -190,7 +192,7 @@ suite('Workbench - TerminalInstance', () => { test('should resolve to "" when the template variables are empty', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' - ', title: '', description: '' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: '' }), mockContextService); terminalLabelComputer.refreshLabel(); // TODO: @@ -203,7 +205,7 @@ suite('Workbench - TerminalInstance', () => { }); test('should resolve cwd', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' - ', title: '${cwd}', description: '${cwd}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, cwd: ROOT_1 }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, ROOT_1); @@ -211,7 +213,7 @@ suite('Workbench - TerminalInstance', () => { }); test('should resolve cwdFolder in a single root workspace if cwd differs from root', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' - ', title: '${process}', description: '${cwdFolder}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, cwd: ROOT_2, processName: 'zsh' }), mockContextService); terminalLabelComputer.refreshLabel(); if (isWindows) { @@ -224,23 +226,23 @@ suite('Workbench - TerminalInstance', () => { }); test('should resolve workspaceFolder', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' - ', title: '${workspaceFolder}', description: '${workspaceFolder}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh', workspaceFolder: 'folder' }), mockContextService); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh', workspaceFolder: { uri: URI.from({ scheme: Schemas.file, path: 'folder' }) } as IWorkspaceFolder }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'folder'); strictEqual(terminalLabelComputer.description, 'folder'); }); test('should resolve local', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' - ', title: '${local}', description: '${local}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh', shellLaunchConfig: { description: 'Local' } }), mockContextService); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh', shellLaunchConfig: { type: 'Local' } }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'Local'); strictEqual(terminalLabelComputer.description, 'Local'); }); test('should resolve process', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' - ', title: '${process}', description: '${process}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh' }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'zsh'); @@ -248,7 +250,7 @@ suite('Workbench - TerminalInstance', () => { }); test('should resolve sequence', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' - ', title: '${sequence}', description: '${sequence}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, sequence: 'sequence' }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'sequence'); @@ -256,40 +258,40 @@ suite('Workbench - TerminalInstance', () => { }); test('should resolve task', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${process}${separator}${task}', description: '${task}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh', shellLaunchConfig: { description: 'Task' } }), mockContextService); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh', shellLaunchConfig: { type: 'Task' } }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'zsh ~ Task'); strictEqual(terminalLabelComputer.description, 'Task'); }); test('should resolve separator', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${separator}', description: '${separator}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh', shellLaunchConfig: { description: 'Task' } }), mockContextService); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'zsh', shellLaunchConfig: { type: 'Task' } }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'zsh'); strictEqual(terminalLabelComputer.description, ''); }); test('should always return static title when specified', () => { configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${process}', description: '${workspaceFolder}' } } } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: 'folder', staticTitle: 'my-title' }), mockContextService); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: { uri: URI.from({ scheme: Schemas.file, path: 'folder' }) } as IWorkspaceFolder, staticTitle: 'my-title' }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'my-title'); strictEqual(terminalLabelComputer.description, 'folder'); }); test('should provide cwdFolder for all cwds only when in multi-root', () => { - configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${process}${separator}${cwdFolder}', description: '${cwdFolder}' } }, cwd: ROOT_1 } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: 'folder', cwd: ROOT_1 }), mockContextService); + configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${process}${separator}${cwdFolder}', description: '${cwdFolder}' } } } }); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: { uri: URI.from({ scheme: Schemas.file, path: ROOT_1 }) } as IWorkspaceFolder, cwd: ROOT_1 }), mockContextService); terminalLabelComputer.refreshLabel(); // single-root, cwd is same as root strictEqual(terminalLabelComputer.title, 'process'); strictEqual(terminalLabelComputer.description, ''); // multi-root - configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${process}${separator}${cwdFolder}', description: '${cwdFolder}' } }, cwd: ROOT_1 } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: 'folder', cwd: ROOT_2 }), mockMultiRootContextService); + configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${process}${separator}${cwdFolder}', description: '${cwdFolder}' } } } }); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: { uri: URI.from({ scheme: Schemas.file, path: ROOT_1 }) } as IWorkspaceFolder, cwd: ROOT_2 }), mockMultiRootContextService); terminalLabelComputer.refreshLabel(); if (isWindows) { strictEqual(terminalLabelComputer.title, 'process'); @@ -300,14 +302,14 @@ suite('Workbench - TerminalInstance', () => { } }); test('should hide cwdFolder in single folder workspaces when cwd matches the workspace\'s default cwd even when slashes differ', async () => { - configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${process}${separator}${cwdFolder}', description: '${cwdFolder}' } }, cwd: '\\foo\\root1' } }); - configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!, null!); - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: 'folder', cwd: ROOT_1 }), mockContextService); + configurationService = new TestConfigurationService({ terminal: { integrated: { tabs: { separator: ' ~ ', title: '${process}${separator}${cwdFolder}', description: '${cwdFolder}' } } } }); + configHelper = new TerminalConfigHelper(configurationService, null!, null!, null!, null!); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: { uri: URI.from({ scheme: Schemas.file, path: ROOT_1 }) } as IWorkspaceFolder, cwd: ROOT_1 }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'process'); strictEqual(terminalLabelComputer.description, ''); if (!isWindows) { - terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: 'folder', cwd: ROOT_2 }), mockContextService); + terminalLabelComputer = new TerminalLabelComputer(configHelper, createInstance({ capabilities, processName: 'process', workspaceFolder: { uri: URI.from({ scheme: Schemas.file, path: ROOT_1 }) } as IWorkspaceFolder, cwd: ROOT_2 }), mockContextService); terminalLabelComputer.refreshLabel(); strictEqual(terminalLabelComputer.title, 'process ~ root2'); strictEqual(terminalLabelComputer.description, 'root2'); diff --git a/src/vs/workbench/contrib/terminal/test/browser/terminalProfileService.test.ts b/src/vs/workbench/contrib/terminal/test/browser/terminalProfileService.test.ts index 53aab44a21a..7e10e587c25 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/terminalProfileService.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/terminalProfileService.test.ts @@ -65,8 +65,8 @@ class MockTerminalProfileService implements Partial{ class MockQuickInputService implements Partial { _pick: IProfileQuickPickItem = powershellPick; - pick(picks: QuickPickInput[] | Promise[]>, options?: IPickOptions & { canPickMany: true; }, token?: CancellationToken): Promise; - pick(picks: QuickPickInput[] | Promise[]>, options?: IPickOptions & { canPickMany: false; }, token?: CancellationToken): Promise; + pick(picks: QuickPickInput[] | Promise[]>, options?: IPickOptions & { canPickMany: true }, token?: CancellationToken): Promise; + pick(picks: QuickPickInput[] | Promise[]>, options?: IPickOptions & { canPickMany: false }, token?: CancellationToken): Promise; pick(picks: QuickPickInput[] | Promise[]>, options?: Omit, 'canPickMany'>, token?: CancellationToken): Promise; async pick(picks: any, options?: any, token?: any): Promise { Promise.resolve(picks); @@ -157,7 +157,7 @@ suite('TerminalProfileService', () => { remoteAgentService = new TestRemoteAgentService(); terminalInstanceService = new TestTerminalInstanceService(); extensionService = new TestTerminalExtensionService(); - environmentService = { configuration: {}, remoteAuthority: undefined } as IWorkbenchEnvironmentService; + environmentService = { remoteAuthority: undefined } as IWorkbenchEnvironmentService; instantiationService = new TestInstantiationService(); let themeService = new TestThemeService(); @@ -258,7 +258,7 @@ suite('TerminalProfileService', () => { }); test('should get profiles from remoteTerminalService when there is a remote authority', async () => { - environmentService = { configuration: {}, remoteAuthority: 'fakeremote' } as IWorkbenchEnvironmentService; + environmentService = { remoteAuthority: 'fakeremote' } as IWorkbenchEnvironmentService; instantiationService.stub(IWorkbenchEnvironmentService, environmentService); terminalProfileService = instantiationService.createInstance(TestTerminalProfileService); await terminalProfileService.hasRefreshedProfiles; diff --git a/src/vs/workbench/contrib/terminal/test/browser/terminalTypeahead.test.ts b/src/vs/workbench/contrib/terminal/test/browser/terminalTypeahead.test.ts index 0f93b55fda7..b718f9aa134 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/terminalTypeahead.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/terminalTypeahead.test.ts @@ -439,8 +439,8 @@ function stubPrediction(): IPrediction { } function createMockTerminal({ lines, cursorAttrs }: { - lines: string[], - cursorAttrs?: any, + lines: string[]; + cursorAttrs?: any; }) { const written: string[] = []; const cursor = { y: 1, x: 1 }; diff --git a/src/vs/workbench/contrib/terminal/test/browser/xterm/shellIntegrationAddon.test.ts b/src/vs/workbench/contrib/terminal/test/browser/xterm/shellIntegrationAddon.test.ts new file mode 100644 index 00000000000..26f20eefe14 --- /dev/null +++ b/src/vs/workbench/contrib/terminal/test/browser/xterm/shellIntegrationAddon.test.ts @@ -0,0 +1,139 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Terminal } from 'xterm'; +import { strictEqual } from 'assert'; +import { timeout } from 'vs/base/common/async'; +import * as sinon from 'sinon'; +import { ShellIntegrationAddon } from 'vs/workbench/contrib/terminal/browser/xterm/shellIntegrationAddon'; +import { ITerminalCapabilityStore, TerminalCapability } from 'vs/workbench/contrib/terminal/common/capabilities/capabilities'; +import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; +import { ILogService, NullLogService } from 'vs/platform/log/common/log'; + +async function writeP(terminal: Terminal, data: string): Promise { + return new Promise((resolve, reject) => { + const failTimeout = timeout(2000); + failTimeout.then(() => reject('Writing to xterm is taking longer than 2 seconds')); + terminal.write(data, () => { + failTimeout.cancel(); + resolve(); + }); + }); +} + +class TestShellIntegrationAddon extends ShellIntegrationAddon { + getCommandDetectionMock(terminal: Terminal): sinon.SinonMock { + const capability = super._createOrGetCommandDetection(terminal); + this.capabilities.add(TerminalCapability.CommandDetection, capability); + return sinon.mock(capability); + } + getCwdDectionMock(): sinon.SinonMock { + const capability = super._createOrGetCwdDetection(); + this.capabilities.add(TerminalCapability.CwdDetection, capability); + return sinon.mock(capability); + } +} + +suite('ShellIntegrationAddon', () => { + let xterm: Terminal; + let shellIntegrationAddon: TestShellIntegrationAddon; + let capabilities: ITerminalCapabilityStore; + + setup(() => { + xterm = new Terminal({ + cols: 80, + rows: 30 + }); + const instantiationService = new TestInstantiationService(); + instantiationService.stub(ILogService, NullLogService); + shellIntegrationAddon = instantiationService.createInstance(TestShellIntegrationAddon); + xterm.loadAddon(shellIntegrationAddon); + capabilities = shellIntegrationAddon.capabilities; + }); + + suite('cwd detection', async () => { + test('should activate capability on the cwd sequence (OSC 1337 ; CurrentDir= ST)', async () => { + strictEqual(capabilities.has(TerminalCapability.CwdDetection), false); + await writeP(xterm, 'foo'); + strictEqual(capabilities.has(TerminalCapability.CwdDetection), false); + await writeP(xterm, '\x1b]1337;CurrentDir=/foo\x07'); + strictEqual(capabilities.has(TerminalCapability.CwdDetection), true); + }); + test('should pass cwd sequence to the capability', async () => { + const mock = shellIntegrationAddon.getCwdDectionMock(); + mock.expects('updateCwd').once().withExactArgs('/foo'); + await writeP(xterm, '\x1b]1337;CurrentDir=/foo\x07'); + mock.verify(); + }); + }); + + suite('command tracking', async () => { + test('should activate capability on the prompt start sequence (OSC 133 ; A ST)', async () => { + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, 'foo'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, '\x1b]133;A\x07'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), true); + }); + test('should pass prompt start sequence to the capability', async () => { + const mock = shellIntegrationAddon.getCommandDetectionMock(xterm); + mock.expects('handlePromptStart').once().withExactArgs(); + await writeP(xterm, '\x1b]133;A\x07'); + mock.verify(); + }); + test('should activate capability on the command start sequence (OSC 133 ; B ST)', async () => { + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, 'foo'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, '\x1b]133;B\x07'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), true); + }); + test('should pass command start sequence to the capability', async () => { + const mock = shellIntegrationAddon.getCommandDetectionMock(xterm); + mock.expects('handleCommandStart').once().withExactArgs(); + await writeP(xterm, '\x1b]133;B\x07'); + mock.verify(); + }); + test('should activate capability on the command executed sequence (OSC 133 ; C ST)', async () => { + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, 'foo'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, '\x1b]133;C\x07'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), true); + }); + test('should pass command executed sequence to the capability', async () => { + const mock = shellIntegrationAddon.getCommandDetectionMock(xterm); + mock.expects('handleCommandExecuted').once().withExactArgs(); + await writeP(xterm, '\x1b]133;C\x07'); + mock.verify(); + }); + test('should activate capability on the command finished sequence (OSC 133 ; D ; ST)', async () => { + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, 'foo'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, '\x1b]133;D;7\x07'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), true); + }); + test('should pass command finished sequence to the capability', async () => { + const mock = shellIntegrationAddon.getCommandDetectionMock(xterm); + mock.expects('handleCommandFinished').once().withExactArgs(7); + await writeP(xterm, '\x1b]133;D;7\x07'); + mock.verify(); + }); + test('should not activate capability on the cwd sequence (OSC 1337 ; CurrentDir= ST)', async () => { + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, 'foo'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + await writeP(xterm, '\x1b]1337;CurrentDir=/foo\x07'); + strictEqual(capabilities.has(TerminalCapability.CommandDetection), false); + }); + test('should pass cwd sequence to the capability if it\'s initialized', async () => { + const mock = shellIntegrationAddon.getCommandDetectionMock(xterm); + mock.expects('setCwd').once().withExactArgs('/foo'); + await writeP(xterm, '\x1b]1337;CurrentDir=/foo\x07'); + mock.verify(); + }); + }); +}); diff --git a/src/vs/workbench/contrib/terminal/test/browser/xterm/xtermTerminal.test.ts b/src/vs/workbench/contrib/terminal/test/browser/xterm/xtermTerminal.test.ts index d23fb008882..47da41f9fc4 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/xterm/xtermTerminal.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/xterm/xtermTerminal.test.ts @@ -24,6 +24,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; import { isSafari } from 'vs/base/browser/browser'; import { TerminalLocation } from 'vs/platform/terminal/common/terminal'; +import { TerminalCapabilityStore } from 'vs/workbench/contrib/terminal/common/capabilities/terminalCapabilityStore'; class TestWebglAddon { static shouldThrow = false; @@ -51,7 +52,7 @@ class TestXtermTerminal extends XtermTerminal { export class TestViewDescriptorService implements Partial { private _location = ViewContainerLocation.Panel; - private _onDidChangeLocation = new Emitter<{ views: IViewDescriptor[], from: ViewContainerLocation, to: ViewContainerLocation }>(); + private _onDidChangeLocation = new Emitter<{ views: IViewDescriptor[]; from: ViewContainerLocation; to: ViewContainerLocation }>(); onDidChangeLocation = this._onDidChangeLocation.event; getViewLocationById(id: string) { return this._location; @@ -85,7 +86,6 @@ suite('XtermTerminal', () => { let configurationService: TestConfigurationService; let themeService: TestThemeService; let viewDescriptorService: TestViewDescriptorService; - let xterm: TestXtermTerminal; let configHelper: ITerminalConfigHelper; @@ -110,7 +110,7 @@ suite('XtermTerminal', () => { instantiationService.stub(IViewDescriptorService, viewDescriptorService); configHelper = instantiationService.createInstance(TerminalConfigHelper); - xterm = instantiationService.createInstance(TestXtermTerminal, Terminal, configHelper, 80, 30, TerminalLocation.Panel); + xterm = instantiationService.createInstance(TestXtermTerminal, Terminal, configHelper, 80, 30, TerminalLocation.Panel, new TerminalCapabilityStore()); TestWebglAddon.shouldThrow = false; TestWebglAddon.isEnabled = false; @@ -127,7 +127,7 @@ suite('XtermTerminal', () => { [PANEL_BACKGROUND]: '#ff0000', [SIDE_BAR_BACKGROUND]: '#00ff00' })); - xterm = instantiationService.createInstance(XtermTerminal, Terminal, configHelper, 80, 30, TerminalLocation.Panel); + xterm = instantiationService.createInstance(XtermTerminal, Terminal, configHelper, 80, 30, TerminalLocation.Panel, new TerminalCapabilityStore()); strictEqual(xterm.raw.options.theme?.background, '#ff0000'); viewDescriptorService.moveTerminalToLocation(ViewContainerLocation.Sidebar); strictEqual(xterm.raw.options.theme?.background, '#00ff00'); @@ -160,7 +160,7 @@ suite('XtermTerminal', () => { 'terminal.ansiBrightCyan': '#150000', 'terminal.ansiBrightWhite': '#160000', })); - xterm = instantiationService.createInstance(XtermTerminal, Terminal, configHelper, 80, 30, TerminalLocation.Panel); + xterm = instantiationService.createInstance(XtermTerminal, Terminal, configHelper, 80, 30, TerminalLocation.Panel, new TerminalCapabilityStore()); deepStrictEqual(xterm.raw.options.theme, { background: '#000100', foreground: '#000200', diff --git a/src/vs/workbench/contrib/terminal/test/common/terminalEnvironment.test.ts b/src/vs/workbench/contrib/terminal/test/common/terminalEnvironment.test.ts index d1b90d0c3ed..398c2caf921 100644 --- a/src/vs/workbench/contrib/terminal/test/common/terminalEnvironment.test.ts +++ b/src/vs/workbench/contrib/terminal/test/common/terminalEnvironment.test.ts @@ -3,117 +3,120 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; import { URI as Uri } from 'vs/base/common/uri'; import { IStringDictionary } from 'vs/base/common/collections'; -import { addTerminalEnvironmentKeys, mergeEnvironments, getCwd, getDefaultShell, getLangEnvVariable, shouldSetLangEnvVariable } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; -import { isWindows, Platform } from 'vs/base/common/platform'; +import { addTerminalEnvironmentKeys, mergeEnvironments, getCwd, getDefaultShell, getLangEnvVariable, shouldSetLangEnvVariable, injectShellIntegrationArgs, shellIntegrationArgs, ShellIntegrationExecutable } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; +import { IProcessEnvironment, isWindows, OperatingSystem, OS, Platform } from 'vs/base/common/platform'; +import { deepStrictEqual, strictEqual } from 'assert'; +import { NullLogService } from 'vs/platform/log/common/log'; +import { terminalProfileArgsMatch } from 'vs/platform/terminal/common/terminalProfiles'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; suite('Workbench - TerminalEnvironment', () => { suite('addTerminalEnvironmentKeys', () => { test('should set expected variables', () => { const env: { [key: string]: any } = {}; addTerminalEnvironmentKeys(env, '1.2.3', 'en', 'on'); - assert.strictEqual(env['TERM_PROGRAM'], 'vscode'); - assert.strictEqual(env['TERM_PROGRAM_VERSION'], '1.2.3'); - assert.strictEqual(env['COLORTERM'], 'truecolor'); - assert.strictEqual(env['LANG'], 'en_US.UTF-8'); + strictEqual(env['TERM_PROGRAM'], 'vscode'); + strictEqual(env['TERM_PROGRAM_VERSION'], '1.2.3'); + strictEqual(env['COLORTERM'], 'truecolor'); + strictEqual(env['LANG'], 'en_US.UTF-8'); }); test('should use language variant for LANG that is provided in locale', () => { const env: { [key: string]: any } = {}; addTerminalEnvironmentKeys(env, '1.2.3', 'en-au', 'on'); - assert.strictEqual(env['LANG'], 'en_AU.UTF-8', 'LANG is equal to the requested locale with UTF-8'); + strictEqual(env['LANG'], 'en_AU.UTF-8', 'LANG is equal to the requested locale with UTF-8'); }); test('should fallback to en_US when no locale is provided', () => { const env2: { [key: string]: any } = { FOO: 'bar' }; addTerminalEnvironmentKeys(env2, '1.2.3', undefined, 'on'); - assert.strictEqual(env2['LANG'], 'en_US.UTF-8', 'LANG is equal to en_US.UTF-8 as fallback.'); // More info on issue #14586 + strictEqual(env2['LANG'], 'en_US.UTF-8', 'LANG is equal to en_US.UTF-8 as fallback.'); // More info on issue #14586 }); test('should fallback to en_US when an invalid locale is provided', () => { const env3 = { LANG: 'replace' }; addTerminalEnvironmentKeys(env3, '1.2.3', undefined, 'on'); - assert.strictEqual(env3['LANG'], 'en_US.UTF-8', 'LANG is set to the fallback LANG'); + strictEqual(env3['LANG'], 'en_US.UTF-8', 'LANG is set to the fallback LANG'); }); test('should override existing LANG', () => { const env4 = { LANG: 'en_AU.UTF-8' }; addTerminalEnvironmentKeys(env4, '1.2.3', undefined, 'on'); - assert.strictEqual(env4['LANG'], 'en_US.UTF-8', 'LANG is equal to the parent environment\'s LANG'); + strictEqual(env4['LANG'], 'en_US.UTF-8', 'LANG is equal to the parent environment\'s LANG'); }); }); suite('shouldSetLangEnvVariable', () => { test('auto', () => { - assert.strictEqual(shouldSetLangEnvVariable({}, 'auto'), true); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'auto'), true); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'auto'), true); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'auto'), false); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'auto'), false); + strictEqual(shouldSetLangEnvVariable({}, 'auto'), true); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'auto'), true); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'auto'), true); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'auto'), false); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'auto'), false); }); test('off', () => { - assert.strictEqual(shouldSetLangEnvVariable({}, 'off'), false); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'off'), false); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'off'), false); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'off'), false); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'off'), false); + strictEqual(shouldSetLangEnvVariable({}, 'off'), false); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'off'), false); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'off'), false); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'off'), false); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'off'), false); }); test('on', () => { - assert.strictEqual(shouldSetLangEnvVariable({}, 'on'), true); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'on'), true); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'on'), true); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'on'), true); - assert.strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'on'), true); + strictEqual(shouldSetLangEnvVariable({}, 'on'), true); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US' }, 'on'), true); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf' }, 'on'), true); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.utf8' }, 'on'), true); + strictEqual(shouldSetLangEnvVariable({ LANG: 'en-US.UTF-8' }, 'on'), true); }); }); suite('getLangEnvVariable', () => { test('should fallback to en_US when no locale is provided', () => { - assert.strictEqual(getLangEnvVariable(undefined), 'en_US.UTF-8'); - assert.strictEqual(getLangEnvVariable(''), 'en_US.UTF-8'); + strictEqual(getLangEnvVariable(undefined), 'en_US.UTF-8'); + strictEqual(getLangEnvVariable(''), 'en_US.UTF-8'); }); test('should fallback to default language variants when variant isn\'t provided', () => { - assert.strictEqual(getLangEnvVariable('af'), 'af_ZA.UTF-8'); - assert.strictEqual(getLangEnvVariable('am'), 'am_ET.UTF-8'); - assert.strictEqual(getLangEnvVariable('be'), 'be_BY.UTF-8'); - assert.strictEqual(getLangEnvVariable('bg'), 'bg_BG.UTF-8'); - assert.strictEqual(getLangEnvVariable('ca'), 'ca_ES.UTF-8'); - assert.strictEqual(getLangEnvVariable('cs'), 'cs_CZ.UTF-8'); - assert.strictEqual(getLangEnvVariable('da'), 'da_DK.UTF-8'); - assert.strictEqual(getLangEnvVariable('de'), 'de_DE.UTF-8'); - assert.strictEqual(getLangEnvVariable('el'), 'el_GR.UTF-8'); - assert.strictEqual(getLangEnvVariable('en'), 'en_US.UTF-8'); - assert.strictEqual(getLangEnvVariable('es'), 'es_ES.UTF-8'); - assert.strictEqual(getLangEnvVariable('et'), 'et_EE.UTF-8'); - assert.strictEqual(getLangEnvVariable('eu'), 'eu_ES.UTF-8'); - assert.strictEqual(getLangEnvVariable('fi'), 'fi_FI.UTF-8'); - assert.strictEqual(getLangEnvVariable('fr'), 'fr_FR.UTF-8'); - assert.strictEqual(getLangEnvVariable('he'), 'he_IL.UTF-8'); - assert.strictEqual(getLangEnvVariable('hr'), 'hr_HR.UTF-8'); - assert.strictEqual(getLangEnvVariable('hu'), 'hu_HU.UTF-8'); - assert.strictEqual(getLangEnvVariable('hy'), 'hy_AM.UTF-8'); - assert.strictEqual(getLangEnvVariable('is'), 'is_IS.UTF-8'); - assert.strictEqual(getLangEnvVariable('it'), 'it_IT.UTF-8'); - assert.strictEqual(getLangEnvVariable('ja'), 'ja_JP.UTF-8'); - assert.strictEqual(getLangEnvVariable('kk'), 'kk_KZ.UTF-8'); - assert.strictEqual(getLangEnvVariable('ko'), 'ko_KR.UTF-8'); - assert.strictEqual(getLangEnvVariable('lt'), 'lt_LT.UTF-8'); - assert.strictEqual(getLangEnvVariable('nl'), 'nl_NL.UTF-8'); - assert.strictEqual(getLangEnvVariable('no'), 'no_NO.UTF-8'); - assert.strictEqual(getLangEnvVariable('pl'), 'pl_PL.UTF-8'); - assert.strictEqual(getLangEnvVariable('pt'), 'pt_BR.UTF-8'); - assert.strictEqual(getLangEnvVariable('ro'), 'ro_RO.UTF-8'); - assert.strictEqual(getLangEnvVariable('ru'), 'ru_RU.UTF-8'); - assert.strictEqual(getLangEnvVariable('sk'), 'sk_SK.UTF-8'); - assert.strictEqual(getLangEnvVariable('sl'), 'sl_SI.UTF-8'); - assert.strictEqual(getLangEnvVariable('sr'), 'sr_YU.UTF-8'); - assert.strictEqual(getLangEnvVariable('sv'), 'sv_SE.UTF-8'); - assert.strictEqual(getLangEnvVariable('tr'), 'tr_TR.UTF-8'); - assert.strictEqual(getLangEnvVariable('uk'), 'uk_UA.UTF-8'); - assert.strictEqual(getLangEnvVariable('zh'), 'zh_CN.UTF-8'); + strictEqual(getLangEnvVariable('af'), 'af_ZA.UTF-8'); + strictEqual(getLangEnvVariable('am'), 'am_ET.UTF-8'); + strictEqual(getLangEnvVariable('be'), 'be_BY.UTF-8'); + strictEqual(getLangEnvVariable('bg'), 'bg_BG.UTF-8'); + strictEqual(getLangEnvVariable('ca'), 'ca_ES.UTF-8'); + strictEqual(getLangEnvVariable('cs'), 'cs_CZ.UTF-8'); + strictEqual(getLangEnvVariable('da'), 'da_DK.UTF-8'); + strictEqual(getLangEnvVariable('de'), 'de_DE.UTF-8'); + strictEqual(getLangEnvVariable('el'), 'el_GR.UTF-8'); + strictEqual(getLangEnvVariable('en'), 'en_US.UTF-8'); + strictEqual(getLangEnvVariable('es'), 'es_ES.UTF-8'); + strictEqual(getLangEnvVariable('et'), 'et_EE.UTF-8'); + strictEqual(getLangEnvVariable('eu'), 'eu_ES.UTF-8'); + strictEqual(getLangEnvVariable('fi'), 'fi_FI.UTF-8'); + strictEqual(getLangEnvVariable('fr'), 'fr_FR.UTF-8'); + strictEqual(getLangEnvVariable('he'), 'he_IL.UTF-8'); + strictEqual(getLangEnvVariable('hr'), 'hr_HR.UTF-8'); + strictEqual(getLangEnvVariable('hu'), 'hu_HU.UTF-8'); + strictEqual(getLangEnvVariable('hy'), 'hy_AM.UTF-8'); + strictEqual(getLangEnvVariable('is'), 'is_IS.UTF-8'); + strictEqual(getLangEnvVariable('it'), 'it_IT.UTF-8'); + strictEqual(getLangEnvVariable('ja'), 'ja_JP.UTF-8'); + strictEqual(getLangEnvVariable('kk'), 'kk_KZ.UTF-8'); + strictEqual(getLangEnvVariable('ko'), 'ko_KR.UTF-8'); + strictEqual(getLangEnvVariable('lt'), 'lt_LT.UTF-8'); + strictEqual(getLangEnvVariable('nl'), 'nl_NL.UTF-8'); + strictEqual(getLangEnvVariable('no'), 'no_NO.UTF-8'); + strictEqual(getLangEnvVariable('pl'), 'pl_PL.UTF-8'); + strictEqual(getLangEnvVariable('pt'), 'pt_BR.UTF-8'); + strictEqual(getLangEnvVariable('ro'), 'ro_RO.UTF-8'); + strictEqual(getLangEnvVariable('ru'), 'ru_RU.UTF-8'); + strictEqual(getLangEnvVariable('sk'), 'sk_SK.UTF-8'); + strictEqual(getLangEnvVariable('sl'), 'sl_SI.UTF-8'); + strictEqual(getLangEnvVariable('sr'), 'sr_YU.UTF-8'); + strictEqual(getLangEnvVariable('sv'), 'sv_SE.UTF-8'); + strictEqual(getLangEnvVariable('tr'), 'tr_TR.UTF-8'); + strictEqual(getLangEnvVariable('uk'), 'uk_UA.UTF-8'); + strictEqual(getLangEnvVariable('zh'), 'zh_CN.UTF-8'); }); test('should set language variant based on full locale', () => { - assert.strictEqual(getLangEnvVariable('en-AU'), 'en_AU.UTF-8'); - assert.strictEqual(getLangEnvVariable('en-au'), 'en_AU.UTF-8'); - assert.strictEqual(getLangEnvVariable('fa-ke'), 'fa_KE.UTF-8'); + strictEqual(getLangEnvVariable('en-AU'), 'en_AU.UTF-8'); + strictEqual(getLangEnvVariable('en-au'), 'en_AU.UTF-8'); + strictEqual(getLangEnvVariable('fa-ke'), 'fa_KE.UTF-8'); }); }); @@ -126,7 +129,7 @@ suite('Workbench - TerminalEnvironment', () => { c: 'd' }; mergeEnvironments(parent, other); - assert.deepStrictEqual(parent, { + deepStrictEqual(parent, { a: 'b', c: 'd' }); @@ -140,7 +143,7 @@ suite('Workbench - TerminalEnvironment', () => { A: 'c' }; mergeEnvironments(parent, other); - assert.deepStrictEqual(parent, { + deepStrictEqual(parent, { a: 'c' }); }); @@ -154,7 +157,7 @@ suite('Workbench - TerminalEnvironment', () => { a: null }; mergeEnvironments(parent, other); - assert.deepStrictEqual(parent, { + deepStrictEqual(parent, { c: 'd' }); }); @@ -168,7 +171,7 @@ suite('Workbench - TerminalEnvironment', () => { A: null }; mergeEnvironments(parent, other); - assert.deepStrictEqual(parent, { + deepStrictEqual(parent, { c: 'd' }); }); @@ -177,7 +180,7 @@ suite('Workbench - TerminalEnvironment', () => { suite('getCwd', () => { // This helper checks the paths in a cross-platform friendly manner function assertPathsMatch(a: string, b: string): void { - assert.strictEqual(Uri.file(a).fsPath, Uri.file(b).fsPath); + strictEqual(Uri.file(a).fsPath, Uri.file(b).fsPath); } test('should default to userHome for an empty workspace', () => { @@ -214,14 +217,14 @@ suite('Workbench - TerminalEnvironment', () => { const shell = getDefaultShell(key => { return ({ 'terminal.integrated.shell.windows': 'C:\\Windows\\Sysnative\\cmd.exe' } as any)[key]; }, 'DEFAULT', false, 'C:\\Windows', undefined, {} as any, false, Platform.Windows); - assert.strictEqual(shell, 'C:\\Windows\\System32\\cmd.exe'); + strictEqual(shell, 'C:\\Windows\\System32\\cmd.exe'); }); test('should not change Sysnative to System32 in WoW64 systems', () => { const shell = getDefaultShell(key => { return ({ 'terminal.integrated.shell.windows': 'C:\\Windows\\Sysnative\\cmd.exe' } as any)[key]; }, 'DEFAULT', true, 'C:\\Windows', undefined, {} as any, false, Platform.Windows); - assert.strictEqual(shell, 'C:\\Windows\\Sysnative\\cmd.exe'); + strictEqual(shell, 'C:\\Windows\\Sysnative\\cmd.exe'); }); test('should use automationShell when specified', () => { @@ -231,21 +234,270 @@ suite('Workbench - TerminalEnvironment', () => { 'terminal.integrated.automationShell.windows': undefined } as any)[key]; }, 'DEFAULT', false, 'C:\\Windows', undefined, {} as any, false, Platform.Windows); - assert.strictEqual(shell1, 'shell', 'automationShell was false'); + strictEqual(shell1, 'shell', 'automationShell was false'); const shell2 = getDefaultShell(key => { return ({ 'terminal.integrated.shell.windows': 'shell', 'terminal.integrated.automationShell.windows': undefined } as any)[key]; }, 'DEFAULT', false, 'C:\\Windows', undefined, {} as any, true, Platform.Windows); - assert.strictEqual(shell2, 'shell', 'automationShell was true'); + strictEqual(shell2, 'shell', 'automationShell was true'); const shell3 = getDefaultShell(key => { return ({ 'terminal.integrated.shell.windows': 'shell', 'terminal.integrated.automationShell.windows': 'automationShell' } as any)[key]; }, 'DEFAULT', false, 'C:\\Windows', undefined, {} as any, true, Platform.Windows); - assert.strictEqual(shell3, 'automationShell', 'automationShell was true and specified in settings'); + strictEqual(shell3, 'automationShell', 'automationShell was true and specified in settings'); }); }); + + suite('injectShellIntegrationArgs', () => { + const env = {} as IProcessEnvironment; + const logService = new NullLogService(); + const configurationService = new TestConfigurationService(); + let shellIntegrationEnabled = true; + + suite('should not enable', () => { + const executable = OS ? 'pwsh.exe' : 'pwsh'; + test('when isFeatureTerminal or when no executable is provided', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-l', '-NoLogo'], isFeatureTerminal: true }, OS); + terminalProfileArgsMatch(args, ['-l', '-NoLogo']); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { args: [] }, OS)); + terminalProfileArgsMatch(args, []); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + }); + + suite('pwsh', () => { + + let executable = OS ? 'pwsh.exe' : 'pwsh'; + + suite('should override args', () => { + const expectedArgs = OS ? shellIntegrationArgs.get(ShellIntegrationExecutable.Pwsh) : shellIntegrationArgs.get(ShellIntegrationExecutable.WindowsPwsh); + test('when undefined, [], empty string, or empty string in array', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: [''] }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: [] }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: undefined }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + suite('when no logo', () => { + test('array - case insensitive', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-NoLogo'] }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-NOLOGO'] }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-nol'] }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-NOL'] }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('string - case insensitive', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-NoLogo' }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-NOLOGO' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-nol' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-Nol' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('regardless of executable case', () => { + executable = OS ? 'pwSh.exe' : 'PWsh'; + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-NoLogo' }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-NOLOGO' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-nol' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-Nol' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + executable = OS ? 'pwsh.exe' : 'pwsh'; + }); + }); + }); + suite('should incorporate login arg', () => { + const expectedArgs = OS ? shellIntegrationArgs.get(ShellIntegrationExecutable.PwshLogin) : shellIntegrationArgs.get(ShellIntegrationExecutable.WindowsPwshLogin); + test('when array contains no logo and login', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-l', '-NoLogo'] }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when string', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-l' }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + }); + suite('should not modify args', () => { + shellIntegrationEnabled = false; + test('when shell integration is disabled', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-l' }, OS); + strictEqual(args, '-l'); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: undefined }, OS)); + strictEqual(args, undefined); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when custom array entry', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-l', '-NoLogo', '-i'] }, OS); + terminalProfileArgsMatch(args, ['-l', '-NoLogo', '-i']); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when custom string', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-i' }, OS); + terminalProfileArgsMatch(args, '-i'); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + }); + }); + + if (OS !== OperatingSystem.Windows) { + suite('zsh', () => { + + let executable = 'zsh'; + + suite('should override args', () => { + const expectedArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.Zsh); + test('when undefined, [], empty string, or empty string in array', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: [''] }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: [] }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: undefined }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + suite('should incorporate login arg', () => { + const expectedArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.ZshLogin); + test('when array', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-l'] }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when string', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-l' }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('regardless of executable case', () => { + executable = 'ZSH'; + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + executable = 'zsh'; + }); + }); + suite('should not modify args', () => { + shellIntegrationEnabled = false; + test('when shell integration is disabled', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-l' }, OS); + strictEqual(args, '-l'); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: undefined }, OS)); + strictEqual(args, undefined); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when custom array entry', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-l', '-i'] }, OS); + terminalProfileArgsMatch(args, ['-l', '-i']); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when custom string', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-i' }, OS); + terminalProfileArgsMatch(args, '-i'); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + }); + }); + }); + suite('bash', () => { + let executable = 'bash'; + + suite('should override args', () => { + const expectedArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.Bash); + test('when undefined, [], empty string, or empty string in array', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: [''] }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: [] }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: undefined }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '' }, OS)); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('regardless of executable case', () => { + executable = 'BasH'; + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: [''] }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + suite('should set login env variable and not modify args', () => { + const expectedArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.Bash); + test('when array', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-l'] }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when string', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-l' }, OS); + terminalProfileArgsMatch(args, expectedArgs); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + }); + suite('should not modify args', () => { + shellIntegrationEnabled = false; + test('when shell integration is disabled', () => { + let { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-l' }, OS); + strictEqual(args, '-l'); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + ({ args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: undefined }, OS)); + strictEqual(args, undefined); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when custom array entry', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: ['-l', '-i'] }, OS); + terminalProfileArgsMatch(args, ['-l', '-i']); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + test('when custom string', () => { + const { args, enableShellIntegration } = injectShellIntegrationArgs(logService, configurationService, env, shellIntegrationEnabled, { executable, args: '-i' }, OS); + terminalProfileArgsMatch(args, '-i'); + strictEqual(enableShellIntegration, shellIntegrationEnabled); + }); + }); + }); + }); + } + }); }); diff --git a/src/vs/workbench/contrib/terminal/test/node/terminalProfiles.test.ts b/src/vs/workbench/contrib/terminal/test/node/terminalProfiles.test.ts index 3fc4cf03f22..7f7430622c5 100644 --- a/src/vs/workbench/contrib/terminal/test/node/terminalProfiles.test.ts +++ b/src/vs/workbench/contrib/terminal/test/node/terminalProfiles.test.ts @@ -238,5 +238,5 @@ suite('Workbench - TerminalProfiles', () => { export interface ITestTerminalConfig { profiles: ITerminalProfiles; - useWslProfiles: boolean + useWslProfiles: boolean; } diff --git a/src/vs/workbench/contrib/testing/browser/explorerProjections/hierarchalByLocation.ts b/src/vs/workbench/contrib/testing/browser/explorerProjections/hierarchalByLocation.ts index ee6b60a369f..25c655d5b13 100644 --- a/src/vs/workbench/contrib/testing/browser/explorerProjections/hierarchalByLocation.ts +++ b/src/vs/workbench/contrib/testing/browser/explorerProjections/hierarchalByLocation.ts @@ -15,6 +15,7 @@ import { IActionableTestTreeElement, ITestTreeProjection, TestExplorerTreeElemen import { NodeChangeList, NodeRenderDirective, NodeRenderFn, peersHaveChildren } from 'vs/workbench/contrib/testing/browser/explorerProjections/nodeHelper'; import { IComputedStateAndDurationAccessor, refreshComputedState } from 'vs/workbench/contrib/testing/common/getComputedState'; import { InternalTestItem, TestDiffOpType, TestItemExpandState, TestResultState, TestsDiff } from 'vs/workbench/contrib/testing/common/testCollection'; +import { TestResultItemChangeReason } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; import { ITestService } from 'vs/workbench/contrib/testing/common/testService'; @@ -83,7 +84,8 @@ export class HierarchicalByLocationProjection extends Disposable implements ITes })); // when test states change, reflect in the tree - this._register(results.onTestChanged(({ item: result }) => { + this._register(results.onTestChanged(ev => { + let result = ev.item; if (result.ownComputedState === TestResultState.Unset) { const fallback = results.getStateById(result.item.extId); if (fallback) { @@ -96,14 +98,18 @@ export class HierarchicalByLocationProjection extends Disposable implements ITes return; } - item.retired = result.retired; - item.ownState = result.ownComputedState; - item.ownDuration = result.ownDuration; + // Skip refreshing the duration if we can trivially tell it didn't change. + const refreshDuration = ev.reason === TestResultItemChangeReason.OwnStateChange && ev.previousOwnDuration !== result.ownDuration; // For items without children, always use the computed state. They are // either leaves (for which it's fine) or nodes where we haven't expanded // children and should trust whatever the result service gives us. const explicitComputed = item.children.size ? undefined : result.computedState; - refreshComputedState(computedStateAccessor, item, explicitComputed).forEach(this.addUpdated); + + item.retired = result.retired; + item.ownState = result.ownComputedState; + item.ownDuration = result.ownDuration; + + refreshComputedState(computedStateAccessor, item, explicitComputed, refreshDuration).forEach(this.addUpdated); this.addUpdated(item); this.updateEmitter.fire(); })); @@ -132,15 +138,15 @@ export class HierarchicalByLocationProjection extends Disposable implements ITes */ private applyDiff(diff: TestsDiff) { for (const op of diff) { - switch (op[0]) { + switch (op.op) { case TestDiffOpType.Add: { - const item = this.createItem(op[1]); + const item = this.createItem(op.item); this.storeItem(item); break; } case TestDiffOpType.Update: { - const patch = op[1]; + const patch = op.item; const existing = this.items.get(patch.extId); if (!existing) { break; @@ -159,7 +165,7 @@ export class HierarchicalByLocationProjection extends Disposable implements ITes } case TestDiffOpType.Remove: { - const toRemove = this.items.get(op[1]); + const toRemove = this.items.get(op.itemId); if (!toRemove) { break; } @@ -237,7 +243,7 @@ export class HierarchicalByLocationProjection extends Disposable implements ITes collapsible: node.test.expand !== TestItemExpandState.NotExpandable, collapsed: this.lastState.expanded[node.treeId] !== undefined ? !this.lastState.expanded[node.treeId] - : node.test.expand === TestItemExpandState.Expandable ? true : undefined, + : node.depth > 0, children: recurse(node.children), }; }; @@ -247,7 +253,7 @@ export class HierarchicalByLocationProjection extends Disposable implements ITes parent?.children.delete(treeElement); items.delete(treeElement.test.item.extId); if (parent instanceof ByLocationTestItemElement) { - refreshComputedState(computedStateAccessor, parent).forEach(this.addUpdated); + refreshComputedState(computedStateAccessor, parent, undefined, !!treeElement.duration).forEach(this.addUpdated); } return treeElement.children; @@ -268,7 +274,8 @@ export class HierarchicalByLocationProjection extends Disposable implements ITes treeElement.retired = prevState.retired; treeElement.ownState = prevState.computedState; treeElement.ownDuration = prevState.ownDuration; - refreshComputedState(computedStateAccessor, treeElement).forEach(this.addUpdated); + + refreshComputedState(computedStateAccessor, treeElement, undefined, !!treeElement.ownDuration).forEach(this.addUpdated); } } } diff --git a/src/vs/workbench/contrib/testing/browser/explorerProjections/index.ts b/src/vs/workbench/contrib/testing/browser/explorerProjections/index.ts index 9e7aec1b28e..2f62f353d6c 100644 --- a/src/vs/workbench/contrib/testing/browser/explorerProjections/index.ts +++ b/src/vs/workbench/contrib/testing/browser/explorerProjections/index.ts @@ -115,6 +115,10 @@ export class TestItemTreeElement implements IActionableTestTreeElement { return this.test.item.description; } + public get sortText() { + return this.test.item.sortText; + } + /** * Whether the node's test result is 'retired' -- from an outdated test run. */ diff --git a/src/vs/workbench/contrib/testing/browser/testExplorerActions.ts b/src/vs/workbench/contrib/testing/browser/testExplorerActions.ts index 6d818a57c05..ad5476e5311 100644 --- a/src/vs/workbench/contrib/testing/browser/testExplorerActions.ts +++ b/src/vs/workbench/contrib/testing/browser/testExplorerActions.ts @@ -19,9 +19,11 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { ViewAction } from 'vs/workbench/browser/parts/views/viewPane'; import { CATEGORIES } from 'vs/workbench/common/actions'; -import { FocusedViewContext, ViewContainerLocation } from 'vs/workbench/common/views'; +import { FocusedViewContext } from 'vs/workbench/common/contextkeys'; +import { ViewContainerLocation } from 'vs/workbench/common/views'; import { IExtensionsViewPaneContainer, VIEWLET_ID as EXTENSIONS_VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { IActionableTestTreeElement, TestItemTreeElement } from 'vs/workbench/contrib/testing/browser/explorerProjections/index'; import * as icons from 'vs/workbench/contrib/testing/browser/icons'; @@ -734,6 +736,7 @@ abstract class ExecuteTestAtCursor extends Action2 { const testService = accessor.get(ITestService); const profileService = accessor.get(ITestProfileService); + const uriIdentityService = accessor.get(IUriIdentityService); let bestNodes: InternalTestItem[] = []; let bestRange: Range | undefined; @@ -749,7 +752,7 @@ abstract class ExecuteTestAtCursor extends Action2 { // the closest one before the position. Again, if we find several tests // whose range is equal to the closest one, we run them all. await showDiscoveringWhile(accessor.get(IProgressService), (async () => { - for await (const test of testsInFile(testService.collection, model.uri)) { + for await (const test of testsInFile(testService.collection, uriIdentityService, model.uri)) { if (!test.item.range || !(profileService.capabilitiesForTest(test) & this.group)) { continue; } diff --git a/src/vs/workbench/contrib/testing/browser/testing.contribution.ts b/src/vs/workbench/contrib/testing/browser/testing.contribution.ts index 68808a61c61..3c37c3f6a3a 100644 --- a/src/vs/workbench/contrib/testing/browser/testing.contribution.ts +++ b/src/vs/workbench/contrib/testing/browser/testing.contribution.ts @@ -80,7 +80,7 @@ viewsRegistry.registerViewWelcomeContent(Testing.ExplorerViewId, { }); viewsRegistry.registerViewWelcomeContent(Testing.ExplorerViewId, { - content: '[' + localize('searchForAdditionalTestExtensions', "Install Additional Text Extensions...") + `](command:${SearchForTestExtension.ID})`, + content: '[' + localize('searchForAdditionalTestExtensions', "Install Additional Test Extensions...") + `](command:${SearchForTestExtension.ID})`, order: 10 }); diff --git a/src/vs/workbench/contrib/testing/browser/testingConfigurationUi.ts b/src/vs/workbench/contrib/testing/browser/testingConfigurationUi.ts index c4125d0573f..809868c283b 100644 --- a/src/vs/workbench/contrib/testing/browser/testingConfigurationUi.ts +++ b/src/vs/workbench/contrib/testing/browser/testingConfigurationUi.ts @@ -100,7 +100,7 @@ const triggerButtonHandler = (service: ITestProfileService, resolve: (arg: undef CommandsRegistry.registerCommand({ id: 'vscode.pickMultipleTestProfiles', handler: async (accessor: ServicesAccessor, options: IConfigurationPickerOptions & { - selected?: ITestRunProfile[], + selected?: ITestRunProfile[]; }) => { const profileService = accessor.get(ITestProfileService); const quickpick = buildPicker(accessor, options); diff --git a/src/vs/workbench/contrib/testing/browser/testingDecorations.ts b/src/vs/workbench/contrib/testing/browser/testingDecorations.ts index 8e6c2c8e147..5b887c4a96c 100644 --- a/src/vs/workbench/contrib/testing/browser/testingDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/testingDecorations.ts @@ -13,16 +13,17 @@ import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { Disposable, DisposableStore, IReference, MutableDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; import { removeAnsiEscapeCodes } from 'vs/base/common/strings'; +import { Constants } from 'vs/base/common/uint'; import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidgetPosition, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { editorCodeLensForeground, overviewRulerError, overviewRulerInfo } from 'vs/editor/common/core/editorColorRegistry'; import { IRange, Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { IModelDeltaDecoration, ITextModel, OverviewRulerLane, TrackedRangeStickiness } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { editorCodeLensForeground, overviewRulerError, overviewRulerInfo } from 'vs/editor/common/view/editorColorRegistry'; import { localize } from 'vs/nls'; import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; @@ -32,6 +33,7 @@ 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 { registerThemingParticipant, themeColorFromId, ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { BREAKPOINT_EDITOR_CONTRIBUTION_ID, IBreakpointEditorContribution } from 'vs/workbench/contrib/debug/common/debug'; import { getTestItemContextOverlay } from 'vs/workbench/contrib/testing/browser/explorerProjections/testItemContextOverlay'; import { testingRunAllIcon, testingRunIcon, testingStatesToIcons } from 'vs/workbench/contrib/testing/browser/icons'; @@ -113,11 +115,11 @@ export class TestingDecorationService extends Disposable implements ITestingDeco // is up to date. This prevents issues, as in #138632, #138835, #138922. this._register(this.testService.onWillProcessDiff(diff => { for (const entry of diff) { - let uri: URI | undefined; - if (entry[0] === TestDiffOpType.Add || entry[0] === TestDiffOpType.Update) { - uri = entry[1].item?.uri; - } else if (entry[0] === TestDiffOpType.Remove) { - uri = this.testService.collection.getNodeById(entry[1])?.item.uri; + let uri: URI | undefined | null; + if (entry.op === TestDiffOpType.Add || entry.op === TestDiffOpType.Update) { + uri = entry.item.item?.uri; + } else if (entry.op === TestDiffOpType.Remove) { + uri = this.testService.collection.getNodeById(entry.itemId)?.item.uri; } const rec = uri && this.decorationCache.get(uri); @@ -197,7 +199,7 @@ export class TestingDecorationService extends Disposable implements ITestingDeco const newDecorations = new TestDecorations(); model.changeDecorations(accessor => { - const runDecorations = new TestDecorations<{ line: number; id: ''; test: IncrementalTestCollectionItem, resultItem: TestResultItem | undefined }>(); + const runDecorations = new TestDecorations<{ line: number; id: ''; test: IncrementalTestCollectionItem; resultItem: TestResultItem | undefined }>(); for (const test of this.testService.collection.all) { if (!test.item.range || test.item.uri?.toString() !== uriStr) { continue; @@ -322,6 +324,7 @@ export class TestingDecorations extends Disposable implements IEditorContributio @ICodeEditorService private readonly codeEditorService: ICodeEditorService, @ITestService private readonly testService: ITestService, @ITestingDecorationsService private readonly decorations: ITestingDecorationsService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, ) { super(); @@ -404,7 +407,7 @@ export class TestingDecorations extends Disposable implements IEditorContributio this.decorations.syncDecorations(uri); (async () => { - for await (const _test of testsInFile(this.testService.collection, uri)) { + for await (const _test of testsInFile(this.testService.collection, this.uriIdentityService, uri)) { // consume the iterator so that all tests in the file get expanded. Or // at least until the URI changes. If new items are requested, changes // will be trigged in the `onDidProcessDiff` callback. @@ -536,6 +539,7 @@ abstract class TitleLensContentWidget { this.viewZoneId = accessor.addZone({ afterLineNumber: 0, + afterColumn: Constants.MAX_SAFE_SMALL_INTEGER, domNode: document.createElement('div'), heightInPx: 20, }); @@ -605,8 +609,8 @@ abstract class RunTestDecoration { constructor( protected tests: readonly { - test: IncrementalTestCollectionItem, - resultItem: TestResultItem | undefined, + test: IncrementalTestCollectionItem; + resultItem: TestResultItem | undefined; }[], private visible: boolean, protected readonly model: ITextModel, @@ -655,8 +659,8 @@ abstract class RunTestDecoration { * @returns true if options were changed, false otherwise */ public replaceOptions(newTests: readonly { - test: IncrementalTestCollectionItem, - resultItem: TestResultItem | undefined, + test: IncrementalTestCollectionItem; + resultItem: TestResultItem | undefined; }[], visible: boolean): boolean { if (visible === this.visible && equals(this.tests.map(t => t.test.item.extId), newTests.map(t => t.test.item.extId)) diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.ts index d2afbf5bd3f..23832ee3205 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.ts @@ -17,11 +17,11 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { TestTag } from 'vs/workbench/api/common/extHostTypeConverters'; import { attachSuggestEnabledInputBoxStyler, ContextScopedSuggestEnabledInputWithHistory, SuggestEnabledInputWithHistory, SuggestResultsProvider } from 'vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput'; import { testingFilterIcon } from 'vs/workbench/contrib/testing/browser/icons'; import { Testing } from 'vs/workbench/contrib/testing/common/constants'; import { StoredValue } from 'vs/workbench/contrib/testing/common/storedValue'; +import { denamespaceTestTag } from 'vs/workbench/contrib/testing/common/testCollection'; import { ITestExplorerFilterState, TestFilterTerm } from 'vs/workbench/contrib/testing/common/testExplorerFilterState'; import { ITestService } from 'vs/workbench/contrib/testing/common/testService'; @@ -74,7 +74,7 @@ export class TestingExplorerFilter extends BaseActionViewItem { provideResults: () => [ ...Object.entries(testFilterDescriptions).map(([label, detail]) => ({ label, detail })), ...Iterable.map(this.testService.collection.tags.values(), tag => { - const { ctrlId, tagId } = TestTag.denamespace(tag.id); + const { ctrlId, tagId } = denamespaceTestTag(tag.id); const insertText = `@${ctrlId}:${tagId}`; return ({ label: `@${ctrlId}:${tagId}`, diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index 45dbb7b7c43..c7dc2a9a2ae 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -16,7 +16,6 @@ import { Action, ActionRunner, IAction, Separator } from 'vs/base/common/actions import { disposableTimeout, RunOnceScheduler } from 'vs/base/common/async'; import { Color, RGBA } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; -import * as extpath from 'vs/base/common/extpath'; import { FuzzyScore } from 'vs/base/common/filters'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable, dispose, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; @@ -24,7 +23,7 @@ import { fuzzyContains } from 'vs/base/common/strings'; import { isDefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/testing'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { localize } from 'vs/nls'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; import { createAndFillInActionBarActions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; @@ -39,11 +38,12 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { UnmanagedProgress } from 'vs/platform/progress/common/progress'; -import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; +import { IStorageService, StorageScope, StorageTarget, WillSaveStateReason } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { foreground } from 'vs/platform/theme/common/colorRegistry'; import { attachButtonStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IResourceLabel, IResourceLabelOptions, IResourceLabelProps, ResourceLabels } from 'vs/workbench/browser/labels'; import { ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; @@ -53,6 +53,7 @@ import { ByNameTestItemElement, HierarchicalByNameProjection } from 'vs/workbenc import { ITestTreeProjection, TestExplorerTreeElement, TestItemTreeElement, TestTreeErrorMessage } from 'vs/workbench/contrib/testing/browser/explorerProjections/index'; import { getTestItemContextOverlay } from 'vs/workbench/contrib/testing/browser/explorerProjections/testItemContextOverlay'; import * as icons from 'vs/workbench/contrib/testing/browser/icons'; +import { ConfigureTestProfilesAction, DebugSelectedAction, RunSelectedAction, SelectDefaultTestProfiles } from 'vs/workbench/contrib/testing/browser/testExplorerActions'; import { TestingExplorerFilter } from 'vs/workbench/contrib/testing/browser/testingExplorerFilter'; import { ITestingProgressUiService } from 'vs/workbench/contrib/testing/browser/testingProgressUiService'; import { getTestingConfiguration, TestingConfigKeys } from 'vs/workbench/contrib/testing/common/configuration'; @@ -69,7 +70,6 @@ import { TestResultItemChangeReason } from 'vs/workbench/contrib/testing/common/ import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; import { IMainThreadTestCollection, ITestService, testCollectionIsEmpty } from 'vs/workbench/contrib/testing/common/testService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ConfigureTestProfilesAction, DebugSelectedAction, RunSelectedAction, SelectDefaultTestProfiles } from './testExplorerActions'; export class TestingExplorerView extends ViewPane { public viewModel!: TestingExplorerViewModel; @@ -568,7 +568,7 @@ export class TestingExplorerViewModel extends Disposable { // follow running tests, or tests whose state changed. Tests that // complete very fast may not enter the running state at all. - if (evt.item.ownComputedState !== TestResultState.Running && !(evt.previous === TestResultState.Queued && isStateWithResult(evt.item.ownComputedState))) { + if (evt.item.ownComputedState !== TestResultState.Running && !(evt.previousState === TestResultState.Queued && isStateWithResult(evt.item.ownComputedState))) { return; } @@ -592,8 +592,10 @@ export class TestingExplorerViewModel extends Disposable { this._register(editorService.onDidActiveEditorChange(onEditorChange)); - this._register(this.storageService.onWillSaveState(() => { - this.lastViewState.store(this.tree.getViewState()); + this._register(this.storageService.onWillSaveState(({ reason }) => { + if (reason === WillSaveStateReason.SHUTDOWN) { + this.lastViewState.store(this.tree.getViewState()); + } })); onEditorChange(); @@ -801,9 +803,7 @@ const enum FilterResult { Include, } -const hasNodeInOrParentOfUri = (collection: IMainThreadTestCollection, testUri: URI, fromNode?: string) => { - const fsPath = testUri.fsPath; - +const hasNodeInOrParentOfUri = (collection: IMainThreadTestCollection, ident: IUriIdentityService, testUri: URI, fromNode?: string) => { const queue: Iterable[] = [fromNode ? [fromNode] : collection.rootIds]; while (queue.length) { for (const id of queue.pop()!) { @@ -812,7 +812,7 @@ const hasNodeInOrParentOfUri = (collection: IMainThreadTestCollection, testUri: continue; } - if (!node.item.uri || !extpath.isEqualOrParent(fsPath, node.item.uri.fsPath)) { + if (!node.item.uri || !ident.extUri.isEqualOrParent(testUri, node.item.uri)) { continue; } @@ -836,6 +836,7 @@ class TestsFilter implements ITreeFilter { private readonly collection: IMainThreadTestCollection, @ITestExplorerFilterState private readonly state: ITestExplorerFilterState, @ITestService private readonly testService: ITestService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, ) { } /** @@ -901,7 +902,7 @@ class TestsFilter implements ITreeFilter { return FilterResult.Include; } - if (hasNodeInOrParentOfUri(this.collection, this.documentUri, element.test.item.extId)) { + if (hasNodeInOrParentOfUri(this.collection, this.uriIdentityService, this.documentUri, element.test.item.extId)) { return FilterResult.Include; } @@ -958,7 +959,7 @@ class TreeSorter implements ITreeSorter { } } - return a.label.localeCompare(b.label); + return (a.sortText || a.label).localeCompare(b.sortText || b.label); } } diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index 9e86a3b475e..435a7984ff7 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -26,7 +26,7 @@ import { Disposable, DisposableStore, IDisposable, IReference, MutableDisposable import { clamp } from 'vs/base/common/numbers'; import { count } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { ICodeEditor, IDiffEditorConstructionOptions, isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorAction2 } from 'vs/editor/browser/editorExtensions'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -37,7 +37,7 @@ import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution, ScrollType } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; -import { getOuterEditor, IPeekViewService, peekViewResultsBackground, peekViewResultsMatchForeground, peekViewResultsSelectionBackground, peekViewResultsSelectionForeground, peekViewTitleForeground, peekViewTitleInfoForeground, PeekViewWidget } from 'vs/editor/contrib/peekView/peekView'; +import { getOuterEditor, IPeekViewService, peekViewResultsBackground, peekViewResultsMatchForeground, peekViewResultsSelectionBackground, peekViewResultsSelectionForeground, peekViewTitleForeground, peekViewTitleInfoForeground, PeekViewWidget } from 'vs/editor/contrib/peekView/browser/peekView'; import { localize } from 'vs/nls'; import { createAndFillInActionBarActions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; @@ -485,7 +485,7 @@ export class TestingOutputPeekController extends Disposable implements IEditorCo } alert(renderStringAsPlaintext(message.message)); - this.peek.value!.setModel(dto); + this.peek.value.setModel(dto); this.currentPeekUri = uri; } @@ -552,7 +552,7 @@ export class TestingOutputPeekController extends Disposable implements IEditorCo return; } - let previous: { messageIndex: number, taskIndex: number, result: ITestResult, test: TestResultItem } | undefined; + let previous: { messageIndex: number; taskIndex: number; result: ITestResult; test: TestResultItem } | undefined; for (const m of allMessages(this.testResults.results)) { if (dto.test.extId === m.test.item.extId && dto.messageIndex === m.messageIndex && dto.taskIndex === m.taskIndex && dto.resultId === m.result.id) { if (!previous) { @@ -587,7 +587,7 @@ export class TestingOutputPeekController extends Disposable implements IEditorCo * else, then clear the peek. */ private closePeekOnTestChange(evt: TestResultItemChange) { - if (evt.reason !== TestResultItemChangeReason.OwnStateChange || evt.previous === evt.item.ownComputedState) { + if (evt.reason !== TestResultItemChangeReason.OwnStateChange || evt.previousState === evt.item.ownComputedState) { return; } @@ -767,8 +767,8 @@ class TestingOutputPeek extends PeekViewWidget { } protected override _relayout(newHeightInLines: number): void { - super._relayout(newHeightInLines); - TestingOutputPeek.lastHeightInLines = newHeightInLines; + super._relayout(newHeightInLines); + TestingOutputPeek.lastHeightInLines = newHeightInLines; } /** @override */ @@ -1265,12 +1265,15 @@ class OutputPeekTree extends Disposable { })); }; - const getRootChildren = () => results.results.map(result => ({ - element: cachedCreate(result, () => new TestResultElement(result)), - incompressible: true, - collapsed: true, - children: getResultChildren(result) - })); + const getRootChildren = () => results.results.map(result => { + const element = cachedCreate(result, () => new TestResultElement(result)); + return { + element, + incompressible: true, + collapsed: this.tree.hasElement(element) ? this.tree.isCollapsed(element) : true, + children: getResultChildren(result) + }; + }); this._register(results.onTestChanged(e => { const itemNode = creationCache.get(e.item); diff --git a/src/vs/workbench/contrib/testing/browser/testingProgressUiService.ts b/src/vs/workbench/contrib/testing/browser/testingProgressUiService.ts index dae9d3e35b3..77ac8c24841 100644 --- a/src/vs/workbench/contrib/testing/browser/testingProgressUiService.ts +++ b/src/vs/workbench/contrib/testing/browser/testingProgressUiService.ts @@ -10,10 +10,10 @@ import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ProgressLocation, UnmanagedProgress } from 'vs/platform/progress/common/progress'; -import { TestResultState } from 'vs/workbench/api/common/extHostTypes'; import { ViewContainerLocation } from 'vs/workbench/common/views'; import { AutoOpenTesting, getTestingConfiguration, TestingConfigKeys } from 'vs/workbench/contrib/testing/common/configuration'; import { Testing } from 'vs/workbench/contrib/testing/common/constants'; +import { TestResultState } from 'vs/workbench/contrib/testing/common/testCollection'; import { isFailedState } from 'vs/workbench/contrib/testing/common/testingStates'; import { LiveTestResult, TestResultItemChangeReason, TestStateCount } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; @@ -58,6 +58,10 @@ export class TestingProgressTrigger extends Disposable { } private attachAutoOpenForNewResults(result: LiveTestResult) { + if (result.request.isUiTriggered === false) { + return; + } + const cfg = getTestingConfiguration(this.configurationService, TestingConfigKeys.OpenTesting); if (cfg === AutoOpenTesting.NeverOpen) { return; @@ -90,6 +94,7 @@ export class TestingProgressUiService extends Disposable implements ITestingProg private readonly testViewProg = this._register(new MutableDisposable()); private readonly updateCountsEmitter = new Emitter(); private readonly updateTextEmitter = new Emitter(); + private lastRunSoFar = 0; public readonly onCountChange = this.updateCountsEmitter.event; public readonly onTextChange = this.updateTextEmitter.event; @@ -117,6 +122,7 @@ export class TestingProgressUiService extends Disposable implements ITestingProg this.windowProg.clear(); this.testViewProg.clear(); + this.lastRunSoFar = 0; return; } @@ -136,7 +142,8 @@ export class TestingProgressUiService extends Disposable implements ITestingProg const message = getTestProgressText(true, collected); this.updateTextEmitter.fire(message); this.windowProg.value.report({ message }); - this.testViewProg.value!.report({ increment: collected.runSoFar, total: collected.totalWillBeRun }); + this.testViewProg.value!.report({ increment: collected.runSoFar - this.lastRunSoFar, total: collected.totalWillBeRun }); + this.lastRunSoFar = collected.runSoFar; } } @@ -168,7 +175,7 @@ const collectTestStateCounts = (isRunning: boolean, ...counts: ReadonlyArray { +const getTestProgressText = (running: boolean, { passed, runSoFar, totalWillBeRun, skipped, failed }: CountSummary) => { let percent = passed / runSoFar * 100; if (failed > 0) { // fix: prevent from rounding to 100 if there's any failed test @@ -179,11 +186,11 @@ const getTestProgressText = (running: boolean, { passed, runSoFar, skipped, fail if (running) { if (runSoFar === 0) { - return localize('testProgress.runningInitial', 'Running tests...', passed, runSoFar, percent.toPrecision(3)); + return localize('testProgress.runningInitial', 'Running tests...'); } else if (skipped === 0) { - return localize('testProgress.running', 'Running tests, {0}/{1} passed ({2}%)', passed, runSoFar, percent.toPrecision(3)); + return localize('testProgress.running', 'Running tests, {0}/{1} passed ({2}%)', passed, totalWillBeRun, percent.toPrecision(3)); } else { - return localize('testProgressWithSkip.running', 'Running tests, {0}/{1} tests passed ({2}%, {3} skipped)', passed, runSoFar, percent.toPrecision(3), skipped); + return localize('testProgressWithSkip.running', 'Running tests, {0}/{1} tests passed ({2}%, {3} skipped)', passed, totalWillBeRun, percent.toPrecision(3), skipped); } } else { if (skipped === 0) { diff --git a/src/vs/workbench/contrib/testing/browser/theme.ts b/src/vs/workbench/contrib/testing/browser/theme.ts index 198416933a6..31eda025bb9 100644 --- a/src/vs/workbench/contrib/testing/browser/theme.ts +++ b/src/vs/workbench/contrib/testing/browser/theme.ts @@ -66,8 +66,8 @@ export const testingPeekHeaderBackground = registerColor('testing.peekHeaderBack export const testMessageSeverityColors: { [K in TestMessageType]: { - decorationForeground: string, - marginBackground: string, + decorationForeground: string; + marginBackground: string; }; } = { [TestMessageType.Error]: { diff --git a/src/vs/workbench/contrib/testing/common/configuration.ts b/src/vs/workbench/contrib/testing/common/configuration.ts index 58f4a1565d3..16cceda412a 100644 --- a/src/vs/workbench/contrib/testing/common/configuration.ts +++ b/src/vs/workbench/contrib/testing/common/configuration.ts @@ -16,6 +16,7 @@ export const enum TestingConfigKeys { FollowRunningTest = 'testing.followRunningTest', DefaultGutterClickAction = 'testing.defaultGutterClickAction', GutterEnabled = 'testing.gutterEnabled', + SaveBeforeTest = 'testing.saveBeforeTest', } export const enum AutoOpenTesting { @@ -108,6 +109,11 @@ export const testingConfiguation: IConfigurationNode = { type: 'boolean', default: true, }, + [TestingConfigKeys.SaveBeforeTest]: { + description: localize('testing.saveBeforeTest', 'Control whether save all dirty editors before running a test.'), + type: 'boolean', + default: true, + }, [TestingConfigKeys.OpenTesting]: { enum: [ AutoOpenTesting.NeverOpen, @@ -133,6 +139,7 @@ export interface ITestingConfiguration { [TestingConfigKeys.FollowRunningTest]: boolean; [TestingConfigKeys.DefaultGutterClickAction]: DefaultGutterClickAction; [TestingConfigKeys.GutterEnabled]: boolean; + [TestingConfigKeys.SaveBeforeTest]: boolean; [TestingConfigKeys.OpenTesting]: AutoOpenTesting; } diff --git a/src/vs/workbench/contrib/testing/common/getComputedState.ts b/src/vs/workbench/contrib/testing/common/getComputedState.ts index 82b33295403..f3d87de8eff 100644 --- a/src/vs/workbench/contrib/testing/common/getComputedState.ts +++ b/src/vs/workbench/contrib/testing/common/getComputedState.ts @@ -80,6 +80,7 @@ export const refreshComputedState = ( accessor: IComputedStateAccessor, node: T, explicitNewComputedState?: TestResultState, + refreshDuration = true, ) => { const oldState = accessor.getCurrentComputedState(node); const oldPriority = statePriority[oldState]; @@ -116,7 +117,7 @@ export const refreshComputedState = ( } } - if (isDurationAccessor(accessor)) { + if (isDurationAccessor(accessor) && refreshDuration) { for (const parent of Iterable.concat(Iterable.single(node), accessor.getParents(node))) { const oldDuration = accessor.getCurrentComputedDuration(parent); const newDuration = getComputedDuration(accessor, parent, true); diff --git a/src/vs/workbench/contrib/testing/common/mainThreadTestCollection.ts b/src/vs/workbench/contrib/testing/common/mainThreadTestCollection.ts index 3b5aee9ab77..52ddb69be63 100644 --- a/src/vs/workbench/contrib/testing/common/mainThreadTestCollection.ts +++ b/src/vs/workbench/contrib/testing/common/mainThreadTestCollection.ts @@ -84,18 +84,20 @@ export class MainThreadTestCollection extends AbstractIncrementalTestCollection< * @inheritdoc */ public getReviverDiff() { - const ops: TestsDiff = [[TestDiffOpType.IncrementPendingExtHosts, this.pendingRootCount]]; + const ops: TestsDiff = [{ op: TestDiffOpType.IncrementPendingExtHosts, amount: this.pendingRootCount }]; const queue = [this.rootIds]; while (queue.length) { for (const child of queue.pop()!) { const item = this.items.get(child)!; - ops.push([TestDiffOpType.Add, { - controllerId: item.controllerId, - expand: item.expand, - item: item.item, - parent: item.parent, - }]); + ops.push({ + op: TestDiffOpType.Add, item: { + controllerId: item.controllerId, + expand: item.expand, + item: item.item, + parent: item.parent, + } + }); queue.push(item.children); } } @@ -122,7 +124,7 @@ export class MainThreadTestCollection extends AbstractIncrementalTestCollection< public clear() { const ops: TestsDiff = []; for (const root of this.roots) { - ops.push([TestDiffOpType.Remove, root.item.extId]); + ops.push({ op: TestDiffOpType.Remove, itemId: root.item.extId }); } this.roots.clear(); diff --git a/src/vs/workbench/contrib/testing/common/ownedTestCollection.ts b/src/vs/workbench/contrib/testing/common/ownedTestCollection.ts index 47ce59727e8..c3409f6ba9e 100644 --- a/src/vs/workbench/contrib/testing/common/ownedTestCollection.ts +++ b/src/vs/workbench/contrib/testing/common/ownedTestCollection.ts @@ -8,10 +8,13 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { assertNever } from 'vs/base/common/types'; +// eslint-disable-next-line code-import-patterns import { diffTestItems, ExtHostTestItemEvent, ExtHostTestItemEventOp, getPrivateApiFor, TestItemImpl, TestItemRootImpl } from 'vs/workbench/api/common/extHostTestingPrivateApi'; +// eslint-disable-next-line code-import-patterns import * as Convert from 'vs/workbench/api/common/extHostTypeConverters'; -import { applyTestItemUpdate, ITestTag, TestDiffOpType, TestItemExpandState, TestsDiff, TestsDiffOp } from 'vs/workbench/contrib/testing/common/testCollection'; +import { applyTestItemUpdate, ITestTag, namespaceTestTag, TestDiffOpType, TestItemExpandState, TestsDiff, TestsDiffOp } from 'vs/workbench/contrib/testing/common/testCollection'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; +import * as editorRange from 'vs/editor/common/core/range'; type TestItemRaw = Convert.TestItem.Raw; @@ -46,7 +49,7 @@ export class SingleUseTestCollection extends Disposable { public readonly root = new TestItemRootImpl(this.controllerId, this.controllerId); public readonly tree = new Map(); - private readonly tags = new Map(); + private readonly tags = new Map(); protected diff: TestsDiff = []; @@ -86,14 +89,14 @@ export class SingleUseTestCollection extends Disposable { public pushDiff(diff: TestsDiffOp) { // Try to merge updates, since they're invoked per-property const last = this.diff[this.diff.length - 1]; - if (last && diff[0] === TestDiffOpType.Update) { - if (last[0] === TestDiffOpType.Update && last[1].extId === diff[1].extId) { - applyTestItemUpdate(last[1], diff[1]); + if (last && diff.op === TestDiffOpType.Update) { + if (last.op === TestDiffOpType.Update && last.item.extId === diff.item.extId) { + applyTestItemUpdate(last.item, diff.item); return; } - if (last[0] === TestDiffOpType.Add && last[1].item.extId === diff[1].extId) { - applyTestItemUpdate(last[1], diff[1]); + if (last.op === TestDiffOpType.Add && last.item.item.extId === diff.item.extId) { + applyTestItemUpdate(last.item, diff.item); return; } } @@ -147,7 +150,7 @@ export class SingleUseTestCollection extends Disposable { private onTestItemEvent(internal: OwnedCollectionTestItem, evt: ExtHostTestItemEvent) { switch (evt.op) { case ExtHostTestItemEventOp.Invalidated: - this.pushDiff([TestDiffOpType.Retire, internal.fullId.toString()]); + this.pushDiff({ op: TestDiffOpType.Retire, itemId: internal.fullId.toString() }); break; case ExtHostTestItemEventOp.RemoveChild: @@ -175,13 +178,16 @@ export class SingleUseTestCollection extends Disposable { this.diffTagRefs(value, previous, extId); break; case 'range': - this.pushDiff([TestDiffOpType.Update, { extId, item: { range: Convert.Range.from(value) }, }]); + this.pushDiff({ + op: TestDiffOpType.Update, + item: { extId, item: { range: editorRange.Range.lift(Convert.Range.from(value)) } }, + }); break; case 'error': - this.pushDiff([TestDiffOpType.Update, { extId, item: { error: Convert.MarkdownString.fromStrict(value) || null }, }]); + this.pushDiff({ op: TestDiffOpType.Update, item: { extId, item: { error: Convert.MarkdownString.fromStrict(value) || null }, } }); break; default: - this.pushDiff([TestDiffOpType.Update, { extId, item: { [key]: value ?? null } }]); + this.pushDiff({ op: TestDiffOpType.Update, item: { extId, item: { [key]: value ?? null } } }); break; } break; @@ -219,15 +225,15 @@ export class SingleUseTestCollection extends Disposable { actual.tags.forEach(this.incrementTagRefs, this); this.tree.set(internal.fullId.toString(), internal); this.setItemParent(actual, parent); - this.pushDiff([ - TestDiffOpType.Add, - { + this.pushDiff({ + op: TestDiffOpType.Add, + item: { parent: internal.parent && internal.parent.toString(), controllerId: this.controllerId, expand: internal.expand, item: Convert.TestItem.from(actual), }, - ]); + }); this.connectItemAndChildren(actual, internal, parent); return; @@ -269,10 +275,10 @@ export class SingleUseTestCollection extends Disposable { } } - this.pushDiff([ - TestDiffOpType.Update, - { extId, item: { tags: newTags.map(v => Convert.TestTag.namespace(this.controllerId, v.id)) } }] - ); + this.pushDiff({ + op: TestDiffOpType.Update, + item: { extId, item: { tags: newTags.map(v => Convert.TestTag.namespace(this.controllerId, v.id)) } } + }); toDelete.forEach(this.decrementTagRefs, this); } @@ -283,10 +289,12 @@ export class SingleUseTestCollection extends Disposable { existing.refCount++; } else { this.tags.set(tag.id, { refCount: 1 }); - this.pushDiff([TestDiffOpType.AddTag, { - id: Convert.TestTag.namespace(this.controllerId, tag.id), - ctrlLabel: this.root.label, - }]); + this.pushDiff({ + op: TestDiffOpType.AddTag, tag: { + id: Convert.TestTag.namespace(this.controllerId, tag.id), + ctrlLabel: this.root.label, + } + }); } } @@ -294,7 +302,7 @@ export class SingleUseTestCollection extends Disposable { const existing = this.tags.get(tagId); if (existing && !--existing.refCount) { this.tags.delete(tagId); - this.pushDiff([TestDiffOpType.RemoveTag, Convert.TestTag.namespace(this.controllerId, tagId)]); + this.pushDiff({ op: TestDiffOpType.RemoveTag, id: namespaceTestTag(this.controllerId, tagId) }); } } @@ -343,7 +351,7 @@ export class SingleUseTestCollection extends Disposable { } internal.expand = newState; - this.pushDiff([TestDiffOpType.Update, { extId: internal.fullId.toString(), expand: newState }]); + this.pushDiff({ op: TestDiffOpType.Update, item: { extId: internal.fullId.toString(), expand: newState } }); if (newState === TestItemExpandState.Expandable && internal.expandLevels !== undefined) { this.resolveChildren(internal); @@ -419,7 +427,7 @@ export class SingleUseTestCollection extends Disposable { } private pushExpandStateUpdate(internal: OwnedCollectionTestItem) { - this.pushDiff([TestDiffOpType.Update, { extId: internal.fullId.toString(), expand: internal.expand }]); + this.pushDiff({ op: TestDiffOpType.Update, item: { extId: internal.fullId.toString(), expand: internal.expand } }); } private removeItem(childId: string) { @@ -428,7 +436,7 @@ export class SingleUseTestCollection extends Disposable { throw new Error('attempting to remove non-existent child'); } - this.pushDiff([TestDiffOpType.Remove, childId]); + this.pushDiff({ op: TestDiffOpType.Remove, itemId: childId }); const queue: (OwnedCollectionTestItem | undefined)[] = [childItem]; while (queue.length) { diff --git a/src/vs/workbench/contrib/testing/common/testCollection.ts b/src/vs/workbench/contrib/testing/common/testCollection.ts index 9646aefa17a..8e3ccf0d9a3 100644 --- a/src/vs/workbench/contrib/testing/common/testCollection.ts +++ b/src/vs/workbench/contrib/testing/common/testCollection.ts @@ -5,10 +5,9 @@ import { IMarkdownString } from 'vs/base/common/htmlContent'; import { MarshalledId } from 'vs/base/common/marshalling'; -import { URI } from 'vs/base/common/uri'; +import { URI, UriComponents } from 'vs/base/common/uri'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; -import { ILocationDto } from 'vs/workbench/api/common/extHost.protocol'; export const enum TestResultState { Unset = 0, @@ -61,9 +60,11 @@ export interface ResolvedTestRunRequest { controllerId: string; profileGroup: TestRunProfileBitset; profileId: number; - }[] + }[]; exclude?: string[]; isAutoRun?: boolean; + /** Whether this was trigged by a user action in UI. Default=true */ + isUiTriggered?: boolean; } /** @@ -74,7 +75,7 @@ export interface ExtensionRunTestsRequest { include: string[]; exclude: string[]; controllerId: string; - profile?: { group: TestRunProfileBitset, id: number }; + profile?: { group: TestRunProfileBitset; id: number }; persist: boolean; } @@ -97,6 +98,23 @@ export interface IRichLocation { uri: URI; } +export namespace IRichLocation { + export interface Serialize { + range: IRange; + uri: UriComponents; + } + + export const serialize = (location: IRichLocation): Serialize => ({ + range: location.range.toJSON(), + uri: location.uri.toJSON(), + }); + + export const deserialize = (location: Serialize): IRichLocation => ({ + range: Range.lift(location.range), + uri: URI.revive(location.uri), + }); +} + export const enum TestMessageType { Error, Info @@ -110,7 +128,31 @@ export interface ITestErrorMessage { location: IRichLocation | undefined; } -export type SerializedTestErrorMessage = Omit & { location?: ILocationDto }; +export namespace ITestErrorMessage { + export interface Serialized { + message: string | IMarkdownString; + type: TestMessageType.Error; + expected: string | undefined; + actual: string | undefined; + location: IRichLocation.Serialize | undefined; + } + + export const serialize = (message: ITestErrorMessage): Serialized => ({ + message: message.message, + type: TestMessageType.Error, + expected: message.expected, + actual: message.actual, + location: message.location && IRichLocation.serialize(message.location), + }); + + export const deserialize = (message: Serialized): ITestErrorMessage => ({ + message: message.message, + type: TestMessageType.Error, + expected: message.expected, + actual: message.actual, + location: message.location && IRichLocation.deserialize(message.location), + }); +} export interface ITestOutputMessage { message: string; @@ -119,18 +161,67 @@ export interface ITestOutputMessage { location: IRichLocation | undefined; } -export type SerializedTestOutputMessage = Omit & { location?: ILocationDto }; +export namespace ITestOutputMessage { + export interface Serialized { + message: string; + offset: number; + type: TestMessageType.Info; + location: IRichLocation.Serialize | undefined; + } -export type SerializedTestMessage = SerializedTestErrorMessage | SerializedTestOutputMessage; + export const serialize = (message: ITestOutputMessage): Serialized => ({ + message: message.message, + type: TestMessageType.Info, + offset: message.offset, + location: message.location && IRichLocation.serialize(message.location), + }); + + export const deserialize = (message: Serialized): ITestOutputMessage => ({ + message: message.message, + type: TestMessageType.Info, + offset: message.offset, + location: message.location && IRichLocation.deserialize(message.location), + }); +} export type ITestMessage = ITestErrorMessage | ITestOutputMessage; +export namespace ITestMessage { + export type Serialized = ITestErrorMessage.Serialized | ITestOutputMessage.Serialized; + + export const serialize = (message: ITestMessage): Serialized => + message.type === TestMessageType.Error ? ITestErrorMessage.serialize(message) : ITestOutputMessage.serialize(message); + + export const deserialize = (message: Serialized): ITestMessage => + message.type === TestMessageType.Error ? ITestErrorMessage.deserialize(message) : ITestOutputMessage.deserialize(message); +} + export interface ITestTaskState { state: TestResultState; duration: number | undefined; messages: ITestMessage[]; } +export namespace ITestTaskState { + export interface Serialized { + state: TestResultState; + duration: number | undefined; + messages: ITestMessage.Serialized[]; + } + + export const serialize = (state: ITestTaskState): Serialized => ({ + state: state.state, + duration: state.duration, + messages: state.messages.map(ITestMessage.serialize), + }); + + export const deserialize = (state: Serialized): ITestTaskState => ({ + state: state.state, + duration: state.duration, + messages: state.messages.map(ITestMessage.deserialize), + }); +} + export interface ITestRunTask { id: string; name: string | undefined; @@ -141,6 +232,16 @@ export interface ITestTag { id: string; } +const testTagDelimiter = '\0'; + +export const namespaceTestTag = + (ctrlId: string, tagId: string) => ctrlId + testTagDelimiter + tagId; + +export const denamespaceTestTag = (namespaced: string) => { + const index = namespaced.indexOf(testTagDelimiter); + return { ctrlId: namespaced.slice(0, index), tagId: namespaced.slice(index + 1) }; +}; + export interface ITestTagDisplayInfo { id: string; ctrlLabel: string; @@ -154,12 +255,54 @@ export interface ITestItem { extId: string; label: string; tags: string[]; - busy?: boolean; + busy: boolean; children?: never; - uri?: URI; - range: IRange | null; + uri: URI | undefined; + range: Range | null; description: string | null; error: string | IMarkdownString | null; + sortText: string | null; +} + +export namespace ITestItem { + export interface Serialized { + extId: string; + label: string; + tags: string[]; + busy: boolean; + children?: never; + uri: UriComponents | undefined; + range: IRange | null; + description: string | null; + error: string | IMarkdownString | null; + sortText: string | null; + } + + export const serialize = (item: ITestItem): Serialized => ({ + extId: item.extId, + label: item.label, + tags: item.tags, + busy: item.busy, + children: undefined, + uri: item.uri?.toJSON(), + range: item.range?.toJSON() || null, + description: item.description, + error: item.error, + sortText: item.sortText + }); + + export const deserialize = (serialized: Serialized): ITestItem => ({ + extId: serialized.extId, + label: serialized.label, + tags: serialized.tags, + busy: serialized.busy, + children: undefined, + uri: serialized.uri ? URI.revive(serialized.uri) : undefined, + range: serialized.range ? Range.lift(serialized.range) : null, + description: serialized.description, + error: serialized.error, + sortText: serialized.sortText + }); } export const enum TestItemExpandState { @@ -183,6 +326,29 @@ export interface InternalTestItem { item: ITestItem; } +export namespace InternalTestItem { + export interface Serialized { + controllerId: string; + expand: TestItemExpandState; + parent: string | null; + item: ITestItem.Serialized; + } + + export const serialize = (item: InternalTestItem): Serialized => ({ + controllerId: item.controllerId, + expand: item.expand, + parent: item.parent, + item: ITestItem.serialize(item.item) + }); + + export const deserialize = (serialized: Serialized): InternalTestItem => ({ + controllerId: serialized.controllerId, + expand: serialized.expand, + parent: serialized.parent, + item: ITestItem.deserialize(serialized.item) + }); +} + /** * A partial update made to an existing InternalTestItem. */ @@ -192,6 +358,48 @@ export interface ITestItemUpdate { item?: Partial; } +export namespace ITestItemUpdate { + export interface Serialized { + extId: string; + expand?: TestItemExpandState; + item?: Partial; + } + + export const serialize = (u: ITestItemUpdate): Serialized => { + let item: Partial | undefined; + if (u.item) { + item = {}; + if (u.item.label !== undefined) { item.label = u.item.label; } + if (u.item.tags !== undefined) { item.tags = u.item.tags; } + if (u.item.busy !== undefined) { item.busy = u.item.busy; } + if (u.item.uri !== undefined) { item.uri = u.item.uri?.toJSON(); } + if (u.item.range !== undefined) { item.range = u.item.range?.toJSON(); } + if (u.item.description !== undefined) { item.description = u.item.description; } + if (u.item.error !== undefined) { item.error = u.item.error; } + if (u.item.sortText !== undefined) { item.sortText = u.item.sortText; } + } + + return { extId: u.extId, expand: u.expand, item }; + }; + + export const deserialize = (u: Serialized): ITestItemUpdate => { + let item: Partial | undefined; + if (u.item) { + item = {}; + if (u.item.label !== undefined) { item.label = u.item.label; } + if (u.item.tags !== undefined) { item.tags = u.item.tags; } + if (u.item.busy !== undefined) { item.busy = u.item.busy; } + if (u.item.range !== undefined) { item.range = u.item.range ? Range.lift(u.item.range) : null; } + if (u.item.description !== undefined) { item.description = u.item.description; } + if (u.item.error !== undefined) { item.error = u.item.error; } + if (u.item.sortText !== undefined) { item.sortText = u.item.sortText; } + } + + return { extId: u.extId, expand: u.expand, item }; + }; + +} + export const applyTestItemUpdate = (internal: InternalTestItem | ITestItemUpdate, patch: ITestItemUpdate) => { if (patch.expand !== undefined) { internal.expand = patch.expand; @@ -217,21 +425,33 @@ export interface TestResultItem extends InternalTestItem { ownDuration?: number; } -export type SerializedTestResultItem = Omit - & { children: string[], retired: undefined }; +export namespace TestResultItem { + /** Serialized version of the TestResultItem */ + export interface Serialized extends InternalTestItem.Serialized { + children: string[]; + tasks: ITestTaskState.Serialized[]; + ownComputedState: TestResultState; + computedState: TestResultState; + } + + export const serialize = (original: TestResultItem, children: string[]): Serialized => ({ + ...InternalTestItem.serialize(original), + children, + ownComputedState: original.ownComputedState, + computedState: original.computedState, + tasks: original.tasks.map(ITestTaskState.serialize), + }); +} -/** - * Test results serialized for transport and storage. - */ export interface ISerializedTestResults { /** ID of these test results */ id: string; /** Time the results were compelted */ completedAt: number; /** Subset of test result items */ - items: SerializedTestResultItem[]; + items: TestResultItem.Serialized[]; /** Tasks involved in the run. */ - tasks: { id: string; name: string | undefined; messages: ITestOutputMessage[] }[]; + tasks: { id: string; name: string | undefined; messages: ITestOutputMessage.Serialized[] }[]; /** Human-readable name of the test run. */ name: string; /** Test trigger informaton */ @@ -298,13 +518,44 @@ export const enum TestDiffOpType { } export type TestsDiffOp = - | [op: TestDiffOpType.Add, item: InternalTestItem] - | [op: TestDiffOpType.Update, item: ITestItemUpdate] - | [op: TestDiffOpType.Remove, itemId: string] - | [op: TestDiffOpType.Retire, itemId: string] - | [op: TestDiffOpType.IncrementPendingExtHosts, amount: number] - | [op: TestDiffOpType.AddTag, tag: ITestTagDisplayInfo] - | [op: TestDiffOpType.RemoveTag, id: string]; + | { op: TestDiffOpType.Add; item: InternalTestItem } + | { op: TestDiffOpType.Update; item: ITestItemUpdate } + | { op: TestDiffOpType.Remove; itemId: string } + | { op: TestDiffOpType.Retire; itemId: string } + | { op: TestDiffOpType.IncrementPendingExtHosts; amount: number } + | { op: TestDiffOpType.AddTag; tag: ITestTagDisplayInfo } + | { op: TestDiffOpType.RemoveTag; id: string }; + +export namespace TestsDiffOp { + export type Serialized = + | { op: TestDiffOpType.Add; item: InternalTestItem.Serialized } + | { op: TestDiffOpType.Update; item: ITestItemUpdate.Serialized } + | { op: TestDiffOpType.Remove; itemId: string } + | { op: TestDiffOpType.Retire; itemId: string } + | { op: TestDiffOpType.IncrementPendingExtHosts; amount: number } + | { op: TestDiffOpType.AddTag; tag: ITestTagDisplayInfo } + | { op: TestDiffOpType.RemoveTag; id: string }; + + export const deserialize = (u: Serialized): TestsDiffOp => { + if (u.op === TestDiffOpType.Add) { + return { op: u.op, item: InternalTestItem.deserialize(u.item) }; + } else if (u.op === TestDiffOpType.Update) { + return { op: u.op, item: ITestItemUpdate.deserialize(u.item) }; + } else { + return u; + } + }; + + export const serialize = (u: TestsDiffOp): Serialized => { + if (u.op === TestDiffOpType.Add) { + return { op: u.op, item: InternalTestItem.serialize(u.item) }; + } else if (u.op === TestDiffOpType.Update) { + return { op: u.op, item: ITestItemUpdate.serialize(u.item) }; + } else { + return u; + } + }; +} /** * Context for actions taken in the test explorer view. @@ -396,9 +647,9 @@ export abstract class AbstractIncrementalTestCollection[] = [[op[1]]]; + const queue: Iterable[] = [[op.itemId]]; while (queue.length) { for (const itemId of queue.pop()!) { const existing = this.items.get(itemId); @@ -471,19 +722,19 @@ export abstract class AbstractIncrementalTestCollection Promise, - resolveFileCoverage: (fileIndex: number, token: CancellationToken) => Promise, + provideFileCoverage: (token: CancellationToken) => Promise; + resolveFileCoverage: (fileIndex: number, token: CancellationToken) => Promise; } /** diff --git a/src/vs/workbench/contrib/testing/common/testExplorerFilterState.ts b/src/vs/workbench/contrib/testing/common/testExplorerFilterState.ts index bff4bd12c71..2f5f78039ca 100644 --- a/src/vs/workbench/contrib/testing/common/testExplorerFilterState.ts +++ b/src/vs/workbench/contrib/testing/common/testExplorerFilterState.ts @@ -5,8 +5,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import { splitGlobAware } from 'vs/base/common/glob'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { TestTag } from 'vs/workbench/api/common/extHostTypeConverters'; import { IObservableValue, MutableObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; +import { namespaceTestTag } from 'vs/workbench/contrib/testing/common/testCollection'; export interface ITestExplorerFilterState { _serviceBrand: undefined; @@ -134,9 +134,9 @@ export class TestExplorerFilterState implements ITestExplorerFilterState { } if (match[0].startsWith('!')) { - this.excludeTags.add(TestTag.namespace(match[1], tagId)); + this.excludeTags.add(namespaceTestTag(match[1], tagId)); } else { - this.includeTags.add(TestTag.namespace(match[1], tagId)); + this.includeTags.add(namespaceTestTag(match[1], tagId)); } nextIndex++; } diff --git a/src/vs/workbench/contrib/testing/common/testProfileService.ts b/src/vs/workbench/contrib/testing/common/testProfileService.ts index 24b026dddcb..7c83d34d371 100644 --- a/src/vs/workbench/contrib/testing/common/testProfileService.ts +++ b/src/vs/workbench/contrib/testing/common/testProfileService.ts @@ -56,8 +56,8 @@ export interface ITestProfileService { * Gets all registered controllers, grouping by controller. */ all(): Iterable>; /** @@ -106,8 +106,8 @@ export class TestProfileService implements ITestProfileService { private readonly capabilitiesContexts: { [K in TestRunProfileBitset]: IContextKey }; private readonly changeEmitter = new Emitter(); private readonly controllerProfiles = new Map(); /** @inheritdoc */ diff --git a/src/vs/workbench/contrib/testing/common/testResult.ts b/src/vs/workbench/contrib/testing/common/testResult.ts index 88035efaa4f..62e28c47395 100644 --- a/src/vs/workbench/contrib/testing/common/testResult.ts +++ b/src/vs/workbench/contrib/testing/common/testResult.ts @@ -242,7 +242,7 @@ export const enum TestResultItemChangeReason { export type TestResultItemChange = { item: TestResultItem; result: ITestResult } & ( | { reason: TestResultItemChangeReason.Retired | TestResultItemChangeReason.ParentRetired | TestResultItemChangeReason.ComputedStateChange } - | { reason: TestResultItemChangeReason.OwnStateChange; previous: TestResultState } + | { reason: TestResultItemChangeReason.OwnStateChange; previousState: TestResultState; previousOwnDuration: number | undefined } ); /** @@ -379,12 +379,7 @@ export class LiveTestResult implements ITestResult { } const index = this.mustGetTaskIndex(taskId); - if (duration !== undefined) { - entry.tasks[index].duration = duration; - entry.ownDuration = Math.max(entry.ownDuration || 0, duration); - } - - this.fireUpdateAndRefresh(entry, index, state); + this.fireUpdateAndRefresh(entry, index, state, duration); } /** @@ -401,7 +396,8 @@ export class LiveTestResult implements ITestResult { item: entry, result: this, reason: TestResultItemChangeReason.OwnStateChange, - previous: entry.ownComputedState, + previousState: entry.ownComputedState, + previousOwnDuration: entry.ownDuration, }); } @@ -488,11 +484,28 @@ export class LiveTestResult implements ITestResult { } } - private fireUpdateAndRefresh(entry: TestResultItem, taskIndex: number, newState: TestResultState) { + private fireUpdateAndRefresh(entry: TestResultItem, taskIndex: number, newState: TestResultState, newOwnDuration?: number) { const previousOwnComputed = entry.ownComputedState; + const previousOwnDuration = entry.ownDuration; + const changeEvent: TestResultItemChange = { + item: entry, + result: this, + reason: TestResultItemChangeReason.OwnStateChange, + previousState: previousOwnComputed, + previousOwnDuration: previousOwnDuration, + }; + entry.tasks[taskIndex].state = newState; + if (newOwnDuration !== undefined) { + entry.tasks[taskIndex].duration = newOwnDuration; + entry.ownDuration = Math.max(entry.ownDuration || 0, newOwnDuration); + } + const newOwnComputed = maxPriority(...entry.tasks.map(t => t.state)); if (newOwnComputed === previousOwnComputed) { + if (newOwnDuration !== previousOwnDuration) { + this.changeEmitter.fire(changeEvent); // fire manually since state change won't do it + } return; } @@ -500,11 +513,11 @@ export class LiveTestResult implements ITestResult { this.counts[previousOwnComputed]--; this.counts[newOwnComputed]++; refreshComputedState(this.computedStateAccessor, entry).forEach(t => - this.changeEmitter.fire( - t === entry - ? { item: entry, result: this, reason: TestResultItemChangeReason.OwnStateChange, previous: previousOwnComputed } - : { item: t, result: this, reason: TestResultItemChangeReason.ComputedStateChange } - ), + this.changeEmitter.fire(t === entry ? changeEvent : { + item: t, + result: this, + reason: TestResultItemChangeReason.ComputedStateChange, + }), ); } @@ -541,12 +554,7 @@ export class LiveTestResult implements ITestResult { tasks: this.tasks.map(t => ({ id: t.id, name: t.name, messages: t.otherMessages })), name: this.name, request: this.request, - items: [...this.testById.values()].map(entry => ({ - ...entry, - retired: undefined, - src: undefined, - children: [...entry.children.map(c => c.item.extId)], - })), + items: [...this.testById.values()].map(e => TestResultItem.serialize(e, [...e.children.map(c => c.item.extId)])), })); } @@ -619,7 +627,7 @@ export class HydratedTestResult implements ITestResult { this.request = serialized.request; for (const item of serialized.items) { - const cast: TestResultItem = { ...item, retired: true }; + const cast: TestResultItem = { ...item, retired: true } as any; cast.item.uri = URI.revive(cast.item.uri); for (const task of cast.tasks) { diff --git a/src/vs/workbench/contrib/testing/common/testResultService.ts b/src/vs/workbench/contrib/testing/common/testResultService.ts index cd834ed1c91..061f3694be8 100644 --- a/src/vs/workbench/contrib/testing/common/testResultService.ts +++ b/src/vs/workbench/contrib/testing/common/testResultService.ts @@ -152,6 +152,7 @@ export class TestResultService implements ITestResultService { } const resolved: ResolvedTestRunRequest = { + isUiTriggered: false, targets: [], exclude: req.exclude, isAutoRun: false, diff --git a/src/vs/workbench/contrib/testing/common/testResultStorage.ts b/src/vs/workbench/contrib/testing/common/testResultStorage.ts index 0f0c4953635..6c272186949 100644 --- a/src/vs/workbench/contrib/testing/common/testResultStorage.ts +++ b/src/vs/workbench/contrib/testing/common/testResultStorage.ts @@ -53,7 +53,7 @@ const currentRevision = 1; export abstract class BaseTestResultStorage implements ITestResultStorage { declare readonly _serviceBrand: undefined; - protected readonly stored = new StoredValue>({ + protected readonly stored = new StoredValue>({ key: 'storedTestResults', scope: StorageScope.WORKSPACE, target: StorageTarget.MACHINE @@ -118,7 +118,7 @@ export abstract class BaseTestResultStorage implements ITestResultStorage { */ public async persist(results: ReadonlyArray): Promise { const toDelete = new Map(this.stored.get([]).map(({ id, bytes }) => [id, bytes])); - const toStore: { rev: number, id: string; bytes: number }[] = []; + const toStore: { rev: number; id: string; bytes: number }[] = []; const todo: Promise[] = []; let budget = RETAIN_MAX_BYTES; diff --git a/src/vs/workbench/contrib/testing/common/testService.ts b/src/vs/workbench/contrib/testing/common/testService.ts index 981b4f7814e..73ee2a591bf 100644 --- a/src/vs/workbench/contrib/testing/common/testService.ts +++ b/src/vs/workbench/contrib/testing/common/testService.ts @@ -5,12 +5,12 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; -import * as extpath from 'vs/base/common/extpath'; import { Iterable } from 'vs/base/common/iterator'; import { IDisposable } from 'vs/base/common/lifecycle'; import { MarshalledId } from 'vs/base/common/marshalling'; import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IObservableValue, MutableObservableValue } from 'vs/workbench/contrib/testing/common/observableValue'; import { AbstractIncrementalTestCollection, IncrementalTestCollectionItem, InternalTestItem, ITestItemContext, ResolvedTestRunRequest, RunTestForControllerRequest, TestItemExpandState, TestRunProfileBitset, TestsDiff } from 'vs/workbench/contrib/testing/common/testCollection'; import { TestExclusions } from 'vs/workbench/contrib/testing/common/testExclusions'; @@ -162,19 +162,17 @@ export const getAllTestsInHierarchy = async (collection: IMainThreadTestCollecti * Iterator that expands to and iterates through tests in the file. Iterates * in strictly descending order. */ -export const testsInFile = async function* (collection: IMainThreadTestCollection, uri: URI): AsyncIterable { - const demandFsPath = uri.fsPath; +export const testsInFile = async function* (collection: IMainThreadTestCollection, ident: IUriIdentityService, uri: URI): AsyncIterable { for (const test of collection.all) { if (!test.item.uri) { continue; } - const itemFsPath = test.item.uri.fsPath; - if (itemFsPath === demandFsPath) { + if (ident.extUri.isEqual(uri, test.item.uri)) { yield test; } - if (extpath.isEqualOrParent(demandFsPath, itemFsPath) && test.expand === TestItemExpandState.Expandable) { + if (ident.extUri.isEqualOrParent(uri, test.item.uri) && test.expand === TestItemExpandState.Expandable) { await collection.expand(test.item.extId, 1); } } @@ -209,7 +207,7 @@ export interface ITestService { * Fires when the user requests to cancel a test run -- or all runs, if no * runId is given. */ - readonly onDidCancelTestRun: Event<{ runId: string | undefined; }>; + readonly onDidCancelTestRun: Event<{ runId: string | undefined }>; /** * Event that fires when the excluded tests change. diff --git a/src/vs/workbench/contrib/testing/common/testServiceImpl.ts b/src/vs/workbench/contrib/testing/common/testServiceImpl.ts index e6ed77584ab..083d40f7801 100644 --- a/src/vs/workbench/contrib/testing/common/testServiceImpl.ts +++ b/src/vs/workbench/contrib/testing/common/testServiceImpl.ts @@ -25,6 +25,9 @@ import { canUseProfileWithTest, ITestProfileService } from 'vs/workbench/contrib import { ITestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; import { AmbiguousRunTestsRequest, IMainThreadTestController, ITestService } from 'vs/workbench/contrib/testing/common/testService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { getTestingConfiguration, TestingConfigKeys } from 'vs/workbench/contrib/testing/common/configuration'; export class TestService extends Disposable implements ITestService { declare readonly _serviceBrand: undefined; @@ -81,8 +84,10 @@ export class TestService extends Disposable implements ITestService { @IContextKeyService contextKeyService: IContextKeyService, @IInstantiationService instantiationService: IInstantiationService, @IStorageService private readonly storage: IStorageService, + @IEditorService private readonly editorService: IEditorService, @ITestProfileService private readonly testProfiles: ITestProfileService, @INotificationService private readonly notificationService: INotificationService, + @IConfigurationService private readonly configurationService: IConfigurationService, @ITestResultService private readonly testResults: ITestResultService, @IWorkspaceTrustRequestService private readonly workspaceTrustRequestService: IWorkspaceTrustRequestService, ) { @@ -203,7 +208,7 @@ export class TestService extends Disposable implements ITestService { this.notificationService.error(localize('testError', 'An error occurred attempting to run tests: {0}', err.message)); }) ); - + await this.saveAllBeforeTest(req); await Promise.all(requests); return result; } finally { @@ -274,7 +279,7 @@ export class TestService extends Disposable implements ITestService { const diff: TestsDiff = []; for (const root of this.collection.rootItems) { if (root.controllerId === id) { - diff.push([TestDiffOpType.Remove, root.item.extId]); + diff.push({ op: TestDiffOpType.Remove, itemId: root.item.extId }); } } @@ -291,6 +296,17 @@ export class TestService extends Disposable implements ITestService { return disposable; } + private async saveAllBeforeTest(req: ResolvedTestRunRequest, configurationService: IConfigurationService = this.configurationService, editorService: IEditorService = this.editorService): Promise { + if (req.isUiTriggered === false) { + return; + } + const saveBeforeTest: boolean = getTestingConfiguration(this.configurationService, TestingConfigKeys.SaveBeforeTest); + if (saveBeforeTest) { + await editorService.saveAll(); + } + return; + } + private updateCanRefresh() { this.canRefreshTests.set(Iterable.some(this.testControllers.values(), t => t.canRefresh.value)); } diff --git a/src/vs/workbench/contrib/testing/common/testingAutoRun.ts b/src/vs/workbench/contrib/testing/common/testingAutoRun.ts index b51c7a7e45a..905b7370f17 100644 --- a/src/vs/workbench/contrib/testing/common/testingAutoRun.ts +++ b/src/vs/workbench/contrib/testing/common/testingAutoRun.ts @@ -122,8 +122,8 @@ export class TestingAutoRun extends Disposable implements ITestingAutoRun { store.add(this.testService.onDidProcessDiff(diff => { for (const entry of diff) { - if (entry[0] === TestDiffOpType.Add) { - const test = entry[1]; + if (entry.op === TestDiffOpType.Add) { + const test = entry.item; const isQueued = Iterable.some( getCollectionItemParents(this.testService.collection, test), t => rerunIds.has(test.item.extId), diff --git a/src/vs/workbench/contrib/testing/common/testingContentProvider.ts b/src/vs/workbench/contrib/testing/common/testingContentProvider.ts index 8997aa22c58..2f64387a111 100644 --- a/src/vs/workbench/contrib/testing/common/testingContentProvider.ts +++ b/src/vs/workbench/contrib/testing/common/testingContentProvider.ts @@ -6,7 +6,7 @@ import { URI } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageSelection, ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageSelection, ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { TestMessageType } from 'vs/workbench/contrib/testing/common/testCollection'; diff --git a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/hierarchalByLocation.test.ts b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/hierarchalByLocation.test.ts index bb7d6ba9ce5..66bf4f2db54 100644 --- a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/hierarchalByLocation.test.ts +++ b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/hierarchalByLocation.test.ts @@ -10,7 +10,7 @@ import { HierarchicalByLocationProjection } from 'vs/workbench/contrib/testing/b import { TestDiffOpType, TestItemExpandState, TestResultItem, TestResultState } from 'vs/workbench/contrib/testing/common/testCollection'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; import { TestResultItemChange, TestResultItemChangeReason } from 'vs/workbench/contrib/testing/common/testResult'; -import { Convert, TestItemImpl } from 'vs/workbench/contrib/testing/common/testStubs'; +import { Convert, TestItemImpl } from 'vs/workbench/contrib/testing/test/common/testStubs'; import { TestTreeTestHarness } from 'vs/workbench/contrib/testing/test/browser/testObjectTree'; class TestHierarchicalByLocationProjection extends HierarchicalByLocationProjection { @@ -53,13 +53,13 @@ suite('Workbench - Testing Explorer Hierarchal by Location Projection', () => { test('updates render if second test provider appears', async () => { harness.flush(); - harness.pushDiff([ - TestDiffOpType.Add, - { controllerId: 'ctrl2', parent: null, expand: TestItemExpandState.Expanded, item: Convert.TestItem.from(new TestItemImpl('ctrl2', 'c', 'c', undefined)) }, - ], [ - TestDiffOpType.Add, - { controllerId: 'ctrl2', parent: new TestId(['ctrl2', 'c']).toString(), expand: TestItemExpandState.NotExpandable, item: Convert.TestItem.from(new TestItemImpl('ctrl2', 'c-a', 'ca', undefined)) }, - ]); + harness.pushDiff({ + op: TestDiffOpType.Add, + item: { controllerId: 'ctrl2', parent: null, expand: TestItemExpandState.Expanded, item: Convert.TestItem.from(new TestItemImpl('ctrl2', 'c', 'c', undefined)) }, + }, { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrl2', parent: new TestId(['ctrl2', 'c']).toString(), expand: TestItemExpandState.NotExpandable, item: Convert.TestItem.from(new TestItemImpl('ctrl2', 'c-a', 'ca', undefined)) }, + }); assert.deepStrictEqual(harness.flush(), [ { e: 'c', children: [{ e: 'ca' }] }, @@ -106,7 +106,17 @@ suite('Workbench - Testing Explorer Hierarchal by Location Projection', () => { resultsService.getStateById = () => [undefined, resultInState(TestResultState.Failed)]; const resultInState = (state: TestResultState): TestResultItem => ({ - item: Convert.TestItem.from(harness.c.tree.get(new TestId(['ctrlId', 'id-a']).toString())!.actual), + item: { + extId: new TestId(['ctrlId', 'id-a']).toString(), + busy: false, + description: null, + error: null, + label: 'a', + range: null, + sortText: null, + tags: [], + uri: undefined, + }, parent: 'id-root', tasks: [], retired: false, @@ -120,8 +130,9 @@ suite('Workbench - Testing Explorer Hierarchal by Location Projection', () => { onTestChanged.fire({ reason: TestResultItemChangeReason.OwnStateChange, result: null as any, - previous: TestResultState.Unset, + previousState: TestResultState.Unset, item: resultInState(TestResultState.Queued), + previousOwnDuration: undefined, }); harness.projection.applyTo(harness.tree); @@ -134,8 +145,9 @@ suite('Workbench - Testing Explorer Hierarchal by Location Projection', () => { onTestChanged.fire({ reason: TestResultItemChangeReason.OwnStateChange, result: null as any, - previous: TestResultState.Queued, + previousState: TestResultState.Queued, item: resultInState(TestResultState.Unset), + previousOwnDuration: undefined, }); harness.projection.applyTo(harness.tree); diff --git a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/hierarchalByName.test.ts b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/hierarchalByName.test.ts index 1caf0ceb114..8e5b439a920 100644 --- a/src/vs/workbench/contrib/testing/test/browser/explorerProjections/hierarchalByName.test.ts +++ b/src/vs/workbench/contrib/testing/test/browser/explorerProjections/hierarchalByName.test.ts @@ -10,7 +10,7 @@ import { HierarchicalByNameProjection } from 'vs/workbench/contrib/testing/brows import { TestDiffOpType, TestItemExpandState } from 'vs/workbench/contrib/testing/common/testCollection'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; import { TestResultItemChange } from 'vs/workbench/contrib/testing/common/testResult'; -import { Convert, TestItemImpl } from 'vs/workbench/contrib/testing/common/testStubs'; +import { Convert, TestItemImpl } from 'vs/workbench/contrib/testing/test/common/testStubs'; import { TestTreeTestHarness } from 'vs/workbench/contrib/testing/test/browser/testObjectTree'; suite('Workbench - Testing Explorer Hierarchal by Name Projection', () => { @@ -42,13 +42,13 @@ suite('Workbench - Testing Explorer Hierarchal by Name Projection', () => { test('updates render if second test provider appears', async () => { harness.flush(); - harness.pushDiff([ - TestDiffOpType.Add, - { controllerId: 'ctrl2', parent: null, expand: TestItemExpandState.Expanded, item: Convert.TestItem.from(new TestItemImpl('ctrl2', 'c', 'root2', undefined)) }, - ], [ - TestDiffOpType.Add, - { controllerId: 'ctrl2', parent: new TestId(['ctrl2', 'c']).toString(), expand: TestItemExpandState.NotExpandable, item: Convert.TestItem.from(new TestItemImpl('ctrl2', 'c-a', 'c', undefined)) }, - ]); + harness.pushDiff({ + op: TestDiffOpType.Add, + item: { controllerId: 'ctrl2', parent: null, expand: TestItemExpandState.Expanded, item: Convert.TestItem.from(new TestItemImpl('ctrl2', 'c', 'root2', undefined)) }, + }, { + op: TestDiffOpType.Add, + item: { controllerId: 'ctrl2', parent: new TestId(['ctrl2', 'c']).toString(), expand: TestItemExpandState.NotExpandable, item: Convert.TestItem.from(new TestItemImpl('ctrl2', 'c-a', 'c', undefined)) }, + }); assert.deepStrictEqual(harness.flush(), [ { e: 'root', children: [{ e: 'aa' }, { e: 'ab' }, { e: 'b' }] }, diff --git a/src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts b/src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts index ed721ca7c3b..d5dd271b36e 100644 --- a/src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts +++ b/src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts @@ -11,9 +11,9 @@ import { ITestTreeProjection, TestExplorerTreeElement, TestItemTreeElement } fro import { MainThreadTestCollection } from 'vs/workbench/contrib/testing/common/mainThreadTestCollection'; import { TestsDiff, TestsDiffOp } from 'vs/workbench/contrib/testing/common/testCollection'; import { ITestService } from 'vs/workbench/contrib/testing/common/testService'; -import { testStubs } from 'vs/workbench/contrib/testing/common/testStubs'; +import { testStubs } from 'vs/workbench/contrib/testing/test/common/testStubs'; -type SerializedTree = { e: string; children?: SerializedTree[], data?: string }; +type SerializedTree = { e: string; children?: SerializedTree[]; data?: string }; const element = document.createElement('div'); element.style.height = '1000px'; diff --git a/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts b/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts index 9828b038882..2f848c8f76e 100644 --- a/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testResultService.test.ts @@ -11,12 +11,12 @@ import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKe import { NullLogService } from 'vs/platform/log/common/log'; import { SingleUseTestCollection } from 'vs/workbench/contrib/testing/common/ownedTestCollection'; import { ITestTaskState, ResolvedTestRunRequest, TestResultItem, TestResultState, TestRunProfileBitset } from 'vs/workbench/contrib/testing/common/testCollection'; -import { TestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; +import { TestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService'; import { HydratedTestResult, LiveOutputController, LiveTestResult, makeEmptyCounts, resultItemParents, TestResultItemChange, TestResultItemChangeReason } from 'vs/workbench/contrib/testing/common/testResult'; import { TestResultService } from 'vs/workbench/contrib/testing/common/testResultService'; import { InMemoryResultStorage, ITestResultStorage } from 'vs/workbench/contrib/testing/common/testResultStorage'; -import { Convert, getInitializedMainTestCollection, TestItemImpl, testStubs } from 'vs/workbench/contrib/testing/common/testStubs'; +import { Convert, getInitializedMainTestCollection, TestItemImpl, testStubs } from 'vs/workbench/contrib/testing/test/common/testStubs'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; export const emptyOutputController = () => new LiveOutputController( @@ -224,7 +224,7 @@ suite('Workbench - Test Results Service', () => { test('serializes and re-hydrates', async () => { results.push(r); - r.updateState(new TestId(['ctrlId', 'id-a', 'id-aa']).toString(), 't', TestResultState.Passed); + r.updateState(new TestId(['ctrlId', 'id-a', 'id-aa']).toString(), 't', TestResultState.Passed, 42); r.markComplete(); await timeout(10); // allow persistImmediately async to happen @@ -240,12 +240,9 @@ suite('Workbench - Test Results Service', () => { const [rehydrated, actual] = results.getStateById(tests.root.id)!; const expected: any = { ...r.getStateById(tests.root.id)! }; - delete expected.tasks[0].duration; // delete undefined props that don't survive serialization - delete expected.item.range; - delete expected.item.description; expected.item.uri = actual.item.uri; - - assert.deepStrictEqual(actual, { ...expected, src: undefined, retired: true, children: [new TestId(['ctrlId', 'id-a']).toString()] }); + expected.item.children = actual.item.children; + assert.deepStrictEqual(actual, { ...expected, retired: true, children: [new TestId(['ctrlId', 'id-a']).toString()] }); assert.deepStrictEqual(rehydrated.counts, r.counts); assert.strictEqual(typeof rehydrated.completedAt, 'number'); }); @@ -292,7 +289,6 @@ suite('Workbench - Test Results Service', () => { tasks: [{ state, duration: 0, messages: [] }], computedState: state, ownComputedState: state, - retired: undefined, children: [], }] }, () => Promise.resolve(bufferToStream(VSBuffer.alloc(0)))); diff --git a/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts b/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts index 85fe8226c05..0fd486588e7 100644 --- a/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts +++ b/src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts @@ -9,7 +9,7 @@ import { NullLogService } from 'vs/platform/log/common/log'; import { TestId } from 'vs/workbench/contrib/testing/common/testId'; import { ITestResult, LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult'; import { InMemoryResultStorage, RETAIN_MAX_RESULTS } from 'vs/workbench/contrib/testing/common/testResultStorage'; -import { Convert, TestItemImpl, testStubs } from 'vs/workbench/contrib/testing/common/testStubs'; +import { Convert, TestItemImpl, testStubs } from 'vs/workbench/contrib/testing/test/common/testStubs'; import { emptyOutputController } from 'vs/workbench/contrib/testing/test/common/testResultService.test'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; diff --git a/src/vs/workbench/contrib/testing/common/testStubs.ts b/src/vs/workbench/contrib/testing/test/common/testStubs.ts similarity index 92% rename from src/vs/workbench/contrib/testing/common/testStubs.ts rename to src/vs/workbench/contrib/testing/test/common/testStubs.ts index d22093d2091..9ef3d39af94 100644 --- a/src/vs/workbench/contrib/testing/common/testStubs.ts +++ b/src/vs/workbench/contrib/testing/test/common/testStubs.ts @@ -4,11 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; +// eslint-disable-next-line code-import-patterns import { TestItemImpl } from 'vs/workbench/api/common/extHostTestingPrivateApi'; import { MainThreadTestCollection } from 'vs/workbench/contrib/testing/common/mainThreadTestCollection'; import { TestSingleUseCollection } from 'vs/workbench/contrib/testing/test/common/ownedTestCollection'; +// eslint-disable-next-line code-import-patterns export * as Convert from 'vs/workbench/api/common/extHostTypeConverters'; +// eslint-disable-next-line code-import-patterns export { TestItemImpl } from 'vs/workbench/api/common/extHostTestingPrivateApi'; /** diff --git a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts index f695cd85c89..a4ba03fa7f2 100644 --- a/src/vs/workbench/contrib/themes/browser/themes.contribution.ts +++ b/src/vs/workbench/contrib/themes/browser/themes.contribution.ts @@ -347,7 +347,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: SelectColorThemeCommandId, - title: localize('selectTheme.label', "Color Theme"), + title: { value: localize('selectTheme.label', "Color Theme"), original: 'Color Theme' }, category: CATEGORIES.Preferences, f1: true, keybinding: { @@ -389,7 +389,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: SelectFileIconThemeCommandId, - title: localize('selectIconTheme.label', "File Icon Theme"), + title: { value: localize('selectIconTheme.label', "File Icon Theme"), original: 'File Icon Theme' }, category: CATEGORIES.Preferences, f1: true }); @@ -424,7 +424,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: SelectProductIconThemeCommandId, - title: localize('selectProductIconTheme.label', "Product Icon Theme"), + title: { value: localize('selectProductIconTheme.label', "Product Icon Theme"), original: 'Product Icon Theme' }, category: CATEGORIES.Preferences, f1: true }); @@ -453,7 +453,7 @@ registerAction2(class extends Action2 { } }); -CommandsRegistry.registerCommand('workbench.action.previewColorTheme', async function (accessor: ServicesAccessor, extension: { publisher: string, name: string, version: string; }, themeSettingsId?: string) { +CommandsRegistry.registerCommand('workbench.action.previewColorTheme', async function (accessor: ServicesAccessor, extension: { publisher: string; name: string; version: string }, themeSettingsId?: string) { const themeService = accessor.get(IWorkbenchThemeService); const themes = await themeService.getMarketplaceColorThemes(extension.publisher, extension.name, extension.version); @@ -528,7 +528,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: 'workbench.action.generateColorTheme', - title: localize('generateColorTheme.label', "Generate Color Theme From Current Settings"), + title: { value: localize('generateColorTheme.label', "Generate Color Theme From Current Settings"), original: 'Generate Color Theme From Current Settings' }, category: CATEGORIES.Developer, f1: true }); @@ -540,7 +540,7 @@ registerAction2(class extends Action2 { const theme = themeService.getColorTheme(); const colors = Registry.as(ColorRegistryExtensions.ColorContribution).getColors(); const colorIds = colors.map(c => c.id).sort(); - const resultingColors: { [key: string]: string | null; } = {}; + const resultingColors: { [key: string]: string | null } = {}; const inherited: string[] = []; for (const colorId of colorIds) { const color = theme.getColor(colorId, false); diff --git a/src/vs/workbench/contrib/themes/browser/themes.test.contribution.ts b/src/vs/workbench/contrib/themes/browser/themes.test.contribution.ts index daa6f698e52..2fbc546da95 100644 --- a/src/vs/workbench/contrib/themes/browser/themes.test.contribution.ts +++ b/src/vs/workbench/contrib/themes/browser/themes.test.contribution.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchThemeService, IWorkbenchColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; @@ -23,7 +23,7 @@ import { splitLines } from 'vs/base/common/strings'; interface IToken { c: string; t: string; - r: { [themeName: string]: string | undefined; }; + r: { [themeName: string]: string | undefined }; } interface IThemedToken { @@ -40,7 +40,7 @@ interface IThemesResult { class ThemeDocument { private readonly _theme: IWorkbenchColorTheme; - private readonly _cache: { [scopes: string]: ThemeRule; }; + private readonly _cache: { [scopes: string]: ThemeRule }; private readonly _defaultColor: string; constructor(theme: IWorkbenchColorTheme) { @@ -194,7 +194,7 @@ class Snapper { } private _enrichResult(result: IToken[], themesResult: IThemesResult): void { - let index: { [themeName: string]: number; } = {}; + let index: { [themeName: string]: number } = {}; let themeNames = Object.keys(themesResult); for (const themeName of themeNames) { index[themeName] = 0; diff --git a/src/vs/workbench/test/electron-browser/colorRegistry.releaseTest.ts b/src/vs/workbench/contrib/themes/test/electron-browser/colorRegistry.releaseTest.ts similarity index 97% rename from src/vs/workbench/test/electron-browser/colorRegistry.releaseTest.ts rename to src/vs/workbench/contrib/themes/test/electron-browser/colorRegistry.releaseTest.ts index f176e90a9b8..397ecffdb59 100644 --- a/src/vs/workbench/test/electron-browser/colorRegistry.releaseTest.ts +++ b/src/vs/workbench/contrib/themes/test/electron-browser/colorRegistry.releaseTest.ts @@ -13,6 +13,7 @@ import { getPathFromAmdModule } from 'vs/base/test/node/testUtils'; import { CancellationToken } from 'vs/base/common/cancellation'; import { RequestService } from 'vs/platform/request/node/requestService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +// eslint-disable-next-line code-import-patterns import 'vs/workbench/workbench.desktop.main'; import { NullLogService } from 'vs/platform/log/common/log'; import { mock } from 'vs/base/test/common/mock'; @@ -104,7 +105,7 @@ function getDescription(color: ColorContribution) { } async function getColorsFromExtension(): Promise<{ [id: string]: string }> { - let extPath = getPathFromAmdModule(require, '../../../../../extensions'); + let extPath = getPathFromAmdModule(require, '../../../../../../../extensions'); let extFolders = await pfs.Promises.readDirsInDir(extPath); let result: { [id: string]: string } = Object.create(null); for (let folder of extFolders) { diff --git a/src/vs/workbench/test/electron-browser/colorRegistryExport.test.ts b/src/vs/workbench/contrib/themes/test/electron-browser/colorRegistryExport.test.ts similarity index 100% rename from src/vs/workbench/test/electron-browser/colorRegistryExport.test.ts rename to src/vs/workbench/contrib/themes/test/electron-browser/colorRegistryExport.test.ts diff --git a/src/vs/workbench/contrib/timeline/browser/timeline.contribution.ts b/src/vs/workbench/contrib/timeline/browser/timeline.contribution.ts index 6fb4a228d98..6199e5a05fa 100644 --- a/src/vs/workbench/contrib/timeline/browser/timeline.contribution.ts +++ b/src/vs/workbench/contrib/timeline/browser/timeline.contribution.ts @@ -17,7 +17,7 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { ICommandHandler, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ExplorerFolderContext } from 'vs/workbench/contrib/files/common/files'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; import { Codicon } from 'vs/base/common/codicons'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; diff --git a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts index 712f52e702f..aadf76edef4 100644 --- a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts +++ b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts @@ -1244,7 +1244,7 @@ class TimelinePaneCommands extends Disposable { return this.getActions(MenuId.TimelineItemContext, { key: 'timelineItem', value: element.contextValue }).secondary; } - private getActions(menuId: MenuId, context: { key: string, value?: string }): { primary: IAction[]; secondary: IAction[]; } { + private getActions(menuId: MenuId, context: { key: string; value?: string }): { primary: IAction[]; secondary: IAction[] } { const contextKeyService = this.contextKeyService.createOverlay([ ['view', this.pane.id], [context.key, context.value], diff --git a/src/vs/workbench/contrib/timeline/common/timeline.ts b/src/vs/workbench/contrib/timeline/common/timeline.ts index bc5f45e8ef6..b5c6f69de26 100644 --- a/src/vs/workbench/contrib/timeline/common/timeline.ts +++ b/src/vs/workbench/contrib/timeline/common/timeline.ts @@ -27,9 +27,9 @@ export interface TimelineItem { timestamp: number; label: string; accessibilityInformation?: IAccessibilityInformation; - icon?: URI, - iconDark?: URI, - themeIcon?: ThemeIcon, + icon?: URI; + iconDark?: URI; + themeIcon?: ThemeIcon; description?: string; detail?: string; command?: Command; @@ -42,7 +42,7 @@ export interface TimelineItem { export interface TimelineChangeEvent { id: string; uri: URI | undefined; - reset: boolean + reset: boolean; } export interface TimelineOptions { @@ -61,7 +61,7 @@ export interface Timeline { paging?: { cursor: string | undefined; - } + }; } export interface TimelineProvider extends TimelineProviderDescriptor, IDisposable { diff --git a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchy.contribution.ts b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchy.contribution.ts index 9b16dbfab2c..ca9c2547965 100644 --- a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchy.contribution.ts +++ b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchy.contribution.ts @@ -5,6 +5,7 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Codicon } from 'vs/base/common/codicons'; +import { isCancellationError } from 'vs/base/common/errors'; import { Event } from 'vs/base/common/event'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { DisposableStore } from 'vs/base/common/lifecycle'; @@ -14,7 +15,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; -import { PeekContext } from 'vs/editor/contrib/peekView/peekView'; +import { PeekContext } from 'vs/editor/contrib/peekView/browser/peekView'; import { localize } from 'vs/nls'; import { MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -118,9 +119,12 @@ class TypeHierarchyController implements IEditorContribution { else { this._widget!.showMessage(localize('no.item', "No results")); } - }).catch(e => { + }).catch(err => { + if (isCancellationError(err)) { + this.endTypeHierarchy(); + return; + } this._widget!.showMessage(localize('error', "Failed to show type hierarchy")); - console.error(e); }); } diff --git a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts index f1f67b58e3f..9f177b1e4bd 100644 --- a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts +++ b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts @@ -22,7 +22,7 @@ import { IRange, Range } from 'vs/editor/common/core/range'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { IModelDecorationOptions, TrackedRangeStickiness, IModelDeltaDecoration, OverviewRulerLane } from 'vs/editor/common/model'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import * as peekView from 'vs/editor/contrib/peekView/peekView'; +import * as peekView from 'vs/editor/contrib/peekView/browser/peekView'; import { localize } from 'vs/nls'; import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; diff --git a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyTree.ts b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyTree.ts index b01ae609ba4..6a1e3e1466f 100644 --- a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyTree.ts +++ b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyTree.ts @@ -82,7 +82,7 @@ export class IdentityProvider implements IIdentityProvider { public getDirection: () => TypeHierarchyDirection ) { } - getId(element: Type): { toString(): string; } { + getId(element: Type): { toString(): string } { let res = this.getDirection() + JSON.stringify(element.item.uri) + JSON.stringify(element.item.range); if (element.parent) { res += this.getId(element.parent); diff --git a/src/vs/workbench/contrib/typeHierarchy/common/typeHierarchy.ts b/src/vs/workbench/contrib/typeHierarchy/common/typeHierarchy.ts index 249a0b6ffbe..6edb40c71f6 100644 --- a/src/vs/workbench/contrib/typeHierarchy/common/typeHierarchy.ts +++ b/src/vs/workbench/contrib/typeHierarchy/common/typeHierarchy.ts @@ -7,7 +7,7 @@ import { IRange, Range } from 'vs/editor/common/core/range'; import { SymbolKind, ProviderResult, SymbolTag } from 'vs/editor/common/languages'; import { ITextModel } from 'vs/editor/common/model'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { LanguageFeatureRegistry } from 'vs/editor/common/languages/languageFeatureRegistry'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; import { URI } from 'vs/base/common/uri'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { isNonEmptyArray } from 'vs/base/common/arrays'; @@ -32,7 +32,7 @@ export interface TypeHierarchyItem { uri: URI; range: IRange; selectionRange: IRange; - tags?: SymbolTag[] + tags?: SymbolTag[]; } export interface TypeHierarchySession { diff --git a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts index 54657bd6f38..f7379a4d721 100644 --- a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts +++ b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts @@ -14,7 +14,7 @@ import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import { TokenizationRegistry } from 'vs/editor/common/languages'; import { generateTokensCSSForColorMap } from 'vs/editor/common/languages/supports/tokenization'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import * as nls from 'vs/nls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/contrib/update/browser/update.ts b/src/vs/workbench/contrib/update/browser/update.ts index e44c9fc79a5..052ec7ea538 100644 --- a/src/vs/workbench/contrib/update/browser/update.ts +++ b/src/vs/workbench/contrib/update/browser/update.ts @@ -16,8 +16,8 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag import { IUpdateService, State as UpdateState, StateType, IUpdate } from 'vs/platform/update/common/update'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { ReleaseNotesManager } from './releaseNotesEditor'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; +import { ReleaseNotesManager } from 'vs/workbench/contrib/update/browser/releaseNotesEditor'; import { isWindows } from 'vs/base/common/platform'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { RawContextKey, IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -152,7 +152,7 @@ export class ProductContribution implements IWorkbenchContribution { @IStorageService storageService: IStorageService, @IInstantiationService instantiationService: IInstantiationService, @INotificationService notificationService: INotificationService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService environmentService: IBrowserWorkbenchEnvironmentService, @IOpenerService openerService: IOpenerService, @IConfigurationService configurationService: IConfigurationService, @IHostService hostService: IHostService, @@ -494,7 +494,7 @@ export class SwitchProductQualityContribution extends Disposable implements IWor constructor( @IProductService private readonly productService: IProductService, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService + @IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService ) { super(); diff --git a/src/vs/workbench/contrib/url/browser/externalUriResolver.ts b/src/vs/workbench/contrib/url/browser/externalUriResolver.ts index ac94a8befdf..63434bc1990 100644 --- a/src/vs/workbench/contrib/url/browser/externalUriResolver.ts +++ b/src/vs/workbench/contrib/url/browser/externalUriResolver.ts @@ -6,12 +6,12 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; export class ExternalUriResolverContribution extends Disposable implements IWorkbenchContribution { constructor( @IOpenerService _openerService: IOpenerService, - @IWorkbenchEnvironmentService _workbenchEnvironmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService _workbenchEnvironmentService: IBrowserWorkbenchEnvironmentService, ) { super(); diff --git a/src/vs/workbench/contrib/url/browser/trustedDomains.ts b/src/vs/workbench/contrib/url/browser/trustedDomains.ts index d4ca2173d98..613047e7a97 100644 --- a/src/vs/workbench/contrib/url/browser/trustedDomains.ts +++ b/src/vs/workbench/contrib/url/browser/trustedDomains.ts @@ -11,11 +11,11 @@ import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/commo import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { IFileService } from 'vs/platform/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; const TRUSTED_DOMAINS_URI = URI.parse('trustedDomains:/Trusted Domains'); @@ -35,11 +35,7 @@ export const manageTrustedDomainSettingsCommand = { } }; -type ConfigureTrustedDomainsQuickPickItem = IQuickPickItem & ({ id: 'manage'; } | { id: 'trust'; toTrust: string }); - -type ConfigureTrustedDomainsChoiceClassification = { - choice: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; -}; +type ConfigureTrustedDomainsQuickPickItem = IQuickPickItem & ({ id: 'manage' } | { id: 'trust'; toTrust: string }); export async function configureOpenerTrustedDomainsHandler( trustedDomains: string[], @@ -105,11 +101,6 @@ export async function configureOpenerTrustedDomainsHandler( ); if (pickedResult && pickedResult.id) { - telemetryService.publicLog2<{ choice: string }, ConfigureTrustedDomainsChoiceClassification>( - 'trustedDomains.configureTrustedDomainsQuickPickChoice', - { choice: pickedResult.id } - ); - switch (pickedResult.id) { case 'manage': await editorService.openEditor({ @@ -214,7 +205,7 @@ export async function readAuthenticationTrustedDomains(accessor: ServicesAccesso export function readStaticTrustedDomains(accessor: ServicesAccessor): IStaticTrustedDomains { const storageService = accessor.get(IStorageService); const productService = accessor.get(IProductService); - const environmentService = accessor.get(IWorkbenchEnvironmentService); + const environmentService = accessor.get(IBrowserWorkbenchEnvironmentService); const defaultTrustedDomains = [ ...productService.linkProtectionTrustedDomains ?? [], diff --git a/src/vs/workbench/contrib/url/browser/trustedDomainsValidator.ts b/src/vs/workbench/contrib/url/browser/trustedDomainsValidator.ts index 52121395377..dbaf96b6c27 100644 --- a/src/vs/workbench/contrib/url/browser/trustedDomainsValidator.ts +++ b/src/vs/workbench/contrib/url/browser/trustedDomainsValidator.ts @@ -19,16 +19,12 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IdleValue } from 'vs/base/common/async'; -import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { testUrlMatchesGlob } from 'vs/workbench/contrib/url/common/urlGlob'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -type TrustedDomainsDialogActionClassification = { - action: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; -}; - export class OpenerValidatorContributions implements IWorkbenchContribution { private _readWorkspaceTrustedDomainsResult: IdleValue>; @@ -128,27 +124,14 @@ export class OpenerValidatorContributions implements IWorkbenchContribution { // Open Link if (choice === 0) { - this._telemetryService.publicLog2<{ action: string }, TrustedDomainsDialogActionClassification>( - 'trustedDomains.dialogAction', - { action: 'open' } - ); return true; } // Copy Link else if (choice === 1) { - this._telemetryService.publicLog2<{ action: string }, TrustedDomainsDialogActionClassification>( - 'trustedDomains.dialogAction', - { action: 'copy' } - ); this._clipboardService.writeText(typeof originalResource === 'string' ? originalResource : resource.toString(true)); } // Configure Trusted Domains else if (choice === 3) { - this._telemetryService.publicLog2<{ action: string }, TrustedDomainsDialogActionClassification>( - 'trustedDomains.dialogAction', - { action: 'configure' } - ); - const pickedDomains = await configureOpenerTrustedDomainsHandler( trustedDomains, domainToOpen, @@ -169,11 +152,6 @@ export class OpenerValidatorContributions implements IWorkbenchContribution { return false; } - this._telemetryService.publicLog2<{ action: string }, TrustedDomainsDialogActionClassification>( - 'trustedDomains.dialogAction', - { action: 'cancel' } - ); - return false; } } diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts index 14ca1815e2b..ac75ee1bf3c 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts @@ -13,12 +13,20 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { isWeb } from 'vs/base/common/platform'; import { UserDataSyncTrigger } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger'; +import { Action } from 'vs/base/common/actions'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; +import { SHOW_SYNC_LOG_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync'; class UserDataSyncReportIssueContribution extends Disposable implements IWorkbenchContribution { constructor( @IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService, @INotificationService private readonly notificationService: INotificationService, + @IProductService private readonly productService: IProductService, + @ICommandService private readonly commandService: ICommandService, + @IHostService private readonly hostService: IHostService, ) { super(); this._register(userDataAutoSyncService.onError(error => this.onAutoSyncError(error))); @@ -26,13 +34,33 @@ class UserDataSyncReportIssueContribution extends Disposable implements IWorkben private onAutoSyncError(error: UserDataSyncError): void { switch (error.code) { - case UserDataSyncErrorCode.LocalTooManyRequests: + case UserDataSyncErrorCode.LocalTooManyRequests: { + const message = isWeb ? localize({ key: 'local too many requests - reload', comment: ['Settings Sync is the name of the feature'] }, "Settings sync is suspended temporarily because the current device is making too many requests. Please reload {0} to resume.", this.productService.nameLong) + : localize({ key: 'local too many requests - restart', comment: ['Settings Sync is the name of the feature'] }, "Settings sync is suspended temporarily because the current device is making too many requests. Please restart {0} to resume.", this.productService.nameLong); + this.notificationService.notify({ + severity: Severity.Error, + message, + actions: { + primary: [ + new Action('Show Sync Logs', localize('show sync logs', "Show Log"), undefined, true, () => this.commandService.executeCommand(SHOW_SYNC_LOG_COMMAND_ID)), + new Action('Restart', isWeb ? localize('reload', "Reload") : localize('restart', "Restart"), undefined, true, () => this.hostService.restart()) + ] + } + }); + return; + } case UserDataSyncErrorCode.TooManyRequests: { const operationId = error.operationId ? localize('operationId', "Operation Id: {0}", error.operationId) : undefined; - const message = localize('too many requests', "Turned off syncing settings on this device because it is making too many requests."); + const message = localize({ key: 'server too many requests', comment: ['Settings Sync is the name of the feature'] }, "Settings sync is disabled because the current device is making too many requests. Please wait for 10 minutes and turn on sync."); this.notificationService.notify({ severity: Severity.Error, message: operationId ? `${message} ${operationId}` : message, + source: error.operationId ? localize('settings sync', "Settings Sync. Operation Id: {0}", error.operationId) : undefined, + actions: { + primary: [ + new Action('Show Sync Logs', localize('show sync logs', "Show Log"), undefined, true, () => this.commandService.executeCommand(SHOW_SYNC_LOG_COMMAND_ID)), + ] + } }); return; } @@ -43,7 +71,4 @@ class UserDataSyncReportIssueContribution extends Disposable implements IWorkben const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchRegistry.registerWorkbenchContribution(UserDataSyncWorkbenchContribution, LifecyclePhase.Ready); workbenchRegistry.registerWorkbenchContribution(UserDataSyncTrigger, LifecyclePhase.Eventually); - -if (isWeb) { - workbenchRegistry.registerWorkbenchContribution(UserDataSyncReportIssueContribution, LifecyclePhase.Ready); -} +workbenchRegistry.registerWorkbenchContribution(UserDataSyncReportIssueContribution, LifecyclePhase.Ready); diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index 6dd1c5f1161..07d50613857 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -14,7 +14,7 @@ import { registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/ import type { IEditorContribution } from 'vs/editor/common/editorCommon'; import type { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { localize } from 'vs/nls'; import { MenuId, MenuRegistry, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; @@ -47,7 +47,7 @@ import { fromNow } from 'vs/base/common/date'; import { IProductService } from 'vs/platform/product/common/productService'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { Registry } from 'vs/platform/registry/common/platform'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ViewContainerLocation, IViewContainersRegistry, Extensions, ViewContainer } from 'vs/workbench/common/views'; @@ -63,11 +63,11 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; const CONTEXT_CONFLICTS_SOURCES = new RawContextKey('conflictsSources', ''); -type ConfigureSyncQuickPickItem = { id: SyncResource, label: string, description?: string; }; +type ConfigureSyncQuickPickItem = { id: SyncResource; label: string; description?: string }; type SyncConflictsClassification = { - source: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true; }; - action?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true; }; + source: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + action?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; const turnOnSyncCommand = { id: 'workbench.userDataSync.actions.turnOn', title: localize('turn on sync with category', "{0}: Turn On...", SYNC_TITLE) }; @@ -76,6 +76,7 @@ const configureSyncCommand = { id: CONFIGURE_SYNC_COMMAND_ID, title: localize('c const resolveSettingsConflictsCommand = { id: 'workbench.userDataSync.actions.resolveSettingsConflicts', title: localize('showConflicts', "{0}: Show Settings Conflicts", SYNC_TITLE) }; const resolveKeybindingsConflictsCommand = { id: 'workbench.userDataSync.actions.resolveKeybindingsConflicts', title: localize('showKeybindingsConflicts', "{0}: Show Keybindings Conflicts", SYNC_TITLE) }; const resolveSnippetsConflictsCommand = { id: 'workbench.userDataSync.actions.resolveSnippetsConflicts', title: localize('showSnippetsConflicts', "{0}: Show User Snippets Conflicts", SYNC_TITLE) }; +const resolveTasksConflictsCommand = { id: 'workbench.userDataSync.actions.resolveTasksConflicts', title: localize('showTasksConflicts', "{0}: Show User Tasks Conflicts", SYNC_TITLE) }; const syncNowCommand = { id: 'workbench.userDataSync.actions.syncNow', title: localize('sync now', "{0}: Sync Now", SYNC_TITLE), @@ -240,21 +241,21 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo { label: localize('replace remote', "Replace Remote"), run: () => { - this.telemetryService.publicLog2<{ source: string, action: string; }, SyncConflictsClassification>('sync/handleConflicts', { source: syncResource, action: 'acceptLocal' }); + this.telemetryService.publicLog2<{ source: string; action: string }, SyncConflictsClassification>('sync/handleConflicts', { source: syncResource, action: 'acceptLocal' }); this.acceptLocal(syncResource, conflicts); } }, { label: localize('replace local', "Replace Local"), run: () => { - this.telemetryService.publicLog2<{ source: string, action: string; }, SyncConflictsClassification>('sync/handleConflicts', { source: syncResource, action: 'acceptRemote' }); + this.telemetryService.publicLog2<{ source: string; action: string }, SyncConflictsClassification>('sync/handleConflicts', { source: syncResource, action: 'acceptRemote' }); this.acceptRemote(syncResource, conflicts); } }, { label: localize('show conflicts', "Show Conflicts"), run: () => { - this.telemetryService.publicLog2<{ source: string, action?: string; }, SyncConflictsClassification>('sync/showConflicts', { source: syncResource }); + this.telemetryService.publicLog2<{ source: string; action?: string }, SyncConflictsClassification>('sync/showConflicts', { source: syncResource }); this.handleConflicts([syncResource, conflicts]); } } @@ -327,7 +328,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo }); break; case UserDataSyncErrorCode.TooLarge: - if (error.resource === SyncResource.Keybindings || error.resource === SyncResource.Settings) { + if (error.resource === SyncResource.Keybindings || error.resource === SyncResource.Settings || error.resource === SyncResource.Tasks) { this.disableSync(error.resource); const sourceArea = getSyncAreaLabel(error.resource); this.handleTooLargeError(error.resource, localize('too large', "Disabled syncing {0} because size of the {1} file to sync is larger than {2}. Please open the file and reduce the size and enable sync", sourceArea.toLowerCase(), sourceArea.toLowerCase(), '100kb'), error); @@ -429,7 +430,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo if (this.invalidContentErrorDisposables.has(source)) { return; } - if (source !== SyncResource.Settings && source !== SyncResource.Keybindings) { + if (source !== SyncResource.Settings && source !== SyncResource.Keybindings && source !== SyncResource.Tasks) { return; } if (!this.hostService.hasFocus) { @@ -537,7 +538,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo if (e instanceof UserDataSyncError) { switch (e.code) { case UserDataSyncErrorCode.TooLarge: - if (e.resource === SyncResource.Keybindings || e.resource === SyncResource.Settings) { + if (e.resource === SyncResource.Keybindings || e.resource === SyncResource.Settings || e.resource === SyncResource.Tasks) { this.handleTooLargeError(e.resource, localize('too large while starting sync', "Settings sync cannot be turned on because size of the {0} file to sync is larger than {1}. Please open the file and reduce the size and turn on sync", getSyncAreaLabel(e.resource).toLowerCase(), '100kb'), e); return; } @@ -626,6 +627,9 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo }, { id: SyncResource.Snippets, label: getSyncAreaLabel(SyncResource.Snippets) + }, { + id: SyncResource.Tasks, + label: getSyncAreaLabel(SyncResource.Tasks) }, { id: SyncResource.Extensions, label: getSyncAreaLabel(SyncResource.Extensions) @@ -692,6 +696,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo case SyncResource.Settings: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Settings, false); case SyncResource.Keybindings: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Keybindings, false); case SyncResource.Snippets: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Snippets, false); + case SyncResource.Tasks: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Tasks, false); case SyncResource.Extensions: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Extensions, false); case SyncResource.GlobalState: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.GlobalState, false); } @@ -744,7 +749,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private async selectSettingsSyncService(userDataSyncStore: IUserDataSyncStore): Promise { return new Promise((c, e) => { const disposables: DisposableStore = new DisposableStore(); - const quickPick = disposables.add(this.quickInputService.createQuickPick<{ id: UserDataSyncStoreType, label: string, description?: string; }>()); + const quickPick = disposables.add(this.quickInputService.createQuickPick<{ id: UserDataSyncStoreType; label: string; description?: string }>()); quickPick.title = localize('switchSyncService.title', "{0}: Select Service", SYNC_TITLE); quickPick.description = localize('switchSyncService.description', "Ensure you are using the same settings sync service when syncing with multiple environments"); quickPick.hideInput = true; @@ -794,6 +799,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo this.registerShowSettingsConflictsAction(); this.registerShowKeybindingsConflictsAction(); this.registerShowSnippetsConflictsAction(); + this.registerShowTasksConflictsAction(); this.registerEnableSyncViewsAction(); this.registerManageSyncAction(); @@ -979,6 +985,33 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo }); } + private registerShowTasksConflictsAction(): void { + const resolveTasksConflictsWhenContext = ContextKeyExpr.regex(CONTEXT_CONFLICTS_SOURCES.keys()[0], /.*tasks.*/i); + CommandsRegistry.registerCommand(resolveTasksConflictsCommand.id, () => this.handleSyncResourceConflicts(SyncResource.Tasks)); + MenuRegistry.appendMenuItem(MenuId.GlobalActivity, { + group: '5_sync', + command: { + id: resolveTasksConflictsCommand.id, + title: localize('resolveTasksConflicts_global', "{0}: Show User Tasks Conflicts (1)", SYNC_TITLE), + }, + when: resolveTasksConflictsWhenContext, + order: 2 + }); + MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { + group: '5_sync', + command: { + id: resolveKeybindingsConflictsCommand.id, + title: localize('resolveTasksConflicts_global', "{0}: Show User Tasks Conflicts (1)", SYNC_TITLE), + }, + when: resolveTasksConflictsWhenContext, + order: 2 + }); + MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: resolveTasksConflictsCommand, + when: resolveTasksConflictsWhenContext, + }); + } + private _snippetsConflictsActionsDisposable: DisposableStore = new DisposableStore(); private registerShowSnippetsConflictsAction(): void { this._snippetsConflictsActionsDisposable.clear(); @@ -1058,6 +1091,9 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo case SyncResource.Snippets: items.push({ id: resolveSnippetsConflictsCommand.id, label: resolveSnippetsConflictsCommand.title }); break; + case SyncResource.Tasks: + items.push({ id: resolveTasksConflictsCommand.id, label: resolveTasksConflictsCommand.title }); + break; } } items.push({ type: 'separator' }); @@ -1387,7 +1423,7 @@ class AcceptChangesContribution extends Disposable implements IEditorContributio this._register(this.acceptChangesButton.onClick(async () => { const model = this.editor.getModel(); if (model) { - this.telemetryService.publicLog2<{ source: string, action: string; }, SyncConflictsClassification>('sync/handleConflicts', { source: syncResource, action: isRemote ? 'acceptRemote' : 'acceptLocal' }); + this.telemetryService.publicLog2<{ source: string; action: string }, SyncConflictsClassification>('sync/handleConflicts', { source: syncResource, action: isRemote ? 'acceptRemote' : 'acceptLocal' }); const syncAreaLabel = getSyncAreaLabel(syncResource); const result = await this.dialogService.confirm({ type: 'info', diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncMergesView.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncMergesView.ts index fc5f376f6b7..01b5a3216a9 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncMergesView.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncMergesView.ts @@ -108,7 +108,7 @@ export class UserDataSyncMergesViewPane extends TreeViewPane { this.buttonsContainer.style.width = `${width}px`; const numberOfChanges = this.userDataSyncPreview.resources.filter(r => r.syncResource !== SyncResource.GlobalState && (r.localChange !== Change.None || r.remoteChange !== Change.None)).length; - const messageHeight = 44; + const messageHeight = 66 /* max 3 lines */; super.layoutTreeView(Math.min(height - buttonContainerHeight, ((22 * numberOfChanges) + messageHeight)), width); } @@ -410,11 +410,6 @@ class UserDataSyncResourcesDecorationProvider extends Disposable implements IDec } } -type AcceptChangesClassification = { - source: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - action: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; -}; - class AcceptChangesContribution extends Disposable implements IEditorContribution { static get(editor: ICodeEditor): AcceptChangesContribution | null { @@ -430,7 +425,6 @@ class AcceptChangesContribution extends Disposable implements IEditorContributio @IInstantiationService private readonly instantiationService: IInstantiationService, @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, @IConfigurationService private readonly configurationService: IConfigurationService, - @ITelemetryService private readonly telemetryService: ITelemetryService, @IUserDataSyncWorkbenchService private readonly userDataSyncWorkbenchService: IUserDataSyncWorkbenchService, ) { super(); @@ -487,7 +481,6 @@ class AcceptChangesContribution extends Disposable implements IEditorContributio this._register(this.acceptChangesButton.onClick(async () => { const model = this.editor.getModel(); if (model) { - this.telemetryService.publicLog2<{ source: string, action: string }, AcceptChangesClassification>('sync/acceptChanges', { source: userDataSyncResource.syncResource, action: isRemoteResource ? 'acceptRemote' : isLocalResource ? 'acceptLocal' : 'acceptMerges' }); await this.userDataSyncWorkbenchService.userDataSyncPreview.accept(userDataSyncResource.syncResource, model.uri, model.getValue()); } })); diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts index 5dcc7fd77e5..203488f2fff 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts @@ -22,7 +22,7 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Codicon } from 'vs/base/common/codicons'; import { Action } from 'vs/base/common/actions'; import { IUserDataSyncWorkbenchService, CONTEXT_SYNC_STATE, getSyncAreaLabel, CONTEXT_ACCOUNT_STATE, AccountStatus, CONTEXT_ENABLE_ACTIVITY_VIEWS, SYNC_MERGES_VIEW_ID, CONTEXT_ENABLE_SYNC_MERGES_VIEW, SYNC_TITLE } from 'vs/workbench/services/userDataSync/common/userDataSync'; -import { IUserDataSyncMachinesService, IUserDataSyncMachine } from 'vs/platform/userDataSync/common/userDataSyncMachines'; +import { IUserDataSyncMachinesService, IUserDataSyncMachine, isWebPlatform } from 'vs/platform/userDataSync/common/userDataSyncMachines'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { flatten } from 'vs/base/common/arrays'; @@ -79,6 +79,7 @@ export class UserDataSyncDataViews extends Disposable { const treeView = this.instantiationService.createInstance(TreeView, id, name); const dataProvider = this.instantiationService.createInstance(UserDataSyncMachinesViewDataProvider, treeView); treeView.showRefreshAction = true; + treeView.canSelectMany = true; const disposable = treeView.onDidChangeVisibility(visible => { if (visible && !treeView.dataProvider) { disposable.dispose(); @@ -131,8 +132,8 @@ export class UserDataSyncDataViews extends Disposable { }, }); } - async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { - if (await dataProvider.disable(handle.$treeItemHandle)) { + async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg, selected?: TreeViewItemHandleArg[]): Promise { + if (await dataProvider.disable((selected || [handle]).map(handle => handle.$treeItemHandle))) { await treeView.refresh(); } } @@ -206,7 +207,7 @@ export class UserDataSyncDataViews extends Disposable { } async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { const commandService = accessor.get(ICommandService); - const { resource, comparableResource } = <{ resource: string, comparableResource: string }>JSON.parse(handle.$treeItemHandle); + const { resource, comparableResource } = <{ resource: string; comparableResource: string }>JSON.parse(handle.$treeItemHandle); const remoteResource = URI.parse(resource); const localResource = URI.parse(comparableResource); return commandService.executeCommand(API_OPEN_DIFF_EDITOR_COMMAND_ID, @@ -234,7 +235,7 @@ export class UserDataSyncDataViews extends Disposable { async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { const dialogService = accessor.get(IDialogService); const userDataSyncService = accessor.get(IUserDataSyncService); - const { resource, syncResource } = <{ resource: string, syncResource: SyncResource }>JSON.parse(handle.$treeItemHandle); + const { resource, syncResource } = <{ resource: string; syncResource: SyncResource }>JSON.parse(handle.$treeItemHandle); const result = await dialogService.confirm({ message: localize({ key: 'confirm replace', comment: ['A confirmation message to replace current user data (settings, extensions, keybindings, snippets) with selected version'] }, "Would you like to replace your current {0} with selected?", getSyncAreaLabel(syncResource)), type: 'info', @@ -466,12 +467,12 @@ class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider { let machines = await this.getMachines(); machines = machines.filter(m => !m.disabled).sort((m1, m2) => m1.isCurrent ? -1 : 1); this.treeView.message = machines.length ? undefined : localize('no machines', "No Machines"); - return machines.map(({ id, name, isCurrent }) => ({ + return machines.map(({ id, name, isCurrent, platform }) => ({ handle: id, collapsibleState: TreeItemCollapsibleState.None, label: { label: name }, description: isCurrent ? localize({ key: 'current', comment: ['Current machine'] }, "Current") : undefined, - themeIcon: Codicon.vm, + themeIcon: platform && isWebPlatform(platform) ? Codicon.globe : Codicon.vm, contextValue: 'sync-machine' })); } catch (error) { @@ -487,16 +488,17 @@ class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider { return this.machinesPromise; } - async disable(machineId: string): Promise { + async disable(machineIds: string[]): Promise { const machines = await this.getMachines(); - const machine = machines.find(({ id }) => id === machineId); - if (!machine) { - throw new Error(localize('not found', "machine not found with id: {0}", machineId)); + const machinesToDisable = machines.filter(({ id }) => machineIds.includes(id)); + if (!machinesToDisable.length) { + throw new Error(localize('not found', "machine not found with id: {0}", machineIds.join(','))); } const result = await this.dialogService.confirm({ type: 'info', - message: localize('turn off sync on machine', "Are you sure you want to turn off sync on {0}?", machine.name), + message: machinesToDisable.length > 1 ? localize('turn off sync on multiple machines', "Are you sure you want to turn off sync on selected machines?") + : localize('turn off sync on machine', "Are you sure you want to turn off sync on {0}?", machinesToDisable[0].name), primaryButton: localize({ key: 'turn off', comment: ['&& denotes a mnemonic'] }, "&&Turn off"), }); @@ -504,10 +506,14 @@ class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider { return false; } - if (machine.isCurrent) { + if (machinesToDisable.some(machine => machine.isCurrent)) { await this.userDataSyncWorkbenchService.turnoff(false); - } else { - await this.userDataSyncMachinesService.setEnablement(machineId, false); + } + + const otherMachinesToDisable: [string, boolean][] = machinesToDisable.filter(machine => !machine.isCurrent) + .map(machine => ([machine.id, false])); + if (otherMachinesToDisable.length) { + await this.userDataSyncMachinesService.setEnablements(otherMachinesToDisable); } return true; diff --git a/src/vs/workbench/contrib/userDataSync/electron-sandbox/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/electron-sandbox/userDataSync.contribution.ts index 2b16fd6a6e6..6840848e322 100644 --- a/src/vs/workbench/contrib/userDataSync/electron-sandbox/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/electron-sandbox/userDataSync.contribution.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IUserDataSyncUtilService, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncUtilService, SyncStatus } from 'vs/platform/userDataSync/common/userDataSync'; import { Registry } from 'vs/platform/registry/common/platform'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { ISharedProcessService } from 'vs/platform/ipc/electron-sandbox/services'; @@ -15,12 +15,8 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; -import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { Action } from 'vs/base/common/actions'; -import { IWorkbenchIssueService } from 'vs/workbench/services/issue/common/issue'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { CONTEXT_SYNC_STATE, SHOW_SYNC_LOG_COMMAND_ID, SYNC_TITLE } from 'vs/workbench/services/userDataSync/common/userDataSync'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { CONTEXT_SYNC_STATE, SYNC_TITLE } from 'vs/workbench/services/userDataSync/common/userDataSync'; class UserDataSyncServicesContribution implements IWorkbenchContribution { @@ -32,44 +28,8 @@ class UserDataSyncServicesContribution implements IWorkbenchContribution { } } -class UserDataSyncReportIssueContribution extends Disposable implements IWorkbenchContribution { - - constructor( - @IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService, - @INotificationService private readonly notificationService: INotificationService, - @IWorkbenchIssueService private readonly workbenchIssueService: IWorkbenchIssueService, - @ICommandService private readonly commandService: ICommandService, - ) { - super(); - this._register(userDataAutoSyncService.onError(error => this.onAutoSyncError(error))); - } - - private onAutoSyncError(error: UserDataSyncError): void { - switch (error.code) { - case UserDataSyncErrorCode.LocalTooManyRequests: - case UserDataSyncErrorCode.TooManyRequests: { - const operationId = error.operationId ? localize('operationId', "Operation Id: {0}", error.operationId) : undefined; - const message = localize({ key: 'too many requests', comment: ['Settings Sync is the name of the feature'] }, "Settings sync is disabled because the current device is making too many requests. Please report an issue by providing the sync logs."); - this.notificationService.notify({ - severity: Severity.Error, - message: operationId ? `${message} ${operationId}` : message, - source: error.operationId ? localize('settings sync', "Settings Sync. Operation Id: {0}", error.operationId) : undefined, - actions: { - primary: [ - new Action('Show Sync Logs', localize('show sync logs', "Show Log"), undefined, true, () => this.commandService.executeCommand(SHOW_SYNC_LOG_COMMAND_ID)), - new Action('Report Issue', localize('report issue', "Report Issue"), undefined, true, () => this.workbenchIssueService.openReporter()) - ] - } - }); - return; - } - } - } -} - const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchRegistry.registerWorkbenchContribution(UserDataSyncServicesContribution, LifecyclePhase.Starting); -workbenchRegistry.registerWorkbenchContribution(UserDataSyncReportIssueContribution, LifecyclePhase.Restored); registerAction2(class OpenSyncBackupsFolder extends Action2 { constructor() { diff --git a/src/vs/workbench/contrib/watermark/browser/watermark.css b/src/vs/workbench/contrib/watermark/browser/media/watermark.css similarity index 100% rename from src/vs/workbench/contrib/watermark/browser/watermark.css rename to src/vs/workbench/contrib/watermark/browser/media/watermark.css diff --git a/src/vs/workbench/contrib/watermark/browser/watermark.ts b/src/vs/workbench/contrib/watermark/browser/watermark.ts index 294db5d2151..703edf4b757 100644 --- a/src/vs/workbench/contrib/watermark/browser/watermark.ts +++ b/src/vs/workbench/contrib/watermark/browser/watermark.ts @@ -3,10 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./watermark'; +import 'vs/css!./media/watermark'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { isMacintosh, isWeb, OS } from 'vs/base/common/platform'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import * as nls from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; @@ -90,7 +91,8 @@ export class WatermarkContribution extends Disposable implements IWorkbenchContr @IContextKeyService private readonly contextKeyService: IContextKeyService, @IConfigurationService private readonly configurationService: IConfigurationService, @IEditorGroupsService private readonly editorGroupsService: IEditorGroupsService, - @IThemeService private readonly themeService: IThemeService + @IThemeService private readonly themeService: IThemeService, + @ITelemetryService private readonly telemetryService: ITelemetryService ) { super(); @@ -176,6 +178,11 @@ export class WatermarkContribution extends Disposable implements IWorkbenchContr this.watermarkDisposable.add(this.editorGroupsService.onDidLayout(dimension => this.handleEditorPartSize(container, dimension))); this.handleEditorPartSize(container, this.editorGroupsService.contentDimension); + + /* __GDPR__ + "watermark:open" : { } + */ + this.telemetryService.publicLog('watermark:open'); } private handleEditorPartSize(container: HTMLElement, dimension: dom.IDimension): void { diff --git a/src/vs/workbench/contrib/webview/browser/overlayWebview.ts b/src/vs/workbench/contrib/webview/browser/overlayWebview.ts index 3e898e16f14..bb25dfdc171 100644 --- a/src/vs/workbench/contrib/webview/browser/overlayWebview.ts +++ b/src/vs/workbench/contrib/webview/browser/overlayWebview.ts @@ -21,7 +21,7 @@ export class OverlayWebview extends Disposable implements IOverlayWebview { private readonly _onDidWheel = this._register(new Emitter()); public readonly onDidWheel = this._onDidWheel.event; - private readonly _pendingMessages = new Set<{ readonly message: any, readonly transfer?: readonly ArrayBuffer[] }>(); + private readonly _pendingMessages = new Set<{ readonly message: any; readonly transfer?: readonly ArrayBuffer[] }>(); private readonly _webview = this._register(new MutableDisposable()); private readonly _webviewEvents = this._register(new DisposableStore()); @@ -256,8 +256,8 @@ export class OverlayWebview extends Disposable implements IOverlayWebview { private readonly _onDidReload = this._register(new Emitter()); public readonly onDidReload = this._onDidReload.event; - private readonly _onDidScroll = this._register(new Emitter<{ scrollYPercentage: number; }>()); - public readonly onDidScroll: Event<{ scrollYPercentage: number; }> = this._onDidScroll.event; + private readonly _onDidScroll = this._register(new Emitter<{ scrollYPercentage: number }>()); + public readonly onDidScroll: Event<{ scrollYPercentage: number }> = this._onDidScroll.event; private readonly _onDidUpdateState = this._register(new Emitter()); public readonly onDidUpdateState: Event = this._onDidUpdateState.event; diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index a5d2361c1ce..3f2ade8478f 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -4,12 +4,13 @@ + + - Virtual Document diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index ec679b54155..b32b1595d3a 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -468,8 +468,8 @@ const handleInnerClick = (event) => { if (node.getAttribute('href') === '#') { event.view.scrollTo(0, 0); } else if (node.hash && (node.getAttribute('href') === node.hash || (baseElement && node.href === baseElement.href + node.hash))) { - const fragment = node.hash.substr(1, node.hash.length - 1); - const scrollTarget = event.view.document.getElementById(decodeURIComponent(fragment)); + const fragment = node.hash.slice(1); + const scrollTarget = event.view.document.getElementById(fragment) ?? event.view.document.getElementById(decodeURIComponent(fragment)); scrollTarget?.scrollIntoView(); } else { hostMessaging.postMessage('did-click-link', node.href.baseVal || node.href); diff --git a/src/vs/workbench/contrib/webview/browser/resourceLoading.ts b/src/vs/workbench/contrib/webview/browser/resourceLoading.ts index 4bc801d414c..9d717dd0c1c 100644 --- a/src/vs/workbench/contrib/webview/browser/resourceLoading.ts +++ b/src/vs/workbench/contrib/webview/browser/resourceLoading.ts @@ -45,7 +45,7 @@ export namespace WebviewResourceResponse { export async function loadLocalResource( requestUri: URI, options: { - ifNoneMatch: string | undefined, + ifNoneMatch: string | undefined; roots: ReadonlyArray; }, fileService: IFileService, diff --git a/src/vs/workbench/contrib/webview/browser/themeing.ts b/src/vs/workbench/contrib/webview/browser/themeing.ts index 46aa22104a8..815dba525eb 100644 --- a/src/vs/workbench/contrib/webview/browser/themeing.ts +++ b/src/vs/workbench/contrib/webview/browser/themeing.ts @@ -62,7 +62,7 @@ export class WebviewThemeDataProvider extends Disposable { colors['vscode-' + entry.id.replace('.', '-')] = color.toString(); } return colors; - }, {} as { [key: string]: string; }); + }, {} as { [key: string]: string }); const styles = { 'vscode-font-family': DEFAULT_FONT_FAMILY, diff --git a/src/vs/workbench/contrib/webview/browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/browser/webview.contribution.ts index 5997948941c..098534ace64 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.contribution.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { MultiCommand, RedoCommand, SelectAllCommand, UndoCommand } from 'vs/editor/browser/editorExtensions'; -import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/clipboard'; +import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/browser/clipboard'; import * as nls from 'vs/nls'; import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { IWebviewService, IWebview } from 'vs/workbench/contrib/webview/browser/webview'; diff --git a/src/vs/workbench/contrib/webview/browser/webview.ts b/src/vs/workbench/contrib/webview/browser/webview.ts index 32e53a531b8..0db26467cba 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.ts @@ -80,7 +80,7 @@ export const enum WebviewContentPurpose { WebviewView = 'webviewView', } -export type WebviewStyles = { readonly [key: string]: string | number; }; +export type WebviewStyles = { readonly [key: string]: string | number }; export interface WebviewOptions { /** diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index f406a906518..0c02d8ffab8 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -8,7 +8,7 @@ import { addDisposableListener } from 'vs/base/browser/dom'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { IAction } from 'vs/base/common/actions'; import { ThrottledDelayer } from 'vs/base/common/async'; -import { streamToBuffer } from 'vs/base/common/buffer'; +import { streamToBuffer, VSBufferReadableStream } from 'vs/base/common/buffer'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -27,10 +27,10 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { ITunnelService } from 'vs/platform/tunnel/common/tunnel'; import { WebviewPortMappingManager } from 'vs/platform/webview/common/webviewPortMapping'; -import { asWebviewUri, decodeAuthority, webviewGenericCspSource, webviewRootResourceAuthority } from 'vs/workbench/api/common/shared/webview'; +import { asWebviewUri, decodeAuthority, webviewGenericCspSource, webviewRootResourceAuthority } from 'vs/workbench/common/webview'; import { loadLocalResource, WebviewResourceResponse } from 'vs/workbench/contrib/webview/browser/resourceLoading'; import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { areWebviewContentOptionsEqual, IWebview, WebviewContentOptions, WebviewExtensionDescription, WebviewMessageReceivedEvent, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; @@ -83,7 +83,11 @@ namespace WebviewState { readonly type = Type.Initializing; constructor( - public readonly pendingMessages: Array<{ readonly channel: string, readonly data?: any }> + public readonly pendingMessages: Array<{ + readonly channel: string; + readonly data?: any; + readonly transferable: Transferable[]; + }> ) { } } @@ -224,7 +228,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this._onDidClickLink.fire(uri); })); - this._register(this.on(WebviewMessageChannels.onmessage, (data: { message: any, transfer?: ArrayBuffer[] }) => { + this._register(this.on(WebviewMessageChannels.onmessage, (data: { message: any; transfer?: ArrayBuffer[] }) => { this._onMessage.fire({ message: data.message, transfer: data.transfer, @@ -275,7 +279,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this.handleKeyEvent('keyup', data); })); - this._register(this.on(WebviewMessageChannels.didContextMenu, (data: { clientX: number, clientY: number }) => { + this._register(this.on(WebviewMessageChannels.didContextMenu, (data: { clientX: number; clientY: number }) => { if (!this.element) { return; } @@ -298,7 +302,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(WebviewMessageChannels.loadResource, async (entry: { id: number; path: string; query: string; scheme: string; authority: string; ifNoneMatch?: string }) => { try { // Restore the authority we previously encoded const authority = decodeAuthority(entry.authority); @@ -381,7 +385,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD private readonly _onMessage = this._register(new Emitter()); public readonly onMessage = this._onMessage.event; - private readonly _onDidScroll = this._register(new Emitter<{ readonly scrollYPercentage: number; }>()); + private readonly _onDidScroll = this._register(new Emitter<{ readonly scrollYPercentage: number }>()); public readonly onDidScroll = this._onDidScroll.event; private readonly _onDidWheel = this._register(new Emitter()); @@ -403,11 +407,11 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this._send('message', { message, transfer }); } - protected _send(channel: string, data?: any): void { + protected _send(channel: string, data?: any, transferable: Transferable[] = []): void { if (this._state.type === WebviewState.Type.Initializing) { - this._state.pendingMessages.push({ channel, data }); + this._state.pendingMessages.push({ channel, data, transferable }); } else { - this.doPostMessage(channel, data); + this.doPostMessage(channel, data, transferable); } } @@ -447,10 +451,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD params.purpose = options.purpose; } - const queryString = (Object.keys(params) as Array) - .map((key) => `${key}=${encodeURIComponent(params[key]!)}`) - .join('&'); - + const queryString = new URLSearchParams(params).toString(); this.element!.setAttribute('src', `${this.webviewContentEndpoint}/index.html?${queryString}`); } @@ -483,9 +484,9 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD return this._webviewContentOrigin; } - private doPostMessage(channel: string, data?: any): void { + private doPostMessage(channel: string, data?: any, transferable: Transferable[] = []): void { if (this.element && this.messagePort) { - this.messagePort.postMessage({ channel, args: data }); + this.messagePort.postMessage({ channel, args: data }, transferable); } } @@ -515,10 +516,10 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD } type TelemetryClassification = { - extension?: { classification: 'SystemMetaData', purpose: 'FeatureInsight'; }; + extension?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type TelemetryData = { - extension?: string, + extension?: string; }; this._telemetryService.publicLog2('webviewMissingCsp', { @@ -710,7 +711,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD switch (result.type) { case WebviewResourceResponse.Type.Success: { - const { buffer } = await streamToBuffer(result.stream); + const buffer = await this.streamToBuffer(result.stream); return this._send('did-load-resource', { id, status: 200, @@ -719,7 +720,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD data: buffer, etag: result.etag, mtime: result.mtime - }); + }, [buffer]); } case WebviewResourceResponse.Type.NotModified: { return this._send('did-load-resource', { @@ -749,6 +750,11 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD }); } + protected async streamToBuffer(stream: VSBufferReadableStream): Promise { + const vsBuffer = await streamToBuffer(stream); + return vsBuffer.buffer.buffer; + } + private async localLocalhost(id: string, origin: string) { const authority = this._environmentService.remoteAuthority; const resolveAuthority = authority ? await this._remoteAuthorityResolverService.resolveAuthority(authority) : undefined; diff --git a/src/vs/workbench/contrib/webview/electron-sandbox/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-sandbox/webviewElement.ts index 56f60d54d3a..3a756e0c8bc 100644 --- a/src/vs/workbench/contrib/webview/electron-sandbox/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-sandbox/webviewElement.ts @@ -4,7 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { Delayer } from 'vs/base/common/async'; +import { VSBuffer, VSBufferReadableStream } from 'vs/base/common/buffer'; import { Schemas } from 'vs/base/common/network'; +import { consumeStream } from 'vs/base/common/stream'; import { ProxyChannel } from 'vs/base/parts/ipc/common/ipc'; import { IMenuService } from 'vs/platform/actions/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -16,8 +18,8 @@ import { ILogService } from 'vs/platform/log/common/log'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { ITunnelService } from 'vs/platform/tunnel/common/tunnel'; import { FindInFrameOptions, IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService'; import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; @@ -94,6 +96,22 @@ export class ElectronWebviewElement extends WebviewElement { return `${Schemas.vscodeWebview}://${this.iframeId}`; } + protected override streamToBuffer(stream: VSBufferReadableStream): Promise { + // Join buffers from stream without using the Node.js backing pool. + // This lets us transfer the resulting buffer to the webview. + return consumeStream(stream, (buffers: readonly VSBuffer[]) => { + const totalLength = buffers.reduce((prev, curr) => prev + curr.byteLength, 0); + const ret = new ArrayBuffer(totalLength); + const view = new Uint8Array(ret); + let offset = 0; + for (const element of buffers) { + view.set(element.buffer, offset); + offset += element.byteLength; + } + return ret; + }); + } + /** * Webviews expose a stateful find API. * Successive calls to find will move forward or backward through onFindResults diff --git a/src/vs/workbench/contrib/webviewPanel/browser/webviewWorkbenchService.ts b/src/vs/workbench/contrib/webviewPanel/browser/webviewWorkbenchService.ts index 779cf22256c..45d5a74cdf6 100644 --- a/src/vs/workbench/contrib/webviewPanel/browser/webviewWorkbenchService.ts +++ b/src/vs/workbench/contrib/webviewPanel/browser/webviewWorkbenchService.ts @@ -44,14 +44,14 @@ export interface IWebviewWorkbenchService { ): WebviewInput; reviveWebview(options: { - id: string, - viewType: string, - title: string, - iconPath: WebviewIcons | undefined, - state: any, - webviewOptions: WebviewOptions, - contentOptions: WebviewContentOptions, - extension: WebviewExtensionDescription | undefined, + id: string; + viewType: string; + title: string; + iconPath: WebviewIcons | undefined; + state: any; + webviewOptions: WebviewOptions; + contentOptions: WebviewContentOptions; + extension: WebviewExtensionDescription | undefined; group: number | undefined; }): WebviewInput; @@ -142,7 +142,7 @@ export class LazilyResolvedWebviewEditorInput extends WebviewInput { class RevivalPool { - private _awaitingRevival: Array<{ input: WebviewInput, resolve: () => void; }> = []; + private _awaitingRevival: Array<{ input: WebviewInput; resolve: () => void }> = []; public add(input: WebviewInput, resolve: () => void) { this._awaitingRevival.push({ input, resolve }); @@ -244,9 +244,6 @@ export class WebviewEditorService extends Disposable implements IWebviewWorkbenc preserveFocus: boolean ): void { const topLevelEditor = this.findTopLevelEditorForWebview(webview); - if (this._editorService.activeEditor === topLevelEditor) { - return; - } this._editorService.openEditor(topLevelEditor, { preserveFocus, @@ -271,15 +268,15 @@ export class WebviewEditorService extends Disposable implements IWebviewWorkbenc } public reviveWebview(options: { - id: string, - viewType: string, - title: string, - iconPath: WebviewIcons | undefined, - state: any, - webviewOptions: WebviewOptions, - contentOptions: WebviewContentOptions, - extension: WebviewExtensionDescription | undefined, - group: number | undefined, + id: string; + viewType: string; + title: string; + iconPath: WebviewIcons | undefined; + state: any; + webviewOptions: WebviewOptions; + contentOptions: WebviewContentOptions; + extension: WebviewExtensionDescription | undefined; + group: number | undefined; }): WebviewInput { const webview = this._webviewService.createWebviewOverlay(options.id, options.webviewOptions, options.contentOptions, options.extension); webview.state = options.state; diff --git a/src/vs/workbench/contrib/webviewView/browser/webviewViewService.ts b/src/vs/workbench/contrib/webviewView/browser/webviewViewService.ts index 268e96fe4e1..c3565f919d5 100644 --- a/src/vs/workbench/contrib/webviewView/browser/webviewViewService.ts +++ b/src/vs/workbench/contrib/webviewView/browser/webviewViewService.ts @@ -46,7 +46,7 @@ export class WebviewViewService extends Disposable implements IWebviewViewServic private readonly _resolvers = new Map(); - private readonly _awaitingRevival = new Map void }>(); + private readonly _awaitingRevival = new Map void }>(); private readonly _onNewResolverRegistered = this._register(new Emitter<{ readonly viewType: string }>()); public readonly onNewResolverRegistered = this._onNewResolverRegistered.event; diff --git a/src/vs/workbench/contrib/welcome/banner/browser/welcomeBanner.contribution.ts b/src/vs/workbench/contrib/welcomeBanner/browser/welcomeBanner.contribution.ts similarity index 91% rename from src/vs/workbench/contrib/welcome/banner/browser/welcomeBanner.contribution.ts rename to src/vs/workbench/contrib/welcomeBanner/browser/welcomeBanner.contribution.ts index a29b3b1a8f0..f40532acab5 100644 --- a/src/vs/workbench/contrib/welcome/banner/browser/welcomeBanner.contribution.ts +++ b/src/vs/workbench/contrib/welcomeBanner/browser/welcomeBanner.contribution.ts @@ -8,7 +8,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { IBannerService } from 'vs/workbench/services/banner/browser/bannerService'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { URI } from 'vs/base/common/uri'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; @@ -19,7 +19,7 @@ class WelcomeBannerContribution { constructor( @IBannerService bannerService: IBannerService, @IStorageService storageService: IStorageService, - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService + @IBrowserWorkbenchEnvironmentService environmentService: IBrowserWorkbenchEnvironmentService ) { const welcomeBanner = environmentService.options?.welcomeBanner; if (!welcomeBanner) { diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.contribution.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts similarity index 92% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.contribution.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts index 957e3b14898..3a8fa8c1d9a 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.contribution.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import { GettingStartedInputSerializer, GettingStartedPage, inWelcomeContext } from 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted'; +import { GettingStartedInputSerializer, GettingStartedPage, inWelcomeContext } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorExtensions, IEditorFactoryRegistry } from 'vs/workbench/common/editor'; import { MenuId, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; @@ -15,8 +15,8 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis import { KeyCode } from 'vs/base/common/keyCodes'; import { EditorPaneDescriptor, IEditorPaneRegistry } from 'vs/workbench/browser/editor'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { IWalkthroughsService } from 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedService'; -import { GettingStartedInput } from 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedInput'; +import { IWalkthroughsService } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService'; +import { GettingStartedInput } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { ConfigurationScope, Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; @@ -32,13 +32,13 @@ import { isLinux, isMacintosh, isWindows, OperatingSystem as OS } from 'vs/base/ import { IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; -export * as icons from 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedIcons'; +export * as icons from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons'; registerAction2(class extends Action2 { constructor() { super({ id: 'workbench.action.openWalkthrough', - title: localize('miGetStarted', "Get Started"), + title: { value: localize('miGetStarted', "Get Started"), original: 'Get Started' }, category: localize('help', "Help"), f1: true, menu: { @@ -49,7 +49,7 @@ registerAction2(class extends Action2 { }); } - public run(accessor: ServicesAccessor, walkthroughID: string | { category: string, step: string } | undefined, toSide: boolean | undefined) { + public run(accessor: ServicesAccessor, walkthroughID: string | { category: string; step: string } | undefined, toSide: boolean | undefined) { const editorGroupsService = accessor.get(IEditorGroupsService); const instantiationService = accessor.get(IInstantiationService); const editorService = accessor.get(IEditorService); @@ -106,7 +106,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: 'welcome.goBack', - title: localize('welcome.goBack', "Go Back"), + title: { value: localize('welcome.goBack', "Go Back"), original: 'Go Back' }, category, keybinding: { weight: KeybindingWeight.EditorContrib, @@ -176,7 +176,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: 'welcome.showAllWalkthroughs', - title: localize('welcome.showAllWalkthroughs', "Open Walkthrough..."), + title: { value: localize('welcome.showAllWalkthroughs', "Open Walkthrough..."), original: 'Open Walkthrough...' }, category, f1: true, }); @@ -296,6 +296,18 @@ configurationRegistry.registerConfiguration({ type: 'boolean', default: true, description: localize('workbench.welcomePage.walkthroughs.openOnInstall', "When enabled, an extension's walkthrough will open upon install of the extension.") + }, + 'workbench.welcomePage.experimental.videoTutorials': { + scope: ConfigurationScope.MACHINE, + type: 'string', + enum: [ + 'off', + 'on', + 'experimental' + ], + tags: ['experimental'], + default: 'off', + description: localize('workbench.welcomePage.videoTutorials', "When enabled, the get started page has additional links to video tutorials.") } } }); diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts similarity index 97% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index b7dd356a4ba..ca02f03c13f 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./gettingStarted'; +import 'vs/css!./media/gettingStarted'; import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IEditorSerializer, IEditorOpenContext } from 'vs/workbench/common/editor'; @@ -12,14 +12,14 @@ import { assertIsDefined } from 'vs/base/common/types'; import { $, addDisposableListener, append, clearNode, Dimension, reset } from 'vs/base/browser/dom'; 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/welcome/gettingStarted/browser/gettingStartedService'; +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/welcome/gettingStarted/browser/gettingStartedColors'; +import { welcomePageBackground, welcomePageProgressBackground, welcomePageProgressForeground, welcomePageTileBackground, welcomePageTileHoverBackground, welcomePageTileShadow } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors'; import { activeContrastBorder, buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, descriptionForeground, focusBorder, foreground, simpleCheckboxBackground, simpleCheckboxBorder, simpleCheckboxForeground, textLinkActiveForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; 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'; -import { gettingStartedCheckedCodicon, gettingStartedUncheckedCodicon } from 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedIcons'; +import { gettingStartedCheckedCodicon, gettingStartedUncheckedCodicon } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons'; import { IOpenerService, matchesScheme } from 'vs/platform/opener/common/opener'; import { URI } from 'vs/base/common/uri'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; @@ -36,7 +36,7 @@ import { splitName } from 'vs/base/common/labels'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { isMacintosh, locale } from 'vs/base/common/platform'; import { Delayer, Throttler } from 'vs/base/common/async'; -import { GettingStartedInput } from 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedInput'; +import { GettingStartedInput } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput'; import { GroupDirection, GroupsOrder, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { ILink, LinkedText } from 'vs/base/common/linkedText'; @@ -46,7 +46,7 @@ import { Link } from 'vs/platform/opener/browser/link'; import { renderFormattedText } from 'vs/base/browser/formattedTextRenderer'; import { IWebviewService } from 'vs/workbench/contrib/webview/browser/webview'; import { DEFAULT_MARKDOWN_STYLES, renderMarkdownDocument } from 'vs/workbench/contrib/markdown/browser/markdownDocumentRenderer'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { generateUuid } from 'vs/base/common/uuid'; import { TokenizationRegistry } from 'vs/editor/common/languages'; @@ -56,24 +56,24 @@ import { IFileService } from 'vs/platform/files/common/files'; import { parse } from 'vs/base/common/marshalling'; import { joinPath } from 'vs/base/common/resources'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { asWebviewUri } from 'vs/workbench/api/common/shared/webview'; +import { asWebviewUri } from 'vs/workbench/common/webview'; 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 { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; -import { startEntries } from 'vs/workbench/contrib/welcome/gettingStarted/common/gettingStartedContent'; +import { startEntries } from 'vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { GettingStartedIndexList } from './gettingStartedList'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { getTelemetryLevel } from 'vs/platform/telemetry/common/telemetryUtils'; -import { WorkbenchStateContext } from 'vs/workbench/browser/contextkeys'; +import { WorkbenchStateContext } from 'vs/workbench/common/contextkeys'; import { IsIOSContext } from 'vs/platform/contextkey/common/contextkeys'; import { AddRootFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox'; import { Codicon } from 'vs/base/common/codicons'; -import { restoreWalkthroughsConfigurationKey, RestoreWalkthroughsConfigurationValue } from 'vs/workbench/contrib/welcome/page/browser/welcomePage'; +import { restoreWalkthroughsConfigurationKey, RestoreWalkthroughsConfigurationValue } from 'vs/workbench/contrib/welcomePage/browser/welcomePage'; const SLIDE_TRANSITION_TIME_MS = 250; const configurationKey = 'workbench.startupEditor'; @@ -83,13 +83,13 @@ export const inWelcomeContext = new RawContextKey('inWelcome', false); export const embedderIdentifierContext = new RawContextKey('embedderIdentifier', undefined); export interface IWelcomePageStartEntry { - id: string - title: string - description: string - command: string - order: number - icon: { type: 'icon', icon: ThemeIcon } - when: ContextKeyExpression + id: string; + title: string; + description: string; + command: string; + order: number; + icon: { type: 'icon'; icon: ThemeIcon }; + when: ContextKeyExpression; } const parsedStartEntries: IWelcomePageStartEntry[] = startEntries.map((e, i) => ({ @@ -103,8 +103,8 @@ const parsedStartEntries: IWelcomePageStartEntry[] = startEntries.map((e, i) => })); type GettingStartedActionClassification = { - command: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; - argument: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + command: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + argument: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; }; type GettingStartedActionEvent = { @@ -278,7 +278,7 @@ export class GettingStartedPage extends EditorPane { return !this.configurationService.getValue(REDUCED_MOTION_KEY); } - private getWalkthroughCompletionStats(walkthrough: IResolvedWalkthrough): { stepsComplete: number, stepsTotal: number } { + private getWalkthroughCompletionStats(walkthrough: IResolvedWalkthrough): { stepsComplete: number; stepsTotal: number } { const activeSteps = walkthrough.steps.filter(s => this.contextService.contextMatchesRules(s.when)); return { stepsComplete: activeSteps.filter(s => s.done).length, @@ -320,6 +320,16 @@ export class GettingStartedPage extends EditorPane { e.stopPropagation(); this.runDispatchCommand(command, argument); })); + this.dispatchListeners.add(addDisposableListener(element, 'keyup', (e) => { + const keyboardEvent = new StandardKeyboardEvent(e); + e.stopPropagation(); + switch (keyboardEvent.keyCode) { + case KeyCode.Enter: + case KeyCode.Space: + this.runDispatchCommand(command, argument); + return; + } + })); } }); } @@ -364,7 +374,7 @@ export class GettingStartedPage extends EditorPane { case 'selectStartEntry': { const selected = startEntries.find(e => e.id === argument); if (selected) { - this.commandService.executeCommand(selected.content.command); + this.runStepCommand(selected.content.command); } else { throw Error('could not find start entry with id: ' + argument); } @@ -723,7 +733,7 @@ export class GettingStartedPage extends EditorPane { this.detailsScrollbar?.scanDomNode(); } - private updateMediaSourceForColorMode(element: HTMLImageElement, sources: { hc: URI, dark: URI, light: URI }) { + private updateMediaSourceForColorMode(element: HTMLImageElement, sources: { hc: URI; dark: URI; light: URI }) { const themeType = this.themeService.getColorTheme().type; const src = sources[themeType].toString(true).replace(/ /g, '%20'); element.srcset = src.toLowerCase().endsWith('.svg') ? src : (src + ' 1.5x'); @@ -1167,7 +1177,6 @@ export class GettingStartedPage extends EditorPane { return $('button.getting-started-category' + (category.isFeatured ? '.featured' : ''), { 'x-dispatch': 'selectCategory:' + category.id, - 'role': 'listitem', 'title': category.description }, featuredBadge, @@ -1176,6 +1185,7 @@ export class GettingStartedPage extends EditorPane { $('h3.category-title.max-lines-3', { 'x-category-title-for': category.id }, category.title,), renderNewBadge ? newBadge : $('.no-badge'), $('a.codicon.codicon-close.hide-category-button', { + 'tabindex': 0, 'x-dispatch': 'hideCategory:' + category.id, 'title': localize('close', "Hide"), }), @@ -1205,7 +1215,7 @@ export class GettingStartedPage extends EditorPane { title: localize('walkthroughs', "Walkthroughs"), klass: 'getting-started', limit: 5, - footer: $('span.button-link.see-all-walkthroughs', { 'x-dispatch': 'seeAllWalkthroughs' }, localize('showAll', "More...")), + footer: $('span.button-link.see-all-walkthroughs', { 'x-dispatch': 'seeAllWalkthroughs', 'tabindex': 0 }, localize('showAll', "More...")), renderElement: renderGetttingStaredWalkthrough, rankElement: rankWalkthrough, contextService: this.contextService, @@ -1282,7 +1292,7 @@ export class GettingStartedPage extends EditorPane { }); } - private iconWidgetFor(category: IResolvedWalkthrough | { icon: { type: 'icon', icon: ThemeIcon } }) { + private iconWidgetFor(category: IResolvedWalkthrough | { icon: { type: 'icon'; icon: ThemeIcon } }) { const widget = category.icon.type === 'icon' ? $(ThemeIcon.asCSSSelector(category.icon.icon)) : $('img.category-icon', { src: category.icon.path }); widget.classList.add('icon-widget'); return widget; diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedColors.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedColors.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors.ts diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedExtensionPoint.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedExtensionPoint.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedExtensionPoint.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedExtensionPoint.ts diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedIcons.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedIcons.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons.ts diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedInput.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput.ts similarity index 92% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedInput.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput.ts index 0c3af000b79..df617e9ad97 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedInput.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./gettingStarted'; +import 'vs/css!./media/gettingStarted'; import { localize } from 'vs/nls'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { URI } from 'vs/base/common/uri'; @@ -37,7 +37,7 @@ export class GettingStartedInput extends EditorInput { } constructor( - options: { selectedCategory?: string, selectedStep?: string, showTelemetryNotice?: boolean, } + options: { selectedCategory?: string; selectedStep?: string; showTelemetryNotice?: boolean } ) { super(); this.selectedCategory = options.selectedCategory; diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedList.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedList.ts similarity index 98% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedList.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedList.ts index ff8093649d3..6fef8b0769f 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedList.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedList.ts @@ -22,7 +22,7 @@ type GettingStartedIndexListOptions = { contextService: IContextKeyService; }; -export class GettingStartedIndexList extends Disposable { +export class GettingStartedIndexList extends Disposable { private readonly _onDidChangeEntries = new Emitter(); private readonly onDidChangeEntries: Event = this._onDidChangeEntries.event; diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedService.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService.ts similarity index 92% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedService.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService.ts index 96e98c7d2f6..ed0b2c0d8b6 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedService.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService.ts @@ -18,19 +18,19 @@ import { joinPath } from 'vs/base/common/resources'; import { FileAccess } from 'vs/base/common/network'; import { DefaultIconPath, IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { walkthroughs } from 'vs/workbench/contrib/welcome/gettingStarted/common/gettingStartedContent'; +import { walkthroughs } from 'vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent'; import { IWorkbenchAssignmentService } from 'vs/workbench/services/assignment/common/assignmentService'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILink, LinkedText, parseLinkedText } from 'vs/base/common/linkedText'; -import { walkthroughsExtensionPoint } from 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedExtensionPoint'; +import { walkthroughsExtensionPoint } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedExtensionPoint'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { dirname } from 'vs/base/common/path'; import { coalesce, flatten } from 'vs/base/common/arrays'; import { IViewsService } from 'vs/workbench/common/views'; import { localize } from 'vs/nls'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { checkGlobFileExists } from 'vs/workbench/api/common/shared/workspaceContains'; +import { checkGlobFileExists } from 'vs/workbench/services/extensions/common/workspaceContains'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; @@ -46,59 +46,59 @@ export type WalkthroughMetaDataType = Map & { steps: (Omit & { description: string })[] }; export interface IResolvedWalkthrough extends IWalkthrough { - steps: IResolvedWalkthroughStep[] - newItems: boolean - recencyBonus: number - newEntry: boolean + steps: IResolvedWalkthroughStep[]; + newItems: boolean; + recencyBonus: number; + newEntry: boolean; } export interface IWalkthroughStep { - id: string - title: string - description: LinkedText[] - category: string - when: ContextKeyExpression - order: number - completionEvents: string[] + id: string; + title: string; + description: LinkedText[]; + category: string; + when: ContextKeyExpression; + order: number; + completionEvents: string[]; media: - | { type: 'image', path: { hc: URI, light: URI, dark: URI }, altText: string } - | { type: 'svg', path: URI, altText: string } - | { type: 'markdown', path: URI, base: URI, root: URI } + | { type: 'image'; path: { hc: URI; light: URI; dark: URI }; altText: string } + | { type: 'svg'; path: URI; altText: string } + | { type: 'markdown'; path: URI; base: URI; root: URI }; } -type StepProgress = { done: boolean; }; +type StepProgress = { done: boolean }; export interface IResolvedWalkthroughStep extends IWalkthroughStep, StepProgress { } export interface IWalkthroughsService { - _serviceBrand: undefined, + _serviceBrand: undefined; - readonly onDidAddWalkthrough: Event - readonly onDidRemoveWalkthrough: Event - readonly onDidChangeWalkthrough: Event - readonly onDidProgressStep: Event + readonly onDidAddWalkthrough: Event; + readonly onDidRemoveWalkthrough: Event; + readonly onDidChangeWalkthrough: Event; + readonly onDidProgressStep: Event; readonly installedExtensionsRegistered: Promise; - getWalkthroughs(): IResolvedWalkthrough[] - getWalkthrough(id: string): IResolvedWalkthrough + getWalkthroughs(): IResolvedWalkthrough[]; + getWalkthrough(id: string): IResolvedWalkthrough; registerWalkthrough(descriptor: IWalkthroughLoose): void; @@ -210,13 +210,13 @@ export class WalkthroughsService extends Disposable implements IWalkthroughsServ ? { type: 'svg', altText: step.media.altText, - path: convertInternalMediaPathToFileURI(step.media.path).with({ query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcome/gettingStarted/common/media/' + step.media.path }) }) + path: convertInternalMediaPathToFileURI(step.media.path).with({ query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcomeGettingStarted/common/media/' + step.media.path }) }) } : { type: 'markdown', - path: convertInternalMediaPathToFileURI(step.media.path).with({ query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcome/gettingStarted/common/media/' + step.media.path }) }), - base: FileAccess.asFileUri('vs/workbench/contrib/welcome/gettingStarted/common/media/', require), - root: FileAccess.asFileUri('vs/workbench/contrib/welcome/gettingStarted/common/media/', require), + path: convertInternalMediaPathToFileURI(step.media.path).with({ query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcomeGettingStarted/common/media/' + step.media.path }) }), + base: FileAccess.asFileUri('vs/workbench/contrib/welcomeGettingStarted/common/media/', require), + root: FileAccess.asFileUri('vs/workbench/contrib/welcomeGettingStarted/common/media/', require), }, }); }) @@ -280,7 +280,7 @@ export class WalkthroughsService extends Disposable implements IWalkthroughsServ ? URI.parse(path, true) : FileAccess.asFileUri(joinPath(extension.extensionLocation, path)); - const convertExtensionRelativePathsToBrowserURIs = (path: string | { hc: string, dark: string, light: string }): { hc: URI, dark: URI, light: URI } => { + const convertExtensionRelativePathsToBrowserURIs = (path: string | { hc: string; dark: string; light: string }): { hc: URI; dark: URI; light: URI } => { const convertPath = (path: string) => path.startsWith('https://') ? URI.parse(path, true) : FileAccess.asBrowserUri(joinPath(extension.extensionLocation, path)); @@ -308,7 +308,7 @@ export class WalkthroughsService extends Disposable implements IWalkthroughsServ const isNewlyInstalled = !this.metadata.get(categoryID); if (isNewlyInstalled) { - this.metadata.set(categoryID, { firstSeen: +new Date(), stepIDs: walkthrough.steps.map(s => s.id), manaullyOpened: false }); + this.metadata.set(categoryID, { firstSeen: +new Date(), stepIDs: walkthrough.steps?.map(s => s.id) ?? [], manaullyOpened: false }); } const override = await Promise.race([ @@ -327,8 +327,7 @@ export class WalkthroughsService extends Disposable implements IWalkthroughsServ } } - - const steps = walkthrough.steps.map((step, index) => { + const steps = (walkthrough.steps ?? []).map((step, index) => { const description = parseDescription(step.description || ''); const fullyQualifiedID = extension.identifier.value + '#' + walkthrough.id + '#' + step.id; @@ -363,7 +362,7 @@ export class WalkthroughsService extends Disposable implements IWalkthroughsServ // Legacy media config else { - const legacyMedia = step.media as unknown as { path: string, altText: string }; + const legacyMedia = step.media as unknown as { path: string; altText: string }; if (typeof legacyMedia.path === 'string' && legacyMedia.path.endsWith('.md')) { media = { type: 'markdown', @@ -427,7 +426,7 @@ export class WalkthroughsService extends Disposable implements IWalkthroughsServ if (sectionToOpen && this.configurationService.getValue('workbench.welcomePage.walkthroughs.openOnInstall')) { type GettingStartedAutoOpenClassification = { - id: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight', }; + id: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; }; type GettingStartedAutoOpenEvent = { id: string; @@ -662,12 +661,12 @@ const parseDescription = (desc: string): LinkedText[] => desc.split('\n').filter const convertInternalMediaPathToFileURI = (path: string) => path.startsWith('https://') ? URI.parse(path, true) - : FileAccess.asFileUri('vs/workbench/contrib/welcome/gettingStarted/common/media/' + path, require); + : FileAccess.asFileUri('vs/workbench/contrib/welcomeGettingStarted/common/media/' + path, require); const convertInternalMediaPathToBrowserURI = (path: string) => path.startsWith('https://') ? URI.parse(path, true) - : FileAccess.asBrowserUri('vs/workbench/contrib/welcome/gettingStarted/common/media/' + path, require); -const convertInternalMediaPathsToBrowserURIs = (path: string | { hc: string, dark: string, light: string }): { hc: URI, dark: URI, light: URI } => { + : FileAccess.asBrowserUri('vs/workbench/contrib/welcomeGettingStarted/common/media/' + path, require); +const convertInternalMediaPathsToBrowserURIs = (path: string | { hc: string; dark: string; light: string }): { hc: URI; dark: URI; light: URI } => { if (typeof path === 'string') { const converted = convertInternalMediaPathToBrowserURI(path); return { hc: converted, dark: converted, light: converted }; diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.css b/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css similarity index 99% rename from src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.css rename to src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css index 4f49339c6ae..e56244feadd 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.css +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css @@ -757,11 +757,12 @@ vertical-align: middle; } -.monaco-workbench .part.editor>.content .gettingStartedContainer .codicon-close { +.monaco-workbench .part.editor>.content .gettingStartedContainer .hide-category-button { visibility: hidden; } -.monaco-workbench .part.editor>.content .gettingStartedContainer .getting-started-category:hover .codicon-close { +.monaco-workbench .part.editor>.content .gettingStartedContainer .getting-started-category:focus-within .hide-category-button, +.monaco-workbench .part.editor>.content .gettingStartedContainer .getting-started-category:hover .hide-category-button { visibility: visible; } diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/gettingStartedContent.ts b/src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.ts similarity index 91% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/gettingStartedContent.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.ts index 2218e71c907..ab7818d0072 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/common/gettingStartedContent.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/workbench/contrib/welcome/gettingStarted/common/media/example_markdown_media'; -import 'vs/workbench/contrib/welcome/gettingStarted/common/media/notebookProfile'; +import 'vs/workbench/contrib/welcomeGettingStarted/common/media/example_markdown_media'; +import 'vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile'; import { localize } from 'vs/nls'; import { Codicon } from 'vs/base/common/codicons'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; @@ -18,37 +18,37 @@ const intermediateIcon = registerIcon('getting-started-intermediate', Codicon.mo export type BuiltinGettingStartedStep = { - id: string - title: string, - description: string, - completionEvents?: string[] - when?: string, + id: string; + title: string; + description: string; + completionEvents?: string[]; + when?: string; media: - | { type: 'image', path: string | { hc: string, light: string, dark: string }, altText: string } - | { type: 'svg', path: string, altText: string } - | { type: 'markdown', path: string }, + | { type: 'image'; path: string | { hc: string; light: string; dark: string }; altText: string } + | { type: 'svg'; path: string; altText: string } + | { type: 'markdown'; path: string }; }; export type BuiltinGettingStartedCategory = { - id: string - title: string, - description: string, - isFeatured: boolean, - next?: string, - icon: ThemeIcon, - when?: string, + id: string; + title: string; + description: string; + isFeatured: boolean; + next?: string; + icon: ThemeIcon; + when?: string; content: - | { type: 'steps', steps: BuiltinGettingStartedStep[] } + | { type: 'steps'; steps: BuiltinGettingStartedStep[] }; }; export type BuiltinGettingStartedStartEntry = { - id: string - title: string, - description: string, - icon: ThemeIcon, - when?: string, + id: string; + title: string; + description: string; + icon: ThemeIcon; + when?: string; content: - | { type: 'startEntry', command: string } + | { type: 'startEntry'; command: string }; }; type GettingStartedWalkthroughContent = BuiltinGettingStartedCategory[]; @@ -62,7 +62,7 @@ export const startEntries: GettingStartedStartEntryContent = [ icon: Codicon.newFile, content: { type: 'startEntry', - command: 'welcome.showNewFileEntries', + command: 'command:welcome.showNewFileEntries', } }, // { @@ -83,7 +83,7 @@ export const startEntries: GettingStartedStartEntryContent = [ when: '!isWeb && isMac', content: { type: 'startEntry', - command: 'workbench.action.files.openFileFolder', + command: 'command:workbench.action.files.openFileFolder', } }, { @@ -94,7 +94,7 @@ export const startEntries: GettingStartedStartEntryContent = [ when: 'isWeb || !isMac', content: { type: 'startEntry', - command: 'workbench.action.files.openFile', + command: 'command:workbench.action.files.openFile', } }, { @@ -105,7 +105,7 @@ export const startEntries: GettingStartedStartEntryContent = [ when: '!isWeb && !isMac', content: { type: 'startEntry', - command: 'workbench.action.files.openFolder', + command: 'command:workbench.action.files.openFolder', } }, { @@ -113,10 +113,10 @@ export const startEntries: GettingStartedStartEntryContent = [ title: localize('gettingStarted.openFolder.title', "Open Folder..."), description: localize('gettingStarted.openFolder.description', "Open a folder to start working"), icon: Codicon.folderOpened, - when: 'isWeb && workbenchState == \'workspace\'', + when: '!openFolderWorkspaceSupport && workbenchState == \'workspace\'', content: { type: 'startEntry', - command: 'workbench.action.addRootFolder', + command: 'command:workbench.action.addRootFolder', } }, { @@ -127,7 +127,7 @@ export const startEntries: GettingStartedStartEntryContent = [ icon: Codicon.sourceControl, content: { type: 'startEntry', - command: 'git.clone', + command: 'command:git.clone', } }, { @@ -138,7 +138,7 @@ export const startEntries: GettingStartedStartEntryContent = [ icon: Codicon.sourceControl, content: { type: 'startEntry', - command: 'remoteHub.openRepository', + command: 'command:remoteHub.openRepository', } }, { @@ -149,7 +149,29 @@ export const startEntries: GettingStartedStartEntryContent = [ when: 'allWalkthroughsHidden', content: { type: 'startEntry', - command: 'welcome.showAllWalkthroughs', + command: 'command:welcome.showAllWalkthroughs', + } + }, + { + id: 'topLevelVideoTutorials', + title: localize('gettingStarted.topLevelVideoTutorials.title', "Watch Video Tutorials"), + description: localize('gettingStarted.topLevelVideoTutorials.description', "Watch our series of short & practical video tutorials for VS Code's key features."), + icon: Codicon.playCircle, + when: 'config.workbench.welcomePage.experimental.videoTutorials == on', + content: { + type: 'startEntry', + command: 'https://aka.ms/vscode-getting-started-video', + } + }, + { + id: 'topLevelVideoTutorialsExperimental', + title: localize('gettingStarted.topLevelVideoTutorials.title', "Watch Video Tutorials"), + description: localize('gettingStarted.topLevelVideoTutorials.description', "Watch our series of short & practical video tutorials for VS Code's key features."), + when: 'config.workbench.welcomePage.experimental.videoTutorials == experimental', + icon: Codicon.playCircle, + content: { + type: 'startEntry', + command: 'https://aka.ms/vscode-videos', } }, ]; diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/colorTheme.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/colorTheme.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/colorTheme.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/colorTheme.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/commandPalette.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/commandPalette.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/commandPalette.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/commandPalette.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/dark.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/dark.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/dark.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/dark.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/debug.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/debug.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/debug.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/debug.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/example_markdown_media.ts b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/example_markdown_media.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/example_markdown_media.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/example_markdown_media.ts diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/extensions-web.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/extensions-web.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/extensions-web.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/extensions-web.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/extensions.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/extensions.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/extensions.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/extensions.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/git.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/git.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/git.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/git.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/github.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/github.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/github.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/github.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/interactivePlayground.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/interactivePlayground.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/interactivePlayground.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/interactivePlayground.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/languages.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/languages.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/languages.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/languages.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/learn.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/learn.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/learn.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/learn.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/light.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/light.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/light.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/light.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/menuBar.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/menuBar.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/menuBar.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/menuBar.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/monokai.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/monokai.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/monokai.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/monokai.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/more.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/more.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/more.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/more.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/notebookProfile.ts b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/notebookProfile.ts rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile.ts diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/notebookThemes/colab.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookThemes/colab.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/notebookThemes/colab.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookThemes/colab.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/notebookThemes/default.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookThemes/default.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/notebookThemes/default.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookThemes/default.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/notebookThemes/jupyter.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookThemes/jupyter.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/notebookThemes/jupyter.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/notebookThemes/jupyter.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/openFolder.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/openFolder.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/openFolder.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/openFolder.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/quiet-light.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/quiet-light.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/quiet-light.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/quiet-light.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/runTask.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/runTask.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/runTask.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/runTask.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/search.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/search.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/search.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/search.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/settings.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/settings.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/settings.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/settings.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/settingsSync.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/settingsSync.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/settingsSync.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/settingsSync.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/shortcuts.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/shortcuts.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/shortcuts.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/shortcuts.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/sideBySide.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/sideBySide.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/sideBySide.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/sideBySide.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/terminal.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/terminal.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/terminal.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/terminal.svg diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/tutorialVideo.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/tutorialVideo.png similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/tutorialVideo.png rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/tutorialVideo.png diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/common/media/workspaceTrust.svg b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/workspaceTrust.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/gettingStarted/common/media/workspaceTrust.svg rename to src/vs/workbench/contrib/welcomeGettingStarted/common/media/workspaceTrust.svg diff --git a/src/vs/workbench/contrib/welcome/overlay/browser/media/commandpalette-dark.svg b/src/vs/workbench/contrib/welcomeOverlay/browser/media/commandpalette-dark.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/overlay/browser/media/commandpalette-dark.svg rename to src/vs/workbench/contrib/welcomeOverlay/browser/media/commandpalette-dark.svg diff --git a/src/vs/workbench/contrib/welcome/overlay/browser/media/commandpalette.svg b/src/vs/workbench/contrib/welcomeOverlay/browser/media/commandpalette.svg similarity index 100% rename from src/vs/workbench/contrib/welcome/overlay/browser/media/commandpalette.svg rename to src/vs/workbench/contrib/welcomeOverlay/browser/media/commandpalette.svg diff --git a/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.css b/src/vs/workbench/contrib/welcomeOverlay/browser/media/welcomeOverlay.css similarity index 97% rename from src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.css rename to src/vs/workbench/contrib/welcomeOverlay/browser/media/welcomeOverlay.css index a7b446b83a9..32a3bb90fc2 100644 --- a/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.css +++ b/src/vs/workbench/contrib/welcomeOverlay/browser/media/welcomeOverlay.css @@ -149,14 +149,14 @@ left: calc(50% - 193px); width: 386px; height: 197px; - background-image: url('media/commandpalette.svg'); + background-image: url('commandpalette.svg'); background-repeat: no-repeat; background-size: 100%; } .monaco-workbench.vs-dark > .welcomeOverlay > .commandPalettePlaceholder, .monaco-workbench.hc-black > .welcomeOverlay > .commandPalettePlaceholder { - background-image: url('media/commandpalette-dark.svg'); + background-image: url('commandpalette-dark.svg'); } @media screen and (max-width: 880px) { .monaco-workbench > .welcomeOverlay { diff --git a/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts b/src/vs/workbench/contrib/welcomeOverlay/browser/welcomeOverlay.ts similarity index 99% rename from src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts rename to src/vs/workbench/contrib/welcomeOverlay/browser/welcomeOverlay.ts index 671530ca3eb..4b443bbf63e 100644 --- a/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts +++ b/src/vs/workbench/contrib/welcomeOverlay/browser/welcomeOverlay.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./welcomeOverlay'; +import 'vs/css!./media/welcomeOverlay'; import * as dom from 'vs/base/browser/dom'; import { Registry } from 'vs/platform/registry/common/platform'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts b/src/vs/workbench/contrib/welcomePage/browser/welcomePage.contribution.ts similarity index 98% rename from src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts rename to src/vs/workbench/contrib/welcomePage/browser/welcomePage.contribution.ts index 674eade0db1..41dc79b8bb1 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.contribution.ts +++ b/src/vs/workbench/contrib/welcomePage/browser/welcomePage.contribution.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { Registry } from 'vs/platform/registry/common/platform'; -import { WelcomePageContribution, } from 'vs/workbench/contrib/welcome/page/browser/welcomePage'; +import { WelcomePageContribution, } from 'vs/workbench/contrib/welcomePage/browser/welcomePage'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/src/vs/workbench/contrib/welcomePage/browser/welcomePage.ts similarity index 98% rename from src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts rename to src/vs/workbench/contrib/welcomePage/browser/welcomePage.ts index 97049439ddb..3d7a08e1b30 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts +++ b/src/vs/workbench/contrib/welcomePage/browser/welcomePage.ts @@ -18,7 +18,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { joinPath } from 'vs/base/common/resources'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; -import { GettingStartedInput, gettingStartedInputTypeId } from 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStartedInput'; +import { GettingStartedInput, gettingStartedInputTypeId } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { getTelemetryLevel } from 'vs/platform/telemetry/common/telemetryUtils'; @@ -26,7 +26,7 @@ import { TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; import { IProductService } from 'vs/platform/product/common/productService'; export const restoreWalkthroughsConfigurationKey = 'workbench.welcomePage.restorableWalkthroughs'; -export type RestoreWalkthroughsConfigurationValue = { folder: string, category?: string, step?: string, }; +export type RestoreWalkthroughsConfigurationValue = { folder: string; category?: string; step?: string }; const configurationKey = 'workbench.startupEditor'; const oldConfigurationKey = 'workbench.welcome.enabled'; diff --git a/src/vs/workbench/contrib/welcome/common/newFile.contribution.ts b/src/vs/workbench/contrib/welcomeViews/common/newFile.contribution.ts similarity index 97% rename from src/vs/workbench/contrib/welcome/common/newFile.contribution.ts rename to src/vs/workbench/contrib/welcomeViews/common/newFile.contribution.ts index 5eaa329ff5f..633a93550e2 100644 --- a/src/vs/workbench/contrib/welcome/common/newFile.contribution.ts +++ b/src/vs/workbench/contrib/welcomeViews/common/newFile.contribution.ts @@ -27,7 +27,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: 'welcome.showNewFileEntries', - title: localize('welcome.newFile', "New File..."), + title: { value: localize('welcome.newFile', "New File..."), original: 'New File...' }, category, f1: true, keybinding: { @@ -48,7 +48,7 @@ registerAction2(class extends Action2 { } }); -type NewFileItem = { commandID: string, title: string, from: string, group: string }; +type NewFileItem = { commandID: string; title: string; from: string; group: string }; class NewFileTemplatesManager extends Disposable { static Instance: NewFileTemplatesManager | undefined; diff --git a/src/vs/workbench/contrib/welcome/common/viewsWelcome.contribution.ts b/src/vs/workbench/contrib/welcomeViews/common/viewsWelcome.contribution.ts similarity index 91% rename from src/vs/workbench/contrib/welcome/common/viewsWelcome.contribution.ts rename to src/vs/workbench/contrib/welcomeViews/common/viewsWelcome.contribution.ts index c63a5c8632f..e68958ca71b 100644 --- a/src/vs/workbench/contrib/welcome/common/viewsWelcome.contribution.ts +++ b/src/vs/workbench/contrib/welcomeViews/common/viewsWelcome.contribution.ts @@ -7,8 +7,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { ViewsWelcomeContribution } from 'vs/workbench/contrib/welcome/common/viewsWelcomeContribution'; -import { ViewsWelcomeExtensionPoint, viewsWelcomeExtensionPointDescriptor } from 'vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint'; +import { ViewsWelcomeContribution } from 'vs/workbench/contrib/welcomeViews/common/viewsWelcomeContribution'; +import { ViewsWelcomeExtensionPoint, viewsWelcomeExtensionPointDescriptor } from 'vs/workbench/contrib/welcomeViews/common/viewsWelcomeExtensionPoint'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; const extensionPoint = ExtensionsRegistry.registerExtensionPoint(viewsWelcomeExtensionPointDescriptor); diff --git a/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution.ts b/src/vs/workbench/contrib/welcomeViews/common/viewsWelcomeContribution.ts similarity index 98% rename from src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution.ts rename to src/vs/workbench/contrib/welcomeViews/common/viewsWelcomeContribution.ts index 91f6b79e2e5..e296e0d82a1 100644 --- a/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution.ts +++ b/src/vs/workbench/contrib/welcomeViews/common/viewsWelcomeContribution.ts @@ -68,7 +68,7 @@ export class ViewsWelcomeContribution extends Disposable implements IWorkbenchCo } } -function parseGroupAndOrder(welcome: ViewWelcome, contribution: IExtensionPointUser): { group: string | undefined, order: number | undefined } { +function parseGroupAndOrder(welcome: ViewWelcome, contribution: IExtensionPointUser): { group: string | undefined; order: number | undefined } { let group: string | undefined; let order: number | undefined; diff --git a/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint.ts b/src/vs/workbench/contrib/welcomeViews/common/viewsWelcomeExtensionPoint.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint.ts rename to src/vs/workbench/contrib/welcomeViews/common/viewsWelcomeExtensionPoint.ts diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough.ts similarity index 91% rename from src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough.ts rename to src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough.ts index 05447bcd366..44e06a5111f 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/workbench/contrib/welcome/walkThrough/browser/editor/vs_code_editor_walkthrough'; +import 'vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough'; import { localize } from 'vs/nls'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Action } from 'vs/base/common/actions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { WalkThroughInput, WalkThroughInputOptions } from 'vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput'; +import { WalkThroughInput, WalkThroughInputOptions } from 'vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughInput'; import { FileAccess, Schemas } from 'vs/base/common/network'; import { IEditorSerializer } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; @@ -21,7 +21,7 @@ const inputOptions: WalkThroughInputOptions = { resource: FileAccess.asBrowserUri('./vs_code_editor_walkthrough.md', require) .with({ scheme: Schemas.walkThrough, - query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcome/walkThrough/browser/editor/vs_code_editor_walkthrough' }) + query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough' }) }), telemetryFrom: 'walkThrough' }; diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/editor/vs_code_editor_walkthrough.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/walkThrough/browser/editor/vs_code_editor_walkthrough.ts rename to src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.css b/src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css similarity index 100% rename from src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.css rename to src/vs/workbench/contrib/welcomeWalkthrough/browser/media/walkThroughPart.css diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThrough.contribution.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThrough.contribution.ts similarity index 85% rename from src/vs/workbench/contrib/welcome/walkThrough/browser/walkThrough.contribution.ts rename to src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThrough.contribution.ts index 2105734a51f..0c1668932d8 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThrough.contribution.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThrough.contribution.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import { WalkThroughInput } from 'vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput'; -import { WalkThroughPart } from 'vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart'; -import { WalkThroughArrowUp, WalkThroughArrowDown, WalkThroughPageUp, WalkThroughPageDown } from 'vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions'; -import { WalkThroughSnippetContentProvider } from 'vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider'; -import { EditorWalkThroughAction, EditorWalkThroughInputSerializer } from 'vs/workbench/contrib/welcome/walkThrough/browser/editor/editorWalkThrough'; +import { WalkThroughInput } from 'vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughInput'; +import { WalkThroughPart } from 'vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart'; +import { WalkThroughArrowUp, WalkThroughArrowDown, WalkThroughPageUp, WalkThroughPageDown } from 'vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughActions'; +import { WalkThroughSnippetContentProvider } from 'vs/workbench/contrib/welcomeWalkthrough/common/walkThroughContentProvider'; +import { EditorWalkThroughAction, EditorWalkThroughInputSerializer } from 'vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorExtensions, IEditorFactoryRegistry } from 'vs/workbench/common/editor'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughActions.ts similarity index 98% rename from src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions.ts rename to src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughActions.ts index cf4da0d6a33..0be672b8252 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughActions.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughActions.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { WalkThroughPart, WALK_THROUGH_FOCUS } from 'vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart'; +import { WalkThroughPart, WALK_THROUGH_FOCUS } from 'vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart'; import { ICommandAndKeybindingRule, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughInput.ts similarity index 95% rename from src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput.ts rename to src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughInput.ts index 6258caecf57..84477197c4a 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughInput.ts @@ -8,10 +8,10 @@ import { EditorModel } from 'vs/workbench/common/editor/editorModel'; import { URI } from 'vs/base/common/uri'; import { DisposableStore, IReference } from 'vs/base/common/lifecycle'; import { ITextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService'; -import * as marked from 'vs/base/common/marked/marked'; +import { marked } from 'vs/base/common/marked/marked'; import { Schemas } from 'vs/base/common/network'; import { isEqual } from 'vs/base/common/resources'; -import { requireToContent } from 'vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider'; +import { requireToContent } from 'vs/workbench/contrib/welcomeWalkthrough/common/walkThroughContentProvider'; import { Dimension } from 'vs/base/browser/dom'; import { EditorInputCapabilities, IUntypedEditorInput } from 'vs/workbench/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -86,7 +86,7 @@ export class WalkThroughInput extends EditorInput { return this.options.telemetryFrom; } - override getTelemetryDescriptor(): { [key: string]: unknown; } { + override getTelemetryDescriptor(): { [key: string]: unknown } { const descriptor = super.getTelemetryDescriptor(); descriptor['target'] = this.getTelemetryFrom(); /* __GDPR__FRAGMENT__ diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts similarity index 92% rename from src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts rename to src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts index 73fcc06c5a0..554e5a11150 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./walkThroughPart'; +import 'vs/css!./media/walkThroughPart'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { EventType as TouchEventType, GestureEvent, Gesture } from 'vs/base/browser/touch'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; @@ -13,7 +13,7 @@ import { IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/com import { IEditorMemento, IEditorOpenContext } from 'vs/workbench/common/editor'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { WalkThroughInput } from 'vs/workbench/contrib/welcome/walkThrough/browser/walkThroughInput'; +import { WalkThroughInput } from 'vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughInput'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; @@ -23,13 +23,12 @@ import { localize } from 'vs/nls'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Event } from 'vs/base/common/event'; import { isObject } from 'vs/base/common/types'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IEditorOptions as ICodeEditorOptions, EditorOption } from 'vs/editor/common/config/editorOptions'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor, focusBorder, textLinkForeground, textLinkActiveForeground, textPreformatForeground, contrastBorder, textBlockQuoteBackground, textBlockQuoteBorder } from 'vs/platform/theme/common/colorRegistry'; -import { getExtraColor } from 'vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils'; +import { getExtraColor } from 'vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils'; import { UILabelProvider } from 'vs/base/common/keybindingLabels'; import { OS, OperatingSystem } from 'vs/base/common/platform'; import { deepClone } from 'vs/base/common/objects'; @@ -364,39 +363,6 @@ export class WalkThroughPart extends EditorPane { editor.updateOptions(this.getEditorOptions(snippet.textEditorModel.getLanguageId())); } })); - - type WalkThroughSnippetInteractionClassification = { - from?: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - type: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - snippet: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - }; - type WalkThroughSnippetInteractionEvent = { - from?: string, - type: string, - snippet: number - }; - - this.contentDisposables.push(Event.once(editor.onMouseDown)(() => { - this.telemetryService.publicLog2('walkThroughSnippetInteraction', { - from: this.input instanceof WalkThroughInput ? this.input.getTelemetryFrom() : undefined, - type: 'mouseDown', - snippet: i - }); - })); - this.contentDisposables.push(Event.once(editor.onKeyDown)(() => { - this.telemetryService.publicLog2('walkThroughSnippetInteraction', { - from: this.input instanceof WalkThroughInput ? this.input.getTelemetryFrom() : undefined, - type: 'keyDown', - snippet: i - }); - })); - this.contentDisposables.push(Event.once(editor.onDidChangeModelContent)(() => { - this.telemetryService.publicLog2('walkThroughSnippetInteraction', { - from: this.input instanceof WalkThroughInput ? this.input.getTelemetryFrom() : undefined, - type: 'changeModelContent', - snippet: i - }); - })); }); this.updateSizeClasses(); this.multiCursorModifier(); diff --git a/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider.ts b/src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughContentProvider.ts similarity index 94% rename from src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider.ts rename to src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughContentProvider.ts index d3b20e2d0e1..94a4879c2f9 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughContentProvider.ts @@ -7,9 +7,9 @@ import { URI } from 'vs/base/common/uri'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IModelService } from 'vs/editor/common/services/model'; import { ITextModel, DefaultEndOfLine, EndOfLinePreference, ITextBufferFactory } from 'vs/editor/common/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import * as marked from 'vs/base/common/marked/marked'; +import { marked } from 'vs/base/common/marked/marked'; import { Schemas } from 'vs/base/common/network'; import { Range } from 'vs/editor/common/core/range'; import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; @@ -71,7 +71,7 @@ export class WalkThroughSnippetContentProvider implements ITextModelContentProvi const renderer = new marked.Renderer(); renderer.code = (code, lang) => { i++; - const languageId = this.languageService.getLanguageIdByLanguageName(lang) || ''; + const languageId = typeof lang === 'string' ? this.languageService.getLanguageIdByLanguageName(lang) || '' : ''; const languageSelection = this.languageService.createById(languageId); // Create all models for this resource in one go... we'll need them all and we don't want to re-parse markdown each time const model = this.modelService.createModel(code, languageSelection, resource.with({ fragment: `${i}.${lang}` })); diff --git a/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils.ts b/src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils.ts similarity index 100% rename from src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils.ts rename to src/vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils.ts diff --git a/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.css b/src/vs/workbench/contrib/workspace/browser/media/workspaceTrustEditor.css similarity index 100% rename from src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.css rename to src/vs/workbench/contrib/workspace/browser/media/workspaceTrustEditor.css diff --git a/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts b/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts index 2a61fa5e5c7..7aca0b78959 100644 --- a/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts +++ b/src/vs/workbench/contrib/workspace/browser/workspace.contribution.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./workspaceTrustEditor'; +import 'vs/css!./media/workspaceTrustEditor'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; @@ -17,7 +17,6 @@ import { IWorkspaceTrustEnablementService, IWorkspaceTrustManagementService, IWo import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { Codicon } from 'vs/base/common/codicons'; -import { ThemeColor } from 'vs/workbench/api/common/extHostTypes'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ContextKeyExpr, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -29,20 +28,18 @@ import { WORKSPACE_TRUST_BANNER, WORKSPACE_TRUST_EMPTY_WINDOW, WORKSPACE_TRUST_E import { IEditorSerializer, IEditorFactoryRegistry, EditorExtensions } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IWorkspaceContextService, IWorkspaceFoldersWillChangeEvent, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IWorkspaceContextService, IWorkspaceFoldersWillChangeEvent, toWorkspaceIdentifier, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { isWeb } from 'vs/base/common/platform'; import { IsWebContext } from 'vs/platform/contextkey/common/contextkeys'; import { dirname, resolve } from 'vs/base/common/path'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; -import { ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_FOREGROUND } from 'vs/workbench/common/theme'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { splitName } from 'vs/base/common/labels'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IBannerItem, IBannerService } from 'vs/workbench/services/banner/browser/bannerService'; -import { isVirtualWorkspace } from 'vs/platform/remote/common/remoteHosts'; +import { isVirtualWorkspace } from 'vs/platform/workspace/common/virtualWorkspace'; import { LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { WORKSPACE_TRUST_SETTING_TAG } from 'vs/workbench/contrib/preferences/common/preferences'; @@ -88,7 +85,6 @@ export class WorkspaceTrustRequestHandler extends Disposable implements IWorkben constructor( @IDialogService private readonly dialogService: IDialogService, @ICommandService private readonly commandService: ICommandService, - @ITelemetryService private readonly telemetryService: ITelemetryService, @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService, @IWorkspaceTrustRequestService private readonly workspaceTrustRequestService: IWorkspaceTrustRequestService) { @@ -115,7 +111,6 @@ export class WorkspaceTrustRequestHandler extends Disposable implements IWorkben ]; // Dialog - const startTime = Date.now(); const result = await this.dialogService.show( Severity.Info, localize('openLooseFileMesssage', "Do you trust the authors of these files?"), @@ -132,9 +127,6 @@ export class WorkspaceTrustRequestHandler extends Disposable implements IWorkben } }); - // Log dialog result - this.telemetryService.publicLog2('workspaceTrustOpenFileRequestDialogResult', { duration: Date.now() - startTime, ...result }); - switch (result.choice) { case 0: await this.workspaceTrustRequestService.completeOpenFilesTrustRequest(WorkspaceTrustUriResponse.Open, !!result.checkboxChecked); @@ -171,7 +163,6 @@ export class WorkspaceTrustRequestHandler extends Disposable implements IWorkben } // Dialog - const startTime = Date.now(); const result = await this.dialogService.show( Severity.Info, title, @@ -188,8 +179,6 @@ export class WorkspaceTrustRequestHandler extends Disposable implements IWorkben } ); - // Log dialog result - this.telemetryService.publicLog2('workspaceTrustRequestDialogResult', { duration: Date.now() - startTime, ...result }); // Dialog result switch (buttons[result.choice].type) { @@ -229,7 +218,6 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon @IConfigurationService private readonly configurationService: IConfigurationService, @IStatusbarService private readonly statusbarService: IStatusbarService, @IStorageService private readonly storageService: IStorageService, - @ITelemetryService private readonly telemetryService: ITelemetryService, @IWorkspaceTrustRequestService private readonly workspaceTrustRequestService: IWorkspaceTrustRequestService, @IBannerService private readonly bannerService: IBannerService, @ILabelService private readonly labelService: ILabelService, @@ -280,7 +268,6 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon const addedFoldersTrustInfo = await Promise.all(e.changes.added.map(folder => this.workspaceTrustManagementService.getUriTrustInfo(folder.uri))); if (!addedFoldersTrustInfo.map(info => info.trusted).every(trusted => trusted)) { - const startTime = Date.now(); const result = await this.dialogService.show( Severity.Info, localize('addWorkspaceFolderMessage', "Do you trust the authors of the files in this folder?"), @@ -292,9 +279,6 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon } ); - // Log dialog result - this.telemetryService.publicLog2('workspaceTrustAddWorkspaceFolderDialogResult', { duration: Date.now() - startTime, ...result }); - // Mark added/changed folders as trusted await this.workspaceTrustManagementService.setUrisTrust(addedFoldersTrustInfo.map(i => i.uri), result.choice === 0); } @@ -307,6 +291,35 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon this._register(this.workspaceTrustManagementService.onDidChangeTrust(trusted => { this.updateWorkbenchIndicators(trusted); })); + + this._register(this.workspaceTrustRequestService.onDidInitiateWorkspaceTrustRequestOnStartup(() => { + const title = this.useWorkspaceLanguage ? + localize('workspaceTrust', "Do you trust the authors of the files in this workspace?") : + localize('folderTrust', "Do you trust the authors of the files in this folder?"); + + let checkboxText: string | undefined; + const workspaceIdentifier = toWorkspaceIdentifier(this.workspaceContextService.getWorkspace())!; + const isSingleFolderWorkspace = isSingleFolderWorkspaceIdentifier(workspaceIdentifier); + if (this.workspaceTrustManagementService.canSetParentFolderTrust()) { + const { name } = splitName(splitName((workspaceIdentifier as ISingleFolderWorkspaceIdentifier).uri.fsPath).parentPath); + checkboxText = localize('checkboxString', "Trust the authors of all files in the parent folder '{0}'", name); + } + + // Show Workspace Trust Start Dialog + this.doShowModal( + title, + { label: localize('trustOption', "Yes, I trust the authors"), sublabel: isSingleFolderWorkspace ? localize('trustFolderOptionDescription', "Trust folder and enable all features") : localize('trustWorkspaceOptionDescription', "Trust workspace and enable all features") }, + { label: localize('dontTrustOption', "No, I don't trust the authors"), sublabel: isSingleFolderWorkspace ? localize('dontTrustFolderOptionDescription', "Browse folder in restricted mode") : localize('dontTrustWorkspaceOptionDescription', "Browse workspace in restricted mode") }, + [ + !isSingleFolderWorkspace ? + localize('workspaceStartupTrustDetails', "{0} provides features that may automatically execute files in this workspace.", this.productService.nameShort) : + localize('folderStartupTrustDetails', "{0} provides features that may automatically execute files in this folder.", this.productService.nameShort), + localize('startupTrustRequestLearnMore', "If you don't trust the authors of these files, we recommend to continue in restricted mode as the files may be malicious. See [our docs](https://aka.ms/vscode-workspace-trust) to learn more."), + `\`${this.labelService.getWorkspaceLabel(workspaceIdentifier, { verbose: true })}\``, + ], + checkboxText + ); + })); } private updateWorkbenchIndicators(trusted: boolean): void { @@ -325,8 +338,7 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon //#region Dialog - private async doShowModal(question: string, trustedOption: { label: string, sublabel: string }, untrustedOption: { label: string, sublabel: string }, markdownStrings: string[], trustParentString?: string): Promise { - const startTime = Date.now(); + private async doShowModal(question: string, trustedOption: { label: string; sublabel: string }, untrustedOption: { label: string; sublabel: string }, markdownStrings: string[], trustParentString?: string): Promise { const result = await this.dialogService.show( Severity.Info, question, @@ -350,9 +362,6 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon } ); - // Log dialog result - this.telemetryService.publicLog2('workspaceTrustStartupDialogResult', { duration: Date.now() - startTime, ...result }); - // Dialog result switch (result.choice) { case 0: @@ -404,32 +413,8 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon return; } - const title = this.useWorkspaceLanguage ? - localize('workspaceTrust', "Do you trust the authors of the files in this workspace?") : - localize('folderTrust', "Do you trust the authors of the files in this folder?"); - - let checkboxText: string | undefined; - const workspaceIdentifier = toWorkspaceIdentifier(this.workspaceContextService.getWorkspace())!; - const isSingleFolderWorkspace = isSingleFolderWorkspaceIdentifier(workspaceIdentifier); - if (this.workspaceTrustManagementService.canSetParentFolderTrust()) { - const { name } = splitName(splitName((workspaceIdentifier as ISingleFolderWorkspaceIdentifier).uri.fsPath).parentPath); - checkboxText = localize('checkboxString', "Trust the authors of all files in the parent folder '{0}'", name); - } - - // Show Workspace Trust Start Dialog - this.doShowModal( - title, - { label: localize('trustOption', "Yes, I trust the authors"), sublabel: isSingleFolderWorkspace ? localize('trustFolderOptionDescription', "Trust folder and enable all features") : localize('trustWorkspaceOptionDescription', "Trust workspace and enable all features") }, - { label: localize('dontTrustOption', "No, I don't trust the authors"), sublabel: isSingleFolderWorkspace ? localize('dontTrustFolderOptionDescription', "Browse folder in restricted mode") : localize('dontTrustWorkspaceOptionDescription', "Browse workspace in restricted mode") }, - [ - !isSingleFolderWorkspace ? - localize('workspaceStartupTrustDetails', "{0} provides features that may automatically execute files in this workspace.", this.productService.nameShort) : - localize('folderStartupTrustDetails', "{0} provides features that may automatically execute files in this folder.", this.productService.nameShort), - localize('startupTrustRequestLearnMore', "If you don't trust the authors of these files, we recommend to continue in restricted mode as the files may be malicious. See [our docs](https://aka.ms/vscode-workspace-trust) to learn more."), - `\`${this.labelService.getWorkspaceLabel(workspaceIdentifier, { verbose: true })}\``, - ], - checkboxText - ); + // Use the workspace trust request service to show modal dialog + this.workspaceTrustRequestService.requestWorkspaceTrustOnStartup(); } private get startupPromptSetting(): 'always' | 'once' | 'never' { @@ -522,8 +507,9 @@ export class WorkspaceTrustUXHandler extends Disposable implements IWorkbenchCon private getStatusbarEntry(trusted: boolean): IStatusbarEntry { const text = workspaceTrustToString(trusted); - const backgroundColor = new ThemeColor(STATUS_BAR_PROMINENT_ITEM_BACKGROUND); - const color = new ThemeColor(STATUS_BAR_PROMINENT_ITEM_FOREGROUND); + + const backgroundColor = { id: STATUS_BAR_PROMINENT_ITEM_BACKGROUND }; + const color = { id: STATUS_BAR_PROMINENT_ITEM_FOREGROUND }; let ariaLabel = ''; let toolTip: IMarkdownString | string | undefined; @@ -758,31 +744,13 @@ Registry.as(ConfigurationExtensions.Configuration) } }); - -/** - * Telemetry - */ -type WorkspaceTrustDialogResultEventClassification = { - duration: { classification: 'SystemMetaData', purpose: 'FeatureInsight', expiration: '1.64', isMeasurement: true }; - choice: { classification: 'SystemMetaData', purpose: 'FeatureInsight', expiration: '1.64', isMeasurement: true }; - checkboxChecked?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', expiration: '1.64', isMeasurement: true }; -}; - -type WorkspaceTrustDialogResultEvent = { - duration: number; - choice: number; - checkboxChecked?: boolean; -}; - class WorkspaceTrustTelemetryContribution extends Disposable implements IWorkbenchContribution { constructor( @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @IExtensionService private readonly extensionService: IExtensionService, @ITelemetryService private readonly telemetryService: ITelemetryService, @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, @IWorkspaceTrustEnablementService private readonly workspaceTrustEnablementService: IWorkspaceTrustEnablementService, @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService, - @IWorkspaceTrustRequestService private readonly workspaceTrustRequestService: IWorkspaceTrustRequestService ) { super(); @@ -792,7 +760,6 @@ class WorkspaceTrustTelemetryContribution extends Disposable implements IWorkben this.logWorkspaceTrust(this.workspaceTrustManagementService.isWorkspaceTrusted()); this._register(this.workspaceTrustManagementService.onDidChangeTrust(isTrusted => this.logWorkspaceTrust(isTrusted))); - this._register(this.workspaceTrustRequestService.onDidInitiateWorkspaceTrustRequest(_ => this.logWorkspaceTrustRequest())); }); } @@ -801,11 +768,11 @@ class WorkspaceTrustTelemetryContribution extends Disposable implements IWorkben const disabledByCliFlag = this.environmentService.disableWorkspaceTrust; type WorkspaceTrustDisabledEventClassification = { - reason: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + reason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; type WorkspaceTrustDisabledEvent = { - reason: 'setting' | 'cli', + reason: 'setting' | 'cli'; }; this.telemetryService.publicLog2('workspaceTrustDisabled', { @@ -815,11 +782,11 @@ class WorkspaceTrustTelemetryContribution extends Disposable implements IWorkben } type WorkspaceTrustInfoEventClassification = { - trustedFoldersCount: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + trustedFoldersCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; type WorkspaceTrustInfoEvent = { - trustedFoldersCount: number, + trustedFoldersCount: number; }; this.telemetryService.publicLog2('workspaceTrustFolderCounts', { @@ -833,13 +800,13 @@ class WorkspaceTrustTelemetryContribution extends Disposable implements IWorkben } type WorkspaceTrustStateChangedEvent = { - workspaceId: string, - isTrusted: boolean + workspaceId: string; + isTrusted: boolean; }; type WorkspaceTrustStateChangedEventClassification = { - workspaceId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - isTrusted: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + workspaceId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + isTrusted: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; this.telemetryService.publicLog2('workspaceTrustStateChanged', { @@ -849,15 +816,15 @@ class WorkspaceTrustTelemetryContribution extends Disposable implements IWorkben if (isTrusted) { type WorkspaceTrustFolderInfoEventClassification = { - trustedFolderDepth: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - workspaceFolderDepth: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - delta: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + trustedFolderDepth: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + workspaceFolderDepth: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + delta: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; type WorkspaceTrustFolderInfoEvent = { - trustedFolderDepth: number, - workspaceFolderDepth: number, - delta: number + trustedFolderDepth: number; + workspaceFolderDepth: number; + delta: number; }; const getDepth = (folder: string): number => { @@ -886,27 +853,6 @@ class WorkspaceTrustTelemetryContribution extends Disposable implements IWorkben } } } - - private async logWorkspaceTrustRequest(): Promise { - if (!this.workspaceTrustEnablementService.isWorkspaceTrustEnabled()) { - return; - } - - type WorkspaceTrustRequestedEventClassification = { - workspaceId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - extensions: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - }; - - type WorkspaceTrustRequestedEvent = { - workspaceId: string, - extensions: string[] - }; - - this.telemetryService.publicLog2('workspaceTrustRequested', { - workspaceId: this.workspaceContextService.getWorkspace().id, - extensions: (await this.extensionService.getExtensions()).filter(ext => !!ext.capabilities?.untrustedWorkspaces).map(ext => ext.identifier.value) - }); - } } Registry.as(WorkbenchExtensions.Workbench) diff --git a/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts b/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts index 405141da521..5aae1567d83 100644 --- a/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts +++ b/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts @@ -30,15 +30,14 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { WorkbenchTable } from 'vs/platform/list/browser/listService'; import { Link } from 'vs/platform/opener/browser/link'; import { Registry } from 'vs/platform/registry/common/platform'; -import { isVirtualResource, isVirtualWorkspace } from 'vs/platform/remote/common/remoteHosts'; +import { isVirtualResource, isVirtualWorkspace } from 'vs/platform/workspace/common/virtualWorkspace'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { buttonBackground, buttonSecondaryBackground, editorErrorForeground } from 'vs/platform/theme/common/colorRegistry'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceContextService, toWorkspaceIdentifier, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { attachButtonStyler, attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; -import { ISingleFolderWorkspaceIdentifier, toWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; import { IEditorOpenContext } from 'vs/workbench/common/editor'; import { ChoiceAction } from 'vs/workbench/common/notifications'; @@ -1096,7 +1095,7 @@ export class WorkspaceTrustEditor extends EditorPane { } } - private layoutParticipants: { layout: () => void; }[] = []; + private layoutParticipants: { layout: () => void }[] = []; layout(dimension: Dimension): void { if (!this.isVisible()) { return; diff --git a/src/vs/workbench/contrib/workspaces/browser/workspaces.contribution.ts b/src/vs/workbench/contrib/workspaces/browser/workspaces.contribution.ts index 8bb7ed829e5..8b0a16860ac 100644 --- a/src/vs/workbench/contrib/workspaces/browser/workspaces.contribution.ts +++ b/src/vs/workbench/contrib/workspaces/browser/workspaces.contribution.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { hasWorkspaceFileExtension, IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { Disposable } from 'vs/base/common/lifecycle'; import { IFileService } from 'vs/platform/files/common/files'; import { INeverShowAgainOptions, INotificationService, NeverShowAgainScope, Severity } from 'vs/platform/notification/common/notification'; @@ -15,9 +15,8 @@ import { URI } from 'vs/base/common/uri'; import { joinPath } from 'vs/base/common/resources'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { hasWorkspaceFileExtension } from 'vs/platform/workspaces/common/workspaces'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { isVirtualWorkspace } from 'vs/platform/remote/common/remoteHosts'; +import { isVirtualWorkspace } from 'vs/platform/workspace/common/virtualWorkspace'; /** * A workbench contribution that will look for `.code-workspace` files in the root of the diff --git a/src/vs/workbench/electron-sandbox/actions/windowActions.ts b/src/vs/workbench/electron-sandbox/actions/windowActions.ts index 23d4b0a40b5..9111e3e323f 100644 --- a/src/vs/workbench/electron-sandbox/actions/windowActions.ts +++ b/src/vs/workbench/electron-sandbox/actions/windowActions.ts @@ -11,7 +11,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { getZoomLevel } from 'vs/base/browser/browser'; import { FileKind } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IQuickInputService, IQuickInputButton } from 'vs/platform/quickinput/common/quickInput'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { ICommandHandler } from 'vs/platform/commands/common/commands'; @@ -19,7 +19,7 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { Codicon } from 'vs/base/common/codicons'; -import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { Action2, IAction2Options, MenuId } from 'vs/platform/actions/common/actions'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; diff --git a/src/vs/workbench/electron-sandbox/desktop.contribution.ts b/src/vs/workbench/electron-sandbox/desktop.contribution.ts index 67218f026b8..c939e4c6c80 100644 --- a/src/vs/workbench/electron-sandbox/desktop.contribution.ts +++ b/src/vs/workbench/electron-sandbox/desktop.contribution.ts @@ -20,7 +20,7 @@ import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { InstallShellScriptAction, UninstallShellScriptAction } from 'vs/workbench/electron-sandbox/actions/installActions'; -import { EditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench/common/editor'; +import { EditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench/common/contextkeys'; import { TELEMETRY_SETTING_ID } from 'vs/platform/telemetry/common/telemetry'; // Actions diff --git a/src/vs/workbench/electron-sandbox/desktop.main.ts b/src/vs/workbench/electron-sandbox/desktop.main.ts index 97af04c62fd..0e904ced751 100644 --- a/src/vs/workbench/electron-sandbox/desktop.main.ts +++ b/src/vs/workbench/electron-sandbox/desktop.main.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import product from 'vs/platform/product/common/product'; -import { zoomLevelToZoomFactor } from 'vs/platform/windows/common/windows'; +import { INativeWindowConfiguration, zoomLevelToZoomFactor } from 'vs/platform/windows/common/windows'; import { Workbench } from 'vs/workbench/browser/workbench'; import { NativeWindow } from 'vs/workbench/electron-sandbox/window'; import { setZoomLevel, setZoomFactor, setFullscreen } from 'vs/base/browser/browser'; @@ -12,12 +12,11 @@ import { domContentLoaded } from 'vs/base/browser/dom'; import { onUnexpectedError } from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; -import { INativeWorkbenchConfiguration, INativeWorkbenchEnvironmentService, NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; +import { INativeWorkbenchEnvironmentService, NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceInitializationPayload, reviveIdentifier } from 'vs/platform/workspaces/common/workspaces'; -import { ILoggerService, ILogService } from 'vs/platform/log/common/log'; +import { ILoggerService, ILogService, LogLevel } from 'vs/platform/log/common/log'; import { NativeStorageService } from 'vs/platform/storage/electron-sandbox/storageService'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IAnyWorkspaceIdentifier, reviveIdentifier } from 'vs/platform/workspace/common/workspace'; import { IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -47,7 +46,7 @@ import { IWorkspaceTrustEnablementService, IWorkspaceTrustManagementService } fr import { registerWindowDriver } from 'vs/platform/driver/electron-sandbox/driver'; import { safeStringify } from 'vs/base/common/objects'; import { ISharedProcessWorkerWorkbenchService, SharedProcessWorkerWorkbenchService } from 'vs/workbench/services/sharedProcess/electron-sandbox/sharedProcessWorkerWorkbenchService'; -import { isMacintosh } from 'vs/base/common/platform'; +import { isCI, isMacintosh } from 'vs/base/common/platform'; import { Schemas } from 'vs/base/common/network'; import { DiskFileSystemProvider } from 'vs/workbench/services/files/electron-sandbox/diskFileSystemProvider'; import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataProvider'; @@ -55,7 +54,7 @@ import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataPr export class DesktopMain extends Disposable { constructor( - protected readonly configuration: INativeWorkbenchConfiguration + private readonly configuration: INativeWindowConfiguration ) { super(); @@ -117,9 +116,6 @@ export class DesktopMain extends Disposable { // Window this._register(instantiationService.createInstance(NativeWindow)); - // Logging - services.logService.trace('workbench configuration', safeStringify(this.configuration)); - // Driver if (this.configuration.driver) { instantiationService.invokeFunction(async accessor => this._register(await registerWindowDriver(accessor, this.configuration.windowId))); @@ -143,7 +139,7 @@ export class DesktopMain extends Disposable { this._register(workbench.onDidShutdown(() => this.dispose())); } - private async initServices(): Promise<{ serviceCollection: ServiceCollection, logService: ILogService, storageService: NativeStorageService }> { + private async initServices(): Promise<{ serviceCollection: ServiceCollection; logService: ILogService; storageService: NativeStorageService }> { const serviceCollection = new ServiceCollection(); @@ -174,12 +170,18 @@ export class DesktopMain extends Disposable { // Logger const logLevelChannelClient = new LogLevelChannelClient(mainProcessService.getChannel('logLevel')); - const loggerService = new LoggerChannelClient(environmentService.configuration.logLevel, logLevelChannelClient.onDidChangeLogLevel, mainProcessService.getChannel('logger')); + const loggerService = new LoggerChannelClient(this.configuration.logLevel, logLevelChannelClient.onDidChangeLogLevel, mainProcessService.getChannel('logger')); serviceCollection.set(ILoggerService, loggerService); // Log - const logService = this._register(new NativeLogService(`renderer${this.configuration.windowId}`, environmentService.configuration.logLevel, loggerService, logLevelChannelClient, environmentService)); + const logService = this._register(new NativeLogService(`renderer${this.configuration.windowId}`, this.configuration.logLevel, loggerService, logLevelChannelClient, environmentService)); serviceCollection.set(ILogService, logService); + if (isCI) { + logService.info('workbench#open()'); // marking workbench open helps to diagnose flaky integration/smoke tests + } + if (logService.getLevel() === LogLevel.Trace) { + logService.trace('workbench#open(): with configuration', safeStringify(this.configuration)); + } // Shared Process const sharedProcessService = new SharedProcessService(this.configuration.windowId, logService); @@ -224,7 +226,7 @@ export class DesktopMain extends Disposable { fileService.registerProvider(Schemas.file, diskFileSystemProvider); // User Data Provider - fileService.registerProvider(Schemas.userData, this._register(new FileUserDataProvider(Schemas.file, diskFileSystemProvider, Schemas.userData, fileService, logService))); + fileService.registerProvider(Schemas.userData, this._register(new FileUserDataProvider(Schemas.file, diskFileSystemProvider, Schemas.userData, logService))); // URI Identity const uriIdentityService = new UriIdentityService(fileService); @@ -282,7 +284,7 @@ export class DesktopMain extends Disposable { const workspaceTrustEnablementService = new WorkspaceTrustEnablementService(configurationService, environmentService); serviceCollection.set(IWorkspaceTrustEnablementService, workspaceTrustEnablementService); - const workspaceTrustManagementService = new WorkspaceTrustManagementService(configurationService, remoteAuthorityResolverService, storageService, uriIdentityService, environmentService, configurationService, workspaceTrustEnablementService); + const workspaceTrustManagementService = new WorkspaceTrustManagementService(configurationService, remoteAuthorityResolverService, storageService, uriIdentityService, environmentService, configurationService, workspaceTrustEnablementService, logService); serviceCollection.set(IWorkspaceTrustManagementService, workspaceTrustManagementService); // Update workspace trust so that configuration is updated accordingly @@ -306,8 +308,8 @@ export class DesktopMain extends Disposable { return { serviceCollection, logService, storageService }; } - private resolveWorkspaceInitializationPayload(environmentService: INativeWorkbenchEnvironmentService): IWorkspaceInitializationPayload { - let workspaceInitializationPayload: IWorkspaceInitializationPayload | undefined = this.configuration.workspace; + private resolveWorkspaceInitializationPayload(environmentService: INativeWorkbenchEnvironmentService): IAnyWorkspaceIdentifier { + let workspaceInitializationPayload: IAnyWorkspaceIdentifier | undefined = this.configuration.workspace; // Fallback to empty workspace if we have no payload yet. if (!workspaceInitializationPayload) { @@ -328,7 +330,7 @@ export class DesktopMain extends Disposable { return workspaceInitializationPayload; } - private async createWorkspaceService(payload: IWorkspaceInitializationPayload, environmentService: INativeWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, uriIdentityService: IUriIdentityService, logService: ILogService): Promise { + private async createWorkspaceService(payload: IAnyWorkspaceIdentifier, environmentService: INativeWorkbenchEnvironmentService, fileService: FileService, remoteAgentService: IRemoteAgentService, uriIdentityService: IUriIdentityService, logService: ILogService): Promise { const configurationCache = new ConfigurationCache([Schemas.file, Schemas.userData] /* Cache all non native resources */, environmentService, fileService); const workspaceService = new WorkspaceService({ remoteAuthority: environmentService.remoteAuthority, configurationCache }, environmentService, fileService, remoteAgentService, uriIdentityService, logService); @@ -343,7 +345,7 @@ export class DesktopMain extends Disposable { } } - private async createStorageService(payload: IWorkspaceInitializationPayload, environmentService: INativeWorkbenchEnvironmentService, mainProcessService: IMainProcessService): Promise { + private async createStorageService(payload: IAnyWorkspaceIdentifier, environmentService: INativeWorkbenchEnvironmentService, mainProcessService: IMainProcessService): Promise { const storageService = new NativeStorageService(payload, mainProcessService, environmentService); try { @@ -372,7 +374,7 @@ export class DesktopMain extends Disposable { } } -export function main(configuration: INativeWorkbenchConfiguration): Promise { +export function main(configuration: INativeWindowConfiguration): Promise { const workbench = new DesktopMain(configuration); return workbench.open(); diff --git a/src/vs/workbench/electron-sandbox/window.ts b/src/vs/workbench/electron-sandbox/window.ts index 8f8135b26fb..520c7863e49 100644 --- a/src/vs/workbench/electron-sandbox/window.ts +++ b/src/vs/workbench/electron-sandbox/window.ts @@ -13,7 +13,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { EditorResourceAccessor, IUntitledTextResourceEditorInput, SideBySideEditor, pathsToEditors, IResourceDiffEditorInput, IUntypedEditorInput } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IOpenFileRequest, IWindowsConfiguration, getTitleBarStyle, IAddFoldersRequest, INativeRunActionInWindowRequest, INativeRunKeybindingInWindowRequest, INativeOpenFileRequest } from 'vs/platform/windows/common/windows'; +import { WindowMinimumSize, IOpenFileRequest, IWindowsConfiguration, getTitleBarStyle, IAddFoldersRequest, INativeRunActionInWindowRequest, INativeRunKeybindingInWindowRequest, INativeOpenFileRequest } from 'vs/platform/windows/common/windows'; import { ITitleService } from 'vs/workbench/services/title/common/titleService'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { applyZoom } from 'vs/platform/windows/electron-sandbox/window'; @@ -21,7 +21,6 @@ import { setFullscreen, getZoomLevel } from 'vs/base/browser/browser'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; -import { env } from 'vs/base/common/process'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { IMenuService, MenuId, IMenu, MenuItemAction, ICommandAction, MenuRegistry } from 'vs/platform/actions/common/actions'; import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; @@ -30,7 +29,7 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { LifecyclePhase, ILifecycleService, WillShutdownEvent, ShutdownReason, BeforeShutdownErrorEvent } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; import { IIntegrityService } from 'vs/workbench/services/integrity/common/integrity'; -import { isWindows, isMacintosh } from 'vs/base/common/platform'; +import { isWindows, isMacintosh, isCI } from 'vs/base/common/platform'; import { IProductService } from 'vs/platform/product/common/productService'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -46,8 +45,8 @@ import { Schemas } from 'vs/base/common/network'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { posix, dirname } from 'vs/base/common/path'; import { getBaseLabel } from 'vs/base/common/labels'; -import { ITunnelService, extractLocalHostUriMetaDataForPortMapping } from 'vs/platform/remote/common/tunnel'; -import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; +import { ITunnelService, extractLocalHostUriMetaDataForPortMapping } from 'vs/platform/tunnel/common/tunnel'; +import { IWorkbenchLayoutService, Parts, positionFromString, Position } from 'vs/workbench/services/layout/browser/layoutService'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { WorkingCopyCapabilities } from 'vs/workbench/services/workingCopy/common/workingCopy'; import { AutoSaveMode, IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; @@ -202,7 +201,7 @@ export class NativeWindow extends Disposable { ipcRenderer.on('vscode:leaveFullScreen', async () => setFullscreen(false)); // Proxy Login Dialog - ipcRenderer.on('vscode:openProxyAuthenticationDialog', async (event: unknown, payload: { authInfo: AuthInfo, username?: string, password?: string, replyChannel: string }) => { + ipcRenderer.on('vscode:openProxyAuthenticationDialog', async (event: unknown, payload: { authInfo: AuthInfo; username?: string; password?: string; replyChannel: string }) => { const rememberCredentials = this.storageService.getBoolean(NativeWindow.REMEMBER_PROXY_CREDENTIALS_KEY, StorageScope.GLOBAL); const result = await this.dialogService.input(Severity.Warning, localize('proxyAuthRequired', "Proxy Authentication Required"), [ @@ -263,7 +262,7 @@ export class NativeWindow extends Disposable { this._register(this.editorService.onDidVisibleEditorsChange(() => this.onDidChangeVisibleEditors())); // Listen to editor closing (if we run with --wait) - const filesToWait = this.environmentService.configuration.filesToWait; + const filesToWait = this.environmentService.filesToWait; if (filesToWait) { this.trackClosedWaitFiles(filesToWait.waitMarkerFileUri, coalesce(filesToWait.paths.map(path => path.fileUri))); } @@ -310,7 +309,11 @@ export class NativeWindow extends Disposable { Event.map(Event.filter(this.nativeHostService.onDidUnmaximizeWindow, id => id === this.nativeHostService.windowId), () => false) )(e => this.onDidChangeWindowMaximized(e))); - this.onDidChangeWindowMaximized(this.environmentService.configuration.maximized ?? false); + this.onDidChangeWindowMaximized(this.environmentService.window.maximized ?? false); + + // Detect panel position to determine minimum width + this._register(this.layoutService.onDidChangePanelPosition(pos => this.onDidChangePanelPosition(positionFromString(pos)))); + this.onDidChangePanelPosition(this.layoutService.getPanelPosition()); // Lifecycle this._register(this.lifecycleService.onBeforeShutdownError(e => this.onBeforeShutdownError(e))); @@ -397,6 +400,23 @@ export class NativeWindow extends Disposable { this.layoutService.updateWindowMaximizedState(maximized); } + private getWindowMinimumWidth(panelPosition: Position = this.layoutService.getPanelPosition()): number { + + // if panel is on the side, then return the larger minwidth + const panelOnSide = panelPosition === Position.LEFT || panelPosition === Position.RIGHT; + if (panelOnSide) { + return WindowMinimumSize.WIDTH_WITH_VERTICAL_PANEL; + } + + return WindowMinimumSize.WIDTH; + } + + private onDidChangePanelPosition(pos: Position): void { + const minWidth = this.getWindowMinimumWidth(pos); + + this.nativeHostService.setMinimumSize(minWidth, undefined); + } + private onDidChangeVisibleEditors(): void { // Close when empty: check if we should close the window based on the setting @@ -507,7 +527,7 @@ export class NativeWindow extends Disposable { // Check for cyclic dependencies if (require.hasDependencyCycle()) { - if (env['CI'] || env['BUILD_ARTIFACTSTAGINGDIRECTORY']) { + if (isCI) { this.logService.error('Error: There is a dependency cycle in the AMD modules that needs to be resolved!'); this.nativeHostService.exit(37); // running on a build machine, just exit without showing a dialog } else { diff --git a/src/vs/workbench/services/accessibility/electron-sandbox/accessibilityService.ts b/src/vs/workbench/services/accessibility/electron-sandbox/accessibilityService.ts index c3004ecaecb..4b6ca8c5039 100644 --- a/src/vs/workbench/services/accessibility/electron-sandbox/accessibilityService.ts +++ b/src/vs/workbench/services/accessibility/electron-sandbox/accessibilityService.ts @@ -21,7 +21,7 @@ interface AccessibilityMetrics { enabled: boolean; } type AccessibilityMetricsClassification = { - enabled: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + enabled: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; export class NativeAccessibilityService extends AccessibilityService implements IAccessibilityService { @@ -37,7 +37,7 @@ export class NativeAccessibilityService extends AccessibilityService implements @INativeHostService private readonly nativeHostService: INativeHostService ) { super(contextKeyService, configurationService); - this.setAccessibilitySupport(environmentService.configuration.accessibilitySupport ? AccessibilitySupport.Enabled : AccessibilitySupport.Disabled); + this.setAccessibilitySupport(environmentService.window.accessibilitySupport ? AccessibilitySupport.Enabled : AccessibilitySupport.Disabled); } override async alwaysUnderlineAccessKeys(): Promise { diff --git a/src/vs/workbench/api/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts similarity index 98% rename from src/vs/workbench/api/common/menusExtensionPoint.ts rename to src/vs/workbench/services/actions/common/menusExtensionPoint.ts index 6f7fb8389ca..3d16fc90d57 100644 --- a/src/vs/workbench/api/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -465,7 +465,7 @@ namespace schema { icon?: IUserFriendlyIcon; } - export type IUserFriendlyIcon = string | { light: string; dark: string; }; + export type IUserFriendlyIcon = string | { light: string; dark: string }; export function isValidCommand(command: IUserFriendlyCommand, collector: ExtensionMessageCollector): boolean { if (!command) { @@ -598,7 +598,7 @@ commandsExtensionPoint.setHandler(extensions => { const { icon, enablement, category, title, shortTitle, command } = userFriendlyCommand; - let absoluteIcon: { dark: URI; light?: URI; } | ThemeIcon | undefined; + let absoluteIcon: { dark: URI; light?: URI } | ThemeIcon | undefined; if (icon) { if (typeof icon === 'string') { absoluteIcon = ThemeIcon.fromString(icon) ?? { dark: resources.joinPath(extension.description.extensionLocation, icon), light: resources.joinPath(extension.description.extensionLocation, icon) }; @@ -646,7 +646,7 @@ commandsExtensionPoint.setHandler(extensions => { interface IRegisteredSubmenu { readonly id: MenuId; readonly label: string; - readonly icon?: { dark: URI; light?: URI; } | ThemeIcon; + readonly icon?: { dark: URI; light?: URI } | ThemeIcon; } const _submenus = new Map(); @@ -681,7 +681,7 @@ submenusExtensionPoint.setHandler(extensions => { return; } - let absoluteIcon: { dark: URI; light?: URI; } | ThemeIcon | undefined; + let absoluteIcon: { dark: URI; light?: URI } | ThemeIcon | undefined; if (entry.value.icon) { if (typeof entry.value.icon === 'string') { absoluteIcon = ThemeIcon.fromString(entry.value.icon) || { dark: resources.joinPath(extension.description.extensionLocation, entry.value.icon) }; @@ -720,7 +720,7 @@ menusExtensionPoint.setHandler(extensions => { _menuRegistrations.clear(); _submenuMenuItems.clear(); - const items: { id: MenuId, item: IMenuItem | ISubmenuItem }[] = []; + const items: { id: MenuId; item: IMenuItem | ISubmenuItem }[] = []; for (let extension of extensions) { const { value, collector } = extension; @@ -745,7 +745,7 @@ menusExtensionPoint.setHandler(extensions => { } if (!menu) { - collector.warn(localize('menuId.invalid', "`{0}` is not a valid menu identifier", entry.key)); + collector.info(localize('menuId.invalid', "`{0}` is not a valid menu identifier", entry.key)); return; } diff --git a/src/vs/workbench/services/assignment/common/assignmentService.ts b/src/vs/workbench/services/assignment/common/assignmentService.ts index c7176e4a43c..d04be1ca7ed 100644 --- a/src/vs/workbench/services/assignment/common/assignmentService.ts +++ b/src/vs/workbench/services/assignment/common/assignmentService.ts @@ -103,8 +103,8 @@ export class WorkbenchAssignmentService extends BaseAssignmentService { }; type TASClientReadTreatmentClassification = { - treatmentValue: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', }; - treatmentName: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', }; + treatmentValue: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + treatmentName: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; this.telemetryService.publicLog2('tasClientReadTreatmentComplete', diff --git a/src/vs/workbench/services/authentication/browser/authenticationService.ts b/src/vs/workbench/services/authentication/browser/authenticationService.ts index 0e08b8224cf..42505773acc 100644 --- a/src/vs/workbench/services/authentication/browser/authenticationService.ts +++ b/src/vs/workbench/services/authentication/browser/authenticationService.ts @@ -6,11 +6,10 @@ import { flatten } from 'vs/base/common/arrays'; import { Emitter, Event } from 'vs/base/common/event'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { Disposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; +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 { AuthenticationProviderInformation, AuthenticationSession, AuthenticationSessionsChangeEvent } from 'vs/editor/common/languages'; import * as nls from 'vs/nls'; import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; @@ -18,21 +17,20 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Severity } from 'vs/platform/notification/common/notification'; import { IProductService } from 'vs/platform/product/common/productService'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { MainThreadAuthenticationProvider } from 'vs/workbench/api/browser/mainThreadAuthentication'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { AuthenticationProviderInformation, AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationProvider, IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; +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}`; } -export interface IAccountUsage { +interface IAccountUsage { extensionId: string; extensionName: string; lastUsed: number; @@ -91,7 +89,7 @@ export function addAccountUsage(storageService: IStorageService, providerId: str storageService.store(accountKey, JSON.stringify(usages), StorageScope.GLOBAL, StorageTarget.MACHINE); } -export type AuthenticationSessionInfo = { readonly id: string, readonly accessToken: string, readonly providerId: string, readonly canSignOut?: boolean }; +export type AuthenticationSessionInfo = { readonly id: string; readonly accessToken: string; readonly providerId: string; readonly canSignOut?: boolean }; export async function getCurrentAuthenticationSessionInfo(credentialsService: ICredentialsService, productService: IProductService): Promise { const authenticationSessionValue = await credentialsService.getPassword(`${productService.urlProtocol}.login`, 'account'); if (authenticationSessionValue) { @@ -107,43 +105,6 @@ export async function getCurrentAuthenticationSessionInfo(credentialsService: IC return undefined; } -export const IAuthenticationService = createDecorator('IAuthenticationService'); - -export interface IAuthenticationService { - readonly _serviceBrand: undefined; - - isAuthenticationProviderRegistered(id: string): boolean; - getProviderIds(): string[]; - registerAuthenticationProvider(id: string, provider: MainThreadAuthenticationProvider): 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; - 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; - completeSessionAccessRequest(providerId: string, extensionId: string, extensionName: string, scopes: string[]): Promise - requestNewSession(providerId: string, scopes: string[], extensionId: string, extensionName: string): Promise; - sessionsUpdate(providerId: string, event: AuthenticationSessionsChangeEvent): void; - - readonly onDidRegisterAuthenticationProvider: Event; - readonly onDidUnregisterAuthenticationProvider: Event; - - readonly onDidChangeSessions: Event<{ providerId: string, label: string, event: AuthenticationSessionsChangeEvent }>; - - // TODO @RMacfarlane completely remove this property - declaredProviders: AuthenticationProviderInformation[]; - readonly onDidChangeDeclaredProviders: Event; - - getSessions(id: string, scopes?: string[], activateImmediate?: boolean): Promise>; - getLabel(providerId: string): string; - supportsMultipleAccounts(providerId: string): boolean; - createSession(providerId: string, scopes: string[], activateImmediate?: boolean): Promise; - removeSession(providerId: string, sessionId: string): Promise; - - manageTrustedExtensionsForAccount(providerId: string, accountName: string): Promise; - removeAccountSessions(providerId: string, accountName: string, sessions: AuthenticationSession[]): Promise; -} - export interface AllowedExtension { id: string; name: string; @@ -175,7 +136,7 @@ interface SessionRequestInfo { } CommandsRegistry.registerCommand('workbench.getCodeExchangeProxyEndpoints', function (accessor, _) { - const environmentService = accessor.get(IWorkbenchEnvironmentService); + const environmentService = accessor.get(IBrowserWorkbenchEnvironmentService); return environmentService.options?.codeExchangeProxyEndpoints; }); @@ -207,10 +168,10 @@ export class AuthenticationService extends Disposable implements IAuthentication declare readonly _serviceBrand: undefined; private _placeholderMenuItem: IDisposable | undefined; private _signInRequestItems = new Map(); - private _sessionAccessRequestItems = new Map(); + private _sessionAccessRequestItems = new Map(); private _accountBadgeDisposable = this._register(new MutableDisposable()); - private _authenticationProviders: Map = new Map(); + private _authenticationProviders: Map = new Map(); /** * All providers that have been statically declared by extensions. These may not be registered. @@ -223,8 +184,8 @@ export class AuthenticationService extends Disposable implements IAuthentication private _onDidUnregisterAuthenticationProvider: Emitter = this._register(new Emitter()); readonly onDidUnregisterAuthenticationProvider: Event = this._onDidUnregisterAuthenticationProvider.event; - private _onDidChangeSessions: Emitter<{ providerId: string, label: string, event: AuthenticationSessionsChangeEvent }> = this._register(new Emitter<{ providerId: string, label: string, event: AuthenticationSessionsChangeEvent }>()); - readonly onDidChangeSessions: Event<{ providerId: string, label: string, event: AuthenticationSessionsChangeEvent }> = this._onDidChangeSessions.event; + private _onDidChangeSessions: Emitter<{ providerId: string; label: string; event: AuthenticationSessionsChangeEvent }> = this._register(new Emitter<{ providerId: string; label: string; event: AuthenticationSessionsChangeEvent }>()); + readonly onDidChangeSessions: Event<{ providerId: string; label: string; event: AuthenticationSessionsChangeEvent }> = this._onDidChangeSessions.event; private _onDidChangeDeclaredProviders: Emitter = this._register(new Emitter()); readonly onDidChangeDeclaredProviders: Event = this._onDidChangeDeclaredProviders.event; @@ -291,7 +252,7 @@ export class AuthenticationService extends Disposable implements IAuthentication return this._authenticationProviders.has(id); } - registerAuthenticationProvider(id: string, authenticationProvider: MainThreadAuthenticationProvider): void { + registerAuthenticationProvider(id: string, authenticationProvider: IAuthenticationProvider): void { this._authenticationProviders.set(id, authenticationProvider); this._onDidRegisterAuthenticationProvider.fire({ id, label: authenticationProvider.label }); @@ -342,7 +303,7 @@ export class AuthenticationService extends Disposable implements IAuthentication } } - private async updateNewSessionRequests(provider: MainThreadAuthenticationProvider, addedSessions: readonly AuthenticationSession[]): Promise { + private async updateNewSessionRequests(provider: IAuthenticationProvider, addedSessions: readonly AuthenticationSession[]): Promise { const existingRequestsForProvider = this._signInRequestItems.get(provider.id); if (!existingRequestsForProvider) { return; @@ -404,7 +365,7 @@ export class AuthenticationService extends Disposable implements IAuthentication private removeAccessRequest(providerId: string, extensionId: string): void { const providerRequests = this._sessionAccessRequestItems.get(providerId) || {}; if (providerRequests[extensionId]) { - providerRequests[extensionId].disposables.forEach(d => d.dispose()); + dispose(providerRequests[extensionId].disposables); delete providerRequests[extensionId]; this.updateBadgeCount(); } @@ -480,9 +441,9 @@ export class AuthenticationService extends Disposable implements IAuthentication reject('No available sessions'); } - const quickPick = this.quickInputService.createQuickPick<{ label: string, session?: AuthenticationSession }>(); + const quickPick = this.quickInputService.createQuickPick<{ label: string; session?: AuthenticationSession }>(); quickPick.ignoreFocusOut = true; - const items: { label: string, session?: AuthenticationSession }[] = availableSessions.map(session => { + const items: { label: string; session?: AuthenticationSession }[] = availableSessions.map(session => { return { label: session.account.label, session: session @@ -696,7 +657,7 @@ export class AuthenticationService extends Disposable implements IAuthentication } } - private async tryActivateProvider(providerId: string, activateImmediate: boolean): Promise { + private async tryActivateProvider(providerId: string, activateImmediate: boolean): Promise { await this.extensionService.activateByEvent(getAuthenticationProviderActivationEvent(providerId), activateImmediate ? ActivationKind.Immediate : ActivationKind.Normal); let provider = this._authenticationProviders.get(providerId); if (provider) { @@ -705,7 +666,7 @@ export class AuthenticationService extends Disposable implements IAuthentication // When activate has completed, the extension has made the call to `registerAuthenticationProvider`. // However, activate cannot block on this, so the renderer may not have gotten the event yet. - const didRegister: Promise = new Promise((resolve, _) => { + const didRegister: Promise = new Promise((resolve, _) => { this.onDidRegisterAuthenticationProvider(e => { if (e.id === providerId) { provider = this._authenticationProviders.get(providerId); @@ -718,7 +679,7 @@ export class AuthenticationService extends Disposable implements IAuthentication }); }); - const didTimeout: Promise = new Promise((_, reject) => { + const didTimeout: Promise = new Promise((_, reject) => { setTimeout(() => { reject('Timed out waiting for authentication provider to register'); }, 5000); diff --git a/src/vs/workbench/services/authentication/common/authentication.ts b/src/vs/workbench/services/authentication/common/authentication.ts new file mode 100644 index 00000000000..d5bd102712e --- /dev/null +++ b/src/vs/workbench/services/authentication/common/authentication.ts @@ -0,0 +1,77 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { Event } from 'vs/base/common/event'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export interface AuthenticationSession { + id: string; + accessToken: string; + account: { + label: string; + id: string; + }; + scopes: ReadonlyArray; + idToken?: string; +} + +export interface AuthenticationSessionsChangeEvent { + added: ReadonlyArray; + removed: ReadonlyArray; + changed: ReadonlyArray; +} + +export interface AuthenticationProviderInformation { + id: string; + label: string; +} + +export const IAuthenticationService = createDecorator('IAuthenticationService'); + +export interface IAuthenticationService { + readonly _serviceBrand: undefined; + + isAuthenticationProviderRegistered(id: string): boolean; + getProviderIds(): string[]; + 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; + 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; + completeSessionAccessRequest(providerId: string, extensionId: string, extensionName: string, scopes: string[]): Promise; + requestNewSession(providerId: string, scopes: string[], extensionId: string, extensionName: string): Promise; + sessionsUpdate(providerId: string, event: AuthenticationSessionsChangeEvent): void; + + readonly onDidRegisterAuthenticationProvider: Event; + readonly onDidUnregisterAuthenticationProvider: Event; + + readonly onDidChangeSessions: Event<{ providerId: string; label: string; event: AuthenticationSessionsChangeEvent }>; + + // TODO @RMacfarlane completely remove this property + declaredProviders: AuthenticationProviderInformation[]; + readonly onDidChangeDeclaredProviders: Event; + + getSessions(id: string, scopes?: string[], activateImmediate?: boolean): Promise>; + getLabel(providerId: string): string; + supportsMultipleAccounts(providerId: string): boolean; + createSession(providerId: string, scopes: string[], activateImmediate?: boolean): Promise; + removeSession(providerId: string, sessionId: string): Promise; + + manageTrustedExtensionsForAccount(providerId: string, accountName: string): Promise; + removeAccountSessions(providerId: string, accountName: string, sessions: AuthenticationSession[]): Promise; +} + +export interface IAuthenticationProvider { + readonly id: string; + readonly label: string; + readonly supportsMultipleAccounts: boolean; + dispose(): void; + manageTrustedExtensions(accountName: string): void; + removeAccountSessions(accountName: string, sessions: AuthenticationSession[]): Promise; + getSessions(scopes?: string[]): Promise; + createSession(scopes: string[]): Promise; + removeSession(sessionId: string): Promise; +} diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index 57e9e9c1c03..7100b576b6f 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -8,13 +8,13 @@ import { Event, Emitter } from 'vs/base/common/event'; import * as errors from 'vs/base/common/errors'; import { Disposable, IDisposable, dispose, toDisposable, MutableDisposable, combinedDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { FileChangeType, FileChangesEvent, IFileService, whenProviderRegistered, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; +import { FileChangeType, FileChangesEvent, IFileService, whenProviderRegistered, FileOperationError, FileOperationResult, FileOperation, FileOperationEvent } from 'vs/platform/files/common/files'; import { ConfigurationModel, ConfigurationModelParser, ConfigurationParseOptions, DefaultConfigurationModel, UserSettings } from 'vs/platform/configuration/common/configurationModels'; import { WorkspaceConfigurationModelParser, StandaloneConfigurationModelParser } from 'vs/workbench/services/configuration/common/configurationModels'; import { TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES } from 'vs/workbench/services/configuration/common/configuration'; -import { IStoredWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IStoredWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; -import { WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { WorkbenchState, IWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { ConfigurationScope, Extensions, IConfigurationRegistry, OVERRIDE_PROPERTY_REGEX } from 'vs/platform/configuration/common/configurationRegistry'; import { equals } from 'vs/base/common/objects'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -24,7 +24,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IStringDictionary } from 'vs/base/common/collections'; import { joinPath } from 'vs/base/common/resources'; import { Registry } from 'vs/platform/registry/common/platform'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { isObject } from 'vs/base/common/types'; export class DefaultConfiguration extends Disposable { @@ -35,14 +35,14 @@ export class DefaultConfiguration extends Disposable { private cachedConfigurationDefaultsOverrides: IStringDictionary = {}; private readonly cacheKey: ConfigurationKey = { type: 'defaults', key: 'configurationDefaultsOverrides' }; - private readonly _onDidChangeConfiguration = this._register(new Emitter<{ defaults: ConfigurationModel, properties: string[] }>()); + private readonly _onDidChangeConfiguration = this._register(new Emitter<{ defaults: ConfigurationModel; properties: string[] }>()); readonly onDidChangeConfiguration = this._onDidChangeConfiguration.event; private updateCache: boolean = false; constructor( private readonly configurationCache: IConfigurationCache, - environmentService: IWorkbenchEnvironmentService, + environmentService: IBrowserWorkbenchEnvironmentService, ) { super(); if (environmentService.options?.configurationDefaults) { @@ -215,7 +215,11 @@ class FileServiceBasedConfiguration extends Disposable { this._standAloneConfigurations = []; this._cache = new ConfigurationModel(); - this._register(Event.debounce(Event.filter(this.fileService.onDidFilesChange, e => this.handleFileEvents(e)), () => undefined, 100)(() => this._onDidChange.fire())); + this._register(Event.debounce( + Event.any( + Event.filter(this.fileService.onDidFilesChange, e => this.handleFileChangesEvent(e)), + Event.filter(this.fileService.onDidRunOperation, e => this.handleFileOperationEvent(e)) + ), () => undefined, 100)(() => this._onDidChange.fire())); } async resolveContents(): Promise<[string | undefined, [string, string | undefined][]]> { @@ -289,7 +293,7 @@ class FileServiceBasedConfiguration extends Disposable { this._cache = this._folderSettingsModelParser.configurationModel.merge(...this._standAloneConfigurations); } - private handleFileEvents(event: FileChangesEvent): boolean { + private handleFileChangesEvent(event: FileChangesEvent): boolean { // One of the resources has changed if (this.allResources.some(resource => event.contains(resource))) { return true; @@ -301,6 +305,19 @@ class FileServiceBasedConfiguration extends Disposable { return false; } + private handleFileOperationEvent(event: FileOperationEvent): boolean { + // One of the resources has changed + if ((event.isOperation(FileOperation.CREATE) || event.isOperation(FileOperation.DELETE) || event.isOperation(FileOperation.WRITE)) + && this.allResources.some(resource => this.uriIdentityService.extUri.isEqual(event.resource, resource))) { + return true; + } + // One of the resource's parent got deleted + if (event.isOperation(FileOperation.DELETE) && this.allResources.some(resource => this.uriIdentityService.extUri.isEqual(event.resource, this.uriIdentityService.extUri.dirname(resource)))) { + return true; + } + return false; + } + } export class RemoteUserConfiguration extends Disposable { @@ -410,7 +427,8 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable { this.parser = new ConfigurationModelParser(this.configurationResource.toString()); this.parseOptions = configurationParseOptions; - this._register(fileService.onDidFilesChange(e => this.handleFileEvents(e))); + this._register(fileService.onDidFilesChange(e => this.handleFileChangesEvent(e))); + this._register(fileService.onDidRunOperation(e => this.handleFileOperationEvent(e))); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reload().then(configurationModel => this._onDidChangeConfiguration.fire(configurationModel)), 50)); this._register(toDisposable(() => { this.stopWatchingResource(); @@ -468,7 +486,7 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable { return this.parser.restrictedConfigurations; } - private async handleFileEvents(event: FileChangesEvent): Promise { + private handleFileChangesEvent(event: FileChangesEvent): void { // Find changes that affect the resource let affectedByChanges = event.contains(this.configurationResource, FileChangeType.UPDATED); @@ -485,6 +503,13 @@ class FileServiceBasedRemoteUserConfiguration extends Disposable { } } + private handleFileOperationEvent(event: FileOperationEvent): void { + if ((event.isOperation(FileOperation.CREATE) || event.isOperation(FileOperation.DELETE) || event.isOperation(FileOperation.WRITE)) + && this.uriIdentityService.extUri.isEqual(event.resource, this.configurationResource)) { + this.reloadConfigurationScheduler.schedule(); + } + } + private onResourceExists(exists: boolean): void { if (exists) { this.stopWatchingDirectory(); @@ -560,7 +585,6 @@ class CachedRemoteUserConfiguration extends Disposable { export class WorkspaceConfiguration extends Disposable { - private readonly _fileService: IFileService; private readonly _cachedConfiguration: CachedWorkspaceConfiguration; private _workspaceConfiguration: CachedWorkspaceConfiguration | FileServiceBasedWorkspaceConfiguration; private _workspaceConfigurationDisposables = this._register(new DisposableStore()); @@ -574,10 +598,11 @@ export class WorkspaceConfiguration extends Disposable { get initialized(): boolean { return this._initialized; } constructor( private readonly configurationCache: IConfigurationCache, - fileService: IFileService + private readonly fileService: IFileService, + private readonly uriIdentityService: IUriIdentityService, ) { super(); - this._fileService = fileService; + this.fileService = fileService; this._workspaceConfiguration = this._cachedConfiguration = new CachedWorkspaceConfiguration(configurationCache); } @@ -589,7 +614,7 @@ export class WorkspaceConfiguration extends Disposable { this._workspaceConfiguration = this._cachedConfiguration; this.waitAndInitialize(this._workspaceIdentifier); } else { - this.doInitialize(new FileServiceBasedWorkspaceConfiguration(this._fileService)); + this.doInitialize(new FileServiceBasedWorkspaceConfiguration(this.fileService, this.uriIdentityService)); } } await this.reload(); @@ -636,9 +661,9 @@ export class WorkspaceConfiguration extends Disposable { } private async waitAndInitialize(workspaceIdentifier: IWorkspaceIdentifier): Promise { - await whenProviderRegistered(workspaceIdentifier.configPath, this._fileService); + await whenProviderRegistered(workspaceIdentifier.configPath, this.fileService); if (!(this._workspaceConfiguration instanceof FileServiceBasedWorkspaceConfiguration)) { - const fileServiceBasedWorkspaceConfiguration = this._register(new FileServiceBasedWorkspaceConfiguration(this._fileService)); + const fileServiceBasedWorkspaceConfiguration = this._register(new FileServiceBasedWorkspaceConfiguration(this.fileService, this.uriIdentityService)); await fileServiceBasedWorkspaceConfiguration.load(workspaceIdentifier, { scopes: WORKSPACE_SCOPES, skipRestricted: this.isUntrusted() }); this.doInitialize(fileServiceBasedWorkspaceConfiguration); this.onDidWorkspaceConfigurationChange(false, true); @@ -683,13 +708,19 @@ class FileServiceBasedWorkspaceConfiguration extends Disposable { protected readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; - constructor(private fileService: IFileService) { + constructor( + private readonly fileService: IFileService, + uriIdentityService: IUriIdentityService + ) { super(); this.workspaceConfigurationModelParser = new WorkspaceConfigurationModelParser(''); this.workspaceSettings = new ConfigurationModel(); - this._register(fileService.onDidFilesChange(e => this.handleWorkspaceFileEvents(e))); + this._register(Event.any( + Event.filter(this.fileService.onDidFilesChange, e => !!this._workspaceIdentifier && e.contains(this._workspaceIdentifier.configPath)), + Event.filter(this.fileService.onDidRunOperation, e => !!this._workspaceIdentifier && (e.isOperation(FileOperation.CREATE) || e.isOperation(FileOperation.DELETE) || e.isOperation(FileOperation.WRITE)) && uriIdentityService.extUri.isEqual(e.resource, this._workspaceIdentifier.configPath)) + )(() => this.reloadConfigurationScheduler.schedule())); this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this._onDidChange.fire(), 50)); this.workspaceConfigWatcher = this._register(this.watchWorkspaceConfigurationFile()); } @@ -757,15 +788,6 @@ class FileServiceBasedWorkspaceConfiguration extends Disposable { return this._workspaceIdentifier ? this.fileService.watch(this._workspaceIdentifier.configPath) : Disposable.None; } - private handleWorkspaceFileEvents(event: FileChangesEvent): void { - if (this._workspaceIdentifier) { - - // Find changes that affect workspace file - if (event.contains(this._workspaceIdentifier.configPath)) { - this.reloadConfigurationScheduler.schedule(); - } - } - } } class CachedWorkspaceConfiguration { diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index 5e616e7b755..3df3272bf8f 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -10,14 +10,14 @@ import { equals } from 'vs/base/common/objects'; import { Disposable } from 'vs/base/common/lifecycle'; import { Queue, Barrier, runWhenIdle, Promises } from 'vs/base/common/async'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; -import { IWorkspaceContextService, Workspace as BaseWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, WorkspaceFolder, toWorkspaceFolder, isWorkspaceFolder, IWorkspaceFoldersWillChangeEvent } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, Workspace as BaseWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, WorkspaceFolder, toWorkspaceFolder, isWorkspaceFolder, IWorkspaceFoldersWillChangeEvent, IEmptyWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier, IAnyWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { ConfigurationModel, ConfigurationChangeEvent, AllKeysConfigurationChangeEvent, mergeChanges } from 'vs/platform/configuration/common/configurationModels'; import { IConfigurationChangeEvent, ConfigurationTarget, IConfigurationOverrides, isConfigurationOverrides, IConfigurationData, IConfigurationValue, IConfigurationChange, ConfigurationTargetToString, IConfigurationUpdateOverrides, isConfigurationUpdateOverrides, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Configuration } from 'vs/workbench/services/configuration/common/configurationModels'; import { FOLDER_CONFIG_FOLDER_NAME, defaultSettingsSchemaId, userSettingsSchemaId, workspaceSettingsSchemaId, folderSettingsSchemaId, IConfigurationCache, machineSettingsSchemaId, LOCAL_MACHINE_SCOPES, IWorkbenchConfigurationService, RestrictedSettings } from 'vs/workbench/services/configuration/common/configuration'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions, allSettings, windowSettings, resourceSettings, applicationSettings, machineSettings, machineOverridableSettings, ConfigurationScope, IConfigurationPropertySchema, keyFromOverrideIdentifiers, OVERRIDE_PROPERTY_PATTERN, resourceLanguageSettingsSchemaId, configurationDefaultsSchemaId } from 'vs/platform/configuration/common/configurationRegistry'; -import { IWorkspaceIdentifier, isWorkspaceIdentifier, IStoredWorkspaceFolder, isStoredWorkspaceFolder, IWorkspaceFolderCreationData, IWorkspaceInitializationPayload, IEmptyWorkspaceIdentifier, useSlashForPath, getStoredWorkspaceFolder, isSingleFolderWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; +import { IStoredWorkspaceFolder, isStoredWorkspaceFolder, IWorkspaceFolderCreationData, useSlashForPath, getStoredWorkspaceFolder, toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ConfigurationEditingService, EditableConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditingService'; import { WorkspaceConfiguration, FolderConfiguration, RemoteUserConfiguration, UserConfiguration, DefaultConfiguration } from 'vs/workbench/services/configuration/browser/configuration'; @@ -96,7 +96,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat private cyclicDependency = new Promise(resolve => this.cyclicDependencyReady = resolve); constructor( - { remoteAuthority, configurationCache }: { remoteAuthority?: string, configurationCache: IConfigurationCache }, + { remoteAuthority, configurationCache }: { remoteAuthority?: string; configurationCache: IConfigurationCache }, environmentService: IWorkbenchEnvironmentService, fileService: IFileService, remoteAgentService: IRemoteAgentService, @@ -129,7 +129,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat this.initRemoteUserConfigurationBarrier.open(); } - this.workspaceConfiguration = this._register(new WorkspaceConfiguration(configurationCache, fileService)); + this.workspaceConfiguration = this._register(new WorkspaceConfiguration(configurationCache, fileService, uriIdentityService)); this._register(this.workspaceConfiguration.onDidUpdateConfiguration(fromCache => { this.onWorkspaceConfigurationChanged(fromCache).then(() => { this.workspace.initialized = this.workspaceConfiguration.initialized; @@ -404,7 +404,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat * * Related root path issue discussion is being tracked here - https://github.com/microsoft/vscode/issues/69335 */ - async initialize(arg: IWorkspaceInitializationPayload): Promise { + async initialize(arg: IAnyWorkspaceIdentifier): Promise { mark('code/willInitWorkspaceService'); const workspace = await this.createWorkspace(arg); @@ -468,7 +468,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat } } - private async createWorkspace(arg: IWorkspaceInitializationPayload): Promise { + private async createWorkspace(arg: IAnyWorkspaceIdentifier): Promise { if (isWorkspaceIdentifier(arg)) { return this.createMultiFolderWorkspace(arg); } @@ -581,7 +581,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat mark('code/didInitWorkspaceConfiguration'); } - private async initializeUserConfiguration(): Promise<{ local: ConfigurationModel, remote: ConfigurationModel }> { + private async initializeUserConfiguration(): Promise<{ local: ConfigurationModel; remote: ConfigurationModel }> { const [local, remote] = await Promise.all([this.localUserConfiguration.initialize(), this.remoteUserConfiguration ? this.remoteUserConfiguration.initialize() : Promise.resolve(new ConfigurationModel())]); return { local, remote }; } @@ -590,7 +590,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat this.onDefaultConfigurationChanged(this.defaultConfiguration.reload()); } - private async reloadUserConfiguration(): Promise<{ local: ConfigurationModel, remote: ConfigurationModel }> { + private async reloadUserConfiguration(): Promise<{ local: ConfigurationModel; remote: ConfigurationModel }> { const [local, remote] = await Promise.all([this.reloadLocalUserConfiguration(true), this.reloadRemoteUserConfiguration(true)]); return { local, remote }; } @@ -938,7 +938,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat return [definedTargets[0] || ConfigurationTarget.USER]; } - private triggerConfigurationChange(change: IConfigurationChange, previous: { data: IConfigurationData, workspace?: Workspace } | undefined, target: ConfigurationTarget): void { + private triggerConfigurationChange(change: IConfigurationChange, previous: { data: IConfigurationData; workspace?: Workspace } | undefined, target: ConfigurationTarget): void { if (change.keys.length) { if (target !== ConfigurationTarget.DEFAULT) { this.logService.debug(`Configuration keys changed in ${ConfigurationTargetToString(target)} target`, ...change.keys); diff --git a/src/vs/workbench/services/configuration/common/configuration.ts b/src/vs/workbench/services/configuration/common/configuration.ts index af6490e6196..c3d97f0c5e6 100644 --- a/src/vs/workbench/services/configuration/common/configuration.ts +++ b/src/vs/workbench/services/configuration/common/configuration.ts @@ -36,7 +36,7 @@ WORKSPACE_STANDALONE_CONFIGURATIONS[LAUNCH_CONFIGURATION_KEY] = `${FOLDER_CONFIG export const USER_STANDALONE_CONFIGURATIONS = Object.create(null); USER_STANDALONE_CONFIGURATIONS[TASKS_CONFIGURATION_KEY] = `${TASKS_CONFIGURATION_KEY}.json`; -export type ConfigurationKey = { type: 'defaults' | 'user' | 'workspaces' | 'folder', key: string }; +export type ConfigurationKey = { type: 'defaults' | 'user' | 'workspaces' | 'folder'; key: string }; export interface IConfigurationCache { diff --git a/src/vs/workbench/services/configuration/test/browser/configuration.test.ts b/src/vs/workbench/services/configuration/test/browser/configuration.test.ts index 05f5d53e8b3..3f1be057f43 100644 --- a/src/vs/workbench/services/configuration/test/browser/configuration.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configuration.test.ts @@ -49,7 +49,7 @@ suite('DefaultConfiguration', () => { }); test('configuration default overrides are read from environment', async () => { - const environmentService = new BrowserWorkbenchEnvironmentService({ logsPath: joinPath(URI.file('tests').with({ scheme: 'vscode-tests' }), 'logs'), workspaceId: '', configurationDefaults: { 'test.configurationDefaultsOverride': 'envOverrideValue' } }, TestProductService); + const environmentService = new BrowserWorkbenchEnvironmentService('', joinPath(URI.file('tests').with({ scheme: 'vscode-tests' }), 'logs'), { configurationDefaults: { 'test.configurationDefaultsOverride': 'envOverrideValue' } }, TestProductService); const testObject = new DefaultConfiguration(configurationCache, environmentService); assert.deepStrictEqual(testObject.configurationModel.getValue('test.configurationDefaultsOverride'), 'envOverrideValue'); }); @@ -88,7 +88,7 @@ suite('DefaultConfiguration', () => { }); test('configuration default overrides read from cache override environment', async () => { - const environmentService = new BrowserWorkbenchEnvironmentService({ logsPath: joinPath(URI.file('tests').with({ scheme: 'vscode-tests' }), 'logs'), workspaceId: '', configurationDefaults: { 'test.configurationDefaultsOverride': 'envOverrideValue' } }, TestProductService); + const environmentService = new BrowserWorkbenchEnvironmentService('', joinPath(URI.file('tests').with({ scheme: 'vscode-tests' }), 'logs'), { configurationDefaults: { 'test.configurationDefaultsOverride': 'envOverrideValue' } }, TestProductService); window.localStorage.setItem(DefaultConfiguration.DEFAULT_OVERRIDES_CACHE_EXISTS_KEY, 'yes'); await configurationCache.write(cacheKey, JSON.stringify({ 'test.configurationDefaultsOverride': 'overrideValue' })); const testObject = new DefaultConfiguration(configurationCache, environmentService); diff --git a/src/vs/workbench/services/configuration/test/browser/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationEditingService.test.ts index 423885e47d5..de5fc1eee62 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationEditingService.test.ts @@ -94,7 +94,7 @@ suite('ConfigurationEditingService', () => { environmentService = TestEnvironmentService; instantiationService.stub(IEnvironmentService, environmentService); const remoteAgentService = disposables.add(instantiationService.createInstance(RemoteAgentService, null)); - disposables.add(fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, logService)))); + disposables.add(fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, logService)))); instantiationService.stub(IFileService, fileService); instantiationService.stub(IRemoteAgentService, remoteAgentService); workspaceService = disposables.add(new WorkspaceService({ configurationCache: new ConfigurationCache() }, environmentService, fileService, remoteAgentService, new UriIdentityService(fileService), new NullLogService())); 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 81d11fc78bd..58d098cb65f 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts @@ -10,10 +10,9 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, keyFromOverrideIdentifiers } from 'vs/platform/configuration/common/configurationRegistry'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { ConfigurationEditingErrorCode } from 'vs/workbench/services/configuration/common/configurationEditingService'; import { IFileService } from 'vs/platform/files/common/files'; -import { IWorkspaceContextService, WorkbenchState, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, WorkbenchState, IWorkspaceFoldersChangeEvent, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { ConfigurationTarget, IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { workbenchInstantiationService, RemoteFileSystemProvider, TestProductService, TestEnvironmentService, TestTextFileService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; @@ -76,7 +75,7 @@ suite('WorkspaceContextService - Folder', () => { await fileService.createFolder(folder); const environmentService = TestEnvironmentService; - fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, new NullLogService()))); + fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new NullLogService()))); testObject = disposables.add(new WorkspaceService({ configurationCache: new ConfigurationCache() }, environmentService, fileService, new RemoteAgentService(null, environmentService, TestProductService, new RemoteAuthorityResolverService(undefined, undefined), new SignService(undefined), new NullLogService()), new UriIdentityService(fileService), new NullLogService())); await (testObject).initialize(convertToWorkspacePayload(folder)); }); @@ -142,7 +141,7 @@ suite('WorkspaceContextService - Workspace', () => { const environmentService = TestEnvironmentService; const remoteAgentService = disposables.add(instantiationService.createInstance(RemoteAgentService, null)); instantiationService.stub(IRemoteAgentService, remoteAgentService); - fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, new NullLogService()))); + fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new NullLogService()))); testObject = disposables.add(new WorkspaceService({ configurationCache: new ConfigurationCache() }, environmentService, fileService, remoteAgentService, new UriIdentityService(fileService), new NullLogService())); instantiationService.stub(IWorkspaceContextService, testObject); @@ -200,7 +199,7 @@ suite('WorkspaceContextService - Workspace Editing', () => { const environmentService = TestEnvironmentService; const remoteAgentService = instantiationService.createInstance(RemoteAgentService, null); instantiationService.stub(IRemoteAgentService, remoteAgentService); - fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, new NullLogService()))); + fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new NullLogService()))); testObject = disposables.add(new WorkspaceService({ configurationCache: new ConfigurationCache() }, environmentService, fileService, remoteAgentService, new UriIdentityService(fileService), new NullLogService())); instantiationService.stub(IFileService, fileService); @@ -443,7 +442,7 @@ suite('WorkspaceService - Initialization', () => { environmentService = TestEnvironmentService; const remoteAgentService = instantiationService.createInstance(RemoteAgentService, null); instantiationService.stub(IRemoteAgentService, remoteAgentService); - fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, new NullLogService()))); + fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new NullLogService()))); testObject = disposables.add(new WorkspaceService({ configurationCache: new ConfigurationCache() }, environmentService, fileService, remoteAgentService, new UriIdentityService(fileService), new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IWorkspaceContextService, testObject); @@ -692,7 +691,7 @@ suite('WorkspaceConfigurationService - Folder', () => { environmentService = TestEnvironmentService; const remoteAgentService = instantiationService.createInstance(RemoteAgentService, null); instantiationService.stub(IRemoteAgentService, remoteAgentService); - fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, new NullLogService()))); + fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new NullLogService()))); workspaceService = testObject = disposables.add(new WorkspaceService({ configurationCache: new ConfigurationCache() }, environmentService, fileService, remoteAgentService, new UriIdentityService(fileService), new NullLogService())); instantiationService.stub(IFileService, fileService); instantiationService.stub(IWorkspaceContextService, testObject); @@ -1363,7 +1362,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { environmentService = TestEnvironmentService; const remoteAgentService = instantiationService.createInstance(RemoteAgentService, null); instantiationService.stub(IRemoteAgentService, remoteAgentService); - fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, new NullLogService()))); + fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new NullLogService()))); const workspaceService = disposables.add(new WorkspaceService({ configurationCache: new ConfigurationCache() }, environmentService, fileService, remoteAgentService, new UriIdentityService(fileService), new NullLogService())); instantiationService.stub(IFileService, fileService); @@ -2023,7 +2022,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { environmentService = TestEnvironmentService; const remoteEnvironmentPromise = new Promise>(c => resolveRemoteEnvironment = () => c({ settingsPath: remoteSettingsResource })); const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); - fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, new NullLogService()))); + fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new NullLogService()))); const configurationCache: IConfigurationCache = { read: () => Promise.resolve(''), write: () => Promise.resolve(), remove: () => Promise.resolve(), needsCaching: () => false }; testObject = disposables.add(new WorkspaceService({ configurationCache, remoteAuthority }, environmentService, fileService, remoteAgentService, new UriIdentityService(fileService), new NullLogService())); instantiationService.stub(IWorkspaceContextService, testObject); diff --git a/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts index 0b4db70b166..473e7f2eca8 100644 --- a/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts @@ -14,12 +14,13 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceFolder, IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { AbstractVariableResolverService } from 'vs/workbench/services/configurationResolver/common/variableResolver'; -import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; +import { isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IQuickInputService, IInputOptions, IQuickPickItem, IPickOptions } from 'vs/platform/quickinput/common/quickInput'; import { ConfiguredInput } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { ILabelService } from 'vs/platform/label/common/label'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; +import { ITextModel } from 'vs/editor/common/model'; export abstract class BaseConfigurationResolverService extends AbstractVariableResolverService { @@ -27,8 +28,8 @@ export abstract class BaseConfigurationResolverService extends AbstractVariableR constructor( context: { - getAppRoot: () => string | undefined, - getExecPath: () => string | undefined + getAppRoot: () => string | undefined; + getExecPath: () => string | undefined; }, envVariablesPromise: Promise, editorService: IEditorService, @@ -82,13 +83,23 @@ export abstract class BaseConfigurationResolverService extends AbstractVariableR }, getSelectedText: (): string | undefined => { const activeTextEditorControl = editorService.activeTextEditorControl; + + let activeModel: ITextModel | null = null; if (isCodeEditor(activeTextEditorControl)) { - const editorModel = activeTextEditorControl.getModel(); - const editorSelection = activeTextEditorControl.getSelection(); - if (editorModel && editorSelection) { - return editorModel.getValueInRange(editorSelection); + activeModel = activeTextEditorControl.getModel(); + } + if (isDiffEditor(activeTextEditorControl)) { + if (activeTextEditorControl.getOriginalEditor().hasTextFocus()) { + activeModel = activeTextEditorControl.getOriginalEditor().getModel(); + } else { + activeModel = activeTextEditorControl.getModifiedEditor().getModel(); } } + + const activeSelection = activeTextEditorControl?.getSelection(); + if (activeModel && activeSelection) { + return activeModel.getValueInRange(activeSelection); + } return undefined; }, getLineNumber: (): string | undefined => { @@ -102,7 +113,7 @@ export abstract class BaseConfigurationResolverService extends AbstractVariableR } return undefined; } - }, labelService, envVariablesPromise); + }, labelService, pathService.userHome().then(home => home.path), envVariablesPromise); } public override async resolveWithInteractionReplace(folder: IWorkspaceFolder | undefined, config: any, section?: string, variables?: IStringDictionary, target?: ConfigurationTarget): Promise { diff --git a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts index be8987984e4..d8ba161425b 100644 --- a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts @@ -31,7 +31,7 @@ export interface IConfigurationResolverService { * Returns a copy of it with substituted values and a map of variables and their resolution. * Keys in the map will be of the format input:variableName or command:variableName. */ - resolveAnyMap(folder: IWorkspaceFolder | undefined, config: any, commandValueMapping?: IStringDictionary): Promise<{ newConfig: any, resolvedVariables: Map }>; + resolveAnyMap(folder: IWorkspaceFolder | undefined, config: any, commandValueMapping?: IStringDictionary): Promise<{ newConfig: any; resolvedVariables: Map }>; /** * Recursively resolves all variables (including commands and user input) in the given config and returns a copy of it with substituted values. @@ -67,7 +67,7 @@ export interface PickStringInputInfo { id: string; type: 'pickString'; description: string; - options: (string | { value: string, label?: string })[]; + options: (string | { value: string; label?: string })[]; default?: string; } diff --git a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts index 2621eff86f9..3106a335007 100644 --- a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts @@ -28,6 +28,8 @@ export interface IVariableResolveContext { getLineNumber(): string | undefined; } +type Environment = { env?: IProcessEnvironment; userHome?: string }; + export class AbstractVariableResolverService implements IConfigurationResolverService { static readonly VARIABLE_LHS = '${'; @@ -38,11 +40,13 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe private _context: IVariableResolveContext; private _labelService?: ILabelService; private _envVariablesPromise?: Promise; + private _userHomePromise?: Promise; protected _contributedVariables: Map Promise> = new Map(); - constructor(_context: IVariableResolveContext, _labelService?: ILabelService, _envVariablesPromise?: Promise) { + constructor(_context: IVariableResolveContext, _labelService?: ILabelService, _userHomePromise?: Promise, _envVariablesPromise?: Promise) { this._context = _context; this._labelService = _labelService; + this._userHomePromise = _userHomePromise; if (_envVariablesPromise) { this._envVariablesPromise = _envVariablesPromise.then(envVariables => { return this.prepareEnv(envVariables); @@ -70,7 +74,11 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe public async resolveAsync(root: IWorkspaceFolder | undefined, value: string[]): Promise; public async resolveAsync(root: IWorkspaceFolder | undefined, value: IStringDictionary): Promise>; public async resolveAsync(root: IWorkspaceFolder | undefined, value: any): Promise { - return this.recursiveResolve(await this._envVariablesPromise, root ? root.uri : undefined, value); + const environment: Environment = { + env: await this._envVariablesPromise, + userHome: await this._userHomePromise + }; + return this.recursiveResolve(environment, root ? root.uri : undefined, value); } private async resolveAnyBase(workspaceFolder: IWorkspaceFolder | undefined, config: any, commandValueMapping?: IStringDictionary, resolvedVariables?: Map): Promise { @@ -92,14 +100,18 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe delete result.linux; // substitute all variables recursively in string values - return this.recursiveResolve(await this._envVariablesPromise, workspaceFolder ? workspaceFolder.uri : undefined, result, commandValueMapping, resolvedVariables); + const environmentPromises: Environment = { + env: await this._envVariablesPromise, + userHome: await this._userHomePromise + }; + return this.recursiveResolve(environmentPromises, workspaceFolder ? workspaceFolder.uri : undefined, result, commandValueMapping, resolvedVariables); } public async resolveAnyAsync(workspaceFolder: IWorkspaceFolder | undefined, config: any, commandValueMapping?: IStringDictionary): Promise { return this.resolveAnyBase(workspaceFolder, config, commandValueMapping); } - public async resolveAnyMap(workspaceFolder: IWorkspaceFolder | undefined, config: any, commandValueMapping?: IStringDictionary): Promise<{ newConfig: any, resolvedVariables: Map }> { + public async resolveAnyMap(workspaceFolder: IWorkspaceFolder | undefined, config: any, commandValueMapping?: IStringDictionary): Promise<{ newConfig: any; resolvedVariables: Map }> { const resolvedVariables = new Map(); const newConfig = await this.resolveAnyBase(workspaceFolder, config, commandValueMapping, resolvedVariables); return { newConfig, resolvedVariables }; @@ -121,7 +133,7 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe } } - private recursiveResolve(environment: IProcessEnvironment | undefined, folderUri: uri | undefined, value: any, commandValueMapping?: IStringDictionary, resolvedVariables?: Map): any { + private recursiveResolve(environment: Environment, folderUri: uri | undefined, value: any, commandValueMapping?: IStringDictionary, resolvedVariables?: Map): any { if (types.isString(value)) { return this.resolveString(environment, folderUri, value, commandValueMapping, resolvedVariables); } else if (types.isArray(value)) { @@ -137,7 +149,7 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe return value; } - private resolveString(environment: IProcessEnvironment | undefined, folderUri: uri | undefined, value: string, commandValueMapping: IStringDictionary | undefined, resolvedVariables?: Map): string { + private resolveString(environment: Environment, folderUri: uri | undefined, value: string, commandValueMapping: IStringDictionary | undefined, resolvedVariables?: Map): string { // loop through all variables occurrences in 'value' const replaced = value.replace(AbstractVariableResolverService.VARIABLE_REGEXP, (match: string, variable: string) => { @@ -166,7 +178,7 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe return this._labelService ? this._labelService.getUriLabel(displayUri, { noPrefix: true }) : displayUri.fsPath; } - private evaluateSingleVariable(environment: IProcessEnvironment | undefined, match: string, variable: string, folderUri: uri | undefined, commandValueMapping: IStringDictionary | undefined): string { + private evaluateSingleVariable(environment: Environment, match: string, variable: string, folderUri: uri | undefined, commandValueMapping: IStringDictionary | undefined): string { // try to separate variable arguments from variable name let argument: string | undefined; @@ -225,9 +237,9 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe case 'env': if (argument) { - if (environment) { + if (environment.env) { // Depending on the source of the environment, on Windows, the values may all be lowercase. - const env = environment[isWindows ? argument.toLowerCase() : argument]; + const env = environment.env[isWindows ? argument.toLowerCase() : argument]; if (types.isString(env)) { return env; } @@ -270,6 +282,13 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe case 'workspaceFolderBasename': return paths.basename(this.fsPath(getFolderUri())); + case 'userHome': { + if (environment.userHome) { + return environment.userHome; + } + throw new Error(localize('canNotResolveUserHome', "Variable {0} can not be resolved. UserHome path is not defined", match)); + } + case 'lineNumber': { const lineNumber = this._context.getLineNumber(); if (lineNumber) { diff --git a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts index cd7dd738abb..210246ffc46 100644 --- a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts @@ -17,16 +17,15 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IFormatterChangeEvent, ILabelService, ResourceLabelFormatter } from 'vs/platform/label/common/label'; -import { IWorkspace, IWorkspaceFolder, Workspace } from 'vs/platform/workspace/common/workspace'; +import { IWorkspace, IWorkspaceFolder, IWorkspaceIdentifier, Workspace } from 'vs/platform/workspace/common/workspace'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; -import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { BaseConfigurationResolverService } from 'vs/workbench/services/configurationResolver/browser/configurationResolverService'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { TestEditorService, TestProductService, TestQuickInputService } from 'vs/workbench/test/browser/workbenchTestServices'; import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; -import { TestWorkbenchConfiguration } from 'vs/workbench/test/electron-browser/workbenchTestServices'; +import { TestNativeWindowConfiguration } from 'vs/workbench/test/electron-browser/workbenchTestServices'; const mockLineNumber = 10; class TestEditorServiceWithActiveEditor extends TestEditorService { @@ -658,13 +657,13 @@ class MockCommandService implements ICommandService { class MockLabelService implements ILabelService { _serviceBrand: undefined; - getUriLabel(resource: uri, options?: { relative?: boolean | undefined; noPrefix?: boolean | undefined; endWithSeparator?: boolean | undefined; }): string { + getUriLabel(resource: uri, options?: { relative?: boolean | undefined; noPrefix?: boolean | undefined; endWithSeparator?: boolean | undefined }): string { return normalize(resource.fsPath); } getUriBasenameLabel(resource: uri): string { throw new Error('Method not implemented.'); } - getWorkspaceLabel(workspace: uri | IWorkspaceIdentifier | IWorkspace, options?: { verbose: boolean; }): string { + getWorkspaceLabel(workspace: uri | IWorkspaceIdentifier | IWorkspace, options?: { verbose: boolean }): string { throw new Error('Method not implemented.'); } getHostLabel(scheme: string, authority?: string): string { @@ -691,8 +690,8 @@ class MockPathService implements IPathService { fileURI(path: string): Promise { throw new Error('Method not implemented.'); } - userHome(options?: { preferLocal: boolean; }): Promise { - throw new Error('Method not implemented.'); + async userHome(options?: { preferLocal: boolean }): Promise { + return uri.file('c:\\users\\username'); } hasValidBasename(resource: uri, basename?: string): Promise; hasValidBasename(resource: uri, os: platform.OperatingSystem, basename?: string): boolean; @@ -746,6 +745,6 @@ class MockInputsConfigurationService extends TestConfigurationService { class MockWorkbenchEnvironmentService extends NativeWorkbenchEnvironmentService { constructor(public userEnv: platform.IProcessEnvironment) { - super({ ...TestWorkbenchConfiguration, userEnv }, TestProductService); + super({ ...TestNativeWindowConfiguration, userEnv }, TestProductService); } } diff --git a/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts index c7a18004dc9..177c2b863b9 100644 --- a/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts +++ b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts @@ -111,7 +111,7 @@ class NativeContextMenuService extends Disposable implements IContextMenuService y += 4 / zoom; } } else { - const pos: { x: number; y: number; } = anchor; + const pos: { x: number; y: number } = anchor; x = pos.x + 1; /* prevent first item from being selected automatically under mouse */ y = pos.y; } diff --git a/src/vs/workbench/services/credentials/browser/credentialsService.ts b/src/vs/workbench/services/credentials/browser/credentialsService.ts index 2eeee10075e..2ee077e32a2 100644 --- a/src/vs/workbench/services/credentials/browser/credentialsService.ts +++ b/src/vs/workbench/services/credentials/browser/credentialsService.ts @@ -3,10 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ICredentialsService, ICredentialsProvider, ICredentialsChangeEvent } from 'vs/platform/credentials/common/credentials'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { ICredentialsService, ICredentialsProvider, ICredentialsChangeEvent, InMemoryCredentialsProvider } from 'vs/platform/credentials/common/credentials'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { ProxyChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; export class BrowserCredentialsService extends Disposable implements ICredentialsService { @@ -17,13 +20,27 @@ export class BrowserCredentialsService extends Disposable implements ICredential private credentialsProvider: ICredentialsProvider; - constructor(@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService) { + private _secretStoragePrefix: Promise; + public async getSecretStoragePrefix() { return this._secretStoragePrefix; } + + constructor( + @IBrowserWorkbenchEnvironmentService environmentService: IBrowserWorkbenchEnvironmentService, + @IRemoteAgentService remoteAgentService: IRemoteAgentService, + @IProductService private readonly productService: IProductService + ) { super(); - if (environmentService.options && environmentService.options.credentialsProvider) { - this.credentialsProvider = environmentService.options.credentialsProvider; + if (environmentService.remoteAuthority && !environmentService.options?.credentialsProvider) { + // If we have a remote authority but the embedder didn't provide a credentialsProvider, + // we can use the CredentialsService on the remote side + const remoteCredentialsService = ProxyChannel.toService(remoteAgentService.getConnection()!.getChannel('credentials')); + this.credentialsProvider = remoteCredentialsService; + this._secretStoragePrefix = remoteCredentialsService.getSecretStoragePrefix(); } else { - this.credentialsProvider = new InMemoryCredentialsProvider(); + // fall back to InMemoryCredentialsProvider if none was given to us. This should really only be used + // when running tests. + this.credentialsProvider = environmentService.options?.credentialsProvider ?? new InMemoryCredentialsProvider(); + this._secretStoragePrefix = Promise.resolve(this.productService.urlProtocol); } } @@ -50,7 +67,7 @@ export class BrowserCredentialsService extends Disposable implements ICredential return this.credentialsProvider.findPassword(service); } - findCredentials(service: string): Promise> { + findCredentials(service: string): Promise> { return this.credentialsProvider.findCredentials(service); } @@ -60,55 +77,3 @@ export class BrowserCredentialsService extends Disposable implements ICredential } } } - -interface ICredential { - service: string; - account: string; - password: string; -} - -class InMemoryCredentialsProvider implements ICredentialsProvider { - - private credentials: ICredential[] = []; - - async getPassword(service: string, account: string): Promise { - const credential = this.doFindPassword(service, account); - - return credential ? credential.password : null; - } - - async setPassword(service: string, account: string, password: string): Promise { - this.deletePassword(service, account); - this.credentials.push({ service, account, password }); - } - - async deletePassword(service: string, account: string): Promise { - const credential = this.doFindPassword(service, account); - if (credential) { - this.credentials.splice(this.credentials.indexOf(credential), 1); - } - - return !!credential; - } - - async findPassword(service: string): Promise { - const credential = this.doFindPassword(service); - - return credential ? credential.password : null; - } - - private doFindPassword(service: string, account?: string): ICredential | undefined { - return this.credentials.find(credential => - credential.service === service && (typeof account !== 'string' || credential.account === account)); - } - - async findCredentials(service: string): Promise> { - return this.credentials - .filter(credential => credential.service === service) - .map(({ account, password }) => ({ account, password })); - } - - async clear(): Promise { - this.credentials = []; - } -} diff --git a/src/vs/workbench/services/credentials/test/browser/credentialsService.test.ts b/src/vs/workbench/services/credentials/test/browser/credentialsService.test.ts index 6d803bf600b..18ba51382bb 100644 --- a/src/vs/workbench/services/credentials/test/browser/credentialsService.test.ts +++ b/src/vs/workbench/services/credentials/test/browser/credentialsService.test.ts @@ -6,7 +6,9 @@ import * as assert from 'assert'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { BrowserCredentialsService } from 'vs/workbench/services/credentials/browser/credentialsService'; +import { TestRemoteAgentService } from 'vs/workbench/services/remote/test/common/testServices'; import { TestEnvironmentService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestProductService } from 'vs/workbench/test/common/workbenchTestServices'; suite('CredentialsService - web', () => { const serviceId1 = 'test.credentialsService1'; @@ -14,7 +16,7 @@ suite('CredentialsService - web', () => { const disposables = new DisposableStore(); let credentialsService: BrowserCredentialsService; setup(async () => { - credentialsService = disposables.add(new BrowserCredentialsService(TestEnvironmentService)); + credentialsService = disposables.add(new BrowserCredentialsService(TestEnvironmentService, new TestRemoteAgentService(), TestProductService)); await credentialsService.setPassword(serviceId1, 'me1', '1'); await credentialsService.setPassword(serviceId1, 'me2', '2'); await credentialsService.setPassword(serviceId2, 'me3', '3'); diff --git a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts index a6f1d4e80fe..50d88e6cb37 100644 --- a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts @@ -6,14 +6,14 @@ import * as nls from 'vs/nls'; import { IWindowOpenable, isWorkspaceToOpen, isFileToOpen } from 'vs/platform/windows/common/windows'; import { IPickAndOpenOptions, ISaveDialogOptions, IOpenDialogOptions, FileFilter, IFileDialogService, IDialogService, ConfirmResult, getFileNamesMessage } from 'vs/platform/dialogs/common/dialogs'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { isUntitledWorkspace, IWorkspaceContextService, WorkbenchState, WORKSPACE_EXTENSION } from 'vs/platform/workspace/common/workspace'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; 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 { WORKSPACE_EXTENSION, isUntitledWorkspace, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IFileService } from 'vs/platform/files/common/files'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -21,7 +21,7 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; import Severity from 'vs/base/common/severity'; import { coalesce, distinct } from 'vs/base/common/arrays'; import { trim } from 'vs/base/common/strings'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ILabelService } from 'vs/platform/label/common/label'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { Schemas } from 'vs/base/common/network'; @@ -265,7 +265,7 @@ export abstract class AbstractFileDialogService implements IFileDialogService { return defaultUriScheme ?? this.pathService.defaultUriScheme; } - protected getFileSystemSchema(options: { availableFileSystems?: readonly string[], defaultUri?: URI }): string { + protected getFileSystemSchema(options: { availableFileSystems?: readonly string[]; defaultUri?: URI }): string { return options.availableFileSystems && options.availableFileSystems[0] || this.getSchemeFilterForWindow(options.defaultUri?.scheme); } @@ -295,7 +295,7 @@ export abstract class AbstractFileDialogService implements IFileDialogService { availableFileSystems }; - interface IFilter { name: string; extensions: string[]; } + interface IFilter { name: string; extensions: string[] } // Build the file filter by using our known languages const ext: string | undefined = defaultUri ? resources.extname(defaultUri) : undefined; diff --git a/src/vs/workbench/services/dialogs/browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/browser/fileDialogService.ts index 22608278df2..12efd7c86ec 100644 --- a/src/vs/workbench/services/dialogs/browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/fileDialogService.ts @@ -13,11 +13,12 @@ import { HTMLFileSystemProvider } from 'vs/platform/files/browser/htmlFileSystem import { localize } from 'vs/nls'; import { getMediaOrTextMime } from 'vs/base/common/mime'; import { basename } from 'vs/base/common/resources'; -import { triggerDownload, triggerUpload, WebFileSystemAccess } from 'vs/base/browser/dom'; +import { triggerDownload, triggerUpload } from 'vs/base/browser/dom'; import Severity from 'vs/base/common/severity'; import { VSBuffer } from 'vs/base/common/buffer'; import { extractFilesDropData } from 'vs/workbench/browser/dnd'; import { Iterable } from 'vs/base/common/iterator'; +import { WebFileSystemAccess } from 'vs/platform/files/browser/webFileSystemAccess'; export class FileDialogService extends AbstractFileDialogService implements IFileDialogService { @@ -67,6 +68,10 @@ export class FileDialogService extends AbstractFileDialogService implements IFil return; // `showOpenFilePicker` will throw an error when the user cancels } + if (!WebFileSystemAccess.isFileSystemFileHandle(fileHandle)) { + return; + } + const uri = this.fileSystemProvider.registerFileHandle(fileHandle); await this.openerService.open(uri, { fromUserGesture: true, editorOptions: { pinned: true } }); @@ -122,6 +127,10 @@ export class FileDialogService extends AbstractFileDialogService implements IFil return; // `showSaveFilePicker` will throw an error when the user cancels } + if (!WebFileSystemAccess.isFileSystemFileHandle(fileHandle)) { + return undefined; + } + return this.fileSystemProvider.registerFileHandle(fileHandle); } @@ -156,7 +165,11 @@ export class FileDialogService extends AbstractFileDialogService implements IFil try { fileHandle = await window.showSaveFilePicker({ types: this.getFilePickerTypes(options.filters), ...options.defaultUri ? { suggestedName: basename(options.defaultUri) } : undefined, ...{ startIn } }); } catch (error) { - return; // `showSaveFilePicker` will throw an error when the user cancels + return undefined; // `showSaveFilePicker` will throw an error when the user cancels + } + + if (!WebFileSystemAccess.isFileSystemFileHandle(fileHandle)) { + return undefined; } return this.fileSystemProvider.registerFileHandle(fileHandle); @@ -179,7 +192,7 @@ export class FileDialogService extends AbstractFileDialogService implements IFil try { if (options.canSelectFiles) { const handle = await window.showOpenFilePicker({ multiple: false, types: this.getFilePickerTypes(options.filters), ...{ startIn } }); - if (handle.length === 1) { + if (handle.length === 1 && WebFileSystemAccess.isFileSystemFileHandle(handle[0])) { uri = this.fileSystemProvider.registerFileHandle(handle[0]); } } else { diff --git a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts index c51f5d99a44..5aceba041df 100644 --- a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts @@ -15,7 +15,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { Schemas } from 'vs/base/common/network'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; diff --git a/src/vs/workbench/services/dialogs/electron-sandbox/fileDialogService.ts b/src/vs/workbench/services/dialogs/electron-sandbox/fileDialogService.ts index 0d7ec2d3be6..ef2ac0fca5f 100644 --- a/src/vs/workbench/services/dialogs/electron-sandbox/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-sandbox/fileDialogService.ts @@ -18,7 +18,7 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { AbstractFileDialogService } from 'vs/workbench/services/dialogs/browser/abstractFileDialogService'; import { Schemas } from 'vs/base/common/network'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { ILabelService } from 'vs/platform/label/common/label'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; @@ -59,7 +59,7 @@ export class FileDialogService extends AbstractFileDialogService implements IFil }; } - private shouldUseSimplified(schema: string): { useSimplified: boolean, isSetting: boolean } { + private shouldUseSimplified(schema: string): { useSimplified: boolean; isSetting: boolean } { const setting = (this.configurationService.getValue('files.simpleDialog.enable') === true); const newWindowSetting = (this.configurationService.getValue('window.openFilesInNewWindow') === 'on'); return { 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 80367a6b832..fbe3a518f48 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 @@ -18,7 +18,7 @@ import { FileDialogService } from 'vs/workbench/services/dialogs/electron-sandbo import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { mock } from 'vs/base/test/common/mock'; import { BrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILabelService } from 'vs/platform/label/common/label'; diff --git a/src/vs/workbench/services/editor/browser/editorResolverService.ts b/src/vs/workbench/services/editor/browser/editorResolverService.ts index ff9cf2f69ff..c3f98615478 100644 --- a/src/vs/workbench/services/editor/browser/editorResolverService.ts +++ b/src/vs/workbench/services/editor/browser/editorResolverService.ts @@ -31,12 +31,12 @@ import { Emitter } from 'vs/base/common/event'; import { IFileService } from 'vs/platform/files/common/files'; interface RegisteredEditor { - globPattern: string | glob.IRelativePattern, - editorInfo: RegisteredEditorInfo, - options?: RegisteredEditorOptions, - createEditorInput: EditorInputFactoryFunction, - createUntitledEditorInput?: UntitledEditorInputFactoryFunction | undefined, - createDiffEditorInput?: DiffEditorInputFactoryFunction + globPattern: string | glob.IRelativePattern; + editorInfo: RegisteredEditorInfo; + options?: RegisteredEditorOptions; + createEditorInput: EditorInputFactoryFunction; + createUntitledEditorInput?: UntitledEditorInputFactoryFunction | undefined; + createDiffEditorInput?: DiffEditorInputFactoryFunction; } type RegisteredEditors = Array; @@ -149,8 +149,11 @@ export class EditorResolverService extends Disposable implements IEditorResolver await this.extensionService.whenInstalledExtensionsRegistered(); } + // Undefined resource -> untilted. Other malformed URI's are unresolvable if (resource === undefined) { resource = URI.from({ scheme: Schemas.untitled }); + } else if (resource.scheme === undefined || resource === null) { + return ResolvedStatus.NONE; } if (untypedEditor.options?.override === EditorResolution.DISABLED) { @@ -296,7 +299,16 @@ export class EditorResolverService extends Disposable implements IEditorResolver } private getAllUserAssociations(): EditorAssociations { - const rawAssociations = this.configurationService.getValue<{ [fileNamePattern: string]: string }>(editorsAssociationsSettingId) || {}; + const inspectedEditorAssociations = this.configurationService.inspect<{ [fileNamePattern: string]: string }>(editorsAssociationsSettingId) || {}; + const workspaceAssociations = inspectedEditorAssociations.workspaceValue ?? {}; + const userAssociations = inspectedEditorAssociations.userValue ?? {}; + const rawAssociations: { [fileNamePattern: string]: string } = { ...workspaceAssociations }; + // We want to apply the user associations on top of the workspace associations but ignore duplicate keys. + for (const [key, value] of Object.entries(userAssociations)) { + if (rawAssociations[key] === undefined) { + rawAssociations[key] = value; + } + } let associations = []; for (const [key, value] of Object.entries(rawAssociations)) { const association: EditorAssociation = { @@ -370,7 +382,7 @@ export class EditorResolverService extends Disposable implements IEditorResolver * Given a resource and an editorId selects the best possible editor * @returns The editor and whether there was another default which conflicted with it */ - private getEditor(resource: URI, editorId: string | EditorResolution.EXCLUSIVE_ONLY | undefined): { editor: RegisteredEditor | undefined, conflictingDefault: boolean } { + private getEditor(resource: URI, editorId: string | EditorResolution.EXCLUSIVE_ONLY | undefined): { editor: RegisteredEditor | undefined; conflictingDefault: boolean } { const findMatchingEditor = (editors: RegisteredEditors, viewType: string) => { return editors.find((editor) => { @@ -519,8 +531,8 @@ export class EditorResolverService extends Disposable implements IEditorResolver private findExistingEditorsForResource( resource: URI, editorId: string, - ): Array<{ editor: EditorInput, group: IEditorGroup }> { - const out: Array<{ editor: EditorInput, group: IEditorGroup }> = []; + ): Array<{ editor: EditorInput; group: IEditorGroup }> { + const out: Array<{ editor: EditorInput; group: IEditorGroup }> = []; const orderedGroups = distinct([ ...this.editorGroupService.groups, ]); @@ -740,10 +752,10 @@ export class EditorResolverService extends Disposable implements IEditorResolver private sendEditorResolutionTelemetry(chosenInput: EditorInput): void { type editorResolutionClassification = { - viewType: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + viewType: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; }; type editorResolutionEvent = { - viewType: string + viewType: string; }; if (chosenInput.editorId) { this.telemetryService.publicLog2('override.viewType', { viewType: chosenInput.editorId }); diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 0f851595617..af368e9b00c 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -358,7 +358,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { } } - private getAllNonDirtyEditors(options: { includeUntitled: boolean, supportSideBySide: boolean }): EditorInput[] { + private getAllNonDirtyEditors(options: { includeUntitled: boolean; supportSideBySide: boolean }): EditorInput[] { const editors: EditorInput[] = []; function conditionallyAddEditor(editor: EditorInput): void { @@ -619,7 +619,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { } } - private extractEditorResources(editors: Array): { resources: URI[], diffMode?: boolean } { + private extractEditorResources(editors: Array): { resources: URI[]; diffMode?: boolean } { const resources = new ResourceMap(); let diffMode = false; diff --git a/src/vs/workbench/services/editor/common/editorGroupsService.ts b/src/vs/workbench/services/editor/common/editorGroupsService.ts index 697113b970a..d3aeb03a943 100644 --- a/src/vs/workbench/services/editor/common/editorGroupsService.ts +++ b/src/vs/workbench/services/editor/common/editorGroupsService.ts @@ -9,7 +9,7 @@ import { IEditorPane, GroupIdentifier, EditorInputWithOptions, CloseDirection, I import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IDimension } from 'vs/editor/common/editorCommon'; +import { IDimension } from 'vs/editor/common/core/dimension'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { URI } from 'vs/base/common/uri'; @@ -90,10 +90,10 @@ export interface ICloseEditorOptions { } export type ICloseEditorsFilter = { - except?: EditorInput, - direction?: CloseDirection, - savedOnly?: boolean, - excludeSticky?: boolean + except?: EditorInput; + direction?: CloseDirection; + savedOnly?: boolean; + excludeSticky?: boolean; }; export interface ICloseAllEditorsOptions { @@ -279,12 +279,12 @@ export interface IEditorGroupsService { /** * Returns the size of a group. */ - getSize(group: IEditorGroup | GroupIdentifier): { width: number, height: number }; + getSize(group: IEditorGroup | GroupIdentifier): { width: number; height: number }; /** * Sets the size of a group. */ - setSize(group: IEditorGroup | GroupIdentifier, size: { width: number, height: number }): void; + setSize(group: IEditorGroup | GroupIdentifier, size: { width: number; height: number }): void; /** * Arrange all groups according to the provided arrangement. 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 2cfb538b6cb..0b1112a1aec 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -8,7 +8,7 @@ import { EditorActivation, EditorResolution, IResourceEditorInput } from 'vs/pla 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 { workbenchInstantiationService, TestServiceAccessor, registerTestEditor, TestFileEditorInput, ITestInstantiationService, registerTestResourceEditor, registerTestSideBySideEditor, createEditorPart, registerTestFileEditor, TestEditorWithOptions, TestTextFileEditor, TestSingletonFileEditorInput } from 'vs/workbench/test/browser/workbenchTestServices'; +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'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; @@ -1408,9 +1408,8 @@ suite('EditorService', () => { let pane = await service.openEditor(new TestFileEditorInput(URI.parse('my://resource-openEditors'), TEST_EDITOR_INPUT_ID)); pane = await service.openEditor(new TestFileEditorInput(URI.parse('my://resource-openEditors'), TEST_EDITOR_INPUT_ID), { sticky: true, preserveFocus: true }); - assert.ok(pane instanceof TestEditorWithOptions); - assert.strictEqual(pane.lastSetOptions?.sticky, true); - assert.strictEqual(pane.lastSetOptions?.preserveFocus, true); + assert.strictEqual(pane?.options?.sticky, true); + assert.strictEqual(pane?.options?.preserveFocus, true); await pane.group?.closeAllEditors(); @@ -1419,16 +1418,15 @@ suite('EditorService', () => { pane = await service.openEditor({ resource: URI.file('resource-openEditors'), options: { sticky: true, preserveFocus: true } }); assert.ok(pane instanceof TestTextFileEditor); - assert.strictEqual(pane.lastSetOptions?.sticky, true); - assert.strictEqual(pane.lastSetOptions?.preserveFocus, true); + assert.strictEqual(pane?.options?.sticky, true); + assert.strictEqual(pane?.options?.preserveFocus, true); // Untyped editor (with registered editor) pane = await service.openEditor({ resource: URI.file('file.editor-service-override-tests') }); pane = await service.openEditor({ resource: URI.file('file.editor-service-override-tests'), options: { sticky: true, preserveFocus: true } }); - assert.ok(pane instanceof TestEditorWithOptions); - assert.strictEqual(pane.lastSetOptions?.sticky, true); - assert.strictEqual(pane.lastSetOptions?.preserveFocus, true); + assert.strictEqual(pane?.options?.sticky, true); + assert.strictEqual(pane?.options?.preserveFocus, true); }); test('isOpen() with side by side editor', async () => { diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index c69f4256db6..7bcbc4a6299 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -6,101 +6,36 @@ import { Schemas } from 'vs/base/common/network'; import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { generateUuid } from 'vs/base/common/uuid'; -import { IExtensionHostDebugParams } from 'vs/platform/environment/common/environment'; -import { IPath, IWindowConfiguration } from 'vs/platform/windows/common/windows'; +import { ExtensionKind, IEnvironmentService, IExtensionHostDebugParams } from 'vs/platform/environment/common/environment'; +import { IPath } from 'vs/platform/windows/common/windows'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import type { IWorkbenchConstructionOptions as IWorkbenchOptions } from 'vs/workbench/workbench.web.api'; +import { IWorkbenchConstructionOptions } from 'vs/workbench/browser/web.api'; import { IProductService } from 'vs/platform/product/common/productService'; import { memoize } from 'vs/base/common/decorators'; import { onUnexpectedError } from 'vs/base/common/errors'; import { parseLineAndColumnAware } from 'vs/base/common/extpath'; import { LogLevelToString } from 'vs/platform/log/common/log'; -import { ExtensionKind } from 'vs/platform/extensions/common/extensions'; import { isUndefined } from 'vs/base/common/types'; +import { refineServiceDecorator } from 'vs/platform/instantiation/common/instantiation'; -class BrowserWorkbenchConfiguration implements IWindowConfiguration { +export const IBrowserWorkbenchEnvironmentService = refineServiceDecorator(IEnvironmentService); - constructor( - private readonly options: IBrowserWorkbenchOptions, - private readonly payload: Map | undefined - ) { } +/** + * A subclass of the `IWorkbenchEnvironmentService` to be used only environments + * where the web API is available (browsers, Electron). + */ +export interface IBrowserWorkbenchEnvironmentService extends IWorkbenchEnvironmentService { - @memoize - get sessionId(): string { return generateUuid(); } - - @memoize - get remoteAuthority(): string | undefined { return this.options.remoteAuthority; } - - @memoize - get filesToOpenOrCreate(): IPath[] | undefined { - if (this.payload) { - const fileToOpen = this.payload.get('openFile'); - if (fileToOpen) { - const fileUri = URI.parse(fileToOpen); - - // Support: --goto parameter to open on line/col - if (this.payload.has('gotoLineMode')) { - const pathColumnAware = parseLineAndColumnAware(fileUri.path); - - return [{ - fileUri: fileUri.with({ path: pathColumnAware.path }), - selection: !isUndefined(pathColumnAware.line) ? { startLineNumber: pathColumnAware.line, startColumn: pathColumnAware.column || 1 } : undefined - }]; - } - - return [{ fileUri }]; - } - } - - return undefined; - } - - @memoize - get filesToDiff(): IPath[] | undefined { - if (this.payload) { - const fileToDiffPrimary = this.payload.get('diffFilePrimary'); - const fileToDiffSecondary = this.payload.get('diffFileSecondary'); - if (fileToDiffPrimary && fileToDiffSecondary) { - return [ - { fileUri: URI.parse(fileToDiffSecondary) }, - { fileUri: URI.parse(fileToDiffPrimary) } - ]; - } - } - - return undefined; - } + /** + * Options used to configure the workbench. + */ + readonly options?: IWorkbenchConstructionOptions; } -interface IBrowserWorkbenchOptions extends IWorkbenchOptions { - workspaceId: string; - logsPath: URI; -} - -interface IExtensionHostDebugEnvironment { - params: IExtensionHostDebugParams; - debugRenderer: boolean; - isExtensionDevelopment: boolean; - extensionDevelopmentLocationURI?: URI[]; - extensionDevelopmentKind?: ExtensionKind[]; - extensionTestsLocationURI?: URI; - extensionEnabledProposedApi?: string[]; -} - -export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironmentService { +export class BrowserWorkbenchEnvironmentService implements IBrowserWorkbenchEnvironmentService { declare readonly _serviceBrand: undefined; - private _configuration: IWindowConfiguration | undefined = undefined; - get configuration(): IWindowConfiguration { - if (!this._configuration) { - this._configuration = new BrowserWorkbenchConfiguration(this.options, this.payload); - } - - return this._configuration; - } - @memoize get remoteAuthority(): string | undefined { return this.options.remoteAuthority; } @@ -108,13 +43,13 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment get isBuilt(): boolean { return !!this.productService.commit; } @memoize - get logsPath(): string { return this.options.logsPath.path; } + get logsPath(): string { return this.logsHome.path; } @memoize get logLevel(): string | undefined { return this.payload?.get('logLevel') || (this.options.developmentOptions?.logLevel !== undefined ? LogLevelToString(this.options.developmentOptions?.logLevel) : undefined); } @memoize - get logFile(): URI { return joinPath(this.options.logsPath, 'window.log'); } + get logFile(): URI { return joinPath(this.logsHome, 'window.log'); } @memoize get userRoamingDataHome(): URI { return URI.file('/User').with({ scheme: Schemas.userData }); } @@ -137,16 +72,18 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment @memoize get workspaceStorageHome(): URI { return URI.joinPath(this.userRoamingDataHome, 'workspaceStorage'); } - /* - * In Web every workspace can potentially have scoped user-data and/or extensions and if Sync state is shared then it can make - * Sync error prone - say removing extensions from another workspace. Hence scope Sync state per workspace. - * Sync scoped to a workspace is capable of handling opening same workspace in multiple windows. + /** + * In Web every workspace can potentially have scoped user-data + * and/or extensions and if Sync state is shared then it can make + * Sync error prone - say removing extensions from another workspace. + * Hence scope Sync state per workspace. Sync scoped to a workspace + * is capable of handling opening same workspace in multiple windows. */ @memoize - get userDataSyncHome(): URI { return joinPath(this.userRoamingDataHome, 'sync', this.options.workspaceId); } + get userDataSyncHome(): URI { return joinPath(this.userRoamingDataHome, 'sync', this.workspaceId); } @memoize - get userDataSyncLogResource(): URI { return joinPath(this.options.logsPath, 'userDataSync.log'); } + get userDataSyncLogResource(): URI { return joinPath(this.logsHome, 'userDataSync.log'); } @memoize get sync(): 'on' | 'off' | undefined { return undefined; } @@ -164,67 +101,77 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment get serviceMachineIdResource(): URI { return joinPath(this.userRoamingDataHome, 'machineid'); } @memoize - get extHostLogsPath(): URI { return joinPath(this.options.logsPath, 'exthost'); } + get extHostLogsPath(): URI { return joinPath(this.logsHome, 'exthost'); } - private _extensionHostDebugEnvironment: IExtensionHostDebugEnvironment | undefined = undefined; + private extensionHostDebugEnvironment: IExtensionHostDebugEnvironment | undefined = undefined; + + @memoize get debugExtensionHost(): IExtensionHostDebugParams { - if (!this._extensionHostDebugEnvironment) { - this._extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); + if (!this.extensionHostDebugEnvironment) { + this.extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); } - return this._extensionHostDebugEnvironment.params; + return this.extensionHostDebugEnvironment.params; } + @memoize get isExtensionDevelopment(): boolean { - if (!this._extensionHostDebugEnvironment) { - this._extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); + if (!this.extensionHostDebugEnvironment) { + this.extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); } - return this._extensionHostDebugEnvironment.isExtensionDevelopment; + return this.extensionHostDebugEnvironment.isExtensionDevelopment; } + @memoize get extensionDevelopmentLocationURI(): URI[] | undefined { - if (!this._extensionHostDebugEnvironment) { - this._extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); + if (!this.extensionHostDebugEnvironment) { + this.extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); } - return this._extensionHostDebugEnvironment.extensionDevelopmentLocationURI; + return this.extensionHostDebugEnvironment.extensionDevelopmentLocationURI; } + @memoize get extensionDevelopmentLocationKind(): ExtensionKind[] | undefined { - if (!this._extensionHostDebugEnvironment) { - this._extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); + if (!this.extensionHostDebugEnvironment) { + this.extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); } - return this._extensionHostDebugEnvironment.extensionDevelopmentKind; + return this.extensionHostDebugEnvironment.extensionDevelopmentKind; } + @memoize get extensionTestsLocationURI(): URI | undefined { - if (!this._extensionHostDebugEnvironment) { - this._extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); + if (!this.extensionHostDebugEnvironment) { + this.extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); } - return this._extensionHostDebugEnvironment.extensionTestsLocationURI; + return this.extensionHostDebugEnvironment.extensionTestsLocationURI; } + @memoize get extensionEnabledProposedApi(): string[] | undefined { - if (!this._extensionHostDebugEnvironment) { - this._extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); + if (!this.extensionHostDebugEnvironment) { + this.extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); } - return this._extensionHostDebugEnvironment.extensionEnabledProposedApi; + return this.extensionHostDebugEnvironment.extensionEnabledProposedApi; } + @memoize get debugRenderer(): boolean { - if (!this._extensionHostDebugEnvironment) { - this._extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); + if (!this.extensionHostDebugEnvironment) { + this.extensionHostDebugEnvironment = this.resolveExtensionHostDebugEnvironment(); } - return this._extensionHostDebugEnvironment.debugRenderer; + return this.extensionHostDebugEnvironment.debugRenderer; } + @memoize get disableExtensions() { return this.payload?.get('disableExtensions') === 'true'; } + @memoize get enableExtensions() { return this.options.enabledExtensions; } @memoize @@ -240,13 +187,21 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment } @memoize - get telemetryLogResource(): URI { return joinPath(this.options.logsPath, 'telemetry.log'); } + get telemetryLogResource(): URI { return joinPath(this.logsHome, 'telemetry.log'); } + + @memoize get disableTelemetry(): boolean { return false; } + @memoize get verbose(): boolean { return this.payload?.get('verbose') === 'true'; } + + @memoize get logExtensionHostCommunication(): boolean { return this.payload?.get('logExtensionHostCommunication') === 'true'; } + @memoize get skipReleaseNotes(): boolean { return false; } + + @memoize get skipWelcome(): boolean { return this.payload?.get('skipWelcome') === 'true'; } @memoize @@ -255,7 +210,9 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment private payload: Map | undefined; constructor( - readonly options: IBrowserWorkbenchOptions, + private readonly workspaceId: string, + private readonly logsHome: URI, + readonly options: IWorkbenchConstructionOptions, private readonly productService: IProductService ) { if (options.workspaceProvider && Array.isArray(options.workspaceProvider.payload)) { @@ -322,6 +279,7 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment extensionHostDebugEnvironment.extensionDevelopmentLocationURI = developmentOptions.extensions.map(e => URI.revive(e)); extensionHostDebugEnvironment.isExtensionDevelopment = true; } + if (developmentOptions.extensionTestsPath) { extensionHostDebugEnvironment.extensionTestsLocationURI = URI.revive(developmentOptions.extensionTestsPath); } @@ -329,4 +287,54 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment return extensionHostDebugEnvironment; } + + @memoize + get filesToOpenOrCreate(): IPath[] | undefined { + if (this.payload) { + const fileToOpen = this.payload.get('openFile'); + if (fileToOpen) { + const fileUri = URI.parse(fileToOpen); + + // Support: --goto parameter to open on line/col + if (this.payload.has('gotoLineMode')) { + const pathColumnAware = parseLineAndColumnAware(fileUri.path); + + return [{ + fileUri: fileUri.with({ path: pathColumnAware.path }), + selection: !isUndefined(pathColumnAware.line) ? { startLineNumber: pathColumnAware.line, startColumn: pathColumnAware.column || 1 } : undefined + }]; + } + + return [{ fileUri }]; + } + } + + return undefined; + } + + @memoize + get filesToDiff(): IPath[] | undefined { + if (this.payload) { + const fileToDiffPrimary = this.payload.get('diffFilePrimary'); + const fileToDiffSecondary = this.payload.get('diffFileSecondary'); + if (fileToDiffPrimary && fileToDiffSecondary) { + return [ + { fileUri: URI.parse(fileToDiffSecondary) }, + { fileUri: URI.parse(fileToDiffPrimary) } + ]; + } + } + + return undefined; + } +} + +interface IExtensionHostDebugEnvironment { + params: IExtensionHostDebugParams; + debugRenderer: boolean; + isExtensionDevelopment: boolean; + extensionDevelopmentLocationURI?: URI[]; + extensionDevelopmentKind?: ExtensionKind[]; + extensionTestsLocationURI?: URI; + extensionEnabledProposedApi?: string[]; } diff --git a/src/vs/workbench/services/environment/common/environmentService.ts b/src/vs/workbench/services/environment/common/environmentService.ts index cf2cf61cde2..d07a3390294 100644 --- a/src/vs/workbench/services/environment/common/environmentService.ts +++ b/src/vs/workbench/services/environment/common/environmentService.ts @@ -4,15 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { refineServiceDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IWindowConfiguration } from 'vs/platform/windows/common/windows'; +import { IPath } from 'vs/platform/windows/common/windows'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import type { IWorkbenchConstructionOptions as IWorkbenchOptions } from 'vs/workbench/workbench.web.api'; import { URI } from 'vs/base/common/uri'; export const IWorkbenchEnvironmentService = refineServiceDecorator(IEnvironmentService); -export interface IWorkbenchConfiguration extends IWindowConfiguration { } - /** * A workbench specific environment service that is only present in workbench * layer. @@ -25,33 +22,27 @@ export interface IWorkbenchEnvironmentService extends IEnvironmentService { // ENVIRONMENT SERVICE // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - readonly options?: IWorkbenchOptions; - - readonly remoteAuthority?: string; - + // --- Paths readonly logFile: URI; - readonly extHostLogsPath: URI; - readonly logExtensionHostCommunication?: boolean; + + // --- Extensions readonly extensionEnabledProposedApi?: string[]; - readonly webviewExternalEndpoint: string; - + // --- Config + readonly remoteAuthority?: string; readonly skipReleaseNotes: boolean; readonly skipWelcome: boolean; - - readonly debugRenderer: boolean; - readonly disableWorkspaceTrust: boolean; + readonly webviewExternalEndpoint: string; - /** - * @deprecated this property will go away eventually as it - * duplicates many properties of the environment service - * - * Please consider using the environment service directly - * if you can. - */ - readonly configuration: IWorkbenchConfiguration; + // --- Development + readonly debugRenderer: boolean; + readonly logExtensionHostCommunication?: boolean; + + // --- Editors to open + readonly filesToOpenOrCreate?: IPath[] | undefined; + readonly filesToDiff?: IPath[] | undefined; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: KEEP THIS INTERFACE AS SMALL AS POSSIBLE. AS SUCH: diff --git a/src/vs/workbench/services/environment/electron-sandbox/environmentService.ts b/src/vs/workbench/services/environment/electron-sandbox/environmentService.ts index 6ebcaf2855a..903f6dd7e0e 100644 --- a/src/vs/workbench/services/environment/electron-sandbox/environmentService.ts +++ b/src/vs/workbench/services/environment/electron-sandbox/environmentService.ts @@ -3,8 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IWorkbenchConfiguration, IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { INativeWindowConfiguration, IOSConfiguration } from 'vs/platform/windows/common/windows'; +import { PerformanceMark } from 'vs/base/common/performance'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; +import { IColorScheme, INativeWindowConfiguration, IOSConfiguration, IPath, IPathsToWaitFor } from 'vs/platform/windows/common/windows'; import { IEnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; import { refineServiceDecorator } from 'vs/platform/instantiation/common/instantiation'; import { AbstractNativeEnvironmentService } from 'vs/platform/environment/common/environmentService'; @@ -16,37 +17,45 @@ import { IProductService } from 'vs/platform/product/common/productService'; export const INativeWorkbenchEnvironmentService = refineServiceDecorator(IEnvironmentService); -export interface INativeWorkbenchConfiguration extends IWorkbenchConfiguration, INativeWindowConfiguration { } - /** * A subclass of the `IWorkbenchEnvironmentService` to be used only in native * environments (Windows, Linux, macOS) but not e.g. web. */ -export interface INativeWorkbenchEnvironmentService extends IWorkbenchEnvironmentService, INativeEnvironmentService { +export interface INativeWorkbenchEnvironmentService extends IBrowserWorkbenchEnvironmentService, INativeEnvironmentService { + // --- Window + readonly window: { + id: number; + colorScheme: IColorScheme; + maximized?: boolean; + accessibilitySupport?: boolean; + isInitialStartup?: boolean; + isCodeCaching?: boolean; + perfMarks: PerformanceMark[]; + }; + + // --- Main + readonly mainPid: number; + readonly os: IOSConfiguration; readonly machineId: string; + // --- Paths + readonly execPath: string; + readonly backupPath?: string; + + // --- Development readonly crashReporterDirectory?: string; readonly crashReporterId?: string; - readonly execPath: string; - - readonly log?: string; - - readonly os: IOSConfiguration; - - /** - * @deprecated this property will go away eventually as it - * duplicates many properties of the environment service - * - * Please consider using the environment service directly - * if you can. - */ - readonly configuration: INativeWorkbenchConfiguration; + // --- Editors to --wait + readonly filesToWait?: IPathsToWaitFor; } export class NativeWorkbenchEnvironmentService extends AbstractNativeEnvironmentService implements INativeWorkbenchEnvironmentService { + @memoize + get mainPid() { return this.configuration.mainPid; } + @memoize get machineId() { return this.configuration.machineId; } @@ -56,6 +65,22 @@ export class NativeWorkbenchEnvironmentService extends AbstractNativeEnvironment @memoize get execPath() { return this.configuration.execPath; } + @memoize + get backupPath() { return this.configuration.backupPath; } + + @memoize + get window() { + return { + id: this.configuration.windowId, + colorScheme: this.configuration.colorScheme, + maximized: this.configuration.maximized, + accessibilitySupport: this.configuration.accessibilitySupport, + perfMarks: this.configuration.perfMarks, + isInitialStartup: this.configuration.isInitialStartup, + isCodeCaching: typeof this.configuration.codeCachePath === 'string' + }; + } + @memoize override get userRoamingDataHome(): URI { return this.appSettingsHome.with({ scheme: Schemas.userData }); } @@ -90,12 +115,20 @@ export class NativeWorkbenchEnvironmentService extends AbstractNativeEnvironment return undefined; } - get os(): IOSConfiguration { - return this.configuration.os; - } + @memoize + get os(): IOSConfiguration { return this.configuration.os; } + + @memoize + get filesToOpenOrCreate(): IPath[] | undefined { return this.configuration.filesToOpenOrCreate; } + + @memoize + get filesToDiff(): IPath[] | undefined { return this.configuration.filesToDiff; } + + @memoize + get filesToWait(): IPathsToWaitFor | undefined { return this.configuration.filesToWait; } constructor( - readonly configuration: INativeWorkbenchConfiguration, + private readonly configuration: INativeWindowConfiguration, productService: IProductService ) { super(configuration, { homeDir: configuration.homeDir, tmpDir: configuration.tmpDir, userDataDir: configuration.userDataDir }, productService); diff --git a/src/vs/workbench/services/extensionManagement/browser/extensionBisect.ts b/src/vs/workbench/services/extensionManagement/browser/extensionBisect.ts index 6561c81242c..c444de80596 100644 --- a/src/vs/workbench/services/extensionManagement/browser/extensionBisect.ts +++ b/src/vs/workbench/services/extensionManagement/browser/extensionBisect.ts @@ -36,7 +36,7 @@ export interface IExtensionBisectService { isActive: boolean; disabledCount: number; start(extensions: ILocalExtension[]): Promise; - next(seeingBad: boolean): Promise<{ id: string, bad: boolean } | undefined>; + next(seeingBad: boolean): Promise<{ id: string; bad: boolean } | undefined>; reset(): Promise; } @@ -129,7 +129,7 @@ class ExtensionBisectService implements IExtensionBisectService { await this._storageService.flush(); } - async next(seeingBad: boolean): Promise<{ id: string; bad: boolean; } | undefined> { + async next(seeingBad: boolean): Promise<{ id: string; bad: boolean } | undefined> { if (!this._state) { throw new Error('invalid state'); } @@ -257,7 +257,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: 'extension.bisect.next', - title: localize('title.isBad', "Continue Extension Bisect"), + title: { value: localize('title.isBad', "Continue Extension Bisect"), original: 'Continue Extension Bisect' }, category: localize('help', "Help"), f1: true, precondition: ExtensionBisectUi.ctxIsBisectActive @@ -344,7 +344,7 @@ registerAction2(class extends Action2 { constructor() { super({ id: 'extension.bisect.stop', - title: localize('title.stop', "Stop Extension Bisect"), + title: { value: localize('title.stop', "Stop Extension Bisect"), original: 'Stop Extension Bisect' }, category: localize('help', "Help"), f1: true, precondition: ExtensionBisectUi.ctxIsBisectActive diff --git a/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.ts b/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.ts index 12bb00c76e7..4378974e872 100644 --- a/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.ts @@ -25,13 +25,13 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IExtensionBisectService } from 'vs/workbench/services/extensionManagement/browser/extensionBisect'; import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust'; import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; -import { isVirtualWorkspace } from 'vs/platform/remote/common/remoteHosts'; +import { isVirtualWorkspace } from 'vs/platform/workspace/common/virtualWorkspace'; import { ILogService } from 'vs/platform/log/common/log'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; const SOURCE = 'IWorkbenchExtensionEnablementService'; -type WorkspaceType = { readonly virtual: boolean, readonly trusted: boolean }; +type WorkspaceType = { readonly virtual: boolean; readonly trusted: boolean }; export class ExtensionEnablementService extends Disposable implements IWorkbenchExtensionEnablementService { @@ -589,7 +589,7 @@ class ExtensionsManager extends Disposable { private _extensions: IExtension[] = []; get extensions(): readonly IExtension[] { return this._extensions; } - private _onDidChangeExtensions = this._register(new Emitter<{ added: readonly IExtension[], removed: readonly IExtension[] }>()); + private _onDidChangeExtensions = this._register(new Emitter<{ added: readonly IExtension[]; removed: readonly IExtension[] }>()); readonly onDidChangeExtensions = this._onDidChangeExtensions.event; private readonly initializePromise; diff --git a/src/vs/workbench/services/extensionManagement/common/webExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts similarity index 96% rename from src/vs/workbench/services/extensionManagement/common/webExtensionsScannerService.ts rename to src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts index dfde2fbb988..cbcf56f4c96 100644 --- a/src/vs/workbench/services/extensionManagement/common/webExtensionsScannerService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IBuiltinExtensionsScannerService, ExtensionType, IExtensionIdentifier, IExtension, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IScannedExtension, IWebExtensionsScannerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { isWeb } from 'vs/base/common/platform'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -34,7 +34,7 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { basename } from 'vs/base/common/path'; import { IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; -type GalleryExtensionInfo = { readonly id: string, preRelease?: boolean, migrateStorageFrom?: string }; +type GalleryExtensionInfo = { readonly id: string; preRelease?: boolean; migrateStorageFrom?: string }; function isGalleryExtensionInfo(obj: unknown): obj is GalleryExtensionInfo { const galleryExtensionInfo = obj as GalleryExtensionInfo | undefined; @@ -68,7 +68,6 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten declare readonly _serviceBrand: undefined; private readonly builtinExtensionsPromise: Promise = Promise.resolve([]); - private readonly cutomBuiltinExtensions: (GalleryExtensionInfo | UriComponents)[]; private readonly customBuiltinExtensionsPromise: Promise = Promise.resolve([]); private readonly customBuiltinExtensionsCacheResource: URI | undefined = undefined; @@ -76,7 +75,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten private readonly resourcesAccessQueueMap = new ResourceMap>(); constructor( - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService, @IBuiltinExtensionsScannerService private readonly builtinExtensionsScannerService: IBuiltinExtensionsScannerService, @IFileService private readonly fileService: IFileService, @ILogService private readonly logService: ILogService, @@ -86,9 +85,6 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten @IExtensionStorageService private readonly extensionStorageService: IExtensionStorageService, ) { super(); - this.cutomBuiltinExtensions = this.environmentService.options && Array.isArray(this.environmentService.options.additionalBuiltinExtensions) - ? this.environmentService.options.additionalBuiltinExtensions.map(additionalBuiltinExtension => isString(additionalBuiltinExtension) ? { id: additionalBuiltinExtension } : additionalBuiltinExtension) - : []; if (isWeb) { this.installedExtensionsResource = joinPath(environmentService.userRoamingDataHome, 'extensions.json'); this.customBuiltinExtensionsCacheResource = joinPath(environmentService.userRoamingDataHome, 'customBuiltinExtensionsCache.json'); @@ -109,9 +105,12 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten * All extensions defined via `additionalBuiltinExtensions` API */ private async readCustomBuiltinExtensions(): Promise { - const extensions: { id: string, preRelease: boolean }[] = [], extensionLocations: URI[] = [], result: IExtension[] = []; + const extensions: { id: string; preRelease: boolean }[] = [], extensionLocations: URI[] = [], result: IExtension[] = []; const extensionsToMigrate: [string, string][] = []; - for (const e of this.cutomBuiltinExtensions) { + const cutomBuiltinExtensions: (GalleryExtensionInfo | UriComponents)[] = this.environmentService.options && Array.isArray(this.environmentService.options.additionalBuiltinExtensions) + ? this.environmentService.options.additionalBuiltinExtensions.map(additionalBuiltinExtension => isString(additionalBuiltinExtension) ? { id: additionalBuiltinExtension } : additionalBuiltinExtension) + : []; + for (const e of cutomBuiltinExtensions) { if (isGalleryExtensionInfo(e)) { extensions.push({ id: e.id, preRelease: !!e.preRelease }); if (e.migrateStorageFrom) { @@ -170,9 +169,9 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return result; } - private async checkAdditionalBuiltinExtensions(extensions: { id: string, preRelease: boolean }[]): Promise<{ id: string, preRelease: boolean }[]> { + private async checkAdditionalBuiltinExtensions(extensions: { id: string; preRelease: boolean }[]): Promise<{ id: string; preRelease: boolean }[]> { const extensionsControlManifest = await this.galleryService.getExtensionsControlManifest(); - const result: { id: string, preRelease: boolean }[] = []; + const result: { id: string; preRelease: boolean }[] = []; for (const extension of extensions) { if (extensionsControlManifest.malicious.some(e => areSameExtensions(e, { id: extension.id }))) { this.logService.info(`Checking additional builtin extensions: Ignoring '${extension.id}' because it is reported to be malicious.`); @@ -189,7 +188,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return result; } - private async getCustomBuiltinExtensionsFromGallery(extensions: { id: string, preRelease: boolean }[]): Promise { + private async getCustomBuiltinExtensionsFromGallery(extensions: { id: string; preRelease: boolean }[]): Promise { if (!this.galleryService.isEnabled()) { this.logService.info('Ignoring fetching additional builtin extensions from gallery as it is disabled.'); return []; @@ -330,7 +329,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten } private async addWebExtension(webExtension: IWebExtension) { - const isBuiltin = this.cutomBuiltinExtensions.some(id => isString(id) && areSameExtensions(webExtension.identifier, { id })); + const isBuiltin = (await this.customBuiltinExtensionsPromise).some(builtinExtension => areSameExtensions(webExtension.identifier, builtinExtension.identifier)); const extension = await this.toScannedExtension(webExtension, isBuiltin); // Update custom builtin extensions to custom builtin extensions cache diff --git a/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts b/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts index c83ccfb933b..e4927610b9c 100644 --- a/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts +++ b/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts @@ -73,7 +73,7 @@ export class TestExtensionEnablementService extends ExtensionEnablementService { storageService, new GlobalExtensionEnablementService(storageService, extensionManagementService), instantiationService.get(IWorkspaceContextService) || new TestContextService(), - instantiationService.get(IWorkbenchEnvironmentService) || instantiationService.stub(IWorkbenchEnvironmentService, { configuration: Object.create(null) } as IWorkbenchEnvironmentService), + instantiationService.get(IWorkbenchEnvironmentService) || instantiationService.stub(IWorkbenchEnvironmentService, {} as IWorkbenchEnvironmentService), workbenchExtensionManagementService, instantiationService.get(IConfigurationService), extensionManagementServerService, diff --git a/src/vs/workbench/services/extensionRecommendations/common/extensionRecommendations.ts b/src/vs/workbench/services/extensionRecommendations/common/extensionRecommendations.ts index 3d993c896ca..d23438cde77 100644 --- a/src/vs/workbench/services/extensionRecommendations/common/extensionRecommendations.ts +++ b/src/vs/workbench/services/extensionRecommendations/common/extensionRecommendations.ts @@ -40,16 +40,16 @@ export interface IExtensionRecommendationsService { getImportantRecommendations(): Promise; getOtherRecommendations(): Promise; getFileBasedRecommendations(): string[]; - getExeBasedRecommendations(exe?: string): Promise<{ important: string[], others: string[] }>; - getConfigBasedRecommendations(): Promise<{ important: string[], others: string[] }>; + getExeBasedRecommendations(exe?: string): Promise<{ important: string[]; others: string[] }>; + getConfigBasedRecommendations(): Promise<{ important: string[]; others: string[] }>; getWorkspaceRecommendations(): Promise; getKeymapRecommendations(): string[]; getLanguageRecommendations(): string[]; } export type IgnoredRecommendationChangeNotification = { - extensionId: string, - isRecommended: boolean + extensionId: string; + isRecommended: boolean; }; export const IExtensionIgnoredRecommendationsService = createDecorator('IExtensionIgnoredRecommendationsService'); diff --git a/src/vs/workbench/services/extensionRecommendations/common/workspaceExtensionsConfig.ts b/src/vs/workbench/services/extensionRecommendations/common/workspaceExtensionsConfig.ts index 2011bdee47c..9dc232e8ab2 100644 --- a/src/vs/workbench/services/extensionRecommendations/common/workspaceExtensionsConfig.ts +++ b/src/vs/workbench/services/extensionRecommendations/common/workspaceExtensionsConfig.ts @@ -14,7 +14,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { isWorkspace, IWorkspace, IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { localize } from 'vs/nls'; import { URI } from 'vs/base/common/uri'; import { IJSONEditingService, IJSONValue } from 'vs/workbench/services/configuration/common/jsonEditing'; diff --git a/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader.ts b/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader.ts index e8f41ff6e41..a790241645c 100644 --- a/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader.ts +++ b/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader.ts @@ -12,10 +12,13 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IFileService } from 'vs/platform/files/common/files'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProductService } from 'vs/platform/product/common/productService'; -import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; +import { getServiceMachineId } from 'vs/platform/externalServices/common/serviceMachineId'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; import { getTelemetryLevel, supportsTelemetry } from 'vs/platform/telemetry/common/telemetryUtils'; +import { RemoteAuthorities } from 'vs/base/common/network'; + +export const WEB_EXTENSION_RESOURCE_END_POINT = 'web-extension-resource'; export const IExtensionResourceLoaderService = createDecorator('extensionResourceLoaderService'); @@ -38,7 +41,7 @@ export interface IExtensionResourceLoaderService { /** * Computes the URL of a extension gallery resource. Returns `undefined` if gallery does not provide extension resources. */ - getExtensionGalleryResourceURL(galleryExtension: { publisher: string, name: string, version: string }, path?: string): URI | undefined; + getExtensionGalleryResourceURL(galleryExtension: { publisher: string; name: string; version: string }, path?: string): URI | undefined; } @@ -66,9 +69,10 @@ export abstract class AbstractExtensionResourceLoaderService implements IExtensi return this._extensionGalleryResourceUrlTemplate !== undefined; } - public getExtensionGalleryResourceURL(galleryExtension: { publisher: string, name: string, version: string }, path?: string): URI | undefined { + public getExtensionGalleryResourceURL(galleryExtension: { publisher: string; name: string; version: string }, path?: string): URI | undefined { if (this._extensionGalleryResourceUrlTemplate) { - return URI.parse(format2(this._extensionGalleryResourceUrlTemplate, { publisher: galleryExtension.publisher, name: galleryExtension.name, version: galleryExtension.version, path: 'extension' })); + const uri = URI.parse(format2(this._extensionGalleryResourceUrlTemplate, { publisher: galleryExtension.publisher, name: galleryExtension.name, version: galleryExtension.version, path: 'extension' })); + return this._isWebExtensionResourceEndPoint(uri) ? uri.with({ scheme: RemoteAuthorities.getPreferredWebSchema() }) : uri; } return undefined; } @@ -103,8 +107,15 @@ export abstract class AbstractExtensionResourceLoaderService implements IExtensi } private _getExtensionGalleryAuthority(uri: URI): string | undefined { + if (this._isWebExtensionResourceEndPoint(uri)) { + return uri.authority; + } const index = uri.authority.indexOf('.'); return index !== -1 ? uri.authority.substring(index + 1) : undefined; } + protected _isWebExtensionResourceEndPoint(uri: URI): boolean { + return uri.path.startsWith(`/${WEB_EXTENSION_RESOURCE_END_POINT}/`); + } + } diff --git a/src/vs/workbench/services/extensions/browser/extensionService.ts b/src/vs/workbench/services/extensions/browser/extensionService.ts index bc46eaf51eb..33c451aad97 100644 --- a/src/vs/workbench/services/extensions/browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/browser/extensionService.ts @@ -18,7 +18,8 @@ import { RemoteExtensionHost, IRemoteExtensionHostDataProvider, IRemoteExtension import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { WebWorkerExtensionHost } from 'vs/workbench/services/extensions/browser/webWorkerExtensionHost'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ExtensionIdentifier, IExtensionDescription, ExtensionKind, IExtension, ExtensionType } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription, IExtension, ExtensionType } from 'vs/platform/extensions/common/extensions'; +import { ExtensionKind } from 'vs/platform/environment/common/environment'; import { FetchFileSystemProvider } from 'vs/workbench/services/extensions/browser/webWorkerFileSystemProvider'; import { Schemas } from 'vs/base/common/network'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/extensions/browser/extensionUrlHandler.ts b/src/vs/workbench/services/extensions/browser/extensionUrlHandler.ts index 6dd20722202..8d3a37985b0 100644 --- a/src/vs/workbench/services/extensions/browser/extensionUrlHandler.ts +++ b/src/vs/workbench/services/extensions/browser/extensionUrlHandler.ts @@ -82,7 +82,7 @@ export interface ExtensionUrlHandlerEvent { } export interface ExtensionUrlHandlerClassification extends GDPRClassification { - readonly extensionId: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight'; }; + readonly extensionId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; } /** @@ -99,7 +99,7 @@ class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { readonly _serviceBrand: undefined; private extensionHandlers = new Map(); - private uriBuffer = new Map(); + private uriBuffer = new Map(); private userTrustedExtensionsStorage: UserTrustedExtensionIdStorage; private disposable: IDisposable; @@ -342,7 +342,7 @@ class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { // forget about all uris buffered more than 5 minutes ago private garbageCollect(): void { const now = new Date().getTime(); - const uriBuffer = new Map(); + const uriBuffer = new Map(); this.uriBuffer.forEach((uris, extensionId) => { uris = uris.filter(({ timestamp }) => now - timestamp < FIVE_MINUTES); diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts index 4814d4482f3..55ee8c884d5 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts @@ -7,8 +7,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { toDisposable, Disposable } from 'vs/base/common/lifecycle'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { VSBuffer } from 'vs/base/common/buffer'; -import { createMessageOfType, MessageType, isMessageOfType, ExtensionHostExitCode } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; -import { IInitData, UIKind } from 'vs/workbench/api/common/extHost.protocol'; +import { createMessageOfType, MessageType, isMessageOfType, ExtensionHostExitCode, IExtensionHostInitData, UIKind } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -19,7 +18,7 @@ import * as dom from 'vs/base/browser/dom'; import { URI } from 'vs/base/common/uri'; import { IExtensionHost, ExtensionHostLogFileName, ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; import { IProductService } from 'vs/platform/product/common/productService'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { joinPath } from 'vs/base/common/resources'; import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output'; @@ -63,7 +62,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost @IWorkspaceContextService private readonly _contextService: IWorkspaceContextService, @ILabelService private readonly _labelService: ILabelService, @ILogService private readonly _logService: ILogService, - @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService private readonly _environmentService: IBrowserWorkbenchEnvironmentService, @IProductService private readonly _productService: IProductService, @ILayoutService private readonly _layoutService: ILayoutService, @IStorageService private readonly _storageService: IStorageService, @@ -189,7 +188,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost // Send over message ports for extension API const messagePorts = this._environmentService.options?.messagePorts ?? new Map(); - iframe.contentWindow!.postMessage(messagePorts, '*', [...messagePorts.values()]); + iframe.contentWindow!.postMessage({ type: 'vscode.init', data: messagePorts }, '*', [...messagePorts.values()]); port.onmessage = (event) => { const { data } = event; @@ -256,7 +255,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost return Promise.resolve(false); } - private async _createExtHostInitData(): Promise { + private async _createExtHostInitData(): Promise { const [telemetryInfo, initData] = await Promise.all([this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]); const workspace = this._contextService.getWorkspace(); return { diff --git a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts index 0dcb821c830..7ec13d3ea79 100644 --- a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts +++ b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts @@ -15,18 +15,18 @@ import { IWebExtensionsScannerService, IWorkbenchExtensionEnablementService } fr import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ActivationTimes, ExtensionPointContribution, IExtensionService, IExtensionsStatus, IMessage, IWillActivateEvent, IResponsiveStateChangeEvent, toExtension, IExtensionHost, ActivationKind, ExtensionHostKind, toExtensionDescription, ExtensionRunningLocation, extensionHostKindToString } from 'vs/workbench/services/extensions/common/extensions'; +import { ActivationTimes, ExtensionPointContribution, IExtensionService, IExtensionsStatus, IMessage, IWillActivateEvent, IResponsiveStateChangeEvent, toExtension, IExtensionHost, ActivationKind, ExtensionHostKind, toExtensionDescription, ExtensionRunningLocation, extensionHostKindToString, ExtensionActivationReason, IInternalExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionMessageCollector, ExtensionPoint, ExtensionsRegistry, IExtensionPoint, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { ResponsiveState } from 'vs/workbench/services/extensions/common/rpcProtocol'; import { createExtensionHostManager, IExtensionHostManager } from 'vs/workbench/services/extensions/common/extensionHostManager'; -import { ExtensionIdentifier, IExtensionDescription, IExtension, ExtensionKind, IExtensionContributions } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription, IExtension, IExtensionContributions } from 'vs/platform/extensions/common/extensions'; +import { ExtensionKind } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { parseExtensionDevOptions } from 'vs/workbench/services/extensions/common/extensionDevOptions'; import { IProductService } from 'vs/platform/product/common/productService'; -import { ExtensionActivationReason } from 'vs/workbench/api/common/extHostExtensionActivator'; import { IExtensionManagementService, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IExtensionActivationHost as IWorkspaceContainsActivationHost, checkGlobFileExists, checkActivateWorkspaceContainsExtension } from 'vs/workbench/api/common/shared/workspaceContains'; +import { IExtensionActivationHost as IWorkspaceContainsActivationHost, checkGlobFileExists, checkActivateWorkspaceContainsExtension } from 'vs/workbench/services/extensions/common/workspaceContains'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Schemas } from 'vs/base/common/network'; @@ -622,7 +622,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx private _startExtensionHosts(isInitialStart: boolean, initialActivationEvents: string[]): void { const extensionHosts = this._createExtensionHosts(isInitialStart); extensionHosts.forEach((extensionHost) => { - const processManager: IExtensionHostManager = createExtensionHostManager(this._instantiationService, extensionHost, isInitialStart, initialActivationEvents); + const processManager: IExtensionHostManager = createExtensionHostManager(this._instantiationService, extensionHost, isInitialStart, initialActivationEvents, this._acquireInternalAPI()); processManager.onDidExit(([code, signal]) => this._onExtensionHostCrashOrExit(processManager, code, signal)); processManager.onDidChangeResponsiveState((responsiveState) => { this._onDidChangeResponsiveChange.fire({ isResponsive: responsiveState === ResponsiveState.Responsive }); }); this._extensionHostManagers.push(processManager); @@ -750,8 +750,8 @@ export abstract class AbstractExtensionService extends Disposable implements IEx }); } - public getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { - let result: { [id: string]: IExtensionsStatus; } = Object.create(null); + public getExtensionsStatus(): { [id: string]: IExtensionsStatus } { + let result: { [id: string]: IExtensionsStatus } = Object.create(null); if (this._registry) { const extensions = this._registry.getAllExtensionDescriptions(); for (const extension of extensions) { @@ -838,7 +838,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } protected _doHandleExtensionPoints(affectedExtensions: IExtensionDescription[]): void { - const affectedExtensionPoints: { [extPointName: string]: boolean; } = Object.create(null); + const affectedExtensionPoints: { [extPointName: string]: boolean } = Object.create(null); for (let extensionDescription of affectedExtensions) { if (extensionDescription.contributes) { for (let extPointName in extensionDescription.contributes) { @@ -881,10 +881,10 @@ export abstract class AbstractExtensionService extends Disposable implements IEx if (!this._isDev && msg.extensionId) { const { type, extensionId, extensionPointId, message } = msg; type ExtensionsMessageClassification = { - type: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - extensionId: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - extensionPointId: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - message: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + type: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + extensionId: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + extensionPointId: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + message: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type ExtensionsMessageEvent = { type: Severity; @@ -950,6 +950,26 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } } + private _acquireInternalAPI(): IInternalExtensionService { + return { + _activateById: (extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise => { + return this._activateById(extensionId, reason); + }, + _onWillActivateExtension: (extensionId: ExtensionIdentifier): void => { + return this._onWillActivateExtension(extensionId); + }, + _onDidActivateExtension: (extensionId: ExtensionIdentifier, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationReason: ExtensionActivationReason): void => { + return this._onDidActivateExtension(extensionId, codeLoadingTime, activateCallTime, activateResolvedTime, activationReason); + }, + _onDidActivateExtensionError: (extensionId: ExtensionIdentifier, error: Error): void => { + return this._onDidActivateExtensionError(extensionId, error); + }, + _onExtensionRuntimeError: (extensionId: ExtensionIdentifier, err: Error): void => { + return this._onExtensionRuntimeError(extensionId, err); + } + }; + } + public async _activateById(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise { const results = await Promise.all( this._extensionHostManagers.map(manager => manager.activate(extensionId, reason)) @@ -960,19 +980,19 @@ export abstract class AbstractExtensionService extends Disposable implements IEx } } - public _onWillActivateExtension(extensionId: ExtensionIdentifier): void { + private _onWillActivateExtension(extensionId: ExtensionIdentifier): void { this._extensionHostActiveExtensions.set(ExtensionIdentifier.toKey(extensionId), extensionId); } - public _onDidActivateExtension(extensionId: ExtensionIdentifier, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationReason: ExtensionActivationReason): void { + private _onDidActivateExtension(extensionId: ExtensionIdentifier, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationReason: ExtensionActivationReason): void { this._extensionHostActivationTimes.set(ExtensionIdentifier.toKey(extensionId), new ActivationTimes(codeLoadingTime, activateCallTime, activateResolvedTime, activationReason)); this._onDidChangeExtensionsStatus.fire([extensionId]); } - public _onDidActivateExtensionError(extensionId: ExtensionIdentifier, error: Error): void { + private _onDidActivateExtensionError(extensionId: ExtensionIdentifier, error: Error): void { type ExtensionActivationErrorClassification = { - extensionId: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - error: { classification: 'CallstackOrException', purpose: 'PerformanceAndHealth' }; + extensionId: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + error: { classification: 'CallstackOrException'; purpose: 'PerformanceAndHealth' }; }; type ExtensionActivationErrorEvent = { extensionId: string; @@ -984,7 +1004,7 @@ export abstract class AbstractExtensionService extends Disposable implements IEx }); } - public _onExtensionRuntimeError(extensionId: ExtensionIdentifier, err: Error): void { + private _onExtensionRuntimeError(extensionId: ExtensionIdentifier, err: Error): void { const extensionKey = ExtensionIdentifier.toKey(extensionId); if (!this._extensionHostExtensionRuntimeErrors.has(extensionKey)) { this._extensionHostExtensionRuntimeErrors.set(extensionKey, []); @@ -1155,13 +1175,13 @@ class ProposedApiController { const key = ExtensionIdentifier.toKey(entry.key); const proposalNames = entry.value.filter(name => { if (!allApiProposals[name]) { - _logService.warn(`Extension '${key} wants API proposal '${name}' but that proposal DOES NOT EXIST.`); + _logService.warn(`Via 'product.json#extensionEnabledApiProposals' 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 false; } return true; }); if (this._productEnabledExtensions.has(key)) { - _logService.warn(`Extension '${key} appears in BOTH 'product.json#extensionAllowedProposedApi' and 'extensionEnabledApiProposals'. The latter is more restrictive and will override the former.`); + _logService.warn(`Extension '${key}' appears in BOTH 'product.json#extensionAllowedProposedApi' and 'extensionEnabledApiProposals'. The latter is more restrictive and will override the former.`); } this._productEnabledExtensions.set(key, proposalNames); }); @@ -1173,9 +1193,20 @@ class ProposedApiController { // this is a trick to make the extension description writeable... type Writeable = { -readonly [P in keyof T]: Writeable }; const extension = >_extension; - const key = ExtensionIdentifier.toKey(_extension.identifier); + // warn about invalid proposal and remove them from the list + if (isNonEmptyArray(extension.enabledApiProposals)) { + 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.`); + } + return result; + }); + } + + if (this._productEnabledExtensions.has(key)) { // NOTE that proposals that are listed in product.json override whatever is declared in the extension // itself. This is needed for us to know what proposals are used "in the wild". Merging product.json-proposals @@ -1188,7 +1219,7 @@ 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 (LOOSES): ${[...extensionSet].join(', ')}\nproduct.json (WINS): ${[...productSet].join(', ')}`); + 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(', ')}`); 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.`); diff --git a/src/vs/workbench/api/common/extHostCustomers.ts b/src/vs/workbench/services/extensions/common/extHostCustomers.ts similarity index 71% rename from src/vs/workbench/api/common/extHostCustomers.ts rename to src/vs/workbench/services/extensions/common/extHostCustomers.ts index a8a30c6f7f4..553e0afb02b 100644 --- a/src/vs/workbench/api/common/extHostCustomers.ts +++ b/src/vs/workbench/services/extensions/common/extHostCustomers.ts @@ -4,13 +4,25 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable } from 'vs/base/common/lifecycle'; -import { IConstructorSignature1, BrandedService } from 'vs/platform/instantiation/common/instantiation'; -import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; -import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; +import { IConstructorSignature, BrandedService } from 'vs/platform/instantiation/common/instantiation'; +import { IExtensionHostProxy } from 'vs/workbench/services/extensions/common/extensionHostProxy'; +import { ExtensionHostKind, IInternalExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IRPCProtocol, ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; + +export interface IExtHostContext extends IRPCProtocol { + readonly remoteAuthority: string | null; + readonly extensionHostKind: ExtensionHostKind; +} + +export interface IInternalExtHostContext extends IExtHostContext { + readonly internalExtensionService: IInternalExtensionService; + _setExtensionHostProxy(extensionHostProxy: IExtensionHostProxy): void; + _setAllMainProxyIdentifiers(mainProxyIdentifiers: ProxyIdentifier[]): void; +} export type IExtHostNamedCustomer = [ProxyIdentifier, IExtHostCustomerCtor]; -export type IExtHostCustomerCtor = IConstructorSignature1; +export type IExtHostCustomerCtor = IConstructorSignature; export function extHostNamedCustomer(id: ProxyIdentifier) { return function (ctor: { new(context: IExtHostContext, ...services: Services): T }): void { diff --git a/src/vs/workbench/services/extensions/common/extensionHostManager.ts b/src/vs/workbench/services/extensions/common/extensionHostManager.ts index a1e9ad58224..07534f837cd 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostManager.ts +++ b/src/vs/workbench/services/extensions/common/extensionHostManager.ts @@ -9,8 +9,7 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { ExtHostCustomersRegistry } from 'vs/workbench/api/common/extHostCustomers'; -import { ExtHostContext, ExtHostExtensionServiceShape, IExtHostContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { ExtHostCustomersRegistry, IInternalExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { Proxied, ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { IRPCProtocolLogger, RPCProtocol, RequestInitiator, ResponsiveState } from 'vs/workbench/services/extensions/common/rpcProtocol'; import { RemoteAuthorityResolverError, ResolverResult } from 'vs/platform/remote/common/remoteAuthorityResolver'; @@ -20,13 +19,13 @@ import { registerAction2, Action2 } from 'vs/platform/actions/common/actions'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { StopWatch } from 'vs/base/common/stopwatch'; import { VSBuffer } from 'vs/base/common/buffer'; -import { IExtensionHost, ExtensionHostKind, ActivationKind, extensionHostKindToString } from 'vs/workbench/services/extensions/common/extensions'; -import { ExtensionActivationReason } from 'vs/workbench/api/common/extHostExtensionActivator'; +import { IExtensionHost, ExtensionHostKind, ActivationKind, extensionHostKindToString, ExtensionActivationReason, IInternalExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { Barrier, timeout } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; import { ILogService } from 'vs/platform/log/common/log'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IExtensionHostProxy } from 'vs/workbench/services/extensions/common/extensionHostProxy'; // Enable to see detailed message communication between window and extension host const LOG_EXTENSION_HOST_COMMUNICATION = false; @@ -50,20 +49,20 @@ export interface IExtensionHostManager { setRemoteEnvironment(env: { [key: string]: string | null }): Promise; } -export function createExtensionHostManager(instantiationService: IInstantiationService, extensionHost: IExtensionHost, isInitialStart: boolean, initialActivationEvents: string[]): IExtensionHostManager { +export function createExtensionHostManager(instantiationService: IInstantiationService, extensionHost: IExtensionHost, isInitialStart: boolean, initialActivationEvents: string[], internalExtensionService: IInternalExtensionService): IExtensionHostManager { if (extensionHost.lazyStart && isInitialStart && initialActivationEvents.length === 0) { - return instantiationService.createInstance(LazyStartExtensionHostManager, extensionHost); + return instantiationService.createInstance(LazyStartExtensionHostManager, extensionHost, internalExtensionService); } - return instantiationService.createInstance(ExtensionHostManager, extensionHost, initialActivationEvents); + return instantiationService.createInstance(ExtensionHostManager, extensionHost, initialActivationEvents, internalExtensionService); } export type ExtensionHostStartupClassification = { - time: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - action: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - kind: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - errorName?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - errorMessage?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - errorStack?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + time: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + action: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + kind: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + errorName?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + errorMessage?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + errorStack?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; export type ExtensionHostStartupEvent = { @@ -90,16 +89,14 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { private _rpcProtocol: RPCProtocol | null; private readonly _customers: IDisposable[]; private readonly _extensionHost: IExtensionHost; - /** - * winjs believes a proxy is a promise because it has a `then` method, so wrap the result in an object. - */ - private _proxy: Promise<{ value: ExtHostExtensionServiceShape; } | null> | null; + private _proxy: Promise | null; private _resolveAuthorityAttempt: number; private _hasStarted = false; constructor( extensionHost: IExtensionHost, initialActivationEvents: string[], + private readonly _internalExtensionService: IInternalExtensionService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService, @ITelemetryService private readonly _telemetryService: ITelemetryService, @@ -133,7 +130,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { }; this._telemetryService.publicLog2('extensionHostStartup', successTelemetryEvent); - return { value: this._createExtensionHostCustomers(protocol) }; + return this._createExtensionHostCustomers(protocol); }, (err) => { this._logService.error(`Error received from starting extension host (kind: ${extensionHostKindToString(this.kind)})`); @@ -205,28 +202,21 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { }; } - private async _getProxy(): Promise { - if (!this._proxy) { - return null; - } - const p = await this._proxy; - if (!p) { - return null; - } - return p.value; + private async _getProxy(): Promise { + return this._proxy; } public async ready(): Promise { await this._getProxy(); } - private async _measureLatency(proxy: ExtHostExtensionServiceShape): Promise { + private async _measureLatency(proxy: IExtensionHostProxy): Promise { const COUNT = 10; let sum = 0; for (let i = 0; i < COUNT; i++) { const sw = StopWatch.create(true); - await proxy.$test_latency(i); + await proxy.test_latency(i); sw.stop(); sum += sw.elapsed(); } @@ -237,7 +227,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { return (byteCount * 1000 * 8) / elapsedMillis; } - private async _measureUp(proxy: ExtHostExtensionServiceShape): Promise { + private async _measureUp(proxy: IExtensionHostProxy): Promise { const SIZE = 10 * 1024 * 1024; // 10MB let buff = VSBuffer.alloc(SIZE); @@ -246,21 +236,21 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { buff.writeUInt8(i, value); } const sw = StopWatch.create(true); - await proxy.$test_up(buff); + await proxy.test_up(buff); sw.stop(); return ExtensionHostManager._convert(SIZE, sw.elapsed()); } - private async _measureDown(proxy: ExtHostExtensionServiceShape): Promise { + private async _measureDown(proxy: IExtensionHostProxy): Promise { const SIZE = 10 * 1024 * 1024; // 10MB const sw = StopWatch.create(true); - await proxy.$test_down(SIZE); + await proxy.test_down(SIZE); sw.stop(); return ExtensionHostManager._convert(SIZE, sw.elapsed()); } - private _createExtensionHostCustomers(protocol: IMessagePassingProtocol): ExtHostExtensionServiceShape { + private _createExtensionHostCustomers(protocol: IMessagePassingProtocol): IExtensionHostProxy { let logger: IRPCProtocolLogger | null = null; if (LOG_EXTENSION_HOST_COMMUNICATION || this._environmentService.logExtensionHostCommunication) { @@ -269,13 +259,25 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { this._rpcProtocol = new RPCProtocol(protocol, logger); this._register(this._rpcProtocol.onDidChangeResponsiveState((responsiveState: ResponsiveState) => this._onDidChangeResponsiveState.fire(responsiveState))); - const extHostContext: IExtHostContext = { + let extensionHostProxy: IExtensionHostProxy | null = null as IExtensionHostProxy | null; + let mainProxyIdentifiers: ProxyIdentifier[] = []; + const extHostContext: IInternalExtHostContext = { remoteAuthority: this._extensionHost.remoteAuthority, extensionHostKind: this.kind, getProxy: (identifier: ProxyIdentifier): Proxied => this._rpcProtocol!.getProxy(identifier), set: (identifier: ProxyIdentifier, instance: R): R => this._rpcProtocol!.set(identifier, instance), assertRegistered: (identifiers: ProxyIdentifier[]): void => this._rpcProtocol!.assertRegistered(identifiers), drain: (): Promise => this._rpcProtocol!.drain(), + + //#region internal + internalExtensionService: this._internalExtensionService, + _setExtensionHostProxy: (value: IExtensionHostProxy): void => { + extensionHostProxy = value; + }, + _setAllMainProxyIdentifiers: (value: ProxyIdentifier[]): void => { + mainProxyIdentifiers = value; + }, + //#endregion }; // Named customers @@ -294,11 +296,14 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { this._customers.push(instance); } - // Check that no named customers are missing - const expected: ProxyIdentifier[] = Object.keys(MainContext).map((key) => (MainContext)[key]); - this._rpcProtocol.assertRegistered(expected); + if (!extensionHostProxy) { + throw new Error(`Missing IExtensionHostProxy!`); + } - return this._rpcProtocol.getProxy(ExtHostContext.ExtHostExtensionService); + // Check that no named customers are missing + this._rpcProtocol.assertRegistered(mainProxyIdentifiers); + + return extensionHostProxy; } public async activate(extension: ExtensionIdentifier, reason: ExtensionActivationReason): Promise { @@ -306,7 +311,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { if (!proxy) { return false; } - return proxy.$activate(extension, reason); + return proxy.activate(extension, reason); } public activateByEvent(activationEvent: string, activationKind: ActivationKind): Promise { @@ -330,7 +335,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { // i.e. the extension host could not be started return; } - return proxy.value.$activateByEvent(activationEvent, activationKind); + return proxy.activateByEvent(activationEvent, activationKind); } public async getInspectPort(tryEnableInspector: boolean): Promise { @@ -365,7 +370,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { throw new Error(`Cannot resolve authority`); } this._resolveAuthorityAttempt++; - const result = await proxy.$resolveAuthority(remoteAuthority, this._resolveAuthorityAttempt); + const result = await proxy.resolveAuthority(remoteAuthority, this._resolveAuthorityAttempt); if (result.type === 'ok') { return result.value; } else { @@ -383,7 +388,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { if (!proxy) { throw new Error(`Cannot resolve canonical URI`); } - const result = await proxy.$getCanonicalURI(remoteAuthority, uri); + const result = await proxy.getCanonicalURI(remoteAuthority, uri); return URI.revive(result); } @@ -392,7 +397,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { if (!proxy) { return; } - return proxy.$startExtensionHost(enabledExtensionIds); + return proxy.startExtensionHost(enabledExtensionIds); } public async extensionTestsExecute(): Promise { @@ -400,7 +405,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { if (!proxy) { throw new Error('Could not obtain Extension Host Proxy'); } - return proxy.$extensionTestsExecute(); + return proxy.extensionTestsExecute(); } public async extensionTestsSendExit(exitCode: number): Promise { @@ -411,7 +416,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { // This method does not wait for the actual RPC to be confirmed // It waits for the socket to drain (i.e. the message has been sent) // It also times out after 5s in case drain takes too long - proxy.$extensionTestsExit(exitCode); + proxy.extensionTestsExit(exitCode); if (this._rpcProtocol) { await Promise.race([this._rpcProtocol.drain(), timeout(5000)]); } @@ -422,7 +427,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { if (!proxy) { return; } - return proxy.$deltaExtensions(toAdd, toRemove); + return proxy.deltaExtensions(toAdd, toRemove); } public async setRemoteEnvironment(env: { [key: string]: string | null }): Promise { @@ -431,7 +436,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { return; } - return proxy.$setRemoteEnvironment(env); + return proxy.setRemoteEnvironment(env); } } @@ -450,6 +455,7 @@ class LazyStartExtensionHostManager extends Disposable implements IExtensionHost constructor( extensionHost: IExtensionHost, + private readonly _internalExtensionService: IInternalExtensionService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILogService private readonly _logService: ILogService, ) { @@ -463,7 +469,7 @@ class LazyStartExtensionHostManager extends Disposable implements IExtensionHost private _createActual(reason: string): ExtensionHostManager { this._logService.info(`Creating lazy extension host: ${reason}`); - this._actual = this._register(this._instantiationService.createInstance(ExtensionHostManager, this._extensionHost, [])); + this._actual = this._register(this._instantiationService.createInstance(ExtensionHostManager, this._extensionHost, [], this._internalExtensionService)); this._register(this._actual.onDidChangeResponsiveState((e) => this._onDidChangeResponsiveState.fire(e))); return this._actual; } @@ -555,7 +561,7 @@ class LazyStartExtensionHostManager extends Disposable implements IExtensionHost const actual = await this._getOrCreateActualAndStart(`execute tests.`); return actual.extensionTestsSendExit(exitCode); } - public async setRemoteEnvironment(env: { [key: string]: string | null; }): Promise { + public async setRemoteEnvironment(env: { [key: string]: string | null }): Promise { await this._startCalled.wait(); if (this._actual) { return this._actual.setRemoteEnvironment(env); diff --git a/src/vs/workbench/services/extensions/common/extensionHostProtocol.ts b/src/vs/workbench/services/extensions/common/extensionHostProtocol.ts index 7d3d4c30dc5..a090dced1df 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostProtocol.ts +++ b/src/vs/workbench/services/extensions/common/extensionHostProtocol.ts @@ -4,6 +4,65 @@ *--------------------------------------------------------------------------------------------*/ import { VSBuffer } from 'vs/base/common/buffer'; +import { URI, UriComponents } from 'vs/base/common/uri'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { LogLevel } from 'vs/platform/log/common/log'; +import { IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; + +export interface IExtensionHostInitData { + version: string; + commit?: string; + parentPid: number; + environment: IEnvironment; + workspace?: IStaticWorkspaceData | null; + resolvedExtensions: ExtensionIdentifier[]; + hostExtensions: ExtensionIdentifier[]; + extensions: IExtensionDescription[]; + telemetryInfo: ITelemetryInfo; + logLevel: LogLevel; + logsLocation: URI; + logFile: URI; + autoStart: boolean; + remote: { isRemote: boolean; authority: string | undefined; connectionData: IRemoteConnectionData | null }; + uiKind: UIKind; + messagePorts?: ReadonlyMap; +} + +export interface IEnvironment { + isExtensionDevelopmentDebug: boolean; + appName: string; + appHost: string; + appRoot?: URI; + appLanguage: string; + appUriScheme: string; + extensionDevelopmentLocationURI?: URI[]; + extensionTestsLocationURI?: URI; + globalStorageHome: URI; + workspaceStorageHome: URI; + useHostProxy?: boolean; + skipWorkspaceStorageLock?: boolean; +} + +export interface IStaticWorkspaceData { + id: string; + name: string; + transient?: boolean; + configuration?: UriComponents | null; + isUntitled?: boolean | null; +} + +export interface MessagePortLike { + postMessage(message: any, transfer?: any[]): void; + addEventListener(type: 'message', listener: (e: any) => any): void; + removeEventListener(type: 'message', listener: (e: any) => any): void; + start(): void; +} + +export enum UIKind { + Desktop = 1, + Web = 2 +} export const enum ExtensionHostExitCode { // nodejs uses codes 1-13 and exit codes >128 are signal exits diff --git a/src/vs/workbench/services/extensions/common/extensionHostProxy.ts b/src/vs/workbench/services/extensions/common/extensionHostProxy.ts new file mode 100644 index 00000000000..f3acf4420a0 --- /dev/null +++ b/src/vs/workbench/services/extensions/common/extensionHostProxy.ts @@ -0,0 +1,42 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { VSBuffer } from 'vs/base/common/buffer'; +import { URI } from 'vs/base/common/uri'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { IRemoteConnectionData, RemoteAuthorityResolverErrorCode, ResolverResult } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { ActivationKind, ExtensionActivationReason } from 'vs/workbench/services/extensions/common/extensions'; + +export interface IResolveAuthorityErrorResult { + type: 'error'; + error: { + message: string | undefined; + code: RemoteAuthorityResolverErrorCode; + detail: any; + }; +} + +export interface IResolveAuthorityOKResult { + type: 'ok'; + value: ResolverResult; +} + +export type IResolveAuthorityResult = IResolveAuthorityErrorResult | IResolveAuthorityOKResult; + +export interface IExtensionHostProxy { + resolveAuthority(remoteAuthority: string, resolveAttempt: number): Promise; + getCanonicalURI(remoteAuthority: string, uri: URI): Promise; + startExtensionHost(enabledExtensionIds: ExtensionIdentifier[]): Promise; + extensionTestsExecute(): Promise; + extensionTestsExit(code: number): Promise; + activateByEvent(activationEvent: string, activationKind: ActivationKind): Promise; + activate(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; + setRemoteEnvironment(env: { [key: string]: string | null }): Promise; + updateRemoteConnectionData(connectionData: IRemoteConnectionData): Promise; + deltaExtensions(toAdd: IExtensionDescription[], toRemove: ExtensionIdentifier[]): Promise; + test_latency(n: number): Promise; + test_up(b: VSBuffer): Promise; + test_down(size: number): Promise; +} diff --git a/src/vs/workbench/services/extensions/common/extensionManifestPropertiesService.ts b/src/vs/workbench/services/extensions/common/extensionManifestPropertiesService.ts index c3f8fc53dbf..9487019eee7 100644 --- a/src/vs/workbench/services/extensions/common/extensionManifestPropertiesService.ts +++ b/src/vs/workbench/services/extensions/common/extensionManifestPropertiesService.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IExtensionManifest, ExtensionKind, ExtensionIdentifier, ExtensionUntrustedWorkspaceSupportType, ExtensionVirtualWorkspaceSupportType, IExtensionIdentifier, ALL_EXTENSION_KINDS } from 'vs/platform/extensions/common/extensions'; +import { IExtensionManifest, ExtensionIdentifier, ExtensionUntrustedWorkspaceSupportType, ExtensionVirtualWorkspaceSupportType, IExtensionIdentifier, ALL_EXTENSION_KINDS } from 'vs/platform/extensions/common/extensions'; +import { ExtensionKind } from 'vs/platform/environment/common/environment'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { isNonEmptyArray } from 'vs/base/common/arrays'; @@ -46,10 +47,10 @@ export class ExtensionManifestPropertiesService extends Disposable implements IE private _productExtensionKindsMap: Map | null = null; private _configuredExtensionKindsMap: Map | null = null; - private _productVirtualWorkspaceSupportMap: Map | null = null; + private _productVirtualWorkspaceSupportMap: Map | null = null; private _configuredVirtualWorkspaceSupportMap: Map | null = null; - private readonly _configuredExtensionWorkspaceTrustRequestMap: Map; + private readonly _configuredExtensionWorkspaceTrustRequestMap: Map; private readonly _productExtensionWorkspaceTrustRequestMap: Map; constructor( @@ -61,8 +62,8 @@ export class ExtensionManifestPropertiesService extends Disposable implements IE super(); // Workspace trust request type (settings.json) - this._configuredExtensionWorkspaceTrustRequestMap = new Map(); - const configuredExtensionWorkspaceTrustRequests = configurationService.inspect<{ [key: string]: { supported: ExtensionUntrustedWorkspaceSupportType, version?: string } }>(WORKSPACE_TRUST_EXTENSION_SUPPORT).userValue || {}; + this._configuredExtensionWorkspaceTrustRequestMap = new Map(); + const configuredExtensionWorkspaceTrustRequests = configurationService.inspect<{ [key: string]: { supported: ExtensionUntrustedWorkspaceSupportType; version?: string } }>(WORKSPACE_TRUST_EXTENSION_SUPPORT).userValue || {}; for (const id of Object.keys(configuredExtensionWorkspaceTrustRequests)) { this._configuredExtensionWorkspaceTrustRequestMap.set(ExtensionIdentifier.toKey(id), configuredExtensionWorkspaceTrustRequests[id]); } @@ -315,9 +316,9 @@ export class ExtensionManifestPropertiesService extends Disposable implements IE return this._productExtensionKindsMap.get(ExtensionIdentifier.toKey(extensionId)); } - private getProductVirtualWorkspaceSupport(manifest: IExtensionManifest): { default?: boolean, override?: boolean } | undefined { + private getProductVirtualWorkspaceSupport(manifest: IExtensionManifest): { default?: boolean; override?: boolean } | undefined { if (this._productVirtualWorkspaceSupportMap === null) { - const productWorkspaceSchemesMap = new Map(); + const productWorkspaceSchemesMap = new Map(); if (this.productService.extensionVirtualWorkspacesSupport) { for (const id of Object.keys(this.productService.extensionVirtualWorkspacesSupport)) { productWorkspaceSchemesMap.set(ExtensionIdentifier.toKey(id), this.productService.extensionVirtualWorkspacesSupport[id]); diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index a6b40d865d4..7992aecd91c 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -11,7 +11,6 @@ import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensi import { ExtensionIdentifier, IExtension, ExtensionType, IExtensionDescription, IExtensionContributions } from 'vs/platform/extensions/common/extensions'; import { getExtensionId, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; -import { ExtensionActivationReason } from 'vs/workbench/api/common/extHostExtensionActivator'; import { ApiProposalName } from 'vs/workbench/services/extensions/common/extensionsApiProposals'; import { IV8Profile } from 'vs/platform/profiling/common/profiling'; @@ -153,6 +152,12 @@ export function checkProposedApiEnabled(extension: IExtensionDescription, propos */ export type ProfileSegmentId = string | 'idle' | 'program' | 'gc' | 'self'; +export interface ExtensionActivationReason { + readonly startup: boolean; + readonly extensionId: ExtensionIdentifier; + readonly activationEvent: string; +} + export class ActivationTimes { constructor( public readonly codeLoadingTime: number, @@ -307,25 +312,13 @@ export interface IExtensionService { * (This is public such that the extension host process can coordinate with and call back in the IExtensionService) */ _activateById(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; - /** - * Please do not use! - * (This is public such that the extension host process can coordinate with and call back in the IExtensionService) - */ +} + +export interface IInternalExtensionService { + _activateById(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; _onWillActivateExtension(extensionId: ExtensionIdentifier): void; - /** - * Please do not use! - * (This is public such that the extension host process can coordinate with and call back in the IExtensionService) - */ _onDidActivateExtension(extensionId: ExtensionIdentifier, codeLoadingTime: number, activateCallTime: number, activateResolvedTime: number, activationReason: ExtensionActivationReason): void; - /** - * Please do not use! - * (This is public such that the extension host process can coordinate with and call back in the IExtensionService) - */ _onDidActivateExtensionError(extensionId: ExtensionIdentifier, error: Error): void; - /** - * Please do not use! - * (This is public such that the extension host process can coordinate with and call back in the IExtensionService) - */ _onExtensionRuntimeError(extensionId: ExtensionIdentifier, err: Error): void; } @@ -368,7 +361,7 @@ export class NullExtensionService implements IExtensionService { getExtensions(): Promise { return Promise.resolve([]); } getExtension() { return Promise.resolve(undefined); } readExtensionPointContributions(_extPoint: IExtensionPoint): Promise[]> { return Promise.resolve(Object.create(null)); } - getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { return Object.create(null); } + getExtensionsStatus(): { [id: string]: IExtensionsStatus } { return Object.create(null); } getInspectPort(_tryEnableInspector: boolean): Promise { return Promise.resolve(0); } stopExtensionHosts(): void { } async restartExtensionHost(): Promise { } @@ -377,9 +370,4 @@ export class NullExtensionService implements IExtensionService { canAddExtension(): boolean { return false; } canRemoveExtension(): boolean { return false; } _activateById(_extensionId: ExtensionIdentifier, _reason: ExtensionActivationReason): Promise { return Promise.resolve(); } - _onWillActivateExtension(_extensionId: ExtensionIdentifier): void { } - _onDidActivateExtension(_extensionId: ExtensionIdentifier, _codeLoadingTime: number, _activateCallTime: number, _activateResolvedTime: number, _activationReason: ExtensionActivationReason): void { } - _onDidActivateExtensionError(_extensionId: ExtensionIdentifier, _error: Error): void { } - _onExtensionRuntimeError(_extensionId: ExtensionIdentifier, _err: Error): void { } - _onExtensionHostExit(code: number): void { } } diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index b2cffdc6790..caf03166e49 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -24,10 +24,11 @@ export const allApiProposals = Object.freeze({ fileSearchProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.fileSearchProvider.d.ts', findTextInFiles: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.findTextInFiles.d.ts', fsChunks: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.fsChunks.d.ts', + idToken: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.idToken.d.ts', inlayHints: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.inlayHints.d.ts', inlineCompletions: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.inlineCompletions.d.ts', ipc: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.ipc.d.ts', - languageStatus: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.languageStatus.d.ts', + markdownStringBaseUri: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.markdownStringBaseUri.d.ts', notebookCellExecutionState: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookCellExecutionState.d.ts', notebookConcatTextDocument: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookConcatTextDocument.d.ts', notebookContentProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookContentProvider.d.ts', @@ -42,7 +43,6 @@ export const allApiProposals = Object.freeze({ notebookMime: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookMime.d.ts', outputChannelLanguage: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.outputChannelLanguage.d.ts', portsAttributes: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.portsAttributes.d.ts', - quickPickSeparators: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickPickSeparators.d.ts', quickPickSortByLabel: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.quickPickSortByLabel.d.ts', resolvers: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.resolvers.d.ts', scmActionButton: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmActionButton.d.ts', @@ -50,13 +50,12 @@ export const allApiProposals = Object.freeze({ scmValidation: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.scmValidation.d.ts', tabs: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.tabs.d.ts', taskPresentationGroup: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.taskPresentationGroup.d.ts', + telemetry: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.telemetry.d.ts', terminalDataWriteEvent: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDataWriteEvent.d.ts', terminalDimensions: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDimensions.d.ts', - terminalDisablePersistence: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalDisablePersistence.d.ts', terminalNameChangeEvent: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.terminalNameChangeEvent.d.ts', testCoverage: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testCoverage.d.ts', testObserver: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testObserver.d.ts', - testRefresh: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.testRefresh.d.ts', textDocumentNotebook: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.textDocumentNotebook.d.ts', textSearchProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts', timeline: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.timeline.d.ts', diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index 7ade0916dd0..e5294d5304a 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -11,7 +11,8 @@ import { EXTENSION_IDENTIFIER_PATTERN } from 'vs/platform/extensionManagement/co import { Extensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { IMessage } from 'vs/workbench/services/extensions/common/extensions'; -import { ExtensionIdentifier, IExtensionDescription, EXTENSION_CATEGORIES, ExtensionKind } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription, EXTENSION_CATEGORIES } from 'vs/platform/extensions/common/extensions'; +import { ExtensionKind } from 'vs/platform/environment/common/environment'; import { allApiProposals } from 'vs/workbench/services/extensions/common/extensionsApiProposals'; import { values } from 'vs/base/common/collections'; import { productSchemaId } from 'vs/platform/product/common/productService'; @@ -244,6 +245,11 @@ export const schema: IJSONSchema = { items: { type: 'string', defaultSnippets: [ + { + label: 'onWebviewPanel', + description: nls.localize('vscode.extension.activationEvents.onWebviewPanel', 'An activation event emmited when a webview is loaded of a certain viewType'), + body: 'onWebviewPanel:viewType' + }, { label: 'onLanguage', description: nls.localize('vscode.extension.activationEvents.onLanguage', 'An activation event emitted whenever a file that resolves to the specified language gets opened.'), diff --git a/src/vs/workbench/services/extensions/common/proxyIdentifier.ts b/src/vs/workbench/services/extensions/common/proxyIdentifier.ts index 694af66403d..6a02adb6cf1 100644 --- a/src/vs/workbench/services/extensions/common/proxyIdentifier.ts +++ b/src/vs/workbench/services/extensions/common/proxyIdentifier.ts @@ -3,6 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import type { VSBuffer } from 'vs/base/common/buffer'; +import type { CancellationToken } from 'vs/base/common/cancellation'; + export interface IRPCProtocol { /** * Returns a proxy to an object addressable/named in the extension host process or in the renderer process. @@ -29,12 +32,10 @@ export class ProxyIdentifier { public static count = 0; _proxyIdentifierBrand: void = undefined; - public readonly isMain: boolean; public readonly sid: string; public readonly nid: number; - constructor(isMain: boolean, sid: string) { - this.isMain = isMain; + constructor(sid: string) { this.sid = sid; this.nid = (++ProxyIdentifier.count); } @@ -42,20 +43,29 @@ export class ProxyIdentifier { const identifiers: ProxyIdentifier[] = []; -export function createMainContextProxyIdentifier(identifier: string): ProxyIdentifier { - const result = new ProxyIdentifier(true, identifier); +export function createProxyIdentifier(identifier: string): ProxyIdentifier { + const result = new ProxyIdentifier(identifier); identifiers[result.nid] = result; return result; } -export function createExtHostContextProxyIdentifier(identifier: string): ProxyIdentifier { - const result = new ProxyIdentifier(false, identifier); - identifiers[result.nid] = result; - return result; -} +/** + * Mapped-type that replaces all JSONable-types with their toJSON-result type + */ +export type Dto = T extends { toJSON(): infer U } + ? U + : T extends VSBuffer // VSBuffer is understood by rpc-logic + ? T + : T extends CancellationToken // CancellationToken is understood by rpc-logic + ? T + : T extends Function // functions are dropped during JSON-stringify + ? never + : T extends object // recurse + ? { [k in keyof T]: Dto; } + : T; export type Proxied = { [K in keyof T]: T[K] extends (...args: infer A) => infer R - ? (...args: A) => Promise> + ? (...args: { [K in keyof A]: Dto }) => Promise>> : never }; diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts index f6b18a7f0c1..91def9ac7da 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts @@ -24,10 +24,9 @@ import { IRemoteAuthorityResolverService, IRemoteConnectionData } from 'vs/platf import { ISignService } from 'vs/platform/sign/common/sign'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IInitData, UIKind } from 'vs/workbench/api/common/extHost.protocol'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { parseExtensionDevOptions } from 'vs/workbench/services/extensions/common/extensionDevOptions'; -import { createMessageOfType, isMessageOfType, MessageType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; +import { createMessageOfType, isMessageOfType, MessageType, IExtensionHostInitData, UIKind } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { ExtensionHostKind, ExtensionHostLogFileName, IExtensionHost } from 'vs/workbench/services/extensions/common/extensions'; import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { Extensions, IOutputChannelRegistry } from 'vs/workbench/services/output/common/output'; @@ -209,7 +208,7 @@ export class RemoteExtensionHost extends Disposable implements IExtensionHost { this._onExit.fire([0, null]); } - private async _createExtHostInitData(isExtensionDevelopmentDebug: boolean): Promise { + private async _createExtHostInitData(isExtensionDevelopmentDebug: boolean): Promise { const [telemetryInfo, remoteInitData] = await Promise.all([this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]); // Collect all identifiers for extension ids which can be considered "resolved" diff --git a/src/vs/workbench/services/extensions/common/rpcProtocol.ts b/src/vs/workbench/services/extensions/common/rpcProtocol.ts index c0887a2f4a7..cae66942b49 100644 --- a/src/vs/workbench/services/extensions/common/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/common/rpcProtocol.ts @@ -130,8 +130,8 @@ export class RPCProtocol extends Disposable implements IRPCProtocol { private readonly _locals: any[]; private readonly _proxies: any[]; private _lastMessageId: number; - private readonly _cancelInvokedHandlers: { [req: string]: () => void; }; - private readonly _pendingRPCReplies: { [msgId: string]: LazyPromise; }; + private readonly _cancelInvokedHandlers: { [req: string]: () => void }; + private readonly _pendingRPCReplies: { [msgId: string]: LazyPromise }; private _responsiveState: ResponsiveState; private _unacknowledgedCount: number; private _unresponsiveTime: number; @@ -270,7 +270,7 @@ export class RPCProtocol extends Disposable implements IRPCProtocol { for (let i = 0, len = identifiers.length; i < len; i++) { const identifier = identifiers[i]; if (!this._locals[identifier.nid]) { - throw new Error(`Missing actor ${identifier.sid} (isMain: ${identifier.isMain})`); + throw new Error(`Missing proxy instance ${identifier.sid}`); } } } @@ -707,7 +707,7 @@ const enum SerializedRequestArgumentType { } type SerializedRequestArguments = - | { readonly type: SerializedRequestArgumentType.Simple; args: string; } + | { readonly type: SerializedRequestArgumentType.Simple; args: string } | { readonly type: SerializedRequestArgumentType.Mixed; args: MixedArg[] }; @@ -780,7 +780,7 @@ class MessageIO { return result.buffer; } - public static deserializeRequestJSONArgs(buff: MessageBuffer): { rpcId: number; method: string; args: any[]; } { + public static deserializeRequestJSONArgs(buff: MessageBuffer): { rpcId: number; method: string; args: any[] } { const rpcId = buff.readUInt8(); const method = buff.readShortString(); const args = buff.readLongString(); @@ -806,7 +806,7 @@ class MessageIO { return result.buffer; } - public static deserializeRequestMixedArgs(buff: MessageBuffer): { rpcId: number; method: string; args: any[]; } { + public static deserializeRequestMixedArgs(buff: MessageBuffer): { rpcId: number; method: string; args: any[] } { const rpcId = buff.readUInt8(); const method = buff.readShortString(); const rawargs = buff.readMixedArray(); @@ -964,8 +964,8 @@ const enum ArgType { type MixedArg = - | { readonly type: ArgType.String, readonly value: VSBuffer } - | { readonly type: ArgType.VSBuffer, readonly value: VSBuffer } - | { readonly type: ArgType.SerializedObjectWithBuffers, readonly value: VSBuffer, readonly buffers: readonly VSBuffer[] } + | { readonly type: ArgType.String; readonly value: VSBuffer } + | { readonly type: ArgType.VSBuffer; readonly value: VSBuffer } + | { readonly type: ArgType.SerializedObjectWithBuffers; readonly value: VSBuffer; readonly buffers: readonly VSBuffer[] } | { readonly type: ArgType.Undefined } ; diff --git a/src/vs/workbench/api/common/shared/workspaceContains.ts b/src/vs/workbench/services/extensions/common/workspaceContains.ts similarity index 98% rename from src/vs/workbench/api/common/shared/workspaceContains.ts rename to src/vs/workbench/services/extensions/common/workspaceContains.ts index 47abde1d832..d6b4b676d22 100644 --- a/src/vs/workbench/api/common/shared/workspaceContains.ts +++ b/src/vs/workbench/services/extensions/common/workspaceContains.ts @@ -9,7 +9,7 @@ import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cance import * as errors from 'vs/base/common/errors'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; import { ISearchService } from 'vs/workbench/services/search/common/search'; import { toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ILogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts index 23def4e18f8..64f740651b4 100644 --- a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts @@ -217,7 +217,7 @@ export class CachedExtensionScanner { productService: IProductService, log: ILog, translations: Translations - ): Promise<{ system: IExtensionDescription[], user: IExtensionDescription[], development: IExtensionDescription[] }> { + ): Promise<{ system: IExtensionDescription[]; user: IExtensionDescription[]; development: IExtensionDescription[] }> { const version = productService.version; const commit = productService.commit; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 3da31508314..ab0f2d8b0d7 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -24,7 +24,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IExtensionService, toExtension, ExtensionHostKind, IExtensionHost, webWorkerExtHostConfig, ExtensionRunningLocation, WebWorkerExtHostConfigValue, extensionRunningLocationToString, extensionHostKindToString } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionHostManager } from 'vs/workbench/services/extensions/common/extensionHostManager'; -import { ExtensionIdentifier, IExtension, ExtensionType, IExtensionDescription, ExtensionKind } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtension, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionKind } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; import { PersistentConnectionEventType } from 'vs/platform/remote/common/remoteAgentConnection'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -46,6 +47,7 @@ import { IExtensionManifestPropertiesService } from 'vs/workbench/services/exten import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; import { CancellationToken } from 'vs/base/common/cancellation'; import { StopWatch } from 'vs/base/common/stopwatch'; +import { isCI } from 'vs/base/common/platform'; export class ExtensionService extends AbstractExtensionService implements IExtensionService { @@ -53,6 +55,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten private readonly _lazyLocalWebWorker: boolean; private readonly _remoteInitData: Map; private readonly _extensionScanner: CachedExtensionScanner; + private readonly _crashTracker = new ExtensionHostCrashTracker(); constructor( @IInstantiationService instantiationService: IInstantiationService, @@ -276,50 +279,62 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._logService.error(`Extension host (${extensionHostKindToString(extensionHost.kind)}) terminated unexpectedly. No extensions were activated.`); } - this._notificationService.prompt(Severity.Error, nls.localize('extensionService.crash', "Extension host terminated unexpectedly."), - [{ - label: nls.localize('devTools', "Open Developer Tools"), - run: () => this._nativeHostService.openDevTools() - }, - { - label: nls.localize('restart', "Restart Extension Host"), - run: () => this.startExtensionHosts() - }] - ); + this._sendExtensionHostCrashTelemetry(code, signal, activatedExtensions); - type ExtensionHostCrashClassification = { - code: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - signal: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - extensionIds: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + this._crashTracker.registerCrash(); + + if (this._crashTracker.shouldAutomaticallyRestart()) { + this._logService.info(`Automatically restarting the extension host.`); + this._notificationService.status(nls.localize('extensionService.autoRestart', "The extension host terminated unexpectedly. Restarting..."), { hideAfter: 5000 }); + this.startExtensionHosts(); + } else { + this._notificationService.prompt(Severity.Error, nls.localize('extensionService.crash', "Extension host terminated unexpectedly 3 times within the last 5 minutes."), + [{ + label: nls.localize('devTools', "Open Developer Tools"), + run: () => this._nativeHostService.openDevTools() + }, + { + label: nls.localize('restart', "Restart Extension Host"), + run: () => this.startExtensionHosts() + }] + ); + } + } + } + + private _sendExtensionHostCrashTelemetry(code: number, signal: string | null, activatedExtensions: ExtensionIdentifier[]): void { + type ExtensionHostCrashClassification = { + code: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + signal: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + extensionIds: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + }; + type ExtensionHostCrashEvent = { + code: number; + signal: string | null; + extensionIds: string[]; + }; + this._telemetryService.publicLog2('extensionHostCrash', { + code, + signal, + extensionIds: activatedExtensions.map(e => e.value) + }); + + for (const extensionId of activatedExtensions) { + type ExtensionHostCrashExtensionClassification = { + code: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + signal: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + extensionId: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; - type ExtensionHostCrashEvent = { + type ExtensionHostCrashExtensionEvent = { code: number; signal: string | null; - extensionIds: string[]; + extensionId: string; }; - this._telemetryService.publicLog2('extensionHostCrash', { + this._telemetryService.publicLog2('extensionHostCrashExtension', { code, signal, - extensionIds: activatedExtensions.map(e => e.value) + extensionId: extensionId.value }); - - for (const extensionId of activatedExtensions) { - type ExtensionHostCrashExtensionClassification = { - code: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - signal: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - extensionId: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - }; - type ExtensionHostCrashExtensionEvent = { - code: number; - signal: string | null; - extensionId: string; - }; - this._telemetryService.publicLog2('extensionHostCrashExtension', { - code, - signal, - extensionId: extensionId.value - }); - } } } @@ -362,13 +377,31 @@ export class ExtensionService extends AbstractExtensionService implements IExten return uri; } const localProcessExtensionHost = this._getExtensionHostManager(ExtensionHostKind.LocalProcess)!; - return localProcessExtensionHost.getCanonicalURI(remoteAuthority, uri); + if (isCI) { + this._logService.info(`Invoking getCanonicalURI for authority ${getRemoteAuthorityPrefix(remoteAuthority)}...`); + } + try { + return localProcessExtensionHost.getCanonicalURI(remoteAuthority, uri); + } finally { + if (isCI) { + this._logService.info(`getCanonicalURI returned for authority ${getRemoteAuthorityPrefix(remoteAuthority)}.`); + } + } }); + if (isCI) { + this._logService.info(`Starting to wait on IWorkspaceTrustManagementService.workspaceResolved...`); + } + // Now that the canonical URI provider has been registered, we need to wait for the trust state to be // calculated. The trust state will be used while resolving the authority, however the resolver can // override the trust state through the resolver result. await this._workspaceTrustManagementService.workspaceResolved; + + if (isCI) { + this._logService.info(`Finished waiting on IWorkspaceTrustManagementService.workspaceResolved.`); + } + let resolverResult: ResolverResult; const sw = StopWatch.create(false); @@ -560,6 +593,35 @@ export class ExtensionService extends AbstractExtensionService implements IExten } } +export interface IExtensionHostCrashInfo { + timestamp: number; +} + +class ExtensionHostCrashTracker { + + private static _TIME_LIMIT = 5 * 60 * 1000; // 5 minutes + private static _CRASH_LIMIT = 3; + + private readonly _recentCrashes: IExtensionHostCrashInfo[] = []; + + private _removeOldCrashes(): void { + const limit = Date.now() - ExtensionHostCrashTracker._TIME_LIMIT; + while (this._recentCrashes.length > 0 && this._recentCrashes[0].timestamp < limit) { + this._recentCrashes.shift(); + } + } + + public registerCrash(): void { + this._removeOldCrashes(); + this._recentCrashes.push({ timestamp: Date.now() }); + } + + public shouldAutomaticallyRestart(): boolean { + this._removeOldCrashes(); + return (this._recentCrashes.length < ExtensionHostCrashTracker._CRASH_LIMIT); + } +} + function getRemoteAuthorityPrefix(remoteAuthority: string): string { const plusIndex = remoteAuthority.indexOf('+'); if (plusIndex === -1) { diff --git a/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts index 210d6947613..8cef2f64d57 100644 --- a/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts @@ -8,7 +8,6 @@ import { findFreePort } from 'vs/base/node/ports'; import { createRandomIPCHandle, NodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; import * as nls from 'vs/nls'; -import { CrashReporterStartOptions } from 'vs/base/parts/sandbox/electron-sandbox/electronTypes'; import { timeout } from 'vs/base/common/async'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { Emitter, Event } from 'vs/base/common/event'; @@ -28,22 +27,18 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IInitData, UIKind } from 'vs/workbench/api/common/extHost.protocol'; -import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; +import { isUntitledWorkspace, IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { MessageType, createMessageOfType, isMessageOfType, IExtensionHostInitData, UIKind } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { withNullAsUndefined } from 'vs/base/common/types'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { parseExtensionDevOptions } from '../common/extensionDevOptions'; import { VSBuffer } from 'vs/base/common/buffer'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; import { IExtensionHost, ExtensionHostLogFileName, ExtensionHostKind } from 'vs/workbench/services/extensions/common/extensions'; -import { isUntitledWorkspace } from 'vs/platform/workspaces/common/workspaces'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { joinPath } from 'vs/base/common/resources'; import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output'; -import { isUUID } from 'vs/base/common/uuid'; -import { join } from 'vs/base/common/path'; import { IShellEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/shellEnvironmentService'; import { IExtensionHostProcessOptions, IExtensionHostStarter } from 'vs/platform/extensions/common/extensionHostStarter'; import { SerializedError } from 'vs/base/common/errors'; @@ -80,7 +75,7 @@ class ExtensionHostProcess { return this._extensionHostStarter.onDynamicMessage(this._id); } - public get onError(): Event<{ error: SerializedError; }> { + public get onError(): Event<{ error: SerializedError }> { return this._extensionHostStarter.onDynamicError(this._id); } @@ -95,7 +90,7 @@ class ExtensionHostProcess { this._id = id; } - public start(opts: IExtensionHostProcessOptions): Promise<{ pid: number; }> { + public start(opts: IExtensionHostProcessOptions): Promise<{ pid: number }> { return this._extensionHostStarter.start(this._id, opts); } @@ -213,15 +208,20 @@ export class LocalProcessExtensionHost implements IExtensionHost { this._extensionHostProcess = new ExtensionHostProcess(extensionHostCreationResult.id, this._extensionHostStarter); + let lang = processEnv['LANG']; + if (platform.isMacintosh && lang === undefined) { + lang = Intl.DateTimeFormat().resolvedOptions().locale; + } + const env = objects.mixin(processEnv, { - VSCODE_AMD_ENTRYPOINT: 'vs/workbench/services/extensions/node/extensionHostProcess', + VSCODE_AMD_ENTRYPOINT: 'vs/workbench/api/node/extensionHostProcess', VSCODE_PIPE_LOGGING: 'true', VSCODE_VERBOSE_LOGGING: true, VSCODE_LOG_NATIVE: this._isExtensionDevHost, VSCODE_IPC_HOOK_EXTHOST: pipeName, VSCODE_HANDLES_UNCAUGHT_ERRORS: true, VSCODE_LOG_STACK: !this._isExtensionDevTestFromCli && (this._isExtensionDevHost || !this._environmentService.isBuilt || this._productService.quality !== 'stable' || this._environmentService.verbose), - VSCODE_LOG_LEVEL: this._environmentService.verbose ? 'trace' : this._environmentService.log + 'LANG': lang }); if (this._environmentService.debugExtensionHost.env) { @@ -268,33 +268,8 @@ export class LocalProcessExtensionHost implements IExtensionHost { opts.execArgv.unshift(`--max-old-space-size=${this._environmentService.args['max-memory']}`); } - // On linux crash reporter needs to be started on child node processes explicitly - // TODO@bpasero TODO@deepak1556 remove once we updated to Electron 15 - if (platform.isLinux) { - const crashReporterStartOptions: CrashReporterStartOptions = { - companyName: this._productService.crashReporter?.companyName || 'Microsoft', - productName: this._productService.crashReporter?.productName || this._productService.nameShort, - submitURL: '', - uploadToServer: false - }; - const crashReporterId = this._environmentService.crashReporterId; // crashReporterId is set by the main process only when crash reporting is enabled by the user. - const appcenter = this._productService.appCenter; - const uploadCrashesToServer = !this._environmentService.crashReporterDirectory; // only upload unless --crash-reporter-directory is provided - if (uploadCrashesToServer && appcenter && crashReporterId && isUUID(crashReporterId)) { - const submitURL = appcenter[`linux-x64`]; - crashReporterStartOptions.submitURL = submitURL.concat('&uid=', crashReporterId, '&iid=', crashReporterId, '&sid=', crashReporterId); - crashReporterStartOptions.uploadToServer = true; - } - // In the upload to server case, there is a bug in electron that creates client_id file in the current - // working directory. Setting the env BREAKPAD_DUMP_LOCATION will force electron to create the file in that location, - // For https://github.com/microsoft/vscode/issues/105743 - const extHostCrashDirectory = this._environmentService.crashReporterDirectory || this._environmentService.userDataPath; - opts.env.BREAKPAD_DUMP_LOCATION = join(extHostCrashDirectory, `${ExtensionHostLogFileName} Crash Reports`); - opts.env.VSCODE_CRASH_REPORTER_START_OPTIONS = JSON.stringify(crashReporterStartOptions); - } - // Catch all output coming from the extension host process - type Output = { data: string, format: string[] }; + type Output = { data: string; format: string[] }; const onStdout = this._handleProcessOutputStream(this._extensionHostProcess.onStdout); const onStderr = this._handleProcessOutputStream(this._extensionHostProcess.onStderr); const onOutput = Event.any( @@ -528,7 +503,7 @@ export class LocalProcessExtensionHost implements IExtensionHost { }); } - private async _createExtHostInitData(): Promise { + private async _createExtHostInitData(): Promise { const [telemetryInfo, initData] = await Promise.all([this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]); const workspace = this._contextService.getWorkspace(); return { diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts b/src/vs/workbench/services/extensions/node/extensionHostProcess.ts deleted file mode 100644 index 4c890beb60d..00000000000 --- a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts +++ /dev/null @@ -1,8 +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 { startExtensionHostProcess } from 'vs/workbench/services/extensions/node/extensionHostProcessSetup'; - -startExtensionHostProcess().catch((err) => console.log(err)); diff --git a/src/vs/workbench/services/extensions/node/extensionPoints.ts b/src/vs/workbench/services/extensions/node/extensionPoints.ts index 89852a5f28e..56fb23d8d9a 100644 --- a/src/vs/workbench/services/extensions/node/extensionPoints.ts +++ b/src/vs/workbench/services/extensions/node/extensionPoints.ts @@ -14,7 +14,7 @@ import { URI } from 'vs/base/common/uri'; import * as pfs from 'vs/base/node/pfs'; import { getGalleryExtensionId, groupByExtension, ExtensionIdentifierWithVersion, getExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { isValidExtensionVersion } from 'vs/platform/extensions/common/extensionValidator'; -import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription, UNDEFINED_PUBLISHER } from 'vs/platform/extensions/common/extensions'; import { Translations, ILog } from 'vs/workbench/services/extensions/common/extensionPoints'; const MANIFEST_FILE = 'package.json'; @@ -201,7 +201,7 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { * Parses original message bundle, returns null if the original message bundle is null. */ private static resolveOriginalMessageBundle(originalMessageBundle: string | null, errors: json.ParseError[]) { - return new Promise<{ [key: string]: string; } | null>((c, e) => { + return new Promise<{ [key: string]: string } | null>((c, e) => { if (originalMessageBundle) { pfs.Promises.readFile(originalMessageBundle).then(originalBundleContent => { c(json.parse(originalBundleContent.toString(), errors)); @@ -218,8 +218,8 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { * Finds localized message bundle and the original (unlocalized) one. * If the localized file is not present, returns null for the original and marks original as localized. */ - private static findMessageBundles(nlsConfig: NlsConfiguration, basename: string): Promise<{ localized: string; original: string | null; }> { - return new Promise<{ localized: string; original: string | null; }>((c, e) => { + private static findMessageBundles(nlsConfig: NlsConfiguration, basename: string): Promise<{ localized: string; original: string | null }> { + return new Promise<{ localized: string; original: string | null }>((c, e) => { function loop(basename: string, locale: string): void { let toCheck = `${basename}.nls.${locale}.json`; pfs.SymlinkSupport.existsFile(toCheck).then(exists => { @@ -333,7 +333,7 @@ class ExtensionManifestValidator extends ExtensionManifestHandler { // allow publisher to be undefined to make the initial extension authoring experience smoother if (!extensionDescription.publisher) { - extensionDescription.publisher = 'undefined_publisher'; + extensionDescription.publisher = UNDEFINED_PUBLISHER; } // id := `publisher.name` @@ -549,7 +549,7 @@ export class ExtensionScanner { } try { - let obsolete: { [folderName: string]: boolean; } = {}; + let obsolete: { [folderName: string]: boolean } = {}; if (!isBuiltin) { try { const obsoleteFileContents = await pfs.Promises.readFile(path.join(absoluteFolderPath, '.obsolete'), 'utf8'); @@ -628,7 +628,7 @@ export class ExtensionScanner { public static mergeBuiltinExtensions(builtinExtensions: Promise, extraBuiltinExtensions: Promise): Promise { return Promise.all([builtinExtensions, extraBuiltinExtensions]).then(([builtinExtensions, extraBuiltinExtensions]) => { - let resultMap: { [id: string]: IExtensionDescription; } = Object.create(null); + let resultMap: { [id: string]: IExtensionDescription } = Object.create(null); for (let i = 0, len = builtinExtensions.length; i < len; i++) { resultMap[ExtensionIdentifier.toKey(builtinExtensions[i].identifier)] = builtinExtensions[i]; } diff --git a/src/vs/workbench/services/extensions/test/common/rpcProtocol.test.ts b/src/vs/workbench/services/extensions/test/common/rpcProtocol.test.ts index f500096ba1a..bc023d0e50e 100644 --- a/src/vs/workbench/services/extensions/test/common/rpcProtocol.test.ts +++ b/src/vs/workbench/services/extensions/test/common/rpcProtocol.test.ts @@ -47,7 +47,7 @@ suite('RPCProtocol', () => { let A = new RPCProtocol(a_protocol); let B = new RPCProtocol(b_protocol); - const bIdentifier = new ProxyIdentifier(false, 'bb'); + const bIdentifier = new ProxyIdentifier('bb'); const bInstance = new BClass(); B.set(bIdentifier, bInstance); bProxy = A.getProxy(bIdentifier); @@ -213,7 +213,7 @@ suite('RPCProtocol', () => { }); test('SerializableObjectWithBuffers is correctly transfered', function (done) { - delegate = (a1: SerializableObjectWithBuffers<{ string: string, buff: VSBuffer }>, a2: number) => { + delegate = (a1: SerializableObjectWithBuffers<{ string: string; buff: VSBuffer }>, a2: number) => { return new SerializableObjectWithBuffers({ string: a1.value.string + ' world', buff: a1.value.buff }); }; diff --git a/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html index d56ee74f231..fbf718a6253 100644 --- a/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html +++ b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html @@ -4,7 +4,7 @@ @@ -27,7 +27,7 @@ try { const worker = new Worker('../../../../base/worker/workerMain.js', { name }); - worker.postMessage('vs/workbench/services/extensions/worker/extensionHostWorker'); + worker.postMessage('vs/workbench/api/worker/extensionHostWorker'); const nestedWorkers = new Map(); worker.onmessage = (event) => { diff --git a/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts b/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts index a760a0d2e8a..26ecc979604 100644 --- a/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts +++ b/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts @@ -76,7 +76,7 @@ export class FilesConfigurationService extends Disposable implements IFilesConfi private autoSaveAfterShortDelayContext: IContextKey; - private currentFilesAssociationConfig: { [key: string]: string; }; + private currentFilesAssociationConfig: { [key: string]: string }; private currentHotExitConfig: string; diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/historyService.ts similarity index 51% rename from src/vs/workbench/services/history/browser/history.ts rename to src/vs/workbench/services/history/browser/historyService.ts index 0dd88a98528..d6727c22ca7 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/historyService.ts @@ -6,30 +6,25 @@ import { localize } from 'vs/nls'; import { URI } from 'vs/base/common/uri'; import { parse, stringify } from 'vs/base/common/marshalling'; -import { IEditor } from 'vs/editor/common/editorCommon'; -import { ITextEditorOptions, IResourceEditorInput, TextEditorSelectionRevealType, IEditorOptions } from 'vs/platform/editor/common/editor'; -import { IEditorPane, IEditorCloseEvent, EditorResourceAccessor, IEditorIdentifier, GroupIdentifier, EditorsOrder, SideBySideEditor, IUntypedEditorInput, isResourceEditorInput, isEditorInput, isSideBySideEditorInput, EditorCloseContext } from 'vs/workbench/common/editor'; +import { IResourceEditorInput, IEditorOptions } from 'vs/platform/editor/common/editor'; +import { IEditorPane, IEditorCloseEvent, EditorResourceAccessor, IEditorIdentifier, GroupIdentifier, EditorsOrder, SideBySideEditor, IUntypedEditorInput, isResourceEditorInput, isEditorInput, isSideBySideEditorInput, EditorCloseContext, IEditorPaneSelection, EditorPaneSelectionCompareResult, EditorPaneSelectionChangeReason, isEditorPaneWithSelection, IEditorPaneSelectionChangeEvent, IEditorPaneWithSelection, IEditorWillMoveEvent } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { GoFilter, IHistoryService } from 'vs/workbench/services/history/common/history'; import { FileChangesEvent, IFileService, FileChangeType, FILES_EXCLUDE_CONFIG, FileOperationEvent, FileOperation } from 'vs/platform/files/common/files'; -import { Selection } from 'vs/editor/common/core/selection'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { dispose, Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { getCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { getExcludes, ISearchConfiguration, SEARCH_EXCLUDE_CONFIG } from 'vs/workbench/services/search/common/search'; -import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { coalesce, remove } from 'vs/base/common/arrays'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { withNullAsUndefined } from 'vs/base/common/types'; import { addDisposableListener, EventType, EventHelper } from 'vs/base/browser/dom'; import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { Schemas } from 'vs/base/common/network'; @@ -39,81 +34,18 @@ import { ResourceGlobMatcher } from 'vs/workbench/common/resources'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; - -/** - * Stores the selection & view state of an editor and allows to compare it to other selection states. - */ -class TextEditorState { - - private static readonly EDITOR_SELECTION_THRESHOLD = 10; // number of lines to move in editor to justify for new state - - constructor(private _editorInput: EditorInput, private _selection: Selection | null) { } - - get editorInput(): EditorInput { - return this._editorInput; - } - - get selection(): Selection | undefined { - return withNullAsUndefined(this._selection); - } - - justifiesNewPushState(other: TextEditorState, event?: ICursorPositionChangedEvent): boolean { - if (event?.source === 'api') { - return true; // always let API source win (e.g. "Go to definition" should add a history entry) - } - - if (!this._editorInput.matches(other._editorInput)) { - return true; // different editor inputs - } - - if (!Selection.isISelection(this._selection) || !Selection.isISelection(other._selection)) { - return true; // unknown selections - } - - const thisLineNumber = Math.min(this._selection.selectionStartLineNumber, this._selection.positionLineNumber); - const otherLineNumber = Math.min(other._selection.selectionStartLineNumber, other._selection.positionLineNumber); - - if (Math.abs(thisLineNumber - otherLineNumber) < TextEditorState.EDITOR_SELECTION_THRESHOLD) { - return false; // ignore selection changes in the range of EditorState.EDITOR_SELECTION_THRESHOLD lines - } - - return true; - } -} - -interface ISerializedEditorHistoryEntry { - - /** - * The editor for the history entry. We currently only - * support untyped editor inputs with `resource`. - */ - editor: IResourceEditorInput; -} - -interface IStackEntry { - editor: EditorInput | IResourceEditorInput; - selection?: Selection; -} - -interface IRecentlyClosedEditor { - editorId: string | undefined; - editor: IUntypedEditorInput; - - resource: URI | undefined; - associatedResources: URI[]; - - index: number; - sticky: boolean; -} +import { ILogService, LogLevel } from 'vs/platform/log/common/log'; export class HistoryService extends Disposable implements IHistoryService { declare readonly _serviceBrand: undefined; - private readonly activeEditorListeners = this._register(new DisposableStore()); - private lastActiveEditor?: IEditorIdentifier; + private static readonly MOUSE_NAVIGATION_SETTING = 'workbench.editor.mouseBackForwardToNavigate'; - private readonly editorStackListeners = new Map(); + private readonly activeEditorListeners = this._register(new DisposableStore()); + private lastActiveEditor: IEditorIdentifier | undefined = undefined; + + private readonly editorHelper = this.instantiationService.createInstance(EditorHelper); constructor( @IEditorService private readonly editorService: EditorServiceImpl, @@ -126,25 +58,11 @@ export class HistoryService extends Disposable implements IHistoryService { @IInstantiationService private readonly instantiationService: IInstantiationService, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IContextKeyService private readonly contextKeyService: IContextKeyService, - @IPathService private readonly pathService: IPathService, - @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, - @ILifecycleService private readonly lifecycleService: ILifecycleService + @ILogService private readonly logService: ILogService ) { super(); this.registerListeners(); - } - - private registerListeners(): void { - this._register(this.editorService.onDidActiveEditorChange(() => this.onDidActiveEditorChange())); - this._register(this.editorService.onDidOpenEditorFail(event => this.remove(event.editor))); - this._register(this.editorService.onDidCloseEditor(event => this.onDidCloseEditor(event))); - this._register(this.editorService.onDidMostRecentlyActiveEditorsChange(() => this.handleEditorEventInRecentEditorsStack())); - - this._register(this.fileService.onDidFilesChange(event => this.onDidFilesChange(event))); - this._register(this.fileService.onDidRunOperation(event => this.onDidFilesChange(event))); - - this._register(this.storageService.onWillSaveState(() => this.saveState())); // if the service is created late enough that an editor is already opened // make sure to trigger the onActiveEditorChanged() to track the editor @@ -152,19 +70,39 @@ export class HistoryService extends Disposable implements IHistoryService { if (this.editorService.activeEditorPane) { this.onDidActiveEditorChange(); } + } + + private registerListeners(): void { // Mouse back/forward support + this.registerMouseNavigationListener(); + + // Editor changes + this._register(this.editorService.onDidActiveEditorChange(() => this.onDidActiveEditorChange())); + this._register(this.editorService.onDidOpenEditorFail(event => this.remove(event.editor))); + this._register(this.editorService.onDidCloseEditor(event => this.onDidCloseEditor(event))); + this._register(this.editorService.onDidMostRecentlyActiveEditorsChange(() => this.handleEditorEventInRecentEditorsStack())); + + // File changes + this._register(this.fileService.onDidFilesChange(event => this.onDidFilesChange(event))); + this._register(this.fileService.onDidRunOperation(event => this.onDidFilesChange(event))); + + // Storage + this._register(this.storageService.onWillSaveState(() => this.saveState())); + } + + private registerMouseNavigationListener(): void { const mouseBackForwardSupportListener = this._register(new DisposableStore()); const handleMouseBackForwardSupport = () => { mouseBackForwardSupportListener.clear(); - if (this.configurationService.getValue('workbench.editor.mouseBackForwardToNavigate')) { + if (this.configurationService.getValue(HistoryService.MOUSE_NAVIGATION_SETTING)) { mouseBackForwardSupportListener.add(addDisposableListener(this.layoutService.container, EventType.MOUSE_DOWN, e => this.onMouseDown(e))); } }; this._register(this.configurationService.onDidChangeConfiguration(event => { - if (event.affectsConfiguration('workbench.editor.mouseBackForwardToNavigate')) { + if (event.affectsConfiguration(HistoryService.MOUSE_NAVIGATION_SETTING)) { handleMouseBackForwardSupport(); } })); @@ -178,21 +116,23 @@ export class HistoryService extends Disposable implements IHistoryService { switch (event.button) { case 3: EventHelper.stop(event); - this.back(); + this.goBack(); break; case 4: EventHelper.stop(event); - this.forward(); + this.goForward(); break; } } private onDidActiveEditorChange(): void { const activeEditorPane = this.editorService.activeEditorPane; - if (this.lastActiveEditor && this.matchesEditor(this.lastActiveEditor, activeEditorPane)) { + if (this.lastActiveEditor && this.editorHelper.matchesEditorIdentifier(this.lastActiveEditor, activeEditorPane)) { return; // return if the active editor is still the same } + this.logService.trace('[history] onDidActiveEditorChange()'); + // Remember as last active editor (can be undefined if none opened) this.lastActiveEditor = activeEditorPane?.input && activeEditorPane.group ? { editor: activeEditorPane.input, groupId: activeEditorPane.group.id } : undefined; @@ -202,41 +142,18 @@ export class HistoryService extends Disposable implements IHistoryService { // Handle editor change this.handleActiveEditorChange(activeEditorPane); - // Apply listener for selection changes if this is a text editor - const activeTextEditorControl = getCodeEditor(this.editorService.activeTextEditorControl); - const activeEditor = this.editorService.activeEditor; - if (activeTextEditorControl) { + // Listen to selection changes if the editor pane + // is having a selection concept. + if (isEditorPaneWithSelection(activeEditorPane)) { + this.activeEditorListeners.add(activeEditorPane.onDidChangeSelection(e => { + this.logService.trace(`[history] onDidActiveEditorChange.onDidChangeSelection(): ${e}`); - // Debounce the event with a timeout of 0ms so that multiple calls to - // editor.setSelection() are folded into one. We do not want to record - // subsequent history navigations for such API calls. - this.activeEditorListeners.add(Event.debounce(activeTextEditorControl.onDidChangeCursorPosition, (last, event) => event, 0)((event => { - this.handleEditorSelectionChangeEvent(activeEditorPane, event); - }))); - - // Track the last edit location by tracking model content change events - // Use a debouncer to make sure to capture the correct cursor position - // after the model content has changed. - this.activeEditorListeners.add(Event.debounce(activeTextEditorControl.onDidChangeModelContent, (last, event) => event, 0)((event => { - if (activeEditor) { - this.rememberLastEditLocation(activeEditor, activeTextEditorControl); - } - }))); + // Handle in editor navigation stack + this.handleActiveEditorSelectionChangeEvent(activeEditorPane, e); + })); } } - private matchesEditor(identifier: IEditorIdentifier, editor?: IEditorPane): boolean { - if (!editor || !editor.group) { - return false; - } - - if (identifier.groupId !== editor.group.id) { - return false; - } - - return editor.input ? identifier.editor.matches(editor.input) : false; - } - private onDidFilesChange(event: FileChangesEvent | FileOperationEvent): void { // External file changes (watcher) @@ -261,50 +178,26 @@ export class HistoryService extends Disposable implements IHistoryService { } } - private handleEditorSelectionChangeEvent(editor?: IEditorPane, event?: ICursorPositionChangedEvent): void { - this.handleEditorEventInNavigationStack(editor, event); + private handleActiveEditorChange(editorPane?: IEditorPane): void { + this.handleActiveEditorChangeInHistory(editorPane); + this.handleActiveEditorChangeInNavigationStacks(editorPane); } - private handleActiveEditorChange(editor?: IEditorPane): void { - this.handleEditorEventInHistory(editor); - this.handleEditorEventInNavigationStack(editor); - } - - private onEditorDispose(editor: EditorInput, listener: Function, mapEditorToDispose: Map): void { - const toDispose = Event.once(editor.onWillDispose)(() => listener()); - - let disposables = mapEditorToDispose.get(editor); - if (!disposables) { - disposables = new DisposableStore(); - mapEditorToDispose.set(editor, disposables); - } - - disposables.add(toDispose); - } - - private clearOnEditorDispose(editor: EditorInput | IResourceEditorInput | FileChangesEvent | FileOperationEvent, mapEditorToDispose: Map): void { - if (!isEditorInput(editor)) { - return; // only supported when passing in an actual editor input - } - - const disposables = mapEditorToDispose.get(editor); - if (disposables) { - dispose(disposables); - mapEditorToDispose.delete(editor); - } + private handleActiveEditorSelectionChangeEvent(editorPane: IEditorPaneWithSelection, event: IEditorPaneSelectionChangeEvent): void { + this.handleActiveEditorSelectionChangeEventInNavigationStacks(editorPane, event); } private move(event: FileOperationEvent): void { this.moveInHistory(event); - this.moveInNavigationStack(event); + this.moveInEditorNavigationStacks(event); } - private remove(input: EditorInput): void; + private remove(editor: EditorInput): void; private remove(event: FileChangesEvent): void; private remove(event: FileOperationEvent): void; private remove(arg1: EditorInput | FileChangesEvent | FileOperationEvent): void { this.removeFromHistory(arg1); - this.removeFromNavigationStack(arg1); + this.removeFromEditorNavigationStacks(arg1); this.removeFromRecentlyClosedEditors(arg1); this.removeFromRecentlyOpened(arg1); } @@ -330,11 +223,7 @@ export class HistoryService extends Disposable implements IHistoryService { this.clearRecentlyOpened(); // Navigation (next, previous) - this.navigationStackIndex = -1; - this.lastNavigationStackIndex = -1; - this.navigationStack.splice(0); - this.editorStackListeners.forEach(listeners => dispose(listeners)); - this.editorStackListeners.clear(); + this.clearEditorNavigationStacks(); // Recently closed editors this.recentlyClosedEditors = []; @@ -343,372 +232,246 @@ export class HistoryService extends Disposable implements IHistoryService { this.updateContextKeys(); } - //#region Navigation (Go Forward, Go Backward) + //#region History Context Keys - private static readonly MAX_NAVIGATION_STACK_ITEMS = 50; + private readonly canNavigateBackContextKey = (new RawContextKey('canNavigateBack', false, localize('canNavigateBack', "Whether it is possible to navigate back in editor history"))).bindTo(this.contextKeyService); + private readonly canNavigateForwardContextKey = (new RawContextKey('canNavigateForward', false, localize('canNavigateForward', "Whether it is possible to navigate forward in editor history"))).bindTo(this.contextKeyService); - private navigationStack: IStackEntry[] = []; - private navigationStackIndex = -1; - private lastNavigationStackIndex = -1; + private readonly canNavigateBackInNavigationsContextKey = (new RawContextKey('canNavigateBackInNavigationLocations', false, localize('canNavigateBackInNavigationLocations', "Whether it is possible to navigate back in editor navigation locations history"))).bindTo(this.contextKeyService); + private readonly canNavigateForwardInNavigationsContextKey = (new RawContextKey('canNavigateForwardInNavigationLocations', false, localize('canNavigateForwardInNavigationLocations', "Whether it is possible to navigate forward in editor navigation locations history"))).bindTo(this.contextKeyService); + private readonly canNavigateToLastNavigationLocationContextKey = (new RawContextKey('canNavigateToLastNavigationLocation', false, localize('canNavigateToLastNavigationLocation', "Whether it is possible to navigate to the last editor navigation location"))).bindTo(this.contextKeyService); - private navigatingInStack = false; + private readonly canNavigateBackInEditsContextKey = (new RawContextKey('canNavigateBackInEditLocations', false, localize('canNavigateBackInEditLocations', "Whether it is possible to navigate back in editor edit locations history"))).bindTo(this.contextKeyService); + private readonly canNavigateForwardInEditsContextKey = (new RawContextKey('canNavigateForwardInEditLocations', false, localize('canNavigateForwardInEditLocations', "Whether it is possible to navigate forward in editor edit locations history"))).bindTo(this.contextKeyService); + private readonly canNavigateToLastEditLocationContextKey = (new RawContextKey('canNavigateToLastEditLocation', false, localize('canNavigateToLastEditLocation', "Whether it is possible to navigate to the last editor edit location"))).bindTo(this.contextKeyService); - private currentTextEditorState: TextEditorState | null = null; + private readonly canReopenClosedEditorContextKey = (new RawContextKey('canReopenClosedEditor', false, localize('canReopenClosedEditor', "Whether it is possible to reopen the last closed editor"))).bindTo(this.contextKeyService); - forward(): void { - if (this.navigationStack.length > this.navigationStackIndex + 1) { - this.setIndex(this.navigationStackIndex + 1); - this.navigate(); - } - } + updateContextKeys(): void { + this.contextKeyService.bufferChangeEvents(() => { + this.canNavigateBackContextKey.set(this.globalDefaultEditorNavigationStack.canGoBack()); + this.canNavigateForwardContextKey.set(this.globalDefaultEditorNavigationStack.canGoForward()); - back(): void { - if (this.navigationStackIndex > 0) { - this.setIndex(this.navigationStackIndex - 1); - this.navigate(); - } - } + this.canNavigateBackInNavigationsContextKey.set(this.globalNavigationsEditorNavigationStack.canGoBack()); + this.canNavigateForwardInNavigationsContextKey.set(this.globalNavigationsEditorNavigationStack.canGoForward()); + this.canNavigateToLastNavigationLocationContextKey.set(this.globalNavigationsEditorNavigationStack.canGoLast()); - last(): void { - if (this.lastNavigationStackIndex === -1) { - this.back(); - } else { - this.setIndex(this.lastNavigationStackIndex); - this.navigate(); - } - } + this.canNavigateBackInEditsContextKey.set(this.globalEditsEditorNavigationStack.canGoBack()); + this.canNavigateForwardInEditsContextKey.set(this.globalEditsEditorNavigationStack.canGoForward()); + this.canNavigateToLastEditLocationContextKey.set(this.globalEditsEditorNavigationStack.canGoLast()); - private setIndex(value: number): void { - this.lastNavigationStackIndex = this.navigationStackIndex; - this.navigationStackIndex = value; - - // Context Keys - this.updateContextKeys(); - } - - private async navigate(): Promise { - this.navigatingInStack = true; - - const navigateToStackEntry = this.navigationStack[this.navigationStackIndex]; - - try { - await this.doNavigate(navigateToStackEntry); - } finally { - this.navigatingInStack = false; - } - } - - private doNavigate(location: IStackEntry): Promise { - const options: ITextEditorOptions = { - revealIfOpened: true, // support to navigate across editor groups - selection: location.selection, - selectionRevealType: TextEditorSelectionRevealType.CenterIfOutsideViewport - }; - - if (isEditorInput(location.editor)) { - return this.editorService.openEditor(location.editor, options); - } - - return this.editorService.openEditor({ - ...location.editor, - options: { - ...location.editor.options, - ...options - } + this.canReopenClosedEditorContextKey.set(this.recentlyClosedEditors.length > 0); }); } - private handleEditorEventInNavigationStack(control: IEditorPane | undefined, event?: ICursorPositionChangedEvent): void { - const codeEditor = control ? getCodeEditor(control.getControl()) : undefined; - - // treat editor changes that happen as part of stack navigation specially - // we do not want to add a new stack entry as a matter of navigating the - // stack but we need to keep our currentTextEditorState up to date with - // the navigtion that occurs. - if (this.navigatingInStack) { - if (codeEditor && control?.input && !control.input.isDisposed()) { - this.currentTextEditorState = new TextEditorState(control.input, codeEditor.getSelection()); - } else { - this.currentTextEditorState = null; // we navigated to a non text or disposed editor - } - } - - // normal navigation not part of history navigation - else { - - // navigation inside text editor - if (codeEditor && control?.input && !control.input.isDisposed()) { - this.handleTextEditorEventInNavigationStack(control, codeEditor, event); - } - - // navigation to non-text disposed editor - else { - this.currentTextEditorState = null; // at this time we have no active text editor view state - - if (control?.input && !control.input.isDisposed()) { - this.handleNonTextEditorEventInNavigationStack(control); - } - } - } - } - - private handleTextEditorEventInNavigationStack(editor: IEditorPane, editorControl: IEditor, event?: ICursorPositionChangedEvent): void { - if (!editor.input) { - return; - } - - const stateCandidate = new TextEditorState(editor.input, editorControl.getSelection()); - - // Add to stack if we dont have a current state or this new state justifies a push - if (!this.currentTextEditorState || this.currentTextEditorState.justifiesNewPushState(stateCandidate, event)) { - this.addToNavigationStack(editor.input, stateCandidate.selection); - } - - // Otherwise we replace the current stack entry with this one - else { - this.replaceInNavigationStack(editor.input, stateCandidate.selection); - } - - // Update our current text editor state - this.currentTextEditorState = stateCandidate; - } - - private handleNonTextEditorEventInNavigationStack(editor: IEditorPane): void { - if (!editor.input) { - return; - } - - const currentStack = this.navigationStack[this.navigationStackIndex]; - if (currentStack && this.matches(editor.input, currentStack.editor)) { - return; // do not push same editor input again - } - - this.addToNavigationStack(editor.input); - } - - private addToNavigationStack(input: EditorInput | IResourceEditorInput, selection?: Selection): void { - if (!this.navigatingInStack) { - this.doAddOrReplaceInNavigationStack(input, selection); - } - } - - private replaceInNavigationStack(input: EditorInput | IResourceEditorInput, selection?: Selection): void { - if (!this.navigatingInStack) { - this.doAddOrReplaceInNavigationStack(input, selection, true /* force replace */); - } - } - - private doAddOrReplaceInNavigationStack(input: EditorInput | IResourceEditorInput, selection?: Selection, forceReplace?: boolean): void { - - // Overwrite an entry in the stack if we have a matching input that comes - // with editor options to indicate that this entry is more specific. Also - // prevent entries that have the exact same options. Finally, Overwrite - // entries if we detect that the change came in very fast which indicates - // that it was not coming in from a user change but rather rapid programmatic - // changes. We just take the last of the changes to not cause too many entries - // on the stack. - // We can also be instructed to force replace the last entry. - let replace = false; - const currentEntry = this.navigationStack[this.navigationStackIndex]; - if (currentEntry) { - if (forceReplace) { - replace = true; // replace if we are forced to - } else if (this.matches(input, currentEntry.editor) && this.sameSelection(currentEntry.selection, selection)) { - replace = true; // replace if the input is the same as the current one and the selection as well - } - } - - const stackEditorInput = this.preferResourceEditorInput(input); - if (!stackEditorInput) { - return; - } - - const entry = { editor: stackEditorInput, selection }; - - // Replace at current position - let removedEntries: IStackEntry[] = []; - if (replace) { - removedEntries.push(this.navigationStack[this.navigationStackIndex]); - this.navigationStack[this.navigationStackIndex] = entry; - } - - // Add to stack at current position - else { - - // If we are not at the end of history, we remove anything after - if (this.navigationStack.length > this.navigationStackIndex + 1) { - for (let i = this.navigationStackIndex + 1; i < this.navigationStack.length; i++) { - removedEntries.push(this.navigationStack[i]); - } - - this.navigationStack = this.navigationStack.slice(0, this.navigationStackIndex + 1); - } - - // Insert entry at index - this.navigationStack.splice(this.navigationStackIndex + 1, 0, entry); - - // Check for limit - if (this.navigationStack.length > HistoryService.MAX_NAVIGATION_STACK_ITEMS) { - removedEntries.push(this.navigationStack.shift()!); // remove first - if (this.lastNavigationStackIndex >= 0) { - this.lastNavigationStackIndex--; - } - } else { - this.setIndex(this.navigationStackIndex + 1); - } - } - - // Clear editor listeners from removed entries - for (const removedEntry of removedEntries) { - this.clearOnEditorDispose(removedEntry.editor, this.editorStackListeners); - } - - // Remove this from the stack unless the stack input is a resource - // that can easily be restored even when the input gets disposed - if (isEditorInput(stackEditorInput)) { - this.onEditorDispose(stackEditorInput, () => this.removeFromNavigationStack(stackEditorInput), this.editorStackListeners); - } - - // Context Keys - this.updateContextKeys(); - } - - private preferResourceEditorInput(input: EditorInput): EditorInput | IResourceEditorInput; - private preferResourceEditorInput(input: IResourceEditorInput): IResourceEditorInput | undefined; - private preferResourceEditorInput(input: EditorInput | IResourceEditorInput): EditorInput | IResourceEditorInput | undefined; - private preferResourceEditorInput(input: EditorInput | IResourceEditorInput): EditorInput | IResourceEditorInput | undefined { - const resource = EditorResourceAccessor.getOriginalUri(input); - - // For now, only prefer well known schemes that we control to prevent - // issues such as https://github.com/microsoft/vscode/issues/85204 - // from being used as resource inputs - // resource inputs survive editor disposal and as such are a lot more - // durable across editor changes and restarts - const hasValidResourceEditorInputScheme = - resource?.scheme === Schemas.file || - resource?.scheme === Schemas.vscodeRemote || - resource?.scheme === Schemas.userData || - resource?.scheme === this.pathService.defaultUriScheme; - - // Scheme is valid: prefer the untyped input - // over the typed input if possible to keep - // the entry across restarts - if (hasValidResourceEditorInputScheme) { - if (isEditorInput(input)) { - const untypedInput = input.toUntyped(); - if (isResourceEditorInput(untypedInput)) { - return untypedInput; - } - } - - return input; - } - - // Scheme is invalid: allow the editor input - // for as long as it is not disposed - else { - return isEditorInput(input) ? input : undefined; - } - } - - private sameSelection(selectionA?: Selection, selectionB?: Selection): boolean { - if (!selectionA && !selectionB) { - return true; - } - - if (!selectionA || !selectionB) { - return false; - } - - return selectionA.startLineNumber === selectionB.startLineNumber; // we consider the history entry same if we are on the same line - } - - private moveInNavigationStack(event: FileOperationEvent): void { - const removed = this.removeFromNavigationStack(event); - if (removed && event.target) { - this.addToNavigationStack({ resource: event.target.resource }); - } - } - - private removeFromNavigationStack(arg1: EditorInput | FileChangesEvent | FileOperationEvent): boolean { - let removed = false; - - this.navigationStack = this.navigationStack.filter(entry => { - const matches = this.matches(arg1, entry.editor); - - // Cleanup any listeners associated with the input when removing - if (matches) { - this.clearOnEditorDispose(arg1, this.editorStackListeners); - removed = true; - } - - return !matches; - }); - this.navigationStackIndex = this.navigationStack.length - 1; // reset index - this.lastNavigationStackIndex = -1; - - // Context Keys - this.updateContextKeys(); - - return removed; - } - - private matches(arg1: EditorInput | IResourceEditorInput | FileChangesEvent | FileOperationEvent, inputB: EditorInput | IResourceEditorInput): boolean { - if (arg1 instanceof FileChangesEvent || arg1 instanceof FileOperationEvent) { - if (isEditorInput(inputB)) { - return false; // we only support this for `IResourceEditorInputs` that are file based - } - - if (arg1 instanceof FileChangesEvent) { - return arg1.contains(inputB.resource, FileChangeType.DELETED); - } - - return this.matchesFile(inputB.resource, arg1); - } - - if (isEditorInput(arg1)) { - if (isEditorInput(inputB)) { - return arg1.matches(inputB); - } - - return this.matchesFile(inputB.resource, arg1); - } - - if (isEditorInput(inputB)) { - return this.matchesFile(arg1.resource, inputB); - } - - return arg1 && inputB && this.uriIdentityService.extUri.isEqual(arg1.resource, inputB.resource); - } - - private matchesFile(resource: URI, arg2: EditorInput | IResourceEditorInput | FileChangesEvent | FileOperationEvent): boolean { - if (arg2 instanceof FileChangesEvent) { - return arg2.contains(resource, FileChangeType.DELETED); - } - - if (arg2 instanceof FileOperationEvent) { - return this.uriIdentityService.extUri.isEqualOrParent(resource, arg2.resource); - } - - if (isEditorInput(arg2)) { - const inputResource = arg2.resource; - if (!inputResource) { - return false; - } - - if (this.lifecycleService.phase >= LifecyclePhase.Restored && !this.fileService.hasProvider(inputResource)) { - return false; // make sure to only check this when workbench has restored (for https://github.com/microsoft/vscode/issues/48275) - } - - return this.uriIdentityService.extUri.isEqual(inputResource, resource); - } - - return this.uriIdentityService.extUri.isEqual(arg2?.resource, resource); - } - //#endregion - //#region Recently Closed Editors + //#region Editor History Navigation (limit: 50) + + private readonly globalDefaultEditorNavigationStack = this.createEditorNavigationStack(GoFilter.NONE); + private readonly globalEditsEditorNavigationStack = this.createEditorNavigationStack(GoFilter.EDITS); + private readonly globalNavigationsEditorNavigationStack = this.createEditorNavigationStack(GoFilter.NAVIGATION); + + private readonly editorNavigationStacks: EditorNavigationStack[] = [ + this.globalDefaultEditorNavigationStack, + this.globalEditsEditorNavigationStack, + this.globalNavigationsEditorNavigationStack + ]; + + readonly onDidChangeEditorNavigationStack = Event.any( + this.globalDefaultEditorNavigationStack.onDidChange, + this.globalEditsEditorNavigationStack.onDidChange, + this.globalNavigationsEditorNavigationStack.onDidChange + ); + + private createEditorNavigationStack(kind: GoFilter): EditorNavigationStack { + const editorNavigationStack = this._register(this.instantiationService.createInstance(EditorNavigationStack, kind)); + + // Update context keys on changes + this._register(editorNavigationStack.onDidChange(() => this.updateContextKeys())); + + return editorNavigationStack; + } + + goForward(filter?: GoFilter): Promise { + return this.getStack(filter).goForward(); + } + + goBack(filter?: GoFilter): Promise { + return this.getStack(filter).goBack(); + } + + goPrevious(filter?: GoFilter): Promise { + return this.getStack(filter).goPrevious(); + } + + goLast(filter?: GoFilter): Promise { + return this.getStack(filter).goLast(); + } + + private handleActiveEditorChangeInNavigationStacks(editorPane?: IEditorPane): void { + this.globalDefaultEditorNavigationStack.notifyNavigation(editorPane); + } + + private handleActiveEditorSelectionChangeEventInNavigationStacks(editorPane: IEditorPaneWithSelection, event: IEditorPaneSelectionChangeEvent): void { + + // Always send to global navigation stack + this.globalDefaultEditorNavigationStack.notifyNavigation(editorPane, event); + + // Send to specific navigation stack based on reason + switch (event.reason) { + case EditorPaneSelectionChangeReason.EDIT: + this.globalEditsEditorNavigationStack.notifyNavigation(editorPane, event); + break; + case EditorPaneSelectionChangeReason.NAVIGATION: { + + // A navigation selection change always has a source and target + // As such, we add the previous entry of the global navigation + // stack so that our navigation stack receives both entries + // unless the user is currently navigating. + + if (!this.globalNavigationsEditorNavigationStack.isNavigating()) { + const previous = this.globalDefaultEditorNavigationStack.previous; + if (previous) { + this.globalNavigationsEditorNavigationStack.addOrReplace(previous.groupId, previous.editor, previous.selection); + } + } + this.globalNavigationsEditorNavigationStack.notifyNavigation(editorPane, event); + break; + } + } + } + + private getStack(filter = GoFilter.NONE): EditorNavigationStack { + switch (filter) { + case GoFilter.NONE: return this.globalDefaultEditorNavigationStack; + case GoFilter.EDITS: return this.globalEditsEditorNavigationStack; + case GoFilter.NAVIGATION: return this.globalNavigationsEditorNavigationStack; + } + } + + private clearEditorNavigationStacks(): void { + for (const editorNavigationStack of this.editorNavigationStacks) { + editorNavigationStack.clear(); + } + } + + private removeFromEditorNavigationStacks(arg1: EditorInput | FileChangesEvent | FileOperationEvent): void { + for (const editorNavigationStack of this.editorNavigationStacks) { + editorNavigationStack.remove(arg1); + } + } + + private moveInEditorNavigationStacks(event: FileOperationEvent): void { + for (const editorNavigationStack of this.editorNavigationStacks) { + editorNavigationStack.move(event); + } + } + + //#endregion + + //#region Navigation: Next/Previous Used Editor + + private recentlyUsedEditorsStack: readonly IEditorIdentifier[] | undefined = undefined; + private recentlyUsedEditorsStackIndex = 0; + + private recentlyUsedEditorsInGroupStack: readonly IEditorIdentifier[] | undefined = undefined; + private recentlyUsedEditorsInGroupStackIndex = 0; + + private navigatingInRecentlyUsedEditorsStack = false; + private navigatingInRecentlyUsedEditorsInGroupStack = false; + + openNextRecentlyUsedEditor(groupId?: GroupIdentifier): Promise { + const [stack, index] = this.ensureRecentlyUsedStack(index => index - 1, groupId); + + return this.doNavigateInRecentlyUsedEditorsStack(stack[index], groupId); + } + + openPreviouslyUsedEditor(groupId?: GroupIdentifier): Promise { + const [stack, index] = this.ensureRecentlyUsedStack(index => index + 1, groupId); + + return this.doNavigateInRecentlyUsedEditorsStack(stack[index], groupId); + } + + private async doNavigateInRecentlyUsedEditorsStack(editorIdentifier: IEditorIdentifier | undefined, groupId?: GroupIdentifier): Promise { + if (editorIdentifier) { + const acrossGroups = typeof groupId !== 'number' || !this.editorGroupService.getGroup(groupId); + + if (acrossGroups) { + this.navigatingInRecentlyUsedEditorsStack = true; + } else { + this.navigatingInRecentlyUsedEditorsInGroupStack = true; + } + + const group = this.editorGroupService.getGroup(editorIdentifier.groupId) ?? this.editorGroupService.activeGroup; + try { + await group.openEditor(editorIdentifier.editor); + } finally { + if (acrossGroups) { + this.navigatingInRecentlyUsedEditorsStack = false; + } else { + this.navigatingInRecentlyUsedEditorsInGroupStack = false; + } + } + } + } + + private ensureRecentlyUsedStack(indexModifier: (index: number) => number, groupId?: GroupIdentifier): [readonly IEditorIdentifier[], number] { + let editors: readonly IEditorIdentifier[]; + let index: number; + + const group = typeof groupId === 'number' ? this.editorGroupService.getGroup(groupId) : undefined; + + // Across groups + if (!group) { + editors = this.recentlyUsedEditorsStack || this.editorService.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); + index = this.recentlyUsedEditorsStackIndex; + } + + // Within group + else { + editors = this.recentlyUsedEditorsInGroupStack || group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).map(editor => ({ groupId: group.id, editor })); + index = this.recentlyUsedEditorsInGroupStackIndex; + } + + // Adjust index + let newIndex = indexModifier(index); + if (newIndex < 0) { + newIndex = 0; + } else if (newIndex > editors.length - 1) { + newIndex = editors.length - 1; + } + + // Remember index and editors + if (!group) { + this.recentlyUsedEditorsStack = editors; + this.recentlyUsedEditorsStackIndex = newIndex; + } else { + this.recentlyUsedEditorsInGroupStack = editors; + this.recentlyUsedEditorsInGroupStackIndex = newIndex; + } + + return [editors, newIndex]; + } + + private handleEditorEventInRecentEditorsStack(): void { + + // Drop all-editors stack unless navigating in all editors + if (!this.navigatingInRecentlyUsedEditorsStack) { + this.recentlyUsedEditorsStack = undefined; + this.recentlyUsedEditorsStackIndex = 0; + } + + // Drop in-group-editors stack unless navigating in group + if (!this.navigatingInRecentlyUsedEditorsInGroupStack) { + this.recentlyUsedEditorsInGroupStack = undefined; + this.recentlyUsedEditorsInGroupStackIndex = 0; + } + } + + //#endregion + + //#region File: Reopen Closed Editor (limit: 20) private static readonly MAX_RECENTLY_CLOSED_EDITORS = 20; @@ -760,16 +523,19 @@ export class HistoryService extends Disposable implements IHistoryService { this.canReopenClosedEditorContextKey.set(true); } - reopenLastClosedEditor(): void { + async reopenLastClosedEditor(): Promise { // Open editor if we have one const lastClosedEditor = this.recentlyClosedEditors.pop(); + let reopenClosedEditorPromise: Promise | undefined = undefined; if (lastClosedEditor) { - this.doReopenLastClosedEditor(lastClosedEditor); + reopenClosedEditorPromise = this.doReopenLastClosedEditor(lastClosedEditor); } // Update context this.canReopenClosedEditorContextKey.set(this.recentlyClosedEditors.length > 0); + + return reopenClosedEditorPromise; } private async doReopenLastClosedEditor(lastClosedEditor: IRecentlyClosedEditor): Promise { @@ -788,11 +554,13 @@ export class HistoryService extends Disposable implements IHistoryService { // Re-open editor unless already opened let editorPane: IEditorPane | undefined = undefined; if (!this.editorGroupService.activeGroup.contains(lastClosedEditor.editor)) { + // Fix for https://github.com/microsoft/vscode/issues/107850 // If opening an editor fails, it is possible that we get // another editor-close event as a result. But we really do // want to ignore that in our list of recently closed editors // to prevent endless loops. + this.ignoreEditorCloseEvent = true; try { editorPane = await this.editorService.openEditor({ @@ -809,6 +577,7 @@ export class HistoryService extends Disposable implements IHistoryService { // If no editor was opened, try with the next one if (!editorPane) { + // Fix for https://github.com/microsoft/vscode/issues/67882 // If opening of the editor fails, make sure to try the next one // but make sure to remove this one from the list to prevent @@ -826,11 +595,11 @@ export class HistoryService extends Disposable implements IHistoryService { return true; // keep: different editor identifiers } - if (recentlyClosedEditor.resource && this.matchesFile(recentlyClosedEditor.resource, arg1)) { + if (recentlyClosedEditor.resource && this.editorHelper.matchesFile(recentlyClosedEditor.resource, arg1)) { return false; // remove: editor matches directly } - if (recentlyClosedEditor.associatedResources.some(associatedResource => this.matchesFile(associatedResource, arg1))) { + if (recentlyClosedEditor.associatedResources.some(associatedResource => this.editorHelper.matchesFile(associatedResource, arg1))) { return false; // remove: an associated resource matches } @@ -843,47 +612,7 @@ export class HistoryService extends Disposable implements IHistoryService { //#endregion - //#region Last Edit Location - - private lastEditLocation: IStackEntry | undefined; - - private rememberLastEditLocation(activeEditor: EditorInput, activeTextEditorControl: ICodeEditor): void { - this.lastEditLocation = { editor: activeEditor }; - this.canNavigateToLastEditLocationContextKey.set(true); - - const position = activeTextEditorControl.getPosition(); - if (position) { - this.lastEditLocation.selection = new Selection(position.lineNumber, position.column, position.lineNumber, position.column); - } - } - - openLastEditLocation(): void { - if (this.lastEditLocation) { - this.doNavigate(this.lastEditLocation); - } - } - - //#endregion - - //#region Context Keys - - private readonly canNavigateBackContextKey = (new RawContextKey('canNavigateBack', false, localize('canNavigateBack', "Whether it is possible to navigate back in editor history"))).bindTo(this.contextKeyService); - private readonly canNavigateForwardContextKey = (new RawContextKey('canNavigateForward', false, localize('canNavigateForward', "Whether it is possible to navigate forward in editor history"))).bindTo(this.contextKeyService); - private readonly canNavigateToLastEditLocationContextKey = (new RawContextKey('canNavigateToLastEditLocation', false, localize('canNavigateToLastEditLocation', "Whether it is possible to navigate to the last edit location"))).bindTo(this.contextKeyService); - private readonly canReopenClosedEditorContextKey = (new RawContextKey('canReopenClosedEditor', false, localize('canReopenClosedEditor', "Whether it is possible to reopen the last closed editor"))).bindTo(this.contextKeyService); - - private updateContextKeys(): void { - this.contextKeyService.bufferChangeEvents(() => { - this.canNavigateBackContextKey.set(this.navigationStack.length > 0 && this.navigationStackIndex > 0); - this.canNavigateForwardContextKey.set(this.navigationStack.length > 0 && this.navigationStackIndex < this.navigationStack.length - 1); - this.canNavigateToLastEditLocationContextKey.set(!!this.lastEditLocation); - this.canReopenClosedEditorContextKey.set(this.recentlyClosedEditors.length > 0); - }); - } - - //#endregion - - //#region History + //#region Go to: Recently Opened Editor (limit: 200, persisted) private static readonly MAX_HISTORY_ITEMS = 200; private static readonly HISTORY_STORAGE_KEY = 'history.entries'; @@ -904,23 +633,23 @@ export class HistoryService extends Disposable implements IHistoryService { return matcher; })); - private handleEditorEventInHistory(editor?: IEditorPane): void { + private handleActiveEditorChangeInHistory(editorPane?: IEditorPane): void { // Ensure we have not configured to exclude input and don't track invalid inputs - const input = editor?.input; - if (!input || input.isDisposed() || !this.includeInHistory(input)) { + const editor = editorPane?.input; + if (!editor || editor.isDisposed() || !this.includeInHistory(editor)) { return; } // Remove any existing entry and add to the beginning - this.removeFromHistory(input); - this.addToHistory(input); + this.removeFromHistory(editor); + this.addToHistory(editor); } - private addToHistory(input: EditorInput | IResourceEditorInput, insertFirst = true): void { + private addToHistory(editor: EditorInput | IResourceEditorInput, insertFirst = true): void { this.ensureHistoryLoaded(this.history); - const historyInput = this.preferResourceEditorInput(input); + const historyInput = this.editorHelper.preferResourceEditorInput(editor); if (!historyInput) { return; } @@ -934,20 +663,20 @@ export class HistoryService extends Disposable implements IHistoryService { // Respect max entries setting if (this.history.length > HistoryService.MAX_HISTORY_ITEMS) { - this.clearOnEditorDispose(this.history.pop()!, this.editorHistoryListeners); + this.editorHelper.clearOnEditorDispose(this.history.pop()!, this.editorHistoryListeners); } // React to editor input disposing if this is a typed editor if (isEditorInput(historyInput)) { - this.onEditorDispose(historyInput, () => this.updateHistoryOnEditorDispose(historyInput), this.editorHistoryListeners); + this.editorHelper.onEditorDispose(historyInput, () => this.updateHistoryOnEditorDispose(historyInput), this.editorHistoryListeners); } } - private updateHistoryOnEditorDispose(historyInput: EditorInput): void { + private updateHistoryOnEditorDispose(editor: EditorInput): void { // Any non side-by-side editor input gets removed directly on dispose - if (!isSideBySideEditorInput(historyInput)) { - this.removeFromHistory(historyInput); + if (!isSideBySideEditorInput(editor)) { + this.removeFromHistory(editor); } // Side-by-side editors get special treatment: we try to distill the @@ -955,9 +684,9 @@ export class HistoryService extends Disposable implements IHistoryService { // offer these entries from the history to the user still. else { const resourceInputs: IResourceEditorInput[] = []; - const sideInputs = historyInput.primary.matches(historyInput.secondary) ? [historyInput.primary] : [historyInput.primary, historyInput.secondary]; + const sideInputs = editor.primary.matches(editor.secondary) ? [editor.primary] : [editor.primary, editor.secondary]; for (const sideInput of sideInputs) { - const candidateResourceInput = this.preferResourceEditorInput(sideInput); + const candidateResourceInput = this.editorHelper.preferResourceEditorInput(sideInput); if (isResourceEditorInput(candidateResourceInput)) { resourceInputs.push(candidateResourceInput); } @@ -965,16 +694,16 @@ export class HistoryService extends Disposable implements IHistoryService { // Insert the untyped resource inputs where our disposed // side-by-side editor input is in the history stack - this.replaceInHistory(historyInput, ...resourceInputs); + this.replaceInHistory(editor, ...resourceInputs); } } - private includeInHistory(input: EditorInput | IResourceEditorInput): boolean { - if (isEditorInput(input)) { + private includeInHistory(editor: EditorInput | IResourceEditorInput): boolean { + if (isEditorInput(editor)) { return true; // include any non files } - return !this.resourceExcludeMatcher.value.matches(input.resource); + return !this.resourceExcludeMatcher.value.matches(editor.resource); } private removeExcludedFromHistory(): void { @@ -985,7 +714,7 @@ export class HistoryService extends Disposable implements IHistoryService { // Cleanup any listeners associated with the input when removing from history if (!include) { - this.clearOnEditorDispose(entry, this.editorHistoryListeners); + this.editorHelper.clearOnEditorDispose(entry, this.editorHistoryListeners); } return include; @@ -993,9 +722,11 @@ export class HistoryService extends Disposable implements IHistoryService { } private moveInHistory(event: FileOperationEvent): void { - const removed = this.removeFromHistory(event); - if (removed && event.target) { - this.addToHistory({ resource: event.target.resource }); + if (event.isOperation(FileOperation.MOVE)) { + const removed = this.removeFromHistory(event); + if (removed) { + this.addToHistory({ resource: event.target.resource }); + } } } @@ -1005,11 +736,11 @@ export class HistoryService extends Disposable implements IHistoryService { this.ensureHistoryLoaded(this.history); this.history = this.history.filter(entry => { - const matches = this.matches(arg1, entry); + const matches = this.editorHelper.matchesEditor(arg1, entry); // Cleanup any listeners associated with the input when removing from history if (matches) { - this.clearOnEditorDispose(arg1, this.editorHistoryListeners); + this.editorHelper.clearOnEditorDispose(arg1, this.editorHistoryListeners); removed = true; } @@ -1028,10 +759,10 @@ export class HistoryService extends Disposable implements IHistoryService { for (const entry of this.history) { // Entry matches and is going to be disposed + replaced - if (this.matches(editor, entry)) { + if (this.editorHelper.matchesEditor(editor, entry)) { // Cleanup any listeners associated with the input when replacing from history - this.clearOnEditorDispose(editor, this.editorHistoryListeners); + this.editorHelper.clearOnEditorDispose(editor, this.editorHistoryListeners); // Insert replacements but only once if (!replaced) { @@ -1042,7 +773,7 @@ export class HistoryService extends Disposable implements IHistoryService { // Entry does not match, but only add it if it didn't match // our replacements already - else if (!replacements.some(replacement => this.matches(replacement, entry))) { + else if (!replacements.some(replacement => this.editorHelper.matchesEditor(replacement, entry))) { newHistory.push(entry); } } @@ -1059,7 +790,9 @@ export class HistoryService extends Disposable implements IHistoryService { clearRecentlyOpened(): void { this.history = []; - this.editorHistoryListeners.forEach(listeners => dispose(listeners)); + for (const [, disposable] of this.editorHistoryListeners) { + dispose(disposable); + } this.editorHistoryListeners.clear(); } @@ -1209,7 +942,7 @@ export class HistoryService extends Disposable implements IHistoryService { } } - // fallback to first workspace matching scheme filter if any + // Fallback to first workspace matching scheme filter if any for (const folder of folders) { const resource = folder.uri; if (!schemeFilter || resource.scheme === schemeFilter) { @@ -1238,107 +971,713 @@ export class HistoryService extends Disposable implements IHistoryService { } //#endregion +} - //#region Editor Most Recently Used History +registerSingleton(IHistoryService, HistoryService); - private recentlyUsedEditorsStack: readonly IEditorIdentifier[] | undefined = undefined; - private recentlyUsedEditorsStackIndex = 0; +class EditorSelectionState { - private recentlyUsedEditorsInGroupStack: readonly IEditorIdentifier[] | undefined = undefined; - private recentlyUsedEditorsInGroupStackIndex = 0; + constructor( + private readonly editorIdentifier: IEditorIdentifier, + readonly selection: IEditorPaneSelection | undefined, + private readonly reason: EditorPaneSelectionChangeReason | undefined + ) { } - private navigatingInRecentlyUsedEditorsStack = false; - private navigatingInRecentlyUsedEditorsInGroupStack = false; + justifiesNewNavigationEntry(other: EditorSelectionState): boolean { + if (this.editorIdentifier.groupId !== other.editorIdentifier.groupId) { + return true; // different group + } - openNextRecentlyUsedEditor(groupId?: GroupIdentifier): void { - const [stack, index] = this.ensureRecentlyUsedStack(index => index - 1, groupId); + if (!this.editorIdentifier.editor.matches(other.editorIdentifier.editor)) { + return true; // different editor + } - this.doNavigateInRecentlyUsedEditorsStack(stack[index], groupId); + if (!this.selection || !other.selection) { + return true; // unknown selections + } + + const result = this.selection.compare(other.selection); + + if (result !== EditorPaneSelectionCompareResult.IDENTICAL && other.reason === EditorPaneSelectionChangeReason.NAVIGATION) { + // let navigation sources win even if the selection is `SIMILAR` + // (e.g. "Go to definition" should add a history entry) + return true; + } + + return result === EditorPaneSelectionCompareResult.DIFFERENT; + } +} + +interface IEditorNavigationStackEntry { + groupId: GroupIdentifier; + editor: EditorInput | IResourceEditorInput; + selection?: IEditorPaneSelection; +} + +export class EditorNavigationStack extends Disposable { + + private static readonly MAX_STACK_SIZE = 50; + + private readonly _onDidChange = this._register(new Emitter()); + readonly onDidChange = this._onDidChange.event; + + private readonly mapEditorToDisposable = new Map(); + private readonly mapGroupToDisposable = new Map(); + + private readonly editorHelper = this.instantiationService.createInstance(EditorHelper); + + private stack: IEditorNavigationStackEntry[] = []; + + private index = -1; + private previousIndex = -1; + + private navigating: boolean = false; + + private currentSelectionState: EditorSelectionState | undefined = undefined; + + private get current(): IEditorNavigationStackEntry | undefined { + return this.stack[this.index]; } - openPreviouslyUsedEditor(groupId?: GroupIdentifier): void { - const [stack, index] = this.ensureRecentlyUsedStack(index => index + 1, groupId); - - this.doNavigateInRecentlyUsedEditorsStack(stack[index], groupId); + private set current(entry: IEditorNavigationStackEntry | undefined) { + if (entry) { + this.stack[this.index] = entry; + } } - private async doNavigateInRecentlyUsedEditorsStack(editorIdentifier: IEditorIdentifier | undefined, groupId?: GroupIdentifier): Promise { - if (editorIdentifier) { - const acrossGroups = typeof groupId !== 'number' || !this.editorGroupService.getGroup(groupId); + get previous(): IEditorNavigationStackEntry | undefined { + return this.stack[this.index - 1]; + } - if (acrossGroups) { - this.navigatingInRecentlyUsedEditorsStack = true; + constructor( + private readonly kind: GoFilter, + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IEditorService private readonly editorService: IEditorService, + @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, + @ILogService private readonly logService: ILogService + ) { + super(); + + this.registerListeners(); + } + + private registerListeners(): void { + this._register(this.editorGroupService.onDidRemoveGroup(e => this.onDidRemoveGroup(e.id))); + this._register(this.onDidChange(() => this.traceStack())); + } + + private traceStack(): void { + if (this.logService.getLevel() !== LogLevel.Trace) { + return; + } + + let entryLabels: string[] = []; + for (const entry of this.stack) { + if (typeof entry.selection?.toString === 'function') { + entryLabels.push(`- group: ${entry.groupId}, editor: ${entry.editor.resource?.toString(true)}, selection: ${entry.selection.toString()}`); } else { - this.navigatingInRecentlyUsedEditorsInGroupStack = true; + entryLabels.push(`- group: ${entry.groupId}, editor: ${entry.editor.resource?.toString(true)}, selection: `); + } + } + + if (entryLabels.length === 0) { + this.trace(`onDidChange(index: ${this.index}, navigating: ${this.isNavigating()}): `); + } else { + this.trace(`onDidChange(index: ${this.index}, navigating: ${this.isNavigating()}): +${entryLabels.join('\n')} + `); + } + } + + private trace(msg: string, editor: EditorInput | IResourceEditorInput | undefined | null = null, event?: IEditorPaneSelectionChangeEvent): void { + if (this.logService.getLevel() !== LogLevel.Trace) { + return; + } + + let kindLabel: string; + switch (this.kind) { + case GoFilter.NONE: kindLabel = 'global'; + break; + case GoFilter.EDITS: kindLabel = 'edits'; + break; + case GoFilter.NAVIGATION: kindLabel = 'navigation'; + break; + } + + if (editor !== null) { + this.logService.trace(`[history stack ${kindLabel}]: ${msg} (editor: ${editor?.resource?.toString(true)}, event: ${this.traceEvent(event)})`); + } else { + this.logService.trace(`[history stack ${kindLabel}]: ${msg}`); + } + } + + private traceEvent(event?: IEditorPaneSelectionChangeEvent): string { + if (!event) { + return ''; + } + + switch (event.reason) { + case EditorPaneSelectionChangeReason.EDIT: return 'edit'; + case EditorPaneSelectionChangeReason.NAVIGATION: return 'navigation'; + case EditorPaneSelectionChangeReason.PROGRAMMATIC: return 'programmatic'; + case EditorPaneSelectionChangeReason.USER: return 'user'; + } + } + + private registerGroupListeners(groupId: GroupIdentifier): void { + if (!this.mapGroupToDisposable.has(groupId)) { + const group = this.editorGroupService.getGroup(groupId); + if (group) { + this.mapGroupToDisposable.set(groupId, group.onWillMoveEditor(e => this.onWillMoveEditor(e))); + } + } + } + + private onDidRemoveGroup(groupId: GroupIdentifier): void { + this.trace(`onDidRemoveGroup(): ${groupId}`); + + // Remove from stack + this.remove(groupId); + + // Clear group listener + this.mapGroupToDisposable.get(groupId)?.dispose(); + this.mapGroupToDisposable.delete(groupId); + } + + private onWillMoveEditor(e: IEditorWillMoveEvent): void { + this.trace('onWillMoveEditor()', e.editor); + + for (const entry of this.stack) { + if (entry.groupId !== e.groupId) { + continue; // not in the group that reported the event } - const group = this.editorGroupService.getGroup(editorIdentifier.groupId) ?? this.editorGroupService.activeGroup; - try { - await group.openEditor(editorIdentifier.editor); - } finally { - if (acrossGroups) { - this.navigatingInRecentlyUsedEditorsStack = false; - } else { - this.navigatingInRecentlyUsedEditorsInGroupStack = false; + if (!this.editorHelper.matchesEditor(e.editor, entry.editor)) { + continue; // not the editor this event is about + } + + // Update to target group + entry.groupId = e.target; + } + } + + //#region Stack Mutation + + notifyNavigation(editorPane: IEditorPane | undefined, event?: IEditorPaneSelectionChangeEvent): void { + this.trace('notifyNavigation()', editorPane?.input, event); + + const isSelectionAwareEditorPane = isEditorPaneWithSelection(editorPane); + const hasValidEditor = editorPane?.group && editorPane.input && !editorPane.input.isDisposed(); + + // Treat editor changes that happen as part of stack navigation specially + // we do not want to add a new stack entry as a matter of navigating the + // stack but we need to keep our currentEditorSelectionState up to date + // with the navigtion that occurs. + if (this.navigating) { + this.trace(`notifyNavigation() ignoring (navigating)`, editorPane?.input, event); + + if (isSelectionAwareEditorPane && hasValidEditor) { + this.trace('notifyNavigation() updating current selection state', editorPane?.input, event); + + this.currentSelectionState = new EditorSelectionState({ groupId: editorPane.group.id, editor: editorPane.input }, editorPane.getSelection(), event?.reason); + } else { + this.trace('notifyNavigation() dropping current selection state', editorPane?.input, event); + + this.currentSelectionState = undefined; // we navigated to a non-selection aware or disposed editor + } + } + + // Normal navigation not part of stack navigation + else { + + // Navigation inside selection aware editor + if (isSelectionAwareEditorPane && hasValidEditor) { + this.onSelectionAwareEditorNavigation(editorPane.group.id, editorPane.input, editorPane.getSelection(), event); + } + + // Navigation to non-selection aware or disposed editor + else { + this.currentSelectionState = undefined; // at this time we have no active selection aware editor + + if (hasValidEditor) { + this.onNonSelectionAwareEditorNavigation(editorPane.group.id, editorPane.input); } } } } - private ensureRecentlyUsedStack(indexModifier: (index: number) => number, groupId?: GroupIdentifier): [readonly IEditorIdentifier[], number] { - let editors: readonly IEditorIdentifier[]; - let index: number; - - const group = typeof groupId === 'number' ? this.editorGroupService.getGroup(groupId) : undefined; - - // Across groups - if (!group) { - editors = this.recentlyUsedEditorsStack || this.editorService.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); - index = this.recentlyUsedEditorsStackIndex; + private onSelectionAwareEditorNavigation(groupId: GroupIdentifier, editor: EditorInput, selection: IEditorPaneSelection | undefined, event?: IEditorPaneSelectionChangeEvent): void { + if (this.current?.groupId === groupId && !selection && this.editorHelper.matchesEditor(this.current.editor, editor)) { + return; // do not push same editor input again of same group if we have no valid selection } - // Within group + this.trace('onSelectionAwareEditorNavigation()', editor, event); + + const stateCandidate = new EditorSelectionState({ groupId, editor }, selection, event?.reason); + + // Add to stack if we dont have a current state or this new state justifies a push + if (!this.currentSelectionState || this.currentSelectionState.justifiesNewNavigationEntry(stateCandidate)) { + this.doAdd(groupId, editor, stateCandidate.selection); + } + + // Otherwise we replace the current stack entry with this one else { - editors = this.recentlyUsedEditorsInGroupStack || group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).map(editor => ({ groupId: group.id, editor })); - index = this.recentlyUsedEditorsInGroupStackIndex; + this.doReplace(groupId, editor, stateCandidate.selection); } - // Adjust index - let newIndex = indexModifier(index); - if (newIndex < 0) { - newIndex = 0; - } else if (newIndex > editors.length - 1) { - newIndex = editors.length - 1; - } - - // Remember index and editors - if (!group) { - this.recentlyUsedEditorsStack = editors; - this.recentlyUsedEditorsStackIndex = newIndex; - } else { - this.recentlyUsedEditorsInGroupStack = editors; - this.recentlyUsedEditorsInGroupStackIndex = newIndex; - } - - return [editors, newIndex]; + // Update our current navigation editor state + this.currentSelectionState = stateCandidate; } - private handleEditorEventInRecentEditorsStack(): void { - - // Drop all-editors stack unless navigating in all editors - if (!this.navigatingInRecentlyUsedEditorsStack) { - this.recentlyUsedEditorsStack = undefined; - this.recentlyUsedEditorsStackIndex = 0; + private onNonSelectionAwareEditorNavigation(groupId: GroupIdentifier, editor: EditorInput): void { + if (this.current?.groupId === groupId && this.editorHelper.matchesEditor(this.current.editor, editor)) { + return; // do not push same editor input again of same group } - // Drop in-group-editors stack unless navigating in group - if (!this.navigatingInRecentlyUsedEditorsInGroupStack) { - this.recentlyUsedEditorsInGroupStack = undefined; - this.recentlyUsedEditorsInGroupStackIndex = 0; + this.trace('onNonSelectionAwareEditorNavigation()', editor); + + this.doAdd(groupId, editor); + } + + private doAdd(groupId: GroupIdentifier, editor: EditorInput | IResourceEditorInput, selection?: IEditorPaneSelection): void { + if (!this.navigating) { + this.addOrReplace(groupId, editor, selection); } } + private doReplace(groupId: GroupIdentifier, editor: EditorInput | IResourceEditorInput, selection?: IEditorPaneSelection): void { + if (!this.navigating) { + this.addOrReplace(groupId, editor, selection, true /* force replace */); + } + } + + addOrReplace(groupId: GroupIdentifier, editorCandidate: EditorInput | IResourceEditorInput, selection?: IEditorPaneSelection, forceReplace?: boolean): void { + + // Ensure we listen to changes in group + this.registerGroupListeners(groupId); + + // Check whether to replace an existing entry or not + let replace = false; + if (this.current) { + if (forceReplace) { + replace = true; // replace if we are forced to + } else if (this.shouldReplaceStackEntry(this.current, { groupId, editor: editorCandidate, selection })) { + replace = true; // replace if the group & input is the same and selection indicates as such + } + } + + const editor = this.editorHelper.preferResourceEditorInput(editorCandidate); + if (!editor) { + return; + } + + if (replace) { + this.trace('replace()', editor); + } else { + this.trace('add()', editor); + } + + const newStackEntry: IEditorNavigationStackEntry = { groupId, editor, selection }; + + // Replace at current position + let removedEntries: IEditorNavigationStackEntry[] = []; + if (replace) { + if (this.current) { + removedEntries.push(this.current); + } + this.current = newStackEntry; + } + + // Add to stack at current position + else { + + // If we are not at the end of history, we remove anything after + if (this.stack.length > this.index + 1) { + for (let i = this.index + 1; i < this.stack.length; i++) { + removedEntries.push(this.stack[i]); + } + + this.stack = this.stack.slice(0, this.index + 1); + } + + // Insert entry at index + this.stack.splice(this.index + 1, 0, newStackEntry); + + // Check for limit + if (this.stack.length > EditorNavigationStack.MAX_STACK_SIZE) { + removedEntries.push(this.stack.shift()!); // remove first + if (this.previousIndex >= 0) { + this.previousIndex--; + } + } else { + this.setIndex(this.index + 1, true /* skip event, we fire it later */); + } + } + + // Clear editor listeners from removed entries + for (const removedEntry of removedEntries) { + this.editorHelper.clearOnEditorDispose(removedEntry.editor, this.mapEditorToDisposable); + } + + // Remove this from the stack unless the stack input is a resource + // that can easily be restored even when the input gets disposed + if (isEditorInput(editor)) { + this.editorHelper.onEditorDispose(editor, () => this.remove(editor), this.mapEditorToDisposable); + } + + // Event + this._onDidChange.fire(); + } + + private shouldReplaceStackEntry(entry: IEditorNavigationStackEntry, candidate: IEditorNavigationStackEntry): boolean { + if (entry.groupId !== candidate.groupId) { + return false; // different group + } + + if (!this.editorHelper.matchesEditor(entry.editor, candidate.editor)) { + return false; // different editor + } + + if (!entry.selection) { + return true; // always replace when we have no specific selection yet + } + + if (!candidate.selection) { + return false; // otherwise, prefer to keep existing specific selection over new unspecific one + } + + // Finally, replace when selections are considered identical + return entry.selection.compare(candidate.selection) === EditorPaneSelectionCompareResult.IDENTICAL; + } + + move(event: FileOperationEvent): void { + if (event.isOperation(FileOperation.MOVE)) { + for (const entry of this.stack) { + if (this.editorHelper.matchesEditor(event, entry.editor)) { + entry.editor = { resource: event.target.resource }; + } + } + } + } + + remove(arg1: EditorInput | FileChangesEvent | FileOperationEvent | GroupIdentifier): void { + + // Remove all stack entries that match `arg1` + this.stack = this.stack.filter(entry => { + const matches = typeof arg1 === 'number' ? entry.groupId === arg1 : this.editorHelper.matchesEditor(arg1, entry.editor); + + // Cleanup any listeners associated with the input when removing + if (matches) { + this.editorHelper.clearOnEditorDispose(entry.editor, this.mapEditorToDisposable); + } + + return !matches; + }); + + // Given we just removed entries, we need to make sure + // to remove entries that are now identical and next + // to each other to prevent no-op navigations. + this.flatten(); + + // Reset indeces + this.index = this.stack.length - 1; + this.previousIndex = -1; + + // Event + this._onDidChange.fire(); + } + + private flatten(): void { + const flattenedStack: IEditorNavigationStackEntry[] = []; + + let previousEntry: IEditorNavigationStackEntry | undefined = undefined; + for (const entry of this.stack) { + if (previousEntry && this.shouldReplaceStackEntry(entry, previousEntry)) { + continue; // skip over entry when it is considered the same + } + + previousEntry = entry; + flattenedStack.push(entry); + } + + this.stack = flattenedStack; + } + + clear(): void { + this.index = -1; + this.previousIndex = -1; + this.stack.splice(0); + + for (const [, disposable] of this.mapEditorToDisposable) { + dispose(disposable); + } + this.mapEditorToDisposable.clear(); + + for (const [, disposable] of this.mapGroupToDisposable) { + dispose(disposable); + } + this.mapGroupToDisposable.clear(); + } + + override dispose(): void { + super.dispose(); + + this.clear(); + } + + //#endregion + + //#region Navigation + + canGoForward(): boolean { + return this.stack.length > this.index + 1; + } + + async goForward(): Promise { + if (!this.canGoForward()) { + return; + } + + this.setIndex(this.index + 1); + return this.navigate(); + } + + canGoBack(): boolean { + return this.index > 0; + } + + async goBack(): Promise { + if (!this.canGoBack()) { + return; + } + + this.setIndex(this.index - 1); + return this.navigate(); + } + + goPrevious(): Promise { + + // If we never navigated, just go back + if (this.previousIndex === -1) { + return this.goBack(); + } + + // Otherwise jump to previous stack entry + this.setIndex(this.previousIndex); + return this.navigate(); + } + + canGoLast(): boolean { + return this.stack.length > 0; + } + + async goLast(): Promise { + if (!this.canGoLast()) { + return; + } + + this.setIndex(this.stack.length - 1); + return this.navigate(); + } + + private setIndex(newIndex: number, skipEvent?: boolean): void { + this.previousIndex = this.index; + this.index = newIndex; + + // Event + if (!skipEvent) { + this._onDidChange.fire(); + } + } + + private async navigate(): Promise { + this.navigating = true; + + try { + if (this.current) { + await this.doNavigate(this.current); + } + } finally { + this.navigating = false; + } + } + + private doNavigate(location: IEditorNavigationStackEntry): Promise { + let options: IEditorOptions = Object.create(null); + + // Apply selection if any + if (location.selection) { + options = location.selection.restore(options); + } + + if (isEditorInput(location.editor)) { + return this.editorService.openEditor(location.editor, options, location.groupId); + } + + return this.editorService.openEditor({ + ...location.editor, + options: { + ...location.editor.options, + ...options + } + }, location.groupId); + } + + isNavigating(): boolean { + return this.navigating; + } + //#endregion } -registerSingleton(IHistoryService, HistoryService); +class EditorHelper { + + constructor( + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + @ILifecycleService private readonly lifecycleService: ILifecycleService, + @IFileService private readonly fileService: IFileService, + @IPathService private readonly pathService: IPathService + ) { } + + preferResourceEditorInput(editor: EditorInput): EditorInput | IResourceEditorInput; + preferResourceEditorInput(editor: IResourceEditorInput): IResourceEditorInput | undefined; + preferResourceEditorInput(editor: EditorInput | IResourceEditorInput): EditorInput | IResourceEditorInput | undefined; + preferResourceEditorInput(editor: EditorInput | IResourceEditorInput): EditorInput | IResourceEditorInput | undefined { + const resource = EditorResourceAccessor.getOriginalUri(editor); + + // For now, only prefer well known schemes that we control to prevent + // issues such as https://github.com/microsoft/vscode/issues/85204 + // from being used as resource inputs + // resource inputs survive editor disposal and as such are a lot more + // durable across editor changes and restarts + const hasValidResourceEditorInputScheme = + resource?.scheme === Schemas.file || + resource?.scheme === Schemas.vscodeRemote || + resource?.scheme === Schemas.userData || + resource?.scheme === this.pathService.defaultUriScheme; + + // Scheme is valid: prefer the untyped input + // over the typed input if possible to keep + // the entry across restarts + if (hasValidResourceEditorInputScheme) { + if (isEditorInput(editor)) { + const untypedInput = editor.toUntyped(); + if (isResourceEditorInput(untypedInput)) { + return untypedInput; + } + } + + return editor; + } + + // Scheme is invalid: allow the editor input + // for as long as it is not disposed + else { + return isEditorInput(editor) ? editor : undefined; + } + } + + matchesEditor(arg1: EditorInput | IResourceEditorInput | FileChangesEvent | FileOperationEvent, inputB: EditorInput | IResourceEditorInput): boolean { + if (arg1 instanceof FileChangesEvent || arg1 instanceof FileOperationEvent) { + if (isEditorInput(inputB)) { + return false; // we only support this for `IResourceEditorInputs` that are file based + } + + if (arg1 instanceof FileChangesEvent) { + return arg1.contains(inputB.resource, FileChangeType.DELETED); + } + + return this.matchesFile(inputB.resource, arg1); + } + + if (isEditorInput(arg1)) { + if (isEditorInput(inputB)) { + return arg1.matches(inputB); + } + + return this.matchesFile(inputB.resource, arg1); + } + + if (isEditorInput(inputB)) { + return this.matchesFile(arg1.resource, inputB); + } + + return arg1 && inputB && this.uriIdentityService.extUri.isEqual(arg1.resource, inputB.resource); + } + + matchesFile(resource: URI, arg2: EditorInput | IResourceEditorInput | FileChangesEvent | FileOperationEvent): boolean { + if (arg2 instanceof FileChangesEvent) { + return arg2.contains(resource, FileChangeType.DELETED); + } + + if (arg2 instanceof FileOperationEvent) { + return this.uriIdentityService.extUri.isEqualOrParent(resource, arg2.resource); + } + + if (isEditorInput(arg2)) { + const inputResource = arg2.resource; + if (!inputResource) { + return false; + } + + if (this.lifecycleService.phase >= LifecyclePhase.Restored && !this.fileService.hasProvider(inputResource)) { + return false; // make sure to only check this when workbench has restored (for https://github.com/microsoft/vscode/issues/48275) + } + + return this.uriIdentityService.extUri.isEqual(inputResource, resource); + } + + return this.uriIdentityService.extUri.isEqual(arg2?.resource, resource); + } + + matchesEditorIdentifier(identifier: IEditorIdentifier, editorPane?: IEditorPane): boolean { + if (!editorPane?.group) { + return false; + } + + if (identifier.groupId !== editorPane.group.id) { + return false; + } + + return editorPane.input ? identifier.editor.matches(editorPane.input) : false; + } + + onEditorDispose(editor: EditorInput, listener: Function, mapEditorToDispose: Map): void { + const toDispose = Event.once(editor.onWillDispose)(() => listener()); + + let disposables = mapEditorToDispose.get(editor); + if (!disposables) { + disposables = new DisposableStore(); + mapEditorToDispose.set(editor, disposables); + } + + disposables.add(toDispose); + } + + clearOnEditorDispose(editor: EditorInput | IResourceEditorInput | FileChangesEvent | FileOperationEvent, mapEditorToDispose: Map): void { + if (!isEditorInput(editor)) { + return; // only supported when passing in an actual editor input + } + + const disposables = mapEditorToDispose.get(editor); + if (disposables) { + dispose(disposables); + mapEditorToDispose.delete(editor); + } + } +} + +interface ISerializedEditorHistoryEntry { + editor: IResourceEditorInput; +} + +interface IRecentlyClosedEditor { + editorId: string | undefined; + editor: IUntypedEditorInput; + + resource: URI | undefined; + associatedResources: URI[]; + + index: number; + sticky: boolean; +} diff --git a/src/vs/workbench/services/history/common/history.ts b/src/vs/workbench/services/history/common/history.ts index 5220300499c..a20b09309a0 100644 --- a/src/vs/workbench/services/history/common/history.ts +++ b/src/vs/workbench/services/history/common/history.ts @@ -11,44 +11,62 @@ import { URI } from 'vs/base/common/uri'; export const IHistoryService = createDecorator('historyService'); +/** + * Limit editor navigation to certain kinds. + */ +export const enum GoFilter { + + /** + * Navigate between editor navigation history + * entries from any kind of navigation source. + */ + NONE = 0, + + /** + * Only navigate between editor navigation history + * entries that were resulting from edits. + */ + EDITS = 1, + + /** + * Only navigate between editor navigation history + * entries that were resulting from navigations, such + * as "Go to definition". + */ + NAVIGATION = 2 +} + export interface IHistoryService { readonly _serviceBrand: undefined; + /** + * Navigate forwards in editor navigation history. + */ + goForward(filter?: GoFilter): Promise; + + /** + * Navigate backwards in editor navigation history. + */ + goBack(filter?: GoFilter): Promise; + + /** + * Navigate between the current editor navigtion history entry + * and the previous one that was navigated to. This commands is + * like a toggle for `forward` and `back` to jump between 2 points + * in editor navigation history. + */ + goPrevious(filter?: GoFilter): Promise; + + /** + * Navigate to the last entry in editor navigation history. + */ + goLast(filter?: GoFilter): Promise; + /** * Re-opens the last closed editor if any. */ - reopenLastClosedEditor(): void; - - /** - * Navigates to the last location where an edit happened. - */ - openLastEditLocation(): void; - - /** - * Navigate forwards in history. - */ - forward(): void; - - /** - * Navigate backwards in history. - */ - back(): void; - - /** - * Navigate forward or backwards to previous entry in history. - */ - last(): void; - - /** - * Clears all history. - */ - clear(): void; - - /** - * Clear list of recently opened editors. - */ - clearRecentlyOpened(): void; + reopenLastClosedEditor(): Promise; /** * Get the entire history of editors that were opened. @@ -80,12 +98,22 @@ export interface IHistoryService { * * @param group optional indicator to scope to a specific group. */ - openNextRecentlyUsedEditor(group?: GroupIdentifier): void; + openNextRecentlyUsedEditor(group?: GroupIdentifier): Promise; /** * Opens the previously used editor if any. * * @param group optional indicator to scope to a specific group. */ - openPreviouslyUsedEditor(group?: GroupIdentifier): void; + openPreviouslyUsedEditor(group?: GroupIdentifier): Promise; + + /** + * Clears all history. + */ + clear(): void; + + /** + * Clear list of recently opened editors. + */ + clearRecentlyOpened(): void; } diff --git a/src/vs/workbench/services/history/test/browser/history.test.ts b/src/vs/workbench/services/history/test/browser/history.test.ts deleted file mode 100644 index ad49859d2e7..00000000000 --- a/src/vs/workbench/services/history/test/browser/history.test.ts +++ /dev/null @@ -1,244 +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 * as assert from 'assert'; -import { URI } from 'vs/base/common/uri'; -import { workbenchInstantiationService, TestFileEditorInput, registerTestEditor, createEditorPart } from 'vs/workbench/test/browser/workbenchTestServices'; -import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; -import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { IEditorGroupsService, GroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { HistoryService } from 'vs/workbench/services/history/browser/history'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; -import { DisposableStore } from 'vs/base/common/lifecycle'; -import { IHistoryService } from 'vs/workbench/services/history/common/history'; -import { timeout } from 'vs/base/common/async'; -import { Event } from 'vs/base/common/event'; -import { isResourceEditorInput, IUntypedEditorInput } from 'vs/workbench/common/editor'; -import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; -import { EditorInput } from 'vs/workbench/common/editor/editorInput'; - -suite('HistoryService', function () { - - const TEST_EDITOR_ID = 'MyTestEditorForEditorHistory'; - const TEST_EDITOR_INPUT_ID = 'testEditorInputForHistoyService'; - - async function createServices(): Promise<[EditorPart, HistoryService, EditorService]> { - const instantiationService = workbenchInstantiationService(undefined, disposables); - - const part = await createEditorPart(instantiationService, disposables); - instantiationService.stub(IEditorGroupsService, part); - - const editorService = instantiationService.createInstance(EditorService); - instantiationService.stub(IEditorService, editorService); - - const historyService = instantiationService.createInstance(HistoryService); - instantiationService.stub(IHistoryService, historyService); - - return [part, historyService, editorService]; - } - - const disposables = new DisposableStore(); - - setup(() => { - disposables.add(registerTestEditor(TEST_EDITOR_ID, [new SyncDescriptor(TestFileEditorInput)])); - }); - - teardown(() => { - disposables.clear(); - }); - - test('back / forward', async () => { - const [part, historyService, editorService] = await createServices(); - - const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); - await part.activeGroup.openEditor(input1, { pinned: true }); - assert.strictEqual(part.activeGroup.activeEditor, input1); - - const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); - await part.activeGroup.openEditor(input2, { pinned: true }); - assert.strictEqual(part.activeGroup.activeEditor, input2); - - let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.back(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input1); - - editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.forward(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input2); - }); - - test('back / forward works across groups', async () => { - const [part, historyService, editorService] = await createServices(); - - const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); - const input1Group = (await part.activeGroup.openEditor(input1, { pinned: true }))?.group; - - const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); - const input2Group = (await part.sideGroup.openEditor(input2, { pinned: true }))?.group; - - let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.back(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input1); - assert.strictEqual(part.activeGroup, input1Group); - - editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.forward(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input2); - assert.strictEqual(part.activeGroup, input2Group); - }); - - test('getHistory', async () => { - - class TestFileEditorInputWithUntyped extends TestFileEditorInput { - - override toUntyped(): IUntypedEditorInput { - return { - resource: this.resource, - options: { - override: 'testOverride' - } - }; - } - } - - const [part, historyService] = await createServices(); - - let history = historyService.getHistory(); - assert.strictEqual(history.length, 0); - - const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); - await part.activeGroup.openEditor(input1, { pinned: true }); - - const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); - await part.activeGroup.openEditor(input2, { pinned: true }); - - const input3 = new TestFileEditorInputWithUntyped(URI.parse('foo://bar3'), TEST_EDITOR_INPUT_ID); - await part.activeGroup.openEditor(input3, { pinned: true }); - - const input4 = new TestFileEditorInputWithUntyped(URI.file('bar4'), TEST_EDITOR_INPUT_ID); - await part.activeGroup.openEditor(input4, { pinned: true }); - - history = historyService.getHistory(); - assert.strictEqual(history.length, 4); - - // first entry is untyped because it implements `toUntyped` and has a supported scheme - assert.strictEqual(isResourceEditorInput(history[0]) && !(history[0] instanceof EditorInput), true); - assert.strictEqual((history[0] as IResourceEditorInput).options?.override, 'testOverride'); - // second entry is not untyped even though it implements `toUntyped` but has unsupported scheme - assert.strictEqual(history[1] instanceof EditorInput, true); - assert.strictEqual(history[2] instanceof EditorInput, true); - assert.strictEqual(history[3] instanceof EditorInput, true); - - historyService.removeFromHistory(input2); - history = historyService.getHistory(); - assert.strictEqual(history.length, 3); - assert.strictEqual(history[0].resource?.toString(), input4.resource.toString()); - }); - - test('getLastActiveFile', async () => { - const [part, historyService] = await createServices(); - - assert.ok(!historyService.getLastActiveFile('foo')); - - const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); - await part.activeGroup.openEditor(input1, { pinned: true }); - - assert.strictEqual(historyService.getLastActiveFile('foo')?.toString(), input1.resource.toString()); - }); - - test('open next/previous recently used editor (single group)', async () => { - const [part, historyService, editorService] = await createServices(); - - const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); - const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); - - await part.activeGroup.openEditor(input1, { pinned: true }); - assert.strictEqual(part.activeGroup.activeEditor, input1); - - await part.activeGroup.openEditor(input2, { pinned: true }); - assert.strictEqual(part.activeGroup.activeEditor, input2); - - let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openPreviouslyUsedEditor(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input1); - - editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openNextRecentlyUsedEditor(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input2); - - editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openPreviouslyUsedEditor(part.activeGroup.id); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input1); - - editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openNextRecentlyUsedEditor(part.activeGroup.id); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input2); - }); - - test('open next/previous recently used editor (multi group)', async () => { - const [part, historyService, editorService] = await createServices(); - const rootGroup = part.activeGroup; - - const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); - const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); - - const sideGroup = part.addGroup(rootGroup, GroupDirection.RIGHT); - - await rootGroup.openEditor(input1, { pinned: true }); - await sideGroup.openEditor(input2, { pinned: true }); - - let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openPreviouslyUsedEditor(); - await editorChangePromise; - assert.strictEqual(part.activeGroup, rootGroup); - assert.strictEqual(rootGroup.activeEditor, input1); - - editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openNextRecentlyUsedEditor(); - await editorChangePromise; - assert.strictEqual(part.activeGroup, sideGroup); - assert.strictEqual(sideGroup.activeEditor, input2); - }); - - test('open next/previous recently is reset when other input opens', async () => { - const [part, historyService, editorService] = await createServices(); - - const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); - const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); - const input3 = new TestFileEditorInput(URI.parse('foo://bar3'), TEST_EDITOR_INPUT_ID); - const input4 = new TestFileEditorInput(URI.parse('foo://bar4'), TEST_EDITOR_INPUT_ID); - - await part.activeGroup.openEditor(input1, { pinned: true }); - await part.activeGroup.openEditor(input2, { pinned: true }); - await part.activeGroup.openEditor(input3, { pinned: true }); - - let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openPreviouslyUsedEditor(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input2); - - await timeout(0); - await part.activeGroup.openEditor(input4, { pinned: true }); - - editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openPreviouslyUsedEditor(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input2); - - editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); - historyService.openNextRecentlyUsedEditor(); - await editorChangePromise; - assert.strictEqual(part.activeGroup.activeEditor, input4); - }); -}); diff --git a/src/vs/workbench/services/history/test/browser/historyService.test.ts b/src/vs/workbench/services/history/test/browser/historyService.test.ts new file mode 100644 index 00000000000..6c12303b850 --- /dev/null +++ b/src/vs/workbench/services/history/test/browser/historyService.test.ts @@ -0,0 +1,618 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { toResource } from 'vs/base/test/common/utils'; +import { URI } from 'vs/base/common/uri'; +import { workbenchInstantiationService, TestFileEditorInput, registerTestEditor, createEditorPart, registerTestFileEditor, TestServiceAccessor, TestTextFileEditor } from 'vs/workbench/test/browser/workbenchTestServices'; +import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; +import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; +import { IEditorGroupsService, GroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { EditorNavigationStack, HistoryService } from 'vs/workbench/services/history/browser/historyService'; +import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; +import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { GoFilter, IHistoryService } from 'vs/workbench/services/history/common/history'; +import { DeferredPromise, timeout } from 'vs/base/common/async'; +import { Event } from 'vs/base/common/event'; +import { EditorPaneSelectionChangeReason, isResourceEditorInput, IUntypedEditorInput } from 'vs/workbench/common/editor'; +import { IResourceEditorInput, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { EditorInput } from 'vs/workbench/common/editor/editorInput'; +import { IResolvedTextFileEditorModel, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { FileChangesEvent, FileChangeType, FileOperation, FileOperationEvent } from 'vs/platform/files/common/files'; +import { isLinux } from 'vs/base/common/platform'; +import { TextEditorPaneSelection } from 'vs/workbench/browser/parts/editor/textEditor'; +import { Selection } from 'vs/editor/common/core/selection'; +import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; + +suite('HistoryService', function () { + + const TEST_EDITOR_ID = 'MyTestEditorForEditorHistory'; + const TEST_EDITOR_INPUT_ID = 'testEditorInputForHistoyService'; + + async function createServices(): Promise<[EditorPart, HistoryService, EditorService, ITextFileService, IInstantiationService]> { + const instantiationService = workbenchInstantiationService(undefined, disposables); + + const part = await createEditorPart(instantiationService, disposables); + instantiationService.stub(IEditorGroupsService, part); + + const editorService = instantiationService.createInstance(EditorService); + instantiationService.stub(IEditorService, editorService); + + const historyService = instantiationService.createInstance(HistoryService); + instantiationService.stub(IHistoryService, historyService); + + const accessor = instantiationService.createInstance(TestServiceAccessor); + + return [part, historyService, editorService, accessor.textFileService, instantiationService]; + } + + const disposables = new DisposableStore(); + + setup(() => { + disposables.add(registerTestEditor(TEST_EDITOR_ID, [new SyncDescriptor(TestFileEditorInput)])); + disposables.add(registerTestFileEditor()); + }); + + teardown(() => { + disposables.clear(); + }); + + test('back / forward: basics', async () => { + const [part, historyService] = await createServices(); + + const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); + await part.activeGroup.openEditor(input1, { pinned: true }); + assert.strictEqual(part.activeGroup.activeEditor, input1); + + const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); + await part.activeGroup.openEditor(input2, { pinned: true }); + assert.strictEqual(part.activeGroup.activeEditor, input2); + + await historyService.goBack(); + assert.strictEqual(part.activeGroup.activeEditor, input1); + + await historyService.goForward(); + assert.strictEqual(part.activeGroup.activeEditor, input2); + }); + + test('back / forward: is editor group aware', async function () { + const [part, historyService, editorService] = await createServices(); + + const resource = toResource.call(this, '/path/index.txt'); + const otherResource = toResource.call(this, '/path/other.html'); + + const pane1 = await editorService.openEditor({ resource, options: { pinned: true } }); + const pane2 = await editorService.openEditor({ resource, options: { pinned: true } }, SIDE_GROUP); + + // [index.txt] | [>index.txt<] + + assert.notStrictEqual(pane1, pane2); + + await editorService.openEditor({ resource: otherResource, options: { pinned: true } }, pane2?.group); + + // [index.txt] | [index.txt] [>other.html<] + + await historyService.goBack(); + + // [index.txt] | [>index.txt<] [other.html] + + assert.strictEqual(part.activeGroup.id, pane2?.group?.id); + assert.strictEqual(part.activeGroup.activeEditor?.resource?.toString(), resource.toString()); + + await historyService.goBack(); + + // [>index.txt<] | [index.txt] [other.html] + + assert.strictEqual(part.activeGroup.id, pane1?.group?.id); + assert.strictEqual(part.activeGroup.activeEditor?.resource?.toString(), resource.toString()); + + await historyService.goForward(); + + // [index.txt] | [>index.txt<] [other.html] + + assert.strictEqual(part.activeGroup.id, pane2?.group?.id); + assert.strictEqual(part.activeGroup.activeEditor?.resource?.toString(), resource.toString()); + + await historyService.goForward(); + + // [index.txt] | [index.txt] [>other.html<] + + assert.strictEqual(part.activeGroup.id, pane2?.group?.id); + assert.strictEqual(part.activeGroup.activeEditor?.resource?.toString(), otherResource.toString()); + }); + + test('back / forward: in-editor text selection changes (user)', async function () { + const [, historyService, editorService] = await createServices(); + + const resource = toResource.call(this, '/path/index.txt'); + + const pane = await editorService.openEditor({ resource, options: { pinned: true } }) as TestTextFileEditor; + + await setTextSelection(historyService, pane, new Selection(1, 2, 1, 2)); + await setTextSelection(historyService, pane, new Selection(15, 1, 15, 1)); // will be merged and dropped + await setTextSelection(historyService, pane, new Selection(16, 1, 16, 1)); // will be merged and dropped + await setTextSelection(historyService, pane, new Selection(17, 1, 17, 1)); + await setTextSelection(historyService, pane, new Selection(30, 5, 30, 8)); + await setTextSelection(historyService, pane, new Selection(40, 1, 40, 1)); + + await historyService.goBack(GoFilter.NONE); + assertTextSelection(new Selection(30, 5, 30, 8), pane); + + await historyService.goBack(GoFilter.NONE); + assertTextSelection(new Selection(17, 1, 17, 1), pane); + + await historyService.goBack(GoFilter.NONE); + assertTextSelection(new Selection(1, 2, 1, 2), pane); + + await historyService.goForward(GoFilter.NONE); + assertTextSelection(new Selection(17, 1, 17, 1), pane); + }); + + test('back / forward: in-editor text selection changes (navigation)', async function () { + const [, historyService, editorService] = await createServices(); + + const resource = toResource.call(this, '/path/index.txt'); + + const pane = await editorService.openEditor({ resource, options: { pinned: true } }) as TestTextFileEditor; + + await setTextSelection(historyService, pane, new Selection(2, 2, 2, 10)); // this is our starting point + await setTextSelection(historyService, pane, new Selection(5, 3, 5, 20), EditorPaneSelectionChangeReason.NAVIGATION); // this is our first target definition + await setTextSelection(historyService, pane, new Selection(120, 8, 120, 18), EditorPaneSelectionChangeReason.NAVIGATION); // this is our second target definition + await setTextSelection(historyService, pane, new Selection(300, 3, 300, 20)); // unrelated user navigation + await setTextSelection(historyService, pane, new Selection(500, 3, 500, 20)); // unrelated user navigation + await setTextSelection(historyService, pane, new Selection(200, 3, 200, 20)); // unrelated user navigation + + await historyService.goLast(GoFilter.NAVIGATION); + assertTextSelection(new Selection(120, 8, 120, 18), pane); + + await historyService.goBack(GoFilter.NAVIGATION); + assertTextSelection(new Selection(5, 3, 5, 20), pane); + + await historyService.goBack(GoFilter.NAVIGATION); + assertTextSelection(new Selection(2, 2, 2, 10), pane); + + await historyService.goForward(GoFilter.NAVIGATION); + assertTextSelection(new Selection(5, 3, 5, 20), pane); + }); + + test('back / forward: edit selection changes', async function () { + const [, historyService, editorService] = await createServices(); + + const resource = toResource.call(this, '/path/index.txt'); + + const pane = await editorService.openEditor({ resource, options: { pinned: true } }) as TestTextFileEditor; + + await setTextSelection(historyService, pane, new Selection(2, 2, 2, 10)); + await setTextSelection(historyService, pane, new Selection(50, 3, 50, 20), EditorPaneSelectionChangeReason.EDIT); + await setTextSelection(historyService, pane, new Selection(300, 3, 300, 20)); // unrelated user navigation + await setTextSelection(historyService, pane, new Selection(500, 3, 500, 20)); // unrelated user navigation + await setTextSelection(historyService, pane, new Selection(200, 3, 200, 20)); // unrelated user navigation + await setTextSelection(historyService, pane, new Selection(5, 3, 5, 20), EditorPaneSelectionChangeReason.EDIT); + await setTextSelection(historyService, pane, new Selection(200, 3, 200, 20)); // unrelated user navigation + + await historyService.goLast(GoFilter.EDITS); + assertTextSelection(new Selection(5, 3, 5, 20), pane); + + await historyService.goBack(GoFilter.EDITS); + assertTextSelection(new Selection(50, 3, 50, 20), pane); + + await historyService.goForward(GoFilter.EDITS); + assertTextSelection(new Selection(5, 3, 5, 20), pane); + }); + + async function setTextSelection(historyService: IHistoryService, pane: TestTextFileEditor, selection: Selection, reason = EditorPaneSelectionChangeReason.USER): Promise { + const promise = Event.toPromise((historyService as HistoryService).onDidChangeEditorNavigationStack); + pane.setSelection(new TextEditorPaneSelection(selection), reason); + await promise; + } + + function assertTextSelection(expected: Selection, pane: EditorPane): void { + const options: ITextEditorOptions | undefined = pane.options; + if (!options) { + assert.fail('EditorPane has no selection'); + } + + assert.strictEqual(expected.startLineNumber, options.selection?.startLineNumber); + assert.strictEqual(expected.startColumn, options.selection?.startColumn); + assert.strictEqual(expected.endLineNumber, options.selection?.endLineNumber); + assert.strictEqual(expected.endColumn, options.selection?.endColumn); + } + + test('back / forward: tracks editor moves across groups', async function () { + const [part, historyService, editorService] = await createServices(); + + const resource1 = toResource.call(this, '/path/one.txt'); + const resource2 = toResource.call(this, '/path/two.html'); + + const pane1 = await editorService.openEditor({ resource: resource1, options: { pinned: true } }); + await editorService.openEditor({ resource: resource2, options: { pinned: true } }); + + // [one.txt] [>two.html<] + + const sideGroup = part.addGroup(part.activeGroup, GroupDirection.RIGHT); + + // [one.txt] [>two.html<] | + + let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + pane1?.group?.moveEditor(pane1.input!, sideGroup); + await editorChangePromise; + + // [one.txt] | [>two.html<] + + await historyService.goBack(); + + // [>one.txt<] | [two.html] + + assert.strictEqual(part.activeGroup.id, pane1?.group?.id); + assert.strictEqual(part.activeGroup.activeEditor?.resource?.toString(), resource1.toString()); + }); + + test('back / forward: tracks group removals', async function () { + const [part, historyService, editorService] = await createServices(); + + const resource1 = toResource.call(this, '/path/one.txt'); + const resource2 = toResource.call(this, '/path/two.html'); + + const pane1 = await editorService.openEditor({ resource: resource1, options: { pinned: true } }); + const pane2 = await editorService.openEditor({ resource: resource2, options: { pinned: true } }, SIDE_GROUP); + + // [one.txt] | [>two.html<] + + assert.notStrictEqual(pane1, pane2); + + await pane1?.group?.closeAllEditors(); + + // [>two.html<] + + await historyService.goBack(); + + // [>two.html<] + + assert.strictEqual(part.activeGroup.id, pane2?.group?.id); + assert.strictEqual(part.activeGroup.activeEditor?.resource?.toString(), resource2.toString()); + }); + + test('back / forward: editor navigation stack - navigation', async function () { + const [, , editorService, , instantiationService] = await createServices(); + + const stack = instantiationService.createInstance(EditorNavigationStack, GoFilter.NONE); + + const resource = toResource.call(this, '/path/index.txt'); + const otherResource = toResource.call(this, '/path/index.html'); + const pane = await editorService.openEditor({ resource, options: { pinned: true } }); + + let changed = false; + stack.onDidChange(() => changed = true); + + assert.strictEqual(stack.canGoBack(), false); + assert.strictEqual(stack.canGoForward(), false); + assert.strictEqual(stack.canGoLast(), false); + + // Opening our first editor emits change event + stack.notifyNavigation(pane, { reason: EditorPaneSelectionChangeReason.USER }); + assert.strictEqual(changed, true); + changed = false; + + assert.strictEqual(stack.canGoBack(), false); + assert.strictEqual(stack.canGoLast(), true); + + // Opening same editor is not treated as new history stop + stack.notifyNavigation(pane, { reason: EditorPaneSelectionChangeReason.USER }); + assert.strictEqual(stack.canGoBack(), false); + + // Opening different editor allows to go back + await editorService.openEditor({ resource: otherResource, options: { pinned: true } }); + + stack.notifyNavigation(pane, { reason: EditorPaneSelectionChangeReason.USER }); + assert.strictEqual(changed, true); + changed = false; + + assert.strictEqual(stack.canGoBack(), true); + + await stack.goBack(); + assert.strictEqual(stack.canGoBack(), false); + assert.strictEqual(stack.canGoForward(), true); + assert.strictEqual(stack.canGoLast(), true); + + await stack.goForward(); + assert.strictEqual(stack.canGoBack(), true); + assert.strictEqual(stack.canGoForward(), false); + + await stack.goPrevious(); + assert.strictEqual(stack.canGoBack(), false); + assert.strictEqual(stack.canGoForward(), true); + + await stack.goPrevious(); + assert.strictEqual(stack.canGoBack(), true); + assert.strictEqual(stack.canGoForward(), false); + + await stack.goBack(); + await stack.goLast(); + assert.strictEqual(stack.canGoBack(), true); + assert.strictEqual(stack.canGoForward(), false); + + stack.dispose(); + assert.strictEqual(stack.canGoBack(), false); + }); + + test('back / forward: editor navigation stack - mutations', async function () { + const [, , editorService, , instantiationService] = await createServices(); + + const stack = instantiationService.createInstance(EditorNavigationStack, GoFilter.NONE); + + const resource = toResource.call(this, '/path/index.txt'); + const otherResource = toResource.call(this, '/path/index.html'); + const pane = await editorService.openEditor({ resource, options: { pinned: true } }); + + stack.notifyNavigation(pane); + + await editorService.openEditor({ resource: otherResource, options: { pinned: true } }); + stack.notifyNavigation(pane); + + // Clear + assert.strictEqual(stack.canGoBack(), true); + stack.clear(); + assert.strictEqual(stack.canGoBack(), false); + + await editorService.openEditor({ resource, options: { pinned: true } }); + stack.notifyNavigation(pane); + await editorService.openEditor({ resource: otherResource, options: { pinned: true } }); + stack.notifyNavigation(pane); + + // Remove (via internal event) + assert.strictEqual(stack.canGoBack(), true); + stack.remove(new FileOperationEvent(resource, FileOperation.DELETE)); + assert.strictEqual(stack.canGoBack(), false); + stack.clear(); + + await editorService.openEditor({ resource, options: { pinned: true } }); + stack.notifyNavigation(pane); + await editorService.openEditor({ resource: otherResource, options: { pinned: true } }); + stack.notifyNavigation(pane); + + // Remove (via external event) + assert.strictEqual(stack.canGoBack(), true); + stack.remove(new FileChangesEvent([{ resource, type: FileChangeType.DELETED }], !isLinux)); + assert.strictEqual(stack.canGoBack(), false); + stack.clear(); + + await editorService.openEditor({ resource, options: { pinned: true } }); + stack.notifyNavigation(pane); + await editorService.openEditor({ resource: otherResource, options: { pinned: true } }); + stack.notifyNavigation(pane); + + // Remove (via editor) + assert.strictEqual(stack.canGoBack(), true); + stack.remove(pane!.input!); + assert.strictEqual(stack.canGoBack(), false); + stack.clear(); + + await editorService.openEditor({ resource, options: { pinned: true } }); + stack.notifyNavigation(pane); + await editorService.openEditor({ resource: otherResource, options: { pinned: true } }); + stack.notifyNavigation(pane); + + // Remove (via group) + assert.strictEqual(stack.canGoBack(), true); + stack.remove(pane!.group!.id); + assert.strictEqual(stack.canGoBack(), false); + stack.clear(); + + await editorService.openEditor({ resource, options: { pinned: true } }); + stack.notifyNavigation(pane); + await editorService.openEditor({ resource: otherResource, options: { pinned: true } }); + stack.notifyNavigation(pane); + + // Move + const stat = { + ctime: 0, + etag: '', + mtime: 0, + isDirectory: false, + isFile: true, + isSymbolicLink: false, + name: 'other.txt', + readonly: false, + size: 0, + resource: toResource.call(this, '/path/other.txt') + }; + stack.move(new FileOperationEvent(resource, FileOperation.MOVE, stat)); + await stack.goBack(); + assert.strictEqual(pane?.input?.resource?.toString(), stat.resource.toString()); + }); + + test('go to last edit location', async function () { + const [, historyService, editorService, textFileService] = await createServices(); + + const resource = toResource.call(this, '/path/index.txt'); + const otherResource = toResource.call(this, '/path/index.html'); + await editorService.openEditor({ resource }); + + const model = await textFileService.files.resolve(resource) as IResolvedTextFileEditorModel; + model.textEditorModel.setValue('Hello World'); + await timeout(10); // history debounces change events + + await editorService.openEditor({ resource: otherResource }); + + const onDidActiveEditorChange = new DeferredPromise(); + editorService.onDidActiveEditorChange(e => { + onDidActiveEditorChange.complete(e); + }); + + historyService.goLast(GoFilter.EDITS); + await onDidActiveEditorChange.p; + + assert.strictEqual(editorService.activeEditor?.resource?.toString(), resource.toString()); + }); + + test('reopen closed editor', async function () { + const [, historyService, editorService] = await createServices(); + + const resource = toResource.call(this, '/path/index.txt'); + const pane = await editorService.openEditor({ resource }); + + await pane?.group?.closeAllEditors(); + + const onDidActiveEditorChange = new DeferredPromise(); + editorService.onDidActiveEditorChange(e => { + onDidActiveEditorChange.complete(e); + }); + + historyService.reopenLastClosedEditor(); + await onDidActiveEditorChange.p; + + assert.strictEqual(editorService.activeEditor?.resource?.toString(), resource.toString()); + }); + + test('getHistory', async () => { + + class TestFileEditorInputWithUntyped extends TestFileEditorInput { + + override toUntyped(): IUntypedEditorInput { + return { + resource: this.resource, + options: { + override: 'testOverride' + } + }; + } + } + + const [part, historyService] = await createServices(); + + let history = historyService.getHistory(); + assert.strictEqual(history.length, 0); + + const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); + await part.activeGroup.openEditor(input1, { pinned: true }); + + const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); + await part.activeGroup.openEditor(input2, { pinned: true }); + + const input3 = new TestFileEditorInputWithUntyped(URI.parse('foo://bar3'), TEST_EDITOR_INPUT_ID); + await part.activeGroup.openEditor(input3, { pinned: true }); + + const input4 = new TestFileEditorInputWithUntyped(URI.file('bar4'), TEST_EDITOR_INPUT_ID); + await part.activeGroup.openEditor(input4, { pinned: true }); + + history = historyService.getHistory(); + assert.strictEqual(history.length, 4); + + // first entry is untyped because it implements `toUntyped` and has a supported scheme + assert.strictEqual(isResourceEditorInput(history[0]) && !(history[0] instanceof EditorInput), true); + assert.strictEqual((history[0] as IResourceEditorInput).options?.override, 'testOverride'); + // second entry is not untyped even though it implements `toUntyped` but has unsupported scheme + assert.strictEqual(history[1] instanceof EditorInput, true); + assert.strictEqual(history[2] instanceof EditorInput, true); + assert.strictEqual(history[3] instanceof EditorInput, true); + + historyService.removeFromHistory(input2); + history = historyService.getHistory(); + assert.strictEqual(history.length, 3); + assert.strictEqual(history[0].resource?.toString(), input4.resource.toString()); + }); + + test('getLastActiveFile', async () => { + const [part, historyService] = await createServices(); + + assert.ok(!historyService.getLastActiveFile('foo')); + + const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); + await part.activeGroup.openEditor(input1, { pinned: true }); + + assert.strictEqual(historyService.getLastActiveFile('foo')?.toString(), input1.resource.toString()); + }); + + test('open next/previous recently used editor (single group)', async () => { + const [part, historyService, editorService] = await createServices(); + + const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); + const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); + + await part.activeGroup.openEditor(input1, { pinned: true }); + assert.strictEqual(part.activeGroup.activeEditor, input1); + + await part.activeGroup.openEditor(input2, { pinned: true }); + assert.strictEqual(part.activeGroup.activeEditor, input2); + + let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openPreviouslyUsedEditor(); + await editorChangePromise; + assert.strictEqual(part.activeGroup.activeEditor, input1); + + editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openNextRecentlyUsedEditor(); + await editorChangePromise; + assert.strictEqual(part.activeGroup.activeEditor, input2); + + editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openPreviouslyUsedEditor(part.activeGroup.id); + await editorChangePromise; + assert.strictEqual(part.activeGroup.activeEditor, input1); + + editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openNextRecentlyUsedEditor(part.activeGroup.id); + await editorChangePromise; + assert.strictEqual(part.activeGroup.activeEditor, input2); + }); + + test('open next/previous recently used editor (multi group)', async () => { + const [part, historyService, editorService] = await createServices(); + const rootGroup = part.activeGroup; + + const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); + const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); + + const sideGroup = part.addGroup(rootGroup, GroupDirection.RIGHT); + + await rootGroup.openEditor(input1, { pinned: true }); + await sideGroup.openEditor(input2, { pinned: true }); + + let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openPreviouslyUsedEditor(); + await editorChangePromise; + assert.strictEqual(part.activeGroup, rootGroup); + assert.strictEqual(rootGroup.activeEditor, input1); + + editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openNextRecentlyUsedEditor(); + await editorChangePromise; + assert.strictEqual(part.activeGroup, sideGroup); + assert.strictEqual(sideGroup.activeEditor, input2); + }); + + test('open next/previous recently is reset when other input opens', async () => { + const [part, historyService, editorService] = await createServices(); + + const input1 = new TestFileEditorInput(URI.parse('foo://bar1'), TEST_EDITOR_INPUT_ID); + const input2 = new TestFileEditorInput(URI.parse('foo://bar2'), TEST_EDITOR_INPUT_ID); + const input3 = new TestFileEditorInput(URI.parse('foo://bar3'), TEST_EDITOR_INPUT_ID); + const input4 = new TestFileEditorInput(URI.parse('foo://bar4'), TEST_EDITOR_INPUT_ID); + + await part.activeGroup.openEditor(input1, { pinned: true }); + await part.activeGroup.openEditor(input2, { pinned: true }); + await part.activeGroup.openEditor(input3, { pinned: true }); + + let editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openPreviouslyUsedEditor(); + await editorChangePromise; + assert.strictEqual(part.activeGroup.activeEditor, input2); + + await timeout(0); + await part.activeGroup.openEditor(input4, { pinned: true }); + + editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openPreviouslyUsedEditor(); + await editorChangePromise; + assert.strictEqual(part.activeGroup.activeEditor, input2); + + editorChangePromise = Event.toPromise(editorService.onDidActiveEditorChange); + historyService.openNextRecentlyUsedEditor(); + await editorChangePromise; + assert.strictEqual(part.activeGroup.activeEditor, input4); + }); +}); diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index 73f88cb80e8..8e946a1e1af 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -17,7 +17,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { ModifierKeyEmitter, trackFocus } from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { memoize } from 'vs/base/common/decorators'; import { parseLineAndColumnAware } from 'vs/base/common/extpath'; import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; @@ -70,7 +70,7 @@ export interface IWorkspaceProvider { * * @returns true if successfully opened, false otherwise. */ - open(workspace: IWorkspace, options?: { reuse?: boolean, payload?: object }): Promise; + open(workspace: IWorkspace, options?: { reuse?: boolean; payload?: object }): Promise; } enum HostShutdownReason { @@ -104,7 +104,7 @@ export class BrowserHostService extends Disposable implements IHostService { @IConfigurationService private readonly configurationService: IConfigurationService, @IFileService private readonly fileService: IFileService, @ILabelService private readonly labelService: ILabelService, - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService, @IInstantiationService private readonly instantiationService: IInstantiationService, @ILifecycleService private readonly lifecycleService: BrowserLifecycleService, @ILogService private readonly logService: ILogService, @@ -381,7 +381,7 @@ export class BrowserHostService extends Disposable implements IHostService { return this.doOpen(undefined, { reuse: options?.forceReuseWindow }); } - private async doOpen(workspace: IWorkspace, options?: { reuse?: boolean, payload?: object }): Promise { + private async doOpen(workspace: IWorkspace, options?: { reuse?: boolean; payload?: object }): Promise { // We know that `workspaceProvider.open` will trigger a shutdown // with `options.reuse` so we handle this expected shutdown diff --git a/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts b/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts index 227a1887a39..81576aadd15 100644 --- a/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts +++ b/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts @@ -21,7 +21,7 @@ class WorkbenchNativeHostService extends NativeHostService { @INativeWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService, @IMainProcessService mainProcessService: IMainProcessService ) { - super(environmentService.configuration.windowId, mainProcessService); + super(environmentService.window.id, mainProcessService); } } diff --git a/src/vs/workbench/services/hover/browser/hover.ts b/src/vs/workbench/services/hover/browser/hover.ts index a520b88cb74..a9828d36e83 100644 --- a/src/vs/workbench/services/hover/browser/hover.ts +++ b/src/vs/workbench/services/hover/browser/hover.ts @@ -96,7 +96,7 @@ export interface IHoverOptions { * Force the hover position, reducing the size of the hover instead of adjusting the hover * position. */ - forcePosition?: boolean + forcePosition?: boolean; /** * Whether to show the hover pointer diff --git a/src/vs/workbench/services/hover/browser/hoverWidget.ts b/src/vs/workbench/services/hover/browser/hoverWidget.ts index ca6bfd2a11f..7856afda3a1 100644 --- a/src/vs/workbench/services/hover/browser/hoverWidget.ts +++ b/src/vs/workbench/services/hover/browser/hoverWidget.ts @@ -16,18 +16,18 @@ import { Widget } from 'vs/base/browser/ui/widget'; import { AnchorPosition } from 'vs/base/browser/ui/contextview/contextview'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { isMarkdownString } from 'vs/base/common/htmlContent'; const $ = dom.$; type TargetRect = { - left: number, - right: number, - top: number, - bottom: number, - width: number, - height: number, - center: { x: number, y: number }, + left: number; + right: number; + top: number; + bottom: number; + width: number; + height: number; + center: { x: number; y: number }; }; const enum Constants { diff --git a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts index cf004784fe9..40f41611139 100644 --- a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts +++ b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts @@ -17,7 +17,7 @@ import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { platform } from 'vs/base/common/process'; import { IProductService } from 'vs/platform/product/common/productService'; import { IWorkbenchAssignmentService } from 'vs/workbench/services/assignment/common/assignmentService'; -import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { registerMainProcessRemoteService } from 'vs/platform/ipc/electron-sandbox/services'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; @@ -97,7 +97,7 @@ export class WorkbenchIssueService implements IWorkbenchIssueService { openProcessExplorer(): Promise { const theme = this.themeService.getColorTheme(); const data: ProcessExplorerData = { - pid: this.environmentService.configuration.mainPid, + pid: this.environmentService.mainPid, zoomLevel: getZoomLevel(), styles: { backgroundColor: getColor(theme, editorBackground), diff --git a/src/vs/workbench/services/keybinding/browser/keybindingService.ts b/src/vs/workbench/services/keybinding/browser/keybindingService.ts index 734b2093727..b55025bade5 100644 --- a/src/vs/workbench/services/keybinding/browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/browser/keybindingService.ts @@ -34,11 +34,11 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { MenuRegistry } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { commandsExtensionPoint } from 'vs/workbench/api/common/menusExtensionPoint'; +import { commandsExtensionPoint } from 'vs/workbench/services/actions/common/menusExtensionPoint'; import { Disposable } from 'vs/base/common/lifecycle'; import { RunOnceScheduler } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; -import { IFileService } from 'vs/platform/files/common/files'; +import { FileOperation, IFileService } from 'vs/platform/files/common/files'; import { parse } from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; import { IKeyboardLayoutService } from 'vs/platform/keyboardLayout/common/keyboardLayout'; @@ -320,7 +320,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { return resolvedKeybinding.getDispatchParts().map(x => x || '[null]').join(' '); } - private _printResolvedKeybindings(output:string[], input: string, resolvedKeybindings: ResolvedKeybinding[]): void { + private _printResolvedKeybindings(output: string[], input: string, resolvedKeybindings: ResolvedKeybinding[]): void { const padLength = 35; const firstRow = `${input.padStart(padLength, ' ')} => `; if (resolvedKeybindings.length === 0) { @@ -732,6 +732,12 @@ class UserKeybindings extends Disposable { logService.debug('Keybindings file changed'); this.reloadConfigurationScheduler.schedule(); })); + this._register(this.fileService.onDidRunOperation((e) => { + if (e.operation === FileOperation.WRITE && e.resource.toString() === this.keybindingsResource.toString()) { + logService.debug('Keybindings file written'); + this.reloadConfigurationScheduler.schedule(); + } + })); } async initialize(): Promise { diff --git a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts index 1dacce3ff40..9b013e05a2b 100644 --- a/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts +++ b/src/vs/workbench/services/keybinding/browser/keyboardLayoutService.ts @@ -108,7 +108,7 @@ export class BrowserKeyboardMapperFactoryBase { this._keymapInfos.splice(index, 1); } - getMatchedKeymapInfo(keyMapping: IKeyboardMapping | null): { result: KeymapInfo, score: number } | null { + getMatchedKeymapInfo(keyMapping: IKeyboardMapping | null): { result: KeymapInfo; score: number } | null { if (!keyMapping) { return null; } diff --git a/src/vs/workbench/services/keybinding/browser/navigatorKeyboard.ts b/src/vs/workbench/services/keybinding/browser/navigatorKeyboard.ts index 51e8de9f790..5d67ec6821b 100644 --- a/src/vs/workbench/services/keybinding/browser/navigatorKeyboard.ts +++ b/src/vs/workbench/services/keybinding/browser/navigatorKeyboard.ts @@ -11,5 +11,5 @@ export interface IKeyboard { } export type INavigatorWithKeyboard = Navigator & { - keyboard: IKeyboard + keyboard: IKeyboard; }; \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts index 9935d106589..047618c1d73 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts @@ -286,7 +286,7 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding }); } - private parse(model: ITextModel): { result: IUserFriendlyKeybinding[], parseErrors: json.ParseError[] } { + private parse(model: ITextModel): { result: IUserFriendlyKeybinding[]; parseErrors: json.ParseError[] } { const parseErrors: json.ParseError[] = []; const result = json.parse(model.getValue(), parseErrors, { allowTrailingComma: true, allowEmptyContent: true }); return { result, parseErrors }; diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index 2c99772a81c..700d16d4480 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -49,7 +49,7 @@ function deserializeMapping(serializedMapping: ISerializedMapping) { export interface IRawMixedKeyboardMapping { [key: string]: { - value: string, + value: string; withShift: string; withAltGr: string; withShiftAltGr: string; diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index 06df5b9e20a..424eccf2135 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -433,7 +433,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { // Try to identify keyboard layouts where characters A-Z are missing // and forcibly map them to their corresponding scan codes if that is the case - const missingLatinLettersOverride: { [scanCode: string]: IMacLinuxKeyMapping; } = {}; + const missingLatinLettersOverride: { [scanCode: string]: IMacLinuxKeyMapping } = {}; { let producesLatinLetter: boolean[] = []; diff --git a/src/vs/workbench/services/keybinding/test/browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/browser/keybindingEditing.test.ts index c4dd189ceaf..ba84b6b152b 100644 --- a/src/vs/workbench/services/keybinding/test/browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/browser/keybindingEditing.test.ts @@ -8,7 +8,7 @@ import * as json from 'vs/base/common/json'; import { KeyCode } from 'vs/base/common/keyCodes'; import { ChordKeybinding, SimpleKeybinding } from 'vs/base/common/keybindings'; import { OS } from 'vs/base/common/platform'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { IModelService } from 'vs/editor/common/services/model'; import { ModelService } from 'vs/editor/common/services/modelService'; @@ -114,7 +114,7 @@ suite('KeybindingsEditing', () => { instantiationService.stub(IThemeService, new TestThemeService()); instantiationService.stub(ILanguageConfigurationService, new TestLanguageConfigurationService()); instantiationService.stub(IModelService, disposables.add(instantiationService.createInstance(ModelService))); - fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, fileService, new NullLogService()))); + fileService.registerProvider(Schemas.userData, disposables.add(new FileUserDataProvider(ROOT.scheme, fileSystemProvider, Schemas.userData, new NullLogService()))); instantiationService.stub(IFileService, fileService); instantiationService.stub(IUriIdentityService, new UriIdentityService(fileService)); instantiationService.stub(IWorkingCopyFileService, disposables.add(instantiationService.createInstance(WorkingCopyFileService))); @@ -303,8 +303,8 @@ suite('KeybindingsEditing', () => { return json.parse((await fileService.readFile(environmentService.keybindingsResource)).value.toString()); } - function aResolvedKeybindingItem({ command, when, isDefault, firstPart, chordPart }: { command?: string, when?: string, isDefault?: boolean, firstPart?: { keyCode: KeyCode, modifiers?: Modifiers }, chordPart?: { keyCode: KeyCode, modifiers?: Modifiers } }): ResolvedKeybindingItem { - const aSimpleKeybinding = function (part: { keyCode: KeyCode, modifiers?: Modifiers }): SimpleKeybinding { + function aResolvedKeybindingItem({ command, when, isDefault, firstPart, chordPart }: { command?: string; when?: string; isDefault?: boolean; firstPart?: { keyCode: KeyCode; modifiers?: Modifiers }; chordPart?: { keyCode: KeyCode; modifiers?: Modifiers } }): ResolvedKeybindingItem { + const aSimpleKeybinding = function (part: { keyCode: KeyCode; modifiers?: Modifiers }): SimpleKeybinding { const { ctrlKey, shiftKey, altKey, metaKey } = part.modifiers || { ctrlKey: false, shiftKey: false, altKey: false, metaKey: false }; return new SimpleKeybinding(ctrlKey!, shiftKey!, altKey!, metaKey!, part.keyCode); }; diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/linux_en_uk.js b/src/vs/workbench/services/keybinding/test/electron-browser/linux_en_uk.js index 57b55abead3..379e7355c8e 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/linux_en_uk.js +++ b/src/vs/workbench/services/keybinding/test/electron-browser/linux_en_uk.js @@ -5,1042 +5,1042 @@ 'use strict'; define({ - "Sleep": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "WakeUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "KeyA": { - "value": "a", - "withShift": "A", - "withAltGr": "æ", - "withShiftAltGr": "Æ" - }, - "KeyB": { - "value": "b", - "withShift": "B", - "withAltGr": "”", - "withShiftAltGr": "’" - }, - "KeyC": { - "value": "c", - "withShift": "C", - "withAltGr": "¢", - "withShiftAltGr": "©" - }, - "KeyD": { - "value": "d", - "withShift": "D", - "withAltGr": "ð", - "withShiftAltGr": "Ð" - }, - "KeyE": { - "value": "e", - "withShift": "E", - "withAltGr": "e", - "withShiftAltGr": "E" - }, - "KeyF": { - "value": "f", - "withShift": "F", - "withAltGr": "đ", - "withShiftAltGr": "ª" - }, - "KeyG": { - "value": "g", - "withShift": "G", - "withAltGr": "ŋ", - "withShiftAltGr": "Ŋ" - }, - "KeyH": { - "value": "h", - "withShift": "H", - "withAltGr": "ħ", - "withShiftAltGr": "Ħ" - }, - "KeyI": { - "value": "i", - "withShift": "I", - "withAltGr": "→", - "withShiftAltGr": "ı" - }, - "KeyJ": { - "value": "j", - "withShift": "J", - "withAltGr": "̉", - "withShiftAltGr": "̛" - }, - "KeyK": { - "value": "k", - "withShift": "K", - "withAltGr": "ĸ", - "withShiftAltGr": "&" - }, - "KeyL": { - "value": "l", - "withShift": "L", - "withAltGr": "ł", - "withShiftAltGr": "Ł" - }, - "KeyM": { - "value": "m", - "withShift": "M", - "withAltGr": "µ", - "withShiftAltGr": "º" - }, - "KeyN": { - "value": "n", - "withShift": "N", - "withAltGr": "n", - "withShiftAltGr": "N" - }, - "KeyO": { - "value": "o", - "withShift": "O", - "withAltGr": "ø", - "withShiftAltGr": "Ø" - }, - "KeyP": { - "value": "p", - "withShift": "P", - "withAltGr": "þ", - "withShiftAltGr": "Þ" - }, - "KeyQ": { - "value": "q", - "withShift": "Q", - "withAltGr": "@", - "withShiftAltGr": "Ω" - }, - "KeyR": { - "value": "r", - "withShift": "R", - "withAltGr": "¶", - "withShiftAltGr": "®" - }, - "KeyS": { - "value": "s", - "withShift": "S", - "withAltGr": "ß", - "withShiftAltGr": "§" - }, - "KeyT": { - "value": "t", - "withShift": "T", - "withAltGr": "ŧ", - "withShiftAltGr": "Ŧ" - }, - "KeyU": { - "value": "u", - "withShift": "U", - "withAltGr": "↓", - "withShiftAltGr": "↑" - }, - "KeyV": { - "value": "v", - "withShift": "V", - "withAltGr": "“", - "withShiftAltGr": "‘" - }, - "KeyW": { - "value": "w", - "withShift": "W", - "withAltGr": "ł", - "withShiftAltGr": "Ł" - }, - "KeyX": { - "value": "x", - "withShift": "X", - "withAltGr": "»", - "withShiftAltGr": ">" - }, - "KeyY": { - "value": "y", - "withShift": "Y", - "withAltGr": "←", - "withShiftAltGr": "¥" - }, - "KeyZ": { - "value": "z", - "withShift": "Z", - "withAltGr": "«", - "withShiftAltGr": "<" - }, - "Digit1": { - "value": "1", - "withShift": "!", - "withAltGr": "¹", - "withShiftAltGr": "¡" - }, - "Digit2": { - "value": "2", - "withShift": "\"", - "withAltGr": "²", - "withShiftAltGr": "⅛" - }, - "Digit3": { - "value": "3", - "withShift": "£", - "withAltGr": "³", - "withShiftAltGr": "£" - }, - "Digit4": { - "value": "4", - "withShift": "$", - "withAltGr": "€", - "withShiftAltGr": "¼" - }, - "Digit5": { - "value": "5", - "withShift": "%", - "withAltGr": "½", - "withShiftAltGr": "⅜" - }, - "Digit6": { - "value": "6", - "withShift": "^", - "withAltGr": "¾", - "withShiftAltGr": "⅝" - }, - "Digit7": { - "value": "7", - "withShift": "&", - "withAltGr": "{", - "withShiftAltGr": "⅞" - }, - "Digit8": { - "value": "8", - "withShift": "*", - "withAltGr": "[", - "withShiftAltGr": "™" - }, - "Digit9": { - "value": "9", - "withShift": "(", - "withAltGr": "]", - "withShiftAltGr": "±" - }, - "Digit0": { - "value": "0", - "withShift": ")", - "withAltGr": "}", - "withShiftAltGr": "°" - }, - "Enter": { - "value": "\r", - "withShift": "\r", - "withAltGr": "\r", - "withShiftAltGr": "\r" - }, - "Escape": { - "value": "\u001b", - "withShift": "\u001b", - "withAltGr": "\u001b", - "withShiftAltGr": "\u001b" - }, - "Backspace": { - "value": "\b", - "withShift": "\b", - "withAltGr": "\b", - "withShiftAltGr": "\b" - }, - "Tab": { - "value": "\t", - "withShift": "", - "withAltGr": "\t", - "withShiftAltGr": "" - }, - "Space": { - "value": " ", - "withShift": " ", - "withAltGr": " ", - "withShiftAltGr": " " - }, - "Minus": { - "value": "-", - "withShift": "_", - "withAltGr": "\\", - "withShiftAltGr": "¿" - }, - "Equal": { - "value": "=", - "withShift": "+", - "withAltGr": "̧", - "withShiftAltGr": "̨" - }, - "BracketLeft": { - "value": "[", - "withShift": "{", - "withAltGr": "̈", - "withShiftAltGr": "̊" - }, - "BracketRight": { - "value": "]", - "withShift": "}", - "withAltGr": "̃", - "withShiftAltGr": "̄" - }, - "Backslash": { - "value": "#", - "withShift": "~", - "withAltGr": "̀", - "withShiftAltGr": "̆" - }, - "Semicolon": { - "value": ";", - "withShift": ":", - "withAltGr": "́", - "withShiftAltGr": "̋" - }, - "Quote": { - "value": "'", - "withShift": "@", - "withAltGr": "̂", - "withShiftAltGr": "̌" - }, - "Backquote": { - "value": "`", - "withShift": "¬", - "withAltGr": "|", - "withShiftAltGr": "|" - }, - "Comma": { - "value": ",", - "withShift": "<", - "withAltGr": "─", - "withShiftAltGr": "×" - }, - "Period": { - "value": ".", - "withShift": ">", - "withAltGr": "·", - "withShiftAltGr": "÷" - }, - "Slash": { - "value": "/", - "withShift": "?", - "withAltGr": "̣", - "withShiftAltGr": "̇" - }, - "CapsLock": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F1": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F2": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F3": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F4": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F5": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F6": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F7": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F8": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F9": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F10": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F11": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F12": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "PrintScreen": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ScrollLock": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Pause": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Insert": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Home": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "PageUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Delete": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "End": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "PageDown": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ArrowRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ArrowLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ArrowDown": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ArrowUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumLock": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumpadDivide": { - "value": "/", - "withShift": "/", - "withAltGr": "/", - "withShiftAltGr": "/" - }, - "NumpadMultiply": { - "value": "*", - "withShift": "*", - "withAltGr": "*", - "withShiftAltGr": "*" - }, - "NumpadSubtract": { - "value": "-", - "withShift": "-", - "withAltGr": "-", - "withShiftAltGr": "-" - }, - "NumpadAdd": { - "value": "+", - "withShift": "+", - "withAltGr": "+", - "withShiftAltGr": "+" - }, - "NumpadEnter": { - "value": "\r", - "withShift": "\r", - "withAltGr": "\r", - "withShiftAltGr": "\r" - }, - "Numpad1": { - "value": "", - "withShift": "1", - "withAltGr": "", - "withShiftAltGr": "1" - }, - "Numpad2": { - "value": "", - "withShift": "2", - "withAltGr": "", - "withShiftAltGr": "2" - }, - "Numpad3": { - "value": "", - "withShift": "3", - "withAltGr": "", - "withShiftAltGr": "3" - }, - "Numpad4": { - "value": "", - "withShift": "4", - "withAltGr": "", - "withShiftAltGr": "4" - }, - "Numpad5": { - "value": "", - "withShift": "5", - "withAltGr": "", - "withShiftAltGr": "5" - }, - "Numpad6": { - "value": "", - "withShift": "6", - "withAltGr": "", - "withShiftAltGr": "6" - }, - "Numpad7": { - "value": "", - "withShift": "7", - "withAltGr": "", - "withShiftAltGr": "7" - }, - "Numpad8": { - "value": "", - "withShift": "8", - "withAltGr": "", - "withShiftAltGr": "8" - }, - "Numpad9": { - "value": "", - "withShift": "9", - "withAltGr": "", - "withShiftAltGr": "9" - }, - "Numpad0": { - "value": "", - "withShift": "0", - "withAltGr": "", - "withShiftAltGr": "0" - }, - "NumpadDecimal": { - "value": "", - "withShift": ".", - "withAltGr": "", - "withShiftAltGr": "." - }, - "IntlBackslash": { - "value": "\\", - "withShift": "|", - "withAltGr": "|", - "withShiftAltGr": "¦" - }, - "ContextMenu": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Power": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumpadEqual": { - "value": "=", - "withShift": "=", - "withAltGr": "=", - "withShiftAltGr": "=" - }, - "F13": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F14": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F15": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F16": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F17": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F18": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F19": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F20": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F21": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F22": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F23": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F24": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Open": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Help": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Select": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Again": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Undo": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Cut": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Copy": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Paste": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Find": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AudioVolumeMute": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AudioVolumeUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AudioVolumeDown": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumpadComma": { - "value": ".", - "withShift": ".", - "withAltGr": ".", - "withShiftAltGr": "." - }, - "IntlRo": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "KanaMode": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "IntlYen": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Convert": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NonConvert": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang1": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang2": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang3": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang4": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang5": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumpadParenLeft": { - "value": "(", - "withShift": "(", - "withAltGr": "(", - "withShiftAltGr": "(" - }, - "NumpadParenRight": { - "value": ")", - "withShift": ")", - "withAltGr": ")", - "withShiftAltGr": ")" - }, - "ControlLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ShiftLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AltLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MetaLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ControlRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ShiftRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AltRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MetaRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrightnessUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrightnessDown": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaPlay": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaRecord": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaFastForward": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaRewind": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaTrackNext": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaTrackPrevious": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaStop": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Eject": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaPlayPause": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaSelect": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "LaunchMail": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "LaunchApp2": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "LaunchApp1": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "SelectTask": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "LaunchScreenSaver": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserSearch": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserHome": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserBack": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserForward": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserStop": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserRefresh": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserFavorites": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MailReply": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MailForward": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MailSend": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" + Sleep: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + WakeUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KeyA: { + value: 'a', + withShift: 'A', + withAltGr: 'æ', + withShiftAltGr: 'Æ' + }, + KeyB: { + value: 'b', + withShift: 'B', + withAltGr: '”', + withShiftAltGr: '’' + }, + KeyC: { + value: 'c', + withShift: 'C', + withAltGr: '¢', + withShiftAltGr: '©' + }, + KeyD: { + value: 'd', + withShift: 'D', + withAltGr: 'ð', + withShiftAltGr: 'Ð' + }, + KeyE: { + value: 'e', + withShift: 'E', + withAltGr: 'e', + withShiftAltGr: 'E' + }, + KeyF: { + value: 'f', + withShift: 'F', + withAltGr: 'đ', + withShiftAltGr: 'ª' + }, + KeyG: { + value: 'g', + withShift: 'G', + withAltGr: 'ŋ', + withShiftAltGr: 'Ŋ' + }, + KeyH: { + value: 'h', + withShift: 'H', + withAltGr: 'ħ', + withShiftAltGr: 'Ħ' + }, + KeyI: { + value: 'i', + withShift: 'I', + withAltGr: '→', + withShiftAltGr: 'ı' + }, + KeyJ: { + value: 'j', + withShift: 'J', + withAltGr: '̉', + withShiftAltGr: '̛' + }, + KeyK: { + value: 'k', + withShift: 'K', + withAltGr: 'ĸ', + withShiftAltGr: '&' + }, + KeyL: { + value: 'l', + withShift: 'L', + withAltGr: 'ł', + withShiftAltGr: 'Ł' + }, + KeyM: { + value: 'm', + withShift: 'M', + withAltGr: 'µ', + withShiftAltGr: 'º' + }, + KeyN: { + value: 'n', + withShift: 'N', + withAltGr: 'n', + withShiftAltGr: 'N' + }, + KeyO: { + value: 'o', + withShift: 'O', + withAltGr: 'ø', + withShiftAltGr: 'Ø' + }, + KeyP: { + value: 'p', + withShift: 'P', + withAltGr: 'þ', + withShiftAltGr: 'Þ' + }, + KeyQ: { + value: 'q', + withShift: 'Q', + withAltGr: '@', + withShiftAltGr: 'Ω' + }, + KeyR: { + value: 'r', + withShift: 'R', + withAltGr: '¶', + withShiftAltGr: '®' + }, + KeyS: { + value: 's', + withShift: 'S', + withAltGr: 'ß', + withShiftAltGr: '§' + }, + KeyT: { + value: 't', + withShift: 'T', + withAltGr: 'ŧ', + withShiftAltGr: 'Ŧ' + }, + KeyU: { + value: 'u', + withShift: 'U', + withAltGr: '↓', + withShiftAltGr: '↑' + }, + KeyV: { + value: 'v', + withShift: 'V', + withAltGr: '“', + withShiftAltGr: '‘' + }, + KeyW: { + value: 'w', + withShift: 'W', + withAltGr: 'ł', + withShiftAltGr: 'Ł' + }, + KeyX: { + value: 'x', + withShift: 'X', + withAltGr: '»', + withShiftAltGr: '>' + }, + KeyY: { + value: 'y', + withShift: 'Y', + withAltGr: '←', + withShiftAltGr: '¥' + }, + KeyZ: { + value: 'z', + withShift: 'Z', + withAltGr: '«', + withShiftAltGr: '<' + }, + Digit1: { + value: '1', + withShift: '!', + withAltGr: '¹', + withShiftAltGr: '¡' + }, + Digit2: { + value: '2', + withShift: '"', + withAltGr: '²', + withShiftAltGr: '⅛' + }, + Digit3: { + value: '3', + withShift: '£', + withAltGr: '³', + withShiftAltGr: '£' + }, + Digit4: { + value: '4', + withShift: '$', + withAltGr: '€', + withShiftAltGr: '¼' + }, + Digit5: { + value: '5', + withShift: '%', + withAltGr: '½', + withShiftAltGr: '⅜' + }, + Digit6: { + value: '6', + withShift: '^', + withAltGr: '¾', + withShiftAltGr: '⅝' + }, + Digit7: { + value: '7', + withShift: '&', + withAltGr: '{', + withShiftAltGr: '⅞' + }, + Digit8: { + value: '8', + withShift: '*', + withAltGr: '[', + withShiftAltGr: '™' + }, + Digit9: { + value: '9', + withShift: '(', + withAltGr: ']', + withShiftAltGr: '±' + }, + Digit0: { + value: '0', + withShift: ')', + withAltGr: '}', + withShiftAltGr: '°' + }, + Enter: { + value: '\r', + withShift: '\r', + withAltGr: '\r', + withShiftAltGr: '\r' + }, + Escape: { + value: '\u001b', + withShift: '\u001b', + withAltGr: '\u001b', + withShiftAltGr: '\u001b' + }, + Backspace: { + value: '\b', + withShift: '\b', + withAltGr: '\b', + withShiftAltGr: '\b' + }, + Tab: { + value: '\t', + withShift: '', + withAltGr: '\t', + withShiftAltGr: '' + }, + Space: { + value: ' ', + withShift: ' ', + withAltGr: ' ', + withShiftAltGr: ' ' + }, + Minus: { + value: '-', + withShift: '_', + withAltGr: '\\', + withShiftAltGr: '¿' + }, + Equal: { + value: '=', + withShift: '+', + withAltGr: '̧', + withShiftAltGr: '̨' + }, + BracketLeft: { + value: '[', + withShift: '{', + withAltGr: '̈', + withShiftAltGr: '̊' + }, + BracketRight: { + value: ']', + withShift: '}', + withAltGr: '̃', + withShiftAltGr: '̄' + }, + Backslash: { + value: '#', + withShift: '~', + withAltGr: '̀', + withShiftAltGr: '̆' + }, + Semicolon: { + value: ';', + withShift: ':', + withAltGr: '́', + withShiftAltGr: '̋' + }, + Quote: { + value: '\'', + withShift: '@', + withAltGr: '̂', + withShiftAltGr: '̌' + }, + Backquote: { + value: '`', + withShift: '¬', + withAltGr: '|', + withShiftAltGr: '|' + }, + Comma: { + value: ',', + withShift: '<', + withAltGr: '─', + withShiftAltGr: '×' + }, + Period: { + value: '.', + withShift: '>', + withAltGr: '·', + withShiftAltGr: '÷' + }, + Slash: { + value: '/', + withShift: '?', + withAltGr: '̣', + withShiftAltGr: '̇' + }, + CapsLock: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F1: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F2: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F3: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F4: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F5: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F6: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F7: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F8: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F9: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F10: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F11: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F12: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PrintScreen: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ScrollLock: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Pause: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Insert: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Home: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Delete: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + End: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageDown: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowDown: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumLock: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadDivide: { + value: '/', + withShift: '/', + withAltGr: '/', + withShiftAltGr: '/' + }, + NumpadMultiply: { + value: '*', + withShift: '*', + withAltGr: '*', + withShiftAltGr: '*' + }, + NumpadSubtract: { + value: '-', + withShift: '-', + withAltGr: '-', + withShiftAltGr: '-' + }, + NumpadAdd: { + value: '+', + withShift: '+', + withAltGr: '+', + withShiftAltGr: '+' + }, + NumpadEnter: { + value: '\r', + withShift: '\r', + withAltGr: '\r', + withShiftAltGr: '\r' + }, + Numpad1: { + value: '', + withShift: '1', + withAltGr: '', + withShiftAltGr: '1' + }, + Numpad2: { + value: '', + withShift: '2', + withAltGr: '', + withShiftAltGr: '2' + }, + Numpad3: { + value: '', + withShift: '3', + withAltGr: '', + withShiftAltGr: '3' + }, + Numpad4: { + value: '', + withShift: '4', + withAltGr: '', + withShiftAltGr: '4' + }, + Numpad5: { + value: '', + withShift: '5', + withAltGr: '', + withShiftAltGr: '5' + }, + Numpad6: { + value: '', + withShift: '6', + withAltGr: '', + withShiftAltGr: '6' + }, + Numpad7: { + value: '', + withShift: '7', + withAltGr: '', + withShiftAltGr: '7' + }, + Numpad8: { + value: '', + withShift: '8', + withAltGr: '', + withShiftAltGr: '8' + }, + Numpad9: { + value: '', + withShift: '9', + withAltGr: '', + withShiftAltGr: '9' + }, + Numpad0: { + value: '', + withShift: '0', + withAltGr: '', + withShiftAltGr: '0' + }, + NumpadDecimal: { + value: '', + withShift: '.', + withAltGr: '', + withShiftAltGr: '.' + }, + IntlBackslash: { + value: '\\', + withShift: '|', + withAltGr: '|', + withShiftAltGr: '¦' + }, + ContextMenu: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Power: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadEqual: { + value: '=', + withShift: '=', + withAltGr: '=', + withShiftAltGr: '=' + }, + F13: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F14: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F15: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F16: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F17: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F18: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F19: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F20: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F21: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F22: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F23: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F24: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Open: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Help: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Select: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Again: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Undo: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Cut: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Copy: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Paste: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Find: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeMute: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeDown: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadComma: { + value: '.', + withShift: '.', + withAltGr: '.', + withShiftAltGr: '.' + }, + IntlRo: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KanaMode: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlYen: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Convert: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NonConvert: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang1: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang2: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang3: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang4: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang5: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadParenLeft: { + value: '(', + withShift: '(', + withAltGr: '(', + withShiftAltGr: '(' + }, + NumpadParenRight: { + value: ')', + withShift: ')', + withAltGr: ')', + withShiftAltGr: ')' + }, + ControlLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ControlRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrightnessUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrightnessDown: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaPlay: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaRecord: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaFastForward: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaRewind: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackNext: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackPrevious: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaStop: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Eject: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaPlayPause: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaSelect: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchMail: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp2: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp1: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + SelectTask: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchScreenSaver: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserSearch: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserHome: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserBack: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserForward: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserStop: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserRefresh: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserFavorites: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MailReply: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MailForward: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MailSend: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' } }); diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/linux_ru.js b/src/vs/workbench/services/keybinding/test/electron-browser/linux_ru.js index afeda1d9d10..950223704b6 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/linux_ru.js +++ b/src/vs/workbench/services/keybinding/test/electron-browser/linux_ru.js @@ -5,1042 +5,1042 @@ 'use strict'; define({ - "Sleep": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "WakeUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "KeyA": { - "value": "ф", - "withShift": "Ф", - "withAltGr": "ф", - "withShiftAltGr": "Ф" - }, - "KeyB": { - "value": "и", - "withShift": "И", - "withAltGr": "и", - "withShiftAltGr": "И" - }, - "KeyC": { - "value": "с", - "withShift": "С", - "withAltGr": "с", - "withShiftAltGr": "С" - }, - "KeyD": { - "value": "в", - "withShift": "В", - "withAltGr": "в", - "withShiftAltGr": "В" - }, - "KeyE": { - "value": "у", - "withShift": "У", - "withAltGr": "у", - "withShiftAltGr": "У" - }, - "KeyF": { - "value": "а", - "withShift": "А", - "withAltGr": "а", - "withShiftAltGr": "А" - }, - "KeyG": { - "value": "п", - "withShift": "П", - "withAltGr": "п", - "withShiftAltGr": "П" - }, - "KeyH": { - "value": "р", - "withShift": "Р", - "withAltGr": "р", - "withShiftAltGr": "Р" - }, - "KeyI": { - "value": "ш", - "withShift": "Ш", - "withAltGr": "ш", - "withShiftAltGr": "Ш" - }, - "KeyJ": { - "value": "о", - "withShift": "О", - "withAltGr": "о", - "withShiftAltGr": "О" - }, - "KeyK": { - "value": "л", - "withShift": "Л", - "withAltGr": "л", - "withShiftAltGr": "Л" - }, - "KeyL": { - "value": "д", - "withShift": "Д", - "withAltGr": "д", - "withShiftAltGr": "Д" - }, - "KeyM": { - "value": "ь", - "withShift": "Ь", - "withAltGr": "ь", - "withShiftAltGr": "Ь" - }, - "KeyN": { - "value": "т", - "withShift": "Т", - "withAltGr": "т", - "withShiftAltGr": "Т" - }, - "KeyO": { - "value": "щ", - "withShift": "Щ", - "withAltGr": "щ", - "withShiftAltGr": "Щ" - }, - "KeyP": { - "value": "з", - "withShift": "З", - "withAltGr": "з", - "withShiftAltGr": "З" - }, - "KeyQ": { - "value": "й", - "withShift": "Й", - "withAltGr": "й", - "withShiftAltGr": "Й" - }, - "KeyR": { - "value": "к", - "withShift": "К", - "withAltGr": "к", - "withShiftAltGr": "К" - }, - "KeyS": { - "value": "ы", - "withShift": "Ы", - "withAltGr": "ы", - "withShiftAltGr": "Ы" - }, - "KeyT": { - "value": "е", - "withShift": "Е", - "withAltGr": "е", - "withShiftAltGr": "Е" - }, - "KeyU": { - "value": "г", - "withShift": "Г", - "withAltGr": "г", - "withShiftAltGr": "Г" - }, - "KeyV": { - "value": "м", - "withShift": "М", - "withAltGr": "м", - "withShiftAltGr": "М" - }, - "KeyW": { - "value": "ц", - "withShift": "Ц", - "withAltGr": "ц", - "withShiftAltGr": "Ц" - }, - "KeyX": { - "value": "ч", - "withShift": "Ч", - "withAltGr": "ч", - "withShiftAltGr": "Ч" - }, - "KeyY": { - "value": "н", - "withShift": "Н", - "withAltGr": "н", - "withShiftAltGr": "Н" - }, - "KeyZ": { - "value": "я", - "withShift": "Я", - "withAltGr": "я", - "withShiftAltGr": "Я" - }, - "Digit1": { - "value": "1", - "withShift": "!", - "withAltGr": "1", - "withShiftAltGr": "!" - }, - "Digit2": { - "value": "2", - "withShift": "\"", - "withAltGr": "2", - "withShiftAltGr": "\"" - }, - "Digit3": { - "value": "3", - "withShift": "№", - "withAltGr": "3", - "withShiftAltGr": "№" - }, - "Digit4": { - "value": "4", - "withShift": ";", - "withAltGr": "4", - "withShiftAltGr": ";" - }, - "Digit5": { - "value": "5", - "withShift": "%", - "withAltGr": "5", - "withShiftAltGr": "%" - }, - "Digit6": { - "value": "6", - "withShift": ":", - "withAltGr": "6", - "withShiftAltGr": ":" - }, - "Digit7": { - "value": "7", - "withShift": "?", - "withAltGr": "7", - "withShiftAltGr": "?" - }, - "Digit8": { - "value": "8", - "withShift": "*", - "withAltGr": "8", - "withShiftAltGr": "*" - }, - "Digit9": { - "value": "9", - "withShift": "(", - "withAltGr": "9", - "withShiftAltGr": "(" - }, - "Digit0": { - "value": "0", - "withShift": ")", - "withAltGr": "0", - "withShiftAltGr": ")" - }, - "Enter": { - "value": "\r", - "withShift": "\r", - "withAltGr": "\r", - "withShiftAltGr": "\r" - }, - "Escape": { - "value": "\u001b", - "withShift": "\u001b", - "withAltGr": "\u001b", - "withShiftAltGr": "\u001b" - }, - "Backspace": { - "value": "\b", - "withShift": "\b", - "withAltGr": "\b", - "withShiftAltGr": "\b" - }, - "Tab": { - "value": "\t", - "withShift": "", - "withAltGr": "\t", - "withShiftAltGr": "" - }, - "Space": { - "value": " ", - "withShift": " ", - "withAltGr": " ", - "withShiftAltGr": " " - }, - "Minus": { - "value": "-", - "withShift": "_", - "withAltGr": "-", - "withShiftAltGr": "_" - }, - "Equal": { - "value": "=", - "withShift": "+", - "withAltGr": "=", - "withShiftAltGr": "+" - }, - "BracketLeft": { - "value": "х", - "withShift": "Х", - "withAltGr": "х", - "withShiftAltGr": "Х" - }, - "BracketRight": { - "value": "ъ", - "withShift": "Ъ", - "withAltGr": "ъ", - "withShiftAltGr": "Ъ" - }, - "Backslash": { - "value": "\\", - "withShift": "/", - "withAltGr": "\\", - "withShiftAltGr": "/" - }, - "Semicolon": { - "value": "ж", - "withShift": "Ж", - "withAltGr": "ж", - "withShiftAltGr": "Ж" - }, - "Quote": { - "value": "э", - "withShift": "Э", - "withAltGr": "э", - "withShiftAltGr": "Э" - }, - "Backquote": { - "value": "ё", - "withShift": "Ё", - "withAltGr": "ё", - "withShiftAltGr": "Ё" - }, - "Comma": { - "value": "б", - "withShift": "Б", - "withAltGr": "б", - "withShiftAltGr": "Б" - }, - "Period": { - "value": "ю", - "withShift": "Ю", - "withAltGr": "ю", - "withShiftAltGr": "Ю" - }, - "Slash": { - "value": ".", - "withShift": ",", - "withAltGr": ".", - "withShiftAltGr": "," - }, - "CapsLock": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F1": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F2": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F3": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F4": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F5": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F6": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F7": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F8": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F9": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F10": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F11": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F12": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "PrintScreen": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ScrollLock": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Pause": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Insert": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Home": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "PageUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Delete": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "End": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "PageDown": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ArrowRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ArrowLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ArrowDown": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ArrowUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumLock": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumpadDivide": { - "value": "/", - "withShift": "/", - "withAltGr": "/", - "withShiftAltGr": "/" - }, - "NumpadMultiply": { - "value": "*", - "withShift": "*", - "withAltGr": "*", - "withShiftAltGr": "*" - }, - "NumpadSubtract": { - "value": "-", - "withShift": "-", - "withAltGr": "-", - "withShiftAltGr": "-" - }, - "NumpadAdd": { - "value": "+", - "withShift": "+", - "withAltGr": "+", - "withShiftAltGr": "+" - }, - "NumpadEnter": { - "value": "\r", - "withShift": "\r", - "withAltGr": "\r", - "withShiftAltGr": "\r" - }, - "Numpad1": { - "value": "", - "withShift": "1", - "withAltGr": "", - "withShiftAltGr": "1" - }, - "Numpad2": { - "value": "", - "withShift": "2", - "withAltGr": "", - "withShiftAltGr": "2" - }, - "Numpad3": { - "value": "", - "withShift": "3", - "withAltGr": "", - "withShiftAltGr": "3" - }, - "Numpad4": { - "value": "", - "withShift": "4", - "withAltGr": "", - "withShiftAltGr": "4" - }, - "Numpad5": { - "value": "", - "withShift": "5", - "withAltGr": "", - "withShiftAltGr": "5" - }, - "Numpad6": { - "value": "", - "withShift": "6", - "withAltGr": "", - "withShiftAltGr": "6" - }, - "Numpad7": { - "value": "", - "withShift": "7", - "withAltGr": "", - "withShiftAltGr": "7" - }, - "Numpad8": { - "value": "", - "withShift": "8", - "withAltGr": "", - "withShiftAltGr": "8" - }, - "Numpad9": { - "value": "", - "withShift": "9", - "withAltGr": "", - "withShiftAltGr": "9" - }, - "Numpad0": { - "value": "", - "withShift": "0", - "withAltGr": "", - "withShiftAltGr": "0" - }, - "NumpadDecimal": { - "value": "", - "withShift": ",", - "withAltGr": "", - "withShiftAltGr": "," - }, - "IntlBackslash": { - "value": "/", - "withShift": "|", - "withAltGr": "|", - "withShiftAltGr": "¦" - }, - "ContextMenu": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Power": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumpadEqual": { - "value": "=", - "withShift": "=", - "withAltGr": "=", - "withShiftAltGr": "=" - }, - "F13": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F14": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F15": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F16": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F17": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F18": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F19": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F20": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F21": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F22": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F23": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "F24": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Open": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Help": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Select": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Again": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Undo": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Cut": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Copy": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Paste": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Find": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AudioVolumeMute": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AudioVolumeUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AudioVolumeDown": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumpadComma": { - "value": ".", - "withShift": ".", - "withAltGr": ".", - "withShiftAltGr": "." - }, - "IntlRo": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "KanaMode": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "IntlYen": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Convert": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NonConvert": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang1": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang2": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang3": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang4": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Lang5": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "NumpadParenLeft": { - "value": "(", - "withShift": "(", - "withAltGr": "(", - "withShiftAltGr": "(" - }, - "NumpadParenRight": { - "value": ")", - "withShift": ")", - "withAltGr": ")", - "withShiftAltGr": ")" - }, - "ControlLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ShiftLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AltLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MetaLeft": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ControlRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "ShiftRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "AltRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MetaRight": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrightnessUp": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrightnessDown": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaPlay": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaRecord": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaFastForward": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaRewind": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaTrackNext": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaTrackPrevious": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaStop": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "Eject": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaPlayPause": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MediaSelect": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "LaunchMail": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "LaunchApp2": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "LaunchApp1": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "SelectTask": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "LaunchScreenSaver": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserSearch": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserHome": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserBack": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserForward": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserStop": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserRefresh": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "BrowserFavorites": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MailReply": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MailForward": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" - }, - "MailSend": { - "value": "", - "withShift": "", - "withAltGr": "", - "withShiftAltGr": "" + Sleep: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + WakeUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KeyA: { + value: 'ф', + withShift: 'Ф', + withAltGr: 'ф', + withShiftAltGr: 'Ф' + }, + KeyB: { + value: 'и', + withShift: 'И', + withAltGr: 'и', + withShiftAltGr: 'И' + }, + KeyC: { + value: 'с', + withShift: 'С', + withAltGr: 'с', + withShiftAltGr: 'С' + }, + KeyD: { + value: 'в', + withShift: 'В', + withAltGr: 'в', + withShiftAltGr: 'В' + }, + KeyE: { + value: 'у', + withShift: 'У', + withAltGr: 'у', + withShiftAltGr: 'У' + }, + KeyF: { + value: 'а', + withShift: 'А', + withAltGr: 'а', + withShiftAltGr: 'А' + }, + KeyG: { + value: 'п', + withShift: 'П', + withAltGr: 'п', + withShiftAltGr: 'П' + }, + KeyH: { + value: 'р', + withShift: 'Р', + withAltGr: 'р', + withShiftAltGr: 'Р' + }, + KeyI: { + value: 'ш', + withShift: 'Ш', + withAltGr: 'ш', + withShiftAltGr: 'Ш' + }, + KeyJ: { + value: 'о', + withShift: 'О', + withAltGr: 'о', + withShiftAltGr: 'О' + }, + KeyK: { + value: 'л', + withShift: 'Л', + withAltGr: 'л', + withShiftAltGr: 'Л' + }, + KeyL: { + value: 'д', + withShift: 'Д', + withAltGr: 'д', + withShiftAltGr: 'Д' + }, + KeyM: { + value: 'ь', + withShift: 'Ь', + withAltGr: 'ь', + withShiftAltGr: 'Ь' + }, + KeyN: { + value: 'т', + withShift: 'Т', + withAltGr: 'т', + withShiftAltGr: 'Т' + }, + KeyO: { + value: 'щ', + withShift: 'Щ', + withAltGr: 'щ', + withShiftAltGr: 'Щ' + }, + KeyP: { + value: 'з', + withShift: 'З', + withAltGr: 'з', + withShiftAltGr: 'З' + }, + KeyQ: { + value: 'й', + withShift: 'Й', + withAltGr: 'й', + withShiftAltGr: 'Й' + }, + KeyR: { + value: 'к', + withShift: 'К', + withAltGr: 'к', + withShiftAltGr: 'К' + }, + KeyS: { + value: 'ы', + withShift: 'Ы', + withAltGr: 'ы', + withShiftAltGr: 'Ы' + }, + KeyT: { + value: 'е', + withShift: 'Е', + withAltGr: 'е', + withShiftAltGr: 'Е' + }, + KeyU: { + value: 'г', + withShift: 'Г', + withAltGr: 'г', + withShiftAltGr: 'Г' + }, + KeyV: { + value: 'м', + withShift: 'М', + withAltGr: 'м', + withShiftAltGr: 'М' + }, + KeyW: { + value: 'ц', + withShift: 'Ц', + withAltGr: 'ц', + withShiftAltGr: 'Ц' + }, + KeyX: { + value: 'ч', + withShift: 'Ч', + withAltGr: 'ч', + withShiftAltGr: 'Ч' + }, + KeyY: { + value: 'н', + withShift: 'Н', + withAltGr: 'н', + withShiftAltGr: 'Н' + }, + KeyZ: { + value: 'я', + withShift: 'Я', + withAltGr: 'я', + withShiftAltGr: 'Я' + }, + Digit1: { + value: '1', + withShift: '!', + withAltGr: '1', + withShiftAltGr: '!' + }, + Digit2: { + value: '2', + withShift: '"', + withAltGr: '2', + withShiftAltGr: '"' + }, + Digit3: { + value: '3', + withShift: '№', + withAltGr: '3', + withShiftAltGr: '№' + }, + Digit4: { + value: '4', + withShift: ';', + withAltGr: '4', + withShiftAltGr: ';' + }, + Digit5: { + value: '5', + withShift: '%', + withAltGr: '5', + withShiftAltGr: '%' + }, + Digit6: { + value: '6', + withShift: ':', + withAltGr: '6', + withShiftAltGr: ':' + }, + Digit7: { + value: '7', + withShift: '?', + withAltGr: '7', + withShiftAltGr: '?' + }, + Digit8: { + value: '8', + withShift: '*', + withAltGr: '8', + withShiftAltGr: '*' + }, + Digit9: { + value: '9', + withShift: '(', + withAltGr: '9', + withShiftAltGr: '(' + }, + Digit0: { + value: '0', + withShift: ')', + withAltGr: '0', + withShiftAltGr: ')' + }, + Enter: { + value: '\r', + withShift: '\r', + withAltGr: '\r', + withShiftAltGr: '\r' + }, + Escape: { + value: '\u001b', + withShift: '\u001b', + withAltGr: '\u001b', + withShiftAltGr: '\u001b' + }, + Backspace: { + value: '\b', + withShift: '\b', + withAltGr: '\b', + withShiftAltGr: '\b' + }, + Tab: { + value: '\t', + withShift: '', + withAltGr: '\t', + withShiftAltGr: '' + }, + Space: { + value: ' ', + withShift: ' ', + withAltGr: ' ', + withShiftAltGr: ' ' + }, + Minus: { + value: '-', + withShift: '_', + withAltGr: '-', + withShiftAltGr: '_' + }, + Equal: { + value: '=', + withShift: '+', + withAltGr: '=', + withShiftAltGr: '+' + }, + BracketLeft: { + value: 'х', + withShift: 'Х', + withAltGr: 'х', + withShiftAltGr: 'Х' + }, + BracketRight: { + value: 'ъ', + withShift: 'Ъ', + withAltGr: 'ъ', + withShiftAltGr: 'Ъ' + }, + Backslash: { + value: '\\', + withShift: '/', + withAltGr: '\\', + withShiftAltGr: '/' + }, + Semicolon: { + value: 'ж', + withShift: 'Ж', + withAltGr: 'ж', + withShiftAltGr: 'Ж' + }, + Quote: { + value: 'э', + withShift: 'Э', + withAltGr: 'э', + withShiftAltGr: 'Э' + }, + Backquote: { + value: 'ё', + withShift: 'Ё', + withAltGr: 'ё', + withShiftAltGr: 'Ё' + }, + Comma: { + value: 'б', + withShift: 'Б', + withAltGr: 'б', + withShiftAltGr: 'Б' + }, + Period: { + value: 'ю', + withShift: 'Ю', + withAltGr: 'ю', + withShiftAltGr: 'Ю' + }, + Slash: { + value: '.', + withShift: ',', + withAltGr: '.', + withShiftAltGr: ',' + }, + CapsLock: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F1: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F2: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F3: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F4: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F5: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F6: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F7: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F8: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F9: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F10: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F11: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F12: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PrintScreen: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ScrollLock: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Pause: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Insert: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Home: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Delete: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + End: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageDown: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowDown: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumLock: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadDivide: { + value: '/', + withShift: '/', + withAltGr: '/', + withShiftAltGr: '/' + }, + NumpadMultiply: { + value: '*', + withShift: '*', + withAltGr: '*', + withShiftAltGr: '*' + }, + NumpadSubtract: { + value: '-', + withShift: '-', + withAltGr: '-', + withShiftAltGr: '-' + }, + NumpadAdd: { + value: '+', + withShift: '+', + withAltGr: '+', + withShiftAltGr: '+' + }, + NumpadEnter: { + value: '\r', + withShift: '\r', + withAltGr: '\r', + withShiftAltGr: '\r' + }, + Numpad1: { + value: '', + withShift: '1', + withAltGr: '', + withShiftAltGr: '1' + }, + Numpad2: { + value: '', + withShift: '2', + withAltGr: '', + withShiftAltGr: '2' + }, + Numpad3: { + value: '', + withShift: '3', + withAltGr: '', + withShiftAltGr: '3' + }, + Numpad4: { + value: '', + withShift: '4', + withAltGr: '', + withShiftAltGr: '4' + }, + Numpad5: { + value: '', + withShift: '5', + withAltGr: '', + withShiftAltGr: '5' + }, + Numpad6: { + value: '', + withShift: '6', + withAltGr: '', + withShiftAltGr: '6' + }, + Numpad7: { + value: '', + withShift: '7', + withAltGr: '', + withShiftAltGr: '7' + }, + Numpad8: { + value: '', + withShift: '8', + withAltGr: '', + withShiftAltGr: '8' + }, + Numpad9: { + value: '', + withShift: '9', + withAltGr: '', + withShiftAltGr: '9' + }, + Numpad0: { + value: '', + withShift: '0', + withAltGr: '', + withShiftAltGr: '0' + }, + NumpadDecimal: { + value: '', + withShift: ',', + withAltGr: '', + withShiftAltGr: ',' + }, + IntlBackslash: { + value: '/', + withShift: '|', + withAltGr: '|', + withShiftAltGr: '¦' + }, + ContextMenu: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Power: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadEqual: { + value: '=', + withShift: '=', + withAltGr: '=', + withShiftAltGr: '=' + }, + F13: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F14: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F15: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F16: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F17: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F18: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F19: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F20: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F21: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F22: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F23: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F24: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Open: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Help: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Select: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Again: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Undo: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Cut: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Copy: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Paste: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Find: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeMute: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeDown: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadComma: { + value: '.', + withShift: '.', + withAltGr: '.', + withShiftAltGr: '.' + }, + IntlRo: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KanaMode: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlYen: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Convert: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NonConvert: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang1: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang2: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang3: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang4: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang5: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadParenLeft: { + value: '(', + withShift: '(', + withAltGr: '(', + withShiftAltGr: '(' + }, + NumpadParenRight: { + value: ')', + withShift: ')', + withAltGr: ')', + withShiftAltGr: ')' + }, + ControlLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaLeft: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ControlRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaRight: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrightnessUp: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrightnessDown: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaPlay: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaRecord: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaFastForward: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaRewind: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackNext: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackPrevious: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaStop: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Eject: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaPlayPause: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaSelect: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchMail: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp2: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp1: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + SelectTask: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchScreenSaver: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserSearch: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserHome: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserBack: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserForward: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserStop: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserRefresh: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserFavorites: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MailReply: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MailForward: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MailSend: { + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' } }); diff --git a/src/vs/workbench/services/label/common/labelService.ts b/src/vs/workbench/services/label/common/labelService.ts index 05b4c9776c2..326daa5057a 100644 --- a/src/vs/workbench/services/label/common/labelService.ts +++ b/src/vs/workbench/services/label/common/labelService.ts @@ -11,10 +11,9 @@ import { Emitter } from 'vs/base/common/event'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { Registry } from 'vs/platform/registry/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IWorkspaceContextService, IWorkspace, isWorkspace } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, IWorkspace, isWorkspace, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier, IWorkspaceIdentifier, toWorkspaceIdentifier, WORKSPACE_EXTENSION, isUntitledWorkspace } from 'vs/platform/workspace/common/workspace'; import { basenameOrAuthority, basename, joinPath, dirname } from 'vs/base/common/resources'; import { tildify, getPathLabel } from 'vs/base/common/labels'; -import { IWorkspaceIdentifier, WORKSPACE_EXTENSION, toWorkspaceIdentifier, isWorkspaceIdentifier, isUntitledWorkspace, isSingleFolderWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { ILabelService, ResourceLabelFormatter, ResourceLabelFormatting, IFormatterChangeEvent } from 'vs/platform/label/common/label'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { match } from 'vs/base/common/glob'; @@ -137,7 +136,7 @@ export class LabelService extends Disposable implements ILabelService { return bestResult ? bestResult.formatting : undefined; } - getUriLabel(resource: URI, options: { relative?: boolean, noPrefix?: boolean, endWithSeparator?: boolean, separator?: '/' | '\\' } = {}): string { + getUriLabel(resource: URI, options: { relative?: boolean; noPrefix?: boolean; endWithSeparator?: boolean; separator?: '/' | '\\' } = {}): string { let formatting = this.findFormatting(resource); if (formatting && options.separator) { // mixin separator if defined from the outside @@ -155,7 +154,7 @@ export class LabelService extends Disposable implements ILabelService { return label; } - private doGetUriLabel(resource: URI, formatting?: ResourceLabelFormatting, options: { relative?: boolean, noPrefix?: boolean, endWithSeparator?: boolean } = {}): string { + private doGetUriLabel(resource: URI, formatting?: ResourceLabelFormatting, options: { relative?: boolean; noPrefix?: boolean; endWithSeparator?: boolean } = {}): string { if (!formatting) { return getPathLabel(resource.path, { userHome: this.pathService.resolvedUserHome }, options.relative ? this.contextService : undefined); } diff --git a/src/vs/workbench/services/language/common/languageService.ts b/src/vs/workbench/services/language/common/languageService.ts index a78841aac44..f859c8d8ad7 100644 --- a/src/vs/workbench/services/language/common/languageService.ts +++ b/src/vs/workbench/services/language/common/languageService.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import { registerLanguageAssociation, clearLanguageAssociations } from 'vs/editor/common/services/languagesAssociations'; import { joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { ILanguageExtensionPoint, ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageExtensionPoint, ILanguageService } from 'vs/editor/common/languages/language'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/workbench/services/languageDetection/browser/languageDetectionWorkerServiceImpl.ts b/src/vs/workbench/services/languageDetection/browser/languageDetectionWorkerServiceImpl.ts index fa2e75f1ab0..3e90755f38a 100644 --- a/src/vs/workbench/services/languageDetection/browser/languageDetectionWorkerServiceImpl.ts +++ b/src/vs/workbench/services/languageDetection/browser/languageDetectionWorkerServiceImpl.ts @@ -8,7 +8,7 @@ import { ILanguageDetectionService, ILanguageDetectionStats, LanguageDetectionSt import { FileAccess } from 'vs/base/common/network'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { URI } from 'vs/base/common/uri'; import { isWeb } from 'vs/base/common/platform'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -102,11 +102,11 @@ export class LanguageDetectionWorkerHost { } async sendTelemetryEvent(languages: string[], confidences: number[], timeSpent: number): Promise { - type LanguageDetectionStats = { languages: string; confidences: string; timeSpent: number; }; + type LanguageDetectionStats = { languages: string; confidences: string; timeSpent: number }; type LanguageDetectionStatsClassification = { - languages: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - confidences: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - timeSpent: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + languages: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + confidences: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + timeSpent: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; this._telemetryService.publicLog2('automaticlanguagedetection.stats', { diff --git a/src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts b/src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts index 91e167fc240..785a95e6eb8 100644 --- a/src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts +++ b/src/vs/workbench/services/languageDetection/common/languageDetectionWorkerService.ts @@ -34,8 +34,8 @@ export interface IAutomaticLanguageDetectionLikelyWrongData { } export type AutomaticLanguageDetectionLikelyWrongClassification = { - currentLanguageId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }, - nextLanguageId: { classification: 'SystemMetaData', purpose: 'FeatureInsight' } + currentLanguageId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + nextLanguageId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; export const LanguageDetectionStatsId = 'automaticlanguagedetection.stats'; @@ -47,9 +47,9 @@ export interface ILanguageDetectionStats { } export type LanguageDetectionStatsClassification = { - languages: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - confidences: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - timeSpent: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + languages: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + confidences: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + timeSpent: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; //#endregion diff --git a/src/vs/workbench/services/languageStatus/common/languageStatusService.ts b/src/vs/workbench/services/languageStatus/common/languageStatusService.ts index 34f36fb894d..7f8bbc8ae19 100644 --- a/src/vs/workbench/services/languageStatus/common/languageStatusService.ts +++ b/src/vs/workbench/services/languageStatus/common/languageStatusService.ts @@ -10,8 +10,8 @@ import Severity from 'vs/base/common/severity'; import { compare } from 'vs/base/common/strings'; import { ITextModel } from 'vs/editor/common/model'; import { Command } from 'vs/editor/common/languages'; -import { LanguageFeatureRegistry } from 'vs/editor/common/languages/languageFeatureRegistry'; -import { LanguageSelector } from 'vs/editor/common/languages/languageSelector'; +import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry'; +import { LanguageSelector } from 'vs/editor/common/languageSelector'; import { IAccessibilityInformation } from 'vs/platform/accessibility/common/accessibility'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -30,7 +30,7 @@ export interface ILanguageStatus { } export interface ILanguageStatusProvider { - provideLanguageStatus(langId: string, token: CancellationToken): Promise + provideLanguageStatus(langId: string, token: CancellationToken): Promise; } export const ILanguageStatusService = createDecorator('ILanguageStatusService'); diff --git a/src/vs/workbench/services/layout/browser/layoutService.ts b/src/vs/workbench/services/layout/browser/layoutService.ts index 10b30b72e08..e6b685455d5 100644 --- a/src/vs/workbench/services/layout/browser/layoutService.ts +++ b/src/vs/workbench/services/layout/browser/layoutService.ts @@ -46,7 +46,7 @@ export function positionToString(position: Position): string { } } -const positionsByString: { [key: string]: Position; } = { +const positionsByString: { [key: string]: Position } = { [positionToString(Position.LEFT)]: Position.LEFT, [positionToString(Position.RIGHT)]: Position.RIGHT, [positionToString(Position.BOTTOM)]: Position.BOTTOM @@ -65,7 +65,7 @@ export function panelOpensMaximizedSettingToString(setting: PanelOpensMaximizedO } } -const panelOpensMaximizedByString: { [key: string]: PanelOpensMaximizedOptions; } = { +const panelOpensMaximizedByString: { [key: string]: PanelOpensMaximizedOptions } = { [panelOpensMaximizedSettingToString(PanelOpensMaximizedOptions.ALWAYS)]: PanelOpensMaximizedOptions.ALWAYS, [panelOpensMaximizedSettingToString(PanelOpensMaximizedOptions.NEVER)]: PanelOpensMaximizedOptions.NEVER, [panelOpensMaximizedSettingToString(PanelOpensMaximizedOptions.REMEMBER_LAST)]: PanelOpensMaximizedOptions.REMEMBER_LAST @@ -99,6 +99,16 @@ export interface IWorkbenchLayoutService extends ILayoutService { */ readonly onDidChangeCenteredLayout: Event; + /* + * Emit when panel position changes. + */ + readonly onDidChangePanelPosition: Event; + + /** + * Emit when panel alignment changes. + */ + readonly onDidChangePanelAlignment: Event; + /** * Emit when part visibility changes */ @@ -196,6 +206,21 @@ export interface IWorkbenchLayoutService extends ILayoutService { */ toggleMenuBar(): void; + /* + * Gets the current panel position. Note that the panel can be hidden too. + */ + getPanelPosition(): Position; + + /** + * Sets the panel position. + */ + setPanelPosition(position: Position): void; + + /** + * Gets the panel alignement. + */ + getPanelAlignment(): PanelAlignment; + /** * Sets the panel alignment. */ diff --git a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts index 16df7472178..fd8ddc3bd21 100644 --- a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts @@ -33,7 +33,7 @@ export class NativeLifecycleService extends AbstractLifecycleService { const windowId = this.nativeHostService.windowId; // Main side indicates that window is about to unload, check for vetos - ipcRenderer.on('vscode:onBeforeUnload', async (event: unknown, reply: { okChannel: string, cancelChannel: string, reason: ShutdownReason }) => { + ipcRenderer.on('vscode:onBeforeUnload', async (event: unknown, reply: { okChannel: string; cancelChannel: string; reason: ShutdownReason }) => { this.logService.trace(`[lifecycle] onBeforeUnload (reason: ${reply.reason})`); // trigger onBeforeShutdown events and veto collecting @@ -56,7 +56,7 @@ export class NativeLifecycleService extends AbstractLifecycleService { }); // Main side indicates that we will indeed shutdown - ipcRenderer.on('vscode:onWillUnload', async (event: unknown, reply: { replyChannel: string, reason: ShutdownReason }) => { + ipcRenderer.on('vscode:onWillUnload', async (event: unknown, reply: { replyChannel: string; reason: ShutdownReason }) => { this.logService.trace(`[lifecycle] onWillUnload (reason: ${reply.reason})`); // trigger onWillShutdown events and joining diff --git a/src/vs/workbench/services/model/common/modelService.ts b/src/vs/workbench/services/model/common/modelService.ts index 72199c1c35d..e72f0272a98 100644 --- a/src/vs/workbench/services/model/common/modelService.ts +++ b/src/vs/workbench/services/model/common/modelService.ts @@ -7,7 +7,7 @@ import { URI } from 'vs/base/common/uri'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { IModelService } from 'vs/editor/common/services/model'; import { ModelService } from 'vs/editor/common/services/modelService'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfiguration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -15,6 +15,8 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; +import { ILanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; export class WorkbenchModelService extends ModelService { constructor( @@ -25,9 +27,11 @@ export class WorkbenchModelService extends ModelService { @IUndoRedoService undoRedoService: IUndoRedoService, @ILanguageConfigurationService languageConfigurationService: ILanguageConfigurationService, @ILanguageService languageService: ILanguageService, + @ILanguageFeatureDebounceService languageFeatureDebounceService: ILanguageFeatureDebounceService, + @ILanguageFeaturesService languageFeaturesService: ILanguageFeaturesService, @IPathService private readonly _pathService: IPathService, ) { - super(configurationService, resourcePropertiesService, themeService, logService, undoRedoService, languageService, languageConfigurationService); + super(configurationService, resourcePropertiesService, themeService, logService, undoRedoService, languageService, languageConfigurationService, languageFeatureDebounceService, languageFeaturesService); } protected override _schemaShouldMaintainUndoRedoElements(resource: URI) { diff --git a/src/vs/workbench/services/outline/browser/outline.ts b/src/vs/workbench/services/outline/browser/outline.ts index 1511850d7dc..022a6004f26 100644 --- a/src/vs/workbench/services/outline/browser/outline.ts +++ b/src/vs/workbench/services/outline/browser/outline.ts @@ -9,6 +9,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Event } from 'vs/base/common/event'; import { FuzzyScore } from 'vs/base/common/filters'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchDataTreeOptions } from 'vs/platform/list/browser/listService'; @@ -68,11 +69,13 @@ export interface IOutlineListConfig { } export interface OutlineChangeEvent { - affectOnlyActiveElement?: true + affectOnlyActiveElement?: true; } export interface IOutline { + readonly uri: URI | undefined; + readonly config: IOutlineListConfig; readonly outlineKind: string; diff --git a/src/vs/workbench/services/panecomposite/browser/panecomposite.ts b/src/vs/workbench/services/panecomposite/browser/panecomposite.ts index e25a1264be4..4aa8d7627fb 100644 --- a/src/vs/workbench/services/panecomposite/browser/panecomposite.ts +++ b/src/vs/workbench/services/panecomposite/browser/panecomposite.ts @@ -18,8 +18,8 @@ export interface IPaneCompositePartService { readonly _serviceBrand: undefined; - readonly onDidPaneCompositeOpen: Event<{ composite: IPaneComposite, viewContainerLocation: ViewContainerLocation }>; - readonly onDidPaneCompositeClose: Event<{ composite: IPaneComposite, viewContainerLocation: ViewContainerLocation }>; + readonly onDidPaneCompositeOpen: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation }>; + readonly onDidPaneCompositeClose: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation }>; /** * Opens a viewlet with the given identifier and pass keyboard focus to it if specified. diff --git a/src/vs/workbench/services/path/common/pathService.ts b/src/vs/workbench/services/path/common/pathService.ts index 8261fca7925..5f407090cbe 100644 --- a/src/vs/workbench/services/path/common/pathService.ts +++ b/src/vs/workbench/services/path/common/pathService.ts @@ -10,7 +10,7 @@ import { OperatingSystem, OS } from 'vs/base/common/platform'; import { basename } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { getVirtualWorkspaceScheme } from 'vs/platform/remote/common/remoteHosts'; +import { getVirtualWorkspaceScheme } from 'vs/platform/workspace/common/virtualWorkspace'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; diff --git a/src/vs/workbench/services/preferences/browser/keybindingsEditorModel.ts b/src/vs/workbench/services/preferences/browser/keybindingsEditorModel.ts index f79e5fa376f..e7ee5f84ee8 100644 --- a/src/vs/workbench/services/preferences/browser/keybindingsEditorModel.ts +++ b/src/vs/workbench/services/preferences/browser/keybindingsEditorModel.ts @@ -157,6 +157,7 @@ export class KeybindingsEditorModel extends EditorModel { const keybindingItem = new ResolvedKeybindingItem(undefined, command, null, undefined, commandsWithDefaultKeybindings.indexOf(command) === -1, null, false); this._keybindingItemsSortedByPrecedence.push(KeybindingsEditorModel.toKeybindingEntry(command, keybindingItem, workbenchActionsRegistry, actionLabels)); } + this._keybindingItemsSortedByPrecedence = distinct(this._keybindingItemsSortedByPrecedence, keybindingItem => KeybindingsEditorModel.getId(keybindingItem)); this._keybindingItems = this._keybindingItemsSortedByPrecedence.slice(0).sort((a, b) => KeybindingsEditorModel.compareKeybindingData(a, b)); return super.resolve(); diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 822a3501276..d68f95d4f76 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -9,12 +9,12 @@ import { parse } from 'vs/base/common/json'; import { Disposable } from 'vs/base/common/lifecycle'; import * as network from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreEditingCommands } from 'vs/editor/browser/coreCommands'; import { getCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IPosition } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import * as nls from 'vs/nls'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -292,7 +292,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic async openGlobalKeybindingSettings(textual: boolean, options?: IKeybindingsEditorOptions): Promise { type OpenKeybindingsClassification = { - textual: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + textual: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; this.telemetryService.publicLog2<{ textual: boolean }, OpenKeybindingsClassification>('openKeybindings', { textual }); diff --git a/src/vs/workbench/services/preferences/common/preferences.ts b/src/vs/workbench/services/preferences/common/preferences.ts index a4d4f019501..7b8c9cbc518 100644 --- a/src/vs/workbench/services/preferences/common/preferences.ts +++ b/src/vs/workbench/services/preferences/common/preferences.ts @@ -71,9 +71,9 @@ export interface ISetting { type?: string | string[]; order?: number; arrayItemType?: string; - objectProperties?: IJSONSchemaMap, - objectPatternProperties?: IJSONSchemaMap, - objectAdditionalProperties?: boolean | IJSONSchema, + objectProperties?: IJSONSchemaMap; + objectPatternProperties?: IJSONSchemaMap; + objectAdditionalProperties?: boolean | IJSONSchema; enum?: string[]; enumDescriptions?: string[]; enumDescriptionsAreMarkdown?: boolean; @@ -170,7 +170,7 @@ export interface IPreferencesEditorModel { } export type IGroupFilter = (group: ISettingsGroup) => boolean | null; -export type ISettingMatcher = (setting: ISetting, group: ISettingsGroup) => { matches: IRange[], matchType: SettingMatchType, score: number } | null; +export type ISettingMatcher = (setting: ISetting, group: ISettingsGroup) => { matches: IRange[]; matchType: SettingMatchType; score: number } | null; export interface ISettingsEditorModel extends IPreferencesEditorModel { readonly onDidChangeGroups: Event; diff --git a/src/vs/workbench/services/preferences/common/preferencesModels.ts b/src/vs/workbench/services/preferences/common/preferencesModels.ts index 87b75e27e1f..d9a1217ef07 100644 --- a/src/vs/workbench/services/preferences/common/preferencesModels.ts +++ b/src/vs/workbench/services/preferences/common/preferencesModels.ts @@ -11,7 +11,8 @@ import { Disposable, IReference } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IRange, Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IIdentifiedSingleEditOperation, ITextModel } from 'vs/editor/common/model'; +import { ITextModel } from 'vs/editor/common/model'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { ITextEditorModel } from 'vs/editor/common/services/resolverService'; import * as nls from 'vs/nls'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -628,7 +629,7 @@ export class DefaultSettings extends Disposable { return result; } - private parseSettings(settingsObject: { [path: string]: IConfigurationPropertySchema; }, extensionInfo?: IExtensionInfo): ISetting[] { + private parseSettings(settingsObject: { [path: string]: IConfigurationPropertySchema }, extensionInfo?: IExtensionInfo): ISetting[] { const result: ISetting[] = []; for (const key in settingsObject) { const prop = settingsObject[key]; @@ -828,7 +829,7 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements /** * Translate the ISearchResultGroups to text, and write it to the editor model */ - private writeResultGroups(groups: ISearchResultGroup[], startLine: number): { matches: IRange[], settingsGroups: ISettingsGroup[] } { + private writeResultGroups(groups: ISearchResultGroup[], startLine: number): { matches: IRange[]; settingsGroups: ISettingsGroup[] } { const contentBuilderOffset = startLine - 1; const builder = new SettingsContentBuilder(contentBuilderOffset); @@ -847,11 +848,10 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements const groupContent = builder.getContent() + '\n'; const groupEndLine = this._model.getLineCount(); const cursorPosition = new Selection(startLine, 1, startLine, 1); - const edit: IIdentifiedSingleEditOperation = { + const edit: ISingleEditOperation = { text: groupContent, forceMoveMarkers: true, - range: new Range(startLine, 1, groupEndLine, 1), - identifier: { major: 1, minor: 0 } + range: new Range(startLine, 1, groupEndLine, 1) }; this._model.pushEditOperations([cursorPosition], [edit], () => [cursorPosition]); diff --git a/src/vs/workbench/services/preferences/common/preferencesValidation.ts b/src/vs/workbench/services/preferences/common/preferencesValidation.ts index b722a3cee43..14772a9ee3a 100644 --- a/src/vs/workbench/services/preferences/common/preferencesValidation.ts +++ b/src/vs/workbench/services/preferences/common/preferencesValidation.ts @@ -9,7 +9,7 @@ import { Color } from 'vs/base/common/color'; import { isArray, isObject, isUndefinedOrNull, isString, isStringArray } from 'vs/base/common/types'; import { IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; -type Validator = { enabled: boolean, isValid: (value: T) => boolean; message: string }; +type Validator = { enabled: boolean; isValid: (value: T) => boolean; message: string }; function canBeType(propTypes: (string | undefined)[], ...types: JSONSchemaType[]): boolean { return types.some(t => propTypes.includes(t)); @@ -122,12 +122,12 @@ function getStringValidators(prop: IConfigurationPropertySchema) { return [ { enabled: prop.maxLength !== undefined, - isValid: ((value: { length: number; }) => value.length <= prop.maxLength!), + isValid: ((value: { length: number }) => value.length <= prop.maxLength!), message: nls.localize('validations.maxLength', "Value must be {0} or fewer characters long.", prop.maxLength) }, { enabled: prop.minLength !== undefined, - isValid: ((value: { length: number; }) => value.length >= prop.minLength!), + isValid: ((value: { length: number }) => value.length >= prop.minLength!), message: nls.localize('validations.minLength', "Value must be {0} or more characters long.", prop.minLength) }, { diff --git a/src/vs/workbench/services/preferences/test/browser/keybindingsEditorModel.test.ts b/src/vs/workbench/services/preferences/test/browser/keybindingsEditorModel.test.ts index dfc0c0814bf..1e540920f00 100644 --- a/src/vs/workbench/services/preferences/test/browser/keybindingsEditorModel.test.ts +++ b/src/vs/workbench/services/preferences/test/browser/keybindingsEditorModel.test.ts @@ -63,6 +63,18 @@ suite('KeybindingsEditorModel', () => { assertKeybindingItems(actuals, expected); }); + test('fetch returns distinct keybindings', async () => { + const command = 'a' + uuid.generateUuid(); + const expected = prepareKeybindingService( + aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape } }), + aResolvedKeybindingItem({ command, firstPart: { keyCode: KeyCode.Escape } }), + ); + + await testObject.resolve(new Map()); + const actuals = asResolvedKeybindingItems(testObject.fetch('')); + assertKeybindingItems(actuals, [expected[0]]); + }); + test('fetch returns default keybindings at the top', async () => { const expected = prepareKeybindingService( aResolvedKeybindingItem({ command: 'a' + uuid.generateUuid(), firstPart: { keyCode: KeyCode.Escape } }), @@ -694,8 +706,8 @@ suite('KeybindingsEditorModel', () => { } } - function aResolvedKeybindingItem({ command, when, isDefault, firstPart, chordPart }: { command?: string, when?: string, isDefault?: boolean, firstPart?: { keyCode: KeyCode, modifiers?: Modifiers }, chordPart?: { keyCode: KeyCode, modifiers?: Modifiers } }): ResolvedKeybindingItem { - const aSimpleKeybinding = function (part: { keyCode: KeyCode, modifiers?: Modifiers }): SimpleKeybinding { + function aResolvedKeybindingItem({ command, when, isDefault, firstPart, chordPart }: { command?: string; when?: string; isDefault?: boolean; firstPart?: { keyCode: KeyCode; modifiers?: Modifiers }; chordPart?: { keyCode: KeyCode; modifiers?: Modifiers } }): ResolvedKeybindingItem { + const aSimpleKeybinding = function (part: { keyCode: KeyCode; modifiers?: Modifiers }): SimpleKeybinding { const { ctrlKey, shiftKey, altKey, metaKey } = part.modifiers || { ctrlKey: false, shiftKey: false, altKey: false, metaKey: false }; return new SimpleKeybinding(ctrlKey!, shiftKey!, altKey!, metaKey!, part.keyCode); }; diff --git a/src/vs/workbench/services/progress/browser/progressIndicator.ts b/src/vs/workbench/services/progress/browser/progressIndicator.ts index 4f948aca0eb..7190ea1d7f6 100644 --- a/src/vs/workbench/services/progress/browser/progressIndicator.ts +++ b/src/vs/workbench/services/progress/browser/progressIndicator.ts @@ -3,6 +3,7 @@ * 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 { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { IProgressRunner, IProgressIndicator, emptyProgressRunner } from 'vs/platform/progress/common/progress'; @@ -11,60 +12,13 @@ import { IViewsService } from 'vs/workbench/common/views'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { GroupModelChangeKind } from 'vs/workbench/common/editor'; -class ProgressBarIndicator extends Disposable implements IProgressIndicator { - - constructor(protected progressbar: ProgressBar) { - super(); - } - - show(infinite: true, delay?: number): IProgressRunner; - show(total: number, delay?: number): IProgressRunner; - show(infiniteOrTotal: true | number, delay?: number): IProgressRunner { - if (typeof infiniteOrTotal === 'boolean') { - this.progressbar.infinite().show(delay); - } else { - this.progressbar.total(infiniteOrTotal).show(delay); - } - - return { - total: (total: number) => { - this.progressbar.total(total); - }, - - worked: (worked: number) => { - if (this.progressbar.hasTotal()) { - this.progressbar.worked(worked); - } else { - this.progressbar.infinite().show(); - } - }, - - done: () => { - this.progressbar.stop().hide(); - } - }; - } - - async showWhile(promise: Promise, delay?: number): Promise { - try { - this.progressbar.infinite().show(delay); - - await promise; - } catch (error) { - // ignore - } finally { - this.progressbar.stop().hide(); - } - } -} - -export class EditorProgressIndicator extends ProgressBarIndicator { +export class EditorProgressIndicator extends Disposable implements IProgressIndicator { constructor( - progressBar: ProgressBar, + private readonly progressBar: ProgressBar, private readonly group: IEditorGroupView ) { - super(progressBar); + super(); this.registerListeners(); } @@ -80,14 +34,14 @@ export class EditorProgressIndicator extends ProgressBarIndicator { e.kind === GroupModelChangeKind.EDITOR_ACTIVE || (e.kind === GroupModelChangeKind.EDITOR_CLOSE && this.group.isEmpty) ) { - this.progressbar.stop().hide(); + this.progressBar.stop().hide(); } })); } - override show(infinite: true, delay?: number): IProgressRunner; - override show(total: number, delay?: number): IProgressRunner; - override show(infiniteOrTotal: true | number, delay?: number): IProgressRunner { + show(infinite: true, delay?: number): IProgressRunner; + show(total: number, delay?: number): IProgressRunner; + show(infiniteOrTotal: true | number, delay?: number): IProgressRunner { // No editor open: ignore any progress reporting if (this.group.isEmpty) { @@ -95,13 +49,41 @@ export class EditorProgressIndicator extends ProgressBarIndicator { } if (infiniteOrTotal === true) { - return super.show(true, delay); + return this.doShow(true, delay); } - return super.show(infiniteOrTotal, delay); + return this.doShow(infiniteOrTotal, delay); } - override async showWhile(promise: Promise, delay?: number): Promise { + private doShow(infinite: true, delay?: number): IProgressRunner; + private doShow(total: number, delay?: number): IProgressRunner; + private doShow(infiniteOrTotal: true | number, delay?: number): IProgressRunner { + if (typeof infiniteOrTotal === 'boolean') { + this.progressBar.infinite().show(delay); + } else { + this.progressBar.total(infiniteOrTotal).show(delay); + } + + return { + total: (total: number) => { + this.progressBar.total(total); + }, + + worked: (worked: number) => { + if (this.progressBar.hasTotal()) { + this.progressBar.worked(worked); + } else { + this.progressBar.infinite().show(); + } + }, + + done: () => { + this.progressBar.stop().hide(); + } + }; + } + + async showWhile(promise: Promise, delay?: number): Promise { // No editor open: ignore any progress reporting if (this.group.isEmpty) { @@ -112,7 +94,19 @@ export class EditorProgressIndicator extends ProgressBarIndicator { } } - return super.showWhile(promise, delay); + return this.doShowWhile(promise, delay); + } + + private async doShowWhile(promise: Promise, delay?: number): Promise { + try { + this.progressBar.infinite().show(delay); + + await promise; + } catch (error) { + // ignore + } finally { + this.progressBar.stop().hide(); + } } } @@ -159,64 +153,43 @@ namespace ProgressIndicatorState { | Work; } -export abstract class CompositeScope extends Disposable { +interface IProgressScope { + + /** + * Fired whenever `isActive` value changed. + */ + readonly onDidChangeActive: Event; + + /** + * Whether progress should be active or not. + */ + readonly isActive: boolean; +} + +class ScopedProgressIndicator extends Disposable implements IProgressIndicator { + + private progressState: ProgressIndicatorState.State = ProgressIndicatorState.None; constructor( - private paneCompositeService: IPaneCompositePartService, - private viewsService: IViewsService, - private scopeId: string + private readonly progressBar: ProgressBar, + private readonly scope: IProgressScope ) { super(); this.registerListeners(); } - registerListeners(): void { - this._register(this.viewsService.onDidChangeViewVisibility(e => e.visible ? this.onScopeOpened(e.id) : this.onScopeClosed(e.id))); - - this._register(this.paneCompositeService.onDidPaneCompositeOpen(e => this.onScopeOpened(e.composite.getId()))); - this._register(this.paneCompositeService.onDidPaneCompositeClose(e => this.onScopeClosed(e.composite.getId()))); + registerListeners() { + this._register(this.scope.onDidChangeActive(() => { + if (this.scope.isActive) { + this.onDidScopeActivate(); + } else { + this.onDidScopeDeactivate(); + } + })); } - private onScopeClosed(scopeId: string) { - if (scopeId === this.scopeId) { - this.onScopeDeactivated(); - } - } - - private onScopeOpened(scopeId: string) { - if (scopeId === this.scopeId) { - this.onScopeActivated(); - } - } - - abstract onScopeActivated(): void; - - abstract onScopeDeactivated(): void; -} - -export class CompositeProgressIndicator extends CompositeScope implements IProgressIndicator { - - private progressState: ProgressIndicatorState.State = ProgressIndicatorState.None; - - constructor( - private readonly progressbar: ProgressBar, - scopeId: string, - private isActive: boolean, - @IPaneCompositePartService paneCompositeService: IPaneCompositePartService, - @IViewsService viewsService: IViewsService - ) { - super(paneCompositeService, viewsService, scopeId); - } - - onScopeDeactivated(): void { - this.isActive = false; - - this.progressbar.stop().hide(); - } - - onScopeActivated(): void { - this.isActive = true; + private onDidScopeActivate(): void { // Return early if progress state indicates that progress is done if (this.progressState.type === ProgressIndicatorState.Done.type) { @@ -238,21 +211,25 @@ export class CompositeProgressIndicator extends CompositeScope implements IProgr // Replay Infinite Progress else if (this.progressState.type === ProgressIndicatorState.Type.Infinite) { - this.progressbar.infinite().show(); + this.progressBar.infinite().show(); } // Replay Finite Progress (Total & Worked) else if (this.progressState.type === ProgressIndicatorState.Type.Work) { if (this.progressState.total) { - this.progressbar.total(this.progressState.total).show(); + this.progressBar.total(this.progressState.total).show(); } if (this.progressState.worked) { - this.progressbar.worked(this.progressState.worked).show(); + this.progressBar.worked(this.progressState.worked).show(); } } } + private onDidScopeDeactivate(): void { + this.progressBar.stop().hide(); + } + show(infinite: true, delay?: number): IProgressRunner; show(total: number, delay?: number): IProgressRunner; show(infiniteOrTotal: true | number, delay?: number): IProgressRunner { @@ -265,16 +242,16 @@ export class CompositeProgressIndicator extends CompositeScope implements IProgr } // Active: Show Progress - if (this.isActive) { + if (this.scope.isActive) { // Infinite: Start Progressbar and Show after Delay if (this.progressState.type === ProgressIndicatorState.Type.Infinite) { - this.progressbar.infinite().show(delay); + this.progressBar.infinite().show(delay); } // Finite: Start Progressbar and Show after Delay else if (this.progressState.type === ProgressIndicatorState.Type.Work && typeof this.progressState.total === 'number') { - this.progressbar.total(this.progressState.total).show(delay); + this.progressBar.total(this.progressState.total).show(delay); } } @@ -284,36 +261,36 @@ export class CompositeProgressIndicator extends CompositeScope implements IProgr total, this.progressState.type === ProgressIndicatorState.Type.Work ? this.progressState.worked : undefined); - if (this.isActive) { - this.progressbar.total(total); + if (this.scope.isActive) { + this.progressBar.total(total); } }, worked: (worked: number) => { // Verify first that we are either not active or the progressbar has a total set - if (!this.isActive || this.progressbar.hasTotal()) { + if (!this.scope.isActive || this.progressBar.hasTotal()) { this.progressState = new ProgressIndicatorState.Work( this.progressState.type === ProgressIndicatorState.Type.Work ? this.progressState.total : undefined, this.progressState.type === ProgressIndicatorState.Type.Work && typeof this.progressState.worked === 'number' ? this.progressState.worked + worked : worked); - if (this.isActive) { - this.progressbar.worked(worked); + if (this.scope.isActive) { + this.progressBar.worked(worked); } } // Otherwise the progress bar does not support worked(), we fallback to infinite() progress else { this.progressState = ProgressIndicatorState.Infinite; - this.progressbar.infinite().show(); + this.progressBar.infinite().show(); } }, done: () => { this.progressState = ProgressIndicatorState.Done; - if (this.isActive) { - this.progressbar.stop().hide(); + if (this.scope.isActive) { + this.progressBar.stop().hide(); } } }; @@ -343,8 +320,8 @@ export class CompositeProgressIndicator extends CompositeScope implements IProgr // The while promise is either null or equal the promise we last hooked on this.progressState = ProgressIndicatorState.None; - if (this.isActive) { - this.progressbar.stop().hide(); + if (this.scope.isActive) { + this.progressBar.stop().hide(); } } } @@ -353,8 +330,66 @@ export class CompositeProgressIndicator extends CompositeScope implements IProgr private doShowWhile(delay?: number): void { // Show Progress when active - if (this.isActive) { - this.progressbar.infinite().show(delay); + if (this.scope.isActive) { + this.progressBar.infinite().show(delay); } } } + +export class CompositeProgressScope extends Disposable implements IProgressScope { + + private readonly _onDidChangeActive = this._register(new Emitter()); + readonly onDidChangeActive = this._onDidChangeActive.event; + + get isActive() { return this._isActive; } + + constructor( + private paneCompositeService: IPaneCompositePartService, + private viewsService: IViewsService, + private scopeId: string, + private _isActive: boolean + ) { + super(); + + this.registerListeners(); + } + + registerListeners(): void { + this._register(this.viewsService.onDidChangeViewVisibility(e => e.visible ? this.onScopeOpened(e.id) : this.onScopeClosed(e.id))); + + this._register(this.paneCompositeService.onDidPaneCompositeOpen(e => this.onScopeOpened(e.composite.getId()))); + this._register(this.paneCompositeService.onDidPaneCompositeClose(e => this.onScopeClosed(e.composite.getId()))); + } + + private onScopeOpened(scopeId: string) { + if (scopeId === this.scopeId) { + if (!this._isActive) { + this._isActive = true; + + this._onDidChangeActive.fire(); + } + } + } + + private onScopeClosed(scopeId: string) { + if (scopeId === this.scopeId) { + if (this._isActive) { + this._isActive = false; + + this._onDidChangeActive.fire(); + } + } + } +} + +export class CompositeProgressIndicator extends ScopedProgressIndicator { + constructor( + progressbar: ProgressBar, + scopeId: string, + isActive: boolean, + @IPaneCompositePartService paneCompositeService: IPaneCompositePartService, + @IViewsService viewsService: IViewsService + ) { + super(progressbar, new CompositeProgressScope(paneCompositeService, viewsService, scopeId, isActive)); + } +} diff --git a/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts b/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts index 72c3ae82075..c2090d6a4b8 100644 --- a/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts +++ b/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts @@ -5,12 +5,11 @@ import * as assert from 'assert'; import { IEditorControl } from 'vs/workbench/common/editor'; -import { CompositeScope, CompositeProgressIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; +import { CompositeProgressScope, CompositeProgressIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; import { TestSideBarPart, TestViewsService, TestPaneCompositeService } from 'vs/workbench/test/browser/workbenchTestServices'; import { Event } from 'vs/base/common/event'; -import { IView, IViewPaneContainer, IViewsService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { IView, IViewPaneContainer, ViewContainerLocation } from 'vs/workbench/common/views'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; -import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; class TestViewlet implements IPaneComposite { @@ -30,17 +29,6 @@ class TestViewlet implements IPaneComposite { saveState(): void { } } -class TestCompositeScope extends CompositeScope { - isActive: boolean = false; - - constructor(paneCompositeService: IPaneCompositePartService, viewsService: IViewsService, scopeId: string) { - super(paneCompositeService, viewsService, scopeId); - } - - onScopeActivated() { this.isActive = true; } - onScopeDeactivated() { this.isActive = false; } -} - class TestProgressBar { fTotal: number = 0; fWorked: number = 0; @@ -101,7 +89,7 @@ suite('Progress Indicator', () => { test('CompositeScope', () => { let paneCompositeService = new TestPaneCompositeService(); let viewsService = new TestViewsService(); - let service = new TestCompositeScope(paneCompositeService, viewsService, 'test.scopeId'); + let service = new CompositeProgressScope(paneCompositeService, viewsService, 'test.scopeId', false); const testViewlet = new TestViewlet('test.scopeId'); assert(!service.isActive); diff --git a/src/vs/workbench/services/remote/browser/remoteAgentService.ts b/src/vs/workbench/services/remote/browser/remoteAgentService.ts index e3406ca12fa..611d483cf1b 100644 --- a/src/vs/workbench/services/remote/browser/remoteAgentService.ts +++ b/src/vs/workbench/services/remote/browser/remoteAgentService.ts @@ -49,9 +49,9 @@ class RemoteConnectionFailureNotificationContribution implements IWorkbenchContr .then(undefined, (err) => { type RemoteConnectionFailureClassification = { - web: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - remoteName: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - message: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + web: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + remoteName: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + message: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type RemoteConnectionFailureEvent = { web: boolean; diff --git a/src/vs/workbench/services/remote/common/remoteExplorerService.ts b/src/vs/workbench/services/remote/common/remoteExplorerService.ts index da201ae4735..474747c2282 100644 --- a/src/vs/workbench/services/remote/common/remoteExplorerService.ts +++ b/src/vs/workbench/services/remote/common/remoteExplorerService.ts @@ -8,11 +8,11 @@ import { Event, Emitter } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { ALL_INTERFACES_ADDRESSES, isAllInterfaces, isLocalhost, ITunnelService, LOCALHOST_ADDRESSES, PortAttributesProvider, ProvidedOnAutoForward, ProvidedPortAttributes, RemoteTunnel, TunnelPrivacy, TunnelPrivacyId, TunnelProtocol } from 'vs/platform/remote/common/tunnel'; +import { ALL_INTERFACES_ADDRESSES, isAllInterfaces, isLocalhost, ITunnelService, LOCALHOST_ADDRESSES, PortAttributesProvider, ProvidedOnAutoForward, ProvidedPortAttributes, RemoteTunnel, TunnelPrivacyId, TunnelProtocol } from 'vs/platform/tunnel/common/tunnel'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IEditableData } from 'vs/workbench/common/views'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TunnelInformation, TunnelDescription, IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { TunnelInformation, TunnelDescription, IRemoteAuthorityResolverService, TunnelPrivacy } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection'; import { isNumber, isObject, isString } from 'vs/base/common/types'; @@ -54,8 +54,8 @@ export interface ITunnelItem { name?: string; closeable?: boolean; source: { - source: TunnelSource, - description: string + source: TunnelSource; + description: string; }; privacy: TunnelPrivacy; processDescription?: string; @@ -70,15 +70,15 @@ export enum TunnelEditId { } interface TunnelProperties { - remote: { host: string, port: number }, - local?: number, - name?: string, + remote: { host: string; port: number }; + local?: number; + name?: string; source?: { - source: TunnelSource, - description: string - }, - elevateIfNeeded?: boolean, - privacy?: string + source: TunnelSource; + description: string; + }; + elevateIfNeeded?: boolean; + privacy?: string; } export enum TunnelSource { @@ -110,8 +110,8 @@ export interface Tunnel { hasRunningProcess?: boolean; pid: number | undefined; source: { - source: TunnelSource, - description: string + source: TunnelSource; + description: string; }; } @@ -119,8 +119,8 @@ export function makeAddress(host: string, port: number): string { return host + ':' + port; } -export function parseAddress(address: string): { host: string, port: number } | undefined { - const matches = address.match(/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\:|localhost:|[a-zA-Z\-]+:)?([0-9]+)$/); +export function parseAddress(address: string): { host: string; port: number } | undefined { + const matches = address.match(/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*:)?([0-9]+)$/); if (!matches) { return undefined; } @@ -177,15 +177,15 @@ export enum OnPortForward { export interface Attributes { label: string | undefined; - onAutoForward: OnPortForward | undefined, + onAutoForward: OnPortForward | undefined; elevateIfNeeded: boolean | undefined; requireLocalPort: boolean | undefined; protocol: TunnelProtocol | undefined; } -interface PortRange { start: number, end: number } +interface PortRange { start: number; end: number } -interface HostAndPort { host: string, port: number } +interface HostAndPort { host: string; port: number } interface PortAttributes extends Attributes { key: number | PortRange | RegExp | HostAndPort; @@ -408,14 +408,14 @@ export class TunnelModel extends Disposable { private remoteTunnels: Map; private _onForwardPort: Emitter = new Emitter(); public onForwardPort: Event = this._onForwardPort.event; - private _onClosePort: Emitter<{ host: string, port: number }> = new Emitter(); - public onClosePort: Event<{ host: string, port: number }> = this._onClosePort.event; - private _onPortName: Emitter<{ host: string, port: number }> = new Emitter(); - public onPortName: Event<{ host: string, port: number }> = this._onPortName.event; + private _onClosePort: Emitter<{ host: string; port: number }> = new Emitter(); + public onClosePort: Event<{ host: string; port: number }> = this._onClosePort.event; + private _onPortName: Emitter<{ host: string; port: number }> = new Emitter(); + public onPortName: Event<{ host: string; port: number }> = this._onPortName.event; private _candidates: Map | undefined; - private _onCandidatesChanged: Emitter> = new Emitter(); + private _onCandidatesChanged: Emitter> = new Emitter(); // onCandidateChanged returns the removed candidates - public onCandidatesChanged: Event> = this._onCandidatesChanged.event; + public onCandidatesChanged: Event> = this._onCandidatesChanged.event; private _candidateFilter: ((candidates: CandidatePort[]) => Promise) | undefined; private tunnelRestoreValue: Promise; private _onEnvironmentTunnelsSet: Emitter = new Emitter(); @@ -501,7 +501,7 @@ export class TunnelModel extends Disposable { })); } - private async onTunnelClosed(address: { host: string, port: number }) { + private async onTunnelClosed(address: { host: string; port: number }) { const key = makeAddress(address.host, address.port); if (this.forwarded.has(key)) { this.forwarded.delete(key); @@ -729,7 +729,7 @@ export class TunnelModel extends Disposable { } // Returns removed candidates - private updateInResponseToCandidates(candidates: CandidatePort[]): Map { + private updateInResponseToCandidates(candidates: CandidatePort[]): Map { const removedCandidates = this._candidates ?? new Map(); const candidatesMap = new Map(); this._candidates = candidatesMap; @@ -810,7 +810,7 @@ export class TunnelModel extends Disposable { } } - async getAttributes(forwardedPorts: { host: string, port: number }[], checkProviders: boolean = true): Promise | undefined> { + async getAttributes(forwardedPorts: { host: string; port: number }[], checkProviders: boolean = true): Promise | undefined> { const matchingCandidates: Map = new Map(); const pidToPortsMapping: Map = new Map(); forwardedPorts.forEach(forwardedPort => { @@ -889,11 +889,11 @@ export interface IRemoteExplorerService { onDidChangeTargetType: Event; targetType: string[]; readonly tunnelModel: TunnelModel; - onDidChangeEditable: Event<{ tunnel: ITunnelItem, editId: TunnelEditId } | undefined>; + onDidChangeEditable: Event<{ tunnel: ITunnelItem; editId: TunnelEditId } | undefined>; setEditable(tunnelItem: ITunnelItem | undefined, editId: TunnelEditId, data: IEditableData | null): void; getEditableData(tunnelItem: ITunnelItem | undefined, editId?: TunnelEditId): IEditableData | undefined; forward(tunnelProperties: TunnelProperties, attributes?: Attributes | null): Promise; - close(remote: { host: string, port: number }): Promise; + close(remote: { host: string; port: number }): Promise; setTunnelInformation(tunnelInformation: TunnelInformation | undefined): void; setCandidateFilter(filter: ((candidates: CandidatePort[]) => Promise) | undefined): IDisposable; onFoundNewCandidates(candidates: CandidatePort[]): void; @@ -910,9 +910,9 @@ class RemoteExplorerService implements IRemoteExplorerService { private readonly _onDidChangeTargetType: Emitter = new Emitter(); public readonly onDidChangeTargetType: Event = this._onDidChangeTargetType.event; private _tunnelModel: TunnelModel; - private _editable: { tunnelItem: ITunnelItem | undefined, editId: TunnelEditId, data: IEditableData } | undefined; - private readonly _onDidChangeEditable: Emitter<{ tunnel: ITunnelItem, editId: TunnelEditId } | undefined> = new Emitter(); - public readonly onDidChangeEditable: Event<{ tunnel: ITunnelItem, editId: TunnelEditId } | undefined> = this._onDidChangeEditable.event; + private _editable: { tunnelItem: ITunnelItem | undefined; editId: TunnelEditId; data: IEditableData } | undefined; + private readonly _onDidChangeEditable: Emitter<{ tunnel: ITunnelItem; editId: TunnelEditId } | undefined> = new Emitter(); + public readonly onDidChangeEditable: Event<{ tunnel: ITunnelItem; editId: TunnelEditId } | undefined> = this._onDidChangeEditable.event; private readonly _onEnabledPortsFeatures: Emitter = new Emitter(); public readonly onEnabledPortsFeatures: Event = this._onEnabledPortsFeatures.event; private _portsFeaturesEnabled: boolean = false; @@ -955,7 +955,7 @@ class RemoteExplorerService implements IRemoteExplorerService { return this.tunnelModel.forward(tunnelProperties, attributes); } - close(remote: { host: string, port: number }): Promise { + close(remote: { host: string; port: number }): Promise { return this.tunnelModel.close(remote.host, remote.port); } diff --git a/src/vs/workbench/services/remote/electron-sandbox/remoteAgentService.ts b/src/vs/workbench/services/remote/electron-sandbox/remoteAgentService.ts index 79071207d11..d1b6aac05c6 100644 --- a/src/vs/workbench/services/remote/electron-sandbox/remoteAgentService.ts +++ b/src/vs/workbench/services/remote/electron-sandbox/remoteAgentService.ts @@ -50,9 +50,9 @@ class RemoteConnectionFailureNotificationContribution implements IWorkbenchContr .then(undefined, err => { type RemoteConnectionFailureClassification = { - web: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - remoteName: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - message: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + web: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + remoteName: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + message: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type RemoteConnectionFailureEvent = { web: boolean; diff --git a/src/vs/workbench/services/search/browser/searchService.ts b/src/vs/workbench/services/search/browser/searchService.ts index cbde6edad9a..21bb410c03e 100644 --- a/src/vs/workbench/services/search/browser/searchService.ts +++ b/src/vs/workbench/services/search/browser/searchService.ts @@ -25,6 +25,7 @@ import { Schemas } from 'vs/base/common/network'; import { URI, UriComponents } from 'vs/base/common/uri'; import { Emitter, Event } from 'vs/base/common/event'; import { localize } from 'vs/nls'; +import { WebFileSystemAccess } from 'vs/platform/files/browser/webFileSystemAccess'; export class RemoteSearchService extends SearchService { constructor( @@ -49,15 +50,16 @@ export class LocalFileSearchWorkerClient extends Disposable implements ISearchRe protected _worker: IWorkerClient | null; protected readonly _workerFactory: DefaultWorkerFactory; - private readonly _onDidRecieveTextSearchMatch = new Emitter<{ match: IFileMatch, queryId: number }>(); - readonly onDidRecieveTextSearchMatch: Event<{ match: IFileMatch, queryId: number }> = this._onDidRecieveTextSearchMatch.event; + private readonly _onDidReceiveTextSearchMatch = new Emitter<{ match: IFileMatch; queryId: number }>(); + readonly onDidReceiveTextSearchMatch: Event<{ match: IFileMatch; queryId: number }> = this._onDidReceiveTextSearchMatch.event; - private cache: { key: string, cache: ISearchComplete } | undefined; + private cache: { key: string; cache: ISearchComplete } | undefined; private queryId: number = 0; constructor( @IFileService private fileService: IFileService, + @IUriIdentityService private uriIdentityService: IUriIdentityService, ) { super(); this._worker = null; @@ -65,7 +67,7 @@ export class LocalFileSearchWorkerClient extends Disposable implements ISearchRe } sendTextSearchMatch(match: IFileMatch, queryId: number): void { - this._onDidRecieveTextSearchMatch.fire({ match, queryId }); + this._onDidReceiveTextSearchMatch.fire({ match, queryId }); } @memoize @@ -91,8 +93,8 @@ export class LocalFileSearchWorkerClient extends Disposable implements ISearchRe const queryId = this.queryId++; queryDisposables.add(token?.onCancellationRequested(e => this.cancelQuery(queryId)) || Disposable.None); - const handle = await this.fileSystemProvider.getHandle(fq.folder); - if (!handle || handle.kind !== 'directory') { + const handle: FileSystemHandle | undefined = await this.fileSystemProvider.getHandle(fq.folder); + if (!handle || !WebFileSystemAccess.isFileSystemDirectoryHandle(handle)) { console.error('Could not get directory handle for ', fq); return; } @@ -102,13 +104,14 @@ export class LocalFileSearchWorkerClient extends Disposable implements ISearchRe results: result.results }); - queryDisposables.add(this.onDidRecieveTextSearchMatch(e => { + queryDisposables.add(this.onDidReceiveTextSearchMatch(e => { if (e.queryId === queryId) { onProgress?.(reviveMatch(e.match)); } })); - const folderResults = await proxy.searchDirectory(handle, query, fq, queryId); + const ignorePathCasing = this.uriIdentityService.extUri.ignorePathCasing(fq.folder); + const folderResults = await proxy.searchDirectory(handle, query, fq, ignorePathCasing, queryId); for (const folderResult of folderResults.results) { results.push(reviveMatch(folderResult)); } @@ -144,13 +147,13 @@ export class LocalFileSearchWorkerClient extends Disposable implements ISearchRe const queryId = this.queryId++; queryDisposables.add(token?.onCancellationRequested(e => this.cancelQuery(queryId)) || Disposable.None); - const handle = await this.fileSystemProvider.getHandle(fq.folder); - if (!handle || handle.kind !== 'directory') { + const handle: FileSystemHandle | undefined = await this.fileSystemProvider.getHandle(fq.folder); + if (!handle || !WebFileSystemAccess.isFileSystemDirectoryHandle(handle)) { console.error('Could not get directory handle for ', fq); return; } - - const folderResults = await proxy.listDirectory(handle, query, fq, queryId); + const caseSensitive = this.uriIdentityService.extUri.ignorePathCasing(fq.folder); + const folderResults = await proxy.listDirectory(handle, query, fq, caseSensitive, queryId); for (const folderResult of folderResults.results) { results.push({ resource: URI.joinPath(fq.folder, folderResult) }); } diff --git a/src/vs/workbench/services/search/common/getFileResults.ts b/src/vs/workbench/services/search/common/getFileResults.ts index f2e81f913dd..366f8b030ef 100644 --- a/src/vs/workbench/services/search/common/getFileResults.ts +++ b/src/vs/workbench/services/search/common/getFileResults.ts @@ -32,7 +32,7 @@ export const getFileResults = ( const results: ITextSearchResult[] = []; - const patternIndecies: { matchStartIndex: number; matchedText: string; }[] = []; + const patternIndecies: { matchStartIndex: number; matchedText: string }[] = []; let patternMatch: RegExpExecArray | null = null; let remainingResultQuota = options.remainingResultQuota; @@ -45,7 +45,7 @@ export const getFileResults = ( const contextLinesNeeded = new Set(); const resultLines = new Set(); - const lineRanges: { start: number; end: number; }[] = []; + const lineRanges: { start: number; end: number }[] = []; const readLine = (lineNumber: number) => text.slice(lineRanges[lineNumber].start, lineRanges[lineNumber].end); let prevLineEnd = 0; diff --git a/src/vs/workbench/services/search/common/localFileSearchWorkerTypes.ts b/src/vs/workbench/services/search/common/localFileSearchWorkerTypes.ts index 5005dd35f5a..7ab2a3b347d 100644 --- a/src/vs/workbench/services/search/common/localFileSearchWorkerTypes.ts +++ b/src/vs/workbench/services/search/common/localFileSearchWorkerTypes.ts @@ -21,10 +21,10 @@ export interface ILocalFileSearchSimpleWorker { cancelQuery(queryId: number): void; - listDirectory(handle: FileSystemDirectoryHandle, queryProps: IFileQueryProps, folderQuery: IFolderQuery, queryId: number): Promise - searchDirectory(handle: FileSystemDirectoryHandle, queryProps: ITextQueryProps, folderQuery: IFolderQuery, queryId: number): Promise + listDirectory(handle: FileSystemDirectoryHandle, queryProps: IFileQueryProps, folderQuery: IFolderQuery, ignorePathCasing: boolean, queryId: number): Promise; + searchDirectory(handle: FileSystemDirectoryHandle, queryProps: ITextQueryProps, folderQuery: IFolderQuery, ignorePathCasing: boolean, queryId: number): Promise; } export interface ILocalFileSearchSimpleWorkerHost { - sendTextSearchMatch(match: IFileMatch, queryId: number): void + sendTextSearchMatch(match: IFileMatch, queryId: number): void; } diff --git a/src/vs/workbench/contrib/search/common/queryBuilder.ts b/src/vs/workbench/services/search/common/queryBuilder.ts similarity index 98% rename from src/vs/workbench/contrib/search/common/queryBuilder.ts rename to src/vs/workbench/services/search/common/queryBuilder.ts index c8f946a4e81..02d6c607ade 100644 --- a/src/vs/workbench/contrib/search/common/queryBuilder.ts +++ b/src/vs/workbench/services/search/common/queryBuilder.ts @@ -17,6 +17,7 @@ import { URI, URI as uri } from 'vs/base/common/uri'; import { isMultilineRegexSource } from 'vs/editor/common/model/textModelSearch'; import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ILogService } from 'vs/platform/log/common/log'; import { IWorkspaceContextService, IWorkspaceFolderData, toWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; @@ -87,6 +88,7 @@ export class QueryBuilder { @IConfigurationService private readonly configurationService: IConfigurationService, @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, @IEditorGroupsService private readonly editorGroupsService: IEditorGroupsService, + @ILogService private readonly logService: ILogService, @IPathService private readonly pathService: IPathService ) { } @@ -190,8 +192,10 @@ export class QueryBuilder { if (options.onlyOpenEditors) { const openEditors = arrays.coalesce(arrays.flatten(this.editorGroupsService.groups.map(group => group.editors.map(editor => editor.resource)))); + this.logService.trace('QueryBuilder#commonQuery - openEditor URIs', JSON.stringify(openEditors)); const openEditorsInQuery = openEditors.filter(editor => pathIncludedInQuery(queryProps, editor.fsPath)); const openEditorsQueryProps = this.commonQueryFromFileList(openEditorsInQuery); + this.logService.trace('QueryBuilder#commonQuery - openEditor Query', JSON.stringify(openEditorsQueryProps)); return { ...queryProps, ...openEditorsQueryProps }; } @@ -514,7 +518,7 @@ export class QueryBuilder { } } -function splitGlobFromPath(searchPath: string): { pathPortion: string, globPortion?: string } { +function splitGlobFromPath(searchPath: string): { pathPortion: string; globPortion?: string } { const globCharMatch = searchPath.match(/[\*\{\}\(\)\[\]\?]/); if (globCharMatch) { const globCharIdx = globCharMatch.index; diff --git a/src/vs/workbench/services/search/common/replace.ts b/src/vs/workbench/services/search/common/replace.ts index 86aa350d831..73cbaac691d 100644 --- a/src/vs/workbench/services/search/common/replace.ts +++ b/src/vs/workbench/services/search/common/replace.ts @@ -15,8 +15,8 @@ export class ReplacePattern { private _regExp: RegExp; private _caseOpsRegExp: RegExp; - constructor(replaceString: string, searchPatternInfo: IPatternInfo) - constructor(replaceString: string, parseParameters: boolean, regEx: RegExp) + constructor(replaceString: string, searchPatternInfo: IPatternInfo); + constructor(replaceString: string, parseParameters: boolean, regEx: RegExp); constructor(replaceString: string, arg2: any, arg3?: any) { this._replacePattern = replaceString; let searchPatternInfo: IPatternInfo; diff --git a/src/vs/workbench/services/search/common/search.ts b/src/vs/workbench/services/search/common/search.ts index 73579fd76b6..6c20ba1397b 100644 --- a/src/vs/workbench/services/search/common/search.ts +++ b/src/vs/workbench/services/search/common/search.ts @@ -18,7 +18,7 @@ import { Event } from 'vs/base/common/event'; import * as paths from 'vs/base/common/path'; import { isCancellationError } from 'vs/base/common/errors'; import { TextSearchCompleteMessageType } from 'vs/workbench/services/search/common/searchExtTypes'; -import { isPromise } from 'vs/base/common/types'; +import { isThenable } from 'vs/base/common/async'; export { TextSearchCompleteMessageType }; @@ -383,9 +383,9 @@ export interface ISearchConfigurationProperties { searchOnTypeDebouncePeriod: number; mode: 'view' | 'reuseEditor' | 'newEditor'; searchEditor: { - doubleClickBehaviour: 'selectWord' | 'goToLocation' | 'openLocationToSide', - reusePriorSearchConfiguration: boolean, - defaultNumberOfContextLines: number | null, + doubleClickBehaviour: 'selectWord' | 'goToLocation' | 'openLocationToSide'; + reusePriorSearchConfiguration: boolean; + defaultNumberOfContextLines: number | null; experimental: {}; }; sortOrder: SearchSortOrder; @@ -531,7 +531,7 @@ export interface ISearchEngineSuccess { export interface ISerializedSearchError { type: 'error'; error: { - message: string, + message: string; stack: string; }; } @@ -678,7 +678,7 @@ export class QueryGlobTester { true; }; - if (isPromise(excluded)) { + if (isThenable(excluded)) { return excluded.then(excluded => { if (excluded) { return false; diff --git a/src/vs/workbench/services/search/common/searchExtTypes.ts b/src/vs/workbench/services/search/common/searchExtTypes.ts index 4a8a80a2982..27f646183f4 100644 --- a/src/vs/workbench/services/search/common/searchExtTypes.ts +++ b/src/vs/workbench/services/search/common/searchExtTypes.ts @@ -17,10 +17,10 @@ export class Position { isEqual(other: Position): boolean { return false; } compareTo(other: Position): number { return 0; } translate(lineDelta?: number, characterDelta?: number): Position; - translate(change: { lineDelta?: number; characterDelta?: number; }): Position; + translate(change: { lineDelta?: number; characterDelta?: number }): Position; translate(_?: any, _2?: any): Position { return new Position(0, 0); } with(line?: number, character?: number): Position; - with(change: { line?: number; character?: number; }): Position; + with(change: { line?: number; character?: number }): Position; with(_: any): Position { return new Position(0, 0); } } @@ -41,7 +41,7 @@ export class Range { union(other: Range): Range { return new Range(0, 0, 0, 0); } with(start?: Position, end?: Position): Range; - with(change: { start?: Position, end?: Position }): Range; + with(change: { start?: Position; end?: Position }): Range; with(_: any): Range { return new Range(0, 0, 0, 0); } } @@ -237,15 +237,15 @@ export interface TextSearchCompleteMessage { /** * Markdown text of the message. */ - text: string, + text: string; /** * Whether the source of the message is trusted, command links are disabled for untrusted message sources. */ - trusted?: boolean, + trusted?: boolean; /** * The message type, this affects how the message will be rendered. */ - type: TextSearchCompleteMessageType, + type: TextSearchCompleteMessageType; } /** diff --git a/src/vs/workbench/services/search/common/searchHelpers.ts b/src/vs/workbench/services/search/common/searchHelpers.ts index 238d651f5f7..50e8d7a43ca 100644 --- a/src/vs/workbench/services/search/common/searchHelpers.ts +++ b/src/vs/workbench/services/search/common/searchHelpers.ts @@ -80,7 +80,7 @@ export function addContextToEditorMatches(matches: ITextSearchMatch[], model: IT return results; } -function getMatchStartEnd(match: ITextSearchMatch): { start: number, end: number } { +function getMatchStartEnd(match: ITextSearchMatch): { start: number; end: number } { const matchRanges = match.ranges; const matchStartLine = Array.isArray(matchRanges) ? matchRanges[0].startLineNumber : matchRanges.startLineNumber; const matchEndLine = Array.isArray(matchRanges) ? matchRanges[matchRanges.length - 1].endLineNumber : matchRanges.endLineNumber; diff --git a/src/vs/workbench/services/search/common/searchService.ts b/src/vs/workbench/services/search/common/searchService.ts index 20f0bde4152..282bbfbe40e 100644 --- a/src/vs/workbench/services/search/common/searchService.ts +++ b/src/vs/workbench/services/search/common/searchService.ts @@ -6,23 +6,23 @@ import * as arrays from 'vs/base/common/arrays'; import { DeferredPromise } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { canceled } from 'vs/base/common/errors'; +import { CancellationError } from 'vs/base/common/errors'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import { StopWatch } from 'vs/base/common/stopwatch'; +import { isNumber } from 'vs/base/common/types'; import { URI, URI as uri } from 'vs/base/common/uri'; import { IModelService } from 'vs/editor/common/services/model'; import { IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { deserializeSearchError, FileMatch, ICachedSearchStats, IFileMatch, IFileQuery, IFileSearchStats, IFolderQuery, IProgressMessage, ISearchComplete, ISearchEngineStats, ISearchProgressItem, ISearchQuery, ISearchResultProvider, ISearchService, isFileMatch, isProgressMessage, ITextQuery, pathIncludedInQuery, QueryType, SearchError, SearchErrorCode, SearchProviderType } from 'vs/workbench/services/search/common/search'; import { addContextToEditorMatches, editorMatchesToTextSearchResults } from 'vs/workbench/services/search/common/searchHelpers'; -import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { isNumber } from 'vs/base/common/types'; export class SearchService extends Disposable implements ISearchService { @@ -34,6 +34,8 @@ export class SearchService extends Disposable implements ISearchService { private deferredFileSearchesByScheme = new Map>(); private deferredTextSearchesByScheme = new Map>(); + private loggedSchemesMissingProviders = new Set(); + constructor( @IModelService private readonly modelService: IModelService, @IEditorService private readonly editorService: IEditorService, @@ -120,11 +122,11 @@ export class SearchService extends Disposable implements ISearchService { const providerPromise = (async () => { await Promise.all(providerActivations); - this.extensionService.whenInstalledExtensionsRegistered(); + await this.extensionService.whenInstalledExtensionsRegistered(); // Cancel faster if search was canceled while waiting for extensions if (token && token.isCancellationRequested) { - return Promise.reject(canceled()); + return Promise.reject(new CancellationError()); } const progressCallback = (item: ISearchProgressItem) => { @@ -161,7 +163,7 @@ export class SearchService extends Disposable implements ISearchService { return new Promise((resolve, reject) => { if (token) { token.onCancellationRequested(() => { - reject(canceled()); + reject(new CancellationError()); }); } @@ -202,6 +204,12 @@ export class SearchService extends Disposable implements ISearchService { const searchPs: Promise[] = []; const fqs = this.groupFolderQueriesByScheme(query); + const someSchemeHasProvider = [...fqs.keys()].some(scheme => { + return query.type === QueryType.File ? + this.fileSearchProviders.has(scheme) : + this.textSearchProviders.has(scheme); + }); + await Promise.all([...fqs.keys()].map(async scheme => { const schemeFQs = fqs.get(scheme)!; let provider = query.type === QueryType.File ? @@ -209,8 +217,19 @@ export class SearchService extends Disposable implements ISearchService { this.textSearchProviders.get(scheme); if (!provider) { - console.warn(`No search provider registered for scheme: ${scheme}, waiting`); - provider = await this.waitForProvider(query.type, scheme); + if (someSchemeHasProvider) { + if (!this.loggedSchemesMissingProviders.has(scheme)) { + this.logService.warn(`No search provider registered for scheme: ${scheme}. Another scheme has a provider, not waiting for ${scheme}`); + this.loggedSchemesMissingProviders.add(scheme); + } + return; + } else { + if (!this.loggedSchemesMissingProviders.has(scheme)) { + this.logService.warn(`No search provider registered for scheme: ${scheme}, waiting`); + this.loggedSchemesMissingProviders.add(scheme); + } + provider = await this.waitForProvider(query.type, scheme); + } } const oneSchemeQuery: ISearchQuery = { @@ -269,17 +288,17 @@ export class SearchService extends Disposable implements ISearchService { const cacheStats: ICachedSearchStats = fileSearchStats.detailStats as ICachedSearchStats; type CachedSearchCompleteClassifcation = { - reason?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - resultCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - workspaceFolderCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - type: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - endToEndTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - sortingTime?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - cacheWasResolved: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - cacheLookupTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - cacheFilterTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - cacheEntryCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - scheme: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + reason?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + resultCount: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + workspaceFolderCount: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + type: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + endToEndTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + sortingTime?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + cacheWasResolved: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + cacheLookupTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + cacheFilterTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + cacheEntryCount: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + scheme: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type CachedSearchCompleteEvent = { reason?: string; @@ -311,18 +330,18 @@ export class SearchService extends Disposable implements ISearchService { const searchEngineStats: ISearchEngineStats = fileSearchStats.detailStats as ISearchEngineStats; type SearchCompleteClassification = { - reason?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - resultCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - workspaceFolderCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - type: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - endToEndTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - sortingTime?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - fileWalkTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - directoriesWalked: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - filesWalked: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - cmdTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - cmdResultCount?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - scheme: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + reason?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + resultCount: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + workspaceFolderCount: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + type: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + endToEndTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + sortingTime?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + fileWalkTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + directoriesWalked: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + filesWalked: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + cmdTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + cmdResultCount?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + scheme: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type SearchCompleteEvent = { reason?: string; @@ -331,7 +350,7 @@ export class SearchService extends Disposable implements ISearchService { type: 'fileSearchProvider' | 'searchProcess'; endToEndTime: number; sortingTime?: number; - fileWalkTime: number + fileWalkTime: number; directoriesWalked: number; filesWalked: number; cmdTime: number; @@ -368,12 +387,12 @@ export class SearchService extends Disposable implements ISearchService { } type TextSearchCompleteClassification = { - reason?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - workspaceFolderCount: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - endToEndTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true }; - scheme: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - error?: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; - usePCRE2: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth' }; + reason?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + workspaceFolderCount: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + endToEndTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + scheme: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + error?: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + usePCRE2: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; }; type TextSearchCompleteEvent = { reason?: string; diff --git a/src/vs/workbench/services/search/common/textSearchManager.ts b/src/vs/workbench/services/search/common/textSearchManager.ts index 1f1747a6805..5dd7f698495 100644 --- a/src/vs/workbench/services/search/common/textSearchManager.ts +++ b/src/vs/workbench/services/search/common/textSearchManager.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { flatten, mapArrayOrNot } from 'vs/base/common/arrays'; +import { isThenable } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import * as glob from 'vs/base/common/glob'; import { Schemas } from 'vs/base/common/network'; import * as path from 'vs/base/common/path'; import * as resources from 'vs/base/common/resources'; -import { isArray, isPromise } from 'vs/base/common/types'; +import { isArray } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IExtendedExtensionSearchOptions, IFileMatch, IFolderQuery, IPatternInfo, ISearchCompleteStats, ITextQuery, ITextSearchContext, ITextSearchMatch, ITextSearchResult, ITextSearchStats, QueryGlobTester, resolvePatternsForProvider } from 'vs/workbench/services/search/common/search'; import { Range, TextSearchComplete, TextSearchMatch, TextSearchOptions, TextSearchProvider, TextSearchQuery, TextSearchResult } from 'vs/workbench/services/search/common/searchExtTypes'; @@ -133,7 +134,7 @@ export class TextSearchManager { if (relativePath) { // This method is only async when the exclude contains sibling clauses const included = queryTester.includedInQuery(relativePath, path.basename(relativePath), hasSibling); - if (isPromise(included)) { + if (isThenable(included)) { testingPs.push( included.then(isIncluded => { if (isIncluded) { diff --git a/src/vs/workbench/services/search/node/fileSearch.ts b/src/vs/workbench/services/search/node/fileSearch.ts index 3bcea267aef..265de9a10f4 100644 --- a/src/vs/workbench/services/search/node/fileSearch.ts +++ b/src/vs/workbench/services/search/node/fileSearch.ts @@ -59,7 +59,7 @@ export class FileWalker { private folderExcludePatterns: Map; private globalExcludePattern: glob.ParsedExpression | undefined; - private walkedPaths: { [path: string]: boolean; }; + private walkedPaths: { [path: string]: boolean }; constructor(config: IFileQuery) { this.config = config; diff --git a/src/vs/workbench/services/search/node/rawSearchService.ts b/src/vs/workbench/services/search/node/rawSearchService.ts index 49a7002e948..82e31e6f31f 100644 --- a/src/vs/workbench/services/search/node/rawSearchService.ts +++ b/src/vs/workbench/services/search/node/rawSearchService.ts @@ -24,7 +24,7 @@ export class SearchService implements IRawSearchService { private static readonly BATCH_SIZE = 512; - private caches: { [cacheKey: string]: Cache; } = Object.create(null); + private caches: { [cacheKey: string]: Cache } = Object.create(null); constructor(private readonly processType: IFileSearchStats['type'] = 'searchProcess') { } @@ -83,7 +83,7 @@ export class SearchService implements IRawSearchService { return this.doFileSearchWithEngine(FileSearchEngine, config, progressCallback, token); } - doFileSearchWithEngine(EngineClass: { new(config: IFileQuery): ISearchEngine; }, config: IFileQuery, progressCallback: IProgressCallback, token?: CancellationToken, batchSize = SearchService.BATCH_SIZE): Promise { + doFileSearchWithEngine(EngineClass: { new(config: IFileQuery): ISearchEngine }, config: IFileQuery, progressCallback: IProgressCallback, token?: CancellationToken, batchSize = SearchService.BATCH_SIZE): Promise { let resultCount = 0; const fileProgressCallback: IFileProgressCallback = progress => { if (Array.isArray(progress)) { @@ -403,7 +403,7 @@ interface ICacheRow { class Cache { - resultsToSearchCache: { [searchValue: string]: ICacheRow; } = Object.create(null); + resultsToSearchCache: { [searchValue: string]: ICacheRow } = Object.create(null); scorerCache: FuzzyScorerCache = Object.create(null); } diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts index 35029072fa6..466b5ec5349 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearchEngine.ts @@ -348,7 +348,7 @@ function bytesOrTextToString(obj: any): string { obj.text; } -function getNumLinesAndLastNewlineLength(text: string): { numLines: number, lastLineLength: number } { +function getNumLinesAndLastNewlineLength(text: string): { numLines: number; lastLineLength: number } { const re = /\n/g; let numLines = 0; let lastNewlineIdx = -1; @@ -575,8 +575,7 @@ export function fixRegexNewline(pattern: string): string { // If quantified, we can't use a negative lookahead in a quantifier. // But `.` already doesn't match new lines, so we can just use that // (with any other negations) instead. - const quant = parent.parent; - replace(quant.start, quant.end, (otherContent ? `[^${otherContent}]` : '.') + (quant.greedy ? '+' : '*')); + replace(parent.start, parent.end, otherContent ? `[^${otherContent}]` : '.'); } else { replace(parent.start, parent.end, '(?!\\r?\\n' + (otherContent ? `|[${otherContent}]` : '') + ')'); } diff --git a/src/vs/workbench/contrib/search/test/browser/queryBuilder.test.ts b/src/vs/workbench/services/search/test/browser/queryBuilder.test.ts similarity index 99% rename from src/vs/workbench/contrib/search/test/browser/queryBuilder.test.ts rename to src/vs/workbench/services/search/test/browser/queryBuilder.test.ts index e4be7d216dd..18d8a3f359f 100644 --- a/src/vs/workbench/contrib/search/test/browser/queryBuilder.test.ts +++ b/src/vs/workbench/services/search/test/browser/queryBuilder.test.ts @@ -12,7 +12,7 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IWorkspaceContextService, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; -import { ISearchPathsInfo, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { ISearchPathsInfo, QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IFileQuery, IFolderQuery, IPatternInfo, ITextQuery, QueryType } from 'vs/workbench/services/search/common/search'; import { TestPathService, TestEnvironmentService } from 'vs/workbench/test/browser/workbenchTestServices'; diff --git a/src/vs/workbench/services/search/test/common/ignoreFile.test.ts b/src/vs/workbench/services/search/test/common/ignoreFile.test.ts index 820094e05ef..3ae847e4211 100644 --- a/src/vs/workbench/services/search/test/common/ignoreFile.test.ts +++ b/src/vs/workbench/services/search/test/common/ignoreFile.test.ts @@ -415,7 +415,7 @@ suite('Parsing .gitignore files', () => { }); test('various advanced constructs found in popular repos', () => { - const runTest = ({ pattern, included, excluded }: { pattern: string, included: string[], excluded: string[] }) => { + const runTest = ({ pattern, included, excluded }: { pattern: string; included: string[]; excluded: string[] }) => { for (const include of included) { assertNoIgnoreMatch(pattern, '/', include); } diff --git a/src/vs/workbench/contrib/search/test/electron-browser/queryBuilder.test.ts b/src/vs/workbench/services/search/test/electron-browser/queryBuilder.test.ts similarity index 94% rename from src/vs/workbench/contrib/search/test/electron-browser/queryBuilder.test.ts rename to src/vs/workbench/services/search/test/electron-browser/queryBuilder.test.ts index 590cfd98a30..a054777a38d 100644 --- a/src/vs/workbench/contrib/search/test/electron-browser/queryBuilder.test.ts +++ b/src/vs/workbench/services/search/test/electron-browser/queryBuilder.test.ts @@ -7,9 +7,9 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IWorkspaceContextService, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { ISearchPathsInfo, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { ISearchPathsInfo, QueryBuilder } from 'vs/workbench/services/search/common/queryBuilder'; import { TestEnvironmentService, TestNativePathService } from 'vs/workbench/test/electron-browser/workbenchTestServices'; -import { assertEqualSearchPathResults, getUri, patternsToIExpression, globalGlob, fixPath } from 'vs/workbench/contrib/search/test/browser/queryBuilder.test'; +import { assertEqualSearchPathResults, getUri, patternsToIExpression, globalGlob, fixPath } from 'vs/workbench/services/search/test/browser/queryBuilder.test'; import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { Workspace } from 'vs/platform/workspace/test/common/testWorkspace'; diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts index 0a0f95f98bc..b29c81f2d31 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts @@ -42,6 +42,10 @@ suite('RipgrepTextSearchEngine', () => { ['fo[^\\na-z]o', 'fo(?!\\r?\\n|[a-z])o'], ['foo[^\\n]+o', 'foo.+o'], ['foo[^\\nzq]+o', 'foo[^zq]+o'], + ['foo[^\\nzq]+o', 'foo[^zq]+o'], + // preserves quantifies, #137899 + ['fo[^\\S\\n]*o', 'fo[^\\S]*o'], + ['fo[^\\S\\n]{3,}o', 'fo[^\\S]{3,}o'], ]; for (const [input, expected] of ttable) { @@ -112,7 +116,7 @@ suite('RipgrepTextSearchEngine', () => { assert.deepStrictEqual(actualResults, expectedResults); } - function makeRgMatch(relativePath: string, text: string, lineNumber: number, matchRanges: { start: number, end: number }[]): string { + function makeRgMatch(relativePath: string, text: string, lineNumber: number, matchRanges: { start: number; end: number }[]): string { return JSON.stringify({ type: 'match', data: { diff --git a/src/vs/workbench/services/search/worker/localFileSearch.ts b/src/vs/workbench/services/search/worker/localFileSearch.ts index e0d05890c7e..c65a2df2194 100644 --- a/src/vs/workbench/services/search/worker/localFileSearch.ts +++ b/src/vs/workbench/services/search/worker/localFileSearch.ts @@ -8,27 +8,27 @@ import { UriComponents, URI } from 'vs/base/common/uri'; import { IRequestHandler } from 'vs/base/common/worker/simpleWorker'; import { ILocalFileSearchSimpleWorker, ILocalFileSearchSimpleWorkerHost, IWorkerFileSearchComplete, IWorkerTextSearchComplete } from 'vs/workbench/services/search/common/localFileSearchWorkerTypes'; import { ICommonQueryProps, IFileMatch, IFileQueryProps, IFolderQuery, IPatternInfo, ITextQueryProps, } from 'vs/workbench/services/search/common/search'; -import * as extpath from 'vs/base/common/extpath'; import * as paths from 'vs/base/common/path'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { getFileResults } from 'vs/workbench/services/search/common/getFileResults'; import { IgnoreFile } from 'vs/workbench/services/search/common/ignoreFile'; import { createRegExp } from 'vs/base/common/strings'; import { Promises } from 'vs/base/common/async'; +import { ExtUri } from 'vs/base/common/resources'; const PERF = false; type FileNode = { - type: 'file', - name: string, - path: string, - resolve: () => Promise + type: 'file'; + name: string; + path: string; + resolve: () => Promise; }; type DirNode = { - type: 'dir', - name: string, - entries: Promise<(DirNode | FileNode)[]> + type: 'dir'; + name: string; + entries: Promise<(DirNode | FileNode)[]>; }; const globalStart = +new Date(); @@ -72,7 +72,10 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker return source; } - async listDirectory(handle: FileSystemDirectoryHandle, query: IFileQueryProps, folderQuery: IFolderQuery, queryId: number): Promise { + async listDirectory(handle: FileSystemDirectoryHandle, query: IFileQueryProps, folderQuery: IFolderQuery, ignorePathCasing: boolean, queryId: number): Promise { + const revivedFolderQuery = reviveFolderQuery(folderQuery); + const extUri = new ExtUri(() => ignorePathCasing); + const token = this.registerCancellationToken(queryId); const entries: string[] = []; let limitHit = false; @@ -84,7 +87,7 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker ? (name: string) => query.filePattern!.split('').every(c => name.includes(c)) : (name: string) => true; - await time('listDirectory', () => this.walkFolderQuery(handle, query, folderQuery, file => { + await time('listDirectory', () => this.walkFolderQuery(handle, reviveQueryProps(query), revivedFolderQuery, extUri, file => { if (!filePatternMatcher(file.name)) { return; } @@ -104,7 +107,10 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker }; } - async searchDirectory(handle: FileSystemDirectoryHandle, query: ITextQueryProps, folderQuery: IFolderQuery, queryId: number): Promise { + async searchDirectory(handle: FileSystemDirectoryHandle, query: ITextQueryProps, folderQuery: IFolderQuery, ignorePathCasing: boolean, queryId: number): Promise { + const revivedQuery = reviveFolderQuery(folderQuery); + const extUri = new ExtUri(() => ignorePathCasing); + return time('searchInFiles', async () => { const token = this.registerCancellationToken(queryId); @@ -144,7 +150,7 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker token.cancel(); } const match = { - resource: URI.joinPath(URI.revive(folderQuery.folder), file.path), + resource: URI.joinPath(revivedQuery.folder, file.path), results: fileResults, }; this.host.sendTextSearchMatch(match, queryId); @@ -153,7 +159,7 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker }; await time('walkFolderToResolve', () => - this.walkFolderQuery(handle, query, folderQuery, async file => onGoingProcesses.push(processFile(file)), token.token) + this.walkFolderQuery(handle, reviveQueryProps(query), revivedQuery, extUri, async file => onGoingProcesses.push(processFile(file)), token.token) ); await time('resolveOngoingProcesses', () => Promise.all(onGoingProcesses)); @@ -168,7 +174,7 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker } - private async walkFolderQuery(handle: FileSystemDirectoryHandle, queryProps: ICommonQueryProps, folderQuery: IFolderQuery, onFile: (file: FileNode) => any, token: CancellationToken): Promise { + private async walkFolderQuery(handle: FileSystemDirectoryHandle, queryProps: ICommonQueryProps, folderQuery: IFolderQuery, extUri: ExtUri, onFile: (file: FileNode) => any, token: CancellationToken): Promise { const folderExcludes = glob.parse(folderQuery.excludePattern ?? {}, { trimForExclusions: true }) as glob.ParsedExpression; @@ -184,11 +190,11 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker const isFileIncluded = (path: string, basename: string, hasSibling: (query: string) => boolean) => { path = path.slice(1); if (folderExcludes(path, basename, hasSibling)) { return false; } - if (!pathIncludedInQuery(queryProps, path)) { return false; } + if (!pathIncludedInQuery(queryProps, URI.file(path), extUri)) { return false; } return true; }; - const proccessFile = (file: FileSystemFileHandle, prior: string): FileNode => { + const processFile = (file: FileSystemFileHandle, prior: string): FileNode => { const resolved: FileNode = { type: 'file', @@ -200,6 +206,13 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker return resolved; }; + const isFileSystemDirectoryHandle = (handle: FileSystemHandle): handle is FileSystemDirectoryHandle => { + return handle.kind === 'directory'; + }; + + const isFileSystemFileHandle = (handle: FileSystemHandle): handle is FileSystemFileHandle => { + return handle.kind === 'file'; + }; const processDirectory = async (directory: FileSystemDirectoryHandle, prior: string, ignoreFile?: IgnoreFile): Promise => { @@ -242,10 +255,10 @@ export class LocalFileSearchSimpleWorker implements ILocalFileSearchSimpleWorker const hasSibling = (query: string) => sibilings.has(query); - if (handle.kind === 'directory' && !isFolderExcluded(path, basename, hasSibling)) { + if (isFileSystemDirectoryHandle(handle) && !isFolderExcluded(path, basename, hasSibling)) { dirs.push(processDirectory(handle, path + '/', ignoreFile)); - } else if (handle.kind === 'file' && isFileIncluded(path, basename, hasSibling)) { - files.push(proccessFile(handle, path)); + } else if (isFileSystemFileHandle(handle) && isFileIncluded(path, basename, hasSibling)) { + files.push(processFile(handle, path)); } } c([...await Promise.all(dirs), ...files]); @@ -289,31 +302,46 @@ function createSearchRegExp(options: IPatternInfo): RegExp { }); } +function reviveFolderQuery(folderQuery: IFolderQuery): IFolderQuery { + return { + ...folderQuery, + folder: URI.revive(folderQuery.folder), + }; +} -function pathExcludedInQuery(queryProps: ICommonQueryProps, fsPath: string): boolean { +function reviveQueryProps(queryProps: ICommonQueryProps): ICommonQueryProps { + return { + ...queryProps, + extraFileResources: queryProps.extraFileResources?.map(r => URI.revive(r)), + folderQueries: queryProps.folderQueries.map(fq => reviveFolderQuery(fq)), + }; +} + + +function pathExcludedInQuery(queryProps: ICommonQueryProps, fsPath: string): boolean { if (queryProps.excludePattern && glob.match(queryProps.excludePattern, fsPath)) { return true; } - return false; } -function pathIncludedInQuery(queryProps: ICommonQueryProps, fsPath: string): boolean { - if (queryProps.excludePattern && glob.match(queryProps.excludePattern, fsPath)) { +function pathIncludedInQuery(queryProps: ICommonQueryProps, path: URI, extUri: ExtUri): boolean { + if (queryProps.excludePattern && glob.match(queryProps.excludePattern, path.fsPath)) { return false; } if (queryProps.includePattern || queryProps.usingSearchPaths) { - if (queryProps.includePattern && glob.match(queryProps.includePattern, fsPath)) { + if (queryProps.includePattern && glob.match(queryProps.includePattern, path.fsPath)) { return true; } // If searchPaths are being used, the extra file must be in a subfolder and match the pattern, if present if (queryProps.usingSearchPaths) { + return !!queryProps.folderQueries && queryProps.folderQueries.some(fq => { - const searchPath = fq.folder.path; - if (extpath.isEqualOrParent(fsPath, searchPath)) { - const relPath = paths.relative(searchPath, fsPath); + const searchPath = fq.folder; + if (extUri.isEqualOrParent(path, searchPath)) { + const relPath = paths.relative(searchPath.path, path.path); return !fq.includePattern || !!glob.match(fq.includePattern, relPath); } else { return false; diff --git a/src/vs/workbench/services/statusbar/browser/statusbar.ts b/src/vs/workbench/services/statusbar/browser/statusbar.ts index 0cd27174bf4..010f0e847a6 100644 --- a/src/vs/workbench/services/statusbar/browser/statusbar.ts +++ b/src/vs/workbench/services/statusbar/browser/statusbar.ts @@ -101,7 +101,7 @@ export interface IStatusbarService { /** * An event that is triggered when an entry's visibility is changed. */ - readonly onDidChangeEntryVisibility: Event<{ id: string, visible: boolean }>; + readonly onDidChangeEntryVisibility: Event<{ id: string; visible: boolean }>; /** * Adds an entry to the statusbar with the given alignment and priority. Use the returned accessor diff --git a/src/vs/workbench/services/telemetry/browser/telemetryService.ts b/src/vs/workbench/services/telemetry/browser/telemetryService.ts index e01a9a7cf93..531782d63ef 100644 --- a/src/vs/workbench/services/telemetry/browser/telemetryService.ts +++ b/src/vs/workbench/services/telemetry/browser/telemetryService.ts @@ -15,14 +15,14 @@ import { ITelemetryData, ITelemetryInfo, ITelemetryService, TelemetryLevel } fro import { TelemetryLogAppender } from 'vs/platform/telemetry/common/telemetryLogAppender'; import { ITelemetryServiceConfig, TelemetryService as BaseTelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { ITelemetryAppender, NullTelemetryService, supportsTelemetry, validateTelemetryData } from 'vs/platform/telemetry/common/telemetryUtils'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { resolveWorkbenchCommonProperties } from 'vs/workbench/services/telemetry/browser/workbenchCommonProperties'; class WebAppInsightsAppender implements ITelemetryAppender { private _aiClient: ApplicationInsights | undefined; private _aiClientLoaded = false; - private _telemetryCache: { eventName: string, data: any }[] = []; + private _telemetryCache: { eventName: string; data: any }[] = []; constructor(private _eventPrefix: string, aiKey: string) { const endpointUrl = 'https://vortex.data.microsoft.com/collect/v1'; @@ -107,10 +107,10 @@ export class TelemetryService extends Disposable implements ITelemetryService { declare readonly _serviceBrand: undefined; private impl: ITelemetryService; - public readonly sendErrorTelemetry = false; + public readonly sendErrorTelemetry = true; constructor( - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService environmentService: IBrowserWorkbenchEnvironmentService, @ILoggerService loggerService: ILoggerService, @IConfigurationService configurationService: IConfigurationService, @IStorageService storageService: IStorageService, @@ -125,7 +125,7 @@ export class TelemetryService extends Disposable implements ITelemetryService { const config: ITelemetryServiceConfig = { appenders: [new WebTelemetryAppender(telemetryProvider), new TelemetryLogAppender(loggerService, environmentService)], commonProperties: resolveWorkbenchCommonProperties(storageService, productService.commit, productService.version, environmentService.remoteAuthority, productService.embedderIdentifier, environmentService.options && environmentService.options.resolveCommonTelemetryProperties), - sendErrorTelemetry: false, + sendErrorTelemetry: this.sendErrorTelemetry, }; this.impl = this._register(new BaseTelemetryService(config, configurationService)); diff --git a/src/vs/workbench/services/telemetry/browser/workbenchCommonProperties.ts b/src/vs/workbench/services/telemetry/browser/workbenchCommonProperties.ts index 1bd155a6483..cd56911dba6 100644 --- a/src/vs/workbench/services/telemetry/browser/workbenchCommonProperties.ts +++ b/src/vs/workbench/services/telemetry/browser/workbenchCommonProperties.ts @@ -11,6 +11,15 @@ import { mixin } from 'vs/base/common/objects'; import { firstSessionDateStorageKey, lastSessionDateStorageKey, machineIdKey } from 'vs/platform/telemetry/common/telemetry'; import { Gesture } from 'vs/base/browser/touch'; +/** + * General function to help reduce the individuality of user agents + * @param userAgent userAgent from browser window + * @returns A simplified user agent with less detail + */ +function cleanUserAgent(userAgent: string): string { + return userAgent.replace(/(\d+\.\d+)(\.\d+)+/g, '$1'); +} + export async function resolveWorkbenchCommonProperties( storageService: IStorageService, commit: string | undefined, @@ -19,7 +28,7 @@ export async function resolveWorkbenchCommonProperties( productIdentifier?: string, resolveAdditionalProperties?: () => { [key: string]: any } ): Promise<{ [name: string]: string | undefined }> { - const result: { [name: string]: string | undefined; } = Object.create(null); + const result: { [name: string]: string | undefined } = Object.create(null); const firstSessionDate = storageService.get(firstSessionDateStorageKey, StorageScope.GLOBAL)!; const lastSessionDate = storageService.get(lastSessionDateStorageKey, StorageScope.GLOBAL)!; @@ -55,7 +64,7 @@ export async function resolveWorkbenchCommonProperties( // __GDPR__COMMON__ "common.product" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" } result['common.product'] = productIdentifier ?? 'web'; // __GDPR__COMMON__ "common.userAgent" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - result['common.userAgent'] = Platform.userAgent; + result['common.userAgent'] = Platform.userAgent ? cleanUserAgent(Platform.userAgent) : undefined; // __GDPR__COMMON__ "common.isTouchDevice" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } result['common.isTouchDevice'] = String(Gesture.isTouchDevice()); diff --git a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts index cc2b950ea2f..fd04e1fd157 100644 --- a/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts +++ b/src/vs/workbench/services/textMate/browser/abstractTextMateService.ts @@ -12,11 +12,10 @@ import * as resources from 'vs/base/common/resources'; import * as types from 'vs/base/common/types'; import { equals as equalArray } from 'vs/base/common/arrays'; import { URI } from 'vs/base/common/uri'; -import { TokenizationResult, EncodedTokenizationResult } from 'vs/editor/common/core/token'; -import { IState, ITokenizationSupport, LanguageId, TokenMetadata, TokenizationRegistry, StandardTokenType, ITokenizationSupportFactory } from 'vs/editor/common/languages'; -import { nullTokenizeEncoded } from 'vs/editor/common/languages/nullMode'; +import { IState, ITokenizationSupport, LanguageId, TokenizationRegistry, StandardTokenType, ITokenizationSupportFactory, TokenizationResult, EncodedTokenizationResult } from 'vs/editor/common/languages'; +import { nullTokenizeEncoded } from 'vs/editor/common/languages/nullTokenize'; import { generateTokensCSSForColorMap } from 'vs/editor/common/languages/supports/tokenization'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ExtensionMessageCollector } from 'vs/workbench/services/extensions/common/extensionsRegistry'; @@ -30,6 +29,7 @@ import { IValidGrammarDefinition, IValidEmbeddedLanguagesMap, IValidTokenTypeMap import { TMGrammarFactory } from 'vs/workbench/services/textMate/common/TMGrammarFactory'; import { IExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; +import { TMTokenization } from 'vs/workbench/services/textMate/common/TMTokenization'; export abstract class AbstractTextMateService extends Disposable implements ITextMateService { public _serviceBrand: undefined; @@ -153,29 +153,11 @@ export abstract class AbstractTextMateService extends Disposable implements ITex } }); + this._updateTheme(this._grammarFactory, this._themeService.getColorTheme(), true); this._register(this._themeService.onDidColorThemeChange(() => { - if (this._grammarFactory) { - this._updateTheme(this._grammarFactory, this._themeService.getColorTheme(), false); - } + this._updateTheme(this._grammarFactory, this._themeService.getColorTheme(), false); })); - // Generate some color map until the grammar registry is loaded - let colorTheme = this._themeService.getColorTheme(); - let defaultForeground: Color = Color.transparent; - let defaultBackground: Color = Color.transparent; - for (let i = 0, len = colorTheme.tokenColors.length; i < len; i++) { - let rule = colorTheme.tokenColors[i]; - if (!rule.scope && rule.settings) { - if (rule.settings.foreground) { - defaultForeground = Color.fromHex(rule.settings.foreground); - } - if (rule.settings.background) { - defaultBackground = Color.fromHex(rule.settings.background); - } - } - } - TokenizationRegistry.setColorMap([null!, defaultForeground, defaultBackground]); - this._languageService.onDidEncounterLanguage((languageId) => { this._createdModes.push(languageId); }); @@ -282,7 +264,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex this._onDidEncounterLanguage.fire(languageId); } }); - return new TMTokenizationSupport(languageId, encodedLanguageId, tokenization, this._configurationService); + return new TMTokenizationSupportWithLineLimit(languageId, encodedLanguageId, tokenization, this._configurationService); } catch (err) { onUnexpectedError(err); return null; @@ -299,7 +281,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex return result; } - private _updateTheme(grammarFactory: TMGrammarFactory, colorTheme: IWorkbenchColorTheme, forceUpdate: boolean): void { + private _updateTheme(grammarFactory: TMGrammarFactory | null, colorTheme: IWorkbenchColorTheme, forceUpdate: boolean): void { if (!forceUpdate && this._currentTheme && this._currentTokenColorMap && AbstractTextMateService.equalsTokenRules(this._currentTheme.settings, colorTheme.tokenColors) && equalArray(this._currentTokenColorMap, colorTheme.tokenColorMap)) { return; } @@ -308,8 +290,8 @@ export abstract class AbstractTextMateService extends Disposable implements ITex this._doUpdateTheme(grammarFactory, this._currentTheme, this._currentTokenColorMap); } - protected _doUpdateTheme(grammarFactory: TMGrammarFactory, theme: IRawTheme, tokenColorMap: string[]): void { - grammarFactory.setTheme(theme, tokenColorMap); + protected _doUpdateTheme(grammarFactory: TMGrammarFactory | null, theme: IRawTheme, tokenColorMap: string[]): void { + grammarFactory?.setTheme(theme, tokenColorMap); let colorMap = AbstractTextMateService._toColorMap(tokenColorMap); let cssRules = generateTokensCSSForColorMap(colorMap); this._styleElement.textContent = cssRules; @@ -415,7 +397,7 @@ export abstract class AbstractTextMateService extends Disposable implements ITex protected abstract _loadVSCodeOnigurumWASM(): Promise; } -class TMTokenizationSupport implements ITokenizationSupport { +class TMTokenizationSupportWithLineLimit implements ITokenizationSupport { private readonly _languageId: string; private readonly _encodedLanguageId: LanguageId; private readonly _actual: TMTokenization; @@ -456,66 +438,6 @@ class TMTokenizationSupport implements ITokenizationSupport { return nullTokenizeEncoded(this._encodedLanguageId, state); } - return this._actual.tokenizeEncoded(line, state); - } -} - -class TMTokenization extends Disposable { - - private readonly _grammar: IGrammar; - private readonly _containsEmbeddedLanguages: boolean; - private readonly _seenLanguages: boolean[]; - private readonly _initialState: StackElement; - - private readonly _onDidEncounterLanguage: Emitter = this._register(new Emitter()); - public readonly onDidEncounterLanguage: Event = this._onDidEncounterLanguage.event; - - constructor(grammar: IGrammar, initialState: StackElement, containsEmbeddedLanguages: boolean) { - super(); - this._grammar = grammar; - this._initialState = initialState; - this._containsEmbeddedLanguages = containsEmbeddedLanguages; - this._seenLanguages = []; - } - - public getInitialState(): IState { - return this._initialState; - } - - public tokenizeEncoded(line: string, state: StackElement): EncodedTokenizationResult { - const textMateResult = this._grammar.tokenizeLine2(line, state, 500); - - if (textMateResult.stoppedEarly) { - console.warn(`Time limit reached when tokenizing line: ${line.substring(0, 100)}`); - // return the state at the beginning of the line - return new EncodedTokenizationResult(textMateResult.tokens, state); - } - - if (this._containsEmbeddedLanguages) { - let seenLanguages = this._seenLanguages; - let tokens = textMateResult.tokens; - - // Must check if any of the embedded languages was hit - for (let i = 0, len = (tokens.length >>> 1); i < len; i++) { - let metadata = tokens[(i << 1) + 1]; - let languageId = TokenMetadata.getLanguageId(metadata); - - if (!seenLanguages[languageId]) { - seenLanguages[languageId] = true; - this._onDidEncounterLanguage.fire(languageId); - } - } - } - - let endState: StackElement; - // try to save an object if possible - if (state.equals(textMateResult.ruleStack)) { - endState = state; - } else { - endState = textMateResult.ruleStack; - - } - - return new EncodedTokenizationResult(textMateResult.tokens, endState); + return this._actual.tokenizeEncoded(line, hasEOL, state); } } diff --git a/src/vs/workbench/services/textMate/browser/nativeTextMateService.ts b/src/vs/workbench/services/textMate/browser/nativeTextMateService.ts index f68aea36d4d..de5b056af74 100644 --- a/src/vs/workbench/services/textMate/browser/nativeTextMateService.ts +++ b/src/vs/workbench/services/textMate/browser/nativeTextMateService.ts @@ -6,7 +6,7 @@ import { ITextMateService } from 'vs/workbench/services/textMate/browser/textMate'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { AbstractTextMateService } from 'vs/workbench/services/textMate/browser/abstractTextMateService'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ILogService } from 'vs/platform/log/common/log'; @@ -19,9 +19,9 @@ import { TextMateWorker } from 'vs/workbench/services/textMate/browser/textMateW import { ITextModel } from 'vs/editor/common/model'; import { Disposable } from 'vs/base/common/lifecycle'; import { UriComponents, URI } from 'vs/base/common/uri'; -import { ContiguousMultilineTokensBuilder } from 'vs/editor/common/model/tokens/contiguousMultilineTokensBuilder'; +import { ContiguousMultilineTokensBuilder } from 'vs/editor/common/tokens/contiguousMultilineTokensBuilder'; import { TMGrammarFactory } from 'vs/workbench/services/textMate/common/TMGrammarFactory'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { IExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IProgressService } from 'vs/platform/progress/common/progress'; @@ -147,7 +147,7 @@ export class TextMateService extends AbstractTextMateService { private _worker: MonacoWebWorker | null; private _workerProxy: TextMateWorker | null; - private _tokenizers: { [uri: string]: ModelWorkerTextMateTokenizer; }; + private _tokenizers: { [uri: string]: ModelWorkerTextMateTokenizer }; constructor( @ILanguageService languageService: ILanguageService, @@ -226,7 +226,7 @@ export class TextMateService extends AbstractTextMateService { } } - protected override _doUpdateTheme(grammarFactory: TMGrammarFactory, theme: IRawTheme, colorMap: string[]): void { + protected override _doUpdateTheme(grammarFactory: TMGrammarFactory | null, theme: IRawTheme, colorMap: string[]): void { super._doUpdateTheme(grammarFactory, theme, colorMap); if (this._currentTheme && this._currentTokenColorMap && this._workerProxy) { this._workerProxy.acceptTheme(this._currentTheme, this._currentTokenColorMap); diff --git a/src/vs/workbench/services/textMate/browser/textMateWorker.ts b/src/vs/workbench/services/textMate/browser/textMateWorker.ts index a71f2aef38e..d5169697d97 100644 --- a/src/vs/workbench/services/textMate/browser/textMateWorker.ts +++ b/src/vs/workbench/services/textMate/browser/textMateWorker.ts @@ -11,11 +11,12 @@ import { TMGrammarFactory, ICreateGrammarResult } from 'vs/workbench/services/te import { IModelChangedEvent, MirrorTextModel } from 'vs/editor/common/model/mirrorTextModel'; import { TextMateWorkerHost } from 'vs/workbench/services/textMate/browser/nativeTextMateService'; import { TokenizationStateStore } from 'vs/editor/common/model/textModelTokens'; -import type { IGrammar, StackElement, IRawTheme, IOnigLib } from 'vscode-textmate'; -import { ContiguousMultilineTokensBuilder } from 'vs/editor/common/model/tokens/contiguousMultilineTokensBuilder'; -import { countEOL } from 'vs/editor/common/model/pieceTreeTextBuffer/eolCounter'; -import { LineTokens } from 'vs/editor/common/model/tokens/lineTokens'; +import type { IRawTheme, IOnigLib } from 'vscode-textmate'; +import { ContiguousMultilineTokensBuilder } from 'vs/editor/common/tokens/contiguousMultilineTokensBuilder'; +import { countEOL } from 'vs/editor/common/core/eolCounter'; +import { LineTokens } from 'vs/editor/common/tokens/lineTokens'; import { FileAccess } from 'vs/base/common/network'; +import { TMTokenization } from 'vs/workbench/services/textMate/common/TMTokenization'; export interface IValidGrammarDefinitionDTO { location: UriComponents; @@ -41,21 +42,19 @@ export interface IRawModelData { class TextMateWorkerModel extends MirrorTextModel { - private readonly _tokenizationStateStore: TokenizationStateStore; + private _tokenizationStateStore: TokenizationStateStore | null; private readonly _worker: TextMateWorker; private _languageId: string; private _encodedLanguageId: LanguageId; - private _grammar: IGrammar | null; private _isDisposed: boolean; constructor(uri: URI, lines: string[], eol: string, versionId: number, worker: TextMateWorker, languageId: string, encodedLanguageId: LanguageId) { super(uri, lines, eol, versionId); - this._tokenizationStateStore = new TokenizationStateStore(); + this._tokenizationStateStore = null; this._worker = worker; this._languageId = languageId; this._encodedLanguageId = encodedLanguageId; this._isDisposed = false; - this._grammar = null; this._resetTokenization(); } @@ -72,17 +71,18 @@ class TextMateWorkerModel extends MirrorTextModel { override onEvents(e: IModelChangedEvent): void { super.onEvents(e); - for (let i = 0; i < e.changes.length; i++) { - const change = e.changes[i]; - const [eolCount] = countEOL(change.text); - this._tokenizationStateStore.applyEdits(change.range, eolCount); + if (this._tokenizationStateStore) { + for (let i = 0; i < e.changes.length; i++) { + const change = e.changes[i]; + const [eolCount] = countEOL(change.text); + this._tokenizationStateStore.applyEdits(change.range, eolCount); + } } this._ensureTokens(); } private _resetTokenization(): void { - this._grammar = null; - this._tokenizationStateStore.flush(null); + this._tokenizationStateStore = null; const languageId = this._languageId; const encodedLanguageId = this._encodedLanguageId; @@ -91,14 +91,18 @@ class TextMateWorkerModel extends MirrorTextModel { return; } - this._grammar = r.grammar; - this._tokenizationStateStore.flush(r.initialState); + if (r.grammar) { + const tokenizationSupport = new TMTokenization(r.grammar, r.initialState, false); + this._tokenizationStateStore = new TokenizationStateStore(tokenizationSupport, tokenizationSupport.getInitialState()); + } else { + this._tokenizationStateStore = null; + } this._ensureTokens(); }); } private _ensureTokens(): void { - if (!this._grammar) { + if (!this._tokenizationStateStore) { return; } const builder = new ContiguousMultilineTokensBuilder(); @@ -109,10 +113,10 @@ class TextMateWorkerModel extends MirrorTextModel { const text = this._lines[lineIndex]; const lineStartState = this._tokenizationStateStore.getBeginState(lineIndex); - const r = this._grammar.tokenizeLine2(text, lineStartState!); + const r = this._tokenizationStateStore.tokenizationSupport.tokenizeEncoded(text, true, lineStartState!); LineTokens.convertToEndOffset(r.tokens, text.length); builder.add(lineIndex + 1, r.tokens); - this._tokenizationStateStore.setEndState(lineCount, lineIndex, r.ruleStack); + this._tokenizationStateStore.setEndState(lineCount, lineIndex, r.endState); lineIndex = this._tokenizationStateStore.invalidLineStartIndex - 1; // -1 because the outer loop increments it } @@ -123,7 +127,7 @@ class TextMateWorkerModel extends MirrorTextModel { export class TextMateWorker { private readonly _host: TextMateWorkerHost; - private readonly _models: { [uri: string]: TextMateWorkerModel; }; + private readonly _models: { [uri: string]: TextMateWorkerModel }; private readonly _grammarCache: Promise[]; private readonly _grammarFactory: Promise; diff --git a/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts b/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts index 675f671347d..5d5ae7a8c8e 100644 --- a/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts +++ b/src/vs/workbench/services/textMate/common/TMGrammarFactory.ts @@ -27,8 +27,8 @@ export class TMGrammarFactory extends Disposable { private readonly _host: ITMGrammarFactoryHost; private readonly _initialState: StackElement; private readonly _scopeRegistry: TMScopeRegistry; - private readonly _injections: { [scopeName: string]: string[]; }; - private readonly _injectedEmbeddedLanguages: { [scopeName: string]: IValidEmbeddedLanguagesMap[]; }; + private readonly _injections: { [scopeName: string]: string[] }; + private readonly _injectedEmbeddedLanguages: { [scopeName: string]: IValidEmbeddedLanguagesMap[] }; private readonly _languageToScope: Map; private readonly _grammarRegistry: Registry; diff --git a/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts b/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts index 67d165b8acb..ab0be4a2f46 100644 --- a/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts +++ b/src/vs/workbench/services/textMate/common/TMScopeRegistry.ts @@ -27,7 +27,7 @@ export interface IValidEmbeddedLanguagesMap { export class TMScopeRegistry extends Disposable { - private _scopeNameToLanguageRegistration: { [scopeName: string]: IValidGrammarDefinition; }; + private _scopeNameToLanguageRegistration: { [scopeName: string]: IValidGrammarDefinition }; constructor() { super(); diff --git a/src/vs/workbench/services/textMate/common/TMTokenization.ts b/src/vs/workbench/services/textMate/common/TMTokenization.ts new file mode 100644 index 00000000000..64816e5d912 --- /dev/null +++ b/src/vs/workbench/services/textMate/common/TMTokenization.ts @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter, Event } from 'vs/base/common/event'; +import { IState, ITokenizationSupport, LanguageId, TokenMetadata, TokenizationResult, EncodedTokenizationResult } from 'vs/editor/common/languages'; +import type { IGrammar, StackElement } from 'vscode-textmate'; +import { Disposable } from 'vs/base/common/lifecycle'; + +export class TMTokenization extends Disposable implements ITokenizationSupport { + + private readonly _grammar: IGrammar; + private readonly _containsEmbeddedLanguages: boolean; + private readonly _seenLanguages: boolean[]; + private readonly _initialState: StackElement; + + private readonly _onDidEncounterLanguage: Emitter = this._register(new Emitter()); + public readonly onDidEncounterLanguage: Event = this._onDidEncounterLanguage.event; + + constructor(grammar: IGrammar, initialState: StackElement, containsEmbeddedLanguages: boolean) { + super(); + this._grammar = grammar; + this._initialState = initialState; + this._containsEmbeddedLanguages = containsEmbeddedLanguages; + this._seenLanguages = []; + } + + public getInitialState(): IState { + return this._initialState; + } + + public tokenize(line: string, hasEOL: boolean, state: IState): TokenizationResult { + throw new Error('Not supported!'); + } + + public tokenizeEncoded(line: string, hasEOL: boolean, state: StackElement): EncodedTokenizationResult { + const textMateResult = this._grammar.tokenizeLine2(line, state, 500); + + if (textMateResult.stoppedEarly) { + console.warn(`Time limit reached when tokenizing line: ${line.substring(0, 100)}`); + // return the state at the beginning of the line + return new EncodedTokenizationResult(textMateResult.tokens, state); + } + + if (this._containsEmbeddedLanguages) { + let seenLanguages = this._seenLanguages; + let tokens = textMateResult.tokens; + + // Must check if any of the embedded languages was hit + for (let i = 0, len = (tokens.length >>> 1); i < len; i++) { + let metadata = tokens[(i << 1) + 1]; + let languageId = TokenMetadata.getLanguageId(metadata); + + if (!seenLanguages[languageId]) { + seenLanguages[languageId] = true; + this._onDidEncounterLanguage.fire(languageId); + } + } + } + + let endState: StackElement; + // try to save an object if possible + if (state.equals(textMateResult.ruleStack)) { + endState = state; + } else { + endState = textMateResult.ruleStack; + + } + + return new EncodedTokenizationResult(textMateResult.tokens, endState); + } +} diff --git a/src/vs/workbench/services/textfile/browser/browserTextFileService.ts b/src/vs/workbench/services/textfile/browser/browserTextFileService.ts index 4b193208e5e..1ca17a7e39e 100644 --- a/src/vs/workbench/services/textfile/browser/browserTextFileService.ts +++ b/src/vs/workbench/services/textfile/browser/browserTextFileService.ts @@ -9,7 +9,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; import { IDialogService, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; diff --git a/src/vs/workbench/services/textfile/browser/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts index 980704ac843..29945de6885 100644 --- a/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -31,11 +31,10 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IWorkingCopyFileService, IFileOperationUndoRedoInfo, ICreateFileOperation } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceContextService, WORKSPACE_EXTENSION } from 'vs/platform/workspace/common/workspace'; import { UTF8, UTF8_with_bom, UTF16be, UTF16le, encodingExists, toEncodeReadable, toDecodeStream, IDecodeStreamResult, DecodeStreamError, DecodeStreamErrorKind } from 'vs/workbench/services/textfile/common/encoding'; import { consumeStream, ReadableStream } from 'vs/base/common/stream'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { ILogService } from 'vs/platform/log/common/log'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { IElevatedFileService } from 'vs/workbench/services/files/common/elevatedFileService'; @@ -246,7 +245,7 @@ export abstract class AbstractTextFileService extends Disposable implements ITex } } - async create(operations: { resource: URI, value?: string | ITextSnapshot, options?: ICreateFileOptions }[], undoInfo?: IFileOperationUndoRedoInfo): Promise { + async create(operations: { resource: URI; value?: string | ITextSnapshot; options?: ICreateFileOptions }[], undoInfo?: IFileOperationUndoRedoInfo): Promise { const operationsWithContents: ICreateFileOperation[] = await Promise.all(operations.map(async operation => { const contents = await this.getEncodedReadable(operation.resource, operation.value); return { @@ -706,7 +705,7 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { return defaultEncodingOverrides; } - async getWriteEncoding(resource: URI, options?: IWriteTextFileOptions): Promise<{ encoding: string, addBOM: boolean }> { + async getWriteEncoding(resource: URI, options?: IWriteTextFileOptions): Promise<{ encoding: string; addBOM: boolean }> { const { encoding, hasBOM } = await this.getPreferredWriteEncoding(resource, options ? options.encoding : undefined); return { encoding, addBOM: hasBOM }; diff --git a/src/vs/workbench/services/textfile/common/encoding.ts b/src/vs/workbench/services/textfile/common/encoding.ts index 7759fb0eb54..e0a72423748 100644 --- a/src/vs/workbench/services/textfile/common/encoding.ts +++ b/src/vs/workbench/services/textfile/common/encoding.ts @@ -5,7 +5,7 @@ import { Readable, ReadableStream, newWriteableStream, listenStream } from 'vs/base/common/stream'; import { VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; -import { IDisposable } from 'vs/workbench/workbench.web.api'; +import { IDisposable } from 'vs/base/common/lifecycle'; export const UTF8 = 'utf8'; export const UTF8_with_bom = 'utf8bom'; diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index dc9a506f17d..bb79219e7d7 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -11,7 +11,7 @@ import { IRevertOptions, SaveReason } from 'vs/workbench/common/editor'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; import { IWorkingCopyBackupService, IResolvedWorkingCopyBackup } from 'vs/workbench/services/workingCopy/common/workingCopyBackup'; import { IFileService, FileOperationError, FileOperationResult, FileChangesEvent, FileChangeType, IFileStatWithMetadata, ETAG_DISABLED, FileSystemProviderCapabilities, NotModifiedSinceFileOperationError } from 'vs/platform/files/common/files'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { timeout, TaskSequentializer } from 'vs/base/common/async'; import { ITextBufferFactory, ITextModel } from 'vs/editor/common/model'; diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts index 99fed7b9852..0531f1a2c7f 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts @@ -171,13 +171,13 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE } } - private readonly mapCorrelationIdToModelsToRestore = new Map(); + private readonly mapCorrelationIdToModelsToRestore = new Map(); private onWillRunWorkingCopyFileOperation(e: WorkingCopyFileEvent): void { // Move / Copy: remember models to restore after the operation if (e.operation === FileOperation.MOVE || e.operation === FileOperation.COPY) { - const modelsToRestore: { source: URI, target: URI, snapshot?: ITextSnapshot; languageId?: string; encoding?: string; }[] = []; + const modelsToRestore: { source: URI; target: URI; snapshot?: ITextSnapshot; languageId?: string; encoding?: string }[] = []; for (const { source, target } of e.files) { if (source) { @@ -538,7 +538,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE return this.saveParticipants.addSaveParticipant(participant); } - runSaveParticipants(model: ITextFileEditorModel, context: { reason: SaveReason; }, token: CancellationToken): Promise { + runSaveParticipants(model: ITextFileEditorModel, context: { reason: SaveReason }, token: CancellationToken): Promise { return this.saveParticipants.participate(model, context, token); } diff --git a/src/vs/workbench/services/textfile/common/textFileSaveParticipant.ts b/src/vs/workbench/services/textfile/common/textFileSaveParticipant.ts index c2fde636ccd..a1adea6a4b0 100644 --- a/src/vs/workbench/services/textfile/common/textFileSaveParticipant.ts +++ b/src/vs/workbench/services/textfile/common/textFileSaveParticipant.ts @@ -30,7 +30,7 @@ export class TextFileSaveParticipant extends Disposable { return toDisposable(() => remove()); } - participate(model: ITextFileEditorModel, context: { reason: SaveReason; }, token: CancellationToken): Promise { + participate(model: ITextFileEditorModel, context: { reason: SaveReason }, token: CancellationToken): Promise { const cts = new CancellationTokenSource(token); return this.progressService.withProgress({ diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts index aeaadf93871..8521e4a5cc6 100644 --- a/src/vs/workbench/services/textfile/common/textfiles.ts +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -96,7 +96,7 @@ export interface ITextFileService extends IDisposable { * Create files. If the file exists it will be overwritten with the contents if * the options enable to overwrite. */ - create(operations: { resource: URI, value?: string | ITextSnapshot, options?: { overwrite?: boolean } }[], undoInfo?: IFileOperationUndoRedoInfo): Promise; + create(operations: { resource: URI; value?: string | ITextSnapshot; options?: { overwrite?: boolean } }[], undoInfo?: IFileOperationUndoRedoInfo): Promise; /** * Returns the readable that uses the appropriate encoding. This method should @@ -374,7 +374,7 @@ export interface ITextFileEditorModelManager { /** * Runs the registered save participants on the provided model. */ - runSaveParticipants(model: ITextFileEditorModel, context: { reason: SaveReason; }, token: CancellationToken): Promise + runSaveParticipants(model: ITextFileEditorModel, context: { reason: SaveReason }, token: CancellationToken): Promise; /** * Waits for the model to be ready to be disposed. There may be conditions diff --git a/src/vs/workbench/services/textfile/electron-sandbox/nativeTextFileService.ts b/src/vs/workbench/services/textfile/electron-sandbox/nativeTextFileService.ts index 40f2ae9a602..d4f8852280b 100644 --- a/src/vs/workbench/services/textfile/electron-sandbox/nativeTextFileService.ts +++ b/src/vs/workbench/services/textfile/electron-sandbox/nativeTextFileService.ts @@ -22,7 +22,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IElevatedFileService } from 'vs/workbench/services/files/common/elevatedFileService'; import { ILogService } from 'vs/platform/log/common/log'; import { Promises } from 'vs/base/common/async'; @@ -102,7 +102,7 @@ export class NativeTextFileService extends AbstractTextFileService { ensuredOptions = options; } - let ensuredLimits: { size?: number; memory?: number; }; + let ensuredLimits: { size?: number; memory?: number }; if (!ensuredOptions.limits) { ensuredLimits = Object.create(null); ensuredOptions.limits = ensuredLimits; diff --git a/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts b/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts index d16b75cb926..584ad739372 100644 --- a/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts +++ b/src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts @@ -16,10 +16,10 @@ import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textMo export interface Params { setup(): Promise<{ - service: ITextFileService, - testDir: string - }> - teardown(): Promise + service: ITextFileService; + testDir: string; + }>; + teardown(): Promise; exists(fsPath: string): Promise; stat(fsPath: string): Promise<{ size: number }>; diff --git a/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts index 58ecba3461d..feca56101de 100644 --- a/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts +++ b/src/vs/workbench/services/textfile/test/node/encoding/encoding.test.ts @@ -322,9 +322,6 @@ suite('Encoding', () => { }); test('toDecodeStream - decodes buffer entirely', async function () { - if (!process.versions.electron) { - this.skip(); // TODO@bpasero enable once we ship Electron 16 - } const emojis = Buffer.from('🖥️💻💾'); const incompleteEmojis = emojis.slice(0, emojis.length - 1); diff --git a/src/vs/workbench/services/themes/browser/fileIconThemeData.ts b/src/vs/workbench/services/themes/browser/fileIconThemeData.ts index 7c22e8459a2..02030290016 100644 --- a/src/vs/workbench/services/themes/browser/fileIconThemeData.ts +++ b/src/vs/workbench/services/themes/browser/fileIconThemeData.ts @@ -5,7 +5,7 @@ import { URI } from 'vs/base/common/uri'; import * as nls from 'vs/nls'; -import * as Paths from 'vs/base/common/path'; +import * as paths from 'vs/base/common/path'; import * as resources from 'vs/base/common/resources'; import * as Json from 'vs/base/common/json'; import { ExtensionData, IThemeExtensionPoint, IWorkbenchFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; @@ -13,7 +13,7 @@ import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; import { asCSSUrl } from 'vs/base/browser/dom'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; export class FileIconThemeData implements IWorkbenchFileIconTheme { @@ -57,7 +57,7 @@ export class FileIconThemeData implements IWorkbenchFileIconTheme { static fromExtensionTheme(iconTheme: IThemeExtensionPoint, iconThemeLocation: URI, extensionData: ExtensionData): FileIconThemeData { const id = extensionData.extensionId + '-' + iconTheme.id; - const label = iconTheme.label || Paths.basename(iconTheme.path); + const label = iconTheme.label || paths.basename(iconTheme.path); const settingsId = iconTheme.id; const themeData = new FileIconThemeData(id, label, settingsId); @@ -163,7 +163,7 @@ interface FontDefinition { weight: string; style: string; size: string; - src: { path: string; format: string; }[]; + src: { path: string; format: string }[]; } interface IconsAssociation { @@ -172,11 +172,11 @@ interface IconsAssociation { folderExpanded?: string; rootFolder?: string; rootFolderExpanded?: string; - folderNames?: { [folderName: string]: string; }; - folderNamesExpanded?: { [folderName: string]: string; }; - fileExtensions?: { [extension: string]: string; }; - fileNames?: { [fileName: string]: string; }; - languageIds?: { [languageId: string]: string; }; + folderNames?: { [folderName: string]: string }; + folderNamesExpanded?: { [folderName: string]: string }; + fileExtensions?: { [extension: string]: string }; + fileNames?: { [fileName: string]: string }; + languageIds?: { [languageId: string]: string }; } interface IconThemeDocument extends IconsAssociation { @@ -192,7 +192,7 @@ export class FileIconThemeLoader { constructor( private readonly fileService: IExtensionResourceLoaderService, - private readonly modeService: ILanguageService + private readonly languageService: ILanguageService ) { } @@ -224,7 +224,7 @@ export class FileIconThemeLoader { }); } - private processIconThemeDocument(id: string, iconThemeDocumentLocation: URI, iconThemeDocument: IconThemeDocument): { content: string; hasFileIcons: boolean; hasFolderIcons: boolean; hidesExplorerArrows: boolean; } { + private processIconThemeDocument(id: string, iconThemeDocumentLocation: URI, iconThemeDocument: IconThemeDocument): { content: string; hasFileIcons: boolean; hasFolderIcons: boolean; hidesExplorerArrows: boolean } { const result = { content: '', hasFileIcons: false, hasFolderIcons: false, hidesExplorerArrows: !!iconThemeDocument.hidesExplorerArrows }; @@ -290,15 +290,21 @@ export class FileIconThemeLoader { const folderNames = associations.folderNames; if (folderNames) { - for (const folderName in folderNames) { - addSelector(`${qualifier} .${escapeCSS(folderName.toLowerCase())}-name-folder-icon.folder-icon::before`, folderNames[folderName]); + for (const key in folderNames) { + const selectors: string[] = []; + const name = handleParentFolder(key.toLowerCase(), selectors); + selectors.push(`.${escapeCSS(name)}-name-folder-icon`); + addSelector(`${qualifier} ${selectors.join('')}.folder-icon::before`, folderNames[key]); result.hasFolderIcons = true; } } const folderNamesExpanded = associations.folderNamesExpanded; if (folderNamesExpanded) { - for (const folderName in folderNamesExpanded) { - addSelector(`${qualifier} ${expanded} .${escapeCSS(folderName.toLowerCase())}-name-folder-icon.folder-icon::before`, folderNamesExpanded[folderName]); + for (const key in folderNamesExpanded) { + const selectors: string[] = []; + const name = handleParentFolder(key.toLowerCase(), selectors); + selectors.push(`.${escapeCSS(name)}-name-folder-icon`); + addSelector(`${qualifier} ${expanded} ${selectors.join('')}.folder-icon::before`, folderNamesExpanded[key]); result.hasFolderIcons = true; } } @@ -317,26 +323,28 @@ export class FileIconThemeLoader { } const fileExtensions = associations.fileExtensions; if (fileExtensions) { - for (const fileExtension in fileExtensions) { + for (const key in fileExtensions) { const selectors: string[] = []; - const segments = fileExtension.toLowerCase().split('.'); + const name = handleParentFolder(key.toLowerCase(), selectors); + const segments = name.split('.'); if (segments.length) { for (let i = 0; i < segments.length; i++) { selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); } selectors.push('.ext-file-icon'); // extra segment to increase file-ext score } - addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileExtensions[fileExtension]); + addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileExtensions[key]); result.hasFileIcons = true; hasSpecificFileIcons = true; } } const fileNames = associations.fileNames; if (fileNames) { - for (let fileName in fileNames) { + for (const key in fileNames) { const selectors: string[] = []; - fileName = fileName.toLowerCase(); + const fileName = handleParentFolder(key.toLowerCase(), selectors); selectors.push(`.${escapeCSS(fileName)}-name-file-icon`); + selectors.push('.name-file-icon'); // extra segment to increase file-name score const segments = fileName.split('.'); if (segments.length) { for (let i = 1; i < segments.length; i++) { @@ -344,7 +352,7 @@ export class FileIconThemeLoader { } selectors.push('.ext-file-icon'); // extra segment to increase file-ext score } - addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileNames[fileName]); + addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileNames[key]); result.hasFileIcons = true; hasSpecificFileIcons = true; } @@ -364,12 +372,17 @@ export class FileIconThemeLoader { const cssRules: string[] = []; const fonts = iconThemeDocument.fonts; + const fontSizes = new Map(); if (Array.isArray(fonts)) { + const defaultFontSize = fonts[0].size || '150%'; fonts.forEach(font => { const src = font.src.map(l => `${asCSSUrl(resolvePath(l.path))} format('${l.format}')`).join(', '); cssRules.push(`@font-face { src: ${src}; font-family: '${font.id}'; font-weight: ${font.weight}; font-style: ${font.style}; font-display: block; }`); + if (font.size !== undefined && font.size !== defaultFontSize) { + fontSizes.set(font.id, font.size); + } }); - cssRules.push(`.show-file-icons .file-icon::before, .show-file-icons .folder-icon::before, .show-file-icons .rootfolder-icon::before { font-family: '${fonts[0].id}'; font-size: ${fonts[0].size || '150%'}; }`); + cssRules.push(`.show-file-icons .file-icon::before, .show-file-icons .folder-icon::before, .show-file-icons .rootfolder-icon::before { font-family: '${fonts[0].id}'; font-size: ${defaultFontSize}; }`); } for (const defId in selectorByDefinitionId) { @@ -386,8 +399,9 @@ export class FileIconThemeLoader { if (definition.fontCharacter) { body.push(`content: '${definition.fontCharacter}';`); } - if (definition.fontSize) { - body.push(`font-size: ${definition.fontSize};`); + const fontSize = definition.fontSize ?? (definition.fontId ? fontSizes.get(definition.fontId) : undefined); + if (fontSize) { + body.push(`font-size: ${fontSize};`); } if (definition.fontId) { body.push(`font-family: ${definition.fontId};`); @@ -401,9 +415,9 @@ export class FileIconThemeLoader { } if (showLanguageModeIcons) { - for (const languageId of this.modeService.getRegisteredLanguageIds()) { + for (const languageId of this.languageService.getRegisteredLanguageIds()) { if (!coveredLanguages[languageId]) { - const icon = this.modeService.getIcon(languageId); + const icon = this.languageService.getIcon(languageId); if (icon) { const selector = `.show-file-icons .${escapeCSS(languageId)}-lang-file-icon.file-icon::before`; cssRules.push(`${selector} { content: ' '; background-image: ${asCSSUrl(icon.dark)}; }`); @@ -419,6 +433,16 @@ export class FileIconThemeLoader { } +function handleParentFolder(key: string, selectors: string[]): string { + const lastIndexOfSlash = key.lastIndexOf('/'); + if (lastIndexOfSlash >= 0) { + const parentFolder = key.substring(0, lastIndexOfSlash); + selectors.push(`.${escapeCSS(parentFolder)}-name-dir-icon`); + return key.substring(lastIndexOfSlash + 1); + } + return key; +} + function escapeCSS(str: string) { str = 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. return window.CSS.escape(str); diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index 9b560719561..b32d4a3ebed 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -19,7 +19,7 @@ import { registerFileIconThemeSchemas } from 'vs/workbench/services/themes/commo import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { FileIconThemeData, FileIconThemeLoader } from 'vs/workbench/services/themes/browser/fileIconThemeData'; import { createStyleSheet } from 'vs/base/browser/dom'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; @@ -40,7 +40,7 @@ import { RunOnceScheduler, Sequencer } from 'vs/base/common/async'; import { IUserDataInitializationService } from 'vs/workbench/services/userData/browser/userDataInit'; import { getIconsStyleSheet } from 'vs/platform/theme/browser/iconsStyleSheet'; import { asCssVariableName, getColorRegistry } from 'vs/platform/theme/common/colorRegistry'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; // implementation @@ -107,14 +107,14 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { @IStorageService private readonly storageService: IStorageService, @IConfigurationService private readonly configurationService: IConfigurationService, @ITelemetryService private readonly telemetryService: ITelemetryService, - @IWorkbenchEnvironmentService readonly environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService readonly environmentService: IBrowserWorkbenchEnvironmentService, @IFileService fileService: IFileService, @IExtensionResourceLoaderService private readonly extensionResourceLoaderService: IExtensionResourceLoaderService, @IWorkbenchLayoutService readonly layoutService: IWorkbenchLayoutService, @ILogService private readonly logService: ILogService, @IHostColorSchemeService private readonly hostColorService: IHostColorSchemeService, @IUserDataInitializationService readonly userDataInitializationService: IUserDataInitializationService, - @ILanguageService readonly modeService: ILanguageService + @ILanguageService readonly languageService: ILanguageService ) { this.container = layoutService.container; this.settings = new ThemeConfiguration(configurationService); @@ -127,7 +127,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { this.fileIconThemeWatcher = new ThemeFileWatcher(fileService, environmentService, this.reloadCurrentFileIconTheme.bind(this)); this.fileIconThemeRegistry = new ThemeRegistry(fileIconThemesExtPoint, FileIconThemeData.fromExtensionTheme, true, FileIconThemeData.noIconTheme); - this.fileIconThemeLoader = new FileIconThemeLoader(extensionResourceLoaderService, modeService); + this.fileIconThemeLoader = new FileIconThemeLoader(extensionResourceLoaderService, languageService); this.onFileIconThemeChange = new Emitter(); this.currentFileIconTheme = FileIconThemeData.createUnloadedTheme(''); this.fileIconThemeSequencer = new Sequencer(); @@ -560,11 +560,11 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { const key = themeType + themeData.extensionId; if (!this.themeExtensionsActivated.get(key)) { type ActivatePluginClassification = { - id: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; - name: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; - isBuiltin: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; - publisherDisplayName: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - themeId: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; + id: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + name: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; + isBuiltin: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; + publisherDisplayName: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + themeId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight' }; }; type ActivatePluginEvent = { id: string; @@ -799,10 +799,10 @@ class ThemeFileWatcher { private watcherDisposable: IDisposable | undefined; private fileChangeListener: IDisposable | undefined; - constructor(private fileService: IFileService, private environmentService: IWorkbenchEnvironmentService, private onUpdate: () => void) { + constructor(private fileService: IFileService, private environmentService: IBrowserWorkbenchEnvironmentService, private onUpdate: () => void) { } - update(theme: { location?: URI, watch?: boolean; }) { + update(theme: { location?: URI; watch?: boolean }) { if (!resources.isEqual(theme.location, this.watchedLocation)) { this.dispose(); if (theme.location && (theme.watch || this.environmentService.isExtensionDevelopment)) { diff --git a/src/vs/workbench/services/themes/common/colorExtensionPoint.ts b/src/vs/workbench/services/themes/common/colorExtensionPoint.ts index 3ad28da9268..430e9cd28b1 100644 --- a/src/vs/workbench/services/themes/common/colorExtensionPoint.ts +++ b/src/vs/workbench/services/themes/common/colorExtensionPoint.ts @@ -12,7 +12,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; interface IColorExtensionPoint { id: string; description: string; - defaults: { light: string, dark: string, highContrast: string }; + defaults: { light: string; dark: string; highContrast: string }; } const colorRegistry: IColorRegistry = Registry.as(ColorRegistryExtensions.ColorContribution); diff --git a/src/vs/workbench/services/themes/common/colorThemeData.ts b/src/vs/workbench/services/themes/common/colorThemeData.ts index f99657d109e..b2b88468d5e 100644 --- a/src/vs/workbench/services/themes/common/colorThemeData.ts +++ b/src/vs/workbench/services/themes/common/colorThemeData.ts @@ -43,7 +43,7 @@ const tokenGroupToScopesMap = { export type TokenStyleDefinition = SemanticTokenRule | ProbeScope[] | TokenStyleValue; export type TokenStyleDefinitions = { [P in keyof TokenStyleData]?: TokenStyleDefinition | undefined }; -export type TextMateThemingRuleDefinitions = { [P in keyof TokenStyleData]?: ITextMateThemingRule | undefined; } & { scope?: ProbeScope; }; +export type TextMateThemingRuleDefinitions = { [P in keyof TokenStyleData]?: ITextMateThemingRule | undefined; } & { scope?: ProbeScope }; export class ColorThemeData implements IWorkbenchColorTheme { @@ -690,7 +690,7 @@ function toCSSSelector(extensionId: string, path: string) { return str; } -async function _loadColorTheme(extensionResourceLoaderService: IExtensionResourceLoaderService, themeLocation: URI, result: { textMateRules: ITextMateThemingRule[], colors: IColorMap, semanticTokenRules: SemanticTokenRule[], semanticHighlighting: boolean }): Promise { +async function _loadColorTheme(extensionResourceLoaderService: IExtensionResourceLoaderService, themeLocation: URI, result: { textMateRules: ITextMateThemingRule[]; colors: IColorMap; semanticTokenRules: SemanticTokenRule[]; semanticHighlighting: boolean }): Promise { if (resources.extname(themeLocation) === '.json') { const content = await extensionResourceLoaderService.readExtensionResource(themeLocation); let errors: Json.ParseError[] = []; @@ -749,7 +749,7 @@ async function _loadColorTheme(extensionResourceLoaderService: IExtensionResourc } } -function _loadSyntaxTokens(extensionResourceLoaderService: IExtensionResourceLoaderService, themeLocation: URI, result: { textMateRules: ITextMateThemingRule[], colors: IColorMap }): Promise { +function _loadSyntaxTokens(extensionResourceLoaderService: IExtensionResourceLoaderService, themeLocation: URI, result: { textMateRules: ITextMateThemingRule[]; colors: IColorMap }): Promise { return extensionResourceLoaderService.readExtensionResource(themeLocation).then(content => { try { let contentValue = parsePList(content); @@ -879,7 +879,7 @@ class TokenColorIndex { private _lastColorId: number; private _id2color: string[]; - private _color2id: { [color: string]: number; }; + private _color2id: { [color: string]: number }; constructor() { this._lastColorId = 0; diff --git a/src/vs/workbench/services/themes/common/iconExtensionPoint.ts b/src/vs/workbench/services/themes/common/iconExtensionPoint.ts index 37b3d82f176..df0ce27dc65 100644 --- a/src/vs/workbench/services/themes/common/iconExtensionPoint.ts +++ b/src/vs/workbench/services/themes/common/iconExtensionPoint.ts @@ -16,7 +16,7 @@ import { isProposedApiEnabled } from 'vs/workbench/services/extensions/common/ex interface IIconExtensionPoint { id: string; description: string; - default: { fontId: string; fontCharacter: string; } | string; + default: { fontId: string; fontCharacter: string } | string; } interface IIconFontExtensionPoint { diff --git a/src/vs/workbench/services/themes/common/themeCompatibility.ts b/src/vs/workbench/services/themes/common/themeCompatibility.ts index 7af65c955ad..0490bf80509 100644 --- a/src/vs/workbench/services/themes/common/themeCompatibility.ts +++ b/src/vs/workbench/services/themes/common/themeCompatibility.ts @@ -7,7 +7,7 @@ import { ITextMateThemingRule, IColorMap } from 'vs/workbench/services/themes/co import { Color } from 'vs/base/common/color'; import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; -import * as editorColorRegistry from 'vs/editor/common/view/editorColorRegistry'; +import * as editorColorRegistry from 'vs/editor/common/core/editorColorRegistry'; const settingToColorIdMapping: { [settingId: string]: string[] } = {}; function addSettingMapping(settingId: string, colorId: string) { @@ -18,7 +18,7 @@ function addSettingMapping(settingId: string, colorId: string) { colorIds.push(colorId); } -export function convertSettings(oldSettings: ITextMateThemingRule[], result: { textMateRules: ITextMateThemingRule[], colors: IColorMap }): void { +export function convertSettings(oldSettings: ITextMateThemingRule[], result: { textMateRules: ITextMateThemingRule[]; colors: IColorMap }): void { for (let rule of oldSettings) { result.textMateRules.push(rule); if (!rule.scope) { diff --git a/src/vs/workbench/services/themes/electron-sandbox/nativeHostColorSchemeService.ts b/src/vs/workbench/services/themes/electron-sandbox/nativeHostColorSchemeService.ts index 4bd56248c81..a60be414226 100644 --- a/src/vs/workbench/services/themes/electron-sandbox/nativeHostColorSchemeService.ts +++ b/src/vs/workbench/services/themes/electron-sandbox/nativeHostColorSchemeService.ts @@ -35,7 +35,7 @@ export class NativeHostColorSchemeService extends Disposable implements IHostCol // register listener with the OS this._register(this.nativeHostService.onDidChangeColorScheme(scheme => this.update(scheme))); - const initial = this.getStoredValue() ?? environmentService.configuration.colorScheme; + const initial = this.getStoredValue() ?? environmentService.window.colorScheme; this.dark = initial.dark; this.highContrast = initial.highContrast; diff --git a/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts b/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts index 95d73c79422..be43a275771 100644 --- a/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts +++ b/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts @@ -24,7 +24,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur const undefinedStyle = { bold: undefined, underline: undefined, italic: undefined }; const unsetStyle = { bold: false, underline: false, italic: false }; -function ts(foreground: string | undefined, styleFlags: { bold?: boolean; underline?: boolean; strikethrough?: boolean; italic?: boolean; } | undefined): TokenStyle { +function ts(foreground: string | undefined, styleFlags: { bold?: boolean; underline?: boolean; strikethrough?: boolean; italic?: boolean } | undefined): TokenStyle { const foregroundColor = isString(foreground) ? Color.fromHex(foreground) : undefined; return new TokenStyle(foregroundColor, styleFlags?.bold, styleFlags?.underline, styleFlags?.strikethrough, styleFlags?.italic); } @@ -68,7 +68,7 @@ function assertTokenStyleMetaData(colorIndex: string[], actual: ITokenStyle | un } -function assertTokenStyles(themeData: ColorThemeData, expected: { [qualifiedClassifier: string]: TokenStyle; }, language = 'typescript') { +function assertTokenStyles(themeData: ColorThemeData, expected: { [qualifiedClassifier: string]: TokenStyle }, language = 'typescript') { const colorIndex = themeData.tokenColorMap; for (let qualifiedClassifier in expected) { diff --git a/src/vs/workbench/services/timer/browser/timerService.ts b/src/vs/workbench/services/timer/browser/timerService.ts index a1c07383089..af521d442c4 100644 --- a/src/vs/workbench/services/timer/browser/timerService.ts +++ b/src/vs/workbench/services/timer/browser/timerService.ts @@ -383,7 +383,7 @@ export interface IStartupMetrics { readonly totalmem?: number; readonly freemem?: number; readonly meminfo?: IMemoryInfo; - readonly cpus?: { count: number; speed: number; model: string; }; + readonly cpus?: { count: number; speed: number; model: string }; readonly loadavg?: number[]; } @@ -526,12 +526,12 @@ export abstract class AbstractTimerService implements ITimerService { // 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 Mark = { source: string; name: string; relativeStartTime: number; startTime: number }; type MarkClassification = { - source: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth'; }, - name: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth'; }, - relativeStartTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true; }, - startTime: { classification: 'SystemMetaData', purpose: 'PerformanceAndHealth', isMeasurement: true; }, + source: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + name: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth' }; + relativeStartTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; + startTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true }; }; let lastMark: perf.PerformanceMark = marks[0]; diff --git a/src/vs/workbench/services/timer/electron-sandbox/timerService.ts b/src/vs/workbench/services/timer/electron-sandbox/timerService.ts index f051292eefb..19347cb694a 100644 --- a/src/vs/workbench/services/timer/electron-sandbox/timerService.ts +++ b/src/vs/workbench/services/timer/electron-sandbox/timerService.ts @@ -38,11 +38,11 @@ export class TimerService extends AbstractTimerService { @IStorageService private readonly _storageService: IStorageService ) { super(lifecycleService, contextService, extensionService, updateService, paneCompositeService, editorService, accessibilityService, telemetryService, layoutService); - this.setPerformanceMarks('main', _environmentService.configuration.perfMarks); + this.setPerformanceMarks('main', _environmentService.window.perfMarks); } protected _isInitialStartup(): boolean { - return Boolean(this._environmentService.configuration.isInitialStartup); + return Boolean(this._environmentService.window.isInitialStartup); } protected _didUseCachedData(): boolean { return didUseCachedData(this._productService, this._storageService, this._environmentService); @@ -97,7 +97,7 @@ export function didUseCachedData(productService: IProductService, storageService // this being the first start with the commit // or subsequent if (typeof _didUseCachedData !== 'boolean') { - if (!environmentService.configuration.codeCachePath || !productService.commit) { + if (!environmentService.window.isCodeCaching || !productService.commit) { _didUseCachedData = false; // we only produce cached data whith commit and code cache path } else if (storageService.get(lastRunningCommitStorageKey, StorageScope.GLOBAL) === productService.commit) { _didUseCachedData = true; // subsequent start on same commit, assume cached data is there diff --git a/src/vs/workbench/services/remote/browser/tunnelService.ts b/src/vs/workbench/services/tunnel/browser/tunnelService.ts similarity index 97% rename from src/vs/workbench/services/remote/browser/tunnelService.ts rename to src/vs/workbench/services/tunnel/browser/tunnelService.ts index 4dcabd046bc..d433bb69371 100644 --- a/src/vs/workbench/services/remote/browser/tunnelService.ts +++ b/src/vs/workbench/services/tunnel/browser/tunnelService.ts @@ -7,7 +7,7 @@ import { URI } from 'vs/base/common/uri'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; import { IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection'; -import { AbstractTunnelService, ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; +import { AbstractTunnelService, ITunnelService, RemoteTunnel } from 'vs/platform/tunnel/common/tunnel'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export class TunnelService extends AbstractTunnelService { diff --git a/src/vs/workbench/services/remote/electron-sandbox/tunnelService.ts b/src/vs/workbench/services/tunnel/electron-sandbox/tunnelService.ts similarity index 98% rename from src/vs/workbench/services/remote/electron-sandbox/tunnelService.ts rename to src/vs/workbench/services/tunnel/electron-sandbox/tunnelService.ts index 12791bcd23a..505f814d12c 100644 --- a/src/vs/workbench/services/remote/electron-sandbox/tunnelService.ts +++ b/src/vs/workbench/services/tunnel/electron-sandbox/tunnelService.ts @@ -7,7 +7,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { URI } from 'vs/base/common/uri'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ITunnelService, AbstractTunnelService, RemoteTunnel, TunnelPrivacyId } from 'vs/platform/remote/common/tunnel'; +import { ITunnelService, AbstractTunnelService, RemoteTunnel, TunnelPrivacyId } from 'vs/platform/tunnel/common/tunnel'; import { Disposable } from 'vs/base/common/lifecycle'; import { IAddressProvider } from 'vs/platform/remote/common/remoteAgentConnection'; import { ISharedProcessTunnelService } from 'vs/platform/remote/common/sharedProcessTunnelService'; diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts index 1693b50f891..f96c742e659 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { URI } from 'vs/base/common/uri'; import { DEFAULT_EDITOR_ASSOCIATION, findViewStateForEditor, GroupIdentifier, IUntitledTextResourceEditorInput, IUntypedEditorInput, Verbosity } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { AbstractTextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput'; @@ -128,7 +129,7 @@ export class UntitledTextEditorInput extends AbstractTextResourceEditorInput imp } override toUntyped(options?: { preserveViewState: GroupIdentifier }): IUntitledTextResourceEditorInput { - const untypedInput: IUntitledTextResourceEditorInput & { options: ITextEditorOptions } = { + const untypedInput: IUntitledTextResourceEditorInput & { resource: URI | undefined; options: ITextEditorOptions } = { resource: this.model.hasAssociatedFilePath ? toLocalResource(this.model.resource, this.environmentService.remoteAuthority, this.pathService.defaultUriScheme) : this.resource, forceUntitled: true, options: { @@ -141,6 +142,18 @@ export class UntitledTextEditorInput extends AbstractTextResourceEditorInput imp untypedInput.languageId = this.getLanguageId(); untypedInput.contents = this.model.isDirty() ? this.model.textEditorModel?.getValue() : undefined; untypedInput.options.viewState = findViewStateForEditor(this, options.preserveViewState, this.editorService); + + if (typeof untypedInput.contents === 'string' && !this.model.hasAssociatedFilePath) { + // Given how generic untitled resources in the system are, we + // need to be careful not to set our resource into the untyped + // editor if we want to transport contents too, because of + // issue https://github.com/microsoft/vscode/issues/140898 + // The workaround is to simply remove the resource association + // if we have contents and no associated resource. + // In that case we can ensure that a new untitled resource is + // being created and the contents can be restored properly. + untypedInput.resource = undefined; + } } return untypedInput; diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts index 169b8665dce..b399f395d18 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorModel.ts @@ -6,7 +6,7 @@ import { ISaveOptions } from 'vs/workbench/common/editor'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; import { URI } from 'vs/base/common/uri'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IModelService } from 'vs/editor/common/services/model'; import { Event, Emitter } from 'vs/base/common/event'; import { IWorkingCopyBackupService } from 'vs/workbench/services/workingCopy/common/workingCopyBackup'; @@ -17,10 +17,10 @@ import { ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { IWorkingCopy, WorkingCopyCapabilities, IWorkingCopyBackup, NO_TYPE_ID } from 'vs/workbench/services/workingCopy/common/workingCopy'; import { IEncodingSupport, ILanguageSupport, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IModelContentChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents'; import { withNullAsUndefined, assertIsDefined } from 'vs/base/common/types'; import { ILabelService } from 'vs/platform/label/common/label'; -import { ensureValidWordDefinition } from 'vs/editor/common/model/wordHelper'; +import { ensureValidWordDefinition } from 'vs/editor/common/core/wordHelper'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { getCharContainingOffset } from 'vs/base/common/strings'; diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorService.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorService.ts index 4dc2bc76f0f..3b31b992f6f 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorService.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorService.ts @@ -56,7 +56,7 @@ export interface INewUntitledTextEditorWithAssociatedResourceOptions extends INe * Note: currently it is not possible to specify the `scheme` to use. The * untitled editor will saved to the default local or remote resource. */ - associatedResource?: { authority: string; path: string; query: string; fragment: string; } + associatedResource?: { authority: string; path: string; query: string; fragment: string }; } type IInternalUntitledTextEditorOptions = IExistingUntitledTextEditorOptions & INewUntitledTextEditorWithAssociatedResourceOptions; diff --git a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts index 05ace610154..19d50a2e6f1 100644 --- a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts +++ b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts @@ -11,7 +11,7 @@ import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbe import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; import { snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; import { ModesRegistry, PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; -import { IIdentifiedSingleEditOperation } from 'vs/editor/common/model'; +import { ISingleEditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput'; import { IUntitledTextEditorModel } from 'vs/workbench/services/untitled/common/untitledTextEditorModel'; @@ -87,8 +87,10 @@ suite('Untitled text editors', () => { const dirtyUntypedInput = input2.toUntyped({ preserveViewState: 0 }); assert.strictEqual(dirtyUntypedInput.contents, 'foo bar'); + assert.strictEqual(dirtyUntypedInput.resource, undefined); const dirtyUntypedInputWithoutContent = input2.toUntyped(); + assert.strictEqual(dirtyUntypedInputWithoutContent.resource?.toString(), input2.resource.toString()); assert.strictEqual(dirtyUntypedInputWithoutContent.contents, undefined); assert.ok(workingCopyService.isDirty(input2.resource)); @@ -477,7 +479,7 @@ suite('Untitled text editors', () => { model.textEditorModel?.setValue('Hello\nWorld'); assert.strictEqual(counter, 7); - function createSingleEditOp(text: string, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): IIdentifiedSingleEditOperation { + function createSingleEditOp(text: string, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): ISingleEditOperation { let range = new Range( selectionLineNumber, selectionColumn, @@ -486,7 +488,6 @@ suite('Untitled text editors', () => { ); return { - identifier: null, range, text, forceMoveMarkers: false diff --git a/src/vs/workbench/services/update/browser/updateService.ts b/src/vs/workbench/services/update/browser/updateService.ts index 6e47235d31b..37814d5b856 100644 --- a/src/vs/workbench/services/update/browser/updateService.ts +++ b/src/vs/workbench/services/update/browser/updateService.ts @@ -6,7 +6,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IUpdateService, State, UpdateType } from 'vs/platform/update/common/update'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -39,7 +39,7 @@ export class BrowserUpdateService extends Disposable implements IUpdateService { } constructor( - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService, @IHostService private readonly hostService: IHostService ) { super(); diff --git a/src/vs/workbench/services/url/browser/urlService.ts b/src/vs/workbench/services/url/browser/urlService.ts index 0124e4760ca..7aec4c76552 100644 --- a/src/vs/workbench/services/url/browser/urlService.ts +++ b/src/vs/workbench/services/url/browser/urlService.ts @@ -8,7 +8,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { AbstractURLService } from 'vs/platform/url/common/urlService'; import { Event } from 'vs/base/common/event'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { IOpenerService, IOpener, OpenExternalOptions, OpenInternalOptions, matchesScheme } from 'vs/platform/opener/common/opener'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -67,7 +67,7 @@ export class BrowserURLService extends AbstractURLService { private provider: IURLCallbackProvider | undefined; constructor( - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IBrowserWorkbenchEnvironmentService environmentService: IBrowserWorkbenchEnvironmentService, @IOpenerService openerService: IOpenerService, @IProductService productService: IProductService ) { diff --git a/src/vs/workbench/services/userData/browser/userDataInit.ts b/src/vs/workbench/services/userData/browser/userDataInit.ts index 95b22469344..b2a85b9e458 100644 --- a/src/vs/workbench/services/userData/browser/userDataInit.ts +++ b/src/vs/workbench/services/userData/browser/userDataInit.ts @@ -36,6 +36,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; +import { TasksInitializer } from 'vs/platform/userDataSync/common/tasksSync'; export const IUserDataInitializationService = createDecorator('IUserDataInitializationService'); export interface IUserDataInitializationService { @@ -185,7 +186,7 @@ export class UserDataInitializationService implements IUserDataInitializationSer async initializeOtherResources(instantiationService: IInstantiationService): Promise { try { this.logService.trace(`UserDataInitializationService#initializeOtherResources`); - await Promise.allSettled([this.initialize([SyncResource.Keybindings, SyncResource.Snippets]), this.initializeExtensions(instantiationService)]); + await Promise.allSettled([this.initialize([SyncResource.Keybindings, SyncResource.Snippets, SyncResource.Tasks]), this.initializeExtensions(instantiationService)]); } finally { this.initializationFinished.open(); } @@ -271,6 +272,7 @@ export class UserDataInitializationService implements IUserDataInitializationSer switch (syncResource) { case SyncResource.Settings: return new SettingsInitializer(this.fileService, this.environmentService, this.logService, this.uriIdentityService); case SyncResource.Keybindings: return new KeybindingsInitializer(this.fileService, this.environmentService, this.logService, this.uriIdentityService); + case SyncResource.Tasks: return new TasksInitializer(this.fileService, this.environmentService, this.logService, this.uriIdentityService); case SyncResource.Snippets: return new SnippetsInitializer(this.fileService, this.environmentService, this.logService, this.uriIdentityService); case SyncResource.GlobalState: return new GlobalStateInitializer(this.storageService, this.fileService, this.environmentService, this.logService, this.uriIdentityService); } @@ -374,15 +376,8 @@ class NewExtensionsInitializer implements IUserDataInitializer { } const newlyEnabledExtensions: ILocalExtension[] = []; - const uuids: string[] = [], names: string[] = []; - for (const { uuid, id } of preview.newExtensions) { - if (uuid) { - uuids.push(uuid); - } else { - names.push(id); - } - } - const galleryExtensions = (await this.galleryService.query({ ids: uuids, names: names, pageSize: uuids.length + names.length }, CancellationToken.None)).firstPage; + const targetPlatform = await this.extensionManagementService.getTargetPlatform(); + const galleryExtensions = await this.galleryService.getExtensions(preview.newExtensions, { targetPlatform, compatible: true }, CancellationToken.None); for (const galleryExtension of galleryExtensions) { try { const extensionToSync = preview.remoteExtensions.find(({ identifier }) => areSameExtensions(identifier, galleryExtension.identifier)); diff --git a/src/vs/workbench/services/userDataSync/browser/userDataSyncEnablementService.ts b/src/vs/workbench/services/userDataSync/browser/userDataSyncEnablementService.ts index 29c3845e953..bfc01daa46e 100644 --- a/src/vs/workbench/services/userDataSync/browser/userDataSyncEnablementService.ts +++ b/src/vs/workbench/services/userDataSync/browser/userDataSyncEnablementService.ts @@ -5,11 +5,11 @@ import { IUserDataSyncEnablementService, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncEnablementService as BaseUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; export class UserDataSyncEnablementService extends BaseUserDataSyncEnablementService implements IUserDataSyncEnablementService { - protected get workbenchEnvironmentService(): IWorkbenchEnvironmentService { return this.environmentService; } + protected get workbenchEnvironmentService(): IBrowserWorkbenchEnvironmentService { return this.environmentService; } override getResourceSyncStateVersion(resource: SyncResource): string | undefined { return resource === SyncResource.Extensions ? this.workbenchEnvironmentService.options?.settingsSyncOptions?.extensionsSyncStateVersion : undefined; diff --git a/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts b/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts index f5146dd58a4..29ff6f8a218 100644 --- a/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts +++ b/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts @@ -7,11 +7,11 @@ import { IUserDataSyncService, IAuthenticationProvider, isAuthenticationProvider import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IUserDataSyncWorkbenchService, IUserDataSyncAccount, AccountStatus, CONTEXT_SYNC_ENABLEMENT, CONTEXT_SYNC_STATE, CONTEXT_ACCOUNT_STATE, SHOW_SYNC_LOG_COMMAND_ID, getSyncAreaLabel, IUserDataSyncPreview, IUserDataSyncResource, CONTEXT_ENABLE_SYNC_MERGES_VIEW, SYNC_MERGES_VIEW_ID, CONTEXT_ENABLE_ACTIVITY_VIEWS, SYNC_VIEW_CONTAINER_ID, SYNC_TITLE } from 'vs/workbench/services/userDataSync/common/userDataSync'; -import { AuthenticationSession, AuthenticationSessionsChangeEvent } from 'vs/editor/common/languages'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; import { flatten, equals } from 'vs/base/common/arrays'; -import { getCurrentAuthenticationSessionInfo, IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { getCurrentAuthenticationSessionInfo } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { AuthenticationSession, AuthenticationSessionsChangeEvent, IAuthenticationService } from 'vs/workbench/services/authentication/common/authentication'; import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { IQuickInputService, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; import { IStorageService, IStorageValueChangeEvent, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; @@ -37,12 +37,12 @@ import { UserDataSyncStoreTypeSynchronizer } from 'vs/platform/userDataSync/comm import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; type UserAccountClassification = { - id: { classification: 'EndUserPseudonymizedInformation', purpose: 'BusinessInsight' }; - providerId: { classification: 'EndUserPseudonymizedInformation', purpose: 'BusinessInsight' }; + id: { classification: 'EndUserPseudonymizedInformation'; purpose: 'BusinessInsight' }; + providerId: { classification: 'EndUserPseudonymizedInformation'; purpose: 'BusinessInsight' }; }; type FirstTimeSyncClassification = { - action: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; + action: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true }; }; type UserAccountEvent = { @@ -52,7 +52,7 @@ type UserAccountEvent = { type FirstTimeSyncAction = 'pull' | 'push' | 'merge' | 'manual'; -type AccountQuickPickItem = { label: string, authenticationProvider: IAuthenticationProvider, account?: UserDataSyncAccount, description?: string }; +type AccountQuickPickItem = { label: string; authenticationProvider: IAuthenticationProvider; account?: UserDataSyncAccount; description?: string }; class UserDataSyncAccount implements IUserDataSyncAccount { @@ -234,7 +234,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat } private async updateToken(current: UserDataSyncAccount | undefined): Promise { - let value: { token: string, authenticationProviderId: string } | undefined = undefined; + let value: { token: string; authenticationProviderId: string } | undefined = undefined; if (current) { try { this.logService.trace('Settings Sync: Updating the token for the account', current.accountName); @@ -267,7 +267,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat return; } if (this.userDataSyncService.status !== SyncStatus.Idle) { - throw new Error('Cannont turn on sync while syncing'); + throw new Error('Cannot turn on sync while syncing'); } const picked = await this.pick(); @@ -289,7 +289,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat } if (this.userDataSyncService.status !== SyncStatus.Idle) { - throw new Error('Cannont turn on sync while syncing'); + throw new Error('Cannot turn on sync while syncing'); } if (this.accountStatus !== AccountStatus.Available) { @@ -696,7 +696,7 @@ class UserDataSyncPreview extends Disposable implements IUserDataSyncPreview { private _onDidCompleteManualSync = this._register(new Emitter()); readonly onDidCompleteManualSync = this._onDidCompleteManualSync.event; - private manualSync: { preview: [SyncResource, ISyncResourcePreview][], task: IManualSyncTask, disposables: DisposableStore } | undefined; + private manualSync: { preview: [SyncResource, ISyncResourcePreview][]; task: IManualSyncTask; disposables: DisposableStore } | undefined; constructor( private readonly userDataSyncService: IUserDataSyncService diff --git a/src/vs/workbench/services/userDataSync/common/userDataSync.ts b/src/vs/workbench/services/userDataSync/common/userDataSync.ts index fcf13eae627..a6e289f706d 100644 --- a/src/vs/workbench/services/userDataSync/common/userDataSync.ts +++ b/src/vs/workbench/services/userDataSync/common/userDataSync.ts @@ -74,6 +74,7 @@ export function getSyncAreaLabel(source: SyncResource): string { case SyncResource.Settings: return localize('settings', "Settings"); case SyncResource.Keybindings: return localize('keybindings', "Keyboard Shortcuts"); case SyncResource.Snippets: return localize('snippets', "User Snippets"); + case SyncResource.Tasks: return localize('tasks', "User Tasks"); case SyncResource.Extensions: return localize('extensions', "Extensions"); case SyncResource.GlobalState: return localize('ui state label', "UI State"); } diff --git a/src/vs/workbench/services/userDataSync/electron-sandbox/userDataSyncMachinesService.ts b/src/vs/workbench/services/userDataSync/electron-sandbox/userDataSyncMachinesService.ts index 6a12f780a9a..2cfd3183d25 100644 --- a/src/vs/workbench/services/userDataSync/electron-sandbox/userDataSyncMachinesService.ts +++ b/src/vs/workbench/services/userDataSync/electron-sandbox/userDataSyncMachinesService.ts @@ -41,8 +41,8 @@ class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMac return this.channel.call('renameMachine', [machineId, name]); } - setEnablement(machineId: string, enabled: boolean): Promise { - return this.channel.call('setEnablement', [machineId, enabled]); + setEnablements(enablements: [string, boolean][]): Promise { + return this.channel.call('setEnablements', enablements); } } diff --git a/src/vs/workbench/services/views/browser/viewDescriptorService.ts b/src/vs/workbench/services/views/browser/viewDescriptorService.ts index 677caa66ec2..5241c249fc6 100644 --- a/src/vs/workbench/services/views/browser/viewDescriptorService.ts +++ b/src/vs/workbench/services/views/browser/viewDescriptorService.ts @@ -34,16 +34,16 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor private static readonly CACHED_VIEW_CONTAINER_LOCATIONS = 'views.cachedViewContainerLocations'; private static readonly COMMON_CONTAINER_ID_PREFIX = 'workbench.views.service'; - private readonly _onDidChangeContainer: Emitter<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>()); - readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }> = this._onDidChangeContainer.event; + private readonly _onDidChangeContainer: Emitter<{ views: IViewDescriptor[]; from: ViewContainer; to: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[]; from: ViewContainer; to: ViewContainer }>()); + readonly onDidChangeContainer: Event<{ views: IViewDescriptor[]; from: ViewContainer; to: ViewContainer }> = this._onDidChangeContainer.event; - private readonly _onDidChangeLocation: Emitter<{ views: IViewDescriptor[], from: ViewContainerLocation, to: ViewContainerLocation }> = this._register(new Emitter<{ views: IViewDescriptor[], from: ViewContainerLocation, to: ViewContainerLocation }>()); - readonly onDidChangeLocation: Event<{ views: IViewDescriptor[], from: ViewContainerLocation, to: ViewContainerLocation }> = this._onDidChangeLocation.event; + private readonly _onDidChangeLocation: Emitter<{ views: IViewDescriptor[]; from: ViewContainerLocation; to: ViewContainerLocation }> = this._register(new Emitter<{ views: IViewDescriptor[]; from: ViewContainerLocation; to: ViewContainerLocation }>()); + readonly onDidChangeLocation: Event<{ views: IViewDescriptor[]; from: ViewContainerLocation; to: ViewContainerLocation }> = this._onDidChangeLocation.event; - private readonly _onDidChangeContainerLocation: Emitter<{ viewContainer: ViewContainer, from: ViewContainerLocation, to: ViewContainerLocation }> = this._register(new Emitter<{ viewContainer: ViewContainer, from: ViewContainerLocation, to: ViewContainerLocation }>()); - readonly onDidChangeContainerLocation: Event<{ viewContainer: ViewContainer, from: ViewContainerLocation, to: ViewContainerLocation }> = this._onDidChangeContainerLocation.event; + private readonly _onDidChangeContainerLocation: Emitter<{ viewContainer: ViewContainer; from: ViewContainerLocation; to: ViewContainerLocation }> = this._register(new Emitter<{ viewContainer: ViewContainer; from: ViewContainerLocation; to: ViewContainerLocation }>()); + readonly onDidChangeContainerLocation: Event<{ viewContainer: ViewContainer; from: ViewContainerLocation; to: ViewContainerLocation }> = this._onDidChangeContainerLocation.event; - private readonly viewContainerModels: Map; + private readonly viewContainerModels: Map; private readonly viewsVisibilityActionDisposables: Map; private readonly activeViewContextKeys: Map>; private readonly movableViewContextKeys: Map>; @@ -88,7 +88,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor } } - private readonly _onDidChangeViewContainers = this._register(new Emitter<{ added: ReadonlyArray<{ container: ViewContainer, location: ViewContainerLocation }>, removed: ReadonlyArray<{ container: ViewContainer, location: ViewContainerLocation }> }>()); + private readonly _onDidChangeViewContainers = this._register(new Emitter<{ added: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }>; removed: ReadonlyArray<{ container: ViewContainer; location: ViewContainerLocation }> }>()); readonly onDidChangeViewContainers = this._onDidChangeViewContainers.event; get viewContainers(): ReadonlyArray { return this.viewContainersRegistry.all; } @@ -101,7 +101,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor ) { super(); - this.viewContainerModels = new Map(); + this.viewContainerModels = new Map(); this.viewsVisibilityActionDisposables = new Map(); this.activeViewContextKeys = new Map>(); this.movableViewContextKeys = new Map>(); @@ -144,7 +144,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor this._register(this.extensionService.onDidRegisterExtensions(() => this.onDidRegisterExtensions())); } - private registerGroupedViews(groupedViews: Map): void { + private registerGroupedViews(groupedViews: Map): void { // Register views that have already been registered to their correct view containers for (const containerId of groupedViews.keys()) { const viewContainer = this.viewContainersRegistry.get(containerId); @@ -170,7 +170,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor } } - private deregisterGroupedViews(groupedViews: Map): void { + private deregisterGroupedViews(groupedViews: Map): void { // Register views that have already been registered to their correct view containers for (const viewContainerId of groupedViews.keys()) { const viewContainer = this.viewContainersRegistry.get(viewContainerId); @@ -212,7 +212,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor } } - private onDidRegisterViews(views: { views: IViewDescriptor[], viewContainer: ViewContainer }[]): void { + private onDidRegisterViews(views: { views: IViewDescriptor[]; viewContainer: ViewContainer }[]): void { this.contextKeyService.bufferChangeEvents(() => { views.forEach(({ views, viewContainer }) => { // When views are registered, we need to regroup them based on the cache @@ -241,8 +241,8 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor }); } - private regroupViews(containerId: string, views: IViewDescriptor[]): Map { - const ret = new Map(); + private regroupViews(containerId: string, views: IViewDescriptor[]): Map { + const ret = new Map(); views.forEach(viewDescriptor => { const containerInfo = this.cachedViewInfo.get(viewDescriptor.id); @@ -419,11 +419,11 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor } type ViewDescriptorServiceMoveViewsClassification = { - viewCount: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - fromContainer: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - toContainer: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - fromLocation: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - toLocation: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; + viewCount: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + fromContainer: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + toContainer: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + fromLocation: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; + toLocation: { classification: 'SystemMetaData'; purpose: 'FeatureInsight' }; }; this.telemetryService.publicLog2('viewDescriptorService.moveViews', { viewCount, fromContainer, toContainer, fromLocation, toLocation }); @@ -731,14 +731,14 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor } } - private onDidChangeActiveViews({ added, removed }: { added: ReadonlyArray, removed: ReadonlyArray; }): void { + private onDidChangeActiveViews({ added, removed }: { added: ReadonlyArray; removed: ReadonlyArray }): void { this.contextKeyService.bufferChangeEvents(() => { added.forEach(viewDescriptor => this.getOrCreateActiveViewContextKey(viewDescriptor).set(true)); removed.forEach(viewDescriptor => this.getOrCreateActiveViewContextKey(viewDescriptor).set(false)); }); } - private onDidChangeVisibleViews({ added, removed }: { added: IViewDescriptor[], removed: IViewDescriptor[]; }): void { + private onDidChangeVisibleViews({ added, removed }: { added: IViewDescriptor[]; removed: IViewDescriptor[] }): void { this.contextKeyService.bufferChangeEvents(() => { added.forEach(viewDescriptor => this.getOrCreateVisibleViewContextKey(viewDescriptor).set(true)); removed.forEach(viewDescriptor => this.getOrCreateVisibleViewContextKey(viewDescriptor).set(false)); diff --git a/src/vs/workbench/services/views/common/viewContainerModel.ts b/src/vs/workbench/services/views/common/viewContainerModel.ts index b373ac69109..21fbe13df29 100644 --- a/src/vs/workbench/services/views/common/viewContainerModel.ts +++ b/src/vs/workbench/services/views/common/viewContainerModel.ts @@ -68,7 +68,7 @@ interface IViewDescriptorState { visibleGlobal: boolean | undefined; visibleWorkspace: boolean | undefined; collapsed: boolean | undefined; - active: boolean + active: boolean; order?: number; size?: number; } @@ -79,7 +79,7 @@ class ViewDescriptorsState extends Disposable { private readonly globalViewsStateStorageId: string; private readonly state: Map; - private _onDidChangeStoredState = this._register(new Emitter<{ id: string, visible: boolean }[]>()); + private _onDidChangeStoredState = this._register(new Emitter<{ id: string; visible: boolean }[]>()); readonly onDidChangeStoredState = this._onDidChangeStoredState.event; constructor( @@ -109,7 +109,7 @@ class ViewDescriptorsState extends Disposable { } private updateWorkspaceState(viewDescriptors: ReadonlyArray): void { - const storedViewsStates: { [id: string]: IStoredWorkspaceViewState; } = JSON.parse(this.storageService.get(this.workspaceViewsStateStorageId, StorageScope.WORKSPACE, '{}')); + const storedViewsStates: { [id: string]: IStoredWorkspaceViewState } = JSON.parse(this.storageService.get(this.workspaceViewsStateStorageId, StorageScope.WORKSPACE, '{}')); for (const viewDescriptor of viewDescriptors) { const viewState = this.state.get(viewDescriptor.id); if (viewState) { @@ -147,7 +147,7 @@ class ViewDescriptorsState extends Disposable { && this.globalViewsStatesValue !== this.getStoredGlobalViewsStatesValue() /* This checks if current window changed the value or not */) { this._globalViewsStatesValue = undefined; const storedViewsVisibilityStates = this.getStoredGlobalState(); - const changedStates: { id: string, visible: boolean }[] = []; + const changedStates: { id: string; visible: boolean }[] = []; for (const [id, storedState] of storedViewsVisibilityStates) { const state = this.state.get(id); if (state) { @@ -164,7 +164,7 @@ class ViewDescriptorsState extends Disposable { private initialize(): Map { const viewStates = new Map(); - const workspaceViewsStates = <{ [id: string]: IStoredWorkspaceViewState; }>JSON.parse(this.storageService.get(this.workspaceViewsStateStorageId, StorageScope.WORKSPACE, '{}')); + const workspaceViewsStates = <{ [id: string]: IStoredWorkspaceViewState }>JSON.parse(this.storageService.get(this.workspaceViewsStateStorageId, StorageScope.WORKSPACE, '{}')); for (const id of Object.keys(workspaceViewsStates)) { const workspaceViewState = workspaceViewsStates[id]; viewStates.set(id, { @@ -232,7 +232,7 @@ class ViewDescriptorsState extends Disposable { this.globalViewsStatesValue = JSON.stringify([...storedGlobalState.values()]); } - private parseStoredGlobalState(value: string): { state: Map, hasDuplicates: boolean } { + private parseStoredGlobalState(value: string): { state: Map; hasDuplicates: boolean } { const storedValue = >JSON.parse(value); let hasDuplicates = false; const state = storedValue.reduce((result, storedState) => { @@ -295,17 +295,17 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode private _keybindingId: string | undefined; get keybindingId(): string | undefined { return this._keybindingId; } - private _onDidChangeContainerInfo = this._register(new Emitter<{ title?: boolean, icon?: boolean, keybindingId?: boolean }>()); + private _onDidChangeContainerInfo = this._register(new Emitter<{ title?: boolean; icon?: boolean; keybindingId?: boolean }>()); readonly onDidChangeContainerInfo = this._onDidChangeContainerInfo.event; // All View Descriptors get allViewDescriptors(): ReadonlyArray { return this.viewDescriptorItems.map(item => item.viewDescriptor); } - private _onDidChangeAllViewDescriptors = this._register(new Emitter<{ added: ReadonlyArray, removed: ReadonlyArray }>()); + private _onDidChangeAllViewDescriptors = this._register(new Emitter<{ added: ReadonlyArray; removed: ReadonlyArray }>()); readonly onDidChangeAllViewDescriptors = this._onDidChangeAllViewDescriptors.event; // Active View Descriptors get activeViewDescriptors(): ReadonlyArray { return this.viewDescriptorItems.filter(item => item.state.active).map(item => item.viewDescriptor); } - private _onDidChangeActiveViewDescriptors = this._register(new Emitter<{ added: ReadonlyArray, removed: ReadonlyArray }>()); + private _onDidChangeActiveViewDescriptors = this._register(new Emitter<{ added: ReadonlyArray; removed: ReadonlyArray }>()); readonly onDidChangeActiveViewDescriptors = this._onDidChangeActiveViewDescriptors.event; // Visible View Descriptors @@ -317,8 +317,8 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode private _onDidRemoveVisibleViewDescriptors = this._register(new Emitter()); readonly onDidRemoveVisibleViewDescriptors: Event = this._onDidRemoveVisibleViewDescriptors.event; - private _onDidMoveVisibleViewDescriptors = this._register(new Emitter<{ from: IViewDescriptorRef; to: IViewDescriptorRef; }>()); - readonly onDidMoveVisibleViewDescriptors: Event<{ from: IViewDescriptorRef; to: IViewDescriptorRef; }> = this._onDidMoveVisibleViewDescriptors.event; + private _onDidMoveVisibleViewDescriptors = this._register(new Emitter<{ from: IViewDescriptorRef; to: IViewDescriptorRef }>()); + readonly onDidMoveVisibleViewDescriptors: Event<{ from: IViewDescriptorRef; to: IViewDescriptorRef }> = this._onDidMoveVisibleViewDescriptors.event; constructor( readonly viewContainer: ViewContainer, @@ -393,11 +393,11 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode this.updateVisibility([{ id, visible, size }]); } - private updateVisibility(viewDescriptors: { id: string, visible: boolean, size?: number }[]): void { + private updateVisibility(viewDescriptors: { id: string; visible: boolean; size?: number }[]): void { const { toBeAdded, toBeRemoved } = groupBy(viewDescriptors, viewDescriptor => viewDescriptor.visible ? 'toBeAdded' : 'toBeRemoved'); - const updateVisibility = (viewDescriptors: { id: string, visible: boolean, size?: number }[]): { viewDescriptorItem: IViewDescriptorItem, visibleIndex: number }[] => { - const result: { viewDescriptorItem: IViewDescriptorItem, visibleIndex: number }[] = []; + const updateVisibility = (viewDescriptors: { id: string; visible: boolean; size?: number }[]): { viewDescriptorItem: IViewDescriptorItem; visibleIndex: number }[] => { + const result: { viewDescriptorItem: IViewDescriptorItem; visibleIndex: number }[] = []; for (const { id, visible, size } of viewDescriptors) { const foundViewDescriptor = this.findAndIgnoreIfNotFound(id); if (!foundViewDescriptor) { @@ -525,7 +525,7 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode this.viewDescriptorItems.sort(this.compareViewDescriptors.bind(this)); this._onDidChangeAllViewDescriptors.fire({ added: addedItems.map(({ viewDescriptor }) => viewDescriptor), removed: [] }); - const addedActiveItems: { viewDescriptorItem: IViewDescriptorItem, visible: boolean }[] = []; + const addedActiveItems: { viewDescriptorItem: IViewDescriptorItem; visible: boolean }[] = []; for (const viewDescriptorItem of addedItems) { if (viewDescriptorItem.state.active) { addedActiveItems.push({ viewDescriptorItem, visible: this.isViewDescriptorVisible(viewDescriptorItem) }); @@ -585,7 +585,7 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode } private onDidChangeContext(): void { - const addedActiveItems: { item: IViewDescriptorItem, visibleWhenActive: boolean }[] = []; + const addedActiveItems: { item: IViewDescriptorItem; visibleWhenActive: boolean }[] = []; const removedActiveItems: IViewDescriptorItem[] = []; for (const item of this.viewDescriptorItems) { @@ -654,7 +654,7 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode return !!viewDescriptorItem.state.visibleGlobal; } - private find(id: string): { index: number, visibleIndex: number, viewDescriptorItem: IViewDescriptorItem; } { + private find(id: string): { index: number; visibleIndex: number; viewDescriptorItem: IViewDescriptorItem } { const result = this.findAndIgnoreIfNotFound(id); if (result) { return result; @@ -662,7 +662,7 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode throw new Error(`view descriptor ${id} not found`); } - private findAndIgnoreIfNotFound(id: string): { index: number, visibleIndex: number, viewDescriptorItem: IViewDescriptorItem; } | undefined { + private findAndIgnoreIfNotFound(id: string): { index: number; visibleIndex: number; viewDescriptorItem: IViewDescriptorItem } | undefined { for (let i = 0, visibleIndex = 0; i < this.viewDescriptorItems.length; i++) { const viewDescriptorItem = this.viewDescriptorItems[i]; if (viewDescriptorItem.viewDescriptor.id === id) { diff --git a/src/vs/workbench/services/workingCopy/common/fileWorkingCopyManager.ts b/src/vs/workbench/services/workingCopy/common/fileWorkingCopyManager.ts index 82498f418cc..90623819487 100644 --- a/src/vs/workbench/services/workingCopy/common/fileWorkingCopyManager.ts +++ b/src/vs/workbench/services/workingCopy/common/fileWorkingCopyManager.ts @@ -417,7 +417,7 @@ export class FileWorkingCopyManager }> { + private async doResolveSaveTarget(source: URI, target: URI): Promise<{ targetFileExists: boolean; targetStoredFileWorkingCopy: IStoredFileWorkingCopy }> { // Prefer an existing stored file working copy if it is already resolved // for the given target resource diff --git a/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopyManager.ts b/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopyManager.ts index 2d76e0ba434..6e3e128939e 100644 --- a/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopyManager.ts +++ b/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopyManager.ts @@ -323,14 +323,14 @@ export class StoredFileWorkingCopyManager //#region Working Copy File Events - private readonly mapCorrelationIdToWorkingCopiesToRestore = new Map(); + private readonly mapCorrelationIdToWorkingCopiesToRestore = new Map(); private onWillRunWorkingCopyFileOperation(e: WorkingCopyFileEvent): void { // Move / Copy: remember working copies to restore after the operation if (e.operation === FileOperation.MOVE || e.operation === FileOperation.COPY) { e.waitUntil((async () => { - const workingCopiesToRestore: { source: URI, target: URI, snapshot?: VSBufferReadableStream; }[] = []; + const workingCopiesToRestore: { source: URI; target: URI; snapshot?: VSBufferReadableStream }[] = []; for (const { source, target } of e.files) { if (source) { diff --git a/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopySaveParticipant.ts b/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopySaveParticipant.ts index 0a549727b85..18be856eb47 100644 --- a/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopySaveParticipant.ts +++ b/src/vs/workbench/services/workingCopy/common/storedFileWorkingCopySaveParticipant.ts @@ -33,7 +33,7 @@ export class StoredFileWorkingCopySaveParticipant extends Disposable { return toDisposable(() => remove()); } - participate(workingCopy: IStoredFileWorkingCopy, context: { reason: SaveReason; }, token: CancellationToken): Promise { + participate(workingCopy: IStoredFileWorkingCopy, context: { reason: SaveReason }, token: CancellationToken): Promise { const cts = new CancellationTokenSource(token); return this.progressService.withProgress({ diff --git a/src/vs/workbench/services/workingCopy/common/untitledFileWorkingCopyManager.ts b/src/vs/workbench/services/workingCopy/common/untitledFileWorkingCopyManager.ts index c101e6a6ba9..7640a135058 100644 --- a/src/vs/workbench/services/workingCopy/common/untitledFileWorkingCopyManager.ts +++ b/src/vs/workbench/services/workingCopy/common/untitledFileWorkingCopyManager.ts @@ -79,7 +79,7 @@ export interface INewUntitledFileWorkingCopyWithAssociatedResourceOptions extend * Note: currently it is not possible to specify the `scheme` to use. The * untitled file working copy will saved to the default local or remote resource. */ - associatedResource: { authority?: string; path?: string; query?: string; fragment?: string; } + associatedResource: { authority?: string; path?: string; query?: string; fragment?: string }; } export interface INewOrExistingUntitledFileWorkingCopyOptions extends INewUntitledFileWorkingCopyOptions { diff --git a/src/vs/workbench/services/workingCopy/common/workingCopyBackupService.ts b/src/vs/workbench/services/workingCopy/common/workingCopyBackupService.ts index 056f9354ec7..9ccbda9d093 100644 --- a/src/vs/workbench/services/workingCopy/common/workingCopyBackupService.ts +++ b/src/vs/workbench/services/workingCopy/common/workingCopyBackupService.ts @@ -23,7 +23,7 @@ import { IWorkingCopyBackupMeta, IWorkingCopyIdentifier, NO_TYPE_ID } from 'vs/w export class WorkingCopyBackupsModel { - private readonly cache = new ResourceMap<{ versionId?: number, meta?: IWorkingCopyBackupMeta }>(); + private readonly cache = new ResourceMap<{ versionId?: number; meta?: IWorkingCopyBackupMeta }>(); static async create(backupRoot: URI, fileService: IFileService): Promise { const model = new WorkingCopyBackupsModel(backupRoot, fileService); @@ -515,7 +515,7 @@ class WorkingCopyBackupServiceImpl extends Disposable implements IWorkingCopyBac return { value, meta }; } - private parsePreambleMeta(preambleMetaRaw: string | undefined): { typeId: string | undefined, meta: T | undefined } { + private parsePreambleMeta(preambleMetaRaw: string | undefined): { typeId: string | undefined; meta: T | undefined } { let typeId: string | undefined = undefined; let meta: T | undefined = undefined; @@ -554,7 +554,7 @@ export class InMemoryWorkingCopyBackupService implements IWorkingCopyBackupServi declare readonly _serviceBrand: undefined; - private backups = new ResourceMap<{ typeId: string, content: VSBuffer, meta?: IWorkingCopyBackupMeta }>(); + private backups = new ResourceMap<{ typeId: string; content: VSBuffer; meta?: IWorkingCopyBackupMeta }>(); constructor() { } diff --git a/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts b/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts index 0990ac6c713..5e830f345ef 100644 --- a/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts +++ b/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts @@ -34,7 +34,7 @@ export interface SourceTargetPair { /** * The target resource the event is about. */ - readonly target: URI + readonly target: URI; } export interface IFileOperationUndoRedoInfo { @@ -47,7 +47,7 @@ export interface IFileOperationUndoRedoInfo { /** * Flag indicates if the operation is an undo. */ - isUndoing?: boolean + isUndoing?: boolean; } export interface WorkingCopyFileEvent extends IWaitUntil { @@ -104,7 +104,7 @@ export interface ICreateOperation { } export interface ICreateFileOperation extends ICreateOperation { - contents?: VSBuffer | VSBufferReadable | VSBufferReadableStream, + contents?: VSBuffer | VSBufferReadable | VSBufferReadableStream; } export interface IDeleteOperation { @@ -191,7 +191,7 @@ export interface IWorkingCopyFileService { /** * Runs all available save participants for stored file working copies. */ - runSaveParticipants(workingCopy: IStoredFileWorkingCopy, context: { reason: SaveReason; }, token: CancellationToken): Promise; + runSaveParticipants(workingCopy: IStoredFileWorkingCopy, context: { reason: SaveReason }, token: CancellationToken): Promise; //#endregion @@ -492,7 +492,7 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi return this.saveParticipants.addSaveParticipant(participant); } - runSaveParticipants(workingCopy: IStoredFileWorkingCopy, context: { reason: SaveReason; }, token: CancellationToken): Promise { + runSaveParticipants(workingCopy: IStoredFileWorkingCopy, context: { reason: SaveReason }, token: CancellationToken): Promise { return this.saveParticipants.participate(workingCopy, context, token); } diff --git a/src/vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService.ts b/src/vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService.ts index ee86a367485..d4c07c0f67a 100644 --- a/src/vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService.ts +++ b/src/vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService.ts @@ -23,7 +23,7 @@ export class NativeWorkingCopyBackupService extends WorkingCopyBackupService { @ILogService logService: ILogService, @ILifecycleService private readonly lifecycleService: ILifecycleService ) { - super(environmentService.configuration.backupPath ? URI.file(environmentService.configuration.backupPath).with({ scheme: environmentService.userRoamingDataHome.scheme }) : undefined, fileService, logService); + super(environmentService.backupPath ? URI.file(environmentService.backupPath).with({ scheme: environmentService.userRoamingDataHome.scheme }) : undefined, fileService, logService); this.registerListeners(); } diff --git a/src/vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupTracker.ts b/src/vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupTracker.ts index 497f47af677..1e799f1a565 100644 --- a/src/vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupTracker.ts +++ b/src/vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupTracker.ts @@ -217,7 +217,7 @@ export class NativeWorkingCopyBackupTracker extends WorkingCopyBackupTracker imp this.logService.error(error ? `[backup tracker] ${msg}: ${error}` : `[backup tracker] ${msg}`); } - private async backupBeforeShutdown(dirtyWorkingCopies: readonly IWorkingCopy[]): Promise<{ backups: IWorkingCopy[], error?: Error }> { + private async backupBeforeShutdown(dirtyWorkingCopies: readonly IWorkingCopy[]): Promise<{ backups: IWorkingCopy[]; error?: Error }> { const backups: IWorkingCopy[] = []; let error: Error | undefined = undefined; diff --git a/src/vs/workbench/services/workingCopy/test/browser/workingCopyBackupTracker.test.ts b/src/vs/workbench/services/workingCopy/test/browser/workingCopyBackupTracker.test.ts index 6e50280f54b..59c2c3e7188 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/workingCopyBackupTracker.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/workingCopyBackupTracker.test.ts @@ -86,7 +86,7 @@ suite('WorkingCopyBackupTracker (browser)', function () { } } - async function createTracker(): Promise<{ accessor: TestServiceAccessor, part: EditorPart, tracker: TestWorkingCopyBackupTracker, workingCopyBackupService: InMemoryTestWorkingCopyBackupService, instantiationService: IInstantiationService, cleanup: () => void }> { + async function createTracker(): Promise<{ accessor: TestServiceAccessor; part: EditorPart; tracker: TestWorkingCopyBackupTracker; workingCopyBackupService: InMemoryTestWorkingCopyBackupService; instantiationService: IInstantiationService; cleanup: () => void }> { const disposables = new DisposableStore(); const workingCopyBackupService = new InMemoryTestWorkingCopyBackupService(); diff --git a/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts b/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts index d929db05b64..2ae43c821eb 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts @@ -322,7 +322,7 @@ suite('WorkingCopyFileService', () => { return eventCounter; } - async function testMoveOrCopy(files: { source: URI, target: URI }[], move: boolean, targetDirty?: boolean): Promise { + async function testMoveOrCopy(files: { source: URI; target: URI }[], move: boolean, targetDirty?: boolean): Promise { let eventCounter = 0; const models = await Promise.all(files.map(async ({ source, target }, i) => { diff --git a/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts b/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts index e45fd933733..59ccdfb7205 100644 --- a/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupService.test.ts @@ -27,7 +27,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { NativeWorkingCopyBackupService } from 'vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService'; import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataProvider'; import { bufferToReadable, bufferToStream, streamToBuffer, VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; -import { TestWorkbenchConfiguration } from 'vs/workbench/test/electron-browser/workbenchTestServices'; +import { TestNativeWindowConfiguration } from 'vs/workbench/test/electron-browser/workbenchTestServices'; import { TestLifecycleService, TestProductService, toTypedWorkingCopyId, toUntypedWorkingCopyId } from 'vs/workbench/test/browser/workbenchTestServices'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { IWorkingCopyBackupMeta, IWorkingCopyIdentifier } from 'vs/workbench/services/workingCopy/common/workingCopy'; @@ -36,7 +36,7 @@ import { consumeStream } from 'vs/base/common/stream'; class TestWorkbenchEnvironmentService extends NativeWorkbenchEnvironmentService { constructor(testDir: string, backupPath: string) { - super({ ...TestWorkbenchConfiguration, backupPath, 'user-data-dir': testDir }, TestProductService); + super({ ...TestNativeWindowConfiguration, backupPath, 'user-data-dir': testDir }, TestProductService); } } @@ -60,7 +60,7 @@ export class NodeTestWorkingCopyBackupService extends NativeWorkingCopyBackupSer this.diskFileSystemProvider = new DiskFileSystemProvider(logService); fileService.registerProvider(Schemas.file, this.diskFileSystemProvider); - fileService.registerProvider(Schemas.userData, new FileUserDataProvider(Schemas.file, this.diskFileSystemProvider, Schemas.userData, fileService, logService)); + fileService.registerProvider(Schemas.userData, new FileUserDataProvider(Schemas.file, this.diskFileSystemProvider, Schemas.userData, logService)); this.fileService = fileService; this.backupResourceJoiners = []; diff --git a/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupTracker.test.ts b/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupTracker.test.ts index 44575541afe..afec37298da 100644 --- a/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupTracker.test.ts +++ b/src/vs/workbench/services/workingCopy/test/electron-browser/workingCopyBackupTracker.test.ts @@ -92,7 +92,7 @@ flakySuite('WorkingCopyBackupTracker (native)', function () { private readonly _onDidSuspend = this._register(new Emitter()); readonly onDidSuspend = this._onDidSuspend.event; - protected override suspendBackupOperations(): { resume: () => void; } { + protected override suspendBackupOperations(): { resume: () => void } { const { resume } = super.suspendBackupOperations(); this._onDidSuspend.fire(); @@ -142,7 +142,7 @@ flakySuite('WorkingCopyBackupTracker (native)', function () { return Promises.rm(testDir); }); - async function createTracker(autoSaveEnabled = false): Promise<{ accessor: TestServiceAccessor, part: EditorPart, tracker: TestWorkingCopyBackupTracker, instantiationService: IInstantiationService, cleanup: () => Promise }> { + async function createTracker(autoSaveEnabled = false): Promise<{ accessor: TestServiceAccessor; part: EditorPart; tracker: TestWorkingCopyBackupTracker; instantiationService: IInstantiationService; cleanup: () => Promise }> { const workingCopyBackupService = new NodeTestWorkingCopyBackupService(testDir, workspaceBackupPath); const instantiationService = workbenchInstantiationService(disposables); instantiationService.stub(IWorkingCopyBackupService, workingCopyBackupService); diff --git a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts index 50c5b5df065..4da4c1acbb7 100644 --- a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts @@ -6,9 +6,9 @@ import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { hasWorkspaceFileExtension, isUntitledWorkspace, IWorkspaceContextService, IWorkspaceIdentifier, WorkbenchState, WORKSPACE_EXTENSION, WORKSPACE_FILTER } from 'vs/platform/workspace/common/workspace'; import { IJSONEditingService, JSONEditingError, JSONEditingErrorCode } from 'vs/workbench/services/configuration/common/jsonEditing'; -import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService, rewriteWorkspaceFileForNewLocation, WORKSPACE_FILTER, IEnterWorkspaceResult, hasWorkspaceFileExtension, WORKSPACE_EXTENSION, isUntitledWorkspace, IStoredWorkspace } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceFolderCreationData, IWorkspacesService, rewriteWorkspaceFileForNewLocation, IEnterWorkspaceResult, IStoredWorkspace } from 'vs/platform/workspaces/common/workspaces'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; import { ConfigurationScope, IConfigurationRegistry, Extensions as ConfigurationExtensions, IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; diff --git a/src/vs/workbench/services/workspaces/browser/workspaces.ts b/src/vs/workbench/services/workspaces/browser/workspaces.ts index 3b90080dc3d..98278cf23ea 100644 --- a/src/vs/workbench/services/workspaces/browser/workspaces.ts +++ b/src/vs/workbench/services/workspaces/browser/workspaces.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { URI } from 'vs/base/common/uri'; import { hash } from 'vs/base/common/hash'; diff --git a/src/vs/workbench/services/workspaces/browser/workspacesService.ts b/src/vs/workbench/services/workspaces/browser/workspacesService.ts index e4265208b57..e1329f2337a 100644 --- a/src/vs/workbench/services/workspaces/browser/workspacesService.ts +++ b/src/vs/workbench/services/workspaces/browser/workspacesService.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IWorkspacesService, IWorkspaceFolderCreationData, IWorkspaceIdentifier, IEnterWorkspaceResult, IRecentlyOpened, restoreRecentlyOpened, IRecent, isRecentFile, isRecentFolder, toStoreData, IStoredWorkspaceFolder, getStoredWorkspaceFolder, WORKSPACE_EXTENSION, IStoredWorkspace, IFolderBackupInfo, IWorkspaceBackupInfo } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesService, IWorkspaceFolderCreationData, IEnterWorkspaceResult, IRecentlyOpened, restoreRecentlyOpened, IRecent, isRecentFile, isRecentFolder, toStoreData, IStoredWorkspaceFolder, getStoredWorkspaceFolder, IStoredWorkspace, IFolderBackupInfo, IWorkspaceBackupInfo } from 'vs/platform/workspaces/common/workspaces'; import { URI } from 'vs/base/common/uri'; import { Emitter } from 'vs/base/common/event'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, IWorkspaceIdentifier, WorkbenchState, WORKSPACE_EXTENSION } from 'vs/platform/workspace/common/workspace'; import { ILogService } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; import { getWorkspaceIdentifier } from 'vs/workbench/services/workspaces/browser/workspaces'; diff --git a/src/vs/workbench/services/workspaces/common/workspaceEditing.ts b/src/vs/workbench/services/workspaces/common/workspaceEditing.ts index 400fdac1944..6ae82b2fa00 100644 --- a/src/vs/workbench/services/workspaces/common/workspaceEditing.ts +++ b/src/vs/workbench/services/workspaces/common/workspaceEditing.ts @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkspaceIdentifier, IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; import { URI } from 'vs/base/common/uri'; +import { IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; export const IWorkspaceEditingService = createDecorator('workspaceEditingService'); diff --git a/src/vs/workbench/services/workspaces/common/workspaceTrust.ts b/src/vs/workbench/services/workspaces/common/workspaceTrust.ts index 6f315a7cf90..2d52bf4edc9 100644 --- a/src/vs/workbench/services/workspaces/common/workspaceTrust.ts +++ b/src/vs/workbench/services/workspaces/common/workspaceTrust.ts @@ -12,15 +12,17 @@ import { IPath } from 'vs/platform/windows/common/windows'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IRemoteAuthorityResolverService, ResolverResult } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { getRemoteAuthority, isVirtualResource } from 'vs/platform/remote/common/remoteHosts'; +import { getRemoteAuthority } from 'vs/platform/remote/common/remoteHosts'; +import { isVirtualResource } from 'vs/platform/workspace/common/virtualWorkspace'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { IWorkspace, IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isUntitledWorkspace, IWorkspace, IWorkspaceContextService, IWorkspaceFolder, toWorkspaceIdentifier, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { WorkspaceTrustRequestOptions, IWorkspaceTrustManagementService, IWorkspaceTrustInfo, IWorkspaceTrustUriInfo, IWorkspaceTrustRequestService, IWorkspaceTrustTransitionParticipant, WorkspaceTrustUriResponse, IWorkspaceTrustEnablementService } from 'vs/platform/workspace/common/workspaceTrust'; -import { ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isUntitledWorkspace, toWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { Memento, MementoObject } from 'vs/workbench/common/memento'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { isEqualAuthority } from 'vs/base/common/resources'; +import { ILogService } from 'vs/platform/log/common/log'; +import { isCI } from 'vs/base/common/platform'; export const WORKSPACE_TRUST_ENABLED = 'security.workspace.trust.enabled'; export const WORKSPACE_TRUST_STARTUP_PROMPT = 'security.workspace.trust.startupPrompt'; @@ -117,7 +119,8 @@ export class WorkspaceTrustManagementService extends Disposable implements IWork @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, - @IWorkspaceTrustEnablementService private readonly workspaceTrustEnablementService: IWorkspaceTrustEnablementService + @IWorkspaceTrustEnablementService private readonly workspaceTrustEnablementService: IWorkspaceTrustEnablementService, + @ILogService protected readonly _logService: ILogService, ) { super(); @@ -144,6 +147,10 @@ export class WorkspaceTrustManagementService extends Disposable implements IWork //#region initialize private initializeWorkspaceTrust(): void { + if (isCI) { + this._logService.info(`Enter initializeWorkspaceTrust()...`); + } + // Resolve canonical Uris this.resolveCanonicalUris() .then(async () => { @@ -151,8 +158,16 @@ export class WorkspaceTrustManagementService extends Disposable implements IWork await this.updateWorkspaceTrust(); }) .finally(() => { + if (isCI) { + this._logService.info(`Open workspaceResolved gate...`); + } + this._workspaceResolvedPromiseResolve(); if (!this.environmentService.remoteAuthority) { + if (isCI) { + this._logService.info(`Open workspaceTrustInitialized gate...`); + } + this._workspaceTrustInitializedPromiseResolve(); } }); @@ -212,14 +227,18 @@ export class WorkspaceTrustManagementService extends Disposable implements IWork } private async resolveCanonicalUris(): Promise { - // Open editors - const filesToOpen: IPath[] = []; - if (this.environmentService.configuration.filesToOpenOrCreate) { - filesToOpen.push(...this.environmentService.configuration.filesToOpenOrCreate); + if (isCI) { + this._logService.info('Enter resolveCanonicalUris()...'); } - if (this.environmentService.configuration.filesToDiff) { - filesToOpen.push(...this.environmentService.configuration.filesToDiff); + // Open editors + const filesToOpen: IPath[] = []; + if (this.environmentService.filesToOpenOrCreate) { + filesToOpen.push(...this.environmentService.filesToOpenOrCreate); + } + + if (this.environmentService.filesToDiff) { + filesToOpen.push(...this.environmentService.filesToDiff); } if (filesToOpen.length) { @@ -239,6 +258,10 @@ export class WorkspaceTrustManagementService extends Disposable implements IWork } this._canonicalWorkspace = new CanonicalWorkspace(this.workspaceService.getWorkspace(), canonicalWorkspaceFolders, canonicalWorkspaceConfiguration); + + if (isCI) { + this._logService.info('Exit resolveCanonicalUris()...'); + } } private loadTrustInfo(): IWorkspaceTrustInfo { @@ -320,7 +343,15 @@ export class WorkspaceTrustManagementService extends Disposable implements IWork } private async updateWorkspaceTrust(trusted?: boolean): Promise { + if (isCI) { + this._logService.info(`Enter updateWorkspaceTrust()...`); + } + if (!this.workspaceTrustEnablementService.isWorkspaceTrustEnabled()) { + if (isCI) { + this._logService.info(`Workspace trust is disabled.`); + } + return; } @@ -650,6 +681,9 @@ export class WorkspaceTrustRequestService extends Disposable implements IWorkspa private readonly _onDidInitiateWorkspaceTrustRequest = this._register(new Emitter()); readonly onDidInitiateWorkspaceTrustRequest = this._onDidInitiateWorkspaceTrustRequest.event; + private readonly _onDidInitiateWorkspaceTrustRequestOnStartup = this._register(new Emitter()); + readonly onDidInitiateWorkspaceTrustRequestOnStartup = this._onDidInitiateWorkspaceTrustRequestOnStartup.event; + constructor( @IConfigurationService private readonly configurationService: IConfigurationService, @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService @@ -793,6 +827,17 @@ export class WorkspaceTrustRequestService extends Disposable implements IWorkspa return this._workspaceTrustRequestPromise; } + requestWorkspaceTrustOnStartup(): void { + if (!this._workspaceTrustRequestPromise) { + // Create promise + this._workspaceTrustRequestPromise = new Promise(resolve => { + this._workspaceTrustRequestResolver = resolve; + }); + } + + this._onDidInitiateWorkspaceTrustRequestOnStartup.fire(); + } + //#endregion } diff --git a/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts index 4c38630f743..36afeafd483 100644 --- a/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService.ts @@ -6,9 +6,9 @@ import { localize } from 'vs/nls'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { URI } from 'vs/base/common/uri'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { hasWorkspaceFileExtension, isUntitledWorkspace, isWorkspaceIdentifier, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing'; -import { IWorkspacesService, isUntitledWorkspace, hasWorkspaceFileExtension, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts b/src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts index 6abfd823a1b..636b664aa6f 100644 --- a/src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts +++ b/src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts @@ -109,6 +109,9 @@ export class TestWorkspaceTrustRequestService implements IWorkspaceTrustRequestS private readonly _onDidInitiateWorkspaceTrustRequest = new Emitter(); readonly onDidInitiateWorkspaceTrustRequest = this._onDidInitiateWorkspaceTrustRequest.event; + private readonly _onDidInitiateWorkspaceTrustRequestOnStartup = new Emitter(); + readonly onDidInitiateWorkspaceTrustRequestOnStartup = this._onDidInitiateWorkspaceTrustRequestOnStartup.event; + constructor(private readonly _trusted: boolean) { } requestOpenUrisHandler = async (uris: URI[]) => { @@ -134,4 +137,8 @@ export class TestWorkspaceTrustRequestService implements IWorkspaceTrustRequestS async requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise { return this._trusted; } + + requestWorkspaceTrustOnStartup(): void { + throw new Error('Method not implemented.'); + } } diff --git a/src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts b/src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts index db0640b5cfa..da388396897 100644 --- a/src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts +++ b/src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts @@ -10,7 +10,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { FileService } from 'vs/platform/files/common/fileService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { NullLogService } from 'vs/platform/log/common/log'; +import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -28,6 +28,7 @@ suite('Workspace Trust', () => { let instantiationService: TestInstantiationService; let configurationService: TestConfigurationService; let environmentService: IWorkbenchEnvironmentService; + let logService: ILogService; setup(async () => { instantiationService = new TestInstantiationService(); @@ -35,10 +36,13 @@ suite('Workspace Trust', () => { configurationService = new TestConfigurationService(); instantiationService.stub(IConfigurationService, configurationService); - environmentService = { configuration: {} } as IWorkbenchEnvironmentService; + environmentService = {} as IWorkbenchEnvironmentService; instantiationService.stub(IWorkbenchEnvironmentService, environmentService); - instantiationService.stub(IUriIdentityService, new UriIdentityService(new FileService(new NullLogService()))); + logService = new NullLogService(); + instantiationService.stub(ILogService, logService); + + instantiationService.stub(IUriIdentityService, new UriIdentityService(new FileService(logService))); instantiationService.stub(IRemoteAuthorityResolverService, new class extends mock() { }); }); @@ -111,7 +115,7 @@ suite('Workspace Trust', () => { const trustInfo: IWorkspaceTrustInfo = { uriTrustInfo: [{ uri: URI.parse('file:///Folder'), trusted: true }] }; storageService.store(WORKSPACE_TRUST_STORAGE_KEY, JSON.stringify(trustInfo), StorageScope.GLOBAL, StorageTarget.MACHINE); - environmentService.configuration.filesToOpenOrCreate = [{ fileUri: URI.parse('file:///Folder/file.txt') }]; + (environmentService as any).filesToOpenOrCreate = [{ fileUri: URI.parse('file:///Folder/file.txt') }]; instantiationService.stub(IWorkbenchEnvironmentService, { ...environmentService }); workspaceService.setWorkspace(new Workspace('empty-workspace')); @@ -123,7 +127,7 @@ suite('Workspace Trust', () => { test('empty workspace - trusted, open untrusted file', async () => { await configurationService.setUserConfiguration('security', getUserSettings(true, true)); - environmentService.configuration.filesToOpenOrCreate = [{ fileUri: URI.parse('file:///Folder/foo.txt') }]; + (environmentService as any).filesToOpenOrCreate = [{ fileUri: URI.parse('file:///Folder/foo.txt') }]; instantiationService.stub(IWorkbenchEnvironmentService, { ...environmentService }); workspaceService.setWorkspace(new Workspace('empty-workspace')); diff --git a/src/vs/workbench/test/browser/codeeditor.test.ts b/src/vs/workbench/test/browser/codeeditor.test.ts index 7c1bda2dec1..c0be9631aec 100644 --- a/src/vs/workbench/test/browser/codeeditor.test.ts +++ b/src/vs/workbench/test/browser/codeeditor.test.ts @@ -8,7 +8,7 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { URI } from 'vs/base/common/uri'; import { workbenchInstantiationService, TestEditorService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { RangeHighlightDecorations } from 'vs/workbench/browser/codeeditor'; import { TextModel } from 'vs/editor/common/model/textModel'; @@ -18,7 +18,7 @@ import { Position } from 'vs/editor/common/core/position'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelService } from 'vs/editor/common/services/modelService'; -import { CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/browser/coreCommands'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; diff --git a/src/vs/workbench/test/browser/parts/editor/editor.test.ts b/src/vs/workbench/test/browser/parts/editor/editor.test.ts index c0d0024eaaf..c0c2e4f1bf4 100644 --- a/src/vs/workbench/test/browser/parts/editor/editor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editor.test.ts @@ -204,13 +204,13 @@ suite('Workbench editor utils', () => { assert.strictEqual(EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: Schemas.untitled })!.toString(), untitled.resource.toString()); assert.strictEqual(EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), untitled.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource.toString()); assert.ok(!EditorResourceAccessor.getOriginalUri(input)); assert.ok(!EditorResourceAccessor.getOriginalUri(input, { filterByScheme: Schemas.file })); @@ -223,13 +223,13 @@ suite('Workbench editor utils', () => { assert.strictEqual(EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: Schemas.untitled })!.toString(), untitled.resource.toString()); assert.strictEqual(EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), untitled.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(input, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource.toString()); } const resource = URI.file('/some/path.txt'); @@ -308,13 +308,13 @@ suite('Workbench editor utils', () => { assert.strictEqual(EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: Schemas.untitled })!.toString(), untitled.resource?.toString()); assert.strictEqual(EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), untitled.resource?.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource?.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource?.toString()); - assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource?.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource?.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource?.toString()); + assert.strictEqual((EditorResourceAccessor.getCanonicalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource?.toString()); assert.ok(!EditorResourceAccessor.getOriginalUri(untypedInput)); assert.ok(!EditorResourceAccessor.getOriginalUri(untypedInput, { filterByScheme: Schemas.file })); @@ -327,13 +327,13 @@ suite('Workbench editor utils', () => { assert.strictEqual(EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: Schemas.untitled })!.toString(), untitled.resource?.toString()); assert.strictEqual(EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.SECONDARY, filterByScheme: [Schemas.file, Schemas.untitled] })!.toString(), untitled.resource?.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.file }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI; secondary: URI }).primary.toString(), file.resource.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource?.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource?.toString()); - assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI, secondary: URI }).secondary.toString(), untitled.resource?.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource?.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: Schemas.untitled }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource?.toString()); + assert.strictEqual((EditorResourceAccessor.getOriginalUri(untypedInput, { supportSideBySide: SideBySideEditor.BOTH, filterByScheme: [Schemas.file, Schemas.untitled] }) as { primary: URI; secondary: URI }).secondary.toString(), untitled.resource?.toString()); } }); diff --git a/src/vs/workbench/test/browser/parts/editor/editorGroupModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorGroupModel.test.ts index a1dc48560bf..e4d1a8c16a4 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorGroupModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorGroupModel.test.ts @@ -79,9 +79,9 @@ suite('EditorGroupModel', () => { } interface GroupEvents { - locked: number[], - active: number[], - index: number[], + locked: number[]; + active: number[]; + index: number[]; opened: IEditorOpenEvent[]; activated: EditorInput[]; closed: IEditorCloseEvent[]; diff --git a/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts index d53ffe69b30..466bce2aa80 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorModel.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; import { IModelService } from 'vs/editor/common/services/model'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; diff --git a/src/vs/workbench/test/browser/parts/editor/editorPane.test.ts b/src/vs/workbench/test/browser/parts/editor/editorPane.test.ts index b85b95202db..af2853ce8b6 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorPane.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorPane.test.ts @@ -286,7 +286,7 @@ suite('EditorPane', () => { const configurationService = new TestTextResourceConfigurationService(); const editorGroupService = new TestEditorGroupsService([testGroup0]); - interface TestViewState { line: number; } + interface TestViewState { line: number } const rawMemento = Object.create(null); const memento = new EditorMemento('id', 'key', rawMemento, 3, editorGroupService, configurationService); @@ -419,7 +419,7 @@ suite('EditorPane', () => { })); const editorGroupService = new TestEditorGroupsService([testGroup0]); - interface TestViewState { line: number; } + interface TestViewState { line: number } const rawMemento = Object.create(null); const memento = new EditorMemento('id', 'key', rawMemento, 3, editorGroupService, configurationService); diff --git a/src/vs/workbench/test/browser/parts/editor/textEditorPane.test.ts b/src/vs/workbench/test/browser/parts/editor/textEditorPane.test.ts new file mode 100644 index 00000000000..793b47a2e8a --- /dev/null +++ b/src/vs/workbench/test/browser/parts/editor/textEditorPane.test.ts @@ -0,0 +1,98 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { toResource } from 'vs/base/test/common/utils'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { workbenchInstantiationService, TestServiceAccessor, registerTestFileEditor, createEditorPart } from 'vs/workbench/test/browser/workbenchTestServices'; +import { IResolvedTextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; +import { EditorPaneSelectionChangeReason, EditorPaneSelectionCompareResult, IEditorPaneSelectionChangeEvent, isEditorPaneWithSelection } from 'vs/workbench/common/editor'; +import { DeferredPromise } from 'vs/base/common/async'; +import { TextEditorPaneSelection } from 'vs/workbench/browser/parts/editor/textEditor'; +import { Selection } from 'vs/editor/common/core/selection'; +import { IEditorOptions } from 'vs/platform/editor/common/editor'; + +suite('TextEditorPane', () => { + + const disposables = new DisposableStore(); + + setup(() => { + disposables.add(registerTestFileEditor()); + }); + + teardown(() => { + disposables.clear(); + }); + + async function createServices(): Promise { + const instantiationService = workbenchInstantiationService(undefined, disposables); + + const part = await createEditorPart(instantiationService, disposables); + instantiationService.stub(IEditorGroupsService, part); + + const editorService = instantiationService.createInstance(EditorService); + instantiationService.stub(IEditorService, editorService); + + return instantiationService.createInstance(TestServiceAccessor); + } + + test('editor pane selection', async function () { + const accessor = await createServices(); + + const resource = toResource.call(this, '/path/index.txt'); + let pane = await accessor.editorService.openEditor({ resource }); + + assert.ok(pane && isEditorPaneWithSelection(pane)); + + const onDidFireSelectionEventOfEditType = new DeferredPromise(); + pane.onDidChangeSelection(e => { + if (e.reason === EditorPaneSelectionChangeReason.EDIT) { + onDidFireSelectionEventOfEditType.complete(e); + } + }); + + // Changing model reports selection change + // of EDIT kind + + const model = await accessor.textFileService.files.resolve(resource) as IResolvedTextFileEditorModel; + model.textEditorModel.setValue('Hello World'); + + const event = await onDidFireSelectionEventOfEditType.p; + assert.strictEqual(event.reason, EditorPaneSelectionChangeReason.EDIT); + + // getSelection() works and can be restored + // + // Note: this is a bit bogus because in tests our code editors have + // no view and no cursor can be set as such. So the selection + // will always report for the first line and column. + + const selection = pane.getSelection(); + assert.ok(selection); + await pane.group?.closeAllEditors(); + const options = selection.restore({}); + pane = await accessor.editorService.openEditor({ resource, options }); + + assert.ok(pane && isEditorPaneWithSelection(pane)); + + const newSelection = pane.getSelection(); + assert.ok(newSelection); + assert.strictEqual(newSelection.compare(selection), EditorPaneSelectionCompareResult.IDENTICAL); + }); + + test('TextEditorPaneSelection', function () { + const sel1 = new TextEditorPaneSelection(new Selection(1, 1, 2, 2)); + const sel2 = new TextEditorPaneSelection(new Selection(5, 5, 6, 6)); + const sel3 = new TextEditorPaneSelection(new Selection(50, 50, 60, 60)); + const sel4 = { compare: () => { throw new Error(); }, restore: (options: IEditorOptions) => options }; + + assert.strictEqual(sel1.compare(sel1), EditorPaneSelectionCompareResult.IDENTICAL); + assert.strictEqual(sel1.compare(sel2), EditorPaneSelectionCompareResult.SIMILAR); + assert.strictEqual(sel1.compare(sel3), EditorPaneSelectionCompareResult.DIFFERENT); + assert.strictEqual(sel1.compare(sel4), EditorPaneSelectionCompareResult.DIFFERENT); + }); +}); diff --git a/src/vs/workbench/test/browser/parts/statusbar/statusbarModel.test.ts b/src/vs/workbench/test/browser/parts/statusbar/statusbarModel.test.ts index ff8a88edb2e..c42d46e4d88 100644 --- a/src/vs/workbench/test/browser/parts/statusbar/statusbarModel.test.ts +++ b/src/vs/workbench/test/browser/parts/statusbar/statusbarModel.test.ts @@ -43,7 +43,7 @@ suite('Workbench status bar model', () => { assert.ok(model.findEntry(container)); - let didChangeEntryVisibility: { id: string, visible: boolean } = { id: '', visible: false }; + let didChangeEntryVisibility: { id: string; visible: boolean } = { id: '', visible: false }; model.onDidChangeEntryVisibility(e => { didChangeEntryVisibility = e; }); diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 4cfeaac60b0..56a6fd5f089 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -10,7 +10,7 @@ import { URI } from 'vs/base/common/uri'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; -import { EditorInputWithOptions, IEditorIdentifier, IUntitledTextResourceEditorInput, IResourceDiffEditorInput, IEditorPane, IEditorCloseEvent, IEditorPartOptions, IRevertOptions, GroupIdentifier, EditorsOrder, IFileEditorInput, IEditorFactoryRegistry, IEditorSerializer, EditorExtensions, ISaveOptions, IMoveResult, ITextDiffEditorPane, IVisibleEditorPane, IEditorOpenContext, EditorExtensions as Extensions, EditorInputCapabilities, IUntypedEditorInput, IEditorWillMoveEvent, IEditorWillOpenEvent, IActiveEditorChangeEvent } from 'vs/workbench/common/editor'; +import { EditorInputWithOptions, IEditorIdentifier, IUntitledTextResourceEditorInput, IResourceDiffEditorInput, IEditorPane, IEditorCloseEvent, IEditorPartOptions, IRevertOptions, GroupIdentifier, EditorsOrder, IFileEditorInput, IEditorFactoryRegistry, IEditorSerializer, EditorExtensions, ISaveOptions, IMoveResult, ITextDiffEditorPane, IVisibleEditorPane, IEditorOpenContext, EditorExtensions as Extensions, EditorInputCapabilities, IUntypedEditorInput, IEditorWillMoveEvent, IEditorWillOpenEvent, IActiveEditorChangeEvent, EditorPaneSelectionChangeReason, IEditorPaneSelection } from 'vs/workbench/common/editor'; import { EditorServiceImpl, IEditorGroupView, IEditorGroupsAccessor, IEditorGroupTitleHeight } from 'vs/workbench/browser/parts/editor/editor'; import { Event, Emitter } from 'vs/base/common/event'; import { IResolvedWorkingCopyBackup, IWorkingCopyBackupService } from 'vs/workbench/services/workingCopy/common/workingCopyBackup'; @@ -18,9 +18,9 @@ import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configur import { IWorkbenchLayoutService, PanelAlignment, Parts, Position as PartPosition } from 'vs/workbench/services/layout/browser/layoutService'; import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { IEditorOptions, IResourceEditorInput, IEditorModel, IResourceEditorInputIdentifier, ITextResourceEditorInput, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { IEditorOptions, IResourceEditorInput, IEditorModel, IResourceEditorInputIdentifier, ITextResourceEditorInput } from 'vs/platform/editor/common/editor'; import { IUntitledTextEditorService, UntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { ILifecycleService, ShutdownReason, StartupKind, LifecyclePhase, WillShutdownEvent, BeforeShutdownErrorEvent, InternalBeforeShutdownEvent } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { FileOperationEvent, IFileService, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, ICreateFileOptions, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, IFileStatWithMetadata, IResolveMetadataFileOptions, IWriteFileOptions, IReadFileOptions, IFileContent, IFileStreamContent, FileOperationError, IFileSystemProviderWithFileReadStreamCapability, FileReadStreamOptions, IReadFileStreamOptions, IFileSystemProviderCapabilitiesChangeEvent } from 'vs/platform/files/common/files'; @@ -28,7 +28,7 @@ import { IModelService } from 'vs/editor/common/services/model'; import { LanguageService } from 'vs/editor/common/services/languageService'; import { ModelService } from 'vs/editor/common/services/modelService'; import { IResourceEncoding, ITextFileService, IReadTextFileOptions, ITextFileStreamContent, IWriteTextFileOptions, ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; @@ -93,7 +93,7 @@ import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogSer import { CodeEditorService } from 'vs/workbench/services/editor/browser/codeEditorService'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { IChange, IDiffEditor, IEditor } from 'vs/editor/common/editorCommon'; +import { IDiffEditor, IEditor } from 'vs/editor/common/editorCommon'; import { IInputBox, IInputOptions, IPickOptions, IQuickInputButton, IQuickInputService, IQuickNavigateConfiguration, IQuickPick, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; import { QuickInputService } from 'vs/workbench/services/quickinput/browser/quickInputService'; import { IListService } from 'vs/platform/list/browser/listService'; @@ -119,7 +119,7 @@ import { TextFileEditor } from 'vs/workbench/contrib/files/browser/editors/textF import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput'; import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput'; import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; -import { IEnterWorkspaceResult, IFolderBackupInfo, IRecent, IRecentlyOpened, IWorkspaceBackupInfo, IWorkspaceFolderCreationData, IWorkspaceIdentifier, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; +import { IEnterWorkspaceResult, IFolderBackupInfo, IRecent, IRecentlyOpened, IWorkspaceBackupInfo, IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust'; import { TestWorkspaceTrustManagementService, TestWorkspaceTrustRequestService } from 'vs/workbench/services/workspaces/test/common/testWorkspaceTrustService'; import { IExtensionTerminalProfile, IShellLaunchConfig, ITerminalProfile, TerminalLocation, TerminalShellType } from 'vs/platform/terminal/common/terminal'; @@ -132,7 +132,7 @@ import { IEditorResolverService } from 'vs/workbench/services/editor/common/edit import { IWorkingCopyEditorService, WorkingCopyEditorService } from 'vs/workbench/services/workingCopy/common/workingCopyEditorService'; import { IElevatedFileService } from 'vs/workbench/services/files/common/elevatedFileService'; import { BrowserElevatedFileService } from 'vs/workbench/services/files/browser/elevatedFileService'; -import { IDiffComputationResult, IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; +import { IEditorWorkerService, IUnicodeHighlightsResult } from 'vs/editor/common/services/editorWorker'; import { TextEdit, IInplaceReplaceSupportResult } from 'vs/editor/common/languages'; import { ResourceMap } from 'vs/base/common/map'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; @@ -141,7 +141,7 @@ import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/b import { IPaneCompositePart, IPaneCompositeSelectorPart } from 'vs/workbench/browser/parts/paneCompositePart'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService'; -import { FindReplaceState } from 'vs/editor/contrib/find/findState'; +import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { TerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorInput'; import { DeserializedTerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorSerializer'; import { IGroupModelChangeEvent } from 'vs/workbench/common/editor/editorGroupModel'; @@ -149,6 +149,10 @@ import { env } from 'vs/base/common/process'; import { isValidBasename } from 'vs/base/common/extpath'; import { TestAccessibilityService } from 'vs/platform/accessibility/test/common/testAccessibilityService'; import { ILanguageFeatureDebounceService, LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { IChange, IDiffComputationResult } from 'vs/editor/common/diff/diffComputer'; +import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; +import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService'; export function createFileEditorInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined, undefined, undefined, undefined, undefined); @@ -176,17 +180,25 @@ export class TestTextResourceEditor extends TextResourceEditor { export class TestTextFileEditor extends TextFileEditor { - lastSetOptions: ITextEditorOptions | undefined = undefined; - - override setOptions(options: ITextEditorOptions | undefined): void { - this.lastSetOptions = options; - - super.setOptions(options); - } - protected override createEditorControl(parent: HTMLElement, configuration: any): IEditor { return this.instantiationService.createInstance(TestCodeEditor, parent, configuration, {}); } + + fireSelectionChangeEvent(reason: EditorPaneSelectionChangeReason) { + this._onDidChangeSelection.fire({ reason }); + } + + private _testSelection: IEditorPaneSelection | undefined = undefined; + + setSelection(selection: IEditorPaneSelection | undefined, reason: EditorPaneSelectionChangeReason): void { + this._testSelection = selection; + + this._onDidChangeSelection.fire({ reason }); + } + + override getSelection(): IEditorPaneSelection | undefined { + return this._testSelection ?? super.getSelection(); + } } export interface ITestInstantiationService extends IInstantiationService { @@ -196,10 +208,10 @@ export interface ITestInstantiationService extends IInstantiationService { export function workbenchInstantiationService( overrides?: { textFileService?: (instantiationService: IInstantiationService) => ITextFileService; - pathService?: (instantiationService: IInstantiationService) => IPathService, - editorService?: (instantiationService: IInstantiationService) => IEditorService, - contextKeyService?: (instantiationService: IInstantiationService) => IContextKeyService, - textEditorService?: (instantiationService: IInstantiationService) => ITextEditorService + pathService?: (instantiationService: IInstantiationService) => IPathService; + editorService?: (instantiationService: IInstantiationService) => IEditorService; + contextKeyService?: (instantiationService: IInstantiationService) => IContextKeyService; + textEditorService?: (instantiationService: IInstantiationService) => ITextEditorService; }, disposables: DisposableStore = new DisposableStore() ): ITestInstantiationService { @@ -234,6 +246,7 @@ export function workbenchInstantiationService( instantiationService.stub(IAccessibilityService, accessibilityService); instantiationService.stub(IFileDialogService, instantiationService.createInstance(TestFileDialogService)); instantiationService.stub(ILanguageService, disposables.add(instantiationService.createInstance(LanguageService))); + instantiationService.stub(ILanguageFeaturesService, new LanguageFeaturesService()); instantiationService.stub(ILanguageFeatureDebounceService, instantiationService.createInstance(LanguageFeatureDebounceService)); instantiationService.stub(IHistoryService, new TestHistoryService()); instantiationService.stub(ITextResourcePropertiesService, new TestTextResourcePropertiesService(configService)); @@ -440,7 +453,7 @@ class TestEnvironmentServiceWithArgs extends BrowserWorkbenchEnvironmentService export const TestProductService = { _serviceBrand: undefined, ...product }; -export const TestEnvironmentService = new TestEnvironmentServiceWithArgs(Object.create(null), TestProductService); +export const TestEnvironmentService = new TestEnvironmentServiceWithArgs('', undefined!, Object.create(null), TestProductService); export class TestProgressService implements IProgressService { @@ -484,19 +497,19 @@ export class TestHistoryService implements IHistoryService { constructor(private root?: URI) { } - reopenLastClosedEditor(): void { } - forward(): void { } - back(): void { } - last(): void { } + async reopenLastClosedEditor(): Promise { } + async goForward(): Promise { } + async goBack(): Promise { } + async goPrevious(): Promise { } + async goLast(): Promise { } removeFromHistory(_input: EditorInput | IResourceEditorInput): void { } clear(): void { } clearRecentlyOpened(): void { } getHistory(): readonly (EditorInput | IResourceEditorInput)[] { return []; } - openNextRecentlyUsedEditor(group?: GroupIdentifier): void { } - openPreviouslyUsedEditor(group?: GroupIdentifier): void { } + async openNextRecentlyUsedEditor(group?: GroupIdentifier): Promise { } + async openPreviouslyUsedEditor(group?: GroupIdentifier): Promise { } getLastActiveWorkspaceRoot(_schemeFilter: string): URI | undefined { return this.root; } getLastActiveFile(_schemeFilter: string): URI | undefined { return undefined; } - openLastEditLocation(): void { } } export class TestFileDialogService implements IFileDialogService { @@ -543,6 +556,7 @@ export class TestLayoutService implements IWorkbenchLayoutService { onDidChangeFullscreen: Event = Event.None; onDidChangeWindowMaximized: Event = Event.None; onDidChangePanelPosition: Event = Event.None; + onDidChangePanelAlignment: Event = Event.None; onDidChangePartVisibility: Event = Event.None; onDidLayout = Event.None; onDidChangeNotificationsVisibility = Event.None; @@ -577,6 +591,7 @@ export class TestLayoutService implements IWorkbenchLayoutService { toggleMenuBar(): void { } getSideBarPosition() { return 0; } getPanelPosition() { return 0; } + getPanelAlignment(): PanelAlignment { return 'center'; } async setPanelPosition(_position: PartPosition): Promise { } async setPanelAlignment(_alignment: PanelAlignment): Promise { } addClass(_clazz: string): void { } @@ -598,8 +613,8 @@ let activeViewlet: PaneComposite = {} as any; export class TestPaneCompositeService extends Disposable implements IPaneCompositePartService { declare readonly _serviceBrand: undefined; - onDidPaneCompositeOpen: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation; }>; - onDidPaneCompositeClose: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation; }>; + onDidPaneCompositeOpen: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation }>; + onDidPaneCompositeClose: Event<{ composite: IPaneComposite; viewContainerLocation: ViewContainerLocation }>; private parts = new Map(); @@ -713,13 +728,13 @@ export class TestViewsService implements IViewsService { declare readonly _serviceBrand: undefined; - onDidChangeViewContainerVisibility = new Emitter<{ id: string; visible: boolean; location: ViewContainerLocation; }>().event; + onDidChangeViewContainerVisibility = new Emitter<{ id: string; visible: boolean; location: ViewContainerLocation }>().event; isViewContainerVisible(id: string): boolean { return true; } getVisibleViewContainer(): ViewContainer | null { return null; } openViewContainer(id: string, focus?: boolean): Promise { return Promise.resolve(null); } closeViewContainer(id: string): void { } - onDidChangeViewVisibilityEmitter = new Emitter<{ id: string; visible: boolean; }>(); + onDidChangeViewVisibilityEmitter = new Emitter<{ id: string; visible: boolean }>(); onDidChangeViewVisibility = this.onDidChangeViewVisibilityEmitter.event; isViewVisible(id: string): boolean { return true; } getActiveViewWithId(id: string): T | null { return null; } @@ -764,8 +779,8 @@ export class TestEditorGroupsService implements IEditorGroupsService { findGroup(_scope: IFindGroupScope, _source?: number | IEditorGroup, _wrap?: boolean): IEditorGroup { throw new Error('not implemented'); } activateGroup(_group: number | IEditorGroup): IEditorGroup { throw new Error('not implemented'); } restoreGroup(_group: number | IEditorGroup): IEditorGroup { throw new Error('not implemented'); } - getSize(_group: number | IEditorGroup): { width: number, height: number; } { return { width: 100, height: 100 }; } - setSize(_group: number | IEditorGroup, _size: { width: number, height: number; }): void { } + getSize(_group: number | IEditorGroup): { width: number; height: number } { return { width: 100, height: 100 }; } + setSize(_group: number | IEditorGroup, _size: { width: number; height: number }): void { } arrangeGroups(_arrangement: GroupsArrangement): void { } applyLayout(_layout: EditorGroupLayout): void { } setGroupOrientation(_orientation: GroupOrientation): void { } @@ -815,7 +830,7 @@ export class TestEditorGroupView implements IEditorGroupView { onDidCloseEditor: Event = Event.None; onDidOpenEditorFail: Event = Event.None; onDidFocus: Event = Event.None; - onDidChange: Event<{ width: number; height: number; }> = Event.None; + onDidChange: Event<{ width: number; height: number }> = Event.None; onWillMoveEditor: Event = Event.None; onWillOpenEditor: Event = Event.None; onDidActiveEditorChange: Event = Event.None; @@ -974,7 +989,7 @@ export class TestFileService implements IFileService { }); } - async resolveAll(toResolve: { resource: URI, options?: IResolveFileOptions; }[]): Promise { + async resolveAll(toResolve: { resource: URI; options?: IResolveFileOptions }[]): Promise { const stats = await Promise.all(toResolve.map(resourceAndOption => this.resolve(resourceAndOption.resource, resourceAndOption.options))); return stats.map(stat => ({ stat, success: true })); @@ -1087,7 +1102,7 @@ export class TestFileService implements IFileService { return !!(provider && (provider.capabilities & capability)); } - async del(_resource: URI, _options?: { useTrash?: boolean, recursive?: boolean; }): Promise { } + async del(_resource: URI, _options?: { useTrash?: boolean; recursive?: boolean }): Promise { } readonly watches: URI[] = []; watch(_resource: URI): IDisposable { @@ -1102,7 +1117,7 @@ export class TestFileService implements IFileService { async canCreateFile(source: URI, options?: ICreateFileOptions): Promise { return true; } async canMove(source: URI, target: URI, overwrite?: boolean | undefined): Promise { return true; } async canCopy(source: URI, target: URI, overwrite?: boolean | undefined): Promise { return true; } - async canDelete(resource: URI, options?: { useTrash?: boolean | undefined; recursive?: boolean | undefined; } | undefined): Promise { return true; } + async canDelete(resource: URI, options?: { useTrash?: boolean | undefined; recursive?: boolean | undefined } | undefined): Promise { return true; } } export class TestWorkingCopyBackupService extends InMemoryWorkingCopyBackupService { @@ -1374,7 +1389,7 @@ export class TestHostService implements IHostService { async reload(): Promise { } async close(): Promise { } - async focus(options?: { force: boolean; }): Promise { } + async focus(options?: { force: boolean }): Promise { } async openWindow(arg1?: IOpenEmptyWindowOptions | IWindowOpenable[], arg2?: IOpenWindowOptions): Promise { } @@ -1417,19 +1432,8 @@ export class TestEditorInput extends EditorInput { } } -export abstract class TestEditorWithOptions extends EditorPane { - - lastSetOptions: ITextEditorOptions | undefined = undefined; - - override setOptions(options: ITextEditorOptions | undefined): void { - this.lastSetOptions = options; - - super.setOptions(options); - } -} - export function registerTestEditor(id: string, inputs: SyncDescriptor[], serializerInputId?: string): IDisposable { - class TestEditor extends TestEditorWithOptions { + class TestEditor extends EditorPane { private _scopedContextKeyService: IContextKeyService; @@ -1755,6 +1759,7 @@ export class TestTerminalEditorService implements ITerminalEditorService { instances: readonly ITerminalInstance[] = []; onDidDisposeInstance = Event.None; onDidFocusInstance = Event.None; + onDidChangeInstanceCapability = Event.None; onDidChangeActiveInstance = Event.None; onDidChangeInstances = Event.None; openEditor(instance: ITerminalInstance, editorOptions?: TerminalEditorLocation): Promise { throw new Error('Method not implemented.'); } @@ -1787,6 +1792,7 @@ export class TestTerminalGroupService implements ITerminalGroupService { onDidChangePanelOrientation = Event.None; onDidDisposeInstance = Event.None; onDidFocusInstance = Event.None; + onDidChangeInstanceCapability = Event.None; onDidChangeActiveInstance = Event.None; onDidChangeInstances = Event.None; createGroup(instance?: any): ITerminalGroup { throw new Error('Method not implemented.'); } @@ -1888,7 +1894,46 @@ export class TestEditorWorkerService implements IEditorWorkerService { async computeDirtyDiff(original: URI, modified: URI, ignoreTrimWhitespace: boolean): Promise { return null; } async computeMoreMinimalEdits(resource: URI, edits: TextEdit[] | null | undefined): Promise { return undefined; } canComputeWordRanges(resource: URI): boolean { return false; } - async computeWordRanges(resource: URI, range: IRange): Promise<{ [word: string]: IRange[]; } | null> { return null; } + async computeWordRanges(resource: URI, range: IRange): Promise<{ [word: string]: IRange[] } | null> { return null; } canNavigateValueSet(resource: URI): boolean { return false; } async navigateValueSet(resource: URI, range: IRange, up: boolean): Promise { return null; } } + +export class TestClipboardService implements IClipboardService { + + _serviceBrand: undefined; + + private text: string | undefined = undefined; + + async writeText(text: string, type?: string): Promise { + this.text = text; + } + + async readText(type?: string): Promise { + return this.text ?? ''; + } + + private findText: string | undefined = undefined; + + async readFindText(): Promise { + return this.findText ?? ''; + } + + async writeFindText(text: string): Promise { + this.findText = text; + } + + private resources: URI[] | undefined = undefined; + + async writeResources(resources: URI[]): Promise { + this.resources = resources; + } + + async readResources(): Promise { + return this.resources ?? []; + } + + async hasResources(): Promise { + return Array.isArray(this.resources) && this.resources.length > 0; + } +} diff --git a/src/vs/workbench/test/electron-browser/testing.ts b/src/vs/workbench/test/common/utils.ts similarity index 100% rename from src/vs/workbench/test/electron-browser/testing.ts rename to src/vs/workbench/test/common/utils.ts diff --git a/src/vs/workbench/test/common/workbenchTestServices.ts b/src/vs/workbench/test/common/workbenchTestServices.ts index 57e0525c824..fcd5ac00b2c 100644 --- a/src/vs/workbench/test/common/workbenchTestServices.ts +++ b/src/vs/workbench/test/common/workbenchTestServices.ts @@ -8,9 +8,8 @@ import { basename, isEqual, isEqualOrParent } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWorkspaceContextService, IWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, Workspace, IWorkspaceFoldersWillChangeEvent } from 'vs/platform/workspace/common/workspace'; +import { IWorkspaceContextService, IWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, Workspace, IWorkspaceFoldersWillChangeEvent, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/textResourceConfiguration'; import { isLinux, isMacintosh } from 'vs/base/common/platform'; import { InMemoryStorageService, WillSaveStateReason } from 'vs/platform/storage/common/storage'; @@ -192,7 +191,7 @@ export class TestWorkingCopyFileService implements IWorkingCopyFileService { readonly hasSaveParticipants = false; addSaveParticipant(participant: IStoredFileWorkingCopySaveParticipant): IDisposable { return Disposable.None; } - async runSaveParticipants(workingCopy: IWorkingCopy, context: { reason: SaveReason; }, token: CancellationToken): Promise { } + async runSaveParticipants(workingCopy: IWorkingCopy, context: { reason: SaveReason }, token: CancellationToken): Promise { } async delete(operations: IDeleteOperation[], token: CancellationToken, undoInfo?: IFileOperationUndoRedoInfo): Promise { } diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index 531addb02a1..a35c6d61e2a 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -13,7 +13,7 @@ import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/commo import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IModelService } from 'vs/editor/common/services/model'; -import { INativeWorkbenchConfiguration, INativeWorkbenchEnvironmentService, NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; +import { INativeWorkbenchEnvironmentService, NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; import { IDialogService, IFileDialogService, INativeOpenDialogOptions } from 'vs/platform/dialogs/common/dialogs'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfiguration'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -23,7 +23,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { URI } from 'vs/base/common/uri'; import { IReadTextFileOptions, ITextFileStreamContent, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; -import { IOpenEmptyWindowOptions, IWindowOpenable, IOpenWindowOptions, IOpenedWindow, IPartsSplash, IColorScheme } from 'vs/platform/windows/common/windows'; +import { IOpenEmptyWindowOptions, IWindowOpenable, IOpenWindowOptions, IOpenedWindow, IColorScheme, INativeWindowConfiguration } from 'vs/platform/windows/common/windows'; import { parseArgs, OPTIONS } from 'vs/platform/environment/node/argv'; import { LogLevel, ILogService } from 'vs/platform/log/common/log'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; @@ -37,7 +37,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { MouseInputEvent } from 'vs/base/parts/sandbox/common/electronTypes'; -import { ILanguageService } from 'vs/editor/common/services/language'; +import { ILanguageService } from 'vs/editor/common/languages/language'; import { IOSProperties, IOSStatistics } from 'vs/platform/native/common/native'; import { homedir, release, tmpdir, hostname } from 'os'; import { IEnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -47,10 +47,11 @@ import product from 'vs/platform/product/common/product'; import { IElevatedFileService } from 'vs/workbench/services/files/common/elevatedFileService'; import { IDecorationsService } from 'vs/workbench/services/decorations/common/decorations'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { IPartsSplash } from 'vs/platform/theme/common/themeService'; const args = parseArgs(process.argv, OPTIONS); -export const TestWorkbenchConfiguration: INativeWorkbenchConfiguration = { +export const TestNativeWindowConfiguration: INativeWindowConfiguration = { windowId: 0, machineId: 'testMachineId', logLevel: LogLevel.Error, @@ -68,7 +69,7 @@ export const TestWorkbenchConfiguration: INativeWorkbenchConfiguration = { ...args }; -export const TestEnvironmentService = new NativeWorkbenchEnvironmentService(TestWorkbenchConfiguration, TestProductService); +export const TestEnvironmentService = new NativeWorkbenchEnvironmentService(TestNativeWindowConfiguration, TestProductService); export class TestTextFileService extends NativeTextFileService { private resolveTextContentError!: FileOperationError | null; @@ -204,7 +205,7 @@ export class TestNativeHostService implements INativeHostService { async minimizeWindow(): Promise { } async setMinimumSize(width: number | undefined, height: number | undefined): Promise { } async saveWindowSplash(value: IPartsSplash): Promise { } - async focusWindow(options?: { windowId?: number | undefined; } | undefined): Promise { } + async focusWindow(options?: { windowId?: number | undefined } | undefined): Promise { } async showMessageBox(options: Electron.MessageBoxOptions): Promise { throw new Error('Method not implemented.'); } async showSaveDialog(options: Electron.SaveDialogOptions): Promise { throw new Error('Method not implemented.'); } async showOpenDialog(options: Electron.OpenDialogOptions): Promise { throw new Error('Method not implemented.'); } @@ -234,7 +235,7 @@ export class TestNativeHostService implements INativeHostService { async installShellCommand(): Promise { } async uninstallShellCommand(): Promise { } async notifyReady(): Promise { } - async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined; } | undefined): Promise { } + async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined } | undefined): Promise { } async reload(): Promise { } async closeWindow(): Promise { } async closeWindowById(): Promise { } diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index 287d972bf2a..f7902895c08 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -31,7 +31,7 @@ import 'vs/workbench/browser/actions/quickAccessActions'; //#region --- API Extension Points -import 'vs/workbench/api/common/menusExtensionPoint'; +import 'vs/workbench/services/actions/common/menusExtensionPoint'; import 'vs/workbench/api/common/configurationExtensionPoint'; import 'vs/workbench/api/browser/viewsExtensionPoint'; @@ -64,7 +64,7 @@ import 'vs/workbench/services/configuration/common/jsonEditingService'; import 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/editor/browser/editorResolverService'; -import 'vs/workbench/services/history/browser/history'; +import 'vs/workbench/services/history/browser/historyService'; import 'vs/workbench/services/activity/browser/activityService'; import 'vs/workbench/services/keybinding/browser/keybindingService'; import 'vs/workbench/services/untitled/common/untitledTextEditorService'; @@ -76,7 +76,7 @@ import 'vs/workbench/services/commands/common/commandService'; import 'vs/workbench/services/themes/browser/workbenchThemeService'; import 'vs/workbench/services/label/common/labelService'; import 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; -import 'vs/workbench/services/extensionManagement/common/webExtensionsScannerService'; +import 'vs/workbench/services/extensionManagement/browser/webExtensionsScannerService'; import 'vs/workbench/services/extensionManagement/browser/extensionEnablementService'; import 'vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService'; import 'vs/workbench/services/extensionRecommendations/common/extensionIgnoredRecommendationsService'; @@ -97,6 +97,7 @@ import 'vs/workbench/services/assignment/common/assignmentService'; import 'vs/workbench/services/outline/browser/outlineService'; import 'vs/workbench/services/languageDetection/browser/languageDetectionWorkerServiceImpl'; +import 'vs/editor/common/services/languageFeaturesService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionGalleryService'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; @@ -246,7 +247,7 @@ import 'vs/workbench/contrib/tasks/browser/task.contribution'; // Remote import 'vs/workbench/contrib/remote/common/remote.contribution'; -import 'vs/workbench/contrib/remote/browser/remote'; +import 'vs/workbench/contrib/remote/browser/remote.contribution'; // Emmet import 'vs/workbench/contrib/emmet/browser/emmet.contribution'; @@ -261,6 +262,7 @@ import 'vs/workbench/contrib/keybindings/browser/keybindings.contribution'; import 'vs/workbench/contrib/snippets/browser/snippets.contribution'; import 'vs/workbench/contrib/snippets/browser/snippetsService'; import 'vs/workbench/contrib/snippets/browser/insertSnippet'; +import 'vs/workbench/contrib/snippets/browser/surroundWithSnippet'; import 'vs/workbench/contrib/snippets/browser/configureSnippets'; import 'vs/workbench/contrib/snippets/browser/tabCompletion'; @@ -282,12 +284,12 @@ import 'vs/workbench/contrib/surveys/browser/ces.contribution'; import 'vs/workbench/contrib/surveys/browser/languageSurveys.contribution'; // Welcome -import 'vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay'; -import 'vs/workbench/contrib/welcome/page/browser/welcomePage.contribution'; -import 'vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.contribution'; -import 'vs/workbench/contrib/welcome/walkThrough/browser/walkThrough.contribution'; -import 'vs/workbench/contrib/welcome/common/viewsWelcome.contribution'; -import 'vs/workbench/contrib/welcome/common/newFile.contribution'; +import 'vs/workbench/contrib/welcomeOverlay/browser/welcomeOverlay'; +import 'vs/workbench/contrib/welcomePage/browser/welcomePage.contribution'; +import 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution'; +import 'vs/workbench/contrib/welcomeWalkthrough/browser/walkThrough.contribution'; +import 'vs/workbench/contrib/welcomeViews/common/viewsWelcome.contribution'; +import 'vs/workbench/contrib/welcomeViews/common/newFile.contribution'; // Call Hierarchy import 'vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution'; @@ -312,7 +314,7 @@ import 'vs/workbench/contrib/feedback/browser/feedback.contribution'; import 'vs/workbench/contrib/userDataSync/browser/userDataSync.contribution'; // Code Actions -import 'vs/workbench/contrib/codeActions/common/codeActions.contribution'; +import 'vs/workbench/contrib/codeActions/browser/codeActions.contribution'; // Timeline import 'vs/workbench/contrib/timeline/browser/timeline.contribution'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 7c3a50d21da..4b363e7b336 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -74,7 +74,7 @@ import 'vs/workbench/services/integrity/electron-sandbox/integrityService'; import 'vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService'; import 'vs/workbench/services/checksum/electron-sandbox/checksumService'; import 'vs/platform/remote/electron-sandbox/sharedProcessTunnelService'; -import 'vs/workbench/services/remote/electron-sandbox/tunnelService'; +import 'vs/workbench/services/tunnel/electron-sandbox/tunnelService'; import 'vs/platform/diagnostics/electron-sandbox/diagnosticsService'; import 'vs/platform/profiling/electron-sandbox/profilingService'; import 'vs/platform/telemetry/electron-sandbox/customEndpointTelemetryService'; diff --git a/src/vs/workbench/workbench.web.api.css b/src/vs/workbench/workbench.web.main.css similarity index 100% rename from src/vs/workbench/workbench.web.api.css rename to src/vs/workbench/workbench.web.main.css diff --git a/src/vs/workbench/workbench.web.api.nls.js b/src/vs/workbench/workbench.web.main.nls.js similarity index 100% rename from src/vs/workbench/workbench.web.api.nls.js rename to src/vs/workbench/workbench.web.main.nls.js diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 961f2d087ba..dcc647ee82f 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -57,7 +57,7 @@ import 'vs/workbench/services/path/browser/pathService'; import 'vs/workbench/services/themes/browser/browserHostColorSchemeService'; import 'vs/workbench/services/encryption/browser/encryptionService'; import 'vs/workbench/services/workingCopy/browser/workingCopyBackupService'; -import 'vs/workbench/services/remote/browser/tunnelService'; +import 'vs/workbench/services/tunnel/browser/tunnelService'; import 'vs/workbench/services/files/browser/elevatedFileService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -68,7 +68,7 @@ import { IExtensionTipsService } from 'vs/platform/extensionManagement/common/ex import { ExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionTipsService'; import { IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagementService'; -import { ILoggerService } from 'vs/platform/log/common/log'; +import { ILoggerService, LogLevel } from 'vs/platform/log/common/log'; import { FileLoggerService } from 'vs/platform/log/common/fileLog'; import { UserDataSyncMachinesService, IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; import { IUserDataSyncStoreService, IUserDataSyncService, IUserDataAutoSyncService, IUserDataSyncBackupStoreService, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; @@ -125,7 +125,7 @@ import 'vs/workbench/contrib/preferences/browser/keyboardLayoutPicker'; import 'vs/workbench/contrib/debug/browser/extensionHostDebugService'; // Welcome Banner -import 'vs/workbench/contrib/welcome/banner/browser/welcomeBanner.contribution'; +import 'vs/workbench/contrib/welcomeBanner/browser/welcomeBanner.contribution'; // Webview import 'vs/workbench/contrib/webview/browser/webview.web.contribution'; @@ -154,3 +154,120 @@ import 'vs/workbench/contrib/splash/browser/splash.contribution'; import 'vs/workbench/contrib/offline/browser/offline.contribution'; //#endregion + + +//#region --- export workbench factory + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// +// Do NOT change these exports in a way that something is removed unless +// intentional. These exports are used by web embedders and thus require +// an adoption when something changes. +// +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +import { create, commands, env } from 'vs/workbench/browser/web.factory'; +import { IWorkbench, ICommand, ICommonTelemetryPropertiesResolver, IDefaultEditor, IDefaultLayout, IDefaultView, IDevelopmentOptions, IExternalUriResolver, IExternalURLOpener, IHomeIndicator, IInitialColorTheme, IPosition, IProductQualityChangeHandler, IRange, IResourceUriProvider, ISettingsSyncOptions, IShowPortCandidate, ITunnel, ITunnelFactory, ITunnelOptions, ITunnelProvider, IWelcomeBanner, IWelcomeBannerAction, IWindowIndicator, IWorkbenchConstructionOptions, Menu } from 'vs/workbench/browser/web.api'; +import { UriComponents, URI } from 'vs/base/common/uri'; +import { IWebSocketFactory, IWebSocket } from 'vs/platform/remote/browser/browserSocketFactory'; +import { Event, Emitter } from 'vs/base/common/event'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { IProductConfiguration } from 'vs/base/common/product'; +import { ICredentialsProvider } from 'vs/platform/credentials/common/credentials'; +// eslint-disable-next-line no-duplicate-imports +import type { IURLCallbackProvider } from 'vs/workbench/services/url/browser/urlService'; +// eslint-disable-next-line no-duplicate-imports +import type { IUpdateProvider, IUpdate } from 'vs/workbench/services/update/browser/updateService'; +// eslint-disable-next-line no-duplicate-imports +import type { IWorkspace, IWorkspaceProvider } from 'vs/workbench/services/host/browser/browserHostService'; + +export { + + // Factory + create, + IWorkbenchConstructionOptions, + IWorkbench, + + // Basic Types + URI, + UriComponents, + Event, + Emitter, + IDisposable, + Disposable, + + // Workspace + IWorkspace, + IWorkspaceProvider, + + // WebSockets + IWebSocketFactory, + IWebSocket, + + // Resources + IResourceUriProvider, + + // Credentials + ICredentialsProvider, + + // Callbacks + IURLCallbackProvider, + + // LogLevel + LogLevel, + + // SettingsSync + ISettingsSyncOptions, + + // Updates/Quality + IUpdateProvider, + IUpdate, + IProductQualityChangeHandler, + + // Telemetry + ICommonTelemetryPropertiesResolver, + + // External Uris + IExternalUriResolver, + + // External URL Opener + IExternalURLOpener, + + // Tunnel + ITunnelProvider, + ITunnelFactory, + ITunnel, + ITunnelOptions, + + // Ports + IShowPortCandidate, + + // Commands + ICommand, + commands, + Menu, + + // Branding + IHomeIndicator, + IWelcomeBanner, + IWelcomeBannerAction, + IProductConfiguration, + IWindowIndicator, + IInitialColorTheme, + + // Default layout + IDefaultView, + IDefaultEditor, + IDefaultLayout, + IPosition, + IRange as ISelection, + + // Env + env, + + // Development + IDevelopmentOptions +}; + + +//#endregion diff --git a/src/vscode-dts/README.md b/src/vscode-dts/README.md index 86de5ab0a0e..a69e5eb65e1 100644 --- a/src/vscode-dts/README.md +++ b/src/vscode-dts/README.md @@ -18,3 +18,4 @@ This is the place for the stable API and for API proposals. 1. creating the proposal-file will automatically update `src/vs/workbench/services/extensions/common/extensionsApiProposals.ts` (make sure to run `yarn watch`) 1. declare and implement your proposal 1. make sure to use the `checkProposedApiEnabled` and/or `isProposedApiEnabled`-utils to enforce the API being proposed. Make sure to invoke them with your proposal's name which got generated into `extensionsApiProposals.ts` +1. Most likely will need to add your proposed api to vscode-api-tests as well diff --git a/src/vscode-dts/vscode.d.ts b/src/vscode-dts/vscode.d.ts index 7f2a5741b5f..b3403898723 100644 --- a/src/vscode-dts/vscode.d.ts +++ b/src/vscode-dts/vscode.d.ts @@ -338,7 +338,7 @@ declare module 'vscode' { * @return A position that reflects the given delta. Will return `this` position if the change * is not changing anything. */ - translate(change: { lineDelta?: number; characterDelta?: number; }): Position; + translate(change: { lineDelta?: number; characterDelta?: number }): Position; /** * Create a new position derived from this position. @@ -356,7 +356,7 @@ declare module 'vscode' { * @return A position that reflects the given change. Will return `this` position if the change * is not changing anything. */ - with(change: { line?: number; character?: number; }): Position; + with(change: { line?: number; character?: number }): Position; } /** @@ -462,7 +462,7 @@ declare module 'vscode' { * @return A range that reflects the given change. Will return `this` range if the change * is not changing anything. */ - with(change: { start?: Position, end?: Position }): Range; + with(change: { start?: Position; end?: Position }): Range; } /** @@ -1137,7 +1137,7 @@ declare module 'vscode' { * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit. * @return A promise that resolves with a value indicating if the edits could be applied. */ - edit(callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable; + edit(callback: (editBuilder: TextEditorEdit) => void, options?: { readonly undoStopBefore: boolean; readonly undoStopAfter: boolean }): Thenable; /** * Insert a {@link SnippetString snippet} and put the editor into snippet mode. "Snippet mode" @@ -1150,7 +1150,7 @@ declare module 'vscode' { * @return A promise that resolves with a value indicating if the snippet could be inserted. Note that the promise does not signal * that the snippet is completely filled-in or accepted. */ - insertSnippet(snippet: SnippetString, location?: Position | Range | readonly Position[] | readonly Range[], options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable; + insertSnippet(snippet: SnippetString, location?: Position | Range | readonly Position[] | readonly Range[], options?: { readonly undoStopBefore: boolean; readonly undoStopAfter: boolean }): Thenable; /** * Adds a set of decorations to the text editor. If a set of decorations already exists with @@ -1321,7 +1321,7 @@ declare module 'vscode' { * @param components The component parts of an Uri. * @return A new Uri instance. */ - static from(components: { scheme: string; authority?: string; path?: string; query?: string; fragment?: string }): Uri; + static from(components: { readonly scheme: string; readonly authority?: string; readonly path?: string; readonly query?: string; readonly fragment?: string }): Uri; /** * Use the `file` and `parse` factory functions to create new `Uri` objects. @@ -1484,22 +1484,25 @@ declare module 'vscode' { export class Disposable { /** - * Combine many disposable-likes into one. Use this method - * when having objects with a dispose function which are not - * instances of Disposable. + * Combine many disposable-likes into one. You can use this method when having objects with + * a dispose function which aren't instances of `Disposable`. * - * @param disposableLikes Objects that have at least a `dispose`-function member. + * @param disposableLikes Objects that have at least a `dispose`-function member. Note that asynchronous + * dispose-functions aren't awaited. * @return Returns a new disposable which, upon dispose, will * dispose all provided disposables. */ static from(...disposableLikes: { dispose: () => any }[]): Disposable; /** - * Creates a new Disposable calling the provided function + * Creates a new disposable that calls the provided function * on dispose. + * + * *Note* that an asynchronous function is not awaited. + * * @param callOnDispose Function that disposes something. */ - constructor(callOnDispose: Function); + constructor(callOnDispose: () => any); /** * Dispose this object. @@ -1543,6 +1546,7 @@ declare module 'vscode' { /** * The event listeners can subscribe to. */ + // eslint-disable-next-line vscode-dts-event-naming event: Event; /** @@ -1635,6 +1639,21 @@ declare module 'vscode' { provideTextDocumentContent(uri: Uri, token: CancellationToken): ProviderResult; } + /** + * The kind of {@link QuickPickItem quick pick item}. + */ + export enum QuickPickItemKind { + /** + * When a {@link QuickPickItem} has a kind of {@link Separator}, the item is just a visual separator and does not represent a real item. + * The only property that applies is {@link QuickPickItem.label label }. All other properties on {@link QuickPickItem} will be ignored and have no effect. + */ + Separator = -1, + /** + * The default {@link QuickPickItem.kind} is an item that can be selected in the quick pick. + */ + Default = 0, + } + /** * Represents an item that can be selected from * a list of items. @@ -1647,15 +1666,25 @@ declare module 'vscode' { */ label: string; + /** + * The kind of QuickPickItem that will determine how this item is rendered in the quick pick. When not specified, + * the default is {@link QuickPickItemKind.Default}. + */ + kind?: QuickPickItemKind; + /** * A human-readable string which is rendered less prominent in the same line. Supports rendering of * {@link ThemeIcon theme icons} via the `$()`-syntax. + * + * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} */ description?: string; /** * A human-readable string which is rendered less prominent in a separate line. Supports rendering of * {@link ThemeIcon theme icons} via the `$()`-syntax. + * + * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} */ detail?: string; @@ -1666,11 +1695,15 @@ declare module 'vscode' { * (*Note:* This is only honored when the picker allows multiple selections.) * * @see {@link QuickPickOptions.canPickMany} + * + * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} */ picked?: boolean; /** * Always show this item. + * + * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} */ alwaysShow?: boolean; @@ -1679,6 +1712,8 @@ declare module 'vscode' { * an {@link QuickPickItemButtonEvent} when clicked. Buttons are only rendered when using a quickpick * created by the {@link window.createQuickPick()} API. Buttons are not rendered when using * the {@link window.showQuickPick()} API. + * + * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} */ buttons?: readonly QuickInputButton[]; } @@ -1989,7 +2024,7 @@ declare module 'vscode' { * Otherwise, a uri or string should only be used if the pattern is for a file path outside the workspace. * @param pattern A file glob pattern like `*.{ts,js}` that will be matched on paths relative to the base. */ - constructor(base: WorkspaceFolder | Uri | string, pattern: string) + constructor(base: WorkspaceFolder | Uri | string, pattern: string); } /** @@ -3374,7 +3409,7 @@ declare module 'vscode' { * be applied successfully. * @param metadata Optional metadata for the entry. */ - createFile(uri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; + createFile(uri: Uri, options?: { overwrite?: boolean; ignoreIfExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; /** * Delete a file or folder. @@ -3382,7 +3417,7 @@ declare module 'vscode' { * @param uri The uri of the file that is to be deleted. * @param metadata Optional metadata for the entry. */ - deleteFile(uri: Uri, options?: { recursive?: boolean, ignoreIfNotExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; + deleteFile(uri: Uri, options?: { recursive?: boolean; ignoreIfNotExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; /** * Rename a file or folder. @@ -3393,7 +3428,7 @@ declare module 'vscode' { * ignored. When overwrite and ignoreIfExists are both set overwrite wins. * @param metadata Optional metadata for the entry. */ - renameFile(oldUri: Uri, newUri: Uri, options?: { overwrite?: boolean, ignoreIfExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; + renameFile(oldUri: Uri, newUri: Uri, options?: { overwrite?: boolean; ignoreIfExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; /** * Get all text edits grouped by resource. @@ -3410,8 +3445,8 @@ declare module 'vscode' { * A snippet can define tab stops and placeholders with `$1`, `$2` * and `${3:foo}`. `$0` defines the final tab stop, it defaults to * the end of the snippet. Variables are defined with `$name` and - * `${name:default value}`. The full snippet syntax is documented - * [here](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets). + * `${name:default value}`. Also see + * [the full snippet syntax](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets). */ export class SnippetString { @@ -3508,7 +3543,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return The range or range and placeholder text of the identifier that is to be renamed. The lack of a result can signaled by returning `undefined` or `null`. */ - prepareRename?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; + prepareRename?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; } /** @@ -4174,7 +4209,7 @@ declare module 'vscode' { * {@link Range.contains contain} the position at which completion has been {@link CompletionItemProvider.provideCompletionItems requested}. * *Note 2:* A insert range must be a prefix of a replace range, that means it must be contained and starting at the same position. */ - range?: Range | { inserting: Range; replacing: Range; }; + range?: Range | { inserting: Range; replacing: Range }; /** * An optional set of characters that when pressed while this completion is active will accept it first and @@ -4529,7 +4564,7 @@ declare module 'vscode' { * @return An array of color presentations or a thenable that resolves to such. The lack of a result * can be signaled by returning `undefined`, `null`, or an empty array. */ - provideColorPresentations(color: Color, context: { document: TextDocument, range: Range }, token: CancellationToken): ProviderResult; + provideColorPresentations(color: Color, context: { readonly document: TextDocument; readonly range: Range }, token: CancellationToken): ProviderResult; } /** @@ -5252,8 +5287,8 @@ declare module 'vscode' { defaultValue?: T; globalValue?: T; - workspaceValue?: T, - workspaceFolderValue?: T, + workspaceValue?: T; + workspaceFolderValue?: T; defaultLanguageValue?: T; globalLanguageValue?: T; @@ -5593,6 +5628,82 @@ declare module 'vscode' { dispose(): void; } + /** + * Represents the severity of a language status item. + */ + export enum LanguageStatusSeverity { + Information = 0, + Warning = 1, + Error = 2 + } + + /** + * A language status item is the preferred way to present language status reports for the active text editors, + * such as selected linter or notifying about a configuration problem. + */ + export interface LanguageStatusItem { + + /** + * The identifier of this item. + */ + readonly id: string; + + /** + * The short name of this item, like 'Java Language Status', etc. + */ + name: string | undefined; + + /** + * A {@link DocumentSelector selector} that defines for what editors + * this item shows. + */ + selector: DocumentSelector; + + /** + * The severity of this item. + * + * Defaults to {@link LanguageStatusSeverity.Information information}. You can use this property to + * signal to users that there is a problem that needs attention, like a missing executable or an + * invalid configuration. + */ + severity: LanguageStatusSeverity; + + /** + * The text to show for the entry. You can embed icons in the text by leveraging the syntax: + * + * `My text $(icon-name) contains icons like $(icon-name) this one.` + * + * Where the icon-name is taken from the ThemeIcon [icon set](https://code.visualstudio.com/api/references/icons-in-labels#icon-listing), e.g. + * `light-bulb`, `thumbsup`, `zap` etc. + */ + text: string; + + /** + * Optional, human-readable details for this item. + */ + detail?: string; + + /** + * Controls whether the item is shown as "busy". Defaults to `false`. + */ + busy: boolean; + + /** + * A {@linkcode Command command} for this item. + */ + command: Command | undefined; + + /** + * Accessibility information used when a screen reader interacts with this item + */ + accessibilityInformation?: AccessibilityInformation; + + /** + * Dispose and free associated resources. + */ + dispose(): void; + } + /** * Denotes a location of an editor in the window. Editors can be arranged in a grid * and each column represents one editor location in that grid by counting the editors @@ -5724,7 +5835,7 @@ declare module 'vscode' { /** * Label to be read out by a screen reader once the item has focus. */ - label: string; + readonly label: string; /** * Role of the widget which defines how a screen reader interacts with it. @@ -5732,7 +5843,7 @@ declare module 'vscode' { * If role is not specified the editor will pick the appropriate role automatically. * More about aria roles can be found here https://w3c.github.io/aria/#widget_roles */ - role?: string; + readonly role?: string; } /** @@ -5949,7 +6060,7 @@ declare module 'vscode' { /** * Assumes a {@link TerminalLocation} of editor and allows specifying a {@link ViewColumn} and - * {@link preserveFocus} property + * {@link TerminalEditorLocationOptions.preserveFocus preserveFocus } property */ export interface TerminalEditorLocationOptions { /** @@ -6274,6 +6385,8 @@ declare module 'vscode' { /** * An array to which disposables can be added. When this * extension is deactivated the disposables will be disposed. + * + * *Note* that asynchronous dispose-functions aren't awaited. */ readonly subscriptions: { dispose(): any }[]; @@ -7434,7 +7547,7 @@ declare module 'vscode' { * @param options Configures the watch. * @returns A disposable that tells the provider to stop watching the `uri`. */ - watch(uri: Uri, options: { recursive: boolean; excludes: string[] }): Disposable; + watch(uri: Uri, options: { readonly recursive: boolean; readonly excludes: readonly string[] }): Disposable; /** * Retrieve metadata about a file. @@ -7488,7 +7601,7 @@ declare module 'vscode' { * @throws {@linkcode FileSystemError.FileExists FileExists} when `uri` already exists, `create` is set but `overwrite` is not set. * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. */ - writeFile(uri: Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void | Thenable; + writeFile(uri: Uri, content: Uint8Array, options: { readonly create: boolean; readonly overwrite: boolean }): void | Thenable; /** * Delete a file. @@ -7498,7 +7611,7 @@ declare module 'vscode' { * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when `uri` doesn't exist. * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. */ - delete(uri: Uri, options: { recursive: boolean }): void | Thenable; + delete(uri: Uri, options: { readonly recursive: boolean }): void | Thenable; /** * Rename a file or folder. @@ -7511,7 +7624,7 @@ declare module 'vscode' { * @throws {@linkcode FileSystemError.FileExists FileExists} when `newUri` exists and when the `overwrite` option is not `true`. * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. */ - rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): void | Thenable; + rename(oldUri: Uri, newUri: Uri, options: { readonly overwrite: boolean }): void | Thenable; /** * Copy files or folders. Implementing this function is optional but it will speedup @@ -7525,7 +7638,7 @@ declare module 'vscode' { * @throws {@linkcode FileSystemError.FileExists FileExists} when `destination` exists and when the `overwrite` option is not `true`. * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. */ - copy?(source: Uri, destination: Uri, options: { overwrite: boolean }): void | Thenable; + copy?(source: Uri, destination: Uri, options: { readonly overwrite: boolean }): void | Thenable; } /** @@ -7586,7 +7699,7 @@ declare module 'vscode' { * @param uri The resource that is to be deleted. * @param options Defines if trash can should be used and if deletion of folders is recursive */ - delete(uri: Uri, options?: { recursive?: boolean, useTrash?: boolean }): Thenable; + delete(uri: Uri, options?: { recursive?: boolean; useTrash?: boolean }): Thenable; /** * Rename a file or folder. @@ -7651,7 +7764,7 @@ declare module 'vscode' { /** * Controls whether forms are enabled in the webview content or not. * - * Defaults to true if {@link enableScripts scripts are enabled}. Otherwise defaults to false. + * Defaults to true if {@link WebViewOptions.enableScripts scripts are enabled}. Otherwise defaults to false. * Explicitly setting this property to either true or false overrides the default. */ readonly enableForms?: boolean; @@ -8831,7 +8944,7 @@ declare module 'vscode' { /** * A short-hand for `openTextDocument(uri).then(document => showTextDocument(document, options))`. * - * @see {@link openTextDocument} + * @see {@link workspace.openTextDocument} * * @param uri A resource identifier. * @param options {@link TextDocumentShowOptions Editor options} to configure the behavior of showing the {@link TextEditor editor}. @@ -8991,7 +9104,7 @@ declare module 'vscode' { * @param token A token that can be used to signal cancellation. * @return A promise that resolves to the selected items or `undefined`. */ - export function showQuickPick(items: readonly string[] | Thenable, options: QuickPickOptions & { canPickMany: true; }, token?: CancellationToken): Thenable; + export function showQuickPick(items: readonly string[] | Thenable, options: QuickPickOptions & { canPickMany: true }, token?: CancellationToken): Thenable; /** * Shows a selection list. @@ -9011,7 +9124,7 @@ declare module 'vscode' { * @param token A token that can be used to signal cancellation. * @return A promise that resolves to the selected items or `undefined`. */ - export function showQuickPick(items: readonly T[] | Thenable, options: QuickPickOptions & { canPickMany: true; }, token?: CancellationToken): Thenable; + export function showQuickPick(items: readonly T[] | Thenable, options: QuickPickOptions & { canPickMany: true }, token?: CancellationToken): Thenable; /** * Shows a selection list. @@ -9103,7 +9216,7 @@ declare module 'vscode' { * * @return New webview panel. */ - export function createWebviewPanel(viewType: string, title: string, showOptions: ViewColumn | { viewColumn: ViewColumn, preserveFocus?: boolean }, options?: WebviewPanelOptions & WebviewOptions): WebviewPanel; + export function createWebviewPanel(viewType: string, title: string, showOptions: ViewColumn | { viewColumn: ViewColumn; preserveFocus?: boolean }, options?: WebviewPanelOptions & WebviewOptions): WebviewPanel; /** * Set a message to the status bar. This is a short hand for the more powerful @@ -9267,7 +9380,7 @@ declare module 'vscode' { * Registers a webview panel serializer. * * Extensions that support reviving should have an `"onWebviewPanel:viewType"` activation event and - * make sure that {@link registerWebviewPanelSerializer} is called during activation. + * make sure that `registerWebviewPanelSerializer` is called during activation. * * Only a single serializer may be registered at a time for a given `viewType`. * @@ -9504,7 +9617,7 @@ declare module 'vscode' { * * **NOTE:** The {@link TreeDataProvider} that the `TreeView` {@link window.createTreeView is registered with} with must implement {@link TreeDataProvider.getParent getParent} method to access this API. */ - reveal(element: T, options?: { select?: boolean, focus?: boolean, expand?: boolean | number }): Thenable; + reveal(element: T, options?: { select?: boolean; focus?: boolean; expand?: boolean | number }): Thenable; } /** @@ -9768,6 +9881,12 @@ declare module 'vscode' { * The {@link TerminalLocation} or {@link TerminalEditorLocationOptions} or {@link TerminalSplitLocationOptions} for the terminal. */ location?: TerminalLocation | TerminalEditorLocationOptions | TerminalSplitLocationOptions; + + /** + * Opt-out of the default terminal persistence on restart and reload. + * This will only take effect when `terminal.integrated.enablePersistentSessions` is enabled. + */ + isTransient?: boolean; } /** @@ -9801,6 +9920,12 @@ declare module 'vscode' { * The {@link TerminalLocation} or {@link TerminalEditorLocationOptions} or {@link TerminalSplitLocationOptions} for the terminal. */ location?: TerminalLocation | TerminalEditorLocationOptions | TerminalSplitLocationOptions; + + /** + * Opt-out of the default terminal persistence on restart and reload. + * This will only take effect when `terminal.integrated.enablePersistentSessions` is enabled. + */ + isTransient?: boolean; } /** @@ -10703,7 +10828,7 @@ declare module 'vscode' { /** * The files that are going to be renamed. */ - readonly files: ReadonlyArray<{ readonly oldUri: Uri, readonly newUri: Uri }>; + readonly files: ReadonlyArray<{ readonly oldUri: Uri; readonly newUri: Uri }>; /** * Allows to pause the event and to apply a {@link WorkspaceEdit workspace edit}. @@ -10743,7 +10868,7 @@ declare module 'vscode' { /** * The files that got renamed. */ - readonly files: ReadonlyArray<{ readonly oldUri: Uri, readonly newUri: Uri }>; + readonly files: ReadonlyArray<{ readonly oldUri: Uri; readonly newUri: Uri }>; } /** @@ -10951,7 +11076,7 @@ declare module 'vscode' { * @return true if the operation was successfully started and false otherwise if arguments were used that would result * in invalid workspace folder state (e.g. 2 folders with the same URI). */ - export function updateWorkspaceFolders(start: number, deleteCount: number | undefined | null, ...workspaceFoldersToAdd: { uri: Uri, name?: string }[]): boolean; + export function updateWorkspaceFolders(start: number, deleteCount: number | undefined | null, ...workspaceFoldersToAdd: { readonly uri: Uri; readonly name?: string }[]): boolean; /** * Creates a file system watcher that is notified on file events (create, change, delete) @@ -10967,9 +11092,8 @@ declare module 'vscode' { * will be reported). * * Providing a `string` as `globPattern` acts as convenience method for watching file events in - * all opened workspace folders. This method should be used if you only care about file events - * from the workspace and not from any other folder. It cannot be used to add more folders for - * file watching. + * all opened workspace folders. It cannot be used to add more folders for file watching, nor will + * it report any file events from folders that are not part of the opened workspace folders. * * Optionally, flags to ignore certain kinds of events can be provided. * @@ -10986,8 +11110,26 @@ declare module 'vscode' { * *Note* that file changes for the path to be watched may not be delivered when the path itself * changes. For example, when watching a path `/Users/somename/Desktop` and the path itself is * being deleted, the watcher may not report an event and may not work anymore from that moment on. + * The underlying behaviour depends on the path that is provided for watching: + * * if the path is within any of the workspace folders, deletions are tracked and reported unless + * excluded via `files.watcherExclude` setting + * * if the path is equal to any of the workspace folders, deletions are not tracked + * * if the path is outside of any of the workspace folders, deletions are not tracked + * * If you are interested in being notified when the watched path itself is being deleted, you have - * to watch it's parent folder. + * to watch it's parent folder. Make sure to use a simple `pattern` (such as putting the name of the + * folder) to not accidentally watch all sibling folders recursively. + * + * *Note* that the file paths that are reported for having changed may have a different path casing + * compared to the actual casing on disk on case-insensitive platforms (typically macOS and Windows + * but not Linux). We allow a user to open a workspace folder with any desired path casing and try + * to preserve that. This means: + * * if the path is within any of the workspace folders, the path will match the casing of the + * workspace folder up to that portion of the path and match the casing on disk for children + * * if the path is outside of any of the workspace folders, the casing will match the case of the + * path that was provided for watching + * In the same way, symbolic links are preserved, i.e. the file event will report the path of the + * symbolic link as it was provided for watching and not the target. * * ### Examples * @@ -11123,7 +11265,7 @@ declare module 'vscode' { /** * A short-hand for `openTextDocument(Uri.file(fileName))`. * - * @see {@link openTextDocument} + * @see {@link workspace.openTextDocument} * @param fileName A name of a file on disk. * @return A promise that resolves to a {@link TextDocument document}. */ @@ -11137,7 +11279,7 @@ declare module 'vscode' { * @param options Options to control how the document will be created. * @return A promise that resolves to a {@link TextDocument document}. */ - export function openTextDocument(options?: { language?: string; content?: string; }): Thenable; + export function openTextDocument(options?: { language?: string; content?: string }): Thenable; /** * Register a text document content provider. @@ -11227,7 +11369,7 @@ declare module 'vscode' { * Open an untitled notebook. The editor will prompt the user for a file * path when the document is to be saved. * - * @see {@link openNotebookDocument} + * @see {@link workspace.openNotebookDocument} * @param notebookType The notebook type that should be used. * @param content The initial contents of the notebook. * @returns A promise that resolves to a {@link NotebookDocument notebook}. @@ -11374,7 +11516,7 @@ declare module 'vscode' { * @param options Immutable metadata about the provider. * @return A {@link Disposable} that unregisters this provider when being disposed. */ - export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options?: { readonly isCaseSensitive?: boolean, readonly isReadonly?: boolean }): Disposable; + export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options?: { readonly isCaseSensitive?: boolean; readonly isReadonly?: boolean }): Disposable; /** * When true, the user has explicitly trusted the contents of the workspace. @@ -11393,7 +11535,7 @@ declare module 'vscode' { * a '{@link TextDocument}' or * a '{@link WorkspaceFolder}' */ - export type ConfigurationScope = Uri | TextDocument | WorkspaceFolder | { uri?: Uri, languageId: string }; + export type ConfigurationScope = Uri | TextDocument | WorkspaceFolder | { uri?: Uri; languageId: string }; /** * An event describing the change in Configuration @@ -11528,6 +11670,14 @@ declare module 'vscode' { */ export function createDiagnosticCollection(name?: string): DiagnosticCollection; + /** + * Creates a new {@link LanguageStatusItem language status item}. + * + * @param id The identifier of the item. + * @param selector The document selector that defines for what editors the item shows. + */ + export function createLanguageStatusItem(id: string, selector: DocumentSelector): LanguageStatusItem; + /** * Register a completion provider. * @@ -12117,7 +12267,7 @@ declare module 'vscode' { /** * The times at which execution started and ended, as unix timestamps */ - readonly timing?: { startTime: number, endTime: number }; + readonly timing?: { readonly startTime: number; readonly endTime: number }; } /** @@ -12157,7 +12307,7 @@ declare module 'vscode' { * @return A range that reflects the given change. Will return `this` range if the change * is not changing anything. */ - with(change: { start?: number, end?: number }): NotebookRange; + with(change: { start?: number; end?: number }): NotebookRange; } /** @@ -12387,21 +12537,26 @@ declare module 'vscode' { */ export interface NotebookDocumentContentOptions { /** - * Controls if outputs change will trigger notebook document content change and if it will be used in the diff editor - * Default to false. If the content provider doesn't persisit the outputs in the file document, this should be set to true. + * Controls if output change events will trigger notebook document content change events and + * if it will be used in the diff editor, defaults to false. If the content provider doesn't + * persist the outputs in the file document, this should be set to true. */ transientOutputs?: boolean; /** - * Controls if a cell metadata property change will trigger notebook document content change and if it will be used in the diff editor - * Default to false. If the content provider doesn't persisit a metadata property in the file document, it should be set to true. + * Controls if a cell metadata property change event will trigger notebook document content + * change events and if it will be used in the diff editor, defaults to false. If the + * content provider doesn't persist a metadata property in the file document, it should be + * set to true. */ transientCellMetadata?: { [key: string]: boolean | undefined }; /** - * Controls if a document metadata property change will trigger notebook document content change and if it will be used in the diff editor - * Default to false. If the content provider doesn't persisit a metadata property in the file document, it should be set to true. - */ + * Controls if a document metadata property change event will trigger notebook document + * content change event and if it will be used in the diff editor, defaults to false. If the + * content provider doesn't persist a metadata property in the file document, it should be + * set to true. + */ transientDocumentMetadata?: { [key: string]: boolean | undefined }; } @@ -12532,7 +12687,7 @@ declare module 'vscode' { * _Note_ that controller selection is persisted (by the controllers {@link NotebookController.id id}) and restored as soon as a * controller is re-created or as a notebook is {@link workspace.onDidOpenNotebookDocument opened}. */ - readonly onDidChangeSelectedNotebooks: Event<{ notebook: NotebookDocument, selected: boolean }>; + readonly onDidChangeSelectedNotebooks: Event<{ notebook: NotebookDocument; selected: boolean }>; /** * A controller can set affinities for specific notebook documents. This allows a controller @@ -13027,21 +13182,21 @@ declare module 'vscode' { * A DebugProtocolMessage is an opaque stand-in type for the [ProtocolMessage](https://microsoft.github.io/debug-adapter-protocol/specification#Base_Protocol_ProtocolMessage) type defined in the Debug Adapter Protocol. */ export interface DebugProtocolMessage { - // Properties: see details [here](https://microsoft.github.io/debug-adapter-protocol/specification#Base_Protocol_ProtocolMessage). + // Properties: see [ProtocolMessage details](https://microsoft.github.io/debug-adapter-protocol/specification#Base_Protocol_ProtocolMessage). } /** * A DebugProtocolSource is an opaque stand-in type for the [Source](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source) type defined in the Debug Adapter Protocol. */ export interface DebugProtocolSource { - // Properties: see details [here](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source). + // Properties: see [Source details](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source). } /** * A DebugProtocolBreakpoint is an opaque stand-in type for the [Breakpoint](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Breakpoint) type defined in the Debug Adapter Protocol. */ export interface DebugProtocolBreakpoint { - // Properties: see details [here](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Breakpoint). + // Properties: see [Breakpoint details](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Breakpoint). } /** @@ -14086,7 +14241,7 @@ declare module 'vscode' { * * Defaults to false. * - * Note: you cannot use this option with {@link silent}. + * Note: you cannot use this option with {@link AuthenticationGetSessionOptions.silent silent}. */ createIfNone?: boolean; @@ -14108,7 +14263,7 @@ declare module 'vscode' { * * Defaults to false. * - * Note: you cannot use this option with any other options that prompt the user like {@link createIfNone}. + * Note: you cannot use this option with any other options that prompt the user like {@link AuthenticationGetSessionOptions.createIfNone createIfNone}. */ silent?: boolean; } @@ -14456,10 +14611,23 @@ declare module 'vscode' { * the function returns or the returned thenable resolves. * * @param item An unresolved test item for which children are being - * requested, or `undefined` to resolve the controller's initial {@link items}. + * requested, or `undefined` to resolve the controller's initial {@link TestController.items items}. */ resolveHandler?: (item: TestItem | undefined) => Thenable | void; + /** + * If this method is present, a refresh button will be present in the + * UI, and this method will be invoked when it's clicked. When called, + * the extension should scan the workspace for any new, changed, or + * removed tests. + * + * It's recommended that extensions try to update tests in realtime, using + * a {@link FileWatcher} for example, and use this method as a fallback. + * + * @returns A thenable that resolves when tests have been refreshed. + */ + refreshHandler: ((token: CancellationToken) => Thenable | void) | undefined; + /** * Creates a {@link TestRun}. This should be called by the * {@link TestRunProfile} when a request is made to execute tests, and may @@ -14506,7 +14674,7 @@ declare module 'vscode' { * A TestRunRequest is a precursor to a {@link TestRun}, which in turn is * created by passing a request to {@link tests.runTests}. The TestRunRequest * contains information about which tests should be run, which should not be - * run, and how they are run (via the {@link profile}). + * run, and how they are run (via the {@link TestRunRequest.profile profile}). * * In general, TestRunRequests are created by the editor and pass to * {@link TestRunProfile.runHandler}, however you can also create test @@ -14708,7 +14876,7 @@ declare module 'vscode' { /** * The parent of this item. It's set automatically, and is undefined * top-level items in the {@link TestController.items} and for items that - * aren't yet included in another item's {@link children}. + * aren't yet included in another item's {@link TestItem.children children}. */ readonly parent: TestItem | undefined; @@ -14748,7 +14916,14 @@ declare module 'vscode' { description?: string; /** - * Location of the test item in its {@link uri}. + * A string that should be used when comparing this item + * with other items. When `falsy` the {@link TestItem.label label} + * is used. + */ + sortText?: string | undefined; + + /** + * Location of the test item in its {@link TestItem.uri uri}. * * This is only meaningful if the `uri` points to a file. */ @@ -14774,12 +14949,12 @@ declare module 'vscode' { message: string | MarkdownString; /** - * Expected test output. If given with {@link actualOutput}, a diff view will be shown. + * Expected test output. If given with {@link TestMessage.actualOutput actualOutput }, a diff view will be shown. */ expectedOutput?: string; /** - * Actual test output. If given with {@link expectedOutput}, a diff view will be shown. + * Actual test output. If given with {@link TestMessage.expectedOutput expectedOutput }, a diff view will be shown. */ actualOutput?: string; diff --git a/src/vscode-dts/vscode.proposed.commentTimestamp.d.ts b/src/vscode-dts/vscode.proposed.commentTimestamp.d.ts index 1039db61b98..2867dcbfeab 100644 --- a/src/vscode-dts/vscode.proposed.commentTimestamp.d.ts +++ b/src/vscode-dts/vscode.proposed.commentTimestamp.d.ts @@ -6,10 +6,9 @@ declare module 'vscode' { export interface Comment { /** - * An optional detail that will be displayed less prominently than the `author`. - * If a date is provided, then the date will be formatted according to the user's - * locale and settings. + * An optional timestamp that will be displayed in comments. + * The date will be formatted according to the user's locale and settings. */ - detail?: Date | string + timestamp?: Date; } } diff --git a/src/vscode-dts/vscode.proposed.externalUriOpener.d.ts b/src/vscode-dts/vscode.proposed.externalUriOpener.d.ts index 2b5432404f7..757844d2ecd 100644 --- a/src/vscode-dts/vscode.proposed.externalUriOpener.d.ts +++ b/src/vscode-dts/vscode.proposed.externalUriOpener.d.ts @@ -116,7 +116,7 @@ declare module 'vscode' { * * Currently only `http` and `https` are supported. */ - readonly schemes: readonly string[] + readonly schemes: readonly string[]; /** * Text displayed to the user that explains what the opener does. diff --git a/src/vscode-dts/vscode.proposed.fsChunks.d.ts b/src/vscode-dts/vscode.proposed.fsChunks.d.ts index fe582949348..e849a174345 100644 --- a/src/vscode-dts/vscode.proposed.fsChunks.d.ts +++ b/src/vscode-dts/vscode.proposed.fsChunks.d.ts @@ -8,7 +8,7 @@ declare module 'vscode' { // https://github.com/microsoft/vscode/issues/84515 export interface FileSystemProvider { - open?(resource: Uri, options: { create: boolean; }): number | Thenable; + open?(resource: Uri, options: { create: boolean }): number | Thenable; close?(fd: number): void | Thenable; read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): number | Thenable; write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): number | Thenable; diff --git a/src/vscode-dts/vscode.proposed.quickPickSeparators.d.ts b/src/vscode-dts/vscode.proposed.idToken.d.ts similarity index 64% rename from src/vscode-dts/vscode.proposed.quickPickSeparators.d.ts rename to src/vscode-dts/vscode.proposed.idToken.d.ts index 12d82ba72ec..85a071d5b36 100644 --- a/src/vscode-dts/vscode.proposed.quickPickSeparators.d.ts +++ b/src/vscode-dts/vscode.proposed.idToken.d.ts @@ -4,15 +4,13 @@ *--------------------------------------------------------------------------------------------*/ declare module 'vscode' { - - // https://github.com/microsoft/vscode/issues/74967 - - export enum QuickPickItemKind { - Separator = -1, - Default = 1, - } - - export interface QuickPickItem { - kind?: QuickPickItemKind + /** + * Represents a session of a currently logged in user. + */ + export interface AuthenticationSession { + /** + * An optional ID token that may be included in the session. + */ + readonly idToken?: string; } } diff --git a/src/vscode-dts/vscode.proposed.inlayHints.d.ts b/src/vscode-dts/vscode.proposed.inlayHints.d.ts index e8bbe67e8c2..33a2b1b24c4 100644 --- a/src/vscode-dts/vscode.proposed.inlayHints.d.ts +++ b/src/vscode-dts/vscode.proposed.inlayHints.d.ts @@ -7,11 +7,9 @@ declare module 'vscode' { // https://github.com/microsoft/vscode/issues/16221 - // todo@API Split between Inlay- and OverlayHints (InlayHint are for a position, OverlayHints for a non-empty range) - // todo@API add "mini-markdown" for links and styles - // (done) remove description - // (done) rename to InlayHint - // (done) add InlayHintKind with type, argument, etc + // todo@API support over an optional overlay range + // todo@API all for more InlayHintLabelPart commands + // todo@API allow for InlayHintLabelPart#colors? export namespace languages { /** @@ -28,57 +26,128 @@ declare module 'vscode' { export function registerInlayHintsProvider(selector: DocumentSelector, provider: InlayHintsProvider): Disposable; } + /** + * Inlay hint kinds. + * + * The kind of an inline hint defines its appearance, e.g the corresponding foreground and background colors are being + * used. + */ export enum InlayHintKind { - Other = 0, + /** + * An inlay hint that for a type annotation. + */ Type = 1, + /** + * An inlay hint that is for a parameter. + */ Parameter = 2, } + /** + * An inlay hint label part allows for interactive and composite labels of inlay hints. + */ export class InlayHintLabelPart { - label: string; - // todo@API implement this! - collapsible?: boolean; + /** + * The value of this label part. + */ + value: string; - // todo@api better name! - action?: Command | Location; // invokes provider + /** + * The tooltip text when you hover over this label part. + * + * *Note* that this property can be set late during + * {@link InlayHintsProvider.resolveInlayHint resolving} of inlay hints. + */ + tooltip?: string | MarkdownString | undefined; - constructor(label: string); + /** + * An optional {@link Location source code location} that represents this label + * part. + * + * The editor will use this location for the hover and for code navigation features: This + * part will become a clickable link that resolves to the definition of the symbol at the + * given location (not necessarily the location itself), it shows the hover that shows at + * the given location, and it shows a context menu with further code navigation commands. + * + * *Note* that this property can be set late during + * {@link InlayHintsProvider.resolveInlayHint resolving} of inlay hints. + */ + location?: Location | undefined; + + /** + * An optional command for this label part. + * + * The editor renders parts with commands as clickable links. The command is added to the context menu + * when a label part defines {@link InlayHintLabelPart.location location} and {@link InlayHintLabelPart.command command} . + * + * *Note* that this property can be set late during + * {@link InlayHintsProvider.resolveInlayHint resolving} of inlay hints. + */ + command?: Command | undefined; + + /** + * Creates a new inlay hint label part. + * + * @param value The value of the part. + */ + constructor(value: string); } /** * Inlay hint information. */ export class InlayHint { - /** - * - */ - label: string | InlayHintLabelPart[]; - /** - * The tooltip text when you hover over this item. - */ - tooltip?: string | MarkdownString | undefined; + /** * The position of this hint. */ position: Position; + /** - * The kind of this hint. + * The label of this hint. A human readable string or an array of {@link InlayHintLabelPart label parts}. + * + * *Note* that neither the string nor the label part can be empty. + */ + label: string | InlayHintLabelPart[]; + + /** + * The tooltip text when you hover over this item. + */ + tooltip?: string | MarkdownString | undefined; + + /** + * Optional command that will be the default gesture of this inlay hint. + */ + command?: Command; + + /** + * The kind of this hint. The inlay hint kind defines the appearance of this inlay hint. */ kind?: InlayHintKind; - /** - * Whitespace before the hint. - */ - // todo@API better name - whitespaceBefore?: boolean; - /** - * Whitespace after the hint. - */ - // todo@API better name - whitespaceAfter?: boolean; - // todo@API make range first argument - constructor(label: string | InlayHintLabelPart[], position: Position, kind?: InlayHintKind); + /** + * Render padding before the hint. Padding will use the editor's background color, + * not the background color of the hint itself. That means padding can be used to visually + * align/separate an inlay hint. + */ + paddingLeft?: boolean; + + /** + * Render padding after the hint. Padding will use the editor's background color, + * not the background color of the hint itself. That means padding can be used to visually + * align/separate an inlay hint. + */ + paddingRight?: boolean; + + /** + * Creates a new inlay hint. + * + * @param position The position of the hint. + * @param label The label of the hint. + * @param kind The {@link InlayHintKind kind} of the hint. + */ + constructor(position: Position, label: string | InlayHintLabelPart[], kind?: InlayHintKind); } /** @@ -88,21 +157,32 @@ declare module 'vscode' { export interface InlayHintsProvider { /** - * An optional event to signal that inlay hints have changed. - * @see {@link EventEmitter} + * An optional event to signal that inlay hints from this provider have changed. */ - //todo@API needs proper doc (like others) onDidChangeInlayHints?: Event; /** + * Provide inlay hints for the given range and document. * - * @param model The document in which the command was invoked. + * *Note* that inlay hints that are not {@link Range.contains contained} by the given range are ignored. + * + * @param document The document in which the command was invoked. * @param range The range for which inlay hints should be computed. * @param token A cancellation token. - * @return A list of inlay hints or a thenable that resolves to such. + * @return An array of inlay hints or a thenable that resolves to such. */ - provideInlayHints(model: TextDocument, range: Range, token: CancellationToken): ProviderResult; + provideInlayHints(document: TextDocument, range: Range, token: CancellationToken): ProviderResult; + /** + * Given an inlay hint fill in {@link InlayHint.tooltip tooltip}, {@link InlayHint.command command}, or complete + * label {@link InlayHintLabelPart parts}. + * + * *Note* that the editor will resolve an inlay hint at most once. + * + * @param hint An inlay hint. + * @param token A cancellation token. + * @return The resolved inlay hint or a thenable that resolves to such. It is OK to return the given `item`. When no result is returned, the given `item` will be used. + */ resolveInlayHint?(hint: T, token: CancellationToken): ProviderResult; } } diff --git a/src/vscode-dts/vscode.proposed.inlineCompletions.d.ts b/src/vscode-dts/vscode.proposed.inlineCompletions.d.ts index 7bae088dc27..8b296d517f3 100644 --- a/src/vscode-dts/vscode.proposed.inlineCompletions.d.ts +++ b/src/vscode-dts/vscode.proposed.inlineCompletions.d.ts @@ -10,7 +10,10 @@ declare module 'vscode' { export namespace languages { /** * Registers an inline completion provider. + * + * @return A {@link Disposable} that unregisters this provider when being disposed. */ + // todo@API what are the rules when multiple providers apply export function registerInlineCompletionItemProvider(selector: DocumentSelector, provider: InlineCompletionItemProvider): Disposable; } @@ -45,6 +48,7 @@ declare module 'vscode' { readonly selectedCompletionInfo: SelectedCompletionInfo | undefined; } + // todo@API is this to express a possible future outcome of the text document? export interface SelectedCompletionInfo { range: Range; text: string; @@ -69,6 +73,7 @@ declare module 'vscode' { Explicit = 1, } + // todo@API don't have separate type around array export class InlineCompletionList { items: T[]; @@ -85,6 +90,8 @@ declare module 'vscode' { * However, any indentation of the text to replace does not matter for the subword constraint. * Thus, ` B` can be replaced with ` ABC`, effectively removing a whitespace and inserting `A` and `C`. */ + // todo@API is this like CompletionItem#label or insertText? + // todo@API insertText text: string; /** @@ -103,10 +110,21 @@ declare module 'vscode' { */ command?: Command; + /** + * If set to `true`, unopened closing brackets are removed and unclosed opening brackets are closed. + * Defaults to `false`. + */ + // todo@API is this to compensate "bad" extensions, why isn't this done for normal completions or formatting? + // todo@API is this an instance property or a provider property? + // (1) leave proposed + completeBracketPairs?: boolean; + constructor(text: string, range?: Range, command?: Command); } + // TODO@API validate it is being used, iff so move to a different proposal + /** * Be aware that this API will not ever be finalized. */ diff --git a/src/vscode-dts/vscode.proposed.languageStatus.d.ts b/src/vscode-dts/vscode.proposed.languageStatus.d.ts deleted file mode 100644 index d39081e8202..00000000000 --- a/src/vscode-dts/vscode.proposed.languageStatus.d.ts +++ /dev/null @@ -1,76 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// https://github.com/microsoft/vscode/issues/129037 - -declare module 'vscode' { - - enum LanguageStatusSeverity { - Information = 0, - Warning = 1, - Error = 2 - } - - interface LanguageStatusItem { - - /** - * The identifier of this item. - */ - readonly id: string; - - /** - * The short name of this item, like 'Java Language Status', etc. - */ - name: string | undefined; - - /** - * A {@link DocumentSelector selector} that defines for what documents - * this item shows. - */ - selector: DocumentSelector; - - // todo@jrieken replace with boolean ala needsAttention - severity: LanguageStatusSeverity; - - /** - * The text to show for the entry. You can embed icons in the text by leveraging the syntax: - * - * `My text $(icon-name) contains icons like $(icon-name) this one.` - * - * Where the icon-name is taken from the ThemeIcon [icon set](https://code.visualstudio.com/api/references/icons-in-labels#icon-listing), e.g. - * `light-bulb`, `thumbsup`, `zap` etc. - */ - text: string; - - /** - * Optional, human-readable details for this item. - */ - detail?: string; - - /** - * Controls whether the item is shown as "busy". Defaults to `false`. - */ - busy: boolean; - - /** - * A {@linkcode Command command} for this item. - */ - command: Command | undefined; - - /** - * Accessibility information used when a screen reader interacts with this item - */ - accessibilityInformation?: AccessibilityInformation; - - /** - * Dispose and free associated resources. - */ - dispose(): void; - } - - namespace languages { - export function createLanguageStatusItem(id: string, selector: DocumentSelector): LanguageStatusItem; - } -} diff --git a/src/vscode-dts/vscode.proposed.markdownStringBaseUri.d.ts b/src/vscode-dts/vscode.proposed.markdownStringBaseUri.d.ts new file mode 100644 index 00000000000..732d54fc0ce --- /dev/null +++ b/src/vscode-dts/vscode.proposed.markdownStringBaseUri.d.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * 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/142051 + + interface MarkdownString { + /** + * Uri that relative paths are resolved relative to. + * + * If the `baseUri` is a directory, relative paths in the markdown are resolved relative to that directory: + * + * ```ts + * const md = new vscode.MarkdownString(`[link](./file.js)`); + * md.baseUri = vscode.Uri.file('/path/to/dir/'); + * // Here 'link' in the rendered markdown resolves to '/path/to/dir/file.js' + * ``` + * + * If the `baseUri` is a file, relative paths in the markdown are resolved relative to the parent dir of that file: + * + * ```ts + * const md = new vscode.MarkdownString(`[link](./file.js)`); + * md.baseUri = vscode.Uri.file('/path/to/otherFile.js'); + * // Here 'link' in the rendered markdown resolves to '/path/to/file.js' + * ``` + */ + baseUri?: Uri; + } +} diff --git a/src/vscode-dts/vscode.proposed.notebookDebugOptions.d.ts b/src/vscode-dts/vscode.proposed.notebookDebugOptions.d.ts index 6bd35115a81..af78d4a8ce6 100644 --- a/src/vscode-dts/vscode.proposed.notebookDebugOptions.d.ts +++ b/src/vscode-dts/vscode.proposed.notebookDebugOptions.d.ts @@ -6,7 +6,7 @@ declare module 'vscode' { // eslint-disable-next-line vscode-dts-region-comments - // @roblourens: new debug session option for simple UI 'managedByParent' (see https://github.com/microsoft/vscode/issues/128588) + // @roblourens: new debug session option for simple UI (see https://github.com/microsoft/vscode/issues/128588) /** * Options for {@link debug.startDebugging starting a debug session}. @@ -18,7 +18,7 @@ declare module 'vscode' { * When true, the debug toolbar will not be shown for this session, the window statusbar color will not be changed, and the debug viewlet will not be automatically revealed. */ simple?: boolean; - } + }; /** * When true, a save will not be triggered for open editors when starting a debug session, regardless of the value of the `debug.saveBeforeStart` setting. diff --git a/src/vscode-dts/vscode.proposed.notebookEditor.d.ts b/src/vscode-dts/vscode.proposed.notebookEditor.d.ts index 0181b8f7ef2..74162df35c2 100644 --- a/src/vscode-dts/vscode.proposed.notebookEditor.d.ts +++ b/src/vscode-dts/vscode.proposed.notebookEditor.d.ts @@ -121,7 +121,7 @@ declare module 'vscode' { * The {@link NotebookEditor notebook editor} for which the selections have changed. */ readonly notebookEditor: NotebookEditor; - readonly selections: ReadonlyArray + readonly selections: ReadonlyArray; } export interface NotebookEditorVisibleRangesChangeEvent { diff --git a/src/vscode-dts/vscode.proposed.notebookLiveShare.d.ts b/src/vscode-dts/vscode.proposed.notebookLiveShare.d.ts index de2966db16c..ed477d10b3d 100644 --- a/src/vscode-dts/vscode.proposed.notebookLiveShare.d.ts +++ b/src/vscode-dts/vscode.proposed.notebookLiveShare.d.ts @@ -9,7 +9,7 @@ declare module 'vscode' { export interface NotebookRegistrationData { displayName: string; - filenamePattern: (GlobPattern | { include: GlobPattern; exclude: GlobPattern; })[]; + filenamePattern: (GlobPattern | { include: GlobPattern; exclude: GlobPattern })[]; exclusive?: boolean; } diff --git a/src/vscode-dts/vscode.proposed.notebookMessaging.d.ts b/src/vscode-dts/vscode.proposed.notebookMessaging.d.ts index 88660ded2e6..4c66d33b455 100644 --- a/src/vscode-dts/vscode.proposed.notebookMessaging.d.ts +++ b/src/vscode-dts/vscode.proposed.notebookMessaging.d.ts @@ -43,7 +43,7 @@ declare module 'vscode' { * An event that fires when a {@link NotebookController.rendererScripts renderer script} has send a message to * the controller. */ - readonly onDidReceiveMessage: Event<{ editor: NotebookEditor, message: any }>; + readonly onDidReceiveMessage: Event<{ editor: NotebookEditor; message: any }>; /** * Send a message to the renderer of notebook editors. diff --git a/src/vscode-dts/vscode.proposed.portsAttributes.d.ts b/src/vscode-dts/vscode.proposed.portsAttributes.d.ts index 1842605a5e7..7a563e13e04 100644 --- a/src/vscode-dts/vscode.proposed.portsAttributes.d.ts +++ b/src/vscode-dts/vscode.proposed.portsAttributes.d.ts @@ -57,6 +57,6 @@ declare module 'vscode' { * The `portRange` is start inclusive and end exclusive. * @param provider The PortAttributesProvider */ - export function registerPortAttributesProvider(portSelector: { pid?: number, portRange?: [number, number], commandMatcher?: RegExp }, provider: PortAttributesProvider): Disposable; + export function registerPortAttributesProvider(portSelector: { pid?: number; portRange?: [number, number]; commandMatcher?: RegExp }, provider: PortAttributesProvider): Disposable; } } diff --git a/src/vscode-dts/vscode.proposed.resolvers.d.ts b/src/vscode-dts/vscode.proposed.resolvers.d.ts index 43c87ee0cb8..f436a5625ba 100644 --- a/src/vscode-dts/vscode.proposed.resolvers.d.ts +++ b/src/vscode-dts/vscode.proposed.resolvers.d.ts @@ -27,7 +27,7 @@ declare module 'vscode' { } export interface ResolvedOptions { - extensionHostEnv?: { [key: string]: string | null; }; + extensionHostEnv?: { [key: string]: string | null }; isTrusted?: boolean; @@ -44,7 +44,7 @@ declare module 'vscode' { } export interface TunnelOptions { - remoteAddress: { port: number, host: string; }; + remoteAddress: { port: number; host: string }; // The desired local port. If this port can't be used, then another will be chosen. localAddressPort?: number; label?: string; @@ -57,9 +57,9 @@ declare module 'vscode' { } export interface TunnelDescription { - remoteAddress: { port: number, host: string; }; + remoteAddress: { port: number; host: string }; //The complete local address(ex. localhost:1234) - localAddress: { port: number, host: string; } | string; + localAddress: { port: number; host: string } | string; /** * @deprecated Use privacy instead */ diff --git a/src/vscode-dts/vscode.proposed.scmActionButton.d.ts b/src/vscode-dts/vscode.proposed.scmActionButton.d.ts index f60dc3047c7..82b4b936abc 100644 --- a/src/vscode-dts/vscode.proposed.scmActionButton.d.ts +++ b/src/vscode-dts/vscode.proposed.scmActionButton.d.ts @@ -6,7 +6,12 @@ declare module 'vscode' { // https://github.com/microsoft/vscode/issues/133935 + export interface SourceControlActionButton { + command: Command; + description?: string; + } + export interface SourceControl { - actionButton?: Command; + actionButton?: SourceControlActionButton; } } diff --git a/src/vscode-dts/vscode.proposed.tabs.d.ts b/src/vscode-dts/vscode.proposed.tabs.d.ts index 691cfd8f07c..ad2e35529cc 100644 --- a/src/vscode-dts/vscode.proposed.tabs.d.ts +++ b/src/vscode-dts/vscode.proposed.tabs.d.ts @@ -45,8 +45,8 @@ declare module 'vscode' { * always be at index 0. */ readonly additionalResourcesAndViewIds: readonly { - readonly resource: Uri | undefined, - readonly viewId: string | undefined + readonly resource: Uri | undefined; + readonly viewId: string | undefined; }[]; /** diff --git a/src/vscode-dts/vscode.proposed.telemetry.d.ts b/src/vscode-dts/vscode.proposed.telemetry.d.ts new file mode 100644 index 00000000000..cf068a7814e --- /dev/null +++ b/src/vscode-dts/vscode.proposed.telemetry.d.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * 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' { + + export interface TelemetryConfiguration { + /** + * Whether or not usage telemetry collection is allowed + */ + isUsageEnabled: boolean; + /** + * Whether or not crash error telemetry collection is allowed + */ + isErrorsEnabled: boolean; + /** + * Whether or not crash report collection is allowed + */ + isCrashEnabled: boolean; + } + + export namespace env { + /** + * Indicates what telemetry is enabled / disabled + * Can be observed to determine what telemetry the extension is allowed to send + */ + export const telemetryConfiguration: TelemetryConfiguration; + + /** + * An {@link Event} which fires when the collectable state of telemetry changes + * Returns a {@link TelemetryConfiguration} object + */ + export const onDidChangeTelemetryConfiguration: Event; + } +} diff --git a/src/vscode-dts/vscode.proposed.terminalDisablePersistence.d.ts b/src/vscode-dts/vscode.proposed.terminalDisablePersistence.d.ts deleted file mode 100644 index 3c2f9d89e7f..00000000000 --- a/src/vscode-dts/vscode.proposed.terminalDisablePersistence.d.ts +++ /dev/null @@ -1,19 +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' { - export interface TerminalOptions { - /** - * Opt-out of the default terminal persistence on restart and reload - */ - disablePersistence?: boolean; - } - export interface ExtensionTerminalOptions { - /** - * Opt-out of the default terminal persistence on restart and reload - */ - disablePersistence?: boolean; - } -} diff --git a/src/vscode-dts/vscode.proposed.testCoverage.d.ts b/src/vscode-dts/vscode.proposed.testCoverage.d.ts index 3f0ec8f1d67..3d7092ebb3c 100644 --- a/src/vscode-dts/vscode.proposed.testCoverage.d.ts +++ b/src/vscode-dts/vscode.proposed.testCoverage.d.ts @@ -12,7 +12,7 @@ declare module 'vscode' { * Test coverage provider for this result. An extension can defer setting * this until after a run is complete and coverage is available. */ - coverageProvider?: TestCoverageProvider + coverageProvider?: TestCoverageProvider; // ... } diff --git a/src/vscode-dts/vscode.proposed.testRefresh.d.ts b/src/vscode-dts/vscode.proposed.testRefresh.d.ts deleted file mode 100644 index 3e35b8f6f0a..00000000000 --- a/src/vscode-dts/vscode.proposed.testRefresh.d.ts +++ /dev/null @@ -1,37 +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/139737 - - export interface TestController { - /** - * If this method is present, a refresh button will be present in the - * UI, and this method will be invoked when it's clicked. When called, - * the extension should scan the workspace for any new, changed, or - * removed tests. - * - * It's recommended that extensions try to update tests in realtime, using - * a {@link FileWatcher} for example, and use this method as a fallback. - * - * @returns A thenable that resolves when tests have been refreshed. - */ - refreshHandler: ((token: CancellationToken) => Thenable | void) | undefined; - } - - - export namespace tests { - /** - * Creates a new test controller. - * - * @param id Identifier for the controller, must be globally unique. - * @param label A human-readable label for the controller. - * @param refreshHandler A value for {@link TestController.refreshHandler} - * @returns An instance of the {@link TestController}. - */ - export function createTestController(id: string, label: string, refreshHandler?: (token: CancellationToken) => Thenable | void): TestController; - } -} diff --git a/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts b/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts index a65cc59a666..4fbd0c053ec 100644 --- a/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.textSearchProvider.d.ts @@ -156,16 +156,16 @@ declare module 'vscode' { /** * Markdown text of the message. */ - text: string, + text: string; /** * Whether the source of the message is trusted, command links are disabled for untrusted message sources. * Messaged are untrusted by default. */ - trusted?: boolean, + trusted?: boolean; /** * The message type, this affects how the message will be rendered. */ - type: TextSearchCompleteMessageType, + type: TextSearchCompleteMessageType; } /** diff --git a/src/vscode-dts/vscode.proposed.timeline.d.ts b/src/vscode-dts/vscode.proposed.timeline.d.ts index 625bc8c9bed..08811d33aaf 100644 --- a/src/vscode-dts/vscode.proposed.timeline.d.ts +++ b/src/vscode-dts/vscode.proposed.timeline.d.ts @@ -28,7 +28,7 @@ declare module 'vscode' { /** * The icon path or {@link ThemeIcon} for the timeline item. */ - iconPath?: Uri | { light: Uri; dark: Uri; } | ThemeIcon; + iconPath?: Uri | { light: Uri; dark: Uri } | ThemeIcon; /** * A human readable string describing less prominent details of the timeline item. @@ -114,7 +114,7 @@ declare module 'vscode' { * An optional maximum number timeline items or the all timeline items newer (inclusive) than the timestamp or id that should be returned. * If `undefined` all timeline items should be returned. */ - limit?: number | { timestamp: number; id?: string; }; + limit?: number | { timestamp: number; id?: string }; } export interface TimelineProvider { diff --git a/src/vscode-dts/vscode.proposed.treeViewDragAndDrop.d.ts b/src/vscode-dts/vscode.proposed.treeViewDragAndDrop.d.ts index 7f0cea4602b..8f243fac548 100644 --- a/src/vscode-dts/vscode.proposed.treeViewDragAndDrop.d.ts +++ b/src/vscode-dts/vscode.proposed.treeViewDragAndDrop.d.ts @@ -29,24 +29,13 @@ declare module 'vscode' { /** * A class for encapsulating data transferred during a tree drag and drop event. * - * If your `DragAndDropController` implements `handleDrag`, you can extend `TreeDataTransferItem` and return - * an instance of your new class for easy access to the source tree items. - * - * ```ts - * class TestViewObjectTransferItem extends vscode.TreeDataTransferItem { - * constructor(private _nodes: Node[]) { - * super(_nodes); - * } - * - * asObject(): Node[] { - * return this._nodes; - * } - * } - * ``` + * If your `DragAndDropController` implements `handleDrag`, you can use the `value` of the `TreeDataTransferItem` + * to get back the object you put into it so long as the extension that created the `TreeDataTransferItem` runs in the same + * extension host. */ export class TreeDataTransferItem { asString(): Thenable; - + readonly value: any; constructor(value: any); } @@ -79,11 +68,12 @@ declare module 'vscode' { /** * Provides support for drag and drop in `TreeView`. */ + // todo@API formalize mime types, either `text/uri-list` and or `application/vnd.code.XYZ` (see NotebookOutputItem) export interface TreeDragAndDropController { /** - * The mime types that the `drop` method of this `DragAndDropController` supports. This could be well-defined, existing, mime types, - * and also mime types defined by the extension that are returned in the `TreeDataTransfer` from `handleDrag`. + * The mime types that the `handleDrop` method of this `DragAndDropController` supports. + * This could be well-defined, existing, mime types, and also mime types defined by the extension. * * Each tree will automatically support drops from it's own `DragAndDropController`. To support drops from other trees, * you will need to add the mime type of that tree. The mime type of a tree is of the format `tree/treeidlowercase`. @@ -93,7 +83,13 @@ declare module 'vscode' { * 2. Use the Developer: Set Log Level... command to set the level to "Debug" * 3. Open the developer tools and drag the item with unknown mime type over your tree. The mime types will be logged to the developer console */ - readonly supportedMimeTypes: string[]; + readonly dropMimeTypes: string[]; + + /** + * The mime types that the `handleDrag` method of this `TreeDragAndDropController` may add to the tree data transfer. + * This could be well-defined, existing, mime types, and also mime types defined by the extension. + */ + readonly dragMimeTypes: string[]; /** * When the user starts dragging items from this `DragAndDropController`, `handleDrag` will be called. @@ -102,11 +98,15 @@ declare module 'vscode' { * When the items are dropped on **another tree item** in **the same tree**, your `TreeDataTransferItem` objects * will be preserved. See the documentation for `TreeDataTransferItem` for how best to take advantage of this. * - * The returned `TreeDataTransfer` will be merged with the original`TreeDataTransfer` for the operation. + * To add a data transfer item that can be dragged into the editor, use the application specific mime type "resourceurls". + * The data for "resourceurls" should be an array of `toString()`ed Uris. To specify a cursor position in the file, + * set the Uri's fragment to `L3,5`, where 3 is the line number and 5 is the column number. * * @param source The source items for the drag and drop operation. + * @param treeDataTransfer The data transfer associated with this drag. + * @param token A cancellation token indicating that drag has been cancelled. */ - handleDrag?(source: T[]): Thenable; + handleDrag?(source: T[], treeDataTransfer: TreeDataTransfer, token: CancellationToken): Thenable | void; /** * Called when a drag and drop action results in a drop on the tree that this `DragAndDropController` belongs too. @@ -114,8 +114,10 @@ declare module 'vscode' { * Extensions should fire `TreeDataProvider.onDidChangeTreeData` for any elements that need to be refreshed. * * @param source The data transfer items of the source of the drag. - * @param target The target tree element that the drop is occuring on. + * @param target The target tree element that the drop is occurring on. + * @param token TODO @alexr00: When would this operation actually be cancelled? */ - handleDrop(source: TreeDataTransfer, target: T): Thenable | void; + // TODO@API align order of TreeDataTransfer and T with handleDrag + handleDrop(source: TreeDataTransfer, target: T, token: CancellationToken): Thenable | void; } } diff --git a/src/vscode-dts/vscode.proposed.treeViewReveal.d.ts b/src/vscode-dts/vscode.proposed.treeViewReveal.d.ts index e71c2f71879..b8731e6caa2 100644 --- a/src/vscode-dts/vscode.proposed.treeViewReveal.d.ts +++ b/src/vscode-dts/vscode.proposed.treeViewReveal.d.ts @@ -8,6 +8,6 @@ declare module 'vscode' { // https://github.com/microsoft/vscode/issues/61313 @alexr00 export interface TreeView extends Disposable { - reveal(element: T | undefined, options?: { select?: boolean, focus?: boolean, expand?: boolean | number; }): Thenable; + reveal(element: T | undefined, options?: { select?: boolean; focus?: boolean; expand?: boolean | number }): Thenable; } } diff --git a/test/README.md b/test/README.md index 445945d7c9e..80cf9d92912 100644 --- a/test/README.md +++ b/test/README.md @@ -6,4 +6,3 @@ This folder contains the various test runners for VSCode. Please refer to the do * `unit`: our suite of unit tests ([README](unit/README.md)) * `integration`: our suite of API tests ([README](integration/browser/README.md)) * `smoke`: our suite of automated UI tests ([README](smoke/README.md)) -* `ui`: our suite of manual UI tests diff --git a/test/automation/package.json b/test/automation/package.json index 509d18fb05a..7a7b3c5a560 100644 --- a/test/automation/package.json +++ b/test/automation/package.json @@ -9,9 +9,9 @@ "main": "./out/index.js", "private": true, "scripts": { - "compile": "npm run copy-driver && npm run copy-driver-definition && tsc", + "compile": "npm run copy-driver && npm run copy-driver-definition && node ../../node_modules/typescript/bin/tsc", "watch": "npm-run-all -lp watch-driver watch-driver-definition watch-tsc", - "watch-tsc": "tsc --watch --preserveWatchOutput", + "watch-tsc": "node ../../node_modules/typescript/bin/tsc --watch --preserveWatchOutput", "copy-driver": "cpx src/driver.js out/", "watch-driver": "cpx src/driver.js out/ -w", "copy-driver-definition": "node tools/copy-driver-definition.js", @@ -29,7 +29,7 @@ "devDependencies": { "@types/mkdirp": "^1.0.1", "@types/ncp": "2.0.1", - "@types/node": "14.x", + "@types/node": "16.x", "@types/tmp": "0.2.2", "cpx2": "3.0.0", "npm-run-all": "^4.1.5", diff --git a/test/automation/src/application.ts b/test/automation/src/application.ts index 2a771d2c378..15b7fbd9a92 100644 --- a/test/automation/src/application.ts +++ b/test/automation/src/application.ts @@ -71,7 +71,7 @@ export class Application { await this.code.waitForElement('.explorer-folders-view'); } - async restart(options?: { workspaceOrFolder?: string, extraArgs?: string[] }): Promise { + async restart(options?: { workspaceOrFolder?: string; extraArgs?: string[] }): Promise { await this.stop(); await this._start(options?.workspaceOrFolder, options?.extraArgs); } @@ -140,8 +140,8 @@ export class Application { await code.waitForWindowIds(ids => ids.length > 0); await code.waitForElement('.monaco-workbench'); - // Web or remote: wait for a remote connection state change - if (this.remote || this.web) { + // Remote but not web: wait for a remote connection state change + if (this.remote) { await code.waitForTextContent('.monaco-workbench .statusbar-item[id="status.host"]', undefined, s => { this.logger.log(`checkWindowReady: remote indicator text is ${s}`); diff --git a/test/automation/src/code.ts b/test/automation/src/code.ts index a86a8c84e3a..d728c2dfddb 100644 --- a/test/automation/src/code.ts +++ b/test/automation/src/code.ts @@ -30,7 +30,7 @@ export interface LaunchOptions { } interface ICodeInstance { - kill: () => Promise + kill: () => Promise; } const instances = new Set(); @@ -206,7 +206,7 @@ export class Code { this.logger.log('Smoke test exit call did not terminate process after 10s, forcefully exiting the application...'); // no need to await since we're polling for the process to die anyways - treekill(this.mainProcess.pid, err => { + treekill(this.mainProcess.pid!, err => { this.logger.log('Failed to kill Electron process tree:', err?.message); }); } @@ -217,7 +217,7 @@ export class Code { } try { - process.kill(this.mainProcess.pid, 0); // throws an exception if the process doesn't exist anymore. + process.kill(this.mainProcess.pid!, 0); // throws an exception if the process doesn't exist anymore. await new Promise(resolve => setTimeout(resolve, 500)); } catch (error) { done = true; diff --git a/test/automation/src/electronDriver.ts b/test/automation/src/electronDriver.ts index eddfc796550..ed6b7726133 100644 --- a/test/automation/src/electronDriver.ts +++ b/test/automation/src/electronDriver.ts @@ -18,7 +18,7 @@ import type { LaunchOptions } from './code'; const repoPath = path.join(__dirname, '../../..'); -export async function launch(options: LaunchOptions): Promise<{ electronProcess: ChildProcess, client: IDisposable, driver: IDriver, kill: () => Promise }> { +export async function launch(options: LaunchOptions): Promise<{ electronProcess: ChildProcess; client: IDisposable; driver: IDriver; kill: () => Promise }> { const { codePath, workspacePath, extensionsPath, userDataDir, remote, logger, verbose, extraArgs } = options; const env = { ...process.env }; const logsPath = path.join(repoPath, '.build', 'logs', remote ? 'smoke-tests-remote' : 'smoke-tests'); diff --git a/test/automation/src/extensions.ts b/test/automation/src/extensions.ts index b0c56f948ea..b98b03eb4b1 100644 --- a/test/automation/src/extensions.ts +++ b/test/automation/src/extensions.ts @@ -11,6 +11,7 @@ import { ncp } from 'ncp'; import { promisify } from 'util'; const SEARCH_BOX = 'div.extensions-viewlet[id="workbench.view.extensions"] .monaco-editor textarea'; +const REFRESH_BUTTON = 'div.part.sidebar.left[id="workbench.parts.sidebar"] .codicon.codicon-extensions-refresh'; export class Extensions extends Viewlet { @@ -33,7 +34,17 @@ export class Extensions extends Viewlet { await this.code.waitForActiveElement(SEARCH_BOX); await this.code.waitForTypeInEditor(SEARCH_BOX, `@id:${id}`); await this.code.waitForTextContent(`div.part.sidebar div.composite.title h2`, 'Extensions: Marketplace'); - await this.code.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[data-extension-id="${id}"]`); + + let retrials = 1; + while (retrials++ < 10) { + try { + return await this.code.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[data-extension-id="${id}"]`, undefined, 100); + } catch (error) { + this.code.logger.log(`Extension '${id}' is not found. Retrying count: ${retrials}`); + await this.code.waitAndClick(REFRESH_BUTTON); + } + } + throw new Error(`Extension ${id} is not found`); } async openExtension(id: string): Promise { diff --git a/test/automation/src/playwrightDriver.ts b/test/automation/src/playwrightDriver.ts index d7da0ec9f3f..3d3cee786a5 100644 --- a/test/automation/src/playwrightDriver.ts +++ b/test/automation/src/playwrightDriver.ts @@ -196,7 +196,7 @@ class PlaywrightDriver implements IDriver { let port = 9000; -export async function launch(options: LaunchOptions): Promise<{ serverProcess: ChildProcess, client: IDisposable, driver: IDriver, kill: () => Promise }> { +export async function launch(options: LaunchOptions): Promise<{ serverProcess: ChildProcess; client: IDisposable; driver: IDriver; kill: () => Promise }> { // Launch server const { serverProcess, endpoint } = await launchServer(options); @@ -220,28 +220,28 @@ async function launchServer(options: LaunchOptions) { const agentFolder = userDataDir; await measureAndLog(promisify(mkdir)(agentFolder), `mkdir(${agentFolder})`, logger); const env = { - VSCODE_AGENT_FOLDER: agentFolder, VSCODE_REMOTE_SERVER_PATH: codeServerPath, ...process.env }; - const args = ['--disable-telemetry', '--port', `${port++}`, '--browser', 'none', '--driver', 'web', '--extensions-dir', extensionsPath]; + const args = ['--disable-telemetry', '--port', `${port++}`, '--driver', 'web', '--extensions-dir', extensionsPath, '--server-data-dir', agentFolder]; let serverLocation: string | undefined; if (codeServerPath) { - serverLocation = join(codeServerPath, `server.${process.platform === 'win32' ? 'cmd' : 'sh'}`); - args.push(`--logsPath=${logsPath}`); + const { serverApplicationName } = require(join(codeServerPath, 'product.json')); + serverLocation = join(codeServerPath, 'bin', `${serverApplicationName}${process.platform === 'win32' ? '.cmd' : ''}`); logger.log(`Starting built server from '${serverLocation}'`); - logger.log(`Storing log files into '${logsPath}'`); } else { - serverLocation = join(root, `resources/server/web.${process.platform === 'win32' ? 'bat' : 'sh'}`); - args.push('--logsPath', logsPath); + serverLocation = join(root, `scripts/code-server.${process.platform === 'win32' ? 'bat' : 'sh'}`); logger.log(`Starting server out of sources from '${serverLocation}'`); - logger.log(`Storing log files into '${logsPath}'`); } + logger.log(`Storing log files into '${logsPath}'`); + args.push('--logsPath', logsPath); + + logger.log(`Command line: '${serverLocation}' ${args.join(' ')}`); const serverProcess = spawn( serverLocation, args, @@ -252,7 +252,7 @@ async function launchServer(options: LaunchOptions) { return { serverProcess, - endpoint: await measureAndLog(waitForEndpoint(serverProcess), 'waitForEndpoint(serverProcess)', logger) + endpoint: await measureAndLog(waitForEndpoint(serverProcess, logger), 'waitForEndpoint(serverProcess)', logger) }; } @@ -283,7 +283,7 @@ async function launchBrowser(options: LaunchOptions, endpoint: string) { }); const payloadParam = `[["enableProposedApi",""],["webviewExternalEndpointCommit","d372f9187401bd145a0a6e15ba369e2d82d02005"],["skipWelcome","true"]]`; - await measureAndLog(page.goto(`${endpoint}&folder=vscode-remote://localhost:9888${URI.file(workspacePath!).path}&payload=${payloadParam}`), 'page.goto()', logger); + await measureAndLog(page.goto(`${endpoint}&folder=${URI.file(workspacePath!).path}&payload=${payloadParam}`), 'page.goto()', logger); return { browser, context, page }; } @@ -313,13 +313,31 @@ async function teardown(server: ChildProcess, logger: Logger): Promise { logger.log(`Gave up tearing down server after ${retries} attempts...`); } -function waitForEndpoint(server: ChildProcess): Promise { - return new Promise(resolve => { - server.stdout?.on('data', (d: Buffer) => { - const matches = d.toString('ascii').match(/Web UI available at (.+)/); +function waitForEndpoint(server: ChildProcess, logger: Logger): Promise { + return new Promise((resolve, reject) => { + let endpointFound = false; + + server.stdout?.on('data', data => { + if (!endpointFound) { + logger.log(`[server] stdout: ${data}`); // log until endpoint found to diagnose issues + } + + const matches = data.toString('ascii').match(/Web UI available at (.+)/); if (matches !== null) { + endpointFound = true; + resolve(matches[1]); } }); + + server.stderr?.on('data', error => { + if (!endpointFound) { + logger.log(`[server] stderr: ${error}`); // log until endpoint found to diagnose issues + } + + if (error.toString().indexOf('EADDRINUSE') !== -1) { + reject(new Error(error)); + } + }); }); } diff --git a/test/automation/src/settings.ts b/test/automation/src/settings.ts index 1e5e586cf5f..7b58f0b5567 100644 --- a/test/automation/src/settings.ts +++ b/test/automation/src/settings.ts @@ -15,8 +15,7 @@ export class SettingsEditor { constructor(private code: Code, private userDataPath: string, private editors: Editors, private editor: Editor, private quickaccess: QuickAccess) { } async addUserSetting(setting: string, value: string): Promise { - await this.openSettings(); - await this.editor.waitForEditorFocus('settings.json', 1); + await this.openUserSettingsFile(); await this.code.dispatchKeybinding('right'); await this.editor.waitForTypeInEditor('settings.json', `"${setting}": ${value},`); @@ -27,11 +26,12 @@ export class SettingsEditor { const settingsPath = path.join(this.userDataPath, 'User', 'settings.json'); await new Promise((c, e) => fs.writeFile(settingsPath, '{\n}', 'utf8', err => err ? e(err) : c())); - await this.openSettings(); + await this.openUserSettingsFile(); await this.editor.waitForEditorContents('settings.json', c => c === '{}'); } - private async openSettings(): Promise { + async openUserSettingsFile(): Promise { await this.quickaccess.runCommand('workbench.action.openSettingsJson'); + await this.editor.waitForEditorFocus('settings.json', 1); } } diff --git a/test/automation/src/terminal.ts b/test/automation/src/terminal.ts index bbc7f06ac45..ec10f841279 100644 --- a/test/automation/src/terminal.ts +++ b/test/automation/src/terminal.ts @@ -12,6 +12,7 @@ export enum Selector { Xterm = `#terminal .terminal-wrapper`, XtermEditor = `.editor-instance .terminal-wrapper`, TabsEntry = '.terminal-tabs-entry', + Description = '.label-description', XtermFocused = '.terminal.xterm.focus', PlusButton = '.codicon-plus', EditorGroups = '.editor .split-view-view', @@ -54,9 +55,10 @@ export enum TerminalCommandId { CreateNew = 'workbench.action.terminal.new' } interface TerminalLabel { - name?: string, - icon?: string, - color?: string + name?: string; + description?: string; + icon?: string; + color?: string; } type TerminalGroup = TerminalLabel[]; @@ -115,7 +117,13 @@ export class Terminal { } async assertSingleTab(label: TerminalLabel, editor?: boolean): Promise { - await this.assertTabExpected(editor ? Selector.EditorTab : Selector.SingleTab, undefined, label.name ? new RegExp(label.name) : undefined, label.icon, label.color); + let regex = undefined; + if (label.name && label.description) { + regex = new RegExp(label.name + ' - ' + label.description); + } else if (label.name) { + regex = new RegExp(label.name); + } + await this.assertTabExpected(editor ? Selector.EditorTab : Selector.SingleTab, undefined, regex, label.icon, label.color); } async assertTerminalGroups(expectedGroups: TerminalGroup[]): Promise { @@ -130,7 +138,7 @@ export class Terminal { while (indexInGroup < terminalsInGroup) { let instance = expectedGroups[groupIndex][indexInGroup]; const nameRegex = instance.name && isSplit ? new RegExp('\\s*[├┌└]\\s*' + instance.name) : instance.name ? new RegExp(/^\s*/ + instance.name) : undefined; - await this.assertTabExpected(undefined, index, nameRegex, instance.icon, instance.color); + await this.assertTabExpected(undefined, index, nameRegex, instance.icon, instance.color, instance.description); indexInGroup++; index++; } @@ -142,12 +150,15 @@ export class Terminal { const tabCount = (await this.code.waitForElements(Selector.Tabs, true)).length; const groups: TerminalGroup[] = []; for (let i = 0; i < tabCount; i++) { - const instance = await this.code.waitForElement(`${Selector.Tabs}[data-index="${i}"] ${Selector.TabsEntry}`, e => e?.textContent?.length ? e?.textContent?.length > 1 : false); + const title = await this.code.waitForElement(`${Selector.Tabs}[data-index="${i}"] ${Selector.TabsEntry}`, e => e?.textContent?.length ? e?.textContent?.length > 1 : false); + const description = await this.code.waitForElement(`${Selector.Tabs}[data-index="${i}"] ${Selector.TabsEntry} ${Selector.Description}`, e => e?.textContent?.length ? e?.textContent?.length > 1 : false); + const label: TerminalLabel = { - name: instance.textContent.replace(/^[├┌└]\s*/, '') + name: title.textContent.replace(/^[├┌└]\s*/, ''), + description: description.textContent }; // It's a new group if the the tab does not start with ├ or └ - if (instance.textContent.match(/^[├└]/)) { + if (title.textContent.match(/^[├└]/)) { groups[groups.length - 1].push(label); } else { groups.push([label]); @@ -161,10 +172,13 @@ export class Terminal { return tab.textContent; } - private async assertTabExpected(selector?: string, listIndex?: number, nameRegex?: RegExp, icon?: string, color?: string): Promise { + private async assertTabExpected(selector?: string, listIndex?: number, nameRegex?: RegExp, icon?: string, color?: string, description?: string): Promise { if (listIndex) { if (nameRegex) { await this.code.waitForElement(`${Selector.Tabs}[data-index="${listIndex}"] ${Selector.TabsEntry}`, entry => !!entry && !!entry?.textContent.match(nameRegex)); + if (description) { + await this.code.waitForElement(`${Selector.Tabs}[data-index="${listIndex}"] ${Selector.TabsEntry} ${Selector.Description}`, e => !!e && e.textContent === description); + } } if (color) { await this.code.waitForElement(`${Selector.Tabs}[data-index="${listIndex}"] ${Selector.TabsEntry} .monaco-icon-label.terminal-icon-terminal_ansi${color}`); diff --git a/test/automation/yarn.lock b/test/automation/yarn.lock index d2311cbb4f1..b5ccab17e0f 100644 --- a/test/automation/yarn.lock +++ b/test/automation/yarn.lock @@ -21,10 +21,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.1.tgz#3b5c3a26393c19b400844ac422bd0f631a94d69d" integrity sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/tmp@0.2.2": version "0.2.2" diff --git a/test/integration/browser/README.md b/test/integration/browser/README.md index 842d3b1eea8..34107241f8e 100644 --- a/test/integration/browser/README.md +++ b/test/integration/browser/README.md @@ -15,7 +15,7 @@ All integration tests run in an Electron instance. You can specify to run the te ## Run (inside browser) - resources/server/test/test-web-integration.[sh|bat] --browser [chromium|webkit] [--debug] + scripts/test-web-integration.[sh|bat] --browser [chromium|webkit] [--debug] All integration tests run in a browser instance as specified by the command line arguments. diff --git a/test/integration/browser/package.json b/test/integration/browser/package.json index 74a4096e5ac..446c8b69e5f 100644 --- a/test/integration/browser/package.json +++ b/test/integration/browser/package.json @@ -4,11 +4,11 @@ "license": "MIT", "main": "./index.js", "scripts": { - "compile": "tsc" + "compile": "node ../../../node_modules/typescript/bin/tsc" }, "devDependencies": { "@types/mkdirp": "^1.0.1", - "@types/node": "14.x", + "@types/node": "16.x", "@types/optimist": "0.0.29", "@types/rimraf": "^2.0.4", "@types/tmp": "0.1.0", diff --git a/test/integration/browser/src/index.ts b/test/integration/browser/src/index.ts index 818aaae5418..aa275da6b06 100644 --- a/test/integration/browser/src/index.ts +++ b/test/integration/browser/src/index.ts @@ -61,16 +61,16 @@ async function runTestsInBrowser(browserType: BrowserType, endpoint: url.UrlWith const host = endpoint.host; const protocol = 'vscode-remote'; - const testWorkspaceUri = url.format({ pathname: URI.file(path.resolve(optimist.argv.workspacePath)).path, protocol, host, slashes: true }); + const testWorkspacePath = URI.file(path.resolve(optimist.argv.workspacePath)).path; const testExtensionUri = url.format({ pathname: URI.file(path.resolve(optimist.argv.extensionDevelopmentPath)).path, protocol, host, slashes: true }); const testFilesUri = url.format({ pathname: URI.file(path.resolve(optimist.argv.extensionTestsPath)).path, protocol, host, slashes: true }); const payloadParam = `[["extensionDevelopmentPath","${testExtensionUri}"],["extensionTestsPath","${testFilesUri}"],["enableProposedApi",""],["webviewExternalEndpointCommit","d372f9187401bd145a0a6e15ba369e2d82d02005"],["skipWelcome","true"]]`; - if (path.extname(testWorkspaceUri) === '.code-workspace') { - await page.goto(`${endpoint.href}&workspace=${testWorkspaceUri}&payload=${payloadParam}`); + if (path.extname(testWorkspacePath) === '.code-workspace') { + await page.goto(`${endpoint.href}&workspace=${testWorkspacePath}&payload=${payloadParam}`); } else { - await page.goto(`${endpoint.href}&folder=${testWorkspaceUri}&payload=${payloadParam}`); + await page.goto(`${endpoint.href}&folder=${testWorkspacePath}&payload=${payloadParam}`); } await page.exposeFunction('codeAutomationLog', (type: string, args: any[]) => { @@ -108,7 +108,7 @@ function consoleLogFn(msg: playwright.ConsoleMessage) { return console.log; } -async function launchServer(browserType: BrowserType): Promise<{ endpoint: url.UrlWithStringQuery, server: cp.ChildProcess }> { +async function launchServer(browserType: BrowserType): Promise<{ endpoint: url.UrlWithStringQuery; server: cp.ChildProcess }> { // Ensure a tmp user-data-dir is used for the tests const tmpDir = tmp.dirSync({ prefix: 't' }); @@ -118,7 +118,6 @@ async function launchServer(browserType: BrowserType): Promise<{ endpoint: url.U const userDataDir = path.join(testDataPath, 'd'); const env = { - VSCODE_AGENT_FOLDER: userDataDir, VSCODE_BROWSER: browserType, ...process.env }; @@ -126,28 +125,28 @@ async function launchServer(browserType: BrowserType): Promise<{ endpoint: url.U const root = path.join(__dirname, '..', '..', '..', '..'); const logsPath = path.join(root, '.build', 'logs', 'integration-tests-browser'); - const serverArgs = ['--browser', 'none', '--driver', 'web', '--enable-proposed-api', '--disable-telemetry']; + const serverArgs = ['--driver', 'web', '--enable-proposed-api', '--disable-telemetry', '--server-data-dir', userDataDir]; let serverLocation: string; if (process.env.VSCODE_REMOTE_SERVER_PATH) { - serverLocation = path.join(process.env.VSCODE_REMOTE_SERVER_PATH, `server.${process.platform === 'win32' ? 'cmd' : 'sh'}`); - serverArgs.push(`--logsPath=${logsPath}`); + const { serverApplicationName } = require(path.join(process.env.VSCODE_REMOTE_SERVER_PATH, 'product.json')); + serverLocation = path.join(process.env.VSCODE_REMOTE_SERVER_PATH, 'bin', `${serverApplicationName}${process.platform === 'win32' ? '.cmd' : ''}`); if (optimist.argv.debug) { console.log(`Starting built server from '${serverLocation}'`); - console.log(`Storing log files into '${logsPath}'`); } } else { - serverLocation = path.join(root, `resources/server/web.${process.platform === 'win32' ? 'bat' : 'sh'}`); - serverArgs.push('--logsPath', logsPath); + serverLocation = path.join(root, `scripts/code-server.${process.platform === 'win32' ? 'bat' : 'sh'}`); process.env.VSCODE_DEV = '1'; if (optimist.argv.debug) { console.log(`Starting server out of sources from '${serverLocation}'`); - console.log(`Storing log files into '${logsPath}'`); } } + console.log(`Storing log files into '${logsPath}'`); + serverArgs.push('--logsPath', logsPath); + const stdio: cp.StdioOptions = optimist.argv.debug ? 'pipe' : ['ignore', 'pipe', 'ignore']; let serverProcess = cp.spawn( diff --git a/test/integration/browser/yarn.lock b/test/integration/browser/yarn.lock index a5682ee9a90..b3498682cd8 100644 --- a/test/integration/browser/yarn.lock +++ b/test/integration/browser/yarn.lock @@ -33,10 +33,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.0.tgz#b417deda18cf8400f278733499ad5547ed1abec4" integrity sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/optimist@0.0.29": version "0.0.29" diff --git a/test/monaco/.gitignore b/test/monaco/.gitignore index 938680a4275..1aaf5ab09e6 100644 --- a/test/monaco/.gitignore +++ b/test/monaco/.gitignore @@ -1,3 +1,4 @@ /dist/**/*.js /dist/**/*.ttf /out/ +/esm-check/out/ diff --git a/test/monaco/core.js b/test/monaco/core.js index bd1fe4ac4cc..37cc80c487e 100644 --- a/test/monaco/core.js +++ b/test/monaco/core.js @@ -9,7 +9,7 @@ self.MonacoEnvironment = { getWorkerUrl: function (moduleId, label) { return './editor.worker.bundle.js'; } -} +}; window.instance = monaco.editor.create(document.getElementById('container'), { value: [ diff --git a/test/monaco/esm-check/esm-check.js b/test/monaco/esm-check/esm-check.js new file mode 100644 index 00000000000..3575e3d76ee --- /dev/null +++ b/test/monaco/esm-check/esm-check.js @@ -0,0 +1,96 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +const fs = require('fs'); +const path = require('path'); +const util = require('../../../build/lib/util'); +const playwright = require('@playwright/test'); +const yaserver = require('yaserver'); +const http = require('http'); + +const DEBUG_TESTS = false; +const SRC_DIR = path.join(__dirname, '../../../out-monaco-editor-core/esm'); +const DST_DIR = path.join(__dirname, './out'); +const PORT = 8562; + +run(); + +async function run() { + await extractSourcesWithoutCSS(); + const server = await startServer(); + + const browser = await playwright['chromium'].launch({ + headless: !DEBUG_TESTS, + devtools: DEBUG_TESTS + // slowMo: DEBUG_TESTS ? 2000 : 0 + }); + + const page = await browser.newPage({ + viewport: { + width: 800, + height: 600 + } + }); + page.on('pageerror', (e) => { + console.error(`[esm-check] A page error occurred:`); + console.error(e); + process.exit(1); + }); + + const URL = `http://127.0.0.1:${PORT}/index.html`; + console.log(`[esm-check] Navigating to ${URL}`); + const response = await page.goto(URL); + if (!response) { + console.error(`[esm-check] Missing response.`); + process.exit(1); + } + if (response.status() !== 200) { + console.error(`[esm-check] Response status ${response.status()} is not 200 .`); + process.exit(1); + } + console.log(`[esm-check] All appears good.`); + + await page.close(); + await browser.close(); + + server.close(); +} + +/** + * @returns {Promise} + */ +async function startServer() { + const staticServer = await yaserver.createServer({ rootDir: __dirname }); + return new Promise((resolve, reject) => { + const server = http.createServer((request, response) => { + return staticServer.handle(request, response); + }); + server.listen(PORT, '127.0.0.1', () => { + resolve(server); + }); + }); +} + +async function extractSourcesWithoutCSS() { + await util.rimraf(DST_DIR); + + const files = util.rreddir(SRC_DIR); + for (const file of files) { + const srcFilename = path.join(SRC_DIR, file); + if (!/\.js$/.test(srcFilename)) { + continue; + } + + const dstFilename = path.join(DST_DIR, file); + + let contents = fs.readFileSync(srcFilename).toString(); + contents = contents.replace(/import '[^']+\.css';/g, ''); + + util.ensureDir(path.dirname(dstFilename)); + fs.writeFileSync(dstFilename, contents); + } +} diff --git a/test/monaco/esm-check/index.html b/test/monaco/esm-check/index.html new file mode 100644 index 00000000000..de61d28e7f1 --- /dev/null +++ b/test/monaco/esm-check/index.html @@ -0,0 +1,11 @@ + + + + + + +
+ + + + diff --git a/src/vs/server/remoteExtensionHostProcess.ts b/test/monaco/esm-check/index.js similarity index 64% rename from src/vs/server/remoteExtensionHostProcess.ts rename to test/monaco/esm-check/index.js index 4c890beb60d..3e585d5bd58 100644 --- a/src/vs/server/remoteExtensionHostProcess.ts +++ b/test/monaco/esm-check/index.js @@ -3,6 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { startExtensionHostProcess } from 'vs/workbench/services/extensions/node/extensionHostProcessSetup'; +// eslint-disable-next-line code-no-standalone-editor +import * as monaco from './out/vs/editor/editor.main.js'; -startExtensionHostProcess().catch((err) => console.log(err)); +monaco.editor.create(document.getElementById('container'), { + value: 'Hello world' +}); diff --git a/test/monaco/package.json b/test/monaco/package.json index 3eb25726411..2d48ca1a73f 100644 --- a/test/monaco/package.json +++ b/test/monaco/package.json @@ -6,7 +6,8 @@ "private": true, "scripts": { "compile": "node ../../node_modules/typescript/bin/tsc", - "bundle": "node ../../node_modules/webpack/bin/webpack --config ./webpack.config.js --bail", + "bundle-webpack": "node ../../node_modules/webpack/bin/webpack --config ./webpack.config.js --bail", + "esm-check": "node esm-check/esm-check.js", "test": "node runner.js" }, "devDependencies": { diff --git a/test/monaco/runner.js b/test/monaco/runner.js index 29aa7eb1294..6cec047d6b2 100644 --- a/test/monaco/runner.js +++ b/test/monaco/runner.js @@ -22,7 +22,7 @@ yaserver.createServer({ }, (err) => { console.error(err); process.exit(1); - }) + }); }); }); @@ -48,5 +48,5 @@ function runTest(browser) { reject(code); } }); - }) + }); } diff --git a/test/monaco/webpack.config.js b/test/monaco/webpack.config.js index ccea6c1c7c9..a759fa7f66d 100644 --- a/test/monaco/webpack.config.js +++ b/test/monaco/webpack.config.js @@ -9,8 +9,8 @@ const WarningsToErrorsPlugin = require('warnings-to-errors-webpack-plugin'); module.exports = { mode: 'production', entry: { - "core": './core.js', - "editor.worker": '../../out-monaco-editor-core/esm/vs/editor/editor.worker.js', + 'core': './core.js', + 'editor.worker': '../../out-monaco-editor-core/esm/vs/editor/editor.worker.js', }, output: { globalObject: 'self', diff --git a/test/smoke/README.md b/test/smoke/README.md index 9d95d597675..86777cab856 100644 --- a/test/smoke/README.md +++ b/test/smoke/README.md @@ -8,12 +8,6 @@ Make sure you are on **Node v12.x**. # Build extensions in the VS Code repo (if needed) yarn && yarn compile -# Install Dependencies and Compile -yarn --cwd test/smoke - -# Prepare OSS in repo* -node build/lib/preLaunch.js - # Dev (Electron) yarn smoketest diff --git a/test/smoke/package.json b/test/smoke/package.json index 9f5c7a6f953..e0e9c671d83 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -4,24 +4,24 @@ "license": "MIT", "main": "./src/main.js", "scripts": { - "compile": "yarn --cwd ../automation compile && tsc", + "compile": "yarn --cwd ../automation compile && node ../../node_modules/typescript/bin/tsc", "watch-automation": "yarn --cwd ../automation watch", - "watch-smoke": "tsc --watch --preserveWatchOutput", + "watch-smoke": "node ../../node_modules/typescript/bin/tsc --watch --preserveWatchOutput", "watch": "npm-run-all -lp watch-automation watch-smoke", "mocha": "node ../node_modules/mocha/bin/mocha" }, "dependencies": { - "@vscode/test-electron": "^2.1.0", + "@vscode/test-electron": "2.1.0-beta.0", "mkdirp": "^1.0.4", "ncp": "^2.0.0", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "rimraf": "3.0.2" }, "devDependencies": { "@types/mkdirp": "^1.0.1", "@types/mocha": "^8.2.0", "@types/ncp": "2.0.1", - "@types/node": "14.x", + "@types/node": "16.x", "@types/node-fetch": "^2.5.10", "@types/rimraf": "3.0.2", "npm-run-all": "^4.1.5", diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index fbde2686089..1d8e6984a98 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { join } from 'path'; import { Application, ActivityBarPosition, Logger } from '../../../../automation'; import { installAllHandlers } from '../../utils'; @@ -15,16 +14,17 @@ export function setup(logger: Logger) { it('turns off editor line numbers and verifies the live change', async function () { const app = this.app as Application; - await app.workbench.quickaccess.openFile(join(app.workspacePathOrFolder, 'app.js')); + + await app.workbench.settingsEditor.openUserSettingsFile(); await app.code.waitForElements('.line-numbers', false, elements => !!elements.length); await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); - await app.workbench.editors.selectTab('app.js'); await app.code.waitForElements('.line-numbers', false, result => !result || result.length === 0); }); it('changes "workbench.action.toggleSidebarPosition" command key binding and verifies it', async function () { const app = this.app as Application; + await app.workbench.activitybar.waitForActivityBar(ActivityBarPosition.LEFT); await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', 'View: Toggle Side Bar Position', 'ctrl+u', 'Control+U'); diff --git a/test/smoke/src/areas/terminal/terminal-splitCwd.test.ts b/test/smoke/src/areas/terminal/terminal-splitCwd.test.ts new file mode 100644 index 00000000000..dccaaa43abe --- /dev/null +++ b/test/smoke/src/areas/terminal/terminal-splitCwd.test.ts @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Application, Terminal } from '../../../../automation'; + +export function setup() { + describe('Terminal splitCwd', () => { + // Acquire automation API + let terminal: Terminal; + before(async function () { + const app = this.app as Application; + terminal = app.workbench.terminal; + await app.workbench.settingsEditor.addUserSetting('terminal.integrated.splitCwd', '"inherited"'); + await app.workbench.quickaccess.runCommand('workbench.action.closeAllEditors'); + }); + + it('should inherit cwd when split and update the tab description - alt click', async () => { + await terminal.createTerminal(); + const cwd = 'test'; + await terminal.runCommandInTerminal(`mkdir ${cwd}`); + await terminal.runCommandInTerminal(`cd ${cwd}`); + const page = await terminal.getPage(); + page.keyboard.down('Alt'); + await terminal.clickSingleTab(); + page.keyboard.up('Alt'); + await terminal.assertTerminalGroups([[{ description: cwd }, { description: cwd }]]); + }); + }); +} diff --git a/test/smoke/src/areas/terminal/terminal.test.ts b/test/smoke/src/areas/terminal/terminal.test.ts index 825f922baec..7821552bc12 100644 --- a/test/smoke/src/areas/terminal/terminal.test.ts +++ b/test/smoke/src/areas/terminal/terminal.test.ts @@ -10,6 +10,7 @@ import { setup as setupTerminalInputTests } from './terminal-input.test'; import { setup as setupTerminalPersistenceTests } from './terminal-persistence.test'; import { setup as setupTerminalProfileTests } from './terminal-profiles.test'; import { setup as setupTerminalTabsTests } from './terminal-tabs.test'; +import { setup as setupTerminalSplitCwdTests } from './terminal-splitCwd.test'; export function setup(logger: Logger) { describe('Terminal', function () { @@ -46,5 +47,8 @@ export function setup(logger: Logger) { setupTerminalPersistenceTests(); setupTerminalProfileTests(); setupTerminalTabsTests(); + if (!process.platform.startsWith('win')) { + setupTerminalSplitCwdTests(); + } }); } diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index 833ab128a83..2749bb696da 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -135,11 +135,10 @@ export function setup(ensureStableCode: () => string | undefined, logger: Logger // macOS: the first launch of stable Code will trigger // additional checks in the OS (notarization validation) - // so it can take a very long time. as such we increase - // the timeout and install a retry handler to make sure - // we do not fail as a consequence. + // so it can take a very long time. as such we install + // a retry handler to make sure we do not fail as a + // consequence. if (process.platform === 'darwin') { - this.timeout(2 * 60 * 1000); this.retries(2); } @@ -178,7 +177,7 @@ export function setup(ensureStableCode: () => string | undefined, logger: Logger insidersApp = undefined; }); - it.skip('verifies that "hot exit" works for dirty files (without delay)', async function () { // TODO@bpasero enable test once 1.64 shipped + it('verifies that "hot exit" works for dirty files (without delay)', async function () { return testHotExit.call(this, undefined); }); diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index b81dec7a1f0..0b9336e8d98 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -14,7 +14,7 @@ import * as mkdirp from 'mkdirp'; import * as vscodetest from '@vscode/test-electron'; import fetch from 'node-fetch'; import { Quality, MultiLogger, Logger, ConsoleLogger, FileLogger, measureAndLog } from '../../automation'; -import { timeout } from './utils'; +import { retry, timeout } from './utils'; import { setup as setupDataLossTests } from './areas/workbench/data-loss.test'; import { setup as setupPreferencesTests } from './areas/preferences/preferences.test'; @@ -50,14 +50,14 @@ const opts = minimist(args, { verbose: false } }) as { - verbose?: boolean, - remote?: boolean, - headless?: boolean, - web?: boolean, - build?: string, - 'stable-build'?: string, - browser?: string, - electronArgs?: string + verbose?: boolean; + remote?: boolean; + headless?: boolean; + web?: boolean; + build?: string; + 'stable-build'?: string; + browser?: string; + electronArgs?: string; }; const logger = createLogger(); @@ -104,13 +104,16 @@ mkdirp.sync(extensionsPath); function fail(errorMessage): void { logger.log(errorMessage); + if (!opts.verbose) { + console.error(errorMessage); + } process.exit(1); } let quality: Quality; let version: string | undefined; -function parseVersion(version: string): { major: number, minor: number, patch: number } { +function parseVersion(version: string): { major: number; minor: number; patch: number } { const [, major, minor, patch] = /^(\d+)\.(\d+)\.(\d+)/.exec(version)!; return { major: parseInt(major), minor: parseInt(minor), patch: parseInt(patch) }; } @@ -177,7 +180,7 @@ if (!opts.web) { } if (!fs.existsSync(electronPath || '')) { - fail(`Can't find VSCode at ${electronPath}.`); + fail(`Can't find VSCode at ${electronPath}. Please run VSCode once first (scripts/code.sh, scripts\\code.bat) and try again.`); } if (process.env.VSCODE_DEV === '1') { @@ -259,7 +262,7 @@ async function ensureStableCode(): Promise { if (!stableCodePath) { const { major, minor } = parseVersion(version!); const majorMinorVersion = `${major}.${minor - 1}`; - const versionsReq = await measureAndLog(fetch('https://update.code.visualstudio.com/api/releases/stable', { headers: { 'x-api-version': '2' } }), 'versionReq', logger); + const versionsReq = await retry(() => measureAndLog(fetch('https://update.code.visualstudio.com/api/releases/stable', { headers: { 'x-api-version': '2' } }), 'versionReq', logger), 1000, 20); if (!versionsReq.ok) { throw new Error('Could not fetch releases from update server'); @@ -276,14 +279,23 @@ async function ensureStableCode(): Promise { logger.log(`Found VS Code v${version}, downloading previous VS Code version ${previousVersion.version}...`); let lastProgressMessage: string | undefined = undefined; + let lastProgressReportedAt = 0; const stableCodeExecutable = await measureAndLog(vscodetest.download({ cachePath: path.join(os.tmpdir(), 'vscode-test'), version: previousVersion.version, + extractSync: true, reporter: { report: report => { - const progressMessage = `download stable code progress: ${report.stage}`; - if (progressMessage !== lastProgressMessage) { + let progressMessage = `download stable code progress: ${report.stage}`; + const now = Date.now(); + if (progressMessage !== lastProgressMessage || now - lastProgressReportedAt > 10000) { lastProgressMessage = progressMessage; + lastProgressReportedAt = now; + + if (report.stage === 'downloading') { + progressMessage += ` (${report.bytesSoFar}/${report.totalBytes})`; + } + logger.log(progressMessage); } }, @@ -324,7 +336,7 @@ async function setup(): Promise { // Before main suite (before all tests) before(async function () { - this.timeout(2 * 60 * 1000); // allow two minutes for setup + this.timeout(5 * 60 * 1000); // increase since we download VSCode this.defaultOptions = { quality, diff --git a/test/smoke/test/index.js b/test/smoke/test/index.js index 913db7f8930..276bcfe37b6 100644 --- a/test/smoke/test/index.js +++ b/test/smoke/test/index.js @@ -17,8 +17,8 @@ const suite = opts['web'] ? 'Browser Smoke Tests' : 'Desktop Smoke Tests'; const options = { color: true, - timeout: 60000, - slow: 30000, + timeout: 2 * 60 * 1000, + slow: 30 * 1000, grep: opts['f'] || opts['g'] }; diff --git a/test/smoke/yarn.lock b/test/smoke/yarn.lock index bd0456f70de..7eda3e418f9 100644 --- a/test/smoke/yarn.lock +++ b/test/smoke/yarn.lock @@ -58,10 +58,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/rimraf@3.0.2": version "3.0.2" @@ -71,10 +71,10 @@ "@types/glob" "*" "@types/node" "*" -"@vscode/test-electron@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.1.0.tgz#3e787e3ffb354051294529f451e6f0f6529ff8eb" - integrity sha512-nE5ha/V+l4WnS0QS5wJhb2S75Ceamif30UOcURHYw+8FoJJHg2g1xM8/dSpvX2Xk4+04Rbl76/ui/tgI5qia+Q== +"@vscode/test-electron@2.1.0-beta.0": + version "2.1.0-beta.0" + resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.1.0-beta.0.tgz#27749883228f5a3df899b1555917a9a5e22b7cb7" + integrity sha512-6d+dkCDaL1EJJgrrYNxW5pMzfqM5sUIBgdfM9TekI/HoXOA9jgxFrkf0/EUKZUNjYC59Ntn1Y9ffl9k8xOLRFQ== dependencies: http-proxy-agent "^4.0.1" https-proxy-agent "^5.0.0" @@ -526,10 +526,12 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" normalize-package-data@^2.3.2: version "2.5.0" @@ -774,6 +776,11 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" @@ -816,6 +823,19 @@ watch@^1.0.2: exec-sh "^0.2.0" minimist "^1.2.0" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" diff --git a/test/unit/browser/index.js b/test/unit/browser/index.js index d9dc23611fa..6e8a61872a6 100644 --- a/test/unit/browser/index.js +++ b/test/unit/browser/index.js @@ -50,12 +50,12 @@ const withReporter = (function () { mochaFile: process.env.BUILD_ARTIFACTSTAGINGDIRECTORY ? path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY, `test-results/${process.platform}-${process.arch}-${browserType}-${argv.tfs.toLowerCase().replace(/[^\w]/g, '-')}-results.xml`) : undefined } }); - } + }; } } else { return (_, runner) => applyReporter(runner, argv); } -})() +})(); const outdir = argv.build ? 'out-build' : 'out'; const out = path.join(__dirname, `../../../${outdir}`); @@ -82,7 +82,7 @@ const testModules = (async function () { } else { // glob patterns (--glob) const defaultGlob = '**/*.test.js'; - const pattern = argv.run || defaultGlob + const pattern = argv.run || defaultGlob; isDefaultModules = pattern === defaultGlob; promise = new Promise((resolve, reject) => { @@ -90,7 +90,7 @@ const testModules = (async function () { if (err) { reject(err); } else { - resolve(files) + resolve(files); } }); }); @@ -107,7 +107,7 @@ const testModules = (async function () { } } return modules; - }) + }); })(); function consoleLogFn(msg) { @@ -136,7 +136,7 @@ async function runTestsInBrowser(testModules, browserType) { const emitter = new events.EventEmitter(); await page.exposeFunction('mocha_report', (type, data1, data2) => { - emitter.emit(type, data1, data2) + emitter.emit(type, data1, data2); }); page.on('console', async msg => { diff --git a/test/unit/electron/index.js b/test/unit/electron/index.js index f5dc37d1093..2c3ad1ab9fc 100644 --- a/test/unit/electron/index.js +++ b/test/unit/electron/index.js @@ -20,10 +20,6 @@ const net = require('net'); const createStatsCollector = require('mocha/lib/stats-collector'); const { applyReporter, importMochaReporter } = require('../reporter'); -// Disable render process reuse, we still have -// non-context aware native modules in the renderer. -app.allowRendererProcessReuse = false; - const optimist = require('optimist') .describe('grep', 'only run tests matching ').alias('grep', 'g').alias('grep', 'f').string('grep') .describe('run', 'only run tests from ').string('run') diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index b4ee49cea14..e30df42b957 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -56,7 +56,7 @@ ['rmdir', 1], ].forEach((element) => { intercept(element[0], element[1]); - }) + }); })(); const { ipcRenderer } = require('electron'); @@ -109,10 +109,10 @@ function createCoverageReport(opts) { return Promise.resolve(undefined); } -function loadWorkbenchTestingModule() { +function loadWorkbenchTestingUtilsModule() { return new Promise((resolve, reject) => { - loader.require(['vs/workbench/test/electron-browser/testing'], resolve, reject); - }) + loader.require(['vs/workbench/test/common/utils'], resolve, reject); + }); } function loadTestModules(opts) { @@ -172,7 +172,7 @@ function loadTests(opts) { }); }); - return loadWorkbenchTestingModule().then((workbenchTestingModule) => { + return loadWorkbenchTestingUtilsModule().then((workbenchTestingModule) => { const assertCleanState = workbenchTestingModule.assertCleanState; suite('Tests are using suiteSetup and setup correctly', () => { @@ -199,7 +199,7 @@ function loadTests(opts) { }); }); }); - }) + }); } function serializeSuite(suite) { diff --git a/test/unit/fullJsonStreamReporter.js b/test/unit/fullJsonStreamReporter.js index 672c1ac974c..0f3ff897c8e 100644 --- a/test/unit/fullJsonStreamReporter.js +++ b/test/unit/fullJsonStreamReporter.js @@ -42,7 +42,7 @@ module.exports = class FullJsonStreamReporter extends BaseRunner { writeEvent(['fail', test]); }); } -} +}; function writeEvent(event) { process.stdout.write(JSON.stringify(event) + '\n'); diff --git a/test/unit/node/index.js b/test/unit/node/index.js index 75bc47c1d5f..d59ff18c3f5 100644 --- a/test/unit/node/index.js +++ b/test/unit/node/index.js @@ -24,12 +24,13 @@ const optimist = require('optimist') const TEST_GLOB = '**/test/**/*.test.js'; -const excludeGlob = '**/{browser,electron-sandbox,electron-browser,electron-main,editor/contrib}/**/*.test.js'; +const excludeGlob = '**/{browser,electron-sandbox,electron-browser,electron-main}/**/*.test.js'; const excludeModules = [ 'vs/platform/environment/test/node/nativeModules.test.js', // native modules are compiled against Electron and this test would fail with node.js 'vs/base/parts/storage/test/node/storage.test.js', // same as above, due to direct dependency to sqlite native module - 'vs/platform/files/test/common/files.test.js' // TODO@bpasero enable once we ship Electron 16 -] + 'vs/workbench/contrib/testing/test/common/testResultStorage.test.js', // TODO@connor4312 https://github.com/microsoft/vscode/issues/137853 + 'vs/workbench/contrib/testing/test/common/testResultService.test.js', // TODO@connor4312 https://github.com/microsoft/vscode/issues/137853 +]; /** * @type {{ build: boolean; run: string; runGlob: string; coverage: boolean; help: boolean; }} diff --git a/test/unit/reporter.js b/test/unit/reporter.js index d1630759b5d..c2ae6d7954b 100644 --- a/test/unit/reporter.js +++ b/test/unit/reporter.js @@ -19,7 +19,7 @@ exports.importMochaReporter = name => { const reporterPath = path.join(path.dirname(require.resolve('mocha')), 'lib', 'reporters', name); return require(reporterPath); -} +}; exports.applyReporter = (runner, argv) => { let Reporter; @@ -39,4 +39,4 @@ exports.applyReporter = (runner, argv) => { reporterOptions = reporterOptions.reduce((r, o) => Object.assign(r, parseReporterOption(o)), {}); return new Reporter(runner, { reporterOptions }); -} +}; diff --git a/yarn.lock b/yarn.lock index f948545fadd..a82a27cc64a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -683,23 +683,6 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== -"@electron/get@^1.0.1": - version "1.12.3" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.3.tgz#fa2723385c4b565a34c4c82f46087aa2a5fbf6d0" - integrity sha512-NFwSnVZQK7dhOYF1NQCt+HGqgL1aNdj0LUSx75uCqnZJqyiWCVdAMFV4b4/kC8HjUJAnsvdSEmjEt4G2qNQ9+Q== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - filenamify "^4.1.0" - fs-extra "^8.1.0" - got "^9.6.0" - progress "^2.0.3" - semver "^6.2.0" - sumchecker "^3.0.1" - optionalDependencies: - global-agent "^2.0.2" - global-tunnel-ng "^2.7.1" - "@electron/get@^1.12.4": version "1.13.0" resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.0.tgz#95c6bcaff4f9a505ea46792424f451efea89228c" @@ -716,6 +699,37 @@ global-agent "^2.0.2" global-tunnel-ng "^2.7.1" +"@electron/get@^1.13.0": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.1.tgz#42a0aa62fd1189638bd966e23effaebb16108368" + integrity sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + global-tunnel-ng "^2.7.1" + +"@eslint/eslintrc@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318" + integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.2.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@gulp-sourcemaps/identity-map@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz#a6e8b1abec8f790ec6be2b8c500e6e68037c0019" @@ -735,6 +749,20 @@ normalize-path "^2.0.1" through2 "^2.0.3" +"@humanwhocodes/config-array@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.2.tgz#68be55c737023009dfc5fe245d51181bb6476914" + integrity sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@istanbuljs/schema@^0.1.2": version "0.1.2" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" @@ -751,6 +779,17 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@koa/router@^10.1.1": + version "10.1.1" + resolved "https://registry.yarnpkg.com/@koa/router/-/router-10.1.1.tgz#8e5a85c9b243e0bc776802c0de564561e57a5f78" + integrity sha512-ORNjq5z4EmQPriKbR0ER3k4Gh7YGNhWDL7JBW+8wXDrHLbWYKYSJaOJ9aN06npF5tbTxe2JBOsurpJDAvjiXKw== + dependencies: + debug "^4.1.1" + http-errors "^1.7.3" + koa-compose "^4.1.0" + methods "^1.1.2" + path-to-regexp "^6.1.0" + "@microsoft/applicationinsights-analytics-js@2.6.4": version "2.6.4" resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-analytics-js/-/applicationinsights-analytics-js-2.6.4.tgz#22ad17276ed922f2f0e66b7efe304f31c50ede64" @@ -974,10 +1013,10 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" -"@playwright/test@1.18.0-rc1": - version "1.18.0-rc1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.18.0-rc1.tgz#1c4f414c22063f1355dba7be9b6460b749ef6478" - integrity sha512-D6savDw2zknI9DTCRRFfL4mswDXxYt2w1PbcqmQnwS72is054nb5SR5Sxl43eot1pOfx6u+SH7mHU8ptUzNR+Q== +"@playwright/test@1.18.0": + version "1.18.0" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.18.0.tgz#e6ac7b588d927fdd028d72f0db1030dd777a79a7" + integrity sha512-ceu4DqerPlyRsdNfke4IUyWH1WccRuBokngFdPAzc5CRzlGmSTT59NBkJyn8Fg/F01CziaMFgNRrHQIMSd4g5A== dependencies: "@babel/code-frame" "^7.14.5" "@babel/core" "^7.14.8" @@ -1011,7 +1050,7 @@ open "^8.3.0" pirates "^4.0.1" pixelmatch "^5.2.1" - playwright-core "=1.18.0-rc1" + playwright-core "=1.18.0" pngjs "^5.0.0" rimraf "^3.0.2" source-map-support "^0.4.18" @@ -1063,6 +1102,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -1134,11 +1178,6 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/eslint@*": version "7.2.13" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.13.tgz#e0ca7219ba5ded402062ad6f926d491ebb29dd53" @@ -1225,16 +1264,16 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== -"@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== - "@types/json-schema@^7.0.6": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== +"@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + "@types/keytar@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@types/keytar/-/keytar-4.4.0.tgz#ca24e6ee6d0df10c003aafe26e93113b8faf0d8e" @@ -1268,10 +1307,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-4.2.22.tgz#cf488a0f6b4a9c245d09927f4f757ca278b9c8ce" integrity sha512-LXRap3bb4AjtLZ5NOFc4ssVZrQPTgdPcNm++0SEJuJZaOA+xHkojJNYqy33A5q/94BmG5tA6yaMeD4VdCv5aSA== -"@types/node@14.x": - version "14.14.43" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" - integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== +"@types/node@16.x": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== "@types/node@^10.11.7": version "10.12.21" @@ -1375,10 +1414,10 @@ "@types/webpack-sources" "*" source-map "^0.6.0" -"@types/wicg-file-system-access@^2020.9.2": - version "2020.9.2" - resolved "https://registry.yarnpkg.com/@types/wicg-file-system-access/-/wicg-file-system-access-2020.9.2.tgz#6433e5a1d7cfdc58558e15f69276e4f0034088c6" - integrity sha512-8ni2EyWi01DBuVqekudo2I+RTfq4Jq93iHmlzq0+eKPkG1uebQA9OUxIDRzOevvw9wF922XYRo4bqP0a6DBF5g== +"@types/wicg-file-system-access@^2020.9.5": + version "2020.9.5" + resolved "https://registry.yarnpkg.com/@types/wicg-file-system-access/-/wicg-file-system-access-2020.9.5.tgz#4a0c8f3d1ed101525f329e86c978f7735404474f" + integrity sha512-UYK244awtmcUYQfs7FR8710MJcefL2WvkyHMjA8yJzxd1mo0Gfn88sRZ1Bls7hiUhA2w7ne1gpJ9T5g3G0wOyA== "@types/windows-foreground-love@^0.3.0": version "0.3.0" @@ -1426,72 +1465,85 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.2.0.tgz#7fb997f391af32ae6ca1dbe56bcefe4dd30bda14" - integrity sha512-t9RTk/GyYilIXt6BmZurhBzuMT9kLKw3fQoJtK9ayv0tXTlznXEAnx07sCLXdkN3/tZDep1s1CEV95CWuARYWA== +"@typescript-eslint/eslint-plugin@^5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz#e90afea96dff8620892ad216b0e4ccdf8ee32d3a" + integrity sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ== dependencies: - "@typescript-eslint/experimental-utils" "3.2.0" + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/type-utils" "5.10.0" + "@typescript-eslint/utils" "5.10.0" + debug "^4.3.2" functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.2.0.tgz#4dab8fc9f44f059ec073470a81bb4d7d7d51e6c5" - integrity sha512-UbJBsk+xO9dIFKtj16+m42EvUvsjZbbgQ2O5xSTSfVT1Z3yGkL90DVu0Hd3029FZ5/uBgl+F3Vo8FAcEcqc6aQ== +"@typescript-eslint/parser@^5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.0.tgz#8f59e036f5f1cffc178cacbd5ccdd02aeb96c91c" + integrity sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw== dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "3.2.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/typescript-estree" "5.10.0" + debug "^4.3.2" -"@typescript-eslint/experimental-utils@3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.3.0.tgz#d72a946e056a83d4edf97f3411cceb639b0b8c87" - integrity sha512-d4pGIAbu/tYsrPrdHCQ5xfadJGvlkUxbeBB56nO/VGmEDi/sKmfa5fGty5t5veL1OyJBrUmSiRn1R1qfVDydrg== +"@typescript-eslint/scope-manager@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz#bb5d872e8b9e36203908595507fbc4d3105329cb" + integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg== dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "3.3.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" -"@typescript-eslint/parser@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.3.0.tgz#fcae40012ded822aa8b2739a1a03a4e3c5bbb7bb" - integrity sha512-a7S0Sqn/+RpOOWTcaLw6RD4obsharzxmgMfdK24l364VxuBODXjuJM7ImCkSXEN7oz52aiZbXSbc76+2EsE91w== +"@typescript-eslint/type-utils@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz#8524b9479c19c478347a7df216827e749e4a51e5" + integrity sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.3.0" - "@typescript-eslint/typescript-estree" "3.3.0" - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/utils" "5.10.0" + debug "^4.3.2" + tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.2.0.tgz#c735f1ca6b4d3cd671f30de8c9bde30843e7ead8" - integrity sha512-uh+Y2QO7dxNrdLw7mVnjUqkwO/InxEqwN0wF+Za6eo3coxls9aH9kQ/5rSvW2GcNanebRTmsT5w1/92lAOb1bA== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" +"@typescript-eslint/types@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.0.tgz#beb3cb345076f5b088afe996d57bcd1dfddaa75c" + integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ== -"@typescript-eslint/typescript-estree@3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.3.0.tgz#841ffed25c29b0049ebffb4c2071268a34558a2a" - integrity sha512-3SqxylENltEvJsjjMSDCUx/edZNSC7wAqifUU1Ywp//0OWEZwMZJfecJud9XxJ/40rAKEbJMKBOQzeOjrLJFzQ== +"@typescript-eslint/typescript-estree@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz#4be24a3dea0f930bb1397c46187d0efdd955a224" + integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA== dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.0.tgz#c3d152a85da77c400e37281355561c72fb1b5a65" + integrity sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/typescript-estree" "5.10.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz#770215497ad67cd15a572b52089991d5dfe06281" + integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ== + dependencies: + "@typescript-eslint/types" "5.10.0" + eslint-visitor-keys "^3.0.0" "@ungap/promise-all-settled@1.1.2": version "1.1.2" @@ -1516,18 +1568,45 @@ https-proxy-agent "^4.0.0" proxy-from-env "^1.1.0" -"@vscode/sqlite3@4.0.12": - version "4.0.12" - resolved "https://registry.yarnpkg.com/@vscode/sqlite3/-/sqlite3-4.0.12.tgz#50b36c788b5d130c02612b27eaf6905dc2156a43" - integrity sha512-45Nbq4vgUhcejdDkX/G9K5BMMgRkBqtHtbChbvXHesMfk88USt4i94i9EM0DfHO7ijl3oIwGqzIob6lgeYi41w== +"@vscode/sqlite3@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@vscode/sqlite3/-/sqlite3-5.0.7.tgz#358df36bb0e9e735c54785e3e4b9b2dce1d32895" + integrity sha512-NlsOf+Hir2r4zopI1qMvzWXPwPJuFscirkmFTniTAT24Yz2FWcyZxzK7UT8iSNiTqOCPz48yF55ZVHaz7tTuVQ== dependencies: - nan "2.14.2" + node-addon-api "^4.2.0" "@vscode/sudo-prompt@9.3.1": version "9.3.1" resolved "https://registry.yarnpkg.com/@vscode/sudo-prompt/-/sudo-prompt-9.3.1.tgz#c562334bc6647733649fd42afc96c0eea8de3b65" integrity sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA== +"@vscode/telemetry-extractor@^1.9.5": + version "1.9.5" + resolved "https://registry.yarnpkg.com/@vscode/telemetry-extractor/-/telemetry-extractor-1.9.5.tgz#8c77165a0b2dcc5caafa7b94d93cf6581e740838" + integrity sha512-1A8eBeJu2tzPBuTqrBeUD9hwsmeCZQSpQURomTXz0LiKwED5GUS/UpRh9WNaDO4A4yix9RC0/wwJok5k8NqvCg== + dependencies: + command-line-args "^5.2.0" + ts-morph "^12.2.0" + vscode-ripgrep "^1.12.1" + +"@vscode/test-web@^0.0.22": + version "0.0.22" + resolved "https://registry.yarnpkg.com/@vscode/test-web/-/test-web-0.0.22.tgz#8767c80e7b16e73e78cf30da93d4dff5d4db148a" + integrity sha512-sm4WYidw26eFb1AReC8w5y4aOMdBb5ma5x3ukRJcun9iUB1ajz2nM18rxiYAVimUzrIMQHr9WqC8HYBYP8aNKQ== + dependencies: + "@koa/router" "^10.1.1" + decompress "^4.2.1" + decompress-targz "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + koa "^2.13.4" + koa-morgan "^1.0.1" + koa-mount "^4.0.0" + koa-static "^5.0.0" + minimist "^1.2.5" + playwright "^1.18.1" + vscode-uri "^3.0.3" + "@vscode/vscode-languagedetection@1.0.21": version "1.0.21" resolved "https://registry.yarnpkg.com/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz#89b48f293f6aa3341bb888c1118d16ff13b032d3" @@ -1836,26 +1915,39 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -acorn-jsx@^5.0.0, acorn-jsx@^5.2.0: +accepts@^1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-jsx@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn@^6.0.7, acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^8.4.1: version "8.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== +acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + agent-base@4: version "4.2.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" @@ -1907,7 +1999,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1956,13 +2048,6 @@ ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - ansi-gray@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" @@ -2405,6 +2490,13 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -2449,6 +2541,14 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bl@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" + integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + bl@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" @@ -2623,6 +2723,19 @@ browserslist@^4.17.5: node-releases "^2.0.1" picocolors "^1.0.0" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -2633,6 +2746,11 @@ buffer-equal@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -2652,7 +2770,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.5.0: +buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2729,6 +2847,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -2974,23 +3100,11 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - cli-width@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -3086,6 +3200,11 @@ cls-hooked@^4.2.2: emitter-listener "^1.0.1" semver "^5.4.1" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -3214,7 +3333,7 @@ commander@^2.19.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -commander@^2.20.0: +commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3299,6 +3418,18 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +content-disposition@~0.5.2: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + continuation-local-storage@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#11f613f74e914fe9b34c92ad2d28fe6ae1db7ffb" @@ -3314,6 +3445,19 @@ convert-source-map@^1.0.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +cookie@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +cookies@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" + integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -3418,7 +3562,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.3: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3656,11 +3800,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-uri-to-buffer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== - debounce@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.1.0.tgz#6a1a4ee2a9dc4b7c24bb012558dbcdb05b37f408" @@ -3675,6 +3814,13 @@ debug-fabulous@^1.0.0: memoizee "0.4.X" object-assign "4.X" +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -3710,13 +3856,6 @@ debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" -debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -3724,6 +3863,13 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3753,6 +3899,59 @@ decompress-response@^4.2.0: dependencies: mimic-response "^2.0.0" +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" + integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== + dependencies: + file-type "^5.2.0" + is-stream "^1.1.0" + tar-stream "^1.5.2" + +decompress-tarbz2@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" + integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== + dependencies: + decompress-tar "^4.1.0" + file-type "^6.1.0" + is-stream "^1.1.0" + seek-bzip "^1.0.5" + unbzip2-stream "^1.0.9" + +decompress-targz@^4.0.0, decompress-targz@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" + integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== + dependencies: + decompress-tar "^4.1.1" + file-type "^5.2.0" + is-stream "^1.1.0" + +decompress-unzip@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" + integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= + dependencies: + file-type "^3.8.0" + get-stream "^2.2.0" + pify "^2.3.0" + yauzl "^2.4.2" + +decompress@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== + dependencies: + decompress-tar "^4.0.0" + decompress-tarbz2 "^4.0.0" + decompress-targz "^4.0.0" + decompress-unzip "^4.0.1" + graceful-fs "^4.1.10" + make-dir "^1.0.0" + pify "^2.3.0" + strip-dirs "^2.0.0" + deemon@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/deemon/-/deemon-1.4.0.tgz#01c09cc23eec41e5d7ddac082eb52c3611d38dff" @@ -3761,11 +3960,21 @@ deemon@^1.4.0: bl "^4.0.2" tree-kill "^1.2.2" +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -3842,6 +4051,16 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -3855,6 +4074,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" @@ -4058,6 +4282,11 @@ editorconfig@^0.15.2: semver "^5.6.0" sigmund "^1.0.1" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + electron-to-chromium@^1.3.723: version "1.3.737" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.737.tgz#196f2e9656f4f3c31930750e1899c091b72d36b5" @@ -4068,12 +4297,12 @@ electron-to-chromium@^1.4.17: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.45.tgz#cf1144091d6683cbd45a231954a745f02fb24598" integrity sha512-czF9eYVuOmlY/vxyMQz2rGlNSjZpxNQYBe1gmQv7al171qOIhgyO9k7D5AKlgeTCSPKk+LHhj5ZyIdmEub9oNg== -electron@13.5.1: - version "13.5.1" - resolved "https://registry.yarnpkg.com/electron/-/electron-13.5.1.tgz#76c02c39be228532f886a170b472cbd3d93f0d0f" - integrity sha512-ZyxhIhmdaeE3xiIGObf0zqEyCyuIDqZQBv9NKX8w5FNzGm87j4qR0H1+GQg6vz+cA1Nnv1x175Zvimzc0/UwEQ== +electron@16.0.8: + version "16.0.8" + resolved "https://registry.yarnpkg.com/electron/-/electron-16.0.8.tgz#7ebd3e23c4883c239f53d8b7af1100f455ac8a02" + integrity sha512-znTVkl8LaGcPNdfc6SRr+6LYg2GtSCKXln/nW/PC+urBfAFnOYIuDock8QyGVFfzr5PuAa+g8YQQAboHV77D7g== dependencies: - "@electron/get" "^1.0.1" + "@electron/get" "^1.13.0" "@types/node" "^14.6.2" extract-zip "^1.0.3" @@ -4299,6 +4528,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -4333,7 +4567,7 @@ eslint-plugin-jsdoc@^19.1.0: semver "^6.3.0" spdx-expression-parse "^3.0.0" -eslint-scope@5.1.1, eslint-scope@^5.0.0: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -4349,65 +4583,81 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.1, eslint-utils@^1.4.3: +eslint-scope@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" + integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^1.3.1: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" - integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: - eslint-visitor-keys "^1.1.0" + eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1" + integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ== + +eslint@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.7.0.tgz#22e036842ee5b7cf87b03fe237731675b4d3633c" + integrity sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w== dependencies: - "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^1.0.5" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.2.0" + espree "^9.3.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" + levn "^0.4.1" + lodash.merge "^4.6.2" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -4462,14 +4712,14 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== +espree@^9.2.0, espree@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8" + integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ== dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.1.0" esprima@^4.0.0: version "4.0.1" @@ -4483,6 +4733,13 @@ esquery@^1.0.1: dependencies: estraverse "^5.1.0" +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -4720,7 +4977,7 @@ fancy-log@^1.3.2, fancy-log@^1.3.3: parse-node-version "^1.0.0" time-stamp "^1.0.0" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -4748,6 +5005,17 @@ fast-glob@^3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -4758,7 +5026,7 @@ fast-levenshtein@^1.0.0: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz#e6a754cc8f15e58987aa9cbd27af66fd6f4e5af9" integrity sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk= -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -4806,13 +5074,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -4820,6 +5081,13 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-loader@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e" @@ -4828,30 +5096,26 @@ file-loader@^4.2.0: loader-utils "^1.2.3" schema-utils "^2.0.0" +file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= + +file-type@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" + integrity sha1-LdvqfHP/42No365J3DOMBYwritY= + +file-type@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" + integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -file-uri-to-path@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" - integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= - -filenamify@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.2.0.tgz#c99716d676869585b3b5d328b3f06590d032e89f" - integrity sha512-pkgE+4p7N1n7QieOopmn3TqJaefjdWXwEkj2XLZJLKfOgcQKkn11ahvGNgTD8mLggexLiDFQxeTs14xVU22XPA== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.1" - trim-repeated "^1.0.0" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -4983,6 +5247,14 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -4993,6 +5265,11 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== + flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -5057,6 +5334,11 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fresh@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -5142,14 +5424,6 @@ fstream@^1.0.12: mkdirp ">=0.5 0" rimraf "2" -ftp@^0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -5212,6 +5486,14 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -5231,18 +5513,6 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-uri@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" - integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== - dependencies: - "@tootallnate/once" "1" - data-uri-to-buffer "3" - debug "4" - file-uri-to-path "2" - fs-extra "^8.1.0" - ftp "^0.3.10" - get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -5268,13 +5538,20 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0: +glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob-stream@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" @@ -5357,6 +5634,18 @@ global-agent@^2.0.2: semver "^7.3.2" serialize-error "^7.0.1" +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -5392,12 +5681,12 @@ globals@^11.1.0, globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" globalthis@^1.0.1: version "1.0.1" @@ -5418,6 +5707,18 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + glogg@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" @@ -5452,6 +5753,11 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.1.10: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + graceful-fs@^4.1.2, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -5903,11 +6209,40 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== +http-assert@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" + integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== + dependencies: + deep-equal "~1.0.1" + http-errors "~1.8.0" + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-proxy-agent@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" @@ -5925,6 +6260,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -6017,6 +6361,11 @@ ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -6032,7 +6381,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -6083,7 +6432,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6127,25 +6476,6 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - interpret@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -6396,6 +6726,18 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-natural-number@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" + integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= + is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -6763,6 +7105,13 @@ js-yaml@^3.13.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -6873,6 +7222,13 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" + keytar@7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.6.0.tgz#498e796443cb543d31722099443f29d7b5c44100" @@ -6917,6 +7273,80 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + +koa-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" + integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== + dependencies: + co "^4.6.0" + koa-compose "^4.1.0" + +koa-morgan@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/koa-morgan/-/koa-morgan-1.0.1.tgz#08052e0ce0d839d3c43178b90a5bb3424bef1f99" + integrity sha1-CAUuDODYOdPEMXi5CluzQkvvH5k= + dependencies: + morgan "^1.6.1" + +koa-mount@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-4.0.0.tgz#e0265e58198e1a14ef889514c607254ff386329c" + integrity sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ== + dependencies: + debug "^4.0.1" + koa-compose "^4.1.0" + +koa-send@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79" + integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ== + dependencies: + debug "^4.1.1" + http-errors "^1.7.3" + resolve-path "^1.4.0" + +koa-static@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" + integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== + dependencies: + debug "^3.1.0" + koa-send "^5.0.0" + +koa@^2.13.4: + version "2.13.4" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e" + integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.8.0" + debug "^4.3.2" + delegates "^1.0.0" + depd "^2.0.0" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^2.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + last-run@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" @@ -6966,6 +7396,14 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + liftoff@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" @@ -7081,6 +7519,11 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.some@^4.2.2: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" @@ -7106,7 +7549,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7165,6 +7608,13 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -7268,6 +7718,11 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + mem@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" @@ -7324,11 +7779,16 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +methods@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -7382,6 +7842,11 @@ mime-db@1.48.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.28" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" @@ -7389,6 +7854,13 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.45.0" +mime-types@^2.1.18, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + mime-types@^2.1.27: version "2.1.31" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" @@ -7611,6 +8083,17 @@ mocha@^8.3.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" +morgan@^1.6.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -7658,12 +8141,7 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@2.14.2, nan@^2.12.1, nan@^2.13.2: +nan@^2.12.1, nan@^2.13.2: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== @@ -7725,6 +8203,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -7773,18 +8256,18 @@ node-addon-api@^3.2.1: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-fetch@^2.6.0: - version "2.6.6" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" - integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== +node-addon-api@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" + integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== + +node-fetch@^2.6.0, node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.2.tgz#986996818b73785e47b1965cc34eb093a1d464d0" - integrity sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA== - node-gyp-build@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" @@ -8085,6 +8568,18 @@ object.values@^1.1.0: es-abstract "^1.18.0-next.1" has "^1.0.3" +on-finished@^2.3.0, on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -8099,13 +8594,18 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" +only@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= + open@^8.3.0: version "8.4.0" resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" @@ -8129,7 +8629,7 @@ optimist@0.3.5: dependencies: wordwrap "~0.0.2" -optionator@^0.8.2, optionator@^0.8.3: +optionator@^0.8.2: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -8141,6 +8641,18 @@ optionator@^0.8.2, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ordered-read-streams@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" @@ -8332,6 +8844,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parseurl@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -8369,7 +8886,7 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: +path-is-absolute@1.0.1, path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -8413,6 +8930,11 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-to-regexp@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38" + integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -8482,7 +9004,7 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== -pify@^2.0.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -8542,10 +9064,10 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -playwright-core@=1.18.0-rc1: - version "1.18.0-rc1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.18.0-rc1.tgz#585b542055729b6a6c55bd847a6805d3490984e1" - integrity sha512-l1kd9Z4msyQH6ozfyD5SM6b6g2t8l78E+plI0HSKe3b+FhFMd2LY3dDKXjR2DNOs4roowspX4znlFMxKTiFhUg== +playwright-core@=1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.18.0.tgz#b4d2b9068f26357adaa952a13254796fd439f322" + integrity sha512-JTRlCVpfAFcC1nth+XIE07w6M5m6C8PaEoClv7wGWF97cyDMcHIij0xIVEKMKli7IG5N0mqjLDFc/akXSbMZ1g== dependencies: commander "^8.2.0" debug "^4.1.1" @@ -8564,6 +9086,35 @@ playwright-core@=1.18.0-rc1: yauzl "^2.10.0" yazl "^2.5.1" +playwright-core@=1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.18.1.tgz#a5cf3f212d10692382e2acd1f7bc8c9ff9bbb849" + integrity sha512-NALGl8R1GHzGLlhUApmpmfh6M1rrrPcDTygWvhTbprxwGB9qd/j9DRwyn4HTQcUB6o0/VOpo46fH9ez3+D/Rog== + dependencies: + commander "^8.2.0" + debug "^4.1.1" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.0" + jpeg-js "^0.4.2" + mime "^2.4.6" + pngjs "^5.0.0" + progress "^2.0.3" + proper-lockfile "^4.1.1" + proxy-from-env "^1.1.0" + rimraf "^3.0.2" + socks-proxy-agent "^6.1.0" + stack-utils "^2.0.3" + ws "^7.4.6" + yauzl "^2.10.0" + yazl "^2.5.1" + +playwright@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.18.1.tgz#45c2ca6ee25c44e336985de9b51955727b5f17cf" + integrity sha512-8EaX9EtbtAoMq5tnzIsoA3b/V86V/6Mq2skuOU4qEw+5OVxs1lwesDwmjy/RVU1Qfx5UuwSQzhp45wyH22oa+A== + dependencies: + playwright-core "=1.18.1" + plist@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe" @@ -8966,6 +9517,11 @@ prebuild-install@^6.0.0: tar-fs "^2.0.0" tunnel-agent "^0.6.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -9216,7 +9772,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -9229,16 +9785,6 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - "readable-stream@2 || 3": version "3.1.1" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" @@ -9310,10 +9856,10 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regextras@^0.7.0: version "0.7.0" @@ -9472,6 +10018,14 @@ resolve-options@^1.1.0: dependencies: value-or-function "^3.0.0" +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -9524,14 +10078,6 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -9598,7 +10144,7 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -9615,23 +10161,23 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.4.0, rxjs@^6.6.0: +rxjs@^6.4.0: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -9675,6 +10221,13 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" +seek-bzip@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" + integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== + dependencies: + commander "^2.8.1" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -9702,7 +10255,7 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== -semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -9712,7 +10265,7 @@ semver@^7.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@^7.3.4: +semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -9767,6 +10320,16 @@ setimmediate@^1.0.4: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -10142,6 +10705,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -10336,6 +10904,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" @@ -10353,6 +10928,13 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +strip-dirs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" + integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== + dependencies: + is-natural-number "^4.0.1" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -10363,7 +10945,7 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@3.1.1, strip-json-comments@^3.0.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -10373,13 +10955,6 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-outer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - style-loader@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.0.0.tgz#1d5296f9165e8e2c85d24eee0b7caf9ec8ca1f82" @@ -10519,6 +11094,19 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" +tar-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -10716,6 +11304,11 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -10765,6 +11358,11 @@ to-through@^2.0.0: dependencies: through2 "^2.0.3" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -10792,13 +11390,6 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= - dependencies: - escape-string-regexp "^1.0.2" - ts-loader@^9.2.3: version "9.2.3" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.3.tgz#dc3b6362a4d4382493cd4f138d345f419656de68" @@ -10840,10 +11431,15 @@ tslib@^2.0.0, tslib@^2.2.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -10869,6 +11465,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -10881,20 +11484,23 @@ type-detect@4.0.8, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-is@^1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" type@^1.0.1: version "1.2.0" @@ -10944,6 +11550,14 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unbzip2-stream@^1.0.9: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -11165,6 +11779,11 @@ value-or-function@^3.0.0: resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= +vary@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + vendors@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" @@ -11308,15 +11927,14 @@ vscode-oniguruma@1.6.1: resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz#2bf4dfcfe3dd2e56eb549a3068c8ee39e6c30ce5" integrity sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ== -vscode-proxy-agent@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.11.0.tgz#9dc8d2bb9d448f1e33bb1caef97a741289660f2f" - integrity sha512-Y5mHjDGq/OKOvKG0IwCYfj25cvQ2cLEil8ce8n55IZHRAP9RF3e1sKU4ZUNDB8X2NIpKwyltrWpK9tFFE/kc3g== +vscode-proxy-agent@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.12.0.tgz#0775f464b9519b0c903da4dcf50851e1453f4e48" + integrity sha512-jS7950hE9Kq6T18vYewVl0N9acEBD3d+scbPew2Nti7d61THBrhVF9FQjc8TLfrUZ//UzzOFO8why+F0kHDdNw== dependencies: "@tootallnate/once" "^1.1.2" agent-base "^6.0.2" debug "^4.3.1" - get-uri "^3.0.2" http-proxy-agent "^4.0.1" https-proxy-agent "^5.0.0" socks-proxy-agent "^5.0.0" @@ -11336,20 +11954,16 @@ vscode-ripgrep@^1.12.1: https-proxy-agent "^4.0.0" proxy-from-env "^1.1.0" -vscode-telemetry-extractor@^1.9.5: - version "1.9.5" - resolved "https://registry.yarnpkg.com/vscode-telemetry-extractor/-/vscode-telemetry-extractor-1.9.5.tgz#9f397438285474e6bb162033310a0b83c6d0d797" - integrity sha512-saUkRZrXVi9sKNqT6xqjky3oqybrj6ipdRCA257Ao1MgU260A2K4mD5kEZhupBdSD4+t+QwCv8WCFIcZDRD0Aw== - dependencies: - command-line-args "^5.2.0" - ts-morph "^12.2.0" - vscode-ripgrep "^1.12.1" - vscode-textmate@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210" integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ== +vscode-uri@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" + integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== + vscode-windows-ca-certs@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/vscode-windows-ca-certs/-/vscode-windows-ca-certs-0.3.0.tgz#324e1f8ba842bbf048a39e7c0ee8fe655e9adfcc" @@ -11597,7 +12211,7 @@ windows-process-tree@^0.3.2: dependencies: nan "^2.13.2" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -11717,11 +12331,6 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f" integrity sha1-UZy0ymhtAFqEINNJbz8MruzKWA8= -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= - xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -11734,35 +12343,35 @@ xtend@~2.1.1: dependencies: object-keys "~0.4.0" -xterm-addon-search@0.9.0-beta.8: - version "0.9.0-beta.8" - resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.8.tgz#b3cbe364e24ea5765c36cba47c78a14acbe69062" - integrity sha512-FCv5zo6BVc7DaG3kLEOskKDCns7y2fRHqmZDrSmyfCd1lPmm9OA3UYdxZy5BtNkn6bc8amwpB7J2bIdu8VV7Qg== +xterm-addon-search@0.9.0-beta.10: + version "0.9.0-beta.10" + resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.10.tgz#80677a5e105d4410feae92b90fcdd5b538067070" + integrity sha512-fxKwbsu+ZNgZ689sAX1PHhWAW+8/abAGD8B7SMWwelKhJmbRybHoaLAYCeUrZJlJHljwjgW3Ptk7OpONNydh1A== -xterm-addon-serialize@0.7.0-beta.6: - version "0.7.0-beta.6" - resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.6.tgz#f1512f0690821d0c2a88700fb706c1212f69a39a" - integrity sha512-tP/larcKOQaCgfq5XlQT8plTRwi2fZHqy8UqbMnZ6LQZajvc01oGp5njaasfXu5vyIFhugp5fgH5vy5zgspbwg== +xterm-addon-serialize@0.7.0-beta.8: + version "0.7.0-beta.8" + resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.8.tgz#b91584656d7433d60efae6c2f58fdc8bd75b439c" + integrity sha512-LIovTZSwHz+/lSRQx2VPf9j7pPkhYN+L8DzEUJeTFQhtpQpLYYb0slOndSMkp0zvDVbiHqweeebvAB2zu0b4PQ== -xterm-addon-unicode11@0.4.0-beta.1: - version "0.4.0-beta.1" - resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.1.tgz#aeefd26e87bad15d8dfd8a1e0b804fe408c9b882" - integrity sha512-pG8mpxnqpYDry0e20vuEFKhd4kKIcLLNwdNftNvfo+R/EjYRnTYnF+H8L+7eQHq6hqDH61xCEP4H4qR2CyT4pg== +xterm-addon-unicode11@0.4.0-beta.3: + version "0.4.0-beta.3" + resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" + integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== -xterm-addon-webgl@0.12.0-beta.21: - version "0.12.0-beta.21" - resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.21.tgz#8c476d25ec40b7535dedbd87b9cdf5eeeb41fc93" - integrity sha512-aeZcjxbtPfkVutNnXqCv9E5V4DoYecUFztWOjBzI/dgC1xfMOMVWzsymK9H1EUfd6u0ymEIeOjvX9bHsXNUzdA== +xterm-addon-webgl@0.12.0-beta.24: + version "0.12.0-beta.24" + resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.24.tgz#5c17256933991856554c95c9bd1eaab42e9727a0" + integrity sha512-+wZxKReEOlfN9JRHyikoffA6Do61/THR7QY35ajkQo0lLutKr6hTd/TLTuZh0PhFVelgTgudpXqlP++Lc0WFIA== -xterm-headless@4.17.0-beta.7: - version "4.17.0-beta.7" - resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.17.0-beta.7.tgz#6ae3f5436a29f7e4554c6d9d7f4f3eb958d18240" - integrity sha512-1JoKhlsENqWqDIKNHxm5jBQj3Es3gHHM+wDi9ESyodn6J+FpTkM5859wnL+/rEm7PKKvahPICqjTSjdXq5Jv9g== +xterm-headless@4.18.0-beta.2: + version "4.18.0-beta.2" + resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.18.0-beta.2.tgz#b930ac8a79626ef4443cd3ab1a86d1a96039fef8" + integrity sha512-V4CSLfjqE1/pV+3HEs8l0T5W3FORoVX2f17AIUTSsuXUunNXcpib+g6ExxnR9Nm5ztbYnmZIX8AA3mClpqO1OQ== -xterm@4.17.0-beta.7: - version "4.17.0-beta.7" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.17.0-beta.7.tgz#c11d52403a8d6456b92f2086e1797c64018328d6" - integrity sha512-FhC12WUljy8pTWr0oquVE0U567H1ZPAREKkN+wWLSZODNJwc8/txP2Ajg9byG++bkxfBP3CNEmDzaP0hoall8Q== +xterm@4.18.0-beta.2: + version "4.18.0-beta.2" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.18.0-beta.2.tgz#50e0de2ebe22fd1600e6d7fbc78136a843bb4c1d" + integrity sha512-fzsSI0xL3HuWBuw5o3xPcR8/R8tTpSd60hHtf0Z2ZrIXDRdniJMw+StOv/xZNp2CUY6LcSiF9MmM0ylgiLHbdw== y18n@^3.2.1: version "3.2.2" @@ -11933,7 +12542,7 @@ yaserver@^0.2.0: resolved "https://registry.yarnpkg.com/yaserver/-/yaserver-0.2.0.tgz#56393027dc13f3c1bb89d20e0bd17269aa927802" integrity sha512-onsELrl7Y42M4P3T9R0N/ZJNJRu4cGwzhDyOWIFRMJvPUIrGKInYGh+DJBefrbr1qoyDu7DSCLl9BL5hSSVfDA== -yauzl@^2.10.0, yauzl@^2.9.2: +yauzl@^2.10.0, yauzl@^2.4.2, yauzl@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= @@ -11963,6 +12572,11 @@ yazl@^2.5.1: dependencies: buffer-crc32 "~0.2.3" +ylru@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" + integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"